Skip to content

Home > Hardware > Peripherals > IOx

IOx expansion bus


In its original form, the Durango-X home computer has very limited I/O: a single-bit beeper, the interrupt enable port and, most importantly, the built-in video output. But almost any other device can be connected via the IOx expansion bus, which is an 8-bit parallel bus with 16 addresses, for easy daisy-chaining of peripherals.

The main PCB bears a single IOx connector; but the proposed keyboard+gamepads interface (which, incidentally, connects to the main PCB thru that) has 2 IOx connectors for convenience. As noted below, this standard interface board takes three addresses for all its supplied devices (keyboard, gamepad1, gamepad2).

Connector Pinout

The IOx bus uses a readily available IDC-16 socket which prevents reverse insertion; but regular 1/10" pin headers and sockets may be used, even DuPont connectors for testing purposes. If a board has more than one IOx socket, they'll be connected in parallel, thus completely interchangeable.

IOx connector seen from above (component side):

Bottom Top Shroud
# ##### ##### #
# +5V PD0 #
# BA0 PD1 #
# BA1 PD2 #
BA2 PD3 #
BA3 PD4 #
# /WE PD5 #
# /SEL PD6 #
# GND PD7 #
# ##### ##### #

Sidecar connector

Besides the IDC socket, Durango-X has a right-angle pin socket for bigger peripherals which should lay levelled with the main PCB. Pinout is the same, although with the bottom and top rows swapped.

Signal descriptions

Signal Description Direction (rel. CPU) Notes
+5V Power Output Most peripherals could take power from this line. Maximum recommended power draw: 350 mA (combined).
GND Ground Output Mandatory connection, even is the peripheral is self-powered.
PD0-PD7 Peripheral Data Bus Input/Output Must be kept in high-impedance state when /SEL is high.
BA0-BA3 Buffered Address Bus Output Constantly exposing the CPU's lower address bits.
/WE Write Enable Output This or /SEL must be qualified via the Clock signal (usually the latter).
/SEL IOx Select Output Active when the CPU interacts with the IOx bus. Peripherals can not ask for CPU attention, other than via polling.


The maximum current draw for peripheral boards (350 mA) is based on the USB standard guaranteed 500 mA, minus Durango-X maximum power rating (about 150 mA at 5V). While many power supplies are able to exceed this guaranteed minimum, caution is advised if your preipheral setup is going over 350 mA total as the PCB layout and tracks aren't intended for high intensities.

As always, the use of quality, brand-name power adapters is highly recommended, both for output stability and safety reasons.

Signal timing

IOx bus transactions are similar to regular memory accesses, thus Durango-X will assert the /SEL signal (qualified) for half a cycle, or about 325 nS; but peripherals are expected to respond in a reasonably faster fashion, to account for glue logic delays.

Address decoding

All peripherals should provide their own address decoding, although that could be a very simple circuit. In any case, no attached peripheral should write to the IOx bus unless the /SEL line is low and the current address is within its assigned range.

In most cases, a 74HC138 decoder is all that's needed.

Port assignations

In order to avoid conflicts, no attached peripherals should share any address, especially when expected to write to the bus. Note that the Read/Write line may be used as an extra address, if properly decoded.

A common address may be shared between peripherals, however, as long as they are never connected at the same time.

Here follows a list of currently produced or projected peripheral addresses. This will be frequently updated.

Address Dir. (CPU) Peripheral Port description
$0 write picoVDU Address High Latch
$0 read FREE -
$1 write picoVDU Address Low Latch
$1 read FREE -
$2 write picoVDU Data write
$2 read FREE might be used as I/O
$3 I/O Virtual Serial Port* Data I/O
$4 I/O Virtual Serial Port Configuration
$5 I/O FREE -
$6 I/O FastSPI SPI Data R/W
$7 write FastSPI D0...D5 = /SPI_DEV
$7 write FastSPI with I2C D0...D3 = /SPI_DEV, D4 = I2C_SCL, D5 = I2C_SDA
$7 write nanoLink output (v1) D0=SERDAT, D1=SERCLK
$7 read FastSPI send SPI clock
$7 read FastSPI with I2C D0...D3 = /SPI_DEV, D6 = I2C_SCL, D7 = I2C_SDA; also send SPI clock
$8 write Static RAM storage Address High Latch
$0 read FREE -
$9 write Static RAM storage Address Low Latch
$0 read FREE -
$A I/O Static RAM storage Data I/O
$A I/O PASK parallel port Data I/O (currently input only)
$B write Matrix Keyboard Select column
$B read Matrix Keyboard Read rows
$C write Gamepads Latch status
$C read Gamepad 0 Read status
$D write Gamepads Shift data (NES only, but ignored by MD)
$D read Gamepad 1 Read status
$E write nanoLink output (v2+) D0=SERDAT, D1=SERCLK
$E read FREE -


The Virtual Serial Port is not a real hardware device, but some software (especially in development) may access these ports.


The Static RAM card and the PASK keyboard/paralell port are incompatible and should NOT be connected at the same time! Older (v1) revisions of the nanoLink output board are incompatible with the FastSPI, but this will change in later revisions.