
        title   Keyboard Driver
        name    Keyboard

        include machine.ah
        include dos.mac
        pseg

if DEC_Rainbow
;+
; Function:
;
;       The Read_Keyboard function returns a unique 16-bit code for esentially
;       all keys on the keyboard.
;
;         15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0
;       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
;       |                   | C | S | F |             code              |
;       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
;               F = 1, this is a function key
;               S = 1, shift key in effect
;               C = 1, control key in effect
;
; Returns:
;
;-

ROM             equ     18H             ; new ROM access
Function_Key    equ     01H             ; this is a function key
Shift_Flag      equ     02H             ; shift key in effect
Control_Flag    equ     04H             ; control key in effect
Caps_Lock_Flag  equ     08H             ; caps lock key in effect

        public  Read_Keyboard

$proc Read_Keyboard
        push    ES                      ; Save ES
        mov     DI,6                    ; Level 1 console input
        int     ROM
        cmp     CL,0                    ; Anything?
        je      Read_80                 ; No, return -1
        cmp     CL,1                    ; Any Level 2 characters?
        jne     Read_10                 ; No, go process Level 1 character

; Here to fetch the Level 2 character left in the buffer.

        mov     DI,2                    ; Level 2 console input
        int     ROM
        cmp     CL,0                    ; Anything?
        je      Read_80                 ; No
        jmp     Read_90

; Here to process a Level 1 character

Read_10:
        and     AH,0F7H                 ; clear caps lock flag
        jmp     Read_90

Read_80:
        mov     AX,-1                   ; Return -1 to denote no character

Read_90:
        pop     ES                      ; Restore ES
        ret                             ; Return to caller

$endp Read_Keyboard

endif

if IBM_PC or Tandy_2000

        public  Read_Keyboard

$proc Read_Keyboard
        mov     AH,1
        int     16H                     ; Scan the keyboard
        jz      Read_Keyboard_1         ; No character available
        mov     AH,0                    ; Yes
        int     16H                     ; Read keyboard
        cmp     AL,0                    ; Extended character
        je      Read_Keyboard_2         ; Yes
        mov     AH,0                    ; No, normal character
        ret

Read_Keyboard_1:
        mov     AX,-1                   ; Denote "no character available"
        ret

Read_Keyboard_2:                        ; Extended character
        mov     AL,AH
        mov     AH,01H                  ; Set the "function key" flags
        ret

$endp Read_Keyboard

endif

        endps
        end


OK
