;----------------------------------------------------- 
; WRITE_TTY 
;  Эта программа обеспечивает работу с ВИДЕО в режиме телетайпа. Выводимый 
;  символ записывается в текущую позицию курсора, и курсор перемещаетя в 
;  следующую позицию. После записи символа в последнюю позицию строки 
;  выполняется автоматический переход на новую строку. Если активная страница 
;  экрана заполнена, выполняется перемещение экрана на одну строку вверх 
;  (свертка). Освободившаяся строка заполняется цветом атрибута из последней 
;  позиции курсора перед сверткой (в символьном режиме). В графическом режиме 
;  используется цвет 0. 
;Вход: 
;  (AH) - текущий режим экрана 
;  (AL) - выодимый символ 
;  (BL) - цвет переднего плана для символа в графическом режиме 
;Замечание: возврат на шаг, возврат каретки, перевод строки и звонок 
;           отрабатываются как команды. 
;Выход: 
;  Все регистры сохраняются 
;--------------------------------------------------------------------------- 
        ASSUME  CS:CODE,DS:DATA 
WRITE_TTY       PROC   NEAR 
        PUSH    AX            ;Сохранить регистры 
        PUSH    AX            ;Сохранить символ для записи 
        MOV     BH,ACTIVE_PAGE ;Получить текущую активную страницу 
        MOV     AH,3 
        INT     INT_VIDEO     ;Прочесть значение текущей позиции курсора 
        POP     AX            ;Восстановить символ 
; 
;------ DX содержит текущую позицию курсора 
; 
        CMP     AL,8          ;Это возврат на шаг? 
        JE      U8            ;Да, переход 
        CMP     AL,0DH        ;Это возврат каретки? 
        JE      U9            ;Да, переход 
        CMP     AL,0AH        ;Это перевод строки? 
        JE      U10           ;Да, переход 
        CMP     AL,07H        ;Это звонок? 
        JE      U11           ;Да, переход 
; 
;------ Запись символа на экран 
; 
        MOV     AH,10         ;Запись только символа 
        MOV     CX,1          ;Только один символ 
        INT     INT_VIDEO     ;Запись символа 
; 
;------ Позиция курсора для следующего символа 
; 
        INC     DL 
        CMP     DL,BYTE PTR CRT_COLS   ;Проверка переполнения колонки 
        JNZ     U7            ;Установить курсор 
        MOV     DL,0          ;Колонка для курсора 
        CMP     DH,24 
        JNZ     U6            ;Установить курсор 
; 
;------ Требуется свертка (прокрутка) 
U1: 
        MOV     AH,2 
        MOV     BH,ACTIVE_PAGE ;Получить текущую активную страницу 
        INT     INT_VIDEO      ;Установить курсор 
; 
;------ Определение значения заполнителя во время свертки 
; 
        CMP     CRT_MODE,4 
        JC      U2            ;Считывание курсора 
        MOV     BH,0          ;Заполнение фона 
        JMP SHORT  U3         ;Установить прокрутку 
U2:                           ;Считывание курсора 
        MOV     BH,ACTIVE_PAGE ;Получить текущую активную страницу 
        MOV     AH,8 
        INT     INT_VIDEO     ;Прочесть символ/атрибут текущего курсора 
        MOV     BH,AH         ;Заполнить в BH 
U3:                           ;Прокрутка 
        MOV     AX,601H       ;Прокрутка одной строки 
        MOV     CX,0          ;Верхний левый угол 
        MOV     DH,24         ;Нижняя правая строка 
        MOV     DL,BYTE PTR CRT_COLS   ;Нижняя правая колонка 
        DEC     DL 
U4: 
        INT     INT_VIDEO     ;Прокрутка экрана 
U5:                           ;Возврат из TTY 
        POP     AX            ;Восстановить символ 
        JMP     VIDEO_RETURN  ;Возврат 
U6:                           ;Установить курсор 
        INC     DH            ;Следующая строка 
U7:                           ;Установить курсор 
        MOV     BH,ACTIVE_PAGE ;Получить текущую активную страницу 
        MOV     AH,2 
        JMP     U4            ;Установить новый курсор 
; 
;------ Определен возврат на шаг 
U8: 
        CMP     DL,0          ;Уже конец строки? 
        JE      U7            ;Установить  курсор 
        DEC     DL            ;Нет- вернуть его на шаг 
        JMP     U7            ;Установить  курсор 
; 
;------ Определен возврат каретки 
U9: 
        MOV     DL,0          ;Передвинуть на первую колонку 
        JMP     U7            ;Установить  курсор 
; 
;------ Определен перевод строки 
U10: 
        CMP     DH,24         ;Последняя строка экрана? 
        JNE     U6            ;Да, прокрутка экрана 
        JMP     U1            ;Нет, установить курсор снова 
; 
;------ Определен звонок 
U11: 
        MOV     BX,0602H      ;Установить счетчик для сигнала 
        CALL    BEEP          ;Включить звук BELL 
        JMP     U5            ;Возврат из TTY 
WRITE_TTY       ENDP 
;--------------------------------------------------------------------------- 
;LIGHT PEN 
;       В БМ ЭВМ световое перо отсутствует, и режим считывания положения 
;       светового пера не поддерживается. 
;---------------------------------------------------------------------------- 
        ASSUME  CS:CODE,DS:DATA 
READ_LPEN       PROC   NEAR 
        MOV     AH,0 
        JMP     VIDEO_RETURN     ;Нет светового пера, возврат 
READ_LPEN       ENDP 
 
