The IBM 6110344 Keyboard
Note: You need a browser capable of displaying SVG images to see the keyboard layouts.
The IBM 6110344 is a 122-key model F keyboard, originally intended for use with the IBM 3270 PC. It is possible to connect it to a standard AT-class PC.
The keyboard has a 5-pin DIN plug that uses the 240-degree spacing. Its pinout is the same as the 1390876:
A normal AT keyboard uses the 180-degree spacing and this pinout:
Therefore the keyboard can be connected to an AT or PS/2 connector, either by making a simple adaptor, or by swapping the lead with one from a real IBM AT keyboard. Both use the same 3×2 Berg connector at the keyboard end.
DIP switches / Identity
The keyboard has eight DIP switches. According to the guide to operations, they should be ignored. If you do change them, they change bits in the keyboard ID (returned by command 0xF2). If all switches are left open (or disconnected) the ID returned is 0xBF 0xBF. Closing a switch sets the corresponding bit to 0.
Switches 1-6 correspond to bits 5-0 of the first ID byte. Switches 7-8 correspond to bits 5-4 of the second ID byte. The header on the controller PCB, to which the DIP switches are connected, has 12 pairs of pins and is silkscreened "KBDID A" (on the first 6 pairs) and "KBDID B" (on the second six). The other four pairs of pins correspond to bits 3-0 of the second ID byte; these would need to be set with jumpers.
LEDs
There are no LEDs, and the keyboard rejects commands to set LEDs.
Controller Swap
The controller PCB is identical to the one in the PC AT keyboard; both use an 8048 microcontroller to read keys and transmit them to the computer, and the key matrices are compatible. It is possible to create a hybrid controller image, which improves compatibility with AT-class PCs. This is now described in its own page.
Scancodes
The 6110344 uses the AT keyboard protocol and Scancode set 3. Since the 3270 PC predates the AT, this is probably the earliest use of this protocol and scancode set on a PC, and suggests that both originate in the world of 3270 terminals.
The keys on the 6110344 are laid out like this:
Markings in blue apply when the PC is behaving as a PC, rather than as a terminal.
When in use, the keyboard always uses Scancode set 3. It rejects requests to change the scancode set. The scancodes it returns are identical to the 1390876:
Notes:
- Only shaded keys send key-up sequences (F0 xx)
- Smaller numbers shown in circles are holes in the keyboard with no springs, corresponding to unused positions covered by double-sized keys.
- The unused position under the spacebar (shown as an empty circle) has no contacts on the circuit board. The key barrel above it is used for a stabiliser.
- There are five sets of contacts on the circuit board (shown as empty squares) which are not connected to the controller and do not have key barrels above them. Since they are not connected to the controller, they do not produce scancodes if bridged. Their purpose is obscure.
- To the right of the right-hand Alt key is a vestigial key — connected to the keyboard matrix, but with no contacts for a hammer. This is read in the self-test. If it reports that the (non-existent) key is pressed, the keyboard returns error 0FDh.
Scancode translation
On a true 3270 PC, the Set 3 scancodes from the keyboard are converted to Set 1 (XT) scancodes by the keyboard card. Unlike on an AT, where the mapping takes place within the controller, the conversion is done by the BIOS and can be changed. The default mapping gives these codes:
If the PC has a 'simple' keyboard controller card, the translation table is visible in memory at 0CAA60h. If it has a 'complicated' card, the default table is at 0CB640h, but it is not visible in memory except when keypresses are actually being handled. Either way, a custom table address can be set using INT 52h, with AH=1 and DX=segment of new table. The table has three bytes per 3270 scancode:
- Scancode to use if shift key is up.
- Flags. Bottom 4 bits are used if shift key is down; else top 4.
- Scancode to use if shift key is down.
Flags are:
- 0
- Beep and ignore key
- 1
- Simulate Shift up, scancode, Shift down.
- 2
- Simulate Shift down, scancode, Shift up.
- 3
- Simulate scancode only.
- 4
- If scancode is 52h (Ins pressed), simulate a release immediately after the press. Otherwise behave as 3.
- 5
- If numlock is on, behave as 2. Otherwise behave as 4.
- 6
- If numlock is off, behave as 1. Otherwise behave as 4.
- 7
- If Shift up and Numlock on, or Shift down and Numlock off, then behave as 3. Otherwise behave as 0.
- 8
- If Ctrl and Alt are not both pressed, behave as 3. If key is F2 and the standard keymap is in use, then select custom keymap. If key is not F2 and a custom keymap is in use, select the standard keymap. Then behave as 3.
- 9
- If shift down and Numlock off, behave as 1. If shift up and Numlock on, behave as 2. Otherwise behave as 0.
- 10-15
- Do not use these - they will crash the PC.
The default scancode mapping table in the ROM is listed below. It only returns scancodes for keys that are present on a real XT; the others just beep.
3270 scancode | 3270 key | Unshifted XT scancode | Unshifted flags | Shifted XT scancode | Shifted flags | Comments |
---|---|---|---|---|---|---|
00 | 00 | 0 | 00 | 0 | ||
01 | ▫ ↔ □ | 00 | 0 | 00 | 0 | |
02 | 00 | 0 | 00 | 0 | Keyboard never returns this scancode. | |
03 | ChgSc/Jump/CrSel | 00 | 0 | 00 | 0 | |
04 | WS/Ctrl/ExSel | 00 | 0 | 00 | 0 | |
05 | Help/SysRq | 00 | 0 | 00 | 0 | 'Simple' controller. |
05 | Help/SysRq | D9 | 3 | D9 | 3 | 'Complicated' controller. |
06 | Clear/Test | 00 | 0 | 00 | 0 | |
07 | PF1 | 3B (F1) | 8 | 3B (F1) | 8 | Ctrl+Alt+PF1 selects standard keymap |
08 | PF13 | 00 | 0 | 00 | 0 | |
09 | CTRL | 1D (Ctrl) | 4 | 1D (Ctrl) | 4 | |
0A | Copy/Auto/Pause | 00 | 0 | 00 | 0 | |
0B | Erase EOF/ErInp | 00 | 0 | 00 | 0 | |
0C | Finish/Attn | 00 | 0 | 00 | 0 | |
0D | Left TAB | 0F (Tab) | 3 | 0F (Tab) | 3 | |
0E | ~ ` | 29 (`) | 3 | 29 (`) | 3 | |
0F | PF2 | 3C (F2) | 8 | 3C (F2) | 8 | Ctrl+Alt+PF2 selects custom keymap |
10 | PF14 | 00 | 0 | 00 | 0 | |
11 | Reset/Quit | 00 | 0 | 00 | 0 | |
12 | Left SHIFT | 2A (Shift) | 4 | 2A (Shift) | 4 | |
13 | > < | 33 (,) | 2 | 34 (.) | 3 | |
14 | CAPS LOCK | 3A (Caps Lock) | 4 | 3A (Caps Lock) | 4 | |
15 | Q | 10 (Q) | 3 | 10 (Q) | 3 | |
16 | 1 | 2 (1) | 3 | 2 (1) | 3 | |
17 | PF3 | 3D (F3) | 3 | 3D (F3) | 3 | |
18 | PF15 | 00 | 0 | 00 | 0 | |
19 | Left ALT | 38 (Alt) | 4 | 38 (Alt) | 4 | |
1A | Z | 2C (Z) | 3 | 2C (Z) | 3 | |
1B | S | 1F (S) | 3 | 1F (S) | 3 | |
1C | A | 1E (A) | 3 | 1E (A) | 3 | |
1D | W | 11 (W) | 3 | 11 (W) | 3 | |
1E | 2 | 03 (2) | 3 | 03 (2) | 3 | |
1F | PF4 | 3E (F4) | 3 | 3E (F4) | 3 | |
20 | PF16 | 00 | 0 | 00 | 0 | |
21 | C | 2E (C) | 3 | 2E (C) | 3 | |
22 | X | 2D (X) | 3 | 2D (X) | 3 | |
23 | D | 20 (D) | 3 | 20 (D) | 3 | |
24 | E | 12 (E) | 3 | 12 (E) | 3 | |
25 | 4 | 05 (4) | 3 | 05 (4) | 3 | |
26 | 3 | 04 (3) | 3 | 04 (3) | 3 | |
27 | PF5 | 3F (F5) | 3 | 3F (F5) | 3 | |
28 | PF17 | 00 | 0 | 00 | 0 | |
29 | SPACE | 39 (Space) | 3 | 39 (Space) | 3 | |
2A | V | 2F (V) | 3 | 2F (V) | 3 | |
2B | F | 21 (F) | 3 | 21 (F) | 3 | |
2C | T | 14 (T) | 3 | 14 (T) | 3 | |
2D | R | 13 (R) | 3 | 13 (R) | 3 | |
2E | 5 | 06 (5) | 3 | 06 (5) | 3 | |
2F | PF6 | 40 (F6) | 3 | 40 (F6) | 3 | |
30 | PF18 | 00 | 0 | 00 | 0 | |
31 | N | 31 (N) | 3 | 31 (N) | 3 | |
32 | B | 30 (B) | 3 | 30 (B) | 3 | |
33 | H | 23 (H) | 3 | 23 (H) | 3 | |
34 | G | 22 (G) | 3 | 22 (G) | 3 | |
35 | Y | 15 (Y) | 3 | 15 (Y) | 3 | |
36 | 6 | 07 (6) | 3 | 07 (6) | 3 | |
37 | PF7 | 41 (F7) | 3 | 41 (F7) | 3 | |
38 | PF19 | 00 | 0 | 00 | 0 | |
39 | Right ALT | 38 (Alt) | 4 | 38 (Alt) | 4 | |
3A | M | 32 (M) | 3 | 32 (M) | 3 | |
3B | J | 24 (J) | 3 | 24 (J) | 3 | |
3C | U | 16 (U) | 3 | 16 (U) | 3 | |
3D | 7 | 08 (7) | 3 | 08 (7) | 3 | |
3E | 8 | 09 (8) | 3 | 09 (8) | 3 | |
3F | PF8 | 42 (F8) | 3 | 42 (F8) | 3 | |
40 | PF20 | 00 | 0 | 00 | 0 | |
41 | , , | 33 (,) | 3 | 33 (,) | 3 | |
42 | K | 25 (K) | 3 | 25 (K) | 3 | |
43 | I | 17 (I) | 3 | 17 (I) | 3 | |
44 | O | 18 (O) | 3 | 18 (O) | 3 | |
45 | 0 | 0B (0) | 3 | 0B (0) | 3 | |
46 | 9 | 0A (9) | 3 | 0A (9) | 3 | |
47 | PF9 | 43 (F9) | 3 | 43 (Tab) | 3 | |
48 | PF21 | 00 | 0 | 00 | 0 | |
49 | . . | 34 (.) | 3 | 34 (.) | 3 | |
4A | ? / | 35 (/) | 3 | 35 (/) | 3 | |
4B | L | 26 (L) | 3 | 26 (L) | 3 | |
4C | ; : | 27 (;) | 3 | 27 (;) | 3 | |
4D | P | 19 (P) | 3 | 19 (P) | 3 | |
4E | _ - | 0C (-) | 3 | 0C (-) | 3 | |
4F | PF10 | 44 (F10) | 3 | 44 (F10) | 3 | |
50 | PF22 | 00 | 0 | 00 | 0 | |
51 | 00 | 0 | 00 | 0 | Unused key position under right SHIFT | |
52 | " ' | 28 (') | 3 | 28 (') | 3 | |
53 | } { | 1B (]) | 3 | 1B (]) | 3 | |
54 | ! cent | 1A ([) | 3 | 1A ([) | 3 | |
55 | + = | 0D (=) | 3 | 0D (=) | 3 | |
56 | PF11 | 00 | 0 | 00 | 0 | |
57 | PF23 | 00 | 0 | 00 | 0 | |
58 | ENTER | 1C (Return) | 3 | 1C (Return) | 3 | |
59 | Right SHIFT | 36 (Right Shift) | 4 | 36 (Right Shift) | 4 | |
5A | CR | 1C (Return) | 3 | 1C (Return) | 3 | |
5B | | \ | 2B (\) | 3 | 2B (\) | 3 | |
5C | 00 | 0 | 00 | 0 | Unused key position under Return | |
5D | 00 | 0 | 00 | 0 | Unused key position under Backspace | |
5E | PF12 | 00 | 0 | 00 | 0 | |
5F | PF24 | 00 | 0 | 00 | 0 | |
60 | Down | 50 (Down) | 5 | 50 (Down) | 6 | |
61 | Left | 4B (Left) | 5 | 4B (Left) | 6 | |
62 | ↖ key between cursors | 00 | 0 | 00 | 0 | |
63 | Up | 48 (Up) | 5 | 48 (Up) | 6 | |
64 | Backtab | 00 | 0 | 00 | 0 | |
65 | Insert | 52 (Insert) | 5 | 52 (Insert) | 6 | |
66 | Backspace | 0E (Backspace) | 3 | 0E (Backspace) | 3 | |
67 | Dup / PA1 | 00 | 0 | 00 | 0 | |
68 | Unused key position under keypad 0 | 00 | 0 | 00 | 0 | |
69 | Keypad 1 | 4F (Keypad 1) | 3 | 4F (Keypad 1) | 3 | |
6A | Right | 4D (Right) | 5 | 4D (Right) | 6 | |
6B | Keypad 4 | 4B (Keypad 4) | 3 | 4B (Keypad 4) | 3 | |
6C | Keypad 7 | 47 (Keypad 7) | 3 | 47 (Keypad 7) | 3 | |
6D | Del | 53 (Del) | 3 | 53 (Del) | 3 | |
6E | Field Mark / PA2 | 00 | 0 | 00 | 0 | |
6F | PA3 | 00 | 0 | 00 | 0 | |
70 | Keypad 0 | 52 (Keypad 0) | 4 | 52 (Keypad 0) | 3 | |
71 | Keypad . | 53 (Keypad .) | 3 | 53 (Keypad .) | 3 | |
72 | Keypad 2 | 50 (Keypad 2) | 3 | 50 (Keypad 2) | 3 | |
73 | Keypad 5 | 4C (Keypad 5) | 3 | 4C (Keypad 5) | 3 | |
74 | Keypad 6 | 4D (Keypad 6) | 3 | 4D (Keypad 6) | 3 | |
75 | Keypad 8 | 48 (Keypad 8) | 3 | 48 (Keypad 8) | 3 | |
76 | ESC | 01 (Esc) | 3 | 01 (Esc) | 3 | |
77 | NumLk | 45 (Num Lock) | 3 | 45 (Num Lock) | 3 | |
78 | 00 | 0 | 00 | 0 | Unused key position under keypad Enter | |
79 | Enter/+ | 4E (Keypad +) | 3 | 4E (Keypad +) | 3 | |
7A | Keypad 3 | 51 (Keypad 3) | 3 | 51 (Keypad 3) | 3 | |
7B | Keypad - | 4A (Keypad -) | 3 | 4A (Keypad -) | 3 | |
7C | Right TAB | 0F (Tab) | 3 | 00 | 0 | |
7D | Keypad 9 | 49 (Keypad 9) | 3 | 49 (Keypad 9) | 3 | |
7E | ScrLk | 46 (Scroll Lock) | 4 | 46 (Scroll Lock) | 4 | |
7F | 00 | 0 | 00 | 0 | Keyboard never returns these scancodes. | |
80 | 00 | 0 | 00 | 0 | ||
81 | 00 | 0 | 00 | 0 | ||
82 | 00 | 0 | 00 | 0 | ||
83 | Print/*/Ident | 37 (Keypad *) | 4 | 37 (Keypad *) | 4 | |
84 | Space | 39 (Space) | 3 | 39 (Space) | 3 |
Commands
The keyboard accepts the following commands. Most of them behave as documented for the 102-key PS/2 keyboard, but there are a couple of exceptions:
Command | Description |
---|---|
EE | Diagnostic echo. |
F2 | Read keyboard ID (usually BF BF). |
F3 xx | Set repeat rate and delay. |
F4 | Enable keyboard (clear errors). |
F5 | Disable keyboard. |
F6 | Set defaults. |
F7 | Set all keys to repeat. No keys will send break codes. |
F8 | Set all keys to give make/break codes. No keys will repeat. |
F9 | Set all keys to give make codes only. No keys will repeat or send break codes. |
FA | Behaves as FB. On a 102-key PS/2 keyboard, would set all keys to repeat and to give make/break codes. |
FB | Set specified key(s) to repeat. They will not send break codes. Followed by a list of scancodes, which should be terminated by F4. |
FC | Set specified key(s) to give make/break codes. They will not repeat. Followed by a list of scancodes, which should be terminated by F4. |
FD | Set specified key(s) to give make codes only. They will not repeat or send break codes. Followed by a list of scancodes, which should be terminated by F4. |
FE | Resend last scancode. |
FF | Reset. The keyboard will respond with AA (as for the 102-key keyboard) followed by the 2-byte keyboard ID. |
The F0 command (set / get scancode set) and ED command (set LEDs) are not supported.
John Elliott 27 June 2011.