Prev: 00517 Up: Map Next: 00703
00654: THE 'KEYBOARD SCANNING' SUBROUTINE
Used by the routines at KEYBOARD and S_INKEY.
This very important subroutine is called by both the main keyboard subroutine and the INKEY$ routine (in SCANNING).
In all instances the E register is returned with a value in the range of +00 to +27, the value being different for each of the forty keys of the keyboard, or the value +FF, for no-key.
The D register is returned with a value that indicates which single shift key is being pressed. If both shift keys are being pressed then the D and E registers are returned with the values for the CAPS SHIFT and SYMBOL SHIFT keys respectively.
If no key is being pressed then the DE register pair is returned holding +FFFF.
The zero flag is returned reset if more than two keys are being pressed, or neither key of a pair of keys is a shift key.
Input
Output
KEY_SCAN 00654 LD L,47 The initial key value for each line will be +2F, +2E,..., +28. (Eight lines.)
00656 LD DE,65535 Initialise DE to 'no-key'.
00659 LD BC,65278 C=port address, B=counter.
Now enter a loop. Eight passes are made with each pass having a different initial key value and scanning a different line of five keys. (The first line is CAPS SHIFT, Z, X, C, V.)
KEY_LINE 00662 IN A,(C) Read from the port specified.
00664 CPL A pressed key in the line will set its respective bit, from bit 0 (outer key) to bit 4 (inner key).
00665 AND 31
00667 JR Z,KEY_DONE Jump forward if none of the five keys in the line are being pressed.
00669 LD H,A The key-bits go to the H register whilst the initial key value is fetched.
00670 LD A,L
KEY_3KEYS 00671 INC D If three keys are being pressed on the keyboard then the D register will no longer hold +FF - so return if this happens.
00672 RET NZ
KEY_BITS 00673 SUB 8 Repeatedly subtract 8 from the present key value until a key-bit is found.
00675 SRL H
00677 JR NC,KEY_BITS
00679 LD D,E Copy any earlier key value to the D register.
00680 LD E,A Pass the new key value to the E register.
00681 JR NZ,KEY_3KEYS If there is a second, or possibly a third, pressed key in this line then jump back.
KEY_DONE 00683 DEC L The line has been scanned so the initial key value is reduced for the next pass.
00684 RLC B The counter is shifted and the jump taken if there are still lines to be scanned.
00686 JR C,KEY_LINE
Four tests are now made.
00688 LD A,D Accept any key value which still has the D register holding +FF, i.e. a single key pressed or 'no-key'.
00689 INC A
00690 RET Z
00691 CP 40 Accept the key value for a pair of keys if the D key is CAPS SHIFT.
00693 RET Z
00694 CP 25 Accept the key value for a pair of keys if the D key is SYMBOL SHIFT.
00696 RET Z
00697 LD A,E It is however possible for the E key of a pair to be SYMBOL SHIFT - so this has to be considered.
00698 LD E,D
00699 LD D,A
00700 CP 24
00702 RET Return with the zero flag set if it was SYMBOL SHIFT and 'another key'; otherwise reset.
Prev: 00517 Up: Map Next: 00703