home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / KEYCODES.ZIP / KEYCODES.ASM next >
Assembly Source File  |  1989-04-17  |  15KB  |  501 lines

  1. PAGE ,132
  2. ;
  3. ;
  4. ;         Thomas Nofsinger
  5. ;         cccc ASM  290
  6. ;         4/16/89
  7. ;
  8. ;
  9. ;                  PROGRAM LISTING FOR KEYCODES.EXE
  10. ;
  11. ;      THIS PROGRAM WILL DISPLAY THE SCAN CODE AND THE ALPHANUMERIC
  12. ; VALUE OF ANY DEPRESSED KEYBOARD KEY.  IT WILL EXIT AFTER DOING THREE
  13. ; DISPLAY CYCLES.
  14. ;
  15. ;
  16. ;
  17.                                        ;PROCEDURES TO
  18.        EXTRN   NEWLINE:FAR         ;DISPLAY NEWLINE CHARACTER
  19.            EXTRN   PUTDEC:FAR          ;DISPLAY 16-BIT DECIMAL INTEGER
  20.        EXTRN   PUTSTRNG:FAR        ;DISPLAY CHARACTER STRING
  21.        EXTRN   CLEAR:FAR           ;CLEAR SCREEN
  22. ;
  23. ;
  24. ; MACRO DEFINITIONS
  25. INCLUDE PUSHPOP.MAC
  26. ;
  27. ;           
  28. ; S T A C K   S E G M E N T   D E F I N I T I O N
  29. ;
  30. STACK      SEGMENT STACK
  31.            DB      256 DUP(?)
  32. STACK      ENDS
  33. ;
  34. ; D A T A   S E G M E N T   D E F I N I T I O N
  35. ;
  36. DATA       SEGMENT
  37. ;
  38. ;  COPYRIGHT BOX
  39. LINE       db      '          __________________________________________________________  '
  40. SIDE       db      '         |                                                          | '
  41. CPY_RT     db      '         |  Copyright 1989 Thomas I. Nofsinger; All Rights Reserved | '
  42. B_LINE     db      '         |__________________________________________________________| '
  43. ;
  44. PROMPT1    DB      '      This program returns the scan code and the alphanumeric value of     '
  45. PROMPT2    DB      '      any depressed key.  This program will exit after displaying 15 codes.'
  46. PROMPT3    DB      '      Due to non-compatibility between PC keyboards, If the key you press  '
  47. PROMPT4    DB      '      is a non-printable character, look under your finger to see what key '
  48. PROMPT5    DB      '      you pressed.  For quick exit, hit the same key twice.  Program on:   '
  49. HEADING    DB      '   INS  CAP  NUM  SCR  ALT  CTRL  LSHFT  RSHFT  CHAR   CODE   NON-PRINTABLE'
  50. XXX        DB      'xxxx'      ;  for marking out colm's
  51. wipeout    DB      '                                                                              '
  52. SYMBOL     DB      '*'
  53. EVEN
  54. ASCII      DB   0 ;INIT TO ZERO
  55. FRAME_ROW  DB   0  ;INIT TO ZERO
  56.  
  57. ;
  58. EVEN               ;USE EVEN MEMORY ADDRESSES
  59. SCAN       DW   0  ;INIT TO ZERO
  60. SCAN1      DW   0  ;INIT TO ZERO
  61. FLAG       DW   0  ;INIT TO ZERO
  62. FLAG1      DW   1  ;INIT TO ONE
  63. TEMP       DW   0  ;INIT TO ZERO
  64. COUNT      DW  15  ;INIT TO 15
  65. DATA       ENDS
  66.  
  67.  
  68. ;
  69. ; C O D E   S E G M E N T   D E F I N I T I O N
  70. ;
  71. CODE       SEGMENT
  72.            ASSUME  CS:CODE,SS:STACK,ES:DATA 
  73. KEYCODES   PROC    FAR
  74.            PUSH    DS                  ;PUSH RETURN SEG ADDR ON STACK
  75.            SUB     AX,AX               ;PUSH RETURN OFFSET OF ZERO
  76.            PUSH    AX                  ;ON STACK
  77.            MOV     AX,SEG DATA         ;SET ES-REGISTER TO POINT
  78.            MOV     ES,AX               ;TO DATA SEGMENT
  79. ;
  80. ; set up screen
  81.        MOV  AH,0            ;set video mode
  82.        mov  al,3            ;color text mode
  83.        INT  10H             ;clear screen
  84.  
  85.        call    clear               ;clear screen
  86.        mov     dh,20               ;place cursor at row 18
  87.        mov     dl,0                ;                colm 0
  88.        mov     ah,2                ;   sub call for int 10h
  89.        int     10h                 ;Bios interrupt for cursor motion
  90.  ;
  91.        lea     di,LINE             ; print copyright w/box, line
  92.        mov     cx,70               ;                      by line.
  93.        call    putstrng            ;
  94.        call    newline             ;
  95.        lea     di,SIDE             ;
  96.        mov     cx,70               ;
  97.        call    putstrng            ;
  98.        call    newline             ;
  99.        lea     di,CPY_RT           ;
  100.        mov     cx,70               ;
  101.        call    putstrng            ;
  102.        call    newline             ;
  103.        lea     di,B_LINE           ;
  104.        mov     cx,70               ;
  105.        call    putstrng            ;
  106.        call    newline             ;END BOX
  107. ;
  108.        mov     dh,10               ;place cursor at row 10
  109.        mov     dl,0                ;                colm 0
  110.        mov     ah,2                ;   sub call for int 10h
  111.        int     10h                 ;Bios interrupt for cursor motion
  112. ;
  113.        LEA     DI,PROMPT1          ;PROMPT FOR EXPLAINATION 1 OF 5
  114.        MOV     CX,75
  115.        CALL    PUTSTRNG
  116.        CALL    NEWLINE
  117.        LEA     DI,PROMPT2          ;PROMPT FOR EXPLAINATION 2 OF 5
  118.        MOV     CX,75
  119.        CALL    PUTSTRNG
  120.        CALL    NEWLINE
  121.        LEA     DI,PROMPT3          ;PROMPT FOR EXPLAINATION 3 OF 5
  122.        MOV     CX,75
  123.        CALL    PUTSTRNG
  124.        CALL    NEWLINE
  125.        LEA     DI,PROMPT4          ;PROMPT FOR EXPLAINATION 4 OF 5
  126.        MOV     CX,75
  127.        CALL    PUTSTRNG
  128.        CALL    NEWLINE
  129.        LEA     DI,PROMPT5          ;PROMPT FOR EXPLAINATION 5 OF 5
  130.        MOV     CX,75
  131.        CALL    PUTSTRNG
  132.        CALL    NEWLINE
  133. ;
  134.        mov     dh,4                ;place cursor at row 4
  135.        mov     dl,0                ;                colm 0
  136.        mov     ah,2                ;   sub call for int 10h
  137.        int     10h                 ;Bios interrupt for cursor motion
  138.        lea     di,heading          ; print heading
  139.        mov     cx,75
  140.        call    putstrng
  141.        call    newline
  142.        CALL    FRAME               ;DRAW FRAME
  143.  
  144.  
  145.  
  146. IN_KEY:
  147.  
  148.     MOV     AH,2            ;GET KEYBOARDS FLAG BYTES
  149.     INT     16H             ;BIOS KEYBOARD CALL
  150.     XOR     AH,AH           ;ZERO AH
  151.         MOV     FLAG,AX         ;SAVE FLAGS WITH ZEROS IN HIGH BYTE
  152.     CMP     AX,FLAG1        ;SAME FLAG AS BEFORE?
  153.     JNE     N_FLAG          ;DIFFERENT FLAG, GO SHOW IT!
  154.  
  155.     MOV     AH,1            ;IS THERE A BYTE IN KEYBOARD BUFFER?
  156.     INT     16H             ;BIOS KEYBOARD CALL
  157.     JNZ     CODE_DISPLAY    ;ZF=0, BYTE WAITING, GO GET IT!
  158.  
  159.     JMP     SHORT IN_KEY    ;TAKE IT FROM THE TOP
  160.  
  161. N_FLAG:
  162.     MOV     FLAG1,AX        ;Save the new flag for the next cycle
  163.     CALL    CLEARLINE       ;SETUP FOR NEW DISPLAY
  164.     CALL    NEWFLAG        ;SHOW FLAG ROUTINE
  165.  
  166.     JMP     SHORT IN_KEY    ;DONE. TAKE IT FROM THE TOP
  167.  
  168. CODE_DISPLAY:
  169.     CALL    CLEARLINE
  170.     CALL    NEWFLAG
  171.  
  172.     MOV     AH,0            ;READ KEYBOARD BUFFER
  173.     INT     16H             ;BIOS KEYBOARD CALL
  174.     MOV     TEMP,AX         ;HOLD RESULTS FOR A SECOND
  175.     XOR     AH,AH           ;ZERO HIGH BYTE TO JUST GET ASCII CODE
  176.     MOV     ASCII,AL        ;SAVE ASCII CODE
  177.  
  178.     MOV    AX,TEMP         ;GET RESULTS
  179.  
  180.     XCHG    AH,AL           ;PLACE SCAN CODE INTO LOW BYTE
  181.     XOR     AH,AH           ;ZERO HIGH BYTE
  182.     MOV     SCAN,AX         ;SAVE SCAN CODE
  183.  
  184.     CMP     AX,SCAN1        ;SAME KEY AS LAST TIME?
  185.     JE      STOP1           ;YES IT WAS, EXIT PROGRAM
  186.  
  187.     JMP     SHORT POTS1     ;YOUR BASIC SKIP CODE BLOCK
  188. STOP1:
  189.     JMP     LAST            ;  LONG JMP
  190. POTS1:
  191.  
  192.     MOV     SCAN1,AX        ;PLACE SCAN INTO SCAN1 FOR NEXT CYCLE
  193.  
  194.     MOV     DH,5            ;PLACE CURSOR AT ROW 5
  195.     MOV     DL,50           ;               COLM 50
  196.     MOV     BH,0
  197.     MOV     AH,2            ;PLACE CURSOR SUB FUNCTION
  198.     INT     10H             ;BIOS SCREEN INTERRUPT
  199.  
  200.     LEA     DI,ASCII        ;GET CHAR
  201.     MOV     CX,1            ;ONE CHAR
  202.     CALL    PUTSTRNG        ;DISPLAY CHAR
  203.  
  204.     MOV     DH,5            ;    ROW 5
  205.     MOV     DL,56           ;   COLM 56
  206.     MOV     BH,0
  207.     MOV     AH,2            ;PLACE CURSOR SUB FUNCTION
  208.     INT     10H             ;BIOS SCREEN INTERRUPT
  209.     MOV     AX,SCAN         ;GET SCAN CODE
  210.     MOV     BX,0            ;RIGHT JUSTIFY DEC #
  211.     CALL    PUTDEC          ;DISPLAY SCAN CODE AS NUMBER
  212.  
  213.     dec    count        ; count=count-1
  214.     mov    ax,count
  215.     cmp    ax,0
  216.     jz    last
  217.  
  218.     MOV     Al,ASCII        ;GET CHAR
  219.     CMP     Al,0            ;CHECK FOR ZERO
  220.     JZ      NON_PRT         ;PRINT NON_PRINTABLE COLM
  221.  
  222.     JMP     IN_KEY          ;DONE.  TAKE IT FROM THE TOP
  223.  
  224. NON_PRT:
  225.     CALL    NONPRT
  226.     JMP     IN_KEY
  227.  
  228. ;
  229. LAST:
  230.        mov     dh,24               ;place cursor at row 24
  231.        mov     dl,0                ;                colm 0
  232.        mov     bh,0
  233.        mov     ah,2                ;    sub call for int 10h
  234.        int     10h                 ;Bios interrupt for cursor motion
  235.        RET                         ;RETURN
  236. KEYCODES   ENDP
  237.  
  238.  
  239. ;
  240.  
  241. CLEARLINE    PROC    NEAR
  242.     mov     dh,5            ;  row 5
  243.     mov     dl,1            ; colm 1
  244.     mov     bh,0
  245.     mov     ah,2            ;place cusor sub func
  246.     int     10h             ;bios screen intr.
  247.     lea     di,wipeout      ;clear out line
  248.     mov     cx,78           ;middle 78 chars - ends left alone
  249.     call    putstrng        ;
  250.     RET
  251. CLEARLINE    ENDP
  252.  
  253. ;
  254.  
  255. NEWFLAG    PROC    NEAR
  256.     PUSHA
  257.  
  258.     ;TEST FLAG BIT TREE
  259.  
  260. L_INS:
  261.     MOV     AX,FLAG         ;MOVE FLAGS INTO AX
  262.     TEST    AX,10000000B    ;TEST FOR INSERT
  263.     JNZ     STOP10          ;PRINT ROUTINE FOR INS
  264.  
  265.     JMP     SHORT POTS10    ;START SKIP BLOCK
  266. STOP10:
  267.     mov     dh,5            ;  row 5
  268.     mov     dl,3            ; colm 3
  269.     mov     bh,0
  270.     mov     ah,2            ;place cusor sub func
  271.     int     10h             ;bios screen intr.
  272.     lea     di,XXX          ;mark out chars
  273.     mov     cx,3            ;three of them
  274.     call    putstrng        ;mark out the colm!
  275.  
  276. POTS10:
  277.     NOP                     ;END SKIP BLOCK
  278.  
  279.  
  280. L_CAPS:
  281.     MOV     AX,FLAG         ;MOVE FLAGS INTO AX
  282.     TEST    AX,01000000B    ;TEST FOR CAP LOCK
  283.     JNZ     STOP9           ;PRINT ROUTINE FOR CAP LOCK
  284.  
  285.     JMP     SHORT POTS9     ;START SKIP BLOCK
  286. STOP9:
  287.     mov     dh,5            ;  row 5
  288.     mov     dl,8            ; colm 8
  289.     mov     bh,0
  290.     mov     ah,2            ;place cusor sub func
  291.     int     10h             ;bios screen intr.
  292.     lea     di,XXX          ;mark out chars
  293.     mov     cx,3            ;three of them
  294.     call    putstrng        ;mark out the colm!
  295.  
  296. POTS9:
  297.     NOP                     ;END SKIP BLOCK
  298.  
  299. L_NUM:
  300.     MOV     AX,FLAG         ;MOVE FLAGS INTO AX
  301.     TEST    AX,00100000B    ;TEST FOR NUM LOCK
  302.     JNZ     STOP8           ;PRINT ROUTINE FOR NUM LOCK
  303.  
  304.     JMP     SHORT POTS8     ;START SKIP BLOCK
  305. STOP8:
  306.     mov     dh,5            ;  row 5
  307.     mov     dl,13           ; colm 13
  308.     mov     bh,0
  309.     mov     ah,2            ;place cusor sub func
  310.     int     10h             ;bios screen intr.
  311.     lea     di,XXX          ;mark out chars
  312.     mov     cx,3            ;three of them
  313.     call    putstrng        ;mark out the colm!
  314.  
  315. POTS8:
  316.     NOP                     ;END SKIP BLOCK
  317.  
  318. L_SCR:
  319.     MOV     AX,FLAG         ;MOVE FLAGS INTO AX
  320.     TEST    AX,00010000B    ;TEST FOR SCROLL LOCK
  321.     JNZ     STOP7           ;PRINT ROUTINE FOR SCROLL LOCK
  322.  
  323.     JMP     SHORT POTS7     ;START SKIP BLOCK
  324. STOP7:
  325.     mov     dh,5            ;  row 5
  326.     mov     dl,18           ; colm 18
  327.     mov     bh,0
  328.     mov     ah,2            ;place cusor sub func
  329.     int     10h             ;bios screen intr.
  330.     lea     di,XXX          ;mark out chars
  331.     mov     cx,3            ;three of them
  332.     call    putstrng        ;mark out the colm!
  333.  
  334. POTS7:
  335.     NOP                     ;END SKIP BLOCK
  336.  
  337. L_ALT:
  338.     MOV     AX,FLAG         ;MOVE FLAGS INTO AX
  339.     TEST    AX,00001000B    ;TEST FOR ALT
  340.     JNZ     STOP6           ;PRINT ROUTINE FOR ALT
  341.  
  342.     JMP     SHORT POTS6     ;START SKIP BLOCK
  343. STOP6:
  344.     mov     dh,5            ;  row 5
  345.     mov     dl,23           ; colm 23
  346.     mov     bh,0
  347.     mov     ah,2            ;place cusor sub func
  348.     int     10h             ;bios screen intr.
  349.     lea     di,XXX          ;mark out chars
  350.     mov     cx,3            ;three of them
  351.     call    putstrng        ;mark out the colm!
  352.  
  353. POTS6:
  354.     NOP                     ;END SKIP BLOCK
  355.  
  356. L_CTRL:
  357.     MOV     AX,FLAG         ;MOVE FLAGS INTO AX
  358.     TEST    AX,00000100B    ;TEST FOR CTRL
  359.     JNZ     STOP3           ;PRINT ROUTINE FOR CTRL
  360.  
  361.     JMP     SHORT POTS3     ;START SKIP BLOCK
  362. STOP3:
  363.     mov     dh,5            ;  row 5
  364.     mov     dl,28           ; colm 28
  365.     mov     bh,0
  366.     mov     ah,2            ;place cusor sub func
  367.     int     10h             ;bios screen intr.
  368.     lea     di,XXX          ;mark out chars
  369.     mov     cx,3            ;three of them
  370.     call    putstrng        ;mark out the colm!
  371.  
  372. POTS3:
  373.     NOP                     ;END SKIP BLOCK
  374.  
  375.  L_L_SHFT:
  376.     MOV     AX,FLAG         ;MOVE FLAGS INTO AX
  377.     TEST    AX,00000010B    ;TEST FOR L_SHFT
  378.     JNZ     STOP4           ;PRINT ROUTINE FOR LEFT SHIFT
  379.  
  380.  
  381.     JMP     SHORT POTS4     ;START SKIP BLOCK
  382. STOP4:
  383.     mov     dh,5            ;  row 5
  384.     mov     dl,34           ; colm 34
  385.     mov     bh,0
  386.     mov     ah,2            ;place cusor sub func
  387.     int     10h             ;bios screen intr.
  388.     lea     di,XXX          ;mark out chars
  389.     mov     cx,4            ;four of them
  390.     call    putstrng        ;mark out the colm!
  391.  
  392. POTS4:
  393.     NOP                     ;END SKIP BLOCK
  394.  
  395.  
  396. L_R_SHFT:
  397.     MOV     AX,FLAG         ;MOVE FLAGS INTO AX
  398.     TEST    AX,00000001B    ;TEST FOR R_SHFT
  399.     JNZ     STOP5           ;PRINT ROUTINE FOR RIGHT SHIFT
  400.  
  401.     JMP     SHORT POTS5     ;START SKIP BLOCK
  402. STOP5:
  403.     mov     dh,5            ;  row 5
  404.     mov     dl,41           ; colm 41
  405.     mov     bh,0
  406.     mov     ah,2            ;place cusor sub func
  407.     int     10h             ;bios screen intr.
  408.     lea     di,XXX          ;mark out chars
  409.     mov     cx,4            ;four of them
  410.     call    putstrng        ;mark out the colm!
  411.  
  412. POTS5:
  413.     NOP                     ;END SKIP BLOCK
  414.  
  415.     POPA
  416.     RET
  417. NEWFLAG    ENDP
  418.  
  419. ;
  420.  
  421. NONPRT  PROC    NEAR
  422.     MOV     DH,5            ;  ROW 5
  423.     MOV     DL,66           ; COLM 66
  424.     mov     bh,0
  425.     mov     ah,2            ;place cusor sub func
  426.     int     10h             ;bios screen intr.
  427.     lea     di,XXX          ;mark out chars
  428.     mov     cx,4            ;four of them
  429.     call    putstrng        ;mark out the colm!
  430.     RET
  431. NONPRT  ENDP
  432.  
  433. ;
  434.  
  435. FRAME   PROC    NEAR
  436.     MOV     DH,0            ;  ROW 0
  437.     MOV     DL,0            ; COLM 0
  438.     mov     bh,0
  439.     mov     ah,2            ;place cusor sub func
  440.     int     10h             ;bios screen intr.
  441.  
  442.     MOV     BH,0
  443.     MOV     BL,46   ;GREEN BACKGROUND/YELLOW FOREGROUND
  444.     MOV     AL,SYMBOL       ; "*"
  445.     MOV     CX,79           ;print symbol 79 times
  446.     MOV     AH,9
  447.     INT     10H             ;SCREEN BIOS
  448.  
  449.     MOV     DH,24           ;  ROW 24
  450.     MOV     DL,0            ; COLM 0
  451.     mov     bh,0
  452.     mov     ah,2            ;place cusor sub func
  453.     int     10h             ;bios screen intr.
  454.  
  455.     MOV     BH,0
  456.     MOV     BL,46   ;GREEN BACKGROUND/YELLOW FOREGROUND
  457.     MOV     AL,SYMBOL       ; "*"
  458.     MOV     CX,79           ;print symbol 79 times
  459.     MOV     AH,9
  460.     INT     10H             ;SCREEN BIOS
  461.  
  462. FR_loop:
  463.  
  464.     MOV     DH,frame_row    ;  ROW #
  465.     MOV     DL,0            ; COLM 0
  466.     mov     bh,0
  467.     mov     ah,2            ;place cusor sub func
  468.     int     10h             ;bios screen intr.
  469.  
  470.     MOV     BH,0
  471.     MOV     BL,46   ;GREEN BACKGROUND/YELLOW FOREGROUND
  472.     MOV     AL,SYMBOL       ; "*"
  473.     MOV     CX,1            ;print symbol 1 time
  474.     MOV     AH,9
  475.     INT     10H             ;SCREEN BIOS
  476.  
  477.     MOV     DH,frame_row    ;  ROW #
  478.     MOV     DL,79           ; COLM 79
  479.     mov     bh,0
  480.     mov     ah,2            ;place cusor sub func
  481.     int     10h             ;bios screen intr.
  482.  
  483.     MOV     BH,0
  484.     MOV     BL,46   ;GREEN BACKGROUND/YELLOW FOREGROUND
  485.     MOV     AL,SYMBOL       ; "*"
  486.     MOV     CX,1            ;print symbol 1 time
  487.     MOV     AH,9
  488.     INT     10H             ;SCREEN BIOS
  489.  
  490.     INC     FRAME_ROW
  491.     MOV     AL,FRAME_ROW
  492.     CMP     AL,25
  493.     JNE     FR_LOOP
  494.  
  495.  
  496.     RET
  497. FRAME   ENDP
  498.  
  499. CODE       ENDS
  500.        END     KEYCODES
  501.