[SPECTRUM] "Bypass" de la ULA para reparar un Spectrum (bypass de teclado, EAR y sonido)

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

[SPECTRUM] "Bypass" de la ULA para reparar un Spectrum (bypass de teclado, EAR y sonido)

Mensajepor mcleod_ideafix » 04 Nov 2019, 15:58

Esto es originalmente un post que publiqué hace unos 9 años, en una versión anterior del foro. Ahora esa versión anterior no se encuentra online. A pesar de eso he tenido la inmensa suerte de poder recuperar el post completo con imágenes y todo, del Wayback Machine. Para que no se pierda, y en vista de que es un tema/problema recurrente, lo re-posteo aquí en forma de ficha-taller. La copia del Wayback MAchine es ésta: https://web.archive.org/web/20151021100 ... 28&forum=2


La historia comienza en este hilo (NOTA: probablemente no funcione, así que pondré la versión del Wayback Machine)
https://web.archive.org/web/20151021100 ... &order=ASC

Hoy llegó el Spectrum, y pude comprobar que, efectivamente, el teclado no respondía, aun estando perfectamente.

Probé otra ULA en lugar de la que tenía, y el teclado volvió a la vida.

¡Ea, otra ULA a la porra! pensé, pero... ¡qué raro! sólo le falla la lectura de teclado. El teclado, aunque es leído por la ULA, es un periférico tan sencillo que puede implementarse "fuera" de ella.

Así que probé con mi interfaz de teclado PS/2 (versión externa de Ben Veersteg), y con él, sí que pude teclear.

foto1.jpg
foto1.jpg (49.28 KiB) Visto 5389 veces

Como se puede observar, incluso pude cargar un juego y jugar a él. Esto significa que la ULA no tiene problema para leer el bit 6 del puerto de teclado (254) que es el que contiene el estado del bit de EAR.

Tampoco tuvo problemas para generar sonidos o cambiar el color del borde. Aparentemente, el único fallo está en los cinco bits menos significativos que la ULA entrega al Z80.

Pensé que podría ser el transistor que está encima del Z80 (esta placa es una issue 2). Ese transistor es el decodificador del puerto 254, y si no funciona, la ULA no es seleccionada por el Z80 y no se puede leer ni escribir en ella, pero rapidamente lo descarté porque al arrancar, el borde pasa del color que estuviera, a blanco. Es decir, el Z80 puede escribir en la ULA, con lo que el transistor debe funcionar.

También pensé en un acoplo demasiado débil entre el bus de datos de la ULA y el del Z80. Es decir, que el valor "0" que fuerza la ULA no sea lo suficientemente "fuerte" para que el Z80 lo lea, a través de las resistencias que desacoplan ambos buses. Probé esta ULA en otros Spectrum's pero en ninguno funcionó satisfactoriamente.

La única solución: "bypassear" la ULA. Es decir, desconectar la ULA del teclado, y hacer que la lectura del mismo la haga un circuito externo.

EL circuito debe ser un buffer triestado de 5 bits. A la entrada de cada buffer habrá una de las 5 lineas del teclado (KB0 a KB4). A la salida, los bits D0 a D4 del bus de datos, en el lado del Z80 (es decir, en el bus de datos del Z80, no de la ULA). Un buffer conecta KB0 con D0, otro conecta KB1 con D1, y así sucesivamente.

La condición de triestado de los cinco bufferes es controlada por la combinación de señales que hacen que el Z80 quiera leer algo de la ULA. Esa combinación (la más sencilla) es cuando A0 vale 0, IORQ vale 0, y RD vale 0. La combinación de A0 y IORQ ya está presente en una de las patas del transistor que se "acuesta" encima del Z80, pero he preferido usar las señales "originales". Así, cuando (A0 or IORQ or RD) valga 0, entonces deben abrirse los bufferes para que el dato contenido en KB0-KB4 salga a D0-D4.

