home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / tp_util / nobreak.asm < prev    next >
Encoding:
Assembly Source File  |  1990-04-06  |  3.4 KB  |  157 lines

  1. ;******************************************************
  2. ; Diese Routine wird in den Tastaturinterrupt (9) eingeklinkt
  3. ; und fängt PAUSE und ctr-alt-Del ab.
  4. ;
  5. ; das Hauptprogramm erhält über die Variablen
  6. ; PAUSEK : BOOLEAN; Pause- Taste gedrückt
  7. ; BREAKK : BOOLEAN; ctrl-alt-Del gedrückt
  8. ; gemeldet
  9. ;
  10. ;******************************************************
  11.  
  12. DATA    SEGMENT    BYTE PUBLIC
  13.  
  14.     EXTRN    PAUSEK : BYTE
  15.     EXTRN    BREAKK : BYTE
  16.  
  17. DATA    ENDS
  18.  
  19. ;******************************************************    Code
  20.  
  21. CODE    SEGMENT    BYTE PUBLIC
  22.  
  23.     ASSUME    CS:CODE, DS:DATA
  24.  
  25.         PUBLIC  InitKbdVectors, RestoreKbdVectors;
  26.     PUBLIC    NewInt09
  27.  
  28. ;CS-relative variables,    easily accessible to interrupt handlers
  29. PrevInt09    LABEL DWORD
  30. PrevInt09Ofs    DW ?
  31. PrevInt09Seg    DW ?
  32.  
  33. ;*********************************************************** NewInt09
  34. ;Handle    hardware keyboard interrupts
  35.  
  36.     BiosShiftFlags    EQU BYTE PTR 17h  ;Addresses in    BIOS data area
  37.     E0FLAG        EQU BYTE PTR 46H
  38.  
  39. NewInt09    PROC FAR
  40.  
  41.     STI                ;Interrupts on
  42.     PUSH    AX            ;Save registers    we use
  43.     PUSH    BX
  44.     PUSH    CX
  45.     PUSH    DS
  46.  
  47.     MOV    AX,0040h
  48.     MOV    DS,AX            ;Point to BIOS data area
  49.     IN    AL,60h            ;Read scan code
  50.     CMP    AL,45H            ; PAUSE ?
  51.     JE    PAUSE            ; JA - ABFANGEN
  52.  
  53.     CMP    AL,46H            ; BEI CTRL-BREAK KOMMT MAKECODE E0 46
  54.     JE    CTRLBR
  55.  
  56.     MOV    AL,DS:BiosShiftFlags    ;Shift status in AL
  57.     AND    AL,00001100b        ;Just Ctrl-Alt bits
  58.     CMP    AL,00001100b        ;Both Ctrl and Alt depressed?
  59.     JE    CTRLALT            ; GGF. Ctrl-Alt-Del ABFANGEN
  60.  
  61. Int09Orig:                ;Let BIOS int 09 handler take care of it
  62.     POP    DS            ;Restore registers
  63.     POP    CX
  64.     POP    BX
  65.     POP    AX
  66.     JMP    PrevInt09        ;Transfer to previous interrupt    09
  67.  
  68. PAUSE:    MOV    AX,SEG DATA
  69.     MOV    DS,AX            ;Point to Turbo    data area
  70.     MOV    PAUSEK,0FFH        ; PAUSE MARKIEREN
  71.     JMP    ZURUECK
  72.  
  73. CTRLBR:    MOV    AL,DS:E0FLAG
  74.     AND    AL,00000010b        ; E0- FLAG GESETZT ?
  75.     JE    INT09ORIG
  76.     JMP    ISBREAK
  77.  
  78. CTRLALT:
  79.     IN    AL,60h            ;Read scan code
  80.     CMP    AL,53H            ;Is it 53h?
  81.     JNE    Int09Orig        ;If not, pass on to BIOS int 09    handler
  82.  
  83. ISBREAK:
  84.     MOV    AL,DS:E0FLAG
  85.     AND    AL,11111101B        ; RESET E0- FLAG
  86.     MOV    DS:E0FLAG,AL
  87.  
  88.     MOV    AX,SEG DATA
  89.     MOV    DS,AX            ;Point to Turbo    data area
  90.     MOV    BREAKK,0FFH        ; CTRL- ALT- DEL MARKIEREN
  91.  
  92. ; TASTATURCODE VERNICHTEN UND ZURÜCK
  93. ZURUECK:
  94.     IN    AL,61h            ;Read control port value
  95.     MOV    AH,AL            ;Save in AH
  96.     OR    AL,80h            ;Set high bit
  97.     OUT    61h,AL            ;Reset keyboard
  98.     MOV    AL,AH            ;Retrieve original value
  99.     OUT    61h,AL            ;Enable    keyboard
  100.     CLI                ;Stop CPU interrupts
  101.     MOV    AL,20h            ;End of    interrupt
  102.     OUT    20h,AL            ;To the    interrupt controller
  103.  
  104.     STI                ;Interrupts on
  105.     POP    DS            ;Restore registers
  106.     POP    CX
  107.     POP    BX
  108.     POP    AX
  109.     IRET                ;Return    to caller
  110.  
  111. NewInt09    ENDP
  112.  
  113. ;*********************************************************** InitKbdVectors
  114.  
  115. ;Save and setup interrupt vectors
  116.  
  117. InitKbdVectors  PROC FAR
  118.  
  119.     MOV    AX,3509h        ;Get current int 9
  120.     INT    21h
  121.     MOV    PrevInt09Ofs,BX        ;Save it in CS-relative    variables
  122.     MOV    PrevInt09Seg,ES
  123.     PUSH    DS
  124.     PUSH    CS
  125.     POP    DS
  126.     MOV    DX,offset NewInt09
  127.     MOV    AX,2509h        ;Install new int 9
  128.     INT    21h
  129.     POP    DS
  130.  
  131.         RET
  132.  
  133. InitKbdVectors  ENDP
  134.  
  135. ;*********************************************************** RestoreKbdVectors
  136.  
  137. ;Restores original vectors for INT's $09 and $16
  138.  
  139. RestoreKbdVectors       PROC FAR
  140.     PUSH    DS
  141.     MOV    AX,PREVINT09SEG
  142.     PUSH    AX
  143.     POP    DS
  144.     MOV    DX,PREVINT09OFS
  145.     MOV    AX,2509h        ;Install new int 9
  146.     INT    21h
  147.     POP    DS
  148.  
  149.         RET
  150.  
  151. RestoreKbdVectors       ENDP
  152.  
  153. CODE    ENDS
  154.     END
  155.  
  156.