Keyboard
The MSI/88e has 27 keys on a membrane matrix keyboard (ASSY 27409 KEYBOARD MSI/88e-a), arranged as a 7×4 matrix with ENTER as a double-height key spanning rows 6-7 (28 matrix positions minus the row 7 continuation of ENTER). There is no dedicated keyboard controller: the matrix is scanned by the CPU, multiplexed with the display refresh.
Key Layout
| Row | Column 1 | Column 2 | Column 3 | Column 4 |
| 1 | STAT |
▼ (down) | ▲ (up) | SRCH |
| 2 | PAGE |
DISP ACC |
▶ (right) | BACK SP |
| 3 | CLEAR |
SEND |
CLR MEM |
MOD |
| 4 | = |
7 |
8 |
9 |
| 5 | - |
4 |
5 |
6 |
| 6 | ENTER (double height) |
1 |
2 |
3 |
| 7 | (ENTER continues) | CTL CHG |
0 |
RTN |
Scanning
The keyboard rows are the MAN2815 digit-select lines: row 1 is strobed with OUT 2 = 0x43 (digit 0, frame start) and rows 2-7 are strobed with OUT 2 = 0x42 (digits 1-15). The columns are read on INP 1 bits 0-2 (columns 1-3) and bit 6 (column 4), active low: a released column reads 1, so an idle read returns 0x47.
Example:
OUT 1 [00]; OUT 4 [00] ; anti-ghost blank OUT 2 [43|42] ; digit select = keyboard row strobe OUT 1 [seg]; OUT 4 [seg] ; segment data for the digit INP 1; ANI 07H; XRI 07H ; keyboard columns, active low BZ -> no key ; all 1s = no key pressed
The remaining INP 1 bits are not part of the matrix: bit 3 is the battery/voltage flag and bit 4 (mask 0x10) is a key/status line polled separately by the boot code.
Key Code Computation
The debounce/encode logic at 0x0484-0x0495 computes the key code from the slot (which digit/row was active when the key was seen) and the column.
Example:
key code = digit_slot + 9 * column
The encode logic adds 9 per set bit position (two conditional ADI 09H at 0x0491/0x0493); the exact column weighting, including the column-4 (bit 6) case, is not yet fully traced.
PC Key Mapping
The front panel buttons and the matrix share the same PC key assignments:
| MSI/88e Key | PC Key | MSI/88e Key | PC Key |
0 - 9 |
0 - 9 |
ENTER |
RETURN |
= |
= |
STAT |
S |
- |
- |
SRCH |
R |
| ▼ (down) | D |
PAGE |
P |
| ▲ (up) | U |
DISP ACC |
A |
| ▶ (right) | F |
BACK SP |
B |
CLEAR |
C |
SEND |
T |
CLR MEM |
M |
MOD |
O |
CTL CHG |
G |
RTN |
N |
Emma 02 Implementation
The emulator models the keyboard as a standard matrix keyboard with <out mask="0x7F">2</out> (rows: raw OUT 2 value) and <in mask="0x47" pol="rev">1</in> (columns: INP 1 bits 0-2 and 6, active low). The row addresses are the raw strobe values written by the firmware: 0x43 for row 1 and 0x42 for rows 2-7, with column bits 0x01, 0x02, 0x04 and 0x40.
A known limitation of the standard matrix keyboard: it latches the raw OUT 2 value, so keypad rows 2-7 collapse onto the single 0x42 strobe (row 1 stays distinct at 0x43). All 27 keys register on INP 1, but the firmware’s slot-multiplex row decode (which of rows 2-7 was pressed) cannot be resolved by a plain matrix.
The Emma 02 front panel buttons drive all 27 keys directly, so the emulated terminal remains fully usable. Tying the matrix rows to the multitil digit state would be a possible future emulator enhancement.