home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / msysjour / vol05 / 03 / keyboard / port-a.asm < prev    next >
Assembly Source File  |  1990-05-01  |  5KB  |  165 lines

  1.                TITLE   PORT-A.ASM
  2.                PAGE    60,132
  3.  
  4. ;---------------------------------------------------;
  5. ;  A visual display of the keyboard scan code port. ;
  6. ;  Michael J. Mefford                               ;
  7. ;---------------------------------------------------;
  8.  
  9. _TEXT          SEGMENT PUBLIC 'CODE'
  10.                ASSUME  CS:_TEXT
  11.                ASSUME  DS:_TEXT
  12.  
  13.                ORG     100H
  14.  
  15. START:         JMP     MAIN
  16.  
  17. ;              DATA AREA
  18. ;              ---------
  19.                DB      CR,SPACE,SPACE,SPACE,CR,LF
  20.  
  21. COPYRIGHT      DB      "PORT-A 1.0 (c) 1990 "
  22. PROGRAMMER     DB      "Michael J. Mefford",CR,LF,LF,"$"
  23.                DB      CTRL_Z
  24.  
  25. CR             EQU     13
  26. LF             EQU     10
  27. CTRL_Z         EQU     26
  28. SPACE          EQU     32
  29. BOX            EQU     254
  30.  
  31. ESC_SCAN       EQU     1
  32. PORT_A         EQU     60H
  33.  
  34. BIOS_INT_9     DW      ?,?
  35.  
  36. MENU           LABEL   BYTE
  37.  
  38. DB   "Press and release any key to see "
  39. DB   "make and break scan code",CR,LF
  40. DB   "Press Esc to Exit",CR,LF,LF,"$"
  41.  
  42.  
  43. ;              CODE AREA
  44. ;              ---------
  45. MAIN           PROC    NEAR
  46.  
  47.   CALL    CLS                     ;Clear the screen.
  48.  
  49.   MOV     DX,OFFSET COPYRIGHT     ;Display Copyright and menu.
  50.   MOV     AH,9
  51.   INT     21H
  52.   MOV     DX,OFFSET MENU
  53.   INT     21H
  54.  
  55.   MOV     AX,3509H                ;Get keyboard interrupt.
  56.   INT     21H
  57.   MOV     BIOS_INT_9[0],BX        ;Save old interrupt.
  58.   MOV     BIOS_INT_9[2],ES
  59.  
  60.   MOV     DX,OFFSET PORT_A_INT_9  ;Install new interrupt.
  61.   MOV     AX,2509H
  62.   INT     21H
  63.  
  64. ;-----------------------------------;
  65. ;  Loop here until Esc is detected. ;
  66. ;-----------------------------------;
  67.  
  68. GET_KEY:     
  69.   XOR     AH,AH                   ;Go and wait for a keystroke.
  70.   INT     16H
  71.   CMP     AH,ESC_SCAN             ;If it's Esc, exit.
  72.   JNZ     GET_KEY                 ;Else, continue.
  73.  
  74. EXIT:       
  75.   MOV     DX,BIOS_INT_9[0]        ;Restore old INT 9.
  76.   MOV     DS,BIOS_INT_9[2]
  77.   MOV     AX,2509H
  78.   INT     21H
  79.  
  80.   CALL    CLS                     ;Clear the screen.
  81.  
  82.   MOV     AX,4C00H                ;Exit with error level zero.
  83.   INT     21H
  84.  
  85. MAIN           ENDP
  86.  
  87.                ;***************;
  88.                ;* SUBROUTINES *;
  89.                ;***************;
  90.  
  91. ;--------------------------------------------------------;
  92. ; This "hooked" INT 9 procedure will be called whenever  ;
  93. ; a key is pressed which gives us the opportunity to get ;
  94. ; a look at the scan code and display it.                ;
  95. ;--------------------------------------------------------;
  96.  
  97. PORT_A_INT_9   PROC    NEAR
  98.  
  99.   ASSUME  DS:NOTHING
  100.   PUSH    AX                      ;Preserve registers.
  101.   PUSH    BX
  102.   PUSH    CX
  103.   IN      AL,PORT_A               ;Get the scan code.
  104.   CALL    HEX_OUTPUT              ;And display it.
  105.  
  106. OLD_INT_9:   
  107.   POP     CX                      ;Restore registers.
  108.   POP     BX
  109.   POP     AX
  110.   JMP     DWORD PTR BIOS_INT_9    ;Jump to the BIOS INT 9 routine.
  111.  
  112. PORT_A_INT_9   ENDP
  113.  
  114. ;--------------------------;
  115.  
  116. HEX_OUTPUT     PROC    NEAR
  117.  
  118.   MOV     BX,AX                   ;Store number in BX.
  119.   MOV     CX,204H                 ;4 positions/word; 4bits/char.
  120. ROTATE_HEX:  
  121.   ROL     BL,CL                   ;Move highest bits to lowest.
  122.   MOV     AL,BL                   ;Store number in AL.
  123.   AND     AL,1111B                ;Mask off all but four lowest.
  124.   ADD     AL,"0"                  ;Convert to ASCII.
  125.   CMP     AL,"9"                  ;Is it alpha?
  126.   JLE     PRINT_HEX               ;If no, print it.
  127.   ADD     AL,7                    ;Else, adjust.
  128. PRINT_HEX:   
  129.   MOV     AH,0EH                  ;Print via BIOS.
  130.   INT     10H
  131.   DEC     CH                      ;Done all four positions?
  132.   JNZ     ROTATE_HEX              ;If no, get next.
  133.  
  134.   MOV     CX,2                    ;Display two spaces
  135. DELIMIT:     
  136.   MOV     AL,SPACE                ; between scan codes
  137.   MOV     AH,0EH                  ; as delimiters.
  138.   INT     10H
  139.   LOOP    DELIMIT
  140.   RET
  141.  
  142. HEX_OUTPUT     ENDP
  143.  
  144. ;--------------------------;
  145.  
  146. CLS            PROC    NEAR
  147.   MOV     AH,0FH                  ;Get current video mode.
  148.   INT     10H
  149.   CMP     AL,7                    ;Is is mono?
  150.   JZ      CLEAR_SCREEN            ;If yes, clear screen.
  151.   MOV     AL,3                    ;Else, make sure in a text mode.
  152.  
  153. CLEAR_SCREEN:
  154.   XOR     AH,AH                   ;Clear screen by setting mode.
  155.   INT     10H
  156.   MOV     AX,500H                 ;Make sure page zero.
  157.   INT     10H
  158.   RET
  159.  
  160. CLS            ENDP
  161.  
  162.  
  163. _TEXT          ENDS
  164.                END     START
  165.