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 #
# /WR 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 Power Output Most peripherals could take power from this line. Maximum recommended power draw: 350 mA (combined).
GND Ground Power 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 Active low when the CPU writes to the peripheral; not qualified, must be set around the same time as BAx.
/SEL IOx Select Output Active low when the CPU interacts with the IOx bus; must be qualified via the Clock signal.


Peripherals can not ask for CPU attention, other than 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.


Most modern revisions of the Durango computers are faster, down to a reasonable 125 nS transaction time. On the other hand, some other devices compatible with the IOx expansion bus (e.g. Chihuahua, Rosario SBCs) may use much longer transaction times; in any case, the peripheral device should keep the requested data until /SEL is negated or, if on a write transaction, latch the data at the rising edge of /SEL.

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 external VDU Address High Latch
$0 read FREE -
$1 write external VDU Address Low Latch
$1 read FREE -
$2 write external VDU Data write
$2 read FREE some external VDUs may read VRAM
$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 with I2C D0...D3 = /SPI_DEV, D4 = I2C_SCL, D5 = I2C_SDA
$7 write nanoLink output (v1) D0=SERDAT, D1=SERCLK
$7 read FastSPI with I2C Send SPI clock; return value is D0...D3 = /SPI_DEV, D6 = I2C_SCL, D7 = I2C_SDA
$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 may become Parallel GPIO, combining nanoLink and a bit-banged SPI interface


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.