| Spectrum ROM | Routines |
| Prev: 00517 | Up: Map |
|
This very important subroutine is called by both the main keyboard subroutine (KEYBOARD) and the INKEY$ routine (S_INKEY).
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.
|
|||||||||||||
| 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 |