1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
PAGE ,132
; Install a custom Interrupt 23 (Ctrl-C exception) handler
;
; Public domain by Bob Stout
;
; Requires MASM 5.1 or later or equivalent
;
; Assemble with: MASM /Mx /z ...
; TASM /jMASM /mx /z ...
% .MODEL memodel,C ;Add model support via command
;line macros, e.g.
;MASM /Dmemodel=LARGE
kbstatseg equ 40h
kbstatofs equ 17h
ctl_on equ 0100b
alt_on equ 1000b
sk_c equ 2eh
EOI equ 20h
PIC equ 20h
kb_inp equ 60h
kb_outp equ 61h
.CODE
_oldvec09 dd ?
_oldvec1b dd ?
public ccrcvd
ccrcvd dw 0
;
; This is our actual ISR
;
myint09:
push ax ;save AX...
pushf ; ...& flags
in al,kb_inp ;get scan code
cmp al,sk_c ;'C'?
jne do_old ;no, forget it
push ax ;yes, save it...
push es ;...& ES reg
mov ax,kbstatseg ;read keyboard status from 40:17
mov es,ax
mov al,es:kbstatofs
test al,ctl_on ;Ctrl pressed?
pop es ;(restore AX, ES)
pop ax
jz do_old ;no, forget it
in al,kb_outp ;yes, toggle keyboard acknowledge line
mov ah,al
or al,80h
out kb_outp,al
xchg al,ah
out kb_outp,al
cli
mov ax,EOI ;send end-of-interrupt code
out PIC,al
mov ax,1
mov CS:ccrcvd,ax
pop ax ;discard original flags...
pop ax ; ...& AX
iret ;all done
do_old:
popf ;restore flags...
pop ax ; ...& AX
jmp dword PTR CS:_oldvec09 ;call our handler
;
; To avoid keyboard confusion, trap Ctrl-Break separately
;
myint1b:
push ax
pushf
mov ax,-1
mov CS:ccrcvd,ax
popf
pop ax
iret
;
; Call this to uninstall our ISR
;
undo09 PROC USES DX DS AX
mov dx, word PTR CS:_oldvec09 ;restore original keyboard vector
mov ds, word PTR CS:_oldvec09+2
mov ax,2509h
int 21h
mov dx, word PTR CS:_oldvec1b ;restore original keyboard vector
mov ds, word PTR CS:_oldvec1b+2
mov ax,251bh
int 21h
ret
undo09 ENDP
;
; Call this to install our ISR
;
ins09 PROC USES AX BX DS ES
mov ax,3509h ;get old keyboard ISR vector...
int 21h
mov word PTR CS:_oldvec09,bx
mov word PTR CS:_oldvec09+2,es ;...and save it
mov ax,351bh ;get old exit vector...
int 21h
mov word PTR CS:_oldvec1b,bx
mov word PTR CS:_oldvec1b+2,es ;...and save it
push cs ;get myint09 segment in DS
pop ds
mov dx, OFFSET myint09 ;install myint09 in int 09h
mov ax,2509h
int 21h
push cs ;get myint1b segment in DS
pop ds
mov dx, OFFSET myint1b ;install myint1b in int 1bh
mov ax,251bh
int 21h
ret
ins09 ENDP
end
|