home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 01 / zoomer / tsr.asm < prev    next >
Encoding:
Assembly Source File  |  1990-11-12  |  7.3 KB  |  207 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                      TSR.ASM                            *
  3. ;*  Interrupt-Handler für BIOS-Keyboard-Service (INT 16)   *
  4. ;*     (c) 1988, 1990 Karsten Gieselmann & TOOLBOX         *
  5. ;* ------------------------------------------------------- *
  6.  
  7. False      EQU     0
  8. True       EQU     1
  9. MsDos      EQU    21h
  10. GetInt16   EQU  3516h                  ;Int16-Vektor lesen
  11. SetInt16   EQU  2516h                  ;Int16-Vektor schrei.
  12.  
  13. DATA    SEGMENT BYTE PUBLIC
  14.  
  15.         ;Pascal-Variablen
  16.  
  17.         EXTRN   PopUpSS    : WORD      ;Stapelwerte der Pop
  18.                                        ;-Up-Routine
  19.         EXTRN   PopUpSP    : WORD
  20.         EXTRN   SaveSS     : WORD      ;Stapelwerte
  21.         EXTRN   SaveSP     : WORD
  22.         EXTRN   TempInt16  : DWORD     ;Int16-Vektor
  23.         EXTRN   HotKey_    : WORD      ;auslösende Taste
  24.         EXTRN   InUse      : BYTE      ;Pop-Up abgearbeitet?
  25.         EXTRN   PopUp_     : DWORD     ;Adresse Pop-Up-Rout.
  26.         EXTRN   ProgramID  : BYTE      ;Identify-Byte Pop-Up
  27.         EXTRN   PrefixSeg  : WORD      ;PSP des Pop-Up-Prg.
  28.  
  29. DATA    ENDS
  30.  
  31. CODE    SEGMENT BYTE PUBLIC
  32.  
  33.         ASSUME  CS:CODE,DS:DATA
  34.  
  35.         PUBLIC  Int16, SaveInt16
  36.  
  37.  
  38.         ;Procedure Int16
  39.  
  40. Int16   PROC    FAR
  41.  
  42.         CMP     AH,0    ;Soll Taste geholt werden?
  43.         JE      GetKey  ;ja: dann eigene Routine anspringen
  44.  
  45.  
  46. ;Funktion $F0, TSR-Interface: Identify-Funktion
  47.  
  48. Identify:
  49.         CMP     AH,0F0h                ;Identify-Funktion?
  50.         JNE     GetSegment             ;nein, dann eventuell
  51.                                        ;andere Funktion?
  52.         PUSH    DS
  53.         PUSH    AX
  54.         MOV     AX,DATA
  55.         MOV     DS,AX                  ;Zugriff auf Datens.
  56.         PUSH    CX                     ;Bit 16-31 der
  57.                                        ;Identify-Maske
  58.                                        ;sichern
  59.         MOV     AX,1
  60.         MOV     CL,ProgramID
  61.         DEC     CL                     ;ID-Byte in
  62.                                        ;Bereich 0..31
  63.         CMP     CL,16                  ;liegt ID-Byte in der
  64.                                        ;oberen Hälfte?
  65.         JG      UpperHalf
  66.         SHL     AX,CL                  ;nein, dann Bitmaske
  67.                                        ;erzeugen...
  68.         OR      BX,AX                  ;...und mit BX mask.
  69.         POP     CX                     ;Bit 16-31 restaur.
  70.         JMP     SHORT Ready            ;fertig!
  71.  
  72. UpperHalf:
  73.         SUB     CL,16                  ;Bits 16-31 -> 0..15
  74.         SHL     AX,CL                  ;Bitmaske erzeugen
  75.         POP     CX                     ;Bit 16-31 restaur.
  76.         OR      CX,AX                  ;...und mit CX mask.
  77.  
  78. Ready:
  79.         POP     AX                     ;Register restaur.
  80.         POP     DS
  81.  
  82. ChainInt16:     DB  0EAh               ;Far-Jump zur
  83.                                        ;alten Int16-Routine
  84. SaveInt16       DD     ?               ;Adresse schreiben
  85.  
  86.  
  87.  
  88. ;Funktion $F1, TSR-Interface: Rückgabe des Ladersegments
  89.  
  90. GetSegment:
  91.         CMP     AH,0F1h                ;Segmentrückgabe
  92.                                        ;-Funktion?
  93.         JNE     ChainInt16             ;nein, dann weiter
  94.                                        ;mit altem Int16-ISR
  95.         PUSH    DS
  96.         PUSH    AX
  97.         MOV     BX,AX                  ;ID-Byte nach BL
  98.                                        ;sichern
  99.         MOV     AX,DATA
  100.         MOV     DS,AX                  ;Zugriff auf Daten-
  101.                                        ;segment ermöglichen
  102.         CMP     BL,ProgramID           ;PSP des aktuellen
  103.                                        ;Programm gefragt?
  104.         JNE     Ready                  ;nein, dann ab zur
  105.                                        ;nächsten Int16-ISR
  106.         MOV     BX,PrefixSeg           ;sonst Ladersegment
  107.                                        ;in BX übergeben
  108.         POP     AX
  109.         POP     DS                     ;fertig
  110.         IRET
  111.  
  112.  
  113. GetKey:
  114.         STI                            ;weitere Interrupts
  115.                                        ;erlauben
  116.         PUSH    DS
  117.         PUSH    AX
  118.         MOV     AX,DATA
  119.         MOV     DS,AX                  ;Zugriff auf Daten-
  120.                                        ;segment ermöglichen
  121.         POP     AX
  122.         CMP     InUse,True             ;Stapel umgeschaltet?
  123.         JNE     SwitchStack            ;wenn nicht, dann
  124.                                        ;jetzt machen
  125.         POP     DS                     ;DS restaurieren....
  126.         JMP     SHORT ChainInt16       ;weiter mit alter
  127.                                        ;Routine
  128.  
  129. SwitchStack:
  130.         MOV     SaveSS,SS              ;Stapelwerte sichern
  131.         MOV     SaveSP,SP
  132.         CLI
  133.         MOV     SS,PopUpSS             ;auf Turbo-Stapel
  134.                                        ;umschalten
  135.         MOV     SP,PopUpSP
  136.         STI                            ;Interrupts wieder
  137.                                        ;ermöglichen
  138.         PUSH    BX                     ;Prozessor-Reg.retten
  139.         PUSH    CX
  140.         PUSH    DX
  141.         PUSH    SI
  142.         PUSH    DI
  143.         PUSH    BP
  144.         PUSH    ES
  145.  
  146. CheckKey:
  147.         XOR     AH,AH                  ;Interrupt 16h,Fnkt.0
  148.         PUSHF
  149.         CALL    CS:SaveInt16
  150.         CMP     AX,HotKey_             ;Taste = "HotKey"?
  151.         JNE     Exit                   ;nein, dann Taste
  152.                                        ;zurück und fertig
  153.         MOV     InUse,True
  154.         MOV     AX,GetInt16            ;sonst aktuellen
  155.                                        ;Int16-Vektor holen.
  156.         INT     MsDos
  157.         MOV     WORD PTR TempInt16,BX  ;...in temporärer
  158.                                        ;Variable sichern...
  159.         MOV     WORD PTR TempInt16+2,ES
  160.         PUSH    DS
  161.         LDS     DX,CS:SaveInt16
  162.         MOV     AX,SetInt16            ;...alte Routine als
  163.                                        ;neuen Vektor setzen
  164.         INT     MsDos
  165.         POP     DS
  166.         CALL    PopUp_                 ;sonst PopUp-Routine
  167.                                        ;aufrufen....
  168.         PUSH    DS
  169.         POP     ES
  170.         MOV     DX,WORD PTR TempInt16  ;gesicherten Int16-
  171.                                        ;Vektor wiederholen
  172.         MOV     DS,WORD PTR TempInt16+2
  173.         MOV     AX,SetInt16
  174.         INT     MsDos                  ;...und als ISR
  175.                                        ;bekanntmachen
  176.         PUSH    ES
  177.         POP     DS
  178.         MOV     InUse,False
  179.         JMP     SHORT CheckKey         ;....und neue Taste
  180.                                        ;holen
  181.  
  182. Exit:
  183.         POP     ES                     ;CPU-Register
  184.                                        ;restaurieren
  185.         POP     BP
  186.         POP     DI
  187.         POP     SI
  188.         POP     DX
  189.         POP     CX
  190.         POP     BX
  191.         CLI                            ;Stapel wieder
  192.                                        ;zurückschalten
  193.         MOV     SS,SaveSS
  194.         MOV     SP,SaveSP
  195.         POP     DS
  196.         STI
  197.         IRET
  198.  
  199. Int16   ENDP
  200.  
  201.  
  202. CODE    ENDS
  203.  
  204.         END
  205. ;* ------------------------------------------------------- *
  206. ;*                  Ende von TSR.ASM                       *
  207.