Разработка программы, которая обеспечивает отображение на экране работы светофора, установленного на пересечении главной и второстепенной улиц в ночном и дневном режимах, страница 2

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