kbd: give the device a little breathing room in tight loops

This commit is contained in:
Virgil Dupras 2019-06-30 12:12:42 -04:00
parent 2c6ab08d51
commit cd7743b3ae

View File

@ -17,8 +17,9 @@ kbdInit:
kbdGetC: kbdGetC:
in a, (KBD_PORT) in a, (KBD_PORT)
or a ; cp 0 or a
ret z jr z, .nothing
; scan code not zero, maybe we have something. ; scan code not zero, maybe we have something.
; Do we need to skip it? ; Do we need to skip it?
push af ; <| push af ; <|
@ -35,7 +36,7 @@ kbdGetC:
call addHL ; | call addHL ; |
ld a, (hl) ; | ld a, (hl) ; |
pop hl ; <| pop hl ; <|
or a ; cp 0 or a
jp z, unsetZ ; no code. Keep A at 0, but unset Z jp z, unsetZ ; no code. Keep A at 0, but unset Z
; We have something! ; We have something!
cp a ; ensure Z cp a ; ensure Z
@ -58,6 +59,18 @@ kbdGetC:
xor a xor a
ld (KBD_SKIP_NEXT), a ld (KBD_SKIP_NEXT), a
jp unsetZ jp unsetZ
.nothing:
; We have nothing. Before we go further, we'll wait a bit to give our
; device the time to "breathe". When we're in a "nothing" loop, the z80
; hammers the device really fast and continuously generates interrupts
; on it and it interferes with its other task of reading the keyboard.
push bc
ld b, 0
.wait:
nop
djnz .wait
pop bc
jp unsetZ
; A list of the value associated with the 0x80 possible scan codes of the set ; A list of the value associated with the 0x80 possible scan codes of the set
; 2 of the PS/2 keyboard specs. 0 means no value. That value is a character than ; 2 of the PS/2 keyboard specs. 0 means no value. That value is a character than