home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* TSR.ASM *
- ;* Interrupt-Handler für BIOS-Keyboard-Service (INT 16) *
- ;* (c) 1988, 1990 Karsten Gieselmann & TOOLBOX *
- ;* ------------------------------------------------------- *
-
- False EQU 0
- True EQU 1
- MsDos EQU 21h
- GetInt16 EQU 3516h ;Int16-Vektor lesen
- SetInt16 EQU 2516h ;Int16-Vektor schrei.
-
- DATA SEGMENT BYTE PUBLIC
-
- ;Pascal-Variablen
-
- EXTRN PopUpSS : WORD ;Stapelwerte der Pop
- ;-Up-Routine
- EXTRN PopUpSP : WORD
- EXTRN SaveSS : WORD ;Stapelwerte
- EXTRN SaveSP : WORD
- EXTRN TempInt16 : DWORD ;Int16-Vektor
- EXTRN HotKey_ : WORD ;auslösende Taste
- EXTRN InUse : BYTE ;Pop-Up abgearbeitet?
- EXTRN PopUp_ : DWORD ;Adresse Pop-Up-Rout.
- EXTRN ProgramID : BYTE ;Identify-Byte Pop-Up
- EXTRN PrefixSeg : WORD ;PSP des Pop-Up-Prg.
-
- DATA ENDS
-
- CODE SEGMENT BYTE PUBLIC
-
- ASSUME CS:CODE,DS:DATA
-
- PUBLIC Int16, SaveInt16
-
-
- ;Procedure Int16
-
- Int16 PROC FAR
-
- CMP AH,0 ;Soll Taste geholt werden?
- JE GetKey ;ja: dann eigene Routine anspringen
-
-
- ;Funktion $F0, TSR-Interface: Identify-Funktion
-
- Identify:
- CMP AH,0F0h ;Identify-Funktion?
- JNE GetSegment ;nein, dann eventuell
- ;andere Funktion?
- PUSH DS
- PUSH AX
- MOV AX,DATA
- MOV DS,AX ;Zugriff auf Datens.
- PUSH CX ;Bit 16-31 der
- ;Identify-Maske
- ;sichern
- MOV AX,1
- MOV CL,ProgramID
- DEC CL ;ID-Byte in
- ;Bereich 0..31
- CMP CL,16 ;liegt ID-Byte in der
- ;oberen Hälfte?
- JG UpperHalf
- SHL AX,CL ;nein, dann Bitmaske
- ;erzeugen...
- OR BX,AX ;...und mit BX mask.
- POP CX ;Bit 16-31 restaur.
- JMP SHORT Ready ;fertig!
-
- UpperHalf:
- SUB CL,16 ;Bits 16-31 -> 0..15
- SHL AX,CL ;Bitmaske erzeugen
- POP CX ;Bit 16-31 restaur.
- OR CX,AX ;...und mit CX mask.
-
- Ready:
- POP AX ;Register restaur.
- POP DS
-
- ChainInt16: DB 0EAh ;Far-Jump zur
- ;alten Int16-Routine
- SaveInt16 DD ? ;Adresse schreiben
-
-
-
- ;Funktion $F1, TSR-Interface: Rückgabe des Ladersegments
-
- GetSegment:
- CMP AH,0F1h ;Segmentrückgabe
- ;-Funktion?
- JNE ChainInt16 ;nein, dann weiter
- ;mit altem Int16-ISR
- PUSH DS
- PUSH AX
- MOV BX,AX ;ID-Byte nach BL
- ;sichern
- MOV AX,DATA
- MOV DS,AX ;Zugriff auf Daten-
- ;segment ermöglichen
- CMP BL,ProgramID ;PSP des aktuellen
- ;Programm gefragt?
- JNE Ready ;nein, dann ab zur
- ;nächsten Int16-ISR
- MOV BX,PrefixSeg ;sonst Ladersegment
- ;in BX übergeben
- POP AX
- POP DS ;fertig
- IRET
-
-
- GetKey:
- STI ;weitere Interrupts
- ;erlauben
- PUSH DS
- PUSH AX
- MOV AX,DATA
- MOV DS,AX ;Zugriff auf Daten-
- ;segment ermöglichen
- POP AX
- CMP InUse,True ;Stapel umgeschaltet?
- JNE SwitchStack ;wenn nicht, dann
- ;jetzt machen
- POP DS ;DS restaurieren....
- JMP SHORT ChainInt16 ;weiter mit alter
- ;Routine
-
- SwitchStack:
- MOV SaveSS,SS ;Stapelwerte sichern
- MOV SaveSP,SP
- CLI
- MOV SS,PopUpSS ;auf Turbo-Stapel
- ;umschalten
- MOV SP,PopUpSP
- STI ;Interrupts wieder
- ;ermöglichen
- PUSH BX ;Prozessor-Reg.retten
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- PUSH BP
- PUSH ES
-
- CheckKey:
- XOR AH,AH ;Interrupt 16h,Fnkt.0
- PUSHF
- CALL CS:SaveInt16
- CMP AX,HotKey_ ;Taste = "HotKey"?
- JNE Exit ;nein, dann Taste
- ;zurück und fertig
- MOV InUse,True
- MOV AX,GetInt16 ;sonst aktuellen
- ;Int16-Vektor holen.
- INT MsDos
- MOV WORD PTR TempInt16,BX ;...in temporärer
- ;Variable sichern...
- MOV WORD PTR TempInt16+2,ES
- PUSH DS
- LDS DX,CS:SaveInt16
- MOV AX,SetInt16 ;...alte Routine als
- ;neuen Vektor setzen
- INT MsDos
- POP DS
- CALL PopUp_ ;sonst PopUp-Routine
- ;aufrufen....
- PUSH DS
- POP ES
- MOV DX,WORD PTR TempInt16 ;gesicherten Int16-
- ;Vektor wiederholen
- MOV DS,WORD PTR TempInt16+2
- MOV AX,SetInt16
- INT MsDos ;...und als ISR
- ;bekanntmachen
- PUSH ES
- POP DS
- MOV InUse,False
- JMP SHORT CheckKey ;....und neue Taste
- ;holen
-
- Exit:
- POP ES ;CPU-Register
- ;restaurieren
- POP BP
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- CLI ;Stapel wieder
- ;zurückschalten
- MOV SS,SaveSS
- MOV SP,SaveSP
- POP DS
- STI
- IRET
-
- Int16 ENDP
-
-
- CODE ENDS
-
- END
- ;* ------------------------------------------------------- *
- ;* Ende von TSR.ASM *
-