home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
05
/
praxis
/
tsr.asm
< prev
next >
Wrap
Assembly Source File
|
1990-02-13
|
7KB
|
206 lines
;* ------------------------------------------------------- *
;* TSR.ASM *
;* Interrupt-Handler für BIOS-Keyboard-Service (INT 16) *
;* ------------------------------------------------------- *
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 *