home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 9
/
MEDIASHARE_09.ISO
/
comm
/
ykh121.zip
/
YKHSRC.ZIP
/
GOLDKEY.ASM
< prev
next >
Wrap
Assembly Source File
|
1992-09-19
|
4KB
|
172 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
INTOFF DW ? ; Old interrupt vector offset
INTSEG DW ? ; Old interrupt vector segment
NEWKEY DB 03CH ;Replacement key ** DO NOT MOVE **
MBIT DB ? ;Make/Break bit
OLDSS DW ?
OLDSP DW ?
NEWST DW 10 DUP(?)
PUSHSS MACRO
MOV CS:OLDSS,SS
MOV CS:OLDSP,SP
MOV SP,CS
MOV SS,SP
MOV SP,OFFSET NEWST
ADD SP,20
ENDM
POPSS MACRO
MOV SS,CS:OLDSS
MOV SP,CS:OLDSP
ENDM
;
; Input parameters:
; No explicit inputs. Implicit input from the keyboard
; hardware.
;
; Output parameters:
; No explicit outputs. Control is passed to the normal keyboard
; interrupt handler unless the keystroke is to be modified or
; absorbed. Modified keystrokes are placed into the BIOS input
; buffer.
; All registers are preserved.
;
I09HAN PROC FAR
;
PUSHSS
PUSH AX ; save register
IN AL,60H ; get next character from hardware
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?
JE I09H40 ; j if so
JMP I09H80 ; else just pass on to original handler
;
I09H40:
TEST CS:MBIT,80H ; break code?
JNZ I09H70 ; j if so - ignore
PUSH DS ; save segment
PUSH SI ; save register
PUSH BX ; save register
MOV AX,40H ; BIOS data segment
MOV DS,AX ; address it
MOV BX,DS:[1CH] ; get offset of next slot in buffer
MOV SI,BX ; save for later
ADD BX,2 ; advance pointer
CMP BX,DS:[82H] ; time to wrap?
JNZ I09H50 ; j if not
MOV BX,DS:[80H] ; else do it
;
I09H50: CMP BX,DS:[1AH] ; buffer is full?
JZ I09H60 ; j if so - discard character
MOV AH,CS:NEWKEY ; set replacement scan code
XOR AL,AL ; extended code
MOV WORD PTR [SI],AX ; set into buffer
MOV DS:[1CH],BX ; save updated buffer pointer
;
I09H60: POP BX ; recover register
POP SI ; recover register
POP DS ; recover segment
;
; Clear the keyboard port, acknowledging the character.
;
I09H70: IN AL,61H ; get control port
MOV AH,AL ; copy for later reset
OR AL,80H ; set bit to acknowledge
JMP SHORT $+2 ; wait for settle
OUT 61H,AL ; do the acknowledge
JMP SHORT $+2 ; wait for settle
MOV AL,AH ; get original setting
OUT 61H,AL ; put it back
JMP SHORT $+2 ; wait for settle
MOV AL,20H ; End-Of-Interrupt
OUT 20H,AL ; send to interrupt controller
POP AX ; recover register
POPSS
IRET ; return without calling original
;
I09H80: POP AX ; recover register
POPSS
JMP DWORD PTR INTOFF ; jump to original interrupt handler
;
I09HAN ENDP
_kb_open PROC NEAR
PUSH BP
PUSH ES
PUSH DS
MOV AX,CS
MOV DS,AX
MOV AX,3509H ; get old INT 09H handler
INT 21H ; returns value in ES:BX
MOV INTOFF,BX ; save offset
MOV INTSEG,ES ; save segment
LEA DX,I09HAN ; point to new INT 09H handler
; (where it WILL be)
MOV AX,2509H ; set INT 09H vector
INT 21H ; from DS:DX
POP DS
POP ES ; recover segment
POP BP
RET
_kb_open ENDP
_kb_close PROC NEAR
PUSH BP
PUSH ES
PUSH DS
mov dx,intoff
MOV AX,INTSEG
MOV DS,AX
mov es,ax
MOV AX,2509H ; set INT 09H vector
INT 21H ; from DS:DX
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