home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol7n10.zip / RHCTRL.ASM < prev    next >
Assembly Source File  |  1988-05-31  |  4KB  |  143 lines

  1. ; RHCTRL.ASM - TSR to map number pad 5 as CTRL key -- by Johnny Y. Chin
  2.  
  3. CODE    SEGMENT
  4.     ASSUME CS:CODE,DS:CODE
  5.         ORG    100H
  6.  
  7. START:    JMP    INITIALIZE
  8. ;========================================================================
  9. ;    DATA AREA
  10.  
  11. MARK    DB    'Y'        ;residency marker 
  12. OLDKEY    DD    ?
  13. CTRL    DB    0
  14. ;========================================================================
  15. ;    KEYBOARD INTERCEPTOR
  16.  
  17. NEWKEY:    PUSHF            ;save registers                   
  18.     PUSH    AX                                                
  19.         PUSH    DS                                                
  20.                                                                   
  21.     MOV    AX,40H        ;point to BIOS data               
  22.         MOV    DS,AX                                             
  23.         MOV    AH,DS:[17H]    ;save keyboard flag               
  24.     IN    AL,60H        ;get keystroke scan code          
  25.                                                                   
  26.     CMP    AL,4CH        ;numeric pad-5 pressed?           
  27.         JNZ    RELEASE        ;if not check release             
  28.         TEST    AH,00001000B    ;check alternate key pressed?     
  29.         JNZ    NO_BUSINESS                                       
  30.                                                                   
  31.         CMP    CS:CTRL,1    ;if yes, it is a typematic repeat?
  32.         JZ    RESET        ;if yes, ignore                  
  33.         OR    AH,00000100B    ;else, turn on Ctrl flag bit      
  34.         MOV    CS:CTRL,1                                         
  35.         JMP    SHORT STORE    ;store and exit                   
  36.  
  37. RELEASE:
  38.     CMP    AL,4CH+10000000B    ;is it real pad-5 release?
  39.         JNZ    NO_BUSINESS    ;if not, pass on to int 09h  
  40.         TEST    AH,00001000B    ;check alternate key pressed?
  41.         JNZ    NO_BUSINESS                                  
  42.                                                              
  43.     AND    AH,11111011B    ;else, turn off Ctrl flag bit
  44.         MOV    CS:CTRL,0                                    
  45. STORE:    MOV    DS:[17H],AH    ;store new keyboard flag
  46.                                                              
  47. RESET:    IN    AL,61H        ;get keyboard status         
  48.     MOV    AH,AL        ;save status                 
  49.         OR    AL,80H        ;clear signal                
  50.         OUT    61H,AL        ;send to keyboard            
  51.         XCHG    AH,AL        ;get original status         
  52.         OUT    61H,AL
  53.  
  54.     CLI
  55.         MOV    AL,20H
  56.         OUT    20H,AL
  57.  
  58.     POP    DS
  59.         POP    AX
  60.         POPF
  61.         IRET
  62.  
  63. NO_BUSINESS:
  64.     POP    DS
  65.         POP    AX
  66.         POPF
  67.         JMP    CS:OLDKEY
  68.  
  69. ;========================================================================
  70. HX2AS    PROC    NEAR
  71. ; Convert Hex Value in AL to ASCII and return in AX
  72.     PUSH    CX
  73.         MOV    AH,AL        ;save input
  74.         MOV    CL,4        ;get high nibble
  75.         SHR    AL,CL
  76.         CMP    AL,09H
  77.         JA      LTRH
  78.         ADD    AL,30H
  79.         JMP    SHORT LOWN
  80. LTRH:    ADD    AL,37H
  81.  
  82. LOWN:   AND    AH,0FH        ;get low nibble
  83.     CMP    AH,09H
  84.         JA    LTRL
  85.         ADD    AH,30H
  86.         JMP    SHORT FINI
  87. LTRL:    ADD    AH,37H
  88.  
  89. FINI:    POP    CX
  90.     RET
  91. HX2AS    ENDP
  92. ;========================================================================
  93. INITIALIZE:
  94.     JMP    BEGIN
  95.  
  96. BANNER    DB    0AH,0DH
  97.     DB    'Numeric pad-5 is now right-hand Ctrl key',0AH,0DH
  98.         DB    'RHCTRL Ver 1.0 -- By Johnny Y. Chin  ',0AH,0DH
  99.         DB    '$'
  100.  
  101. RESMSG    DB    0AH,0DH
  102.     DB    'RHCTRL is already resident at '
  103. SEGADD    DB    '????',0AH,0DH
  104.         DB    '$'
  105.  
  106. BEGIN:    MOV    AX,CS
  107.     MOV    DS,AX
  108.  
  109.     MOV    AX,3509H    ;get keyboard interrupt
  110.         INT    21H
  111.         MOV    WORD PTR OLDKEY,BX
  112.         MOV    WORD PTR OLDKEY[2],ES
  113.  
  114.     MOV    AL,ES:[103H]    ;check residency
  115.         CMP    AL,MARK
  116.         JZ    RESD
  117.  
  118.     MOV    DX,OFFSET NEWKEY
  119.         MOV    AX,2509H
  120.         INT    21H
  121.  
  122.     MOV    AH,09H
  123.         LEA    DX,BANNER
  124.         INT    21H
  125.  
  126.     MOV    DX,OFFSET INITIALIZE
  127.         INT    27H
  128.  
  129. RESD:    MOV    AX,ES
  130.     CALL    HX2AS
  131.         MOV    WORD PTR SEGADD+2,AX
  132.         MOV    AX,ES
  133.         XCHG    AH,AL
  134.         CALL    HX2AS
  135.         MOV    WORD PTR SEGADD,AX
  136.     LEA    DX,RESMSG
  137.     MOV    AH,09H
  138.         INT    21H
  139.         INT    20H
  140.  
  141. CODE    ENDS
  142.     END    START
  143.