Code: Select all
;; === keyboard_getkey ===
;;
;; Non-blocking getkey routine
;;
;; Post:
;; a = key value
keyboard_getkey:
push hl
push de
push bc
ld a,$ff
out (KEYBOARD),a ; reset keyport
ld e,$fe ; frist group
ld c,KEYBOARD ; key port
ld l,0 ; l holds key pressed
keyboard_getkey_loop:
out (c),e ; set keygroup
ld b,8 ; loop, Delay needed when work with key driver
in a,(c) ; read key
keyboard_getkey_bit:
inc l ; inc to get key pressed
rra ; if key pressed done
jp nc,keyboard_getkey_done
djnz keyboard_getkey_bit ; loop 8
rlc e ; next key group
jp m,keyboard_getkey_loop ; if bit 7 set loop
ld l,0 ; if no key pressed 0
keyboard_getkey_done:
ld a,l
pop bc
pop de
pop hl
ret