Para implementar este sencillo circuito, he recurrido a una pequeña GAL. Es todo lo que necesito. La pondré en un zócalo, soldado a una placa pequeña, de la que pueda coger fácilmente puntos de soldadura para unirlo a diferentes partes de la placa del Spectrum.

Para el zócalo, como no tengo uno de 10+10, uno un zócalo de 7+7 con otro de 4+4. Me sobran dos pines, pero no pasa nada.

foto2.jpg
foto2.jpg (67.38 KiB) Visto 5389 veces

Soldado queda así. Dejo un poco de espacio para poder soldar los cablecillos que van a cada pin.

foto3.jpg
foto3.jpg (58.54 KiB) Visto 5389 veces

Lo sueldo todo en la cara de pistas, para dejar la cara de componentes vacía. De esa forma queda "lisa".

foto4.jpg
foto4.jpg (42.01 KiB) Visto 5389 veces

Y me permite poner todo el circuito simplemente "echado" encima de cualquier parte donde haya suficiente sitio, sin temor a que al apoyarlo haga contacto con algo (apoyamos sobre lo que sería la cara de componentes, que es todo baquelita). Por ejemplo, aquí, encima de los chips de multiplexión de direcciones:

foto5.jpg
foto5.jpg (93.86 KiB) Visto 5389 veces

Cableo todo el circuito: con cable verde, desde el conector de 5 pines de teclado, hasta los pines que he definido como entradas de los cinco bufferes. Luego, desde las salidas de los bufferes hasta el terminal derecho de las resistencias R1 a R5, que llevan los bits D0 a D4 del bus de datos del procesador. Con cable azul, alimentación de 5V y masa. Con cable negro, las señales de control de triestado (IORQ, A0 y RD).

foto6.jpg
foto6.jpg (99.6 KiB) Visto 5389 veces

El fallo que tiene la ULA, en concreto, consiste en que lo que tendrían que ser entradas de señal, actúan como salida de señal, manteniendo todas las líneas de teclado a 5V (1 lógico) por lo que no se detecta nunca una tecla pulsada. Debe haber algún cortocircuito interno que haga que se envíe tensión por esos pines, lo cual no debería pasar.

Para evitar problemas, al poner de nuevo la ULA en su sitio, dejamos los cinco pines del teclado "al aire". En la foto se ven tres de ellos. Los otros dos están al otro lado.

foto7.jpg
foto7.jpg (68.75 KiB) Visto 5389 veces

¡Y ya está! Con la ULA "inutilizada" para leer el teclado, dicha gestión corre a cargo de este pequeño circuito, que podría considerarse un "cachito de ULA". Ahora el teclado funciona sin problemas.

foto8.jpg
foto8.jpg (40.99 KiB) Visto 5389 veces

A modo de referencia, dejo el código fuente del archivo de configuración para la GAL que he escrito para esta "mini-ULA". Está en lenguaje CUPL:

NOTA: en otro post del mismo hilo (que por desgracia no he podido recuperar) amplío el esquema para que además de teclado, se implemente MIC y altavoz. Debo tener el fichero con las ecuaciones en formato CUPL por ahí, así que en cuanto lo encuentre, actualizao al menos esa parte del post (el fichero de las ecuaciones).

Código: Seleccionar todo

Name     lectura_teclado ;
PartNo   00 ;
Date     26/10/2010 ;
Revision 01 ;
Designer Miguel Angel Rodriguez Jodar ;
Company  Dept. Arquitectura y Tecnologia de Computadores. Universidad de Sevilla ;
Assembly None ;
Location Sevilla ;
Device   g16v8ma ;

/* *************** ENTRADAS *********************/
PIN  2   = IORQ;
PIN  3   = RD;
PIN  4   = A0;
PIN  5   = KB0;
PIN  6   = KB1;
PIN  7   = KB2;
PIN  8   = KB3;
PIN  9   = KB4;

/* *************** SALIDAS *********************/
PIN 15    = D0;
PIN 16    = D1;
PIN 17    = D2;
PIN 18    = D3;
PIN 19    = D4;

/* *************** ECUACIONES *********************/

