home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 05 / praxis / tsr.asm < prev    next >
Assembly Source File  |  1990-02-13  |  7KB  |  206 lines

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