home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / comm / ykh121.zip / YKHSRC.ZIP / GOLDKEY.ASM < prev    next >
Assembly Source File  |  1992-09-19  |  4KB  |  172 lines

  1. _TEXT    segment byte public 'CODE'
  2. _TEXT    ends
  3.  
  4. DGROUP  group   _DATA,_BSS
  5.     assume    cs:_TEXT,ds:DGROUP
  6.  
  7. _DATA   segment word public 'DATA'
  8. _DATA   ends
  9.  
  10. _BSS    segment word public 'BSS'
  11. _BSS    ends
  12.  
  13. _TEXT   segment byte public 'CODE'
  14.     assume    cs:_TEXT
  15.  
  16. INTOFF    DW    ?            ; Old interrupt vector offset
  17. INTSEG    DW    ?            ; Old interrupt vector segment
  18. NEWKEY    DB    03CH        ;Replacement key ** DO NOT MOVE **
  19. MBIT    DB ?            ;Make/Break bit
  20.  
  21. OLDSS DW ?
  22. OLDSP DW ?
  23. NEWST DW 10 DUP(?)
  24.  
  25. PUSHSS MACRO
  26.   MOV CS:OLDSS,SS
  27.   MOV CS:OLDSP,SP
  28.   MOV SP,CS
  29.   MOV SS,SP
  30.   MOV SP,OFFSET NEWST
  31.   ADD SP,20
  32. ENDM
  33.  
  34. POPSS MACRO
  35.   MOV SS,CS:OLDSS
  36.   MOV SP,CS:OLDSP
  37. ENDM
  38.  
  39. ;
  40. ;    Input parameters:
  41. ;        No explicit inputs. Implicit input from the keyboard
  42. ;        hardware.
  43. ;
  44. ;    Output parameters:
  45. ;        No explicit outputs. Control is passed to the normal keyboard
  46. ;        interrupt handler unless the keystroke is to be modified or
  47. ;        absorbed. Modified keystrokes are placed into the BIOS input
  48. ;        buffer.
  49. ;        All registers are preserved.
  50. ;
  51.  
  52. I09HAN    PROC    FAR
  53. ;
  54.     PUSHSS
  55.     PUSH    AX            ; save register
  56.     IN    AL,60H            ; get next character from hardware
  57.     MOV    AH,AL            ; copy scan code
  58.     AND    AH,80H            ; isolate make/break bit
  59.     MOV    CS:MBIT,AH        ; save it
  60.     AND    AL,7FH            ; mask out make/break bit
  61.  
  62.     CMP    AL,45H            ; NUM LOCK?
  63.     JE    I09H40            ; j if so
  64.  
  65.     JMP    I09H80            ; else just pass on to original handler
  66.  
  67. ;
  68. I09H40:
  69.     TEST CS:MBIT,80H    ; break code?
  70.     JNZ    I09H70            ; j if so - ignore
  71.     PUSH    DS            ; save segment
  72.     PUSH    SI            ; save register
  73.     PUSH    BX            ; save register
  74.     MOV    AX,40H            ; BIOS data segment
  75.     MOV    DS,AX            ; address it
  76.     MOV    BX,DS:[1CH]        ; get offset of next slot in buffer
  77.     MOV    SI,BX            ; save for later
  78.     ADD    BX,2            ; advance pointer
  79.     CMP    BX,DS:[82H]        ; time to wrap?
  80.     JNZ    I09H50            ; j if not
  81.     MOV    BX,DS:[80H]        ; else do it
  82. ;
  83. I09H50:    CMP    BX,DS:[1AH]        ; buffer is full?
  84.     JZ    I09H60            ; j if so - discard character
  85.     MOV    AH,CS:NEWKEY    ; set replacement scan code
  86.     XOR    AL,AL            ; extended code
  87.     MOV    WORD PTR [SI],AX    ; set into buffer
  88.     MOV    DS:[1CH],BX        ; save updated buffer pointer
  89. ;
  90. I09H60:    POP    BX            ; recover register
  91.     POP    SI            ; recover register
  92.     POP    DS            ; recover segment
  93. ;
  94. ; Clear the keyboard port, acknowledging the character.
  95. ;
  96. I09H70:    IN    AL,61H            ; get control port
  97.     MOV    AH,AL            ; copy for later reset
  98.     OR    AL,80H            ; set bit to acknowledge
  99.     JMP    SHORT $+2        ; wait for settle
  100.     OUT    61H,AL            ; do the acknowledge
  101.     JMP    SHORT $+2        ; wait for settle
  102.     MOV    AL,AH            ; get original setting
  103.     OUT    61H,AL            ; put it back
  104.     JMP    SHORT $+2        ; wait for settle
  105.     MOV    AL,20H            ; End-Of-Interrupt
  106.     OUT    20H,AL            ; send to interrupt controller
  107.     POP    AX                ; recover register
  108.     POPSS
  109.     IRET                ; return without calling original
  110. ;
  111. I09H80:    POP    AX            ; recover register
  112.         POPSS
  113.  
  114.         JMP    DWORD PTR INTOFF    ; jump to original interrupt handler
  115. ;
  116. I09HAN    ENDP
  117.  
  118.  
  119. _kb_open PROC NEAR
  120.          PUSH BP
  121.          PUSH ES
  122.          PUSH DS
  123.  
  124.          MOV AX,CS
  125.          MOV DS,AX
  126.  
  127.          MOV AX,3509H      ; get old INT 09H handler
  128.          INT 21H          ; returns value in ES:BX
  129.          MOV INTOFF,BX ; save offset
  130.          MOV INTSEG,ES ; save segment
  131.          LEA DX,I09HAN      ; point to new INT 09H handler
  132.                           ; (where it WILL be)
  133.          MOV AX,2509H      ; set INT 09H vector
  134.          INT 21H          ; from DS:DX
  135.  
  136.          POP DS
  137.          POP ES              ; recover segment
  138.          POP BP
  139.          RET
  140. _kb_open ENDP
  141.  
  142. _kb_close PROC NEAR
  143.           PUSH BP
  144.           PUSH ES
  145.           PUSH DS
  146.  
  147.           mov dx,intoff
  148.           MOV AX,INTSEG
  149.           MOV DS,AX
  150.           mov es,ax
  151.  
  152.           MOV AX,2509H      ; set INT 09H vector
  153.           INT 21H          ; from DS:DX
  154.  
  155.           POP DS
  156.           POP ES              ; recover segment
  157.           POP BP
  158.           RET
  159. _kb_close ENDP
  160.  
  161. _TEXT   ends
  162. _DATA    segment word public 'DATA'
  163.  
  164.  
  165. _DATA    ends
  166. _TEXT    segment byte public 'CODE'
  167. _TEXT    ends
  168.         public _kb_close
  169.         public _kb_open
  170.     end
  171.  
  172.