home *** CD-ROM | disk | FTP | other *** search
- 1: ;* ------------------------------------------------------- *
- 2: ;* CKBD1.ASM *
- 3: ;* Der residente Teil von CKBD 3.00 wird als CKBD1.OBJ in *
- 4: ;* MAKECKBD.PAS eingebunden und mit den Textdaten zusam- *
- 5: ;* mengelinkt ... *
- 6: ;* ------------------------------------------------------- *
- 7: ;* Special thanks to PETER MÜLLER !
- 8:
- 9: ideal
- 10: %noctls
- 11: locals @@
- 12: %pagesize 80,132
- 13: %title "CKBD1"
- 14:
- 15: ;
- 16: ; Konstanten für alles mögliche
- 17: ;
- 18:
- 19: READ EQU 0 ; BIOS, Tastatur lesen
- 20: STATUS EQU 1 ; BIOS, Tastatur-Status
- 21: SHIFTS EQU 2 ; BIOS, Shift-Status
- 22: TABEND EQU -1 ; Letzter Scancode
- 23:
- 24: ;
- 25: ; Es wird ein Zeichen über SI gelesen
- 26: ;
- 27:
- 28: macro GET1CHAR flag
- 29: push si
- 30: xor ah,ah
- 31: mov si,[nextchar]
- 32: lodsb
- 33: pop si
- 34: endm
- 35:
- 36: ;
- 37: ; Hier fängt der Spaß an:
- 38: ;
- 39:
- 40: segment code
- 41: assume cs:code, ds:code
- 42: assume es:nothing, ss:nothing
- 43:
- 44: ;
- 45: ; Der "Anker" für CKBD2:
- 46: ;
- 47:
- 48: org 00100h
- 49: start: mov si,[initofs]
- 50: jmp si
- 51:
- 52: ;
- 53: ; Hier wird die Adresse des alten Handlers
- 54: ; hingeschrieben, die vom neuen Handler
- 55: ; recht intensiv benutzt wird ...
- 56: ; PC = 00106H
- 57: ;
- 58:
- 59: label oldvector dword
- 60: ov_ofs dw ?
- 61: ov_seg dw ?
- 62:
- 63: ;
- 64: ; initofs enthält das Start-Offset im CS
- 65: ; für CKBD2. Es wird zum Adressieren und
- 66: ; zum Lokalisieren von und innerhalb von
- 67: ; CKBD2 benutzt.
- 68: ; PC = 0010AH
- 69: ;
- 70:
- 71: initofs dw ?
- 72:
- 73: ;
- 74: ; nextchar enthält das Offset des nächsten
- 75: ; zu lesenden Zeichens in der Tabelle. Ist
- 76: ; hier eine 0 zu finden, ist kein Zeichen
- 77: ; vorrätig ...
- 78: ; PC = 0010CH
- 79: ;
- 80:
- 81: nextchar dw 0
- 82:
- 83: ;
- 84: ; Der neue INT 16H-Handler als PROC FAR:
- 85: ; PC = 0010EH
- 86: ;
- 87:
- 88: proc isrhandler far
- 89:
- 90: jmp short @@0
- 91:
- 92: ;
- 93: ; Der Program-ID-String:
- 94: ;
- 95:
- 96: db "O2"
- 97:
- 98: @@0: cmp ah,STATUS
- 99: jle @@1
- 100: jmp [cs:oldvector]
- 101: @@1: push ds
- 102: push cs
- 103: pop ds
- 104: je @@2
- 105:
- 106: ;
- 107: ; BIOS-Funktion 0:
- 108: ;
- 109:
- 110: call getkey
- 111: pop ds
- 112: iret
- 113:
- 114: ;
- 115: ; BIOS-Funktion 1:
- 116: ;
- 117:
- 118: @@2: call getstatus
- 119: pop ds
- 120: ret 2
- 121:
- 122: endp
- 123:
- 124: ;
- 125: ; transform ist gewissermaßen das Herz
- 126: ; von CKBD. Ein Scancode in AX wird benutzt,
- 127: ; um nextchar zu setzen und gegebenfalls
- 128: ; AX zu ändern. Wenn ein Scancode in der
- 129: ; Tabelle auftaucht, ist das Carry-Bit ge-
- 130: ; setzt ...
- 131: ;
- 132:
- 133: proc transform
- 134:
- 135: push bx
- 136: push si
- 137: mov bx,ax
- 138: mov si,offset tabstart
- 139:
- 140: cld
- 141: readcode: lodsw
- 142: cmp ax,TABEND
- 143: je notfound
- 144: cmp ax,bx
- 145: lodsw
- 146: je hotcode
- 147: jmp readcode
- 148:
- 149: ;
- 150: ; AX ist nicht zu finden, nextchar muß auf
- 151: ; 0 gesetzt werden, AX wird auf den alten
- 152: ; Scancode zurückgesetzt
- 153: ;
- 154:
- 155: notfound: mov [nextchar],0
- 156: mov ax,bx
- 157: clc
- 158: jmp short tfdone
- 159:
- 160: ;
- 161: ; Yeah ! AX war ein gesuchter Scancode, AX
- 162: ; enthält jetzt das Offset des ersten Zei-
- 163: ; chens des Strings. Carry setzen & Zeichen
- 164: ; auslesen.
- 165: ;
- 166:
- 167: hotcode: mov [nextchar],ax
- 168: xchg ax,si
- 169: xor ah,ah
- 170: lodsb
- 171: stc
- 172:
- 173: tfdone: pop si
- 174: pop bx
- 175: ret
- 176:
- 177: endp
- 178:
- 179: ;
- 180: ; getkey wird für die BIOS-Funktion 0
- 181: ; aufgerufen und liest entweder aus der
- 182: ; internen Tabelle oder vom BIOS die
- 183: ; gewünschte Information
- 184: ;
- 185:
- 186: proc getkey
- 187:
- 188: cmp [nextchar],0
- 189: jne readchar
- 190:
- 191: readbios: pushf
- 192: call [oldvector]
- 193: call transform
- 194: jnc gkdone
- 195: jc incnch
- 196:
- 197: readchar: GET1CHAR
- 198: or al,al
- 199: jz readbios
- 200:
- 201: incnch: inc [nextchar]
- 202: gkdone: ret
- 203:
- 204: endp
- 205:
- 206: ;
- 207: ; getstatus ersetzt BIOS-Funktion 1. Auch
- 208: ; hier muß man einen Scancode interpre-
- 209: ; tieren !
- 210: ;
- 211:
- 212: proc getstatus
- 213:
- 214: cmp [nextchar],0
- 215: je askbios
- 216: GET1CHAR
- 217: or al,al
- 218: jnz gsdone
- 219: inc ah
- 220: jz askbios
- 221:
- 222: askbios: pushf
- 223: call [oldvector]
- 224: pushf
- 225: call transform
- 226: mov [nextchar],0
- 227: popf
- 228:
- 229: gsdone: ret
- 230:
- 231: endp
- 232:
- 233: ;
- 234: ; MAKECKBD hängt hier die Zeichenketten-
- 235: ; tabelle an:
- 236: ;
- 237:
- 238: label tabstart byte
- 239:
- 240: ends
- 241:
- 242: end start
- 243: ;* ------------------------------------------------------- *
- 244: ;* Ende von CKBD1.ASM *
-