home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9303 / asmtrick / f11f12.asm < prev    next >
Encoding:
Assembly Source File  |  1993-06-03  |  4.2 KB  |  146 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                       F1112.ASM                         *
  3. ;*         Nutzung der Funktionstasten F11 und F12         *
  4. ;*          (c) 1993 Eckart Börnchen & DMV-Verlag          *
  5. ;* ------------------------------------------------------- *
  6.  
  7. CODE   SEGMENT
  8. ASSUME CS:CODE, DS:CODE
  9.  
  10.        ORG 100h
  11. START: JMP INIT
  12.  
  13. ALTINT DD 0        ; Adresse des alten Interrupt 09h
  14.  
  15. NEUINT PROC FAR                 ; Neuer Interrupt 09h
  16.    PUSHF                        ; alten Int. simulieren
  17.    CALL CS:[ALTINT]
  18.    CLI
  19.    PUSHF                        ; Register sichern
  20.    PUSH AX
  21.    PUSH BX
  22.    PUSH DS
  23.    PUSH DX
  24.    MOV  AX, 40h
  25.    MOV  DS, AX
  26.    MOV  DX, Word Ptr DS:[001Ch] ; Tastaturpuffer leer ?
  27.    MOV  BX, Word Ptr DS:[001Ah]
  28.    CMP  DX, BX
  29.    JE   INT_ENDE                ; Wenn ja -> Ende
  30.    MOV  BX, Word Ptr DS:[001Ch] ; Tastaturpuffer voll ?
  31.    ADD  BX, 2
  32.    CMP  BX, Word Ptr DS:[001Ah]
  33.    JE   INT_ENDE                ; Wenn ja -> Ende
  34.    MOV  BX, Word Ptr DS:[001Ah] ; Scan- u. ASCII-Code -> AX
  35.    MOV  AX, [BX]
  36.    CMP  AL, 0                   ; Funktionstasten ?
  37.    JNE  INT_ENDE                ; Ja -> Codes umwandeln ...
  38.   F11:
  39.    CMP  AH, 85h
  40.    JNE  F12
  41.    MOV  AX, "»"                 ; Neuer Code für F11
  42.    JMP  SHORT INT_ENDE
  43.   F12:
  44.    CMP  AH, 86h
  45.    JNE  SF11
  46.    MOV  AX, "«"                 ; Neuer Code für F12
  47.    JMP  SHORT INT_ENDE
  48.   SF11:                         ; Shift+
  49.    CMP  AH, 87h
  50.    JNE  SF12
  51.    MOV  AX, 8700h               ; Ab hier alter Code
  52.    JMP  SHORT INT_ENDE
  53.   SF12:
  54.    CMP  AH, 88h
  55.    JNE  CF11
  56.    MOV  AX, 8800h
  57.    JMP  SHORT INT_ENDE
  58.   CF11:                         ; Ctrl+
  59.    CMP  AH, 89h
  60.    JNE  CF12
  61.    MOV  AX, 8900h
  62.    JMP  SHORT INT_ENDE
  63.   CF12:
  64.    CMP  AH, 8Ah
  65.    JNE  AF11
  66.    MOV  AX, 8A00h
  67.    JMP  SHORT INT_ENDE
  68.   AF11:                         ; Alt+
  69.    CMP  AH, 8Bh
  70.    JNE  AF12
  71.    MOV  AX, 8B00h
  72.    JMP  SHORT INT_ENDE
  73.   AF12:
  74.    CMP  AH, 8Ch
  75.    JNE  SHORT INT_ENDE
  76.    MOV  AX, 8C00h
  77.  INT_ENDE:
  78.    MOV  [BX], AX                ; Neuen Code abspeichern
  79.    POP  DX                      ; Register restaurieren
  80.    POP  DS
  81.    POP  BX
  82.    POP  AX
  83.    POPF
  84.    IRET
  85. IDRES   DB "EB"                 ; Identif. ob resident
  86. NEUINT ENDP                     ; Ende residenter Teil
  87.  
  88. INIT PROC NEAR                  ; Check-Prozedur
  89.    MOV  AX, 3509h               ; Int.-Vektor auslesen
  90.    INT  21h
  91.    CMP  Word Ptr ES:[IDRES], "BE"  ; Bereits installiert ?
  92.    JE   DEINST                  ; Ja -> entfernen
  93.    JMP  INST                    ; Nein -> installieren
  94. INIT ENDP
  95.   
  96. INST PROC NEAR                  ; Installations-Prozedur
  97.   MOV  Word Ptr [ALTINT], BX    ; Alt-Int. 09h sichern
  98.   MOV  Word Ptr [ALTINT+2], ES
  99.   MOV  DX, OFFSET NEUINT        ; Neu-Int.-handler setzen
  100.   MOV  AX, 2509h
  101.   INT  21h
  102.   MOV  DX, OFFSET INIT          ; Resid. Paragr. berechnen
  103.   ADD  DX, 15
  104.   MOV  CL, 4
  105.   SHR  DX, CL
  106.   PUSH DX                       ; DX f. res. Ende retten
  107.   MOV  DX, OFFSET InstMsg       ; Install-meldung ausgeben
  108.   MOV  AH, 09h
  109.   INT  21h
  110.   POP  DX                       ; DX restaurieren
  111.   MOV  AX, 3100h                ; Progr. resident beenden
  112.   INT  21h
  113. INST ENDP
  114.  
  115. DEINST PROC NEAR                ; Deinstallations-Prozedur
  116.   PUSH DS                       ; DS f. Deinst-msg retten
  117.   LDS  DX, ES:[ALTINT]          ; Adr Alt-Int 09h holen
  118.   MOV  AX, 2509h
  119.   INT  21h                      ; Alt-Int-Vekt zurücksetzen
  120.   POP  DS                       ; DS zurücksetzen
  121.   PUSH ES
  122.   MOV  ES, ES:[02Ch]            ; ENV-Speicher freigeben
  123.   MOV  AH, 49h
  124.   INT  21h
  125.   POP  ES
  126.   MOV  AH, 49h                  ; Progr.-Speicher freigeben
  127.   INT  21h
  128.   MOV  DX, OFFSET DInstMsg      ; Deinst-msg ausgeben
  129.   MOV  AH, 09h
  130.   INT  21h
  131.   MOV  AX, 4C00h                ; Programm beenden
  132.   INT  21h
  133. DEINST ENDP
  134.  
  135. ; Daten des Installationsteils
  136.   InstMsg   DB 13, 10, "F11F12.COM installiert"
  137.             DB 13, 10, "$"
  138.   DInstMsg  DB 13, 10, "F11F12.COM deinstalliert"
  139.             DB 13, 10, "$"
  140.  
  141. CODE ENDS
  142. END START
  143. ;* ------------------------------------------------------- *
  144. ;*                   Ende von F1112.ASM                    *
  145.  
  146.