Files
Z8C-Homebrew-Computer/OperatingSystem/monitor_v2/include/keyboard.s
Dennis Gunia bc1b9a399d Updated
2022-12-16 20:45:34 +01:00

158 lines
4.3 KiB
ArmAsm

;----------------------------------------------------------------
;Keyboard input library for Z8C
;by Dennis Gunia (04/2022)
;----------------------------------------------------------------
var_ps2_extension equ var_ps2mem+4 ;extension code
var_ps2_shift equ var_ps2mem+5 ;shift down = 0xFF, up = 0x00
var_ps2_raw equ var_ps2mem+6 ;raw scan code
keybd_read:
xor a
ld (var_ps2_extension), a
call keybd_read_wait
cp 0xE0
jr z, keybd_read_extended ;handle extended scancodes
cp 0xE1
jr z, keybd_read_extended_E1 ;handle extended scancodes for stupid pause button ....
;else fall through to keybd_read_simple
keybd_read_simple:
cp 0xF0 ;check if break
jr z, keybd_read_break ;handle break code logic
cp 0x12
jr z, keybd_shift_down
cp 0x59
jr z, keybd_shift_down
;else process key
jr keybd_read_return
keybd_read_extended:
ld (var_ps2_extension), a ;store first byte to ram
call keybd_read_wait ;read key
cp 0xF0 ;check if break
jr z, keybd_read_break_extended ;handle break code logic
;else process key
jr keybd_read_return
keybd_read_extended_E1: ;pause key
call keybd_read_wait ;read realeased key
call keybd_read_wait ;read realeased key
call keybd_read_wait ;read realeased key
call keybd_read_wait ;read realeased key
call keybd_read_wait ;read realeased key
call keybd_read_wait ;read realeased key
;fall-thorugh for last byte
keybd_read_break_extended:
call keybd_read_wait ;read realeased key
jr keybd_read
keybd_read_break:
call keybd_read_wait ;read realeased key
cp 0x12
jr z, keybd_shift_up
cp 0x59
jr z, keybd_shift_up
jp keybd_read
keybd_read_return:
;a contains scan code
ret
keybd_shift_down:
ld a,0x01
ld (var_ps2_shift),a
jr keybd_read
keybd_shift_up:
xor a
ld (var_ps2_shift),a
jr keybd_read
;wait for keyboard input
keybd_read_wait:
call keyboard_read
jr z, keybd_read_wait ;read again if error
ret
keybd_read_ascii:
call keybd_read
;push af
;call print_a_hex
;pop af
ld ix, [keybd_lut] ;LUT base address
ld bc, 4 ;increments
ld d, a ;Load scancode into d
keybd_read_ascii_seekloop:
ld a, (ix) ;load scancode from table
or a ;test if scancode is 0x00 -> indicates end of list
jr z, keybd_read_ascii_notfound ;reached end of list wizhout match
cp d ;compare scancode
jr z, keybd_read_ascii_match ;found entry
add ix,bc
jr keybd_read_ascii_seekloop
keybd_read_ascii_match:
ld b,0
ld a, (var_ps2_shift) ;if shift offset+1
inc a ;add ofset for column1
ld c,a
add ix,bc ;add column address to row address
ld a,(ix)
ret
keybd_read_ascii_notfound:
jr keybd_read_ascii
keybd_lut:
defb 0x1C, "a", "A", "@"
defb 0x32, "b", "B", 0x00
defb 0x21, "c", "C", 0x00
defb 0x23, "d", "D", 0x00
defb 0x24, "e", "E", 0x00
defb 0x2B, "f", "F", 0x00
defb 0x34, "g", "G", 0x00
defb 0x33, "h", "H", 0x00
defb 0x43, "i", "I", 0x00
defb 0x3B, "j", "J", 0x00
defb 0x42, "k", "K", 0x00
defb 0x4B, "l", "L", 0x00
defb 0x3A, "m", "M", 0x00
defb 0x31, "n", "N", 0x00
defb 0x44, "o", "O", 0x00
defb 0x4D, "p", "P", 0x00
defb 0x15, "q", "Q", 0x00
defb 0x2D, "r", "R", 0x00
defb 0x1B, "s", "S", 0x00
defb 0x2C, "t", "T", 0x00
defb 0x3C, "u", "U", 0x00
defb 0x2A, "v", "V", 0x00
defb 0x1D, "w", "W", 0x00
defb 0x22, "x", "X", 0x00
defb 0x1A, "y", "Y", 0x00
defb 0x35, "z", "Z", 0x00
defb 0x45, "0", "=", "}"
defb 0x16, "1", "!", 0x00
defb 0x1E, "2", 0x22, 0x00
defb 0x26, "3", "3", 0x00
defb 0x25, "4", "$", 0x00
defb 0x2E, "5", "%", 0x00
defb 0x36, "6", "&", 0x00
defb 0x3D, "7", "/", "{"
defb 0x3E, "8", "(", "["
defb 0x46, "9", ")", "]"
defb 0x41, ",", ";", 0x00
defb 0x49, ".", ":", 0x00
defb 0x4A, "-", "_", 0x00
defb 0x5D, "#", "'", 0x00
defb 0x5B, "+", "*", "~"
defb 0x4E, "s", "?", 0x5C
defb 0x61, "<", ">", "|"
defb 0x5A, 13, 13, 13 ;enter
defb 0x66, 0x08, 0x08, 0x08 ;backspace
defb 0x29, " ", " ", 0x00 ;space
defb 0x00 ;end of LUT