View Source Document

keyboard.s

;--- BEGIN ---------------------------------------------------;

;--- CONSTANTS -----------------------------------------------;

;--- DATA ----------------------------------------------------;

SEGMENT .data

;--- BSS -----------------------------------------------------;

SEGMENT .bss

keyhit:     RESW 1      ; BIOS code for last key hit
shiftflags: RESW 1      ; shift flags for last key hit

;--- CODE ----------------------------------------------------;

SEGMENT .text

        ;;--------------------------------------------;
        ;; Wait for a key to be pressed, and return
        ;; its scancode.  Scancode is also displayed
        ;; on status bar, if visible.  The scancode
        ;; and shift flags are also available in variables.
        ;; cx: * -> scancode of pressed key
        ;; ax: * -> GARBAGE
GetKey:     mov ah, 12h
        int 16h     ; get key shift states

        mov [shiftflags], ax

        ;mov    cx, ax
        ;call   StatusWord

; Notes: AL bit 3 set only for left Alt key on many machines.
; AH bits 7 through 4 always clear on a Compaq SLT/286.
; INT 16/AH=09h should be used to determine whether this function
; is supported.

; Bitfields for _al_
;Bit(s)  Description     (Table 00587)
;7      Insert active
;6      CapsLock active
;5      NumLock active
;4      ScrollLock active
;3      Alt key pressed (either Alt on 101/102-key keyboards)
;2      Ctrl key pressed (either Ctrl on 101/102-key keyboards)
;1      left shift key pressed
;0      right shift key pressed

;Bitfields for _ah_
;Bit(s)  Description     (Table 00588)
;7      SysReq key pressed (SysReq is often labeled SysRq)
;6      CapsLock pressed
;5      NumLock pressed
;4      ScrollLock pressed
;3      right Alt key pressed
;2      right Ctrl key pressed
;1      left Alt key pressed
;0      left Ctrl key pressed

        xor ah, ah          ; get a key
        int 16h
        mov [keyhit], ax

        call    ShowKeyStroke
        mov cx, [keyhit]
        ret



        ;;--------------------------------------------;
        ;; Check if a key was pressed; return its
        ;; scancode if it was, or 0 if no key was pressed.
        ;; cx: * -> scancode of pressed key or 0
        ;; ax: * -> GARBAGE
ReadKey:    xor ah, ah          ; check for outstanding key
        inc ah
        int 16h
        jz  .NoKey
        jmp GetKey
.NoKey:     xor cx, cx
        ret

;--- END -----------------------------------------------------;