e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

Časovaný zápis do klávesnicového buferu

Martin Kužela, Kukisoft

Rezidentné stláčanie kláves
Existuje vel'a dobrých programov, ale niektorým niečo chýba. Nemajú DEMO, tj. reálnu ukázku, ako program beží, aké má možnosti a ako sa ovláda. Ale to sa dá l'ahko napraviť. Stačí nasimulovať stláčanie klávesnice namiesto užívatel'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 vel'kosť pre PC/AT (verzia TyperXT je ovel'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


Pascal - hlavní
Překladače
Vlastní články
Převzaté články
Věci na stáhnutí
Odkazy k tématu
BP7 buglist
Chyba Run-time 200

BASIC