New IO-ARCHITECTURE.md, derived from the v4.2 image, the U7 GAL decode and schematic sheets 1/3: - $A010 control-latch bit map (CCK / D_OUT / WR_SB / RD_SB / SEL0-2) - the 50-byte script format the firmware replays, and the ROM table map - full port/address population: 9 buttons boards + 2 keypads across all 8 ports; the 0x00-0x6F logical map and its 0x48-0x4F gap - the keypad engine ($CC53/$CC7E): 4-row matrix scan, row-patched RAM scripts, the $DC14 key-code table, message type $8B - lamp readback ($21C2) and the 72-byte lamp-fault mask at $DFA8 -- fault reports are type $03 with the lamp index in $2519 - scan cycle budget: 1.91 ms/pass, 17.3 ms/scan, ~58 Hz; demux is 60% - expansion: one spare buttons board, and nothing further without a protocol revision Corrections to existing docs: - $CC53 was cited as the encoder sweep; it is the keypad-1 scanner. The sweep is $C8CC-$C9A7, driven from $C0CB. - U31 is on sheet 3, not sheet 1, and is completely uncommitted: no address, data, strobe or pod-bus signal reaches it. Not an expansion hook -- populating it does nothing without new wiring. - No spare HCTL-2016 footprints exist. The decode has 3 free selects on U9, but the PCB carries exactly 5 positions and sheet 1 draws 5. More analog axes need hardware, not firmware. Also carries the previously-uncommitted standard-rate (16550) feasibility analysis and baudscan.py, plus a note that the FastRIO "FTDI-class adapter" rule really means arbitrary-rate generation: CP2102N qualifies, classic CP2102 snaps 31250 to 38400. Bench-measured 2026-07-26; on-cockpit latency check still pending. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
200 lines
13 KiB
Markdown
200 lines
13 KiB
Markdown
# RIO cockpit hardware — boards, schematics, GAL dump
|
||
|
||
Physical documentation of the VWE Tesla-cockpit **RIO** (Remote Input/Output)
|
||
board set, gathered during the 2026 restoration: board photos (Signal,
|
||
2026-07-15), a scan of the original paper wire schematics, and the fuse map
|
||
read out of the RIO board's GAL address decoder.
|
||
|
||
All boards are **Copyright 1994 V.W.E. Inc.** — the schematic title blocks
|
||
spell it out: **Virtual World Entertainment, 1100 W Cermak Suite B404,
|
||
Chicago, Illinois**, every sheet and silkscreen credited **"Design by M.C."**
|
||
Schematic plots are dated 1/11/1996 (peripheral boards) and 6/26/1996 (RIO
|
||
board), so these drawings post-date the Rev. 0/1 boards they describe.
|
||
|
||
## Board family
|
||
|
||
| P/N | Title | Rev photographed | Key silicon |
|
||
|-----|-------|------------------|-------------|
|
||
| **1407** | RIO board ("CPU board") | Rev. 3 | Toshiba **TMP68HC11E1T** (PLCC-52, socketed, date 9917 — a '99 service part) @ 8 MHz, GAL20V8A decoder, 27C512 EPROM, LH52B256 32K SRAM, 5× HCTL-2016 |
|
||
| **1401** | Buttons board | Rev. 0 | 2× UCN5821A lamp drivers, 2× 74HCT165, 74HCT164, 74LS00/05 |
|
||
| **1402** | Keypad board | Rev. 1 | 2× 74HCT164, CD74HCT165, 74LS00/05 |
|
||
| **1408** | Display board ("RIO external display") | Rev. 1 | Intersil **ICM7228B** 8-digit driver, 8× LTS313A 7-segment |
|
||
| **1413** | Quad Amplifier Board | Rev. 1 | **Pyramid PB-150P "Pro Plus"** car amp (bolt-on) + passive 3-way crossovers |
|
||
|
||
Plus the cockpit position sensors: **HP HEDS-5700** two-channel quadrature
|
||
optical encoders (option code **I** = 512 counts/rev; the photographed unit is
|
||
date-coded 9515, Singapore), one per analog axis, read by the five HCTL-2016
|
||
counters on the RIO board (`OPT1`–`OPT5` = stick X/Y, throttle, left/right
|
||
pedals). **There is no room for a sixth.** Each counter consumes two
|
||
74LS138 outputs (`OE` + `RST`), so U8/U9 decode 8 channels and three
|
||
selects on U9 are spare — but the PCB carries exactly five HCTL-2016
|
||
footprints (U12–U16) and sheet 1 draws exactly five symbols, U16 last.
|
||
Below OPT5 the board is bare: no silkscreen outline, no plated holes,
|
||
unlike the genuinely unpopulated U31 and R43/R44 sites. Adding axes
|
||
means a daughterboard off U9's spare selects, or a respin — details in
|
||
[`../rio-firmware/IO-ARCHITECTURE.md`](../rio-firmware/IO-ARCHITECTURE.md).
|
||
|
||
## RIO board 1407 (schematic sheets 1–3, `RIO_1407`)
|
||
|
||
**Sheet 1 — CPU : Memory Decoder.** The TMP68HC11 runs in expanded
|
||
multiplexed mode: a 74HCT573 latches A[0:7] off the AD bus, and **U7 — drawn
|
||
as a 20L8, fitted as a GAL20V8A-15LP** — decodes A[8:15] into `ROM_SEL*`
|
||
(27C512 EPROM, U10), `RAM_SEL*` (LH52B256-70LL 32K SRAM, U11), `PH_SEL*`
|
||
(HCTL-2016 bank via two 74LS138s), `DSP_SEL*` (external display port) and
|
||
`BND_SEL` (I/O-interface latch, sheet 3). Each HCTL-2016 feeds a 5-pin
|
||
header (`J4`–`J8`) carrying CHA/CHB from a HEDS-5700. The DB9 COM port goes
|
||
through a MAX231/MAX232-class level shifter; the schematic's `IN_RESET*` from
|
||
the serial side is the hardware behind the **DTR reset pulse** described in
|
||
[PROTOCOL.md](https://gitea.mysticmachines.com/VWE/RIOJoy/src/branch/main/docs/PROTOCOL.md) §1. The "display interface" block (ALS541
|
||
buffers, HEADER14) exports latched data lines `HD[00:04]` + digit address
|
||
`AS0-2` to the display board — this is a memory-mapped port, *not* the pod
|
||
bus. A 22V10 site (U31) is **unpopulated** on the photographed board —
|
||
and it is drawn on **sheet 3**, not here, as a *completely uncommitted*
|
||
spare: pins 1–11 all tie to a single rail that loops back on itself,
|
||
pins 14–23 all tie to the R42 (`PULLUP10` 2.7K) / R43 / R44 rail, and
|
||
pin 13 is `NC (1,2)`. No address, data, strobe or pod-bus signal
|
||
reaches it. **Nothing was ever assigned to U31** — it is reserved board
|
||
area with pull-ups so the empty site doesn't float, not a pre-routed
|
||
expansion hook, and populating it accomplishes nothing without new
|
||
wiring. R43/R44 are unpopulated for the same reason. The CPU clock is a 4-pin **canned oscillator
|
||
module** (8.000000 MHz, by U4), not a bare crystal — E-clock = 2 MHz,
|
||
which is what makes the SCI's 9615 ≈ 9600 baud (÷13 prescale) work and
|
||
every faster 16550-standard rate unreachable in firmware alone; that
|
||
can is the single part standing between the board and a standard-rate
|
||
speed upgrade (swap analysis:
|
||
[`../rio-firmware/RIOv4_2-ANALYSIS.md`](../rio-firmware/RIOv4_2-ANALYSIS.md),
|
||
"Standard-rate (16550) feasibility").
|
||
|
||
**Sheet 2 — Power & Reset Interface.** A MAX690 supervisor provides
|
||
power-fail reset and a **watchdog (WDI)**; reset can also come from the
|
||
front-panel `RESET` toggle (SW1) or remotely through an **H11L1 optocoupler**
|
||
fed from an isolated 3-pin `+5 VDC` input (J8) — the game PC can hard-reset
|
||
the board. The `ABORT` toggle (SW2) pulls the HC11 `IRQ*`. A 74LS241 drives
|
||
the status LED bank: `POWER ON`, `FAULT`, `RESET`, `RUN`, `TX`, `RX`. Power
|
||
enters on J9 through 5 A/10 A fuses, LC filters and 1N5341B clamp zeners,
|
||
producing separate logic `VCC` and peripheral `VCC_EXT` rails.
|
||
|
||
**Sheet 3 — I/O Interface ("pod bus").** Eight identical 16-pin IDC ports
|
||
(`J11`–`J18`) fan out through ALS541 buffers and SIP resistor packs. All
|
||
ports share the outbound signals; each port has its own return line
|
||
(`DI[0..7]`, selected by a 74LS138 from `SEL0-2`) and its own buffered
|
||
brightness line (`BRT_CTR0-7`, all copies of one PWM signal). A 74HC574
|
||
latch written via `BND_SEL` holds the bus control bits (`SEL0-2`, `RD_SB`,
|
||
`WR_SB`, `D_OUT`, `CCK`) — so the firmware bit-bangs the bus by rewriting
|
||
this latch.
|
||
|
||
### Pod bus signal set (per port)
|
||
|
||
| Signal | Direction | Purpose |
|
||
|--------|-----------|---------|
|
||
| `CCK` | RIO → pod | shift clock |
|
||
| `DD_IN` | RIO → pod | serial data into the pod's 74HCT164s (address select + payload) |
|
||
| `WR_SB` | RIO → pod | write strobe (latch lamp/display data) |
|
||
| `RD_SB` | RIO → pod | read strobe (parallel-load the pod's 74HCT165) |
|
||
| `DD_OUT` | pod → RIO | serial readback, **open-collector 74LS05** so pods can share a cable |
|
||
| `BRT_CTR` | RIO → pod | global lamp-brightness PWM, gates the UCN5821A output enable |
|
||
| `VCC_EXT`, GND | — | peripheral power rail |
|
||
|
||
Every pod board carries a 74HCT164 whose parallel outputs go to an
|
||
**`ADR. SEL.` jumper block (`A-0`…`A-7`)**: the RIO shifts an address
|
||
pattern down the cable, the jumper picks which bit this board answers to,
|
||
and 74LS00 gates qualify `RD_SB`/`WR_SB` with that selection. This
|
||
hardware addressing is what the 0x00–0x6F logical input map in
|
||
[PROTOCOL.md](https://gitea.mysticmachines.com/VWE/RIOJoy/src/branch/main/docs/PROTOCOL.md) ultimately resolves to.
|
||
|
||
The firmware side of this bus — the `$A010` latch bit map, the 50-byte
|
||
scripts it replays, which port and `ADR. SEL.` address each of a pod's
|
||
9 buttons boards and 2 keypads answers on, and the scan's cycle cost —
|
||
is decoded in
|
||
[`../rio-firmware/IO-ARCHITECTURE.md`](../rio-firmware/IO-ARCHITECTURE.md).
|
||
Note it corrects one reading of the table above: `PORTE` carries
|
||
`DI[0..7]`, which is *why* there are exactly eight ports.
|
||
|
||
## Peripheral boards
|
||
|
||
- **1401 Buttons board** (`PBE_1401`) — eight 4-pin connectors (`J3`–`J10`),
|
||
pinout `1 = buttons GND, 2 = button in, 3 = lamps +5V, 4 = lamps logic GND`.
|
||
Two UCN5821A serial-in latched sink drivers light the button lamps
|
||
(brightness = `BRT_CTR` PWM on their OE), two 74HCT165s read the buttons
|
||
back, one of them also echoing board status/address.
|
||
- **1402 Keypad board** (`KEY_1402`) — hosts the COTS 16-key hex pad (0–F)
|
||
on an 8-line header (4×4 matrix). A second 74HCT164 drives the matrix
|
||
rows through open-collector 74LS05 inverters; the 74HCT165 reads the four
|
||
columns (`IN0-3`, 2.7K pull-ups) plus a board-detect line `BRD_DT*`.
|
||
- **1408 Display board** (`DSP_1408`) — ICM7228B driving eight LTS313A
|
||
digits (hex decode) from the RIO's dedicated 14-pin *external display*
|
||
port; write-only, plus an isolated 26-pin **"IBM printer port"** LED
|
||
monitor block. Silkscreen reads "P/N 140B" but the schematic title block
|
||
confirms **1408**. Full pin-level output definition — and what the
|
||
firmware actually displays (boot banner + the keypad-A-9-E test mode) —
|
||
in [display-board-1408.md](display-board-1408.md).
|
||
- **1413 Quad Amplifier Board** (`AMP_PLT`, silkscreen "Quad Amplifier
|
||
Board … P/N 1413 REV. 1") — the actual amplification is a stock
|
||
**Pyramid PB-150P "Pro Plus"** 4-channel 12 V car-audio amplifier bolted
|
||
to the board as a module; the schematic only drew the VWE-designed
|
||
passive circuitry around it. The board feeds the Pyramid's `B+12V / GND
|
||
/ REMOTE` screw terminals and speaker-level `HIGH INPUT` connectors, and
|
||
its four outputs (`1CH/L`…`4CH/R`) return through terminal strips into
|
||
per-corner 3-way passive crossovers: Dale IHB-3 inductors (820 µH woofer
|
||
low-pass, 180 µH midrange, date-coded 9531), MMP 100 VDC film capacitors
|
||
(2.2 µF/10 µF), and Dale CP-5 2 Ω 5 W pad resistors. Corner speaker
|
||
connectors J1–J4 (front/back × left/right) are 6-pin: `1 woofer+,
|
||
2 midrange+, 3 tweeter+, 4 woofer−, 5 midrange−, 6 tweeter−` (silkscreen,
|
||
matching sheet 5). Power enters on J5 (4-pin: `+12VDC ×2, GND ×2`) with a
|
||
green POWER ON LED; the per-channel red LED pairs across the outputs are
|
||
the schematic's "speaker outputs checking circuit". PCB etch NT 1-0A 3695
|
||
— the same fab batch series (week 36 '95) as the buttons board.
|
||
|
||
## GAL dump — [`gal/GAL20v8a_5764.JED`](gal/GAL20v8a_5764.JED)
|
||
|
||
Fuse map read 2023-03-09 from **U7 on the 1407 board** (GAL20V8A-15LP,
|
||
hand-labeled **"5764"** — which matches the JEDEC fuse checksum `*C5764`, the
|
||
source of the file name). Per sheet 1 it is the CPU **memory decoder**
|
||
(drawn as a 20L8). **Decoded** — equations, the recovered memory map
|
||
(`$2000-$9FFF` SRAM, `$A000/$A010/$A020` I/O windows, `$C000-$FFFF` EPROM)
|
||
and the firmware cross-check are in [`gal/README.md`](gal/README.md); the
|
||
chip's programmed signature even reads `U7`.
|
||
|
||
## Schematic scan — [`schematics/Scans_018-014.pdf`](schematics/Scans_018-014.pdf)
|
||
|
||
| PDF page | Sheet | Title block |
|
||
|----------|-------|-------------|
|
||
| 1 | RIO_1407 sheet 1/3 | CPU : Memory Decoder |
|
||
| 2 | RIO_1407 sheet 2/3 | Power & Reset Interface |
|
||
| 3 | RIO_1407 sheet 3/3 | I/O Interface |
|
||
| 4 | PBE_1401 1/1 | Buttons Board |
|
||
| 5 | AMP_PLT (P/N 1413) 1/1 | Amplifier Board |
|
||
| 6 | KEY_1402 1/1 | Keypad Board |
|
||
| 7 | DSP_1408 1/1 | Display Board |
|
||
|
||
## Photo index ([`photos/`](photos/))
|
||
|
||
Original Signal filenames preserved here for provenance (taken 2026-07-15;
|
||
amplifier board 2026-07-19).
|
||
|
||
| File | Original | Shows |
|
||
|------|----------|-------|
|
||
| `encoder-heds5700-control-assembly.jpeg` | `signal-2026-07-15-093011.jpeg` | HP HEDS-5700 I02 encoder (9515 A, Singapore) on a control-mechanism shaft |
|
||
| `display-board-1408-front-digits.jpeg` | `signal-2026-07-15-093017.jpeg` | Display board digit side, 8× LTS313A (U2–U9), PCB etch NT 1-0 5094 |
|
||
| `display-board-1408-back-driver.jpeg` | `signal-2026-07-15-093023.jpeg` | Display board driver side: ICM7228BIPI (date 9438), 16-pin IDC, "RIO EXTERNAL DISPLAY / P/N 140B REV. 1" |
|
||
| `keypad-1402-front-keys.jpeg` | `signal-2026-07-15-093032.jpeg` | 16-key hex keypad module (keys 0–F), front bezel |
|
||
| `keypad-board-1402-back-logic.jpeg` | `signal-2026-07-15-093038.jpeg` | Keypad board logic: DM74LS00N, 2× MM74HCT164N, SN74LS05N, CD74HCT165E, ADR. SEL. jumpers, "P/N 1402 REV. 1" |
|
||
| `buttons-board-1401-solder-side.jpeg` | `signal-2026-07-15-093045.jpeg` | Buttons board solder side, PCB etch NT 1-0 3695 |
|
||
| `buttons-board-1401-component-side.jpeg` | `signal-2026-07-15-093051.jpeg` | Buttons board: 2× CD74HCT165E, 74HCT00AP, 2× UCN5821A-type drivers, 74HCT164N, 8× lamp/button connectors, "P/N 1401 REV. 0" |
|
||
| `rio-board-1407-solder-side.jpeg` | `signal-2026-07-15-093058.jpeg` | RIO board solder side, PCB etch NT 3-0 4996 |
|
||
| `rio-board-1407-component-side.jpeg` | `signal-2026-07-15-093105.jpeg` | RIO board: TMP68HC11E1T (PLCC-52 in socket, 9917E8Z — not QFP as first cataloged), 8.000000 MHz oscillator can ("DXL10401A-2"), GAL20V8A ("5764" sticker), AM27C512 EPROM, LH52B256 SRAM, 5× HCTL-2016 + OPT1–5, J11–J18 pod ports, status LEDs, "P/N 1407 REV. 3" |
|
||
| `amp-board-1413-component-side.jpeg` | `signal-2026-07-19-134932.jpeg` | Quad Amplifier Board full view: Pyramid PB-150P module, corner crossovers, "P/N 1413 REV. 1", J5 pinout silkscreen |
|
||
| `amp-board-1413-solder-side.jpeg` | `signal-2026-07-19-134926.jpeg` | Amplifier board solder side, PCB etch NT 1-0A 3695 |
|
||
| `amp-board-1413-pyramid-inputs.jpeg` | `signal-2026-07-19-134921.jpeg` | Pyramid input face: HIGH INPUT connectors, LEVEL pots, LOW INPUT RCAs; front-corner crossovers |
|
||
| `amp-board-1413-pyramid-outputs.jpeg` | `signal-2026-07-19-134915.jpeg` | Pyramid output face: SPEAKERS terminals 1CH/L–4CH/R, blade FUSE, B+12V/GND/REMOTE; check LEDs, J1–J4 pinout silkscreen |
|
||
|
||
## Cross-references
|
||
|
||
- [`docs/PROTOCOL.md` (RIOjoy)](https://gitea.mysticmachines.com/VWE/RIOJoy/src/branch/main/docs/PROTOCOL.md) — the 9600 8N1 wire protocol this
|
||
hardware speaks; its DTR reset pulse and 0x00–0x6F input map both have
|
||
their physical explanation above.
|
||
- [`../rio-firmware/`](../rio-firmware/) — v4.2 EPROM dump (from the
|
||
AM27C512 at U10) and 68HC11 disassembly/patches.
|
||
- [`docs/Win32RIO/` (RIOjoy)](https://gitea.mysticmachines.com/VWE/RIOJoy/src/branch/main/docs/Win32RIO/) — FASA's original Windows driver for the
|
||
same hardware.
|