home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* CKBD1.ASM *
- ;* Der residente Teil von CKBD 3.00 wird als CKBD1.OBJ in *
- ;* MAKECKBD.PAS eingebunden und mit den Textdaten zusam- *
- ;* mengelinkt ... *
- ;* ------------------------------------------------------- *
- ;* Special thanks to PETER MÜLLER !
-
- ideal
- %noctls
- locals @@
- %pagesize 80,132
- %title "CKBD1"
-
- ;
- ; Konstanten für alles mögliche
- ;
-
- READ EQU 0 ; BIOS, Tastatur lesen
- STATUS EQU 1 ; BIOS, Tastatur-Status
- SHIFTS EQU 2 ; BIOS, Shift-Status
- TABEND EQU -1 ; Letzter Scancode
-
- ;
- ; Es wird ein Zeichen über SI gelesen
- ;
-
- macro GET1CHAR flag
- push si
- xor ah,ah
- mov si,[nextchar]
- lodsb
- pop si
- endm
-
- ;
- ; Hier fängt der Spaß an:
- ;
-
- segment code
- assume cs:code, ds:code
- assume es:nothing, ss:nothing
-
- ;
- ; Der "Anker" für CKBD2:
- ;
-
- org 00100h
- start: mov si,[initofs]
- jmp si
-
- ;
- ; Hier wird die Adresse des alten Handlers
- ; hingeschrieben, die vom neuen Handler
- ; recht intensiv benutzt wird ...
- ; PC = 00106H
- ;
-
- label oldvector dword
- ov_ofs dw ?
- ov_seg dw ?
-
- ;
- ; initofs enthält das Start-Offset im CS
- ; für CKBD2. Es wird zum Adressieren und
- ; zum Lokalisieren von und innerhalb von
- ; CKBD2 benutzt.
- ; PC = 0010AH
- ;
-
- initofs dw ?
-
- ;
- ; nextchar enthält das Offset des nächsten
- ; zu lesenden Zeichens in der Tabelle. Ist
- ; hier eine 0 zu finden, ist kein Zeichen
- ; vorrätig ...
- ; PC = 0010CH
- ;
-
- nextchar dw 0
-
- ;
- ; Der neue INT 16H-Handler als PROC FAR:
- ; PC = 0010EH
- ;
-
- proc isrhandler far
-
- jmp short @@0
-
- ;
- ; Der Program-ID-String:
- ;
-
- db "O2"
-
- @@0: cmp ah,STATUS
- jle @@1
- jmp [cs:oldvector]
- @@1: push ds
- push cs
- pop ds
- je @@2
-
- ;
- ; BIOS-Funktion 0:
- ;
-
- call getkey
- pop ds
- iret
-
- ;
- ; BIOS-Funktion 1:
- ;
-
- @@2: call getstatus
- pop ds
- ret 2
-
- endp
-
- ;
- ; transform ist gewissermaßen das Herz
- ; von CKBD. Ein Scancode in AX wird benutzt,
- ; um nextchar zu setzen und gegebenfalls
- ; AX zu ändern. Wenn ein Scancode in der
- ; Tabelle auftaucht, ist das Carry-Bit ge-
- ; setzt ...
- ;
-
- proc transform
-
- push bx
- push si
- mov bx,ax
- mov si,offset tabstart
-
- cld
- readcode: lodsw
- cmp ax,TABEND
- je notfound
- cmp ax,bx
- lodsw
- je hotcode
- jmp readcode
-
- ;
- ; AX ist nicht zu finden, nextchar muß auf
- ; 0 gesetzt werden, AX wird auf den alten
- ; Scancode zurückgesetzt
- ;
-
- notfound: mov [nextchar],0
- mov ax,bx
- clc
- jmp short tfdone
-
- ;
- ; Yeah ! AX war ein gesuchter Scancode, AX
- ; enthält jetzt das Offset des ersten Zei-
- ; chens des Strings. Carry setzen & Zeichen
- ; auslesen.
- ;
-
- hotcode: mov [nextchar],ax
- xchg ax,si
- xor ah,ah
- lodsb
- stc
-
- tfdone: pop si
- pop bx
- ret
-
- endp
-
- ;
- ; getkey wird für die BIOS-Funktion 0
- ; aufgerufen und liest entweder aus der
- ; internen Tabelle oder vom BIOS die
- ; gewünschte Information
- ;
-
- proc getkey
-
- cmp [nextchar],0
- jne readchar
-
- readbios: pushf
- call [oldvector]
- call transform
- jnc gkdone
- jc incnch
-
- readchar: GET1CHAR
- or al,al
- jz readbios
-
- incnch: inc [nextchar]
- gkdone: ret
-
- endp
-
- ;
- ; getstatus ersetzt BIOS-Funktion 1. Auch
- ; hier muß man einen Scancode interpre-
- ; tieren !
- ;
-
- proc getstatus
-
- cmp [nextchar],0
- je askbios
- GET1CHAR
- or al,al
- jnz gsdone
- inc ah
- jz askbios
-
- askbios: pushf
- call [oldvector]
- pushf
- call transform
- mov [nextchar],0
- popf
-
- gsdone: ret
-
- endp
-
- ;
- ; MAKECKBD hängt hier die Zeichenketten-
- ; tabelle an:
- ;
-
- label tabstart byte
-
- ends
-
- end start
- ;* ------------------------------------------------------- *
- ;* Ende von CKBD1.ASM *