DB25 Bus Protocol and Port Map
The DB25 cable between the ISA card and the I/O board carries an 8-bit bidirectional data bus, an 8-bit host-to-board address bus, a data-direction line, and eight grounds. The cable itself is a standard female-to-female DB25 parallel cable.
There are no discrete read or write strobe wires. Read and write cycles are
encoded as address ranges. The ISA card translates the PC's /IOR and
/IOW into distinct high-address-bit patterns; the board's two 74LS138
decoders turn those patterns into buffer enables and latch clocks. The
schematic annotates one decoder as covering 0b01_x000–0b01_x111 and the
other 0b10_x000–0b10_x111.
All signals are 5 V and active-low. The bus is fully static: any cycle length from microseconds to seconds works, which allows cycles to be stretched for multimeter observation.
DB25 pinout
Measured by continuity and in pin-for-pin agreement with J1 on the IKA
Victor schematic.
| Pin | Signal | Pin | Signal | |
|---|---|---|---|---|
| 1 | D0 | 13 | A0 | |
| 14 | D1 | 12 | A1 | |
| 2 | D2 | 11 | A2 | |
| 15 | D3 | 10 | IOGATEDIR | |
| 3 | D4 | 9 | Read-range bit | |
| 16 | D5 | 8 | Write-range bit | |
| 17 | D6 | 7 | Range bit (/WREN) |
|
| 5 | D7 | 6 | Select | |
| 4 | A6 — not connected | 18–25 | Ground |
A6 is left unconnected on the board; the schematic states this explicitly.
Signal naming
The bridge sketch and earlier revisions of this documentation name signals after their observed behaviour rather than their schematic identity. The two naming schemes map as follows.
| Name used in the sketch | Arduino pin | Schematic identity |
|---|---|---|
A0 / A1 / A2 |
10 / 11 / 12 | A0 / A1 / A2, the port offset |
/SELECT |
13 | one of the high address bits A3/A4/A5/A7 |
/READ |
A1 | the read-range address bit |
/WRITE |
A2 | the write-range bit whose release ends the decode, producing the latch clock edge |
/WREN |
A3 | the remaining required range bit |
| unused channel | A0 | IOGATEDIR, the data transceiver direction line. Held high; no observable effect in isolation |
Cycle timing
Write. Set A0–A2 and the data lines. Assert select and /WREN low.
Pulse the write-range bit low, then high — the output latches capture on the
rising edge. Release select and /WREN.
The read-range bit must stay high for the whole cycle. Asserting it during a write switches an input buffer onto the data bus, which causes the latches to capture the current button states instead of the intended value; the visible symptom is lamps mirroring the buttons.
Read. Set A0–A2. Assert select and the read-range bit low. Sample
D0–D7. Release.
Host port map
Ports are at base 0x100. Inputs are active-low: a released switch reads 1.
Read ports
| Port | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
|---|---|---|---|---|---|---|---|---|
0x101 |
TEST | SERVICE | E4 | E3 | E2 | E1 | P2 START | P1 START |
0x102 |
P1 PEDAL | — | — | B5 | B4 | B3 | B2 | B1 |
0x103 |
P1 turntable, absolute position 0–255 (MCU-served) | |||||||
0x104 |
P2 turntable, absolute position 0–255 (MCU-served) | |||||||
0x105 |
Coin — see below (MCU-served) | |||||||
0x106 |
P2 PEDAL | — | — | B10 | B9 | B8 | B7 | B6 |
Bits marked — are unassigned and read high. Ports 0x103, 0x104 and
0x105 are served by the on-board AT89C51 through its port chip-selects
rather than by input buffers.
Port 0x105
This port was not documented in prior community sources. It was found by logging all ports for changes, and the schematic confirms it as an MCU-served chip-select.
Disassembly of the MCU firmware shows it carries an 8-bit coin counter that
increments once per debounced coin, wrapping at 255 — not a switch level or
a fixed-width pulse. See original-firmware.md.
Read the whole byte and treat any change in value as one credit. Detecting an edge on bit 0 alone registers one credit per two coins. The bridge sketch currently does the latter; this is recorded as a known issue in the top-level README, pending confirmation on hardware.
Write ports
Write ports 0x100–0x103 correspond to the four 74HC273 output latches
driving the ULN2803A lamp sinks.
| Port | Contents |
|---|---|
0x100 |
Cabinet lamps, neon, and the mechanical coin counter (COIN_CNTR) |
0x101 |
Start and effector lamps |
0x102 |
P1 button and turntable lamps |
0x103 |
P2 button and turntable lamps |
Bit assignments within 0x100 vary between cabinets. Many machines were
rewired in service, particularly around the relay board. On the cabinet used
for this work the assignment is:
| Bit | Lamp |
|---|---|
| 0 | unused |
| 1 | Blue left |
| 2 | both red lamps, wired in parallel |
| 3 | Blue right |
| 4 | Neon |
Verify port 0x100 on your own machine with a chase test before relying on
these. The schematic places COIN_CNTR among the low bits of this port on
stock wiring.
This page is synced from docs/bus-protocol.md in the ez2-io repo.