Управление клавиатурой Scan-код нажатия: 1<номер клавиши> Scan-код отпускания: Физический 11110000 0<номер клавиши> буфер клавиатуры 20 байт (Порт 60h) Выполнение команд (CTRL-ALT-DEL) Scan-код, код ASCII 0, расширенный scan-код Буфер BIOS клавиатуры int 16h Байт состояния int 9h 32 байта int 21h 1 Программирование порта клавиатуры Code int_9h segment assume CS:Code proc far push AX in AL,60h push AX in AL,61h mov AH,AL or AL,80h out 61h,AL mov AL,AH out 61h,AL pop AX <обработка> mov AL,20h out 20h,AL pop AX iret ... Первый разряд порта 61h 1 t 0 2 Байт состояния клавиатуры Байт 417h Байт 418h 7 – 1 – режим вставки (Insert); 6 – 1 – режим прописных букв (CapsLock); 5 – 1 – режим цифровой клавиатуры (NumLock); 4 – 1 – режим прокрутки (ScrollLock); 3 – 1 – Alt –нажата; 2 – 1 – CTRL – нажата; 1 – 1 – левый Shift – нажата; 0 – 1 – правый Shift – нажата 7 – 1 – Insert – нажата; 6 – 1 – CapsLock – нажата; 5 – 1 – NumLock – нажата; 4 – 1 – ScrollLock – нажата; 3 – 1 – режим паузы (CTRL - NumLock); 2 1 0 3 Драйвер клавиатуры int 16h Функции: AH = 0 Чтение символа с клавиатуры Вых.: AH – Scan – код; AL - символ AH = 1 Состояние буфера Вых.: ZF=1 – буфер пуст ZF=0 – есть символ: AH – SCAN – код; AL - символ AH = 2 Получить байт состояния Вых.: AL – байт состояния Пример: чтение символа с клавиатуры mov AH,0 int 16h 4 Ввод расширенного кода посредством int 21h mov int cmp jne mov int AH,8 21h AL,0 Error AH,8 21h ; читаем символ ; расширенный код? ; если нет, то ошибка ; читаем расш. код 5 code Обработчик int 9h Инвертирование яркости по нажатию ALT (Ex4_1) segment assume CS:code,DS:code org 100h begin: jmp start OLD_VEC label DWORD IP_OLD DW ? cycle: CS_OLD DW ? tsr_9: pushf call CS:OLD_VEC push AX push ES mov AX,0 mov ES,AX mov AL,ES:[417h] and AL,00001000B A1: cmp AL,00001000B jne A1 push CX push push mov mov mov mov mov xor mov inc inc loop pop pop pop pop pop iret BX SI AX,0B800h ES,AX SI,1 CX,2000 AL,ES:[SI] AL,00001000B ES:[SI],AL SI SI cycle SI BX CX ES AX 6 Инсталлятор start: code mov int mov mov mov lea int lea int ends end AX,3509h 21h IP_OLD,BX CS_OLD,ES AX,2509h DX,tsr_9 21h DX,start 27h begin 7