home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / comm / ykh121.zip / YKHSRC.ZIP / KEY.ASM < prev    next >
Assembly Source File  |  1992-10-06  |  2KB  |  122 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. INT15OFF    DW       ?   ; Old interrupt vector offset
  17. INT15SEG    DW       ?   ; Old interrupt vector segment
  18. INT23OFF    DW       ?   ; Old interrupt vector offset
  19. INT23SEG    DW       ?   ; Old interrupt vector segment
  20.  
  21. MBIT    DB     ?   ; Make/Break bit
  22.  
  23. I15HAN    PROC    FAR
  24. ;
  25.     CMP    AH,4FH               ; keyboard intercept function?
  26.     JE    I15H10               ; j if so
  27.     JMP    DWORD PTR INT15OFF ; else call old handler
  28. ;
  29. I15H10:
  30.     PUSH AX                ; save register
  31.     MOV    AH,AL            ; copy scan code
  32.     AND    AH,80H            ; isolate make/break bit
  33.     MOV    CS:MBIT,AH        ; save it
  34.     AND    AL,7FH            ; mask out make/break bit
  35.     CMP    AL,45H            ; NUM LOCK?
  36.     JNE    I15H60            ; j if not - just return
  37.  
  38. I15H50:
  39.     POP    AX                ; recover register
  40.     MOV    AL,3CH          ; set replacement scan code
  41.     OR    AL,CS:MBIT        ; include make/break bit, drop through
  42.     STC                    ; make sure keystroke processed
  43.     RETF    2            ; return, preserving flags
  44. ;
  45. I15H60:
  46.     STC                    ; make sure keystroke processed
  47.     POP    AX                ; recover register
  48.     RETF    2            ; return, preserving flags
  49. ;
  50. I15HAN    ENDP
  51.  
  52. I23HAN PROC FAR
  53.        IRET
  54. I23HAN ENDP
  55.  
  56. _kb_open PROC NEAR
  57.          PUSH BP
  58.          PUSH ES
  59.          PUSH DS
  60.  
  61.          MOV AX,CS
  62.          MOV DS,AX
  63.  
  64.          MOV AX,3515H         ; get old INT 15H handler
  65.          INT 21H             ; returns value in ES:BX
  66.          MOV CS:INT15OFF,BX  ; save offset
  67.          MOV CS:INT15SEG,ES  ; save segment
  68.          LEA DX,I15HAN         ; point to new INT 15H handler
  69.                              ; (where it WILL be)
  70.          MOV AX,2515H         ; set INT 15H vector
  71.          INT 21H             ; from DS:DX
  72.  
  73.          MOV AX,3523H
  74.          INT 21H
  75.          MOV CS:INT23OFF,BX
  76.          MOV CS:INT23SEG,ES
  77.          LEA DX,I23HAN
  78.  
  79.          MOV AX,2523H
  80.          INT 21H
  81.  
  82.          POP DS
  83.          POP ES                 ; recover segment
  84.          POP BP
  85.          RET
  86. _kb_open ENDP
  87.  
  88. _kb_close PROC NEAR
  89.           PUSH BP
  90.           PUSH ES
  91.           PUSH DS
  92.  
  93.           MOV DS,CS:INT15SEG
  94.           MOV DX,CS:INT15OFF
  95.  
  96.           MOV AX,2515H      ; set INT 15H vector
  97.           INT 21H          ; from DS:DX
  98.  
  99.           MOV DS,CS:INT23SEG
  100.           MOV DX,CS:INT23OFF
  101.  
  102.           MOV AX,2523H
  103.           INT 21H
  104.  
  105.           POP DS
  106.           POP ES          ; recover segment
  107.           POP BP
  108.           RET
  109. _kb_close ENDP
  110.  
  111. _TEXT   ends
  112. _DATA    segment word public 'DATA'
  113.  
  114.  
  115. _DATA    ends
  116. _TEXT    segment byte public 'CODE'
  117. _TEXT    ends
  118.         public _kb_close
  119.         public _kb_open
  120.     end
  121.  
  122.