El diseño del bus de direcciones y datos del ZX81 presenta diferencias notables con respecto al ZX Spectrum. Las señales que salen por el bus de expansión son diferentes a las que se encuentran en el zócalo de la ROM, por lo que no se puede replicar un montaje basado en una EPROM en el zócalo, con la misma EPROM en una interface conectada al bus de expansión.
Las líneas del bus de direcciones A0-A8 que salen por el puerto de expansión son las mismas que llegan al Z80, pero no son las mismas que acceden a la ROM o a la ULA. Entre Z80 y ROM hay unas resistencias (R18-R26) de 1K. Estas líneas del bus de direcciones por el lado de la ULA solo están disponibles en el zócalo de la ROM, no salen por el bus de expansión.
La señal /ROMCS que sale por el puerto de expansión (23B) es la misma señal que la de la ROM, pero no que la de la ULA; ya que hay una resistencia entre la ROM y la ULA (R28: 680 ohm).
La ULA debe tener acceso a los bits bajos del bus de direcciones para tener acceso al conjunto de caracteres de la ROM durante el ciclo de refresco.
La señal M1 (Machine Cycle 1) conecta la CPU con la ULA, y la señal sale por el puerto de expansión (pin 22A). Los ciclos T3 y T4 de M1 se usan para refrescar las memorias dinámicas. Los 7 bits más bajos del bus de direcciones contienen la dirección de memoria a refrescar y la señal RFSH se activa. Esta conexión CPU-ULA no existe en el ZX Spectrum.
![Imagen](https://dl.dropboxusercontent.com/u/88761012/Z80_Machine%20Cycle%201.png)
Común
Los montajes se basan en la EPROM 27C128 (16 kB). Los pines Vpp (pin 1), Vcc (pin 28) y PGM (pin 27) se conectan a +5V.
La línea A13 (pin 26) permite seleccionar el banco de la EPROM que queremos, por lo que se ubica un selector a +5V y a GND.
Montaje 1
El diseño está basado en una interface de ROM externa que funciona en un ZX Spectrum, no lo hace en un ZX81. En este caso se manejan las señales ROMCS, RD y MREQ.
Montaje 2
Basado en el diseño de Wilf Rigter de una interface externa con una EPROM 27C64 (8 kB) para tener un juego de caracteres externo. Solo se replica el montaje que incluye a las señales ROMCS y RD con el transistor 2N3904 (BC547, aunque seguramente cualquier NPN serviría), RFSH al pin OE, así como las líneas A13, A14 y A15.
![Imagen](https://dl.dropboxusercontent.com/u/88761012/ZX81_Interface%20ROM%20externa_montaje2.png)
Montaje 3
Mismo esquema que el anterior, pero en este caso montaje al completo, incluyendo los chips 74HC374 (registro de flip-flops síncrono tipo D) y 74HC193 (contador binario) de tecnología CMOS.
![Imagen](https://dl.dropboxusercontent.com/u/88761012/ZX81_Interface%20ROM%20externa_montaje3.gif)
En el chip 74HC374, las señales CLK y /OE son comunes a todos los flip-flops y se dispara por nivel alto del CLK. La señal /RD del ZX81 entra a CLK. Esta señal se encuentra en nivel alto en los ciclos T3 y T4, que es cuando se produce el refresco de las memorias, y por lo tanto provocando la activación del registro. Cuando /OE está a bajo nivel, el contenido de los 8 flip-flops se encuentra disponible a la salida. En el montaje, la conexión a GND garantiza esta disponibilidad. Por lo tanto, este chip garantiza el acceso a las líneas bajas del bus de direcciones (A3-A9) durante el ciclo de refresco.
El chip 74HC193 es un contador binario de 4 bits. Los datos se cargan cuando /LOAD (PE – pin 11) se encuentra a bajo nivel y cuando CLEAR (MR – pin 14) se encuentra igualmente a bajo nivel, algo que se garantiza con la conexión a GND de este último en el montaje. Con este esquema de conexiones, las entradas (D1 – D4) siempre están a alto nivel y las salidas (Q1 – Q3, Q4 no conectada) se activarán cuando NMI esté a bajo nivel, y por lo tanto /LOAD. Durante el proceso de generación del display, se genera una NMI cada vez que el Z80 deba ejecutar un scanline momento en el que se generará un pulso HSYNC.
De esta manera se controla el acceso a las líneas A0 a A2 del bus de direcciones. La razón por la cual la señal COUNT-UP (pin 5) se encuentra conectada a la señal HALT del ZX81 se desconoce. La instrucción HALT provoca que el Z80 ejecute NOPs hasta que se produzca una interrupción (NMI o INT). Durante la generación del display, se produce un HALT al final de cada línea.
Pruebas adicionales con el Montaje 3
Se han hecho diferentes pruebas con software que usa pseudo-HIRES y HIRES. En los programas HIRES ha funcionado correctamente, y solamente en los casos en los que se requería mostrar caracteres éstos no se reproducían correctamente. Los programas con pseudo-HIRES no se ven correctamente.
En todo este trabajo he invertido del entorno de 4 meses. Por no poner el montón de fotos que he hecho, he preparado un video (6 minutos) que recoge todo lo explicado anteriormente.