home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* CKBD.ASM *
- ;* Erweiterte Tastaturbelegung für das Editieren *
- ;* von C-Programmen *
- ;* (c) 1989 Olaf Stoyke und TOOLBOX *
- ;* ------------------------------------------------------- *
- ;* Assembler: MASM >= 4.0 *
- ;* masm ckbd.asm *
- ;* link ckbd.obj *
- ;* exe2bin ckbd.exe ckbd.com *
- ;* ------------------------------------------------------- *
- .8086
-
- ; function request 09H
-
- DISPLAY macro string
- mov dx,offset string
- mov ah,09H
- int 21H
- endm
-
- ; function request 25H
-
- SET_VECTOR macro interrupt,handler_start
- mov al,interrupt
- mov dx,offset handler_start
- mov ah,25H
- int 21H
- endm
-
- ; function request 31H
-
- KEEP_PROCESS macro return_code,last_byte
- mov al,return_code
- mov dx,offset last_byte
- mov cl,4
- shr dx,cl
- inc dx
- mov ah,31H
- int 21H
- endm
-
- ; function request 35H
-
- GET_VECTOR macro interrupt
- mov al,interrupt
- mov ah,35H
- int 21H
- endm
-
- ; function request 4CH
-
- END_PROCESS macro return_code
- mov al,return_code
- mov ah,4CH
- int 21H
- endm
-
- code segment
- assume cs:code,ds:code,es:nothing,ss:nothing
- org 100H
-
- start: jmp begin
-
- oldvector equ this dword
- ov_ofs dw ?
- ov_seg dw ?
- oldah db ?
-
- xtable equ this word
- dw 7D00h, 007Eh ; [6 &]
- dw 7E00h, 007Ch ; [7 /]
- dw 7F00h, 007Bh ; [8 (]
- dw 8000h, 007Dh ; [9 )]
- dw -1, -1
-
- ;
- ; Der neue Interrupt-Handler als PROC FAR
- ;
-
- isrhandler proc far
-
- jmp short int16
-
- id db "OS" ; program id string
-
- int16: sti ; interrupts erlauben
- push bx ; sichere bx
- push si ; sichere si
- push ds ; sichere ds
-
- push cs ; ds = cs
- pop ds
- mov oldah,ah ; funktionscode sichern
- pushf ; int 16h simulieren
- call cs:[oldvector]
- pushf ; int 16h ausgabe sichern
- cmp oldah,2 ; nur shift codes lesen ?
- jz exit ; ja -> exit
- mov si,offset xtable
- mov bx,ax
- cld
-
- l1: lodsw ; tabellenelement laden
- cmp ax,-1 ; tabellenende gelesen ?
- jz l3 ; ja -> exit
- cmp ax,bx ; gesuchter eintrag ?
- jz l2 ; ja -> exit
- inc si ; si += 2
- inc si
- jmp l1 ; und wiederholen
-
- l2: lodsw ; neuen Tastencode laden
- jmp exit ; und ende
- l3: mov ax,bx ; ax restaurieren
-
- exit: popf ; int 16h-flags zurückholen
- pop ds ; ds zurückholen
- pop si ; si zurückholen
- pop bx ; bx zurückholen
- ret 2 ; isr ende mit alten flags
-
- isrhandler endp
-
- ;
- ; Der folgende Code kann nach der Initialisierung
- ; überschrieben werden
- ;
-
- transient equ this byte
-
- intro db 10, 13
- db "CKBD Version 1.01", 10, 13
- db "Copyright (c) 1989 Olaf Stoyke & TOOLBOX"
- db 10, 13, "$"
-
- okmessage db "Program installed.", 10, 13
- db "(German keyboard)", 10, 13
- db "[Alt][6 &] = ~ (126)", 10, 13
- db "[Alt][7 /] = | (124)", 10, 13
- db "[Alt][8 (] = { (123)", 10, 13
- db "[Alt][9 )] = } (125)", 10, 13, "$"
-
- errmessage db 7
- db "Program is already installed.", 10, 13, "$"
-
- begin: DISPLAY intro
- GET_VECTOR 16h ; get int vector
- cmp word ptr es:[bx+2],"SO"
- ; program bereits installiert ?
- jnz install
- DISPLAY errmessage ; ja -> exit
- END_PROCESS 0
-
- install: mov ov_ofs, bx
- mov ov_seg, es
- SET_VECTOR 16h, isrhandler
- DISPLAY okmessage
- return: KEEP_PROCESS 0, transient
-
- code ends
- end start
- ;* ------------------------------------------------------- *
- ;* Ende von CKBD.ASM *