D0=KB0;
D1=KB1;
D2=KB2;
D3=KB3;
D4=KB4;
ENABLE=!(IORQ # RD # A0);
D0.OE=ENABLE;
D1.OE=ENABLE;
D2.OE=ENABLE;
D3.OE=ENABLE;
D4.OE=ENABLE;
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 4028
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 57 veces
Gracias recibidas: 157 veces
Contactar:

Re: [SPECTRUM] "Bypass" de la ULA para reparar un Spectrum (bypass de teclado, EAR y sonido)

Mensajepor jltursan » 04 Nov 2019, 19:16

La "media-ULA", un hilo histórico :)

Buena iniciativa esto de recuperarlo =D>

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 838
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: [SPECTRUM] "Bypass" de la ULA para reparar un Spectrum (bypass de teclado, EAR y sonido)

Mensajepor Namek » 04 Nov 2019, 19:58

Viendo esto, vuelvo a plantearme la idea que tuve hace tiempo de una ULA simple, osea un integrado lo mas simple posible que solo genere la señal de la pantalla pero sin complicarse con timings ni nada, que solo genere la imagen con el borde y nada mas, por supuesto los efectos con timings no se verían correctos, y el teclado y el audio serían gestionados por este "Bypass".

Las preguntas serían:
¿Cuanto simplificaría esto el diseño de un Clon de Spectrum?
¿Se podría generar la pantalla del Spectrum con una de estas GAL?

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: [SPECTRUM] "Bypass" de la ULA para reparar un Spectrum (bypass de teclado, EAR y sonido)

Mensajepor mcleod_ideafix » 05 Nov 2019, 00:38

Namek escribió:Viendo esto, vuelvo a plantearme la idea que tuve hace tiempo de una ULA simple, osea un integrado lo mas simple posible que solo genere la señal de la pantalla pero sin complicarse con timings ni nada, que solo genere la imagen con el borde y nada mas, por supuesto los efectos con timings no se verían correctos, y el teclado y el audio serían gestionados por este "Bypass".

Las preguntas serían:
¿Cuanto simplificaría esto el diseño de un Clon de Spectrum?

Probablemente nada. El diseño de la ULA ya es bastante simple. Si acaso, la única cosa en la que se podría quitar transistores fuera en la generación YUV, dejando unicamente IRGB. Hay, de todas formas, una "ULA" un poco más simple que la ULA de Ferranti, y es el gate array del Inves Spectrum, en el que la lectura de teclado se hace con electrónica discreta, y es sólo el video y el audio lo que se genera desde el propio gate array.

Namek escribió:¿Se podría generar la pantalla del Spectrum con una de estas GAL?

Lo dudo mucho. Las GALs son muy limitadas en cuanto a interconexión de registros internos, y además tienen pocos. Sólo para generar los timings mínimos para generar a su vez los sincronismos necesitas 9 bits para el contador horizontal (0 a 447) y otros 9 para el vertical (0 a 311). Eso ya son 18 bits de memoria, cuando las GALs comerciales más grandes, las 22V10, tienen 22 bits de registros. Te sobran sólo 3.

De todas formas, habiendo CPLDs que son muy capaces (con una de ellas) de implementar una ULA funcional, usar un puñado de GALs me parece complicarse la vida (porque con una sola no se me ocurre cómo acercarse siquiera a la generación de video)
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
pacopepe
ZX Spectrum 16
ZX Spectrum 16
Mensajes: 7
Registrado: 04 Nov 2019, 15:25
Sistema Favorito: C64
primer_sistema: C64
consola_favorita: TV Games/Pong Clone
Primera consola: Atari 2600
Gracias recibidas: 15 veces

Re: [SPECTRUM] "Bypass" de la ULA para reparar un Spectrum (bypass de teclado, EAR y sonido)

Mensajepor pacopepe » 27 Mar 2023, 12:15

Volviendo al tema, ¿cabría la posibilidad de hacer una emulación de la ULA, al estilo de la VLA82, con un STM32F411 o similar?
Saludos.


Volver a “Taller”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados