Časovaný zápis do klávesnicového buferu
Martin Kužela, Kukisoft
Rezidentné stláčanie kláves
Existuje veľa dobrých programov, ale niektorým niečo chýba. Nemajú
DEMO, tj. reálnu ukážku, ako program beží, aké má možnosti a ako sa
ovláda. Ale to sa dá ľahko napraviť. Stačí nasimulovať stláčanie
klávesnice namiesto užívateľa a program sa bude správať, akoby s ním niekto
pracoval. To isté platí, ak používate program, ktorý chce vždy rovnaké
vstupné dáta (heslo, stlačenie kláves).
Princíp -- Typer natiahne do pamäte súbor kláves, obsadí vektor
8 a každú 1/18 sekundy kontroluje, či sa zhoduje aktuálny čas s časom
stlačenia. Keď postláča všetky klávesy, ostane v pamäti a odstráni sa až
novým spustením Typera.
Programy sú napísané v assembleri a optimalizované na veľkosť pre PC/AT
(verzia TyperXT je oveľa dlhšia).
Prevod asm na com:
tasm typerat.asm
tlink typerat.obj /t
Podobne skompilujeme aj program klv2prr.asm.
Formát súboru s klávesami je jednoduchý. Klávesu (2 bajty) vždy
nasleduje čas stlačenia (Word) a celý súbor je ukončený nulou (Word).
Čas stlačenia viacerých kláves za sebou môže byť rovnaký, ale keď sa do
bufferu nezmestia, nezapíšu sa. Stlačenie kláves možno načasovať minimálne
hodinu dopredu. (Za určitých podmienok aj viac.)
Doporučené používanie:
Najprv spustíme KLV2PRR >abc, postláčame klávesy a stlačíme súčasne
ľavý Shift a hociktorú klávesu. Vytvorí sa súbor abc a potom do
batch súboru umiestnime riadok TYPERAT
code segment
assume cs:code,ds:code
org 100h ;Pre .com
Zac:mov ds,ax ;DS=0
mov ds:[46Ch],ax ;Čítač=0
mov di,offset Data ;ES:DI=ofset Data
mov dx,offset Data+2;DX=ofset Data+2
G2: mov ax,ds:[46Ch] ;AX=Čítač
stosw ;Ulož AX (Čas) do dát
mov ax,bx ;BIOS funkcia 00h
int 16h ;Čítaj znak z klávesnice
stosw ;Ulož AX (Klávesu) do dát
test byte ptr ds:[417h],02h;Ľavý Shift?
je G2 ;Nebol ->G2
push cs
pop ds ;DS=CS
xor [di-2],ax ;Koniec dát=0000h
inc bx ;BX=1
mov cx,di ;CX=ofset konca dát
sub cx,dx ;CX=Dĺžka dát
mov ah,40h ;Dos funkcia 40h
int 21h ;Zapíš dáta na handle 1
ret ;Koniec (->INT 20h)
Data: code ends
end Zac
code segment
assume cs:code,ds:code
org 100h ;Pre .com
.286 ;Používa inštrukcie 286
Zac:mov ax,440Ah ;Dos funkcia 440Ah
int 21h ;DX=parametre handle BX (0)
mov ax,3508h ;Dos funkcia 35h
int 21h ;Vracia vektor 08h v ES:BX
cmp bx,offset int8 ;Je na vektore Typer?
je G3 ;Áno ->G3
test dl,01h ;Je handle 0 presmerované?
jnz Kon ;Nie ->Kon
mov [si+60h],bx ;Ulož ES a BX do
mov [si+62h],es ;inštrukcie JMP na G3
xor bx,bx ;BX=0000h
mov es,[bx+2Ch] ;ES=segment prostredia
mov ah,49h ;Dos funkcia 49h
int 21h ;Uvolni pamäť segmentu ES
dec ch ;CX=FFFFh
mov dx,offset G3+4 ;DX=ofset pre dáta
mov ah,3Fh ;Dos funkcia 3Fh
int 21h ;Načítaj súbor z handle BX
add dx,ax ;DX=koniec programu+dáta
push dx ;Ulož DX
mov dx,offset Int8 ;DX=ofset na rutinu
mov ax,2508h ;Dos funkcia 25h
int 21h ;Nastav vektor 08h na DS:DX
pop dx ;Vyber DX
int 27h ;TSR koniec,DX=ofset konca
Int8:push ds ;Ulož DS
push cs
pop ds ;DS=CS
pusha ;Ulož registre ?X,?I a ?P
G1: mov si,offset G3+4 ;SI=ukazateľ na dáta
cld ;DF=0 (Dopredný smer)
lodsw ;Vyber AX z dát (Klávesa)
mov cx,ax ;CX=AX
dec ax ;AX=AX-1
jo G2 ;Ak bol AX 0 ->G2
lodsw ;Vyber AX z dát (Čas)
Cit:cmp ax,0000h ;Porovnaj aktuálny čas s AX
jne G2 ;Ak sú rozdielne ->G2
mov ah,05h ;BIOS AT funkcia 05h
int 16h ;Ulož klávesu v CX do buferu
mov word ptr[G1+1],si;Ukazateľ v MOV na G1 =SI
jmp G1 ;Ďalšia klávesa ->G1
G2: inc word ptr Cit+1 ;Čas v CMP=Čas+1
popa ;Vyber registre
pop ds ;Vyber DS
db 0EAh ;Jmp far na pôvodnú INT8
G3: push ds ;Ulož DS
lds dx,es:[si+60h] ;DS:DX=pôvodná INT8
mov ah,25h ;Dos funkcia 25h
int 21h ;Nastav vektor 08h v DS:DX
mov ah,49h ;Dos funkcia 49h
int 21h ;Uvolni pamäť segmentu ES
pop ds ;Vyber DS
xor bx,bx ;BX=0000h
jmp Zac ;-> Zac
Kon:ret ;Koniec (->INT 20h)
code ends
end Zac