home *** CD-ROM | disk | FTP | other *** search
- ;******************************************************
- ;
- ; Diese Routine wird in den Tastaturinterrupt (9) eingeklinkt
- ; und fängt PAUSE und ctr-alt-Del ab.
- ;
- ; das Hauptprogramm erhält über die Variablen
- ; PAUSEK : BOOLEAN; Pause- Taste gedrückt
- ; BREAKK : BOOLEAN; ctrl-alt-Del gedrückt
- ; gemeldet
- ;
- ;******************************************************
-
- DATA SEGMENT BYTE PUBLIC
-
- EXTRN PAUSEK : BYTE
- EXTRN BREAKK : BYTE
-
- DATA ENDS
-
- ;****************************************************** Code
-
- CODE SEGMENT BYTE PUBLIC
-
- ASSUME CS:CODE, DS:DATA
-
- PUBLIC InitKbdVectors, RestoreKbdVectors;
- PUBLIC NewInt09
-
- ;CS-relative variables, easily accessible to interrupt handlers
- PrevInt09 LABEL DWORD
- PrevInt09Ofs DW ?
- PrevInt09Seg DW ?
-
- ;*********************************************************** NewInt09
- ;Handle hardware keyboard interrupts
-
- BiosShiftFlags EQU BYTE PTR 17h ;Addresses in BIOS data area
- E0FLAG EQU BYTE PTR 46H
-
- NewInt09 PROC FAR
-
- STI ;Interrupts on
- PUSH AX ;Save registers we use
- PUSH BX
- PUSH CX
- PUSH DS
-
- MOV AX,0040h
- MOV DS,AX ;Point to BIOS data area
- IN AL,60h ;Read scan code
- CMP AL,45H ; PAUSE ?
- JE PAUSE ; JA - ABFANGEN
-
- CMP AL,46H ; BEI CTRL-BREAK KOMMT MAKECODE E0 46
- JE CTRLBR
-
- MOV AL,DS:BiosShiftFlags ;Shift status in AL
- AND AL,00001100b ;Just Ctrl-Alt bits
- CMP AL,00001100b ;Both Ctrl and Alt depressed?
- JE CTRLALT ; GGF. Ctrl-Alt-Del ABFANGEN
-
- Int09Orig: ;Let BIOS int 09 handler take care of it
- POP DS ;Restore registers
- POP CX
- POP BX
- POP AX
- JMP PrevInt09 ;Transfer to previous interrupt 09
-
- PAUSE: MOV AX,SEG DATA
- MOV DS,AX ;Point to Turbo data area
- MOV PAUSEK,0FFH ; PAUSE MARKIEREN
- JMP ZURUECK
-
- CTRLBR: MOV AL,DS:E0FLAG
- AND AL,00000010b ; E0- FLAG GESETZT ?
- JE INT09ORIG
- JMP ISBREAK
-
- CTRLALT:
- IN AL,60h ;Read scan code
- CMP AL,53H ;Is it 53h?
- JNE Int09Orig ;If not, pass on to BIOS int 09 handler
-
- ISBREAK:
- MOV AL,DS:E0FLAG
- AND AL,11111101B ; RESET E0- FLAG
- MOV DS:E0FLAG,AL
-
- MOV AX,SEG DATA
- MOV DS,AX ;Point to Turbo data area
- MOV BREAKK,0FFH ; CTRL- ALT- DEL MARKIEREN
-
- ; TASTATURCODE VERNICHTEN UND ZURÜCK
- ZURUECK:
- IN AL,61h ;Read control port value
- MOV AH,AL ;Save in AH
- OR AL,80h ;Set high bit
- OUT 61h,AL ;Reset keyboard
- MOV AL,AH ;Retrieve original value
- OUT 61h,AL ;Enable keyboard
- CLI ;Stop CPU interrupts
- MOV AL,20h ;End of interrupt
- OUT 20h,AL ;To the interrupt controller
-
- STI ;Interrupts on
- POP DS ;Restore registers
- POP CX
- POP BX
- POP AX
- IRET ;Return to caller
-
- NewInt09 ENDP
-
- ;*********************************************************** InitKbdVectors
-
- ;Save and setup interrupt vectors
-
- InitKbdVectors PROC FAR
-
- MOV AX,3509h ;Get current int 9
- INT 21h
- MOV PrevInt09Ofs,BX ;Save it in CS-relative variables
- MOV PrevInt09Seg,ES
- PUSH DS
- PUSH CS
- POP DS
- MOV DX,offset NewInt09
- MOV AX,2509h ;Install new int 9
- INT 21h
- POP DS
-
- RET
-
- InitKbdVectors ENDP
-
- ;*********************************************************** RestoreKbdVectors
-
- ;Restores original vectors for INT's $09 and $16
-
- RestoreKbdVectors PROC FAR
- PUSH DS
- MOV AX,PREVINT09SEG
- PUSH AX
- POP DS
- MOV DX,PREVINT09OFS
- MOV AX,2509h ;Install new int 9
- INT 21h
- POP DS
-
- RET
-
- RestoreKbdVectors ENDP
-
- CODE ENDS
- END
-