;-------------------------------------------------------------- 
; 
;                К Л А В И А Т У Р А 
; 
;___int 16_________________ 
; 
;   Программа поддержки клавиатуры 
; 
;   Эта программа считывает в регистр 
; AX код сканирования клавиши и код 
; ASCII из буфера клавиатуры. 
; 
;   Программа выполняет три функции, код 
; которых задается в регистре AH: 
; 
;    AH=0 - считать следующий символ 
;            из буфера.При выходе код 
;            сканирования в AH,код 
;            ASCII в AL. 
; 
;   AH=1 - установить ZF, если код 
;            ASCII прочитан: 
;            ZF=0 - буфер заполнен, 
;            ZF=1 - буфер пустой. 
;         При выходе в AX помещено содержимое вершины буфера клавиатуры. 
; 
;   AH=2 - возврат текущего состояния в регистр AL 
;          из постоянно распределенной области памяти с 
;          адресом 00417H. 
; 
;   При выполнении программ клавиатуры используются флажки, 
; которые устанавливаются в постоянно распределенной области 
; памяти по адресам 00417H и 00418H и имеют значение: 
;   00417H 
;         0 - правое переключение регистра SHIFT; 
;         1 - левое переключение регистра  SHIFT; 
;         2 - УПР  (CTRL); 
;         3 - ДОП  (ALT) ; 
;         4 - ФСД  (ScrollLock) ; 
;         5 - ЦИФ  (NumLock); 
;         6 - ФПБ  (CapsLock) ; 
;         7 - ВСТ  (Ins) ; 
;   00418H 
;         0 - состояние клавиши ЛАТ между нажатием и отжатием (не использ); 
;         1 - ЛАТ (не использ); 
;         2 - Р/Л (не использ); 
;         3 - пауза (HOLD_STATE); 
;         4 - ФСД; 
;         5 - ЦИФ; 
;         6 - ФПБ; 
;         7 - ВСТ. 
; 
;   Флажки, соответствующие разрядам 4-7 постоянно распределенной 
; области памяти с адресом 00417H, устанавливаются по нажатию 
; клавиш ВСТ, ФПБ, ЦИФ, ФСД и сохраняют свои значения до сле- 
; дующего нажатия соответствующей клавиши. 
; Одноименные флажки, соответствующие разрядам 4-7 постоянно 
; распределенной области памяти с адресом 00418H, и флажки 
; ДОП, УПР, левое переключение регистра, правое переключение 
; регистра, Р/Л устанавливаются по нажатию клавиш и сбрасываются 
; по отжатию. 
; 
;--------------------------------------------------------------. 
        ASSUME CS:CODE,DS:DATA 
KEYBOARD_IO     PROC   FAR 
        STI                   ;разрешение прерывний 
        PUSH    DS 
        PUSH    BX 
        MOV     BX,DATA 
        MOV     DS,BX         ;установка указателя на сегмент данных 
	MOV	BX,BUFFER_HEAD;Указатель вершины буфера ввода INT9 
        OR      AH,AH         ;AH=0 
        JZ      K1            ;чтение символа ASCII 
        DEC     AH            ;AH=1 
        JZ      K2            ;опрос состояния буфера 
        DEC     AH            ;AH=2 
;        JNZ     KBRET 
        MOV	AL,KB_FLAG    ;SHIFT_STATUS 
KBRET:  POP     BX 
        POP     DS 
        IRET 
 
;------ Чтение кода символа ASCII по ожиданию 
 
K1: 
	MOV	AH,1 
	INT	16H	      ;Рекурсивный опрос клавиатуры 
        JZ      K1            ;если нет готовности 
        CALL    K4            ;наращивание указателя чтения буфера 
        MOV     BUFFER_HEAD,BX ;запись нового значения указателя 
	JMP	KBRET	      ;Выход 
 
;-------ASCII STATUS 
 
K2: 
        CLI                   ;запрет прерываний 
        CMP     BX,BUFFER_TAIL ;если указатели равны (ZF=1), то буфер пуст 
        MOV     AX,[BX] 
        STI                   ;разрешение прерываний 
        POP     BX 
        POP     DS 
        RET     2             ;возврат без сохранения флагов 
 
KEYBOARD_IO     ENDP 
 
