Prev: ECF3 Up: Map Next: ED6D
ED4D: Keyscan
Used by the routine at ED6D.
Input
want some examples here
O:D Key half-row number in bits 0..2, key in bits 3+ [or is it inverted?] or $FF if no keys pressed O:F Z clear if keys are pressed 47 = 00101111 = kkkkkrrr (k = key is 5, r = row is 7)
keyscan_all ED4D LD DE,$FF2F D = flag/counter? (255 to start), E = initial key and row counters (47 to start)
ED50 LD BC,$FEFE Set B to $FE (initial keyboard half-row selector) and C to $FE (keyboard port number)
Start loop.
ka_loop ED53 IN A,(C) Read port $<BC>
ED55 CPL Complement the value returned to change it from active-low to active-high
ED56 AND $1F Discard any non-key flags
ED58 JR Z,keyscan_all_1 Jump to next iteration if no keys were pressed
Keys were pressed.
ED5A INC D ?If D's 255 here we're okay. anything else causes an exit
ED5B RET NZ Return if D is non-zero
ED5C LD H,A Copy key flags to H
ED5D LD A,E Copy key and row counters to A
keyscan_all_0 ED5E SUB $08 Decrement key counter bitfield in A
ED60 SRL H Shift a key bit out of H into the carry flag
ED62 JR NC,keyscan_all_0 Loop until we hit a set bit (at least one must be set since the zero case is handled earlier)
ED64 RET NZ Return if additional bits are set
ED65 LD D,A Set return value in D
keyscan_all_1 ED66 DEC E Decrement E
ED67 RLC B Rotate the half-row selector ($FE -> $FD -> $FB -> .. -> $7F)
ED69 JR C,ka_loop ...loop until the zero bit shifts out (eight iterations)
ED6B CP A Set Z
ED6C RET
Prev: ECF3 Up: Map Next: ED6D