home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 9
/
MEDIASHARE_09.ISO
/
comm
/
ykh121.zip
/
YKHSRC.ZIP
/
KEY.ASM
< prev
next >
Wrap
Assembly Source File
|
1992-10-06
|
2KB
|
122 lines
_TEXT segment byte public 'CODE'
_TEXT ends
DGROUP group _DATA,_BSS
assume cs:_TEXT,ds:DGROUP
_DATA segment word public 'DATA'
_DATA ends
_BSS segment word public 'BSS'
_BSS ends
_TEXT segment byte public 'CODE'
assume cs:_TEXT
INT15OFF DW ? ; Old interrupt vector offset
INT15SEG DW ? ; Old interrupt vector segment
INT23OFF DW ? ; Old interrupt vector offset
INT23SEG DW ? ; Old interrupt vector segment
MBIT DB ? ; Make/Break bit
I15HAN PROC FAR
;
CMP AH,4FH ; keyboard intercept function?
JE I15H10 ; j if so
JMP DWORD PTR INT15OFF ; else call old handler
;
I15H10:
PUSH AX ; save register
MOV AH,AL ; copy scan code
AND AH,80H ; isolate make/break bit
MOV CS:MBIT,AH ; save it
AND AL,7FH ; mask out make/break bit
CMP AL,45H ; NUM LOCK?
JNE I15H60 ; j if not - just return
I15H50:
POP AX ; recover register
MOV AL,3CH ; set replacement scan code
OR AL,CS:MBIT ; include make/break bit, drop through
STC ; make sure keystroke processed
RETF 2 ; return, preserving flags
;
I15H60:
STC ; make sure keystroke processed
POP AX ; recover register
RETF 2 ; return, preserving flags
;
I15HAN ENDP
I23HAN PROC FAR
IRET
I23HAN ENDP
_kb_open PROC NEAR
PUSH BP
PUSH ES
PUSH DS
MOV AX,CS
MOV DS,AX
MOV AX,3515H ; get old INT 15H handler
INT 21H ; returns value in ES:BX
MOV CS:INT15OFF,BX ; save offset
MOV CS:INT15SEG,ES ; save segment
LEA DX,I15HAN ; point to new INT 15H handler
; (where it WILL be)
MOV AX,2515H ; set INT 15H vector
INT 21H ; from DS:DX
MOV AX,3523H
INT 21H
MOV CS:INT23OFF,BX
MOV CS:INT23SEG,ES
LEA DX,I23HAN
MOV AX,2523H
INT 21H
POP DS
POP ES ; recover segment
POP BP
RET
_kb_open ENDP
_kb_close PROC NEAR
PUSH BP
PUSH ES
PUSH DS
MOV DS,CS:INT15SEG
MOV DX,CS:INT15OFF
MOV AX,2515H ; set INT 15H vector
INT 21H ; from DS:DX
MOV DS,CS:INT23SEG
MOV DX,CS:INT23OFF
MOV AX,2523H
INT 21H
POP DS
POP ES ; recover segment
POP BP
RET
_kb_close ENDP
_TEXT ends
_DATA segment word public 'DATA'
_DATA ends
_TEXT segment byte public 'CODE'
_TEXT ends
public _kb_close
public _kb_open
end