home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* INT16TSR.ASM *
- ;* TSR Gerüstprogramm für Aktivierung durch einen Hotkey *
- ;* (c) 1992 Ralph Seelig & DMV-Verlag *
- ;* ------------------------------------------------------- *
-
- _hotkey equ 1400h ; Hotkey ist <ALT T>
- _meldtext equ 'TSR Testprogramm aktivieren mit ALT T !'
-
- getvektor macro intnr,adresse
- ; hole Interruptadresse und sichere diese
- mov ah,35h
- mov al,intnr
- int 21h
- mov word ptr adresse,bx
- mov word ptr adresse+2,es
- endm
-
- setvektor macro intnr,adresse
- ; setze Interruptadresse
- push cs
- pop ds
- mov dx,offset adresse
- mov ah,25h
- mov al,intnr
- int 21h
- endm
-
- newvektor macro intnr,altvektor,neuvektor
- ; holt Interruptadresse, sichert diese und setzt
- ; anschließend eine neue Interruptadresse
-
- getvektor intNr,altvektor
- setvektor intNr,neuvektor
- endm
-
- model tiny
- .code
-
- org 0100h
-
- start:
- jmp install
-
- db 512 dup (?) ; 512 Byte eigenen Stack
- newstack:
-
- ; Variable
-
- altint16 dd ?
- aktiv db ?
- altss dw ?
- altsp dw ?
- aktdta dd ?
- brkflag db ?
- eigendta dd ?
- hotkey dw _HotKey
-
-
- ; das eigentliche TSR Programm einbinden.
- ; Hier kann natürlich auch eine andere Datei eingebunden
- ; werden.
-
- include test.tsr
-
- NeuInt16 proc
- ; neuer Tasteninterrupt, der bei Betätigung einer
- ; bestimmten Tastenkombination ein speicherresidentes
- ; Programm startet
-
- cmp ah,0 ; Taste holen ?
- jz @@gettaste
- jmp cs:altint16 ; nein => zum alten INT 16
- @@gettaste:
- xor ax,ax
- pushf
- call cs:altint16 ; Taste holen
- cmp ax,cs:hotkey ; war es der Hotkey
- jz @@ishotkey
- iret ; nein, dann Ende
- @@ishotkey:
- cmp cs:aktiv,0 ; TSR bereits aktiv ?
- jz @@startetsr
- iret ; ja, dann beenden
- @@startetsr:
- cli
- inc cs:aktiv
- mov cs:altss,ss ; altes Stacksegment merken
- mov cs:altsp,sp
- mov sp,offset newstack ; eigenen Stackspeicher
- push cs
- pop ss ; geben
- push ax ; alle Register retten
- push bx
- push cx
- push dx
- push ds
- push es
- push di
- push si
- push bp
- mov cx,64
- mov ds,cs:altss ; Zeiger auf alten Stack
- mov si,cs:altsp ; setzen
- @@saveoldstack:
- push word ptr [si] ; 64 Werte des alten
- inc si ; Stack's
- inc si ; sichern
- loop @@saveoldstack
- sti
- push cs
- pop ds ; DS = CS
- mov ah,33h
- xor al,al
- int 21h ; Break Flag lesen
- mov brkflag,dl ; und merken
- inc al
- xor dl,dl
- int 21h ; Ctrl Break unterdrücken
- mov ah,2fh ; DTA Adresse des unter-
- int 21h ; brochenen Programm's holen
- mov word ptr [cs:aktdta],bx
- mov word ptr [cs:aktdta+2],es
- mov dx,word ptr [cs:eigendta]
- mov ah,1ah ; eigene DTA Adresse
- int 21h ; setzen
- push cs
- pop es ; ES = CS
- push cs
- pop ds ; DS = CS
- call TsrProgram ; !! TSR Programm starten !!
- cli
- mov ah,1ah
- mov dx,word ptr [cs:aktdta]
- mov ds,word ptr [cs:aktdta+2]
- int 21h ; DTA Adresse restaurieren
- mov ah,33h
- mov al,1
- mov dl,brkflag
- int 21h ; Break Flag restaurieren
- mov cx,64
- mov ds,cs:altss ; Zeiger auf alten Stack
- mov si,cs:altsp ; setzen
- add si,128
- @@loadoldstack:
- dec si
- dec si
- pop word ptr [si]
- loop @@loadoldstack
- pop bp ; alle Register restaurieren
- pop si
- pop di
- pop es
- pop ds
- pop dx
- pop cx
- pop bx
- pop ax
- cli
- mov sp,cs:altsp ; alten Stack restaurieren
- mov ss,cs:altss
- dec cs:aktiv ; Aktiv Status zurücknehmen
- jmp @@GetTaste ; auf neue Taste warten
- NeuInt16 endp
-
- install:
- ; nicht residenter Teil des Hotkey Programm's
- jmp @@anfang
- @@meldung:
- db 13,10
- db _meldtext
- db 13,10,'$'
- @@anfang:
- mov dx,offset @@meldung
- mov ah,09h
- int 21h
- mov ah,2fh
- int 21h ; DTA Adresse holen
- mov word ptr eigendta,bx ; und merken
- mov word ptr eigendta+2,es
-
- ; Adresse des alten Interrupt 16h Vektor's holen
- ; und merken
- newvektor 16h,altint16,neuint16
-
- lea dx,install ; Länge des TSR Programm's
- int 27h ; speicherresident machen
-
- end start
-