←ïðåäûäóùàÿ ñëåäóþùàÿ→
1 2
.MODEL TINY
.CODE
.STARTUP
.286
LOCALS
JUMPS
jmp Install
; RSHIFT scan code
RSHIFT_SCAN EQU 36h
FLAGS record inRussian:1,shiftPressed:1,keyPressed:1,reserved:6
iFlags FLAGS <0, 0, 0, 0>
STable db 'éöóêåíãøùçõúôûâàïpîëäæýÿ÷ñìèòüáþÉÖÓÊÅHÃØÙÇÕÚÔÛÂÀÏÐÎËÄÆÝß×ÑÌÈÒÜÁÞ'
Hook09 proc far ;îápàáîêà int 09h
push ax
push bx
push cx
push di
push ds
push es
mov ax,cs ;ñåãìåíò påçåäåíòà
mov ds,ax
in al,60h
mov ah,al
cmp al,RSHIFT_SCAN
je gotShift ; ïpîâåpêà íàæàòèÿ
test al,80h
jnz KeyUp ; à ìîæåò áûòü êëàâèøó îòïóñòèëè ?
test [iFlags], MASK inRussian
jz OldHook09 ; åñëè â àíãëèéñêîì, òî ñòàpûé îápàáîò÷èê
push ax
mov ax,40h
mov es,ax ; es = ñåãìåíò äàííûõ BIOS
pop ax
cmp al,34h ; íà÷àëî áëîêà òpàíñëÿöèè
jg OldHook09 ; don't know what it is
cmp al,2Ch
jl check2
sub al,2Ch
add al,23
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
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à êëàâèàòópû (30-60)
mov bx,es:[1Ch] ; óêàçàòåëü íà ãîëîâó
cmp cx,60
je h_End
inc cx
inc cx
cmp cx,bx
je Quit
jmp short insSymb
h_End:
cmp bx,30
je Quit
insSymb:
mov di, offset STable ; di = óêàçàòåëü íà òàáëèöó
mov ah,0 ; ax = ñìåùåíèå
add di,ax
mov al,[di] ; al = ñèìâîë
mov es:[bx],al ; ïîìåùàåì ñèìâîë â áóôåp êëàâèàòó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ûé îápàáîò÷èê
test [iFlags], MASK keyPressed
jnz throwShift ; åñëè íàæèìàëè êëàâèøó - ñápàñûâàåì shift
test [iFlags], MASK inRussian
jz switchRussian ; åñëè â àíãëèéñêîì - òî íà póññêèé
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
pop bx
pop ax
db 0EAh ; îïêîä far jump
OldHandler09 dd ? ; jump xxxx:yyyy
Quit:
in al,61h ; ñápàñûâàåì êîíüpîëëåp êëàâèàòópû
mov ah,al ; è pàçpåøàåì îápàáîòêó ñëåä. ñèìâ.
or al,80h
out 61h,al
xchg ah,al
out 61h,al
mov al,20h
out 20h,al
pop es
pop ds
pop di
pop cx
pop bx
pop ax
iret
Hook09 endp
Hook10 proc far
cmp ah,00h ; ôóíêöèÿ ñìåíà âèäåîpåæèìà
jne @@Quit ; íåò ? ïåpåäàåì óïpàâëåíèå ñòàpîìó îápàáîò÷èêó
cmp al,2 ; âèäåîpåæèì 2 èëè 3 ?
je @@myHook ; äà - îápàáàòûâàåì
cmp al,3
jne @@Quit
@@myHook:
call iBIOS ; âûçûâàåì ìòàpûé îápàáîò÷èê
push ax
push cx
push ds
push si
mov ax,cs
mov ds,ax
mov al,0
mov cl,0FFh
mov ch,16
mov si, offset NewFont
call LoadFont ; çàãpóæàåì ñâîé ôîíò
pop si
pop ds
pop cx
pop ax
iret
@@Quit:
call iBIOS
iret
Hook10 endp
iBIOS proc
pushf
db 09Ah ; far call
OldHandler10 dd ?
ret
iBIOS endp
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Load Font ³
;³ ³
;³ Çàãpóæàåò â çíàêîãåíåpàòîp íîâûå ³
;³ îápàçû ñèìâîëîâ. Èñïîëüçóÿ ïîpòû, ³
;³ óäàåòñÿ èçáåæàòü "äåpãàíèÿ" ýêpàíà ³
;³ Âõîä: ³
;³ AL - íîìåp ïåpâîãî ñèìâîëà ³
;³ CL - êîëè÷åñòâî ñèìâîëîâ ³
;³ CH - pàçìåp ñèìâîëà ³
;³ DS:SI - âàø áóôåp îápàçîâ ³
;³ Âûõîä: íåò ³
;³ Ðàçpóøàåìûå påãèñòpû: íåò ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
LoadFont proc
pushf
push ax
push cx
push dx
push si
push di
push es
mov di,0A000h
mov es,di
xor ah,ah
imul di,ax,20h
push ds
push si
mov si,cs
mov ds,si
lea si,WRITE_ON
push cx
call SetMode
pop cx
pop si
pop ds
mov dl,ch
xor ch,ch
xor dh,dh
@@All_symbols:
push cx
mov ax,di
mov cx,dx
shr cx,1 ; cx /= 2
rep movsw
mov di,ax
add di,20h
pop cx
loop @@All_symbols
lea si,WRITE_OFF
call SetMode
pop es
pop di
pop si
←ïðåäûäóùàÿ ñëåäóþùàÿ→
1 2
|
|