The keyboard is a read only device and therefore the keyboard handler
has no output functions.
The keyboard handler reads the keys as ATASCII codes. Each key is
represented by one byte of data. Therefore, each time a key is
pressed the data is treated as a byte of data just as data from any
other device is. The only difference is that the computer must wait
for the operator to press the keys as it reads the data.
Whenever a key is pressed an IRQ interrupt is generated by the
keyboard reading hardware. The internal code (not ATASCII) for the
key just pressed is then stored in CH [$02FC (764)]. The code is then
compared with the prior key code in CH1 [$02F2 (754)]. If the code in
CH1 is different from the code in CH, the key is accepted. The code
is then converted to ATASCII, and placed in the database variable
ATACHR [$02FB (763)]. On XL and XE models, KEYDEF [$0079,2 (121)]
points to the key-code-to-ATASCII conversion table. (This address is
used by the the screen handler in 400/800 models).
If the code in CH1 is the same as the code in CH, the new key code
will not be accepted unless the key debounce timer, KEYDEL [$02F1
(753)] is 0.
When CIO is told to do an input operation from the keyboard, CH is
checked to see if a key has been pressed. If CIO finds $FF (255) in
CH, it waits until a key is pressed. If CH is not $FF, a key has been
pressed and the ATASCII code for that key is taken from ATACHR. CH is
then set to $FF.
The data in CH is in the following format.
Key code format:
7 6 5 4 3 2 1 0
|C|S| key code |
C 1 = [CTRL] key is pressed
S 1 = [SHIFT] key is pressed
Anytime a key is pressed, CH is loaded with the key code. CH will
hold the code until the computer is commanded to read the keyboard.
Sometimes the computer will read a key which was pressed long ago. If
you want to prevent this, load CH with $FF before reading the
keyboard. (In BASIC use POKE 764,255.) This will clear out any old
Special function keys
[CTRL] screen output start/stop
[CTRL] Generates End-Of-File status
[/] inverse video toggle
[CAPS LOWER] sets lower case
[CTRL][CAPS] sets CTRL lock
[SHIFT][CAPS] sets caps lock
KEYBOARD REPEAT DELAY AND RATE CONTROL
On the XL and XE, KRPDEL [$02D9 (729)] determines the delay before the
key repeat begins. The value of this byte is the number of vertical
blanks (1/60th second each) to delay. KEYREP [$02DA (730)] determines
the repeat rate in vertical blanks.
The keyboard click of the XL/XE is heard through the TV speaker. The
click may be turned off by putting $FF in NOCLIK [$02DB (731)].
NON-HANDLER, NON-CIO KEYS
The [OPTION], [SELECT] and [START] keys are read from the console
switch register, CONSOL [$D01F (53279)].
The console switch register
7 6 5 4 3 2 1 0
CONSOL |0 |0 |0 |0 |SP|OP|SE|ST|
8 4 2 1
ST 0 = [START]
SE 0 = [SELECT]
OP 0 = [OPTION]
SP Console speaker. set to 1 during vertical blank.
toggleing this bit operates the speaker (which
is heard through the TV on XL/XE models).
This bit always reads 0
The [HELP] key on XL and XE models is read from HELPFG, [$02DC (732)].
This address is latched and must be reset to zero after being read.
The [HELP] key register
7 6 5 4 3 2 1 0
HELPFG |C S 0 H 0 0 0 H|
1 6 3 1 8 4 2 1
2 4 2 6
H 1 = [HELP] (bits 0 and 4)
S 1 = [SHIFT]
C 1 = [CONTROL]
Useful database variables and OS equates
KEYDEF $0079,2 (121): key code coversion table vector (XL/XE)
KRPDEL $02D9 (729): delay before key repeat (XL/XE)
KEYREP $02DA (730): key repeat rate (XL/XE)
NOCLIK $02DB (731): $FF turns off key click (XL/XE)
HELPFG $02DC (732): [HELP] key (XL/XE)
ATACHR $02FB (763): ATASCII Code for last key
CH $02FC (764): keycode, $FF if no key has been pressed
BRKKEY $0011 (17): break key flag, 0 = break key pressed
SRTIMR $022B (555): Key delay and repeat timer
SHFLOK $02BE (702): SHIFT/CTRL lock flag
$00 = lower case
$40 (64) = upper case lock
$80 (128) = CTRL lock
INVFLG $02B6 (694): inverse video flag, non-zero = inverse
CONSOL $D01F (53279): start, select and option keys
IRQEN $D20E (53774): IRQ interrupt enable
bit 7 enables [BREAK]
bit 6 enables other keys
POKMSK $0010 (16): IRQEN shadow