home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / tricks / asm / int16tsr.asm < prev    next >
Encoding:
Assembly Source File  |  1992-01-10  |  4.7 KB  |  190 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                   INT16TSR.ASM                          *
  3. ;*  TSR Gerüstprogramm für Aktivierung durch einen Hotkey  *
  4. ;*          (c) 1992 Ralph Seelig & DMV-Verlag             *
  5. ;* ------------------------------------------------------- *
  6.  
  7. _hotkey equ 1400h                  ; Hotkey ist <ALT T>
  8. _meldtext equ 'TSR Testprogramm  aktivieren mit ALT T !'
  9.  
  10. getvektor macro intnr,adresse
  11.   ; hole Interruptadresse und sichere diese
  12.   mov ah,35h
  13.   mov al,intnr
  14.   int 21h
  15.   mov word ptr adresse,bx
  16.   mov word ptr adresse+2,es
  17. endm
  18.  
  19. setvektor macro intnr,adresse
  20.   ; setze Interruptadresse
  21.   push cs
  22.   pop ds
  23.   mov dx,offset adresse
  24.   mov ah,25h
  25.   mov al,intnr
  26.   int 21h
  27. endm
  28.  
  29. newvektor macro intnr,altvektor,neuvektor
  30.   ; holt Interruptadresse, sichert diese und setzt
  31.   ; anschließend eine neue Interruptadresse
  32.  
  33.   getvektor intNr,altvektor
  34.   setvektor intNr,neuvektor
  35. endm
  36.  
  37. model tiny
  38. .code
  39.  
  40.   org 0100h
  41.  
  42. start:
  43. jmp install
  44.  
  45.   db 512 dup (?)              ; 512 Byte eigenen Stack
  46. newstack:
  47.  
  48. ; Variable
  49.  
  50.   altint16   dd ?
  51.   aktiv      db ?
  52.   altss      dw ?
  53.   altsp      dw ?
  54.   aktdta     dd ?
  55.   brkflag    db ?
  56.   eigendta   dd ?
  57.   hotkey     dw _HotKey
  58.  
  59.  
  60. ; das eigentliche TSR Programm einbinden.
  61. ; Hier kann natürlich auch eine andere Datei eingebunden
  62. ; werden.
  63.  
  64. include test.tsr
  65.  
  66. NeuInt16 proc
  67.   ; neuer Tasteninterrupt, der bei Betätigung einer
  68.   ; bestimmten Tastenkombination ein speicherresidentes
  69.   ; Programm startet
  70.  
  71.   cmp ah,0                     ; Taste holen ?
  72.   jz @@gettaste
  73.     jmp cs:altint16            ; nein => zum alten INT 16
  74.   @@gettaste:
  75.   xor ax,ax
  76.   pushf
  77.   call cs:altint16             ; Taste holen
  78.   cmp ax,cs:hotkey             ; war es der Hotkey
  79.   jz @@ishotkey
  80.     iret                       ; nein, dann Ende
  81.   @@ishotkey:
  82.   cmp cs:aktiv,0               ; TSR bereits aktiv ?
  83.   jz @@startetsr
  84.     iret                       ; ja, dann beenden
  85.   @@startetsr:
  86.   cli
  87.   inc cs:aktiv
  88.   mov cs:altss,ss              ; altes Stacksegment merken
  89.   mov cs:altsp,sp
  90.   mov sp,offset newstack       ; eigenen Stackspeicher
  91.   push cs
  92.   pop ss                       ; geben
  93.   push ax                      ; alle Register retten
  94.   push bx
  95.   push cx
  96.   push dx
  97.   push ds
  98.   push es
  99.   push di
  100.   push si
  101.   push bp
  102.   mov cx,64
  103.   mov ds,cs:altss              ; Zeiger auf alten Stack
  104.   mov si,cs:altsp              ; setzen
  105.   @@saveoldstack:
  106.     push word ptr [si]         ; 64 Werte des alten
  107.     inc si                     ; Stack's
  108.     inc si                     ; sichern
  109.   loop @@saveoldstack
  110.   sti
  111.   push cs
  112.   pop ds                       ; DS = CS
  113.   mov ah,33h
  114.   xor al,al
  115.   int 21h                      ; Break Flag lesen
  116.   mov brkflag,dl               ; und merken
  117.   inc al
  118.   xor dl,dl
  119.   int 21h                      ; Ctrl Break unterdrücken
  120.   mov ah,2fh                   ; DTA Adresse des unter-
  121.   int 21h                      ; brochenen Programm's holen
  122.   mov word ptr [cs:aktdta],bx
  123.   mov word ptr [cs:aktdta+2],es
  124.   mov dx,word ptr [cs:eigendta]
  125.   mov ah,1ah                   ; eigene DTA Adresse
  126.   int 21h                      ; setzen
  127.   push cs
  128.   pop es                       ; ES = CS
  129.   push cs
  130.   pop ds                       ; DS = CS
  131.   call TsrProgram              ; !! TSR Programm starten !!
  132.   cli
  133.   mov ah,1ah
  134.   mov dx,word ptr [cs:aktdta]
  135.   mov ds,word ptr [cs:aktdta+2]
  136.   int 21h                      ; DTA Adresse restaurieren
  137.   mov ah,33h
  138.   mov al,1
  139.   mov dl,brkflag
  140.   int 21h                      ; Break Flag restaurieren
  141.   mov cx,64
  142.   mov ds,cs:altss              ; Zeiger auf alten Stack
  143.   mov si,cs:altsp              ; setzen
  144.   add si,128
  145.   @@loadoldstack:
  146.     dec si
  147.     dec si
  148.     pop word ptr [si]
  149.   loop @@loadoldstack
  150.   pop bp                       ; alle Register restaurieren
  151.   pop si
  152.   pop di
  153.   pop es
  154.   pop ds
  155.   pop dx
  156.   pop cx
  157.   pop bx
  158.   pop ax
  159.   cli
  160.   mov sp,cs:altsp              ; alten Stack restaurieren
  161.   mov ss,cs:altss
  162.   dec cs:aktiv                 ; Aktiv Status zurücknehmen
  163.   jmp @@GetTaste               ; auf neue Taste warten
  164. NeuInt16 endp
  165.  
  166. install:
  167.   ; nicht residenter Teil des Hotkey Programm's
  168.   jmp @@anfang
  169.   @@meldung:
  170.     db 13,10
  171.     db _meldtext
  172.     db 13,10,'$'
  173.   @@anfang:
  174.   mov dx,offset @@meldung
  175.   mov ah,09h
  176.   int 21h
  177.   mov ah,2fh
  178.   int 21h                      ; DTA Adresse holen
  179.   mov word ptr eigendta,bx     ; und merken
  180.   mov word ptr eigendta+2,es
  181.  
  182. ; Adresse des alten Interrupt 16h Vektor's holen
  183. ; und merken
  184.   newvektor 16h,altint16,neuint16
  185.  
  186.   lea dx,install               ; Länge des TSR Programm's
  187.   int 27h                      ; speicherresident machen
  188.  
  189. end start
  190.