Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ kb(4M) — OS/MP 4.1A

Media Vault

Software Library

Restoration Projects

Artifacts Sought

KB(4M)  —  DEVICES AND NETWORK INTERFACES

NAME

kb − Solbourne keyboard STREAMS module

CONFIG

pseudo-device kbnumber

SYNOPSIS


#include <sys/stream.h>
#include <sys/stropt.h>
#include <dev/vuid_event.h>
#include <dev/kbio.h>
#include <dev/kbd.h>


ioctl(fd, I_PUSH, “kb”);

DESCRIPTION

The kb STREAMS module processes byte streams generated by Solbourne keyboards attached to a CPU serial port.  Definitions for altering keyboard translation, and reading events from the keyboard, are in <dev/kbio.h> and <dev/kbd.h>.  number specifies the maximum number of keyboards supported by the system. 

kb recognizes which keys have been typed using a set of tables for each known type of keyboard.  Each translation table is an array of 128 bytes (unsigned characters).  If a character value is less than 0x80, it is treated as an ASCII character (perhaps with the META bit included).  Higher values indicate special characters that invoke more complicated actions. 

Keyboard Translation State

The keyboard can be in one of the following translation modes:

TR_NONE Keyboard translation is turned off and up/down key codes are reported. 

TR_ASCII ASCII codes are reported. 

TR_EVENT firm_events (see The SunView System Programmer’s Guide — Appendix: Writing a Virtual User Input Device Driver) are reported.

TR_UNTRANS_EVENT
firm_events containing unencoded keystation codes are reported for all input events within the window system. 

Keyboard Translation-Table Entries

All instances of the kb module share five translation tables used to convert raw keystation codes to event values.  The tables are:

Unshifted Used when a key is depressed and no shifts are in effect. 

Shifted Used when a key is depressed and a Shift key is being held down. 

Caps Lock Used when a key is depressed and Caps Lock is in effect. 

Controlled Used when a key is depressed and the Control key is being held down (regardless of whether a Shift key is being held down or Caps Lock is in effect). 

Key Up Used when a key is released. 

Each key on the keyboard has a “key station” code which is a number from 0 to 127.  This number is used as an index into the translation table that is currently in effect.  If the corresponding entry in that translation table is a value from 0 to 127, this value is treated as an ASCII character, and that character is the result of the translation. 

If the entry is a value from 128 to 255, it is a “special” entry.  Special entry values are classified according to the value of the high-order bits.  The high-order value for each class is defined as a constant, as shown in the list below.  The value of the low-order bits, when added to this constant, distinguishes between keys within each class:

SHIFTKEYS 0x80 A shift key.  The value of the particular shift key is added to determine which shift mask to apply:

CAPSLOCK 0 “Caps Lock” key. 

SHIFTLOCK 1 “Shift Lock” key. 

LEFTSHIFT 2 Left-hand “Shift” key. 

RIGHTSHIFT 3 Right-hand “Shift” key. 

LEFTCTRL 4 Left-hand (or only) “Control” key. 

RIGHTCTRL 5 Right-hand “Control” key. 

BUCKYBITS 0x90 Used to toggle mode-key-up/down status without altering the value of an accompanying ASCII character.  (The actual bit-position value, minus 7, is added.) 

METABIT 0 The “Meta” key was pressed along with the key.  This is the only user-accessible bucky bit. 

FUNNY 0xA0 Performs various functions depending on the value of the low 4 bits:

NOP 0xA0 Does nothing. 

OOPS 0xA1 Exists, but is undefined. 

HOLE 0xA2 There is no key in this position on the keyboard, and the position-code should not be used. 

NOSCROLL 0xA3 Alternately sends ^S and ^Q. 

CTRLS 0xA4 Sends ^S and toggles NOSCROLL key. 

CTRLQ 0xA5 Sends ^Q and toggles NOSCROLL key. 

RESET 0xA6 Keyboard reset. 

ERROR 0xA7 The keyboard driver detected an internal error. 

IDLE 0xA8 The keyboard is idle (no keys down). 

0xA9 — 0xAF Reserved for nonparameterized functions. 

STRING 0xB0 The low-order bits index a table of strings.  When a key with a STRING entry is depressed, the characters in the null-terminated string for that key are sent, character by character.  The maximum length is defined as:

KTAB_STRLEN 10

Individual string numbers are defined as:

HOMEARROW 0x00

UPARROW 0x01

DOWNARROW 0x02

LEFTARROW 0x03

RIGHTARROW 0x04

String numbers 0x05 — 0x0F are available for custom entries. 

LEFTFUNC 0xC0

RIGHTFUNC 0xD0

TOPFUNC 0xE0

BOTTOMFUNC 0xF0 Function keys.  The low 4 bits indicate the function key number within the group:

LF(n) (LEFTFUNC+(n)-1)

RF(n) (RIGHTFUNC+(n)-1)

TF(n) (TOPFUNC+(n)-1)

BF(n) (BOTTOMFUNC+(n)-1)

There are 64 keys reserved for function keys.  The actual positions may not be on left/right/top/bottom of the keyboard, although they usually are. 

In TR_ASCII mode, when a function key is pressed, the following escape sequence is sent:

<ESC>[0....9z

where <ESC> is a single escape character and “0...9” indicates the decimal representation of the function-key value.  For example, function key R1 sends the sequence:

<ESC>[208z

because the decimal value of RF(1) is 208.  In TR_EVENT mode, if there is a VUID event code for the function key in question, an event with that event code is generated; otherwise, individual events for the characters of the escape sequence are generated. 

IOCTLS

Two ioctls set and retrieve the current translation mode of a keyboard:

KIOCTRANS The argument is a pointer to an int.  The translation mode is set to the value in the int pointed to by the argument. 

KIOCGTRANS
The argument is a pointer to an int.  The current translation mode is stored in the int pointed to by the argument. 

ioctls for changing and retrieving entries from the keyboard translation table use the kiockey structure:


structkiockey {
intkio_tablemask;/∗ Translation table (one of: 0, CAPSMASK,
   SHIFTMASK, CTRLMASK, UPMASK) ∗/
#defineKIOCABORT1-1/∗ Special “mask”:abort1 keystation ∗/
#defineKIOCABORT2-2/∗ Special “mask”:abort2 keystation ∗/
u_charkio_station;/∗ Physical keyboard key station (0-127) ∗/
u_charkio_entry;/∗ Translation table station’s entry ∗/
charkio_string[10];/∗ Value for STRING entries (null terminated) ∗/
};

KIOCSETKEY
The argument is a pointer to a kiockey structure.  The translation table entry referred to by the values in that structure is changed. 

kio_tablemask specifies which of the five translation tables contains the entry to be modified:

UPMASK 0x0080 “Key Up” translation table. 

CTRLMASK 0x0030 “Controlled” translation table. 

SHIFTMASK 0x000E “Shifted” translation table. 

CAPSMASK 0x0001 “Caps Lock” translation table. 

(No shift keys pressed or locked)
“Unshifted” translation table.

kio_station specifies the keystation code for the entry to be modified.  The value of kio_entry is stored in the entry in question.  If kio_entry is between STRING and STRING+15, the string contained in kio_string is copied to the appropriate string table entry.  This call may return ­EINVAL if there are invalid arguments. 
 
There are a couple special values of kio_tablemask that affect the two step “break to the PROM monitor” sequence.  The usual sequence is SETUP-a or L1-a .  If kio_tablemask is KIOCABORT1 then the value of kio_station is set to be the first keystation in the sequence.  If kio_tablemask is KIOCABORT2 then the value of kio_station is set to be the second keystation in the sequence. 

KIOCGETKEY
The argument is a pointer to a kiockey structure.  The current value of the keyboard translation table entry specified by kio_tablemask and kio_station is stored in the structure pointed to by the argument.  This call may return EINVAL if there are invalid arguments. 

KIOCTYPE The argument is a pointer to an int.  A code indicating the type of the keyboard is stored in the int pointed to by the argument:

KB_SUN3 Type 3 keyboard

KB_SUN4 Type 4 keyboard

−1 is stored in the int pointed to by the argument if the keyboard type is unknown. 

KIOCCMD The argument is a pointer to an int.  The command specifed by the value of the int pointed to by the argument is sent to the keyboard.  The commands that can be sent are:

Commands to the Type 3, and Type 4 keyboard:

KBD_CMD_RESET
Reset keyboard as if power-up.

KBD_CMD_BELL
Turn on the bell.

KBD_CMD_NOBELL
Turn off the bell

KBD_CMD_CLICK
Turn on the click annunciator.

KBD_CMD_NOCLICK
Turn off the click annunciator.

Inappropriate commands for particular keyboard types are ignored.  Since there is no reliable way to get the state of the bell or click (because we cannot query the keyboard, and also because a process could do writes to the appropriate serial driver — thus going around this ioctl) we do not provide an equivalent ioctl to query its state. 

KIOCSDIRECT

KIOCGDIRECT
These ioctls are supported for compatibility with the system keyboard device /dev/kbd.  KIOCSDIRECT has no effect, and KIOCGDIRECT always returns 1. 

INDEX STRUCTURES

There is a hierarchy of structures for accessing keyboard translation data.  The array keytables contains pointers to the translation data for each of the known keyboard types:


struct keyboard ∗keytables[] = {
&keyindex_s3,
&keyindex_s4,
};

Each keyboard type is described by a struct keyboard that contains pointers to the five translation-tables (“Unshifted”, “Shifted”, “Caps Locked” “Controlled”, and “Key Up”) associated with that type, plus bit-masks that indicate what state can persist with no keys pressed, and the key-pair used as the abort sequence for the system. 

An array keystringtab contains the strings sent by various keys, and can be accessed by any translation:


#define kstescinit(c)   {’\033’, ’[’, ’c’, ’\0’}
char keystringtab[16][KTAB_STRLEN] = {
kstescinit(H),/∗home∗/
kstescinit(A),/∗up∗/
kstescinit(B),/∗down∗/
kstescinit(D),/∗left∗/
kstescinit(C),/∗right∗/
};

Index Structure for the Type 4 Keyboard


/∗ Index to keymaps for Type 4 keyboard ∗/
static struct keyboard keyindex_s4 = {
&keytab_s4_lc,
&keytab_s4_uc,
&keytab_s4_cl,
&keytab_s4_ct,
&keytab_s4_up,
0x0000,/∗ Shift bits which stay on with idle keyboard ∗/
0x0000,/∗ Bucky bits which stay on with idle keyboard ∗/
1,77, /∗ abort keys ∗/
CAPSMASK,/∗ Shift bits which toggle on down event ∗/
};

Index Structure for the Type 3 Keyboard


static struct keyboard keyindex_s3 = {
&keytab_s3_lc,
&keytab_s3_uc,
&keytab_s3_cl,
&keytab_s3_ct,
&keytab_s3_up,
0x0000, /∗ Shift bits that stay on with idle keyboard ∗/
0x0000, /∗ Bucky bits that stay on with idle keyboard ∗/
0x01, 0x4d, /∗ Abort sequence  L1-A ∗/
CAPSMASK,/∗ Shift bits that toggle on down event ∗/
};

DEFAULT TRANSLATION TABLES

Type 4 Keyboard

Unshifted

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 LF(2) 04 HOLE 05 TF(1) 06 TF(2) 07 TF (10)
SYSTEMBIT











08 TF(3) 09 TF(11) 0A TF(4) 0B TF(12) 0C TF(5) 0D HOLE 0E TF (6) 0F HOLE
10 TF(7) 11 TF(8) 12 TF(9) 13 ALT 14 HOLE 15 RF(1) 16 RF(2) 17 RF (3)
18 HOLE 19 LF(3) 1A LF(4) 1B HOLE 1C HOLE 1D c (’[’) 1E ’1’ 1F ’2’
20 ’3’ 21 ’4’ 22 ’5’ 23 ’6’ 24 ’7’ 25 ’8’ 26 ’9’ 27 ’0’
28 ’-’ 29 ’=’ 2A ’‘’ 2B ’\b’ 2C HOLE 2D RF(4) 2E RF(5) 2F RF (6)
30 BF(13) 31 LF(5) 32 BF(10) 33 LF (6) 34 HOLE 35 ’\t’ 36 ’q’ 37 ’w’
38 ’e’ 39 ’r’ 3A ’t’ 3B ’y’ 3C ’u’ 3D ’i’ 3E ’o’ 3F ’p’
40 ’[’ 41 ’]’ 42 0x7F 43 OOPS 44 RF(7) 45 STRING+ 46 RF(9) 47 BF (15)
(temp) UPARROW



48 LF(7) 49 LF (8) 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D ’a’ 4E ’s’ 4F ’d’
LEFTCTRL





50 ’f’ 51 ’g’ 52 ’h’ 53 ’j’ 54 ’k’ 55 ’l’ 56 ’;’ 57 ’\”
58 ’\\’ 59 ’\r’ 5A BF(11) 5B STRING+ 5C RF(11) 5D STRING+ 5E BF(8) 5F LF (9)
LEFTARROW RIGHTARROW



60 HOLE 61 LF(10) 62 BF (16) 63 SHIFTKEYS+ 64 ’z’ 65 ’x’ 66 ’c’ 67 ’v’
LEFTSHIFT







68 ’b’ 69 ’n’ 6A ’m’ 6B ’,’ 6C ’.’ 6D ’/’ 6E SHIFTKEYS+ 6F ’\n’
RIGHTSHIFT

70 RF(13) 71 STRING+ 72 RF(15) 73 HOLE 74 HOLE 75 HOLE 76 LF (16) 77 SHIFTKEYS+
DOWNARROW CAPSLOCK
78 BUCKYBITS+ 79 ’ ’ 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D BF (14) 7E ERROR 7F IDLE
METABIT METABIT









Type 4 Keyboard

Shifted

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 LF(2) 04 HOLE 05 TF(1) 06 TF(2) 07 TF (10)
SYSTEMBIT











08 TF(3) 09 TF(11) 0A TF(4) 0B TF(12) 0C TF(5) 0D HOLE 0E TF (6) 0F HOLE
10 TF(7) 11 TF(8) 12 TF(9) 13 ALT 14 HOLE 15 RF(1) 16 RF(2) 17 RF (3)
18 HOLE 19 LF(3) 1A LF(4) 1B HOLE 1C HOLE 1D c (’[’) 1E ’!’ 1F ’@’
20 ’#’ 21 ’$’ 22 ’%’ 23 ’^’ 24 ’&’ 25 ’∗’ 26 ’ (’ 27 ’)’
28 ’_’ 29 ’+’ 2A ’~’ 2B ’\b’ 2C HOLE 2D RF(4) 2E RF(5) 2F RF (6)
30 BF(13) 31 LF(5) 32 BF(10) 33 LF (6) 34 HOLE 35 ’\t’ 36 ’Q’ 37 ’W’
38 ’E’ 39 ’R’ 3A ’T’ 3B ’Y’ 3C ’U’ 3D ’I’ 3E ’O’ 3F ’P’
40 ’{’ 41 ’}’ 42 0x7F 43 OOPS 44 RF(7) 45 STRING+ 46 RF(9) 47 BF (15)
(temp) UPARROW



48 LF(7) 49 LF (8) 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D ’A’ 4E ’S’ 4F ’D’
LEFTCTRL





50 ’F’ 51 ’G’ 52 ’H’ 53 ’J’ 54 ’K’ 55 ’L’ 56 ’:’ 57 ’"’
58 ’|’ 59 ’\r’ 5A BF(11) 5B STRING+ 5C RF(11) 5D STRING+ 5E BF(8) 5F LF (9)
LEFTARROW RIGHTARROW



60 HOLE 61 LF(10) 62 BF (16) 63 SHIFTKEYS+ 64 ’Z’ 65 ’X’ 66 ’C’ 67 ’V’
LEFTSHIFT







68 ’B’ 69 ’N’ 6A ’M’ 6B ’<’ 6C ’>’ 6D ’?’ 6E SHIFTKEYS+ 6F ’\n’
RIGHTSHIFT

70 RF(13) 71 STRING+ 72 RF(15) 73 HOLE 74 HOLE 75 HOLE 76 LF (16) 77 SHIFTKEYS+
DOWNARROW CAPSLOCK
78 BUCKYBITS+ 79 ’ ’ 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D BF (14) 7E ERROR 7F IDLE
METABIT METABIT









Type 4 Keyboard

Caps Locked

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 LF(2) 04 HOLE 05 TF(1) 06 TF(2) 07 TF (10)
SYSTEMBIT











08 TF(3) 09 TF(11) 0A TF(4) 0B TF(12) 0C TF(5) 0D HOLE 0E TF (6) 0F HOLE
10 TF(7) 11 TF(8) 12 TF(9) 13 ALT 14 HOLE 15 RF(1) 16 RF(2) 17 RF (3)
18 HOLE 19 LF(3) 1A LF(4) 1B HOLE 1C HOLE 1D c (’[’) 1E ’1’ 1F ’2’
21 ’3’ 21 ’4’ 22 ’5’ 23 ’6’ 24 ’7’ 25 ’8’ 26 ’9’ 27 ’0’
28 ’-’ 29 ’=’ 2A ’‘’ 2B ’\b’ 2C HOLE 2D RF(4) 2E RF(5) 2F RF (6)
30 BF(23) 32 LF(5) 32 BF(20) 33 LF (6) 34 HOLE 35 ’\t’ 36 ’Q’ 37 ’W’
38 ’E’ 39 ’R’ 3A ’T’ 3B ’Y’ 3C ’U’ 3D ’I’ 3E ’O’ 3F ’P’
40 ’[’ 41 ’]’ 43 0x7F 43 OOPS 44 RF(7) 45 STRING+ 46 RF(9) 47 BF (15)
(temp) UPARROW



48 LF(7) 49 LF (8) 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D ’A’ 4E ’S’ 4F ’D’
LEFTCTRL





50 ’F’ 51 ’G’ 52 ’H’ 53 ’J’ 54 ’K’ 55 ’L’ 56 ’;’ 57 ’\”
58 ’\\’ 59 ’\r’ 5A BF(11) 5B STRING+ 5C RF(11) 5D STRING+ 5E BF(8) 5F LF (9)
LEFTARROW RIGHTARRROW



60 HOLE 61 LF(10) 62 BF (16) 63 SHIFTKEYS+ 64 ’Z’ 65 ’X’ 66 ’C’ 67 ’V’
LEFTSHIFT







68 ’B’ 69 ’N’ 6A ’M’ 6B ’,’ 6C ’.’ 6D ’/’ 6E SHIFTKEYS+ 6F ’\n’
RIGHTSHIFT

70 RF(13) 71 STRING+ 72 RF(15) 73 HOLE 74 HOLE 75 HOLE 76 LF (16) 77 SHIFTKEYS+
DOWNARROW CAPSLOCK
78 BUCKYBITS+ 79 ’ ’ 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D BF (14) 7E ERROR 7F IDLE
METABIT METABIT









Type 4 Keyboard

Controlled

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 LF(2) 04 HOLE 05 TF(1) 06 TF(2) 07 TF (10)
SYSTEMBIT











08 TF(3) 09 TF(11) 0A TF(4) 0B TF(12) 0C TF(5) 0D HOLE 0E TF (6) 0F HOLE
10 TF(7) 11 TF(8) 12 TF(9) 13 ALT 14 HOLE 15 RF(1) 16 RF(2) 17 RF (3)
18 HOLE 19 LF(3) 1A LF(4) 1B HOLE 1C HOLE 1D c(’[’) 1E ’1’ 1F c (’@’)
20 ’3’ 21 ’4’ 22 ’5’ 23 c (’^’) 24 ’7’ 25 ’8’ 26 ’9’ 27 ’0’
28 c(’_’) 29 ’=’ 2A c(’^’) 2B ’\b’ 2C HOLE 2D RF(4) 2E RF(5) 2F RF (6)
30 BF(13) 31 LF(5) 32 BF(10) 33 LF(6) 34 HOLE 35 ’\t’ 36 c(’q’) 37 c (’w’)
38 c(’e’) 39 c(’r’) 3A c(’t’) 3B c(’y’) 3C c(’u’) 3D c(’i’) 3E c(’o’) 3F c (’p’)
40 c(’[’) 41 c(’]’) 42 0x7F 43 OOPS 44 RF(7) 45 STRING+ 46 RF(9) 47 BF (15)
(temp) UPARROW



48 LF(7) 49 LF(8) 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D c(’a’) 4E c(’s’) 4F c (’d’)
LEFTCTRL





50 c(’f’) 51 c(’g’) 52 c(’h’) 53 c(’j’) 54 c(’k’) 55 c (’l’) 56 ’;’ 57 ’\”
58 c(’\\’) 59 ’\r’ 5A BF(11) 5B STRING+ 5C RF(11) 5D STRING+ 5E BF(8) 5F LF (9)
LEFTARROW RIGHTARROW



60 HOLE 61 LF(10) 62 BF(16) 63 SHIFTKEYS+ 64 c(’z’) 65 c(’x’) 66 c(’c’) 67 c (’v’)
LEFTSHIFT







68 c(’b’) 69 c(’n’) 6A c(’m’) 6B ’,’ 6C ’.’ 6D c (’_’) 6E SHIFTKEYS+ 6F ’\n’
RIGHTSHIFT

70 RF(13) 71 STRING+ 72 RF(15) 73 HOLE 74 HOLE 75 HOLE 76 LF (16) 77 SHIFTKEYS+
DOWNARROW CAPSLOCK
78 BUCKYBITS+ 79 c(’ ’) 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D BF (14) 7E ERROR 7F IDLE
METABIT METABIT









Type 4 Keyboard

Key Up

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 OOPS 04 HOLE 05 OOPS 06 OOPS 07 HOLE
SYSTEMBIT











08 OOPS 09 HOLE 0A OOPS 0B HOLE 0C OOPS 0D HOLE 0E OOPS 0F HOLE
10 OOPS 11 OOPS 12 OOPS 13 OOPS 14 HOLE 15 OOPS 16 OOPS 17 NOP
18 HOLE 19 OOPS 1A OOPS 1B HOLE 1C HOLE 1D NOP 1E NOP 1F NOP
20 NOP 21 NOP 22 NOP 23 NOP 24 NOP 25 NOP 26 NOP 27 NOP
28 NOP 29 NOP 2A NOP 2B NOP 2C HOLE 2D OOPS 2E OOPS 2F NOP
30 HOLE 31 OOPS 32 HOLE 33 OOPS 34 HOLE 35 NOP 36 NOP 37 NOP
38 NOP 39 NOP 3A NOP 3B NOP 3C NOP 3D NOP 3E NOP 3F NOP
40 NOP 41 NOP 42 NOP 43 HOLE 44 OOPS 45 OOPS 46 NOP 47 HOLE
48 OOPS 49 OOPS 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D NOP 4E NOP 4F NOP
LEFTCTRL





50 NOP 51 NOP 52 NOP 53 NOP 54 NOP 55 NOP 56 NOP 57 NOP
58 NOP 59 NOP 5A HOLE 5B OOPS 5C OOPS 5D NOP 5E HOLE 5F OOPS
60 OOPS 61 OOPS 62 HOLE 63 SHIFTKEYS+ 64 NOP 65 NOP 66 NOP 67 NOP
LEFTSHIFT







68 NOP 69 NOP 6A NOP 6B NOP 6C NOP 6D NOP 6E SHIFTKEYS+ 6F NOP
RIGHTSHIFT

70 OOPS 71 OOPS 72 NOP 73 HOLE 74 HOLE 75 HOLE 76 HOLE 77 NOP
78 BUCKYBITS+ 79 NOP 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D HOLE 7E HOLE 7F RESET
METABIT METABIT









Type 3 Keyboard

Unshifted

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 LF(2) 04 HOLE 05 TF(1) 06 TF (2) 07 HOLE
SYSTEMBIT











08 TF(3) 09 HOLE 0A TF(4) 0B HOLE 0C TF(5) 0D HOLE 0E TF (6) 0F HOLE
10 TF(7) 11 TF(8) 12 TF(9) 13 ALT 14 HOLE 15 RF(1) 16 RF(2) 17 RF (3)
18 HOLE 19 LF(3) 1A LF(4) 1B HOLE 1C HOLE 1D c (’[’) 1E ’1’ 1F ’2’
20 ’3’ 21 ’4’ 22 ’5’ 23 ’6’ 24 ’7’ 25 ’8’ 26 ’9’ 27 ’0’
28 ’−’ 29 ’=’ 2A ’‘’ 2B ’\b’ 2C HOLE 2D RF(4) 2E RF(5) 2F RF (6)
30 HOLE 31 LF(5) 32 HOLE 33 LF (6) 34 HOLE 35 ’\t’ 36 ’q’ 37 ’w’
38 ’e’ 39 ’r’ 3A ’t’ 3B ’y’ 3C ’u’ 3D ’i’ 3E ’o’ 3F ’p’
40 ’[’ 41 ’]’ 42 0x7F 43 HOLE 45 RF(7) 45 STRING+ 46 RF (9) 47 HOLE
UPARROW



48 LF(7) 49 LF(8) 4A LF (40) 4B HOLE 4C SHIFTKEYS+ 4D ’a’ 4E ’s’ 4F ’d’
LEFTCTRL





50 ’f’ 51 ’g’ 52 ’h’ 53 ’j’ 54 ’k’ 55 ’l’ 56 ’;’ 57 ’\´’
58 ’\’ 59 ’\r’ 5A HOLE 5B STRING+ 5C RF(11) 5D STRING+ 5E HOLE 5F LF (9)
LEFTARROW RIGHTARROW



60 LF(15) 61 LF (10) 62 HOLE 63 SHIFTKEYS+ 64 ’z’ 65 ’x’ 66 ’c’ 67 ’v’
LEFTSHIFT







68 ’b’ 69 ’n’ 6A ’m’ 6B ’,’ 6C ’.’ 6D ’/’ 6E SHIFTKEYS+ 6F ’\n’
RIGHTSHIFT

70 RF(13) 71 STRING+ 72 RF (15) 73 HOLE 74 HOLE 75 HOLE 76 HOLE 77 SHIFTKEYS+
DOWNARROW CAPSLOCK
78 BUCKYBITS+ 79 ’ ’ 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D HOLE 7E ERROR 7F IDLE
METABIT METABIT









Type 3 Keyboard

Shifted

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 LF(2) 04 HOLE 05 TF(1) 06 TF (2) 07 HOLE
SYSTEMBIT











08 TF(3) 09 HOLE 0A TF(4) 0B HOLE 0C TF(5) 0D HOLE 0E TF (6) 0F HOLE
10 TF(7) 11 TF(8) 12 TF(9) 13 ALT 14 HOLE 15 RF(1) 16 RF(2) 17 RF (3)
18 HOLE 19 LF(3) 1A LF(4) 1B HOLE 1C HOLE 1D c (’[’) 1E ’!’ 1F ’@’
20 ’#’ 21 ’$’ 22 ’%’ 23 ’^’ 24 ’&’ 25 ’∗’ 26 ’ (’ 27 ’)’
28 ’_’ 29 ’+’ 2A ’~’ 2B ’\b’ 2C HOLE 2D RF(4) 2E RF(5) 2F RF (6)
30 HOLE 31 LF(5) 32 HOLE 33 LF (6) 34 HOLE 35 ’\t’ 36 ’Q’ 37 ’W’
38 ’E’ 39 ’R’ 3A ’T’ 3B ’Y’ 3C ’U’ 3D ’I’ 3E ’O’ 3F ’P’
40 ’{’ 41 ’}’ 42 0x7F 43 HOLE 44 RF(7) 45 STRING+ 46 RF (9) 47 HOLE
UPARROW



48 LF(7) 49 LF (8) 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D ’A’ 4E ’S’ 4F ’D’
LEFTCTRL





50 ’F’ 51 ’G’ 52 ’H’ 53 ’J’ 54 ’K’ 55 ’L’ 56 ’:’ 57 ’"’
58 ’|’ 59 ’\r’ 5A HOLE 5B STRING+ 5C RF(11) 5D STRING+ 5E HOLE 5F LF (9)
LEFTARROW RIGHTARROW



60 LF(15) 61 LF (10) 62 HOLE 63 SHIFTKEYS+ 64 ’Z’ 65 ’X’ 66 ’C’ 67 ’V’
LEFTSHIFT







68 ’B’ 69 ’N’ 6A ’M’ 6B ’<’ 6C ’>’ 6D ’?’ 6E SHIFTKEYS+ 6F ’\n’
RIGHTSHIFT

70 RF(13) 71 STRING+ 72 RF (15) 73 HOLE 74 HOLE 75 HOLE 76 HOLE 77 SHIFTKEYS+
DOWNARROW CAPSLOCK
78 BUCKYBITS+ 79 ’ ’ 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D HOLE 7E ERROR 7F IDLE
METABIT METABIT









Type 3 Keyboard

Caps Locked

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 LF(2) 04 HOLE 05 TF(1) 06 TF (2) 07 HOLE
SYSTEMBIT











08 TF(3) 09 HOLE 0A TF(4) 0B HOLE 0C TF(5) 0D HOLE 0E TF (6) 0F HOLE
10 TF(7) 11 TF(8) 12 TF(9) 13 ALT 14 HOLE 15 RF(1) 16 RF(2) 17 RF (3)
18 HOLE 19 LF(3) 1A LF(4) 1B HOLE 1C HOLE 1D c (’[’) 1E ’1’ 1F ’2’
20 ’3’ 21 ’4’ 22 ’5’ 23 ’6’ 24 ’7’ 25 ’8’ 26 ’9’ 27 ’0’
28 ’−’ 29 ’=’ 2A ’‘’ 2B ’\b’ 2C HOLE 2D RF(4) 2E RF(5) 2F RF (6)
30 HOLE 31 LF(5) 32 HOLE 33 LF (6) 34 HOLE 35 ’\t’ 36 ’Q’ 37 ’W’
38 ’E’ 39 ’R’ 3A ’T’ 3B ’Y’ 3C ’U’ 3D ’I’ 3E ’O’ 3F ’P’
40 ’[’ 41 ’]’ 42 0x7F 43 HOLE 44 RF(7) 45 STRING+ 46 RF (9) 47 HOLE
UPARROW



48 LF(7) 49 LF (8) 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D ’A’ 4E ’S’ 4F ’D’
LEFTCTRL





50 ’F’ 51 ’G’ 52 ’H’ 53 ’J’ 54 ’K’ 55 ’L’ 56 ’;’ 57 ’\´’
58 ’\’ 59 ’\r’ 5A HOLE 5B STRING+ 5C RF(11) 5D STRING+ 5E HOLE 5F LF (9)
LEFTARROW RIGHTARROW



60 LF(15) 61 LF (10) 62 HOLE 63 SHIFTKEYS+ 64 ’Z’ 65 ’X’ 66 ’C’ 67 ’V’
LEFTSHIFT







68 ’B’ 69 ’N’ 6A ’M’ 6B ’,’ 6C ’.’ 6D ’/’ 6E SHIFTKEYS+ 6F ’\n’
RIGHTSHIFT

70 RF(13) 71 STRING+ 72 RF (15) 73 HOLE 74 HOLE 75 HOLE 76 HOLE 77 SHIFTKEYS+
DOWNARROW CAPSLOCK
78 BUCKYBITS+ 79 ’ ’ 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D HOLE 7E ERROR 7F IDLE
METABIT METABIT









Type 3 Keyboard

Controlled

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 LF(2) 04 HOLE 05 TF(1) 06 TF (2) 07 HOLE
SYSTEMBIT











08 TF(3) 09 HOLE 0A TF(4) 0B HOLE 0C TF(5) 0D HOLE 0E TF (6) 0F HOLE
10 TF(7) 11 TF(8) 12 TF(9) 13 ALT 14 HOLE 15 RF(1) 16 RF(2) 17 RF (3)
18 HOLE 19 LF(3) 1A LF(4) 1B HOLE 1C HOLE 1D c(’[’) 1E ’1’ 1F c (’@’)
20 ’3’ 21 ’4’ 22 ’5’ 23 c (’^’) 24 ’7’ 25 ’8’ 26 ’9’ 27 ’0’
28 c(’_’) 29 ’=’ 2A c(’^’) 2B ’\b’ 2C HOLE 2D RF(4) 2E RF(5) 2F RF (6)
30 HOLE 31 LF(5) 32 HOLE 33 LF(6) 34 HOLE 35 ’\t’ 36 c(’q’) 37 c (’w’)
38 c(’e’) 39 c(’r’) 3A c(’t’) 3B c(’y’) 3C c(’u’) 3D c(’i’) 3E c(’o’) 3F c (’p’)
40 c(’[’) 41 c(’]’) 42 0x7F 43 HOLE 44 RF(7) 45 STRING+ 46 RF (9) 47 HOLE
UPARROW



48 LF(7) 49 LF(8) 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D c(’a’) 4E c(’s’) 4F c (’d’)
LEFTCTRL





50 c(’f’) 51 c(’g’) 52 c(’h’) 53 c(’j’) 54 c(’k’) 55 c (’l’) 56 ’;’ 57 ’\´’
58 c(’\’) 59 ’\r’ 5A HOLE 5B STRING+ 5C RF(11) 5D STRING+ 5E HOLE 5F LF (9)
LEFTARROW RIGHTARROW



60 LF(15) 61 LF(10) 62 HOLE 63 SHIFTKEYS+ 64 c(’z’) 65 c(’x’) 66 c(’c’) 67 c (’v’)
LEFTSHIFT







68 c(’b’) 69 c(’n’) 6A c(’m’) 6B ’,’ 6C ’.’ 6D c (’_’) 6E SHIFTKEYS+ 6F ’\n’
RIGHTSHIFT

70 RF(13) 71 STRING+ 72 RF (15) 73 HOLE 74 HOLE 75 HOLE 76 HOLE 77 SHIFTKEYS+
DOWNARROW CAPSLOCK
78 BUCKYBITS+ 79 c (’ ’) 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D HOLE 7E ERROR 7F IDLE
METABIT METABIT









Type 3 Keyboard

Key Up

Key Value Key Value Key Value Key Value Key Value Key Value Key Value Key Value
00 HOLE 01 BUCKYBITS+ 02 HOLE 03 OOPS 04 HOLE 05 OOPS 06 OOPS 07 HOLE
SYSTEMBIT











08 OOPS 09 HOLE 0A OOPS 0B HOLE 0C OOPS 0D HOLE 0E OOPS 0F HOLE
10 OOPS 11 OOPS 12 OOPS 13 OOPS 14 HOLE 15 OOPS 16 OOPS 17 NOP
18 HOLE 19 OOPS 1A OOPS 1B HOLE 1C HOLE 1D NOP 1E NOP 1F NOP
20 NOP 21 NOP 22 NOP 23 NOP 24 NOP 25 NOP 26 NOP 27 NOP
28 NOP 29 NOP 2A NOP 2B NOP 2C HOLE 2D OOPS 2E OOPS 2F NOP
30 HOLE 31 OOPS 32 HOLE 33 OOPS 34 HOLE 35 NOP 36 NOP 37 NOP
38 NOP 39 NOP 3A NOP 3B NOP 3C NOP 3D NOP 3E NOP 3F NOP
40 NOP 41 NOP 42 NOP 43 HOLE 44 OOPS 45 OOPS 46 NOP 47 HOLE
48 OOPS 49 OOPS 4A HOLE 4B HOLE 4C SHIFTKEYS+ 4D NOP 4E NOP 4F NOP
LEFTCTRL





50 NOP 51 NOP 52 NOP 53 NOP 54 NOP 55 NOP 56 NOP 57 NOP
58 NOP 59 NOP 5A HOLE 5B OOPS 5C OOPS 5D NOP 5E HOLE 5F OOPS
60 OOPS 61 OOPS 62 HOLE 63 SHIFTKEYS+ 64 NOP 65 NOP 66 NOP 67 NOP
LEFTSHIFT







68 NOP 69 NOP 6A NOP 6B NOP 6C NOP 6D NOP 6E SHIFTKEYS+ 6F NOP
RIGHTSHIFT

70 OOPS 71 OOPS 72 NOP 73 HOLE 74 HOLE 75 HOLE 76 HOLE 77 NOP
78 BUCKYBITS+ 79 NOP 7A BUCKYBITS+ 7B HOLE 7C HOLE 7D HOLE 7E HOLE 7F RESET
METABIT METABIT









Solbourne Computer, Inc.  —  13 December 1989

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026