NEXT4: CMP STAT,4 ; Проверяем состояние свет-ра (не четветрое ли?)
JNE NEXT5 ; Если нет, то переходим на проверку четвертого
CMP TIME,55 ; Смотрим, не прошло ли 3 сек.
JB X4 ; Если не прошло 3 сек. перейти
DAY: MOV TIME,0 ; Обнуляем таймер
MOV STAT,1 ; Переводим состояние светофора в первое
SETCOLOR GREEN,WHITE,WHITE,WHITE,WHITE,RED
X4: JMP KB ; В любом случае переходим на метку KB
NEXT5: CMP STAT,5 ; Проверяем состояние свет-ра (не пятое ли?)
JNE NEXT6 ; Если нет, то переходим на проверку четвертого
CMP TIME,18 ; Смотрим, не прошла ли 1 сек
JB X5 ; Если не прошло 1 сек. перейти
MOV TIME,0 ; Обнуляем таймер
MOV STAT,6 ; Переводим состояние светофора в шестое
SETCOLOR WHITE,WHITE,WHITE,WHITE,WHITE,WHITE
X5: JMP KB ; В любом случае переходим на метку KB
NEXT6: CMP TIME,18 ; Смотрим, не прошла ли 1 сек
JB KB ; Если не прошло 1 сек. перейти
NIGHT: MOV TIME,0 ; Обнуляем таймер
MOV STAT,5 ; Переводим состояние светофора в шестое
SETCOLOR WHITE,YELLOY,WHITE,WHITE,YELLOY,WHITE
KB: CALL OPR_KB ; Опрашиваем клаву
CMP AX,1 ; Смотрим, не нажат ли ПРОБЕЛ
JNE A1 ; Если не нажат, переходим на A1
JMP NEXT1
A1: CMP AX,2 ; Смотрим,а не нажат ли ESC
JNZ EXIT ; Если нажат, выходим из проги
CMP STAT,5 ; Проверяем режим работы светофора
JAE A2 ; Если режим не 5, прыгаем на дневной режим
JMP NIGHT ; В противном случае режим ночной
A2: JMP DAY
EXIT: ; Выходим из программы
CLI ; Установка флага IF (разрешение прерываний от внешних устройств)
MOV AX,WORD PTR TIMESAV
MOV WORD PTR TIMEADR,AX
MOV AX,WORD PTR TIMESAV+2
MOV WORD PTR TIMEADR+2,AX
STI ; Установка флага IF в 0 (запрещение прерываний)
RET
BEGIN ENDP
;---------------------------------- Рисуем улицу--------------------------------
INIT PROC NEAR
MOV AH,00 ;
MOV AL,03 ;
INT 10H ; Устанавливаем режим 80*25
MOV AH,01 ;
MOV CX,0 ;
INT 10H ; Убираем курсор
MOV AH,05 ;
MOV AL,00 ;
INT 10H ; Выбираем активную страниу (нулевую)
MOV AH,02 ;
MOV BH,00 ;
MOV DH,2 ;
MOV DL,12 ;
INT 10H ; Установка режима
CALL RECTANGLE ; Рисуем первый прямоугольник
MOV DL,48 ;
INT 10H ;
CALL RECTANGLE ; Рисуем второй прямоугольник
MOV DH,16 ;
INT 10H ;
CALL RECTANGLE ; Рисуем третий прямоугольник
MOV DL,12 ;
INT 10H ;
CALL RECTANGLE ; Рисуем четвертый прямоугольник
SETCOLOR GREEN,WHITE,WHITE,WHITE,WHITE,RED
CALL SETVECT
RET
INIT ENDP
;----------------------------Функция опроса клавиатуры--------------------------
;Клавиша не нажата или нажата другая клавиша AX=0
;Нажат SP AX=1
;Нажат ESC AX=2
OPR_KB PROC NEAR ;
MOV AH,0BH ; Проверяем статус ввода (результат в AL)
INT 21H ; если ввод был, то в AL 255, если не был, то 0
CMP AL,255 ; Сравниваем AL со значением нажатой клавиши
JNE C1 ; Перейти если клавиша не нажата
MOV AH,07H ;
INT 21H ; Консольный ввод без эха (символ пишется в AL)
CMP AL,32 ; Смотрим, а не нажата ли клавиша ПРОБЕЛ
JNE C2 ; Перейти если не нажат ПРОБЕЛ
MOV AX,2
RET
C2: CMP AL,27 ; Смотрим, а не нажата ли клавиша ESC
JNE C1 ; Перейти если не нажата
MOV AX,0
RET
C1: MOV AX,1 ; Нажат ESC
RET
OPR_KB ENDP
;-------------------------------------------------------------------------------
;--------------------Нарисовать прямоугольник (часть улицы)---------------------
RECTANGLE PROC NEAR
PUSH DX
PUSH AX
MOV CX,8
B1: MOV AH,09
MOV AL,178
MOV BL,1
PUSH CX
MOV CX,20
INT 10H
POP CX
MOV AH,02
INC DH
INT 10H
LOOP B1
POP AX
POP DX
RET
RECTANGLE ENDP
;-------------------------Устанавливаем новый обработчик------------------------
SETVECT PROC NEAR
CLI ; Установка флага IF (разрешение прерываний от внешних устройств)
MOV AX,WORD PTR TIMEADR
MOV WORD PTR TIMESAV,AX
MOV AX,WORD PTR TIMEADR+2
MOV WORD PTR TIMESAV+2,AX
MOV WORD PTR TIMEADR,OFFSET TIMEINT
MOV WORD PTR TIMEADR+2,CS
STI ; Установка флага IF в 0 (запрещение прерываний)
RET
SETVECT ENDP
;-------------------------------Прерывание от таймера---------------------------
TIMEINT PROC NEAR
PUSH AX
PUSH DS
CALL TIMESAV
MOV AX,DATASG
MOV DS,AX
INC TIME
POP DS
POP AX
IRET
TIMEINT ENDP
;-------------------------------------------------------------------------------
CODESG ENDS
END BEGIN
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.