st [iFlags], MASK inRussian ; Виділяємо прапор російського набору
jz OldHook09; якщо в англійською, то стару обpаботчік
push ax
mov ax, 40h
mov es, ax; es = сегмент даних BIOS
pop ax
cmp al, 34h; початок блоку тpансляціі
jg OldHook09
cmp al, 2Ch
jl check2
sub al, 2Ch ; Перевірка не символьна
add al, 23 p> jmp short Translate
check2:
cmp al, 28h
jg OldHook09
cmp al, 1Eh
jl check3
sub al, 1Eh ; Чи це
add al, 12
jmp short Translate
check3:
cmp al, 1Bh
jg OldHook09
cmp al, 10h p> jl OldHook09 ; Клавіша
sub al, 10h; кінець блоку, al = зсув в таблиці
Translate:
or [iFlags], MASK keyPressed ; Виділяємо прапор натискання клавіші
mov ah, es: [17h]; а не натиснуто чи є у нас shift
test ah, 11b;
jz lowerKey; якщо НЕ нижній регістр - то далі
add al, 32; збільшуємо зміщення у табл. символів
lowerKey:
mov cx, es: [1Ah]; покажчик на хвіст буфеpа клавіатури (30-60)
mov bx, es: [1Ch]; покажчик на голову
cmp cx, 60; голова на хвості? J
je h_End; так - на хвіст
inc cx; змести
inc cx
cmp cx, bx; голова і хвіст схожі?
je Quit; тоді виходимо
jmp short insSymb; ну тоді ... p> h_End:
cmp bx, 30; хвіст на голові ? p> je Quit
insSymb:
mov di, offset STable; di = Покажчик на таблицю символів
mov ah, 0; ax = Зсув
add di, ax
mov al, [di]; al = Символ
mov es: [bx], al; поміщаємо символ у буфеp клавіатури (int 16h)
cmp bx, 60; покажчик хвоста дійшов до кінця?
jne nextStep
mov bx, 28; інакше перевизначають покажчик
nextStep:
inc bx; і ще разок
inc bx
mov es: [1Ch], bx; зраджуємо його значення в належне місце
jmp short Quit; кінець, символ отpансліpован
gotShift:
or [iFlags], MASK shiftPressed; зводимо прапор натискання shift
and [iFlags], NOT MASK keyPressed; Обнуляємо ------- клавіші
jmp short OldHook09
KeyUp:
and al, 7Fh; убіpаем біт відпускання клавіші
cmp al, RSHIFT_SCAN
jne OldHook09; якщо НЕ shift - стару обpаботчік
test [iFlags], MASK keyPressed
jnz throwShift; якщо натискали клавішу - сбpасиваем shift
test [iFlags], MASK inRussian
jz switchRussian; якщо в англійському - то на російський
and [iFlags], NOT MASK inRussian; а тут на англійська
jmp short OldHook09
switchRussian:
or [iFlags], MASK inRussian
jmp short OldHook09
throwShift:
and [iFlags], NOT MASK shiftPressed; сбpасиваем пpизнак
; Натискання shift
OldHook09:
pop es
pop ds
pop di
pop cx
po...