The ZXI (ZX Interface) standard is for devices that are attached to the Spectrum edge connector. ZXI compliant devices are inter-operable with each other without conflicts. Certified devices may display the logo on their case, in their manuals, and on-screen.
The Z80 provides 16-bit I/O decoding, so in theory the Spectrum has 65536 ports available for hardware devices. In practice the Spectrum does not fully decode the I/O and there are no spare I/O ports available that do not clash with at least one existing peripheral. For example, the ULA alone uses 32768 ports (every even port). It is worth noting that the Timex clones do fully decode the I/O ports.
During the development of the ULAplus replacement ULA, a comprehensive search was carried out to determine a 16-bit port range that clashed with the least devices. An 8-bit port was located that clashed with a single device, the ZX Printer, and a hardware fix created to prevent the ZX Printer using that address.
Meanwhile, during the development of the Spectranet ethernet card, a solution was devised to enable multiple devices to page in their own ROMs using 'ripple priority'. The ZXI standard combines these two approaches into a single standard. Legacy devices that do not use ROM paging may also be certified as ZXI compliant on a case by case basis.
To have your device certified as ZXI compliant, you must apply for the required number of I/O ports in the range #hh3B. This can be done by posting a request to usenet's comp.sys.sinclair. An informal advisory committee will aim to assist you in choosing the appropriate ports in a timely fashion.
The port ranges are assigned as follows
#xF3B - ULAplus (see below) #xE3B - ZX Prism #xD3B - ZXI Hard Disk Interface Specification (working title) #xC3B - Unassigned #xB3B - Development/Testing. These ports should only be used during device development. #xA3B - Unassigned #x93B - Unassigned #x83B - Unassigned #x73B - Unassigned #x63B - Unassigned #x53B - Unassigned #x43B - Unassigned #x03B, #x13B, #x23B, and #x33B are to be used in groups where a device needs four ports (for example Spectranet which has the #0x3B assignments)
Currently Allocated #x03B, #x13B, #x23B, and #x33B Ports
#033B - Spectranet page A memory select #023B - Spectranet page B memory select #013B - Spectranet programmable trap register #003B - Spectranet control register
Currently used ULAplus ports
#FF3B - ULAplus data #BF3B - ULAplus register
Devices with the same function, for example IDE interfaces, may be allocated the same ports on the basis that only one of these devices should be connected at a time.
ZXI compliant devices must perform complete bus decoding and take into account the M1 signal and the RFSH signal.
The device must only respond to its own NMI. This is particularly important if the machine is using a ROM with a working NMI handler routine.
It is possible on machines which have a straight connection from the INT signal at the rear bus, to the INT pin at the Z80 for an external devices to trigger an INT. It can block the normal ULA interrupt and inject its own INT pulses. ZXI compliant devices that use the INT signal should put a 0xFF on the data bus during the INTA cycle if the device does not use vector interrupts.
More detail required.
Legacy Device Certification
Legacy devices that do not use their own ROMs may also be certified as compliant on a case by case basis. For example, an AY expansion for the 48K machine that uses the same ports as the 128K machine, or an IF2 compatible Sinclair Joystick interface would both be certified compliant.