home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* MF2KBD.ASM *
- ;* Nutzung der erweiterten MF-2-Tastaturcodes in normalen *
- ;* BIOS-Aufrufen *
- ;* Compiler: MASM 4/5 oder Turbo Assembler (TASM) *
- ;* *
- ;* (c) 1989 Karsten Gieselmann & TOOLBOX *
- ;* ------------------------------------------------------- *
-
- ;----------------------------------------------------------
- ; Allgemeine Deklarationen
- ;----------------------------------------------------------
-
- WPTR EQU WORD PTR
- BPTR EQU BYTE PTR
- SetIntVec EQU 25h
- GetIntVec EQU 35h
- KeepProcess EQU 31h
- ParasToKeep EQU ((OFFSET Install - OFFSET MF2Kbd) + 10Fh) SHR 4
-
- DosCall MACRO FuncNo ;Aufruf DOS-Funktion
- mov ah,FuncNo
- int 21h
- ENDM
-
- jmps MACRO Label
- jmp short Label
- ENDM
-
- ;----------------------------------------------------------
- ; Programm
- ;----------------------------------------------------------
-
- CODE SEGMENT BYTE PUBLIC
-
- ASSUME CS:CODE
-
- ORG 100h ; .COM-Programm
-
- MF2Kbd: jmps Install
-
- ;----------------------------------------------------------
- ; Neue Serviceroutine für den Interrupt 16h
- ;----------------------------------------------------------
- Int16 PROC FAR
-
- sti ;weitere Interrupts
-
- Try0: or ah,ah ;Funktion Nr.00h?
- jne Try1 ;nein, dann eventuell
- ;Funktion Nr.01h
- or ah,10h ;sonst erweitertes
- ;BIOS benutzen
- pushf ;Flags für
- ;Interrupt-Aufruf
- call cs:[SaveInt16] ;BIOS-Routine rufen
- or ah,ah ;ist Taste ALT-Code?
- je Done0 ;ja, dann fertig
- cmp al,0E0h ;ist Erweiterungs-
- ;Kennbyte gesetzt?
- jne Done0 ;nein, dann fertig
- xor al,al ;Kennbyte auf Null
- Done0: iret
-
- Try1: cmp ah,1 ;Funktion Nr.01h?
- jne ChainInt ;nein, weiter -> BIOS
- or ah,10h ;sonst erw. BIOS
- pushf ;Flags für
- ;Interrupt-Aufruf
- call cs:[SaveInt16] ;BIOS-Routine rufen
- pushf ;Flags auf Stapel
- jz Done1 ;keine Tastencodes da
- ;dann fertig
- or ah,ah ;ALT-Code bereit?
- je Done1 ;ja, dann fertig
- cmp al,0E0h ;Erweiterungs-
- ;Kennbyte gesetzt?
- jne Done1 ;nein, dann fertig
- xor al,al ;Kennbyte auf Null
- Done1: popf ;Flags restaurieren
- ret 2 ;Rückkehr und alte
- ;Flags entfernen
-
- ChainInt: db 0EAh ;Opcode (JMP FAR)
- ;für Sprung ins BIOS
- SaveInt16 dd ? ;hier kommt der alte
- ;Vektor hin
-
- Int16 ENDP
-
-
- ;----------------------------------------------------------
- ; Installationsteil
- ;----------------------------------------------------------
-
- ASSUME DS:CODE
-
- Install PROC NEAR
-
- mov al,16h
- DosCall GetIntVec
- mov WPTR SaveInt16[0],bx
- mov WPTR SaveInt16[2],es
- mov al,16h
- mov dx,OFFSET Int16
- DosCall SetIntVec
- ;neue ISR installieren...
- mov aX,KeepProcess
- mov dx,ParasToKeep
- DosCall KeepProcess ;...und resident machen!
-
- Install ENDP
-
- CODE ENDS
-
- END MF2Kbd
- ;* ------------------------------------------------------- *