Consiste en una pequeña placa, un poco más grande que la ULA original, y que tiene dos filas de pines con la misma disposición que los de la ULA, con el fin de pinchar la placa en el zócalo de la ULA en el Spectrum. Según su autor, funciona en las issues (versiones de placa) del ZX Spectrum de la 3 en adelante. Yo lo he probado en dos placas: issue 3B e issue 4B, sustituyendo a una ULA 6C001E-6 y ULA 6C001E-7 respectivamente.
El módulo no es compatible con la issue 2 (no cabe, se sale por arriba de la placa, y además choca con los conectores de EAR y MIC). Sin embargo, si se consigue enchufar, funciona.
Su autor es 8bits4ver, y se puede encontrar información de ella (y comprarla al precio de 30€ en estos momentos) en esta URL:
http://www.8bits4ever.net/product-page/ ... 2249a6af98
El disipador dorado de la parte superior esconde un chip de Xilinx, una CPLD XC95144XL...
...que está siendo el habitual para implementar este tipo de reemplazos. El disipador sirve a dos propósitos: recoger el calor que desprende la CPLD, y actuar como un separador para evitar que los componentes de la cara superior de la placa hagan contacto con el disipador del Spectrum, que en los modelos issue 3 y siguientes discurre por toda la parte superior. Esta solución, ya lo adelanto, tiene la pega de que la CPLD recibe innecesariamente calor transferido del propio disipador. Una opción es sustituirlo por una capa de cinta adhesiva tipo Kapton, que aisla eléctricamente los componentes y aguanta sin deformarse las temperaturas que provengan de la placa del disipador. La CPLD puede funcionar bien sin disipador, incluso teniendo en cuenta las temperaturas que genera. Otra opción es retirar el disipador y sustituir el regulador 7805 por un equivalente Tracopower para eliminar esa fuente de calor.
Aun si se opta por no hacer nada, el módulo encaja justo en el espacio que hay. El fabricante advierte no obstante que sólo garantiza que quepa en la placa si los chips que suele haber a la derecha de la ULA (los multiplexores para el bus de direcciones y la lógica para el direccionamiento de los 32KB superiores) están sin zócalo. En las fotografías se puede ver que esta restricción afecta a 4 de los 6 chips que hay en esa parte de la placa (y que no están presentes en la issue 6). Yo he optado por ponerlo habiéndole quitado antes el disipador. Así se puede ver cuánto espacio hay realmente entre el módulo y el disipador.
Se puede ver que el módulo permite cerrar la carcasa de un Spectrum 48K "gomas", aunque hay que apretar un poquitín (la carcasa se queda levantada alrededor de 1mm de uno de los lados si simplemente se deja caer encima, sin atornillarla)
Lo he probado en otro Spectrum que tiene los 6 chips a la derecha de la ULA en zócalos. También ha cabido en este caso.
La instalación del módulo no requiere soldar nada. Practicamente todas las ULAs en el Spectrum 16K / 48K van en zócalo, así que el reemplazo consiste en quitar una y poner el otro, cuidando de que los pines queden alineados. Las tiras de pines usadas no dañan tanto el zócalo como lo hace el reemplazo NEBULA, pero al ser pines redondos y no planos como la ULA original, hacen que los contactos del zócalo den un poquito de sí tras haber pinchado uno de estos módulos.
La salida de video de este módulo es, por tanto, la original de la ULA, YUV "modificada". Toda la circuitería con transistores y resistencias que hay a la derecha de la CPLD se encargan de sintetizar estas señales analógicas a partir de las salidas digitales de la CPLD. Probablemente estén usando una variante del circuito de generación de video YUV que se describe en el libro de la ULA de Chris Smith (capítulo "Analog video"). Desconozco si por alguno de los pines se puede recuperar la señal IRGB original. En la placa no se ve provisión para ello. Los únicos contactos que hay en la misma, aparte de los que van al zócalo de la ULA, son los pines del JTAG para programar "in circuit" a la CPLD.
Las pruebas que se han hecho a continuación se han ejecutado sobre un ZX Spectrum issue 4B con procesador Z80 de SGS, el módulo mULA48, un Divide Plus y un adaptador de teclado PS/2.
Todo el circuito se alimenta de 3.3V suministrados por un regulador en el propio móduilo, y que es el componente que más se calienta del mismo, llegando a los 48 grados. Como referencia, la ULA original alcanza los 56 grados tras un ratito de funcionamiento, y el disipador de aluminio, unos 52 grados. Como la CPLD está debajo del disipador del Spectrum, no he podido medir su temperatura.
TIMINGS
El módulo implementa los timings de la ULA del 48K, la versión 6C, y a tenor de las pruebas que he podido hacer, la implementación es precisa.
- Las anchuras de los bordes izquierdo y derecho coinciden con los de la ULA original
- El disparo de la interrupción se realiza a 14336 ciclos de distancia de la primera lectura de pantalla de la ULA
- El bus flotante está implementado y funciona correctamente. Juegos como Cobra se pueden ejecutar sin problemas.
- Los timings en el borde son correctos. Demos como Overscan o Shock Megademo funcionan.
- El funcionamiento en el área de "paper" es correcto. Cosas basadas en el Nirvana engine, Bifrost, etc, funcionan sin problemas.
- No se ha probado el efecto de "ULA snow" pero no hay razón para que no funcione. Intentaré probarlo la próxima vez

COMPATIBILIDAD Y OTRAS CARACTERISTICAS
El módulo implementa en su pin 28 las salidas de altavoz y MIC, como la ULA original, y la entrada EAR. Sobre las salidas, los voltajes medidos en placa (ULA original y mULA48) son los siguientes (en función de los estados de los bits SPK y MIC)
Código: Seleccionar todo
SPK MIC Ferranti ULA mULA48
0 0 0.38V 0.30V
0 1 0.70V 0.65V
1 0 3.55V 3.16V
1 1 3.74V 3.29V
La discrepancia en los valores más elevados, entre la ULA de Ferranti y el módulo mULA48 se debe a que este último trabaja con 3.3V por lo que todas las tensiones que ofrece a la salida no pueden ser mayores de este valor. A pesar de ello, el sonido se oye claro en el altavoz interno, claro que hay que recordar que en las placas issue 3 en adelante existe un transistor en modo seguidor de emisor que amplifica la corriente que circulará por el altavoz. Habría que probar no obstante con un issue 2, en donde la propia señal de salida es la que alimenta al altavoz, sin mediar transistor de por medio.
La entrada EAR se ha probado cargando desde un teléfono móvil. No se han detectado diferencias significativas respecto a la carga usando la ULA original. El módulo no es ni más sordo ni más sensible que la ULA de Ferranti. Usa un LM311 en la entrada, un comparador analógico.
El equipo en el que se ha testeado el mULA48 dispone de DiviDE Plus y adaptador PS/2 a teclado. Ambos dispositivos han funcionado bien con el módulo. El DivIDE Plus se ha usado con Fatware 0.12. Se han probado varios juegos y demos con éxito.
PROBLEMAS
El primer problema lo avisa ya su autor: no se garantiza que el módulo pueda caber bien si los chips de al lado de la ULA están en zócalo, ya que de esa forma el módulo queda levantado y no hace buen contacto. No obstante, en la prueba que hice sí cupo.
La presencia del disipador en la CPLD para hacer de separador entre el disipador y el módulo no me acaba de convencer. Como dije, ese disipador está transfiriéndole calor desde la placa de aluminio del ordenador, haciendo que la CPLD se caliente más sin necesidad. Se podrían haber uisado otros medios, tales como la referida cinta Kapton (probablemente más barata que el disipador), o separadores de goma especial para altas temperaturas.
En la placa que compré pasa algo curioso y es que, probablemente a causa de una mala soldadura, a veces pierdo el brillo. Es decir, a veces ocurre que la pantalla se ve como si toda ella estuviera con el brillo activado. Tocando en la zona donde se encuentra el circuito convertidor de RGB a YUV vuelve a la normalidad. Tendré que repasar algunas soldaduras que veo un poco escasas. Al no haber esquemáticos (y eso para mi también es un problema) tengo que ir un poco a ciegas.
Con todo, el mayor (junto con la falta de esquemáticos) problema que he encontrado es que este módulo parecer no ser compatible con CPUs que sean CMOS, como la versión CMOS del Z80 a 20 MHz. Al colocar una de estas CPUs, que funcionan sin problemas con la ULA de Ferranti, me encuentro con que el Z80 no consigue inicializar la memoria RAM correctamente.
No estoy seguro si el fallo se debe a que es una placa issue 4B, pensada para ser usada con una ULA 6C100E-7, y que dispone de un par de puertas lógicas haciendo un retraso en la señal RAS para usarla como selector del multiplexor del bus de direcciones, o es un fallo independiente de la versión de la placa. El fallo parece afectar a la memoria baja, ya que con mi ROM parcheada que solo usa la memoria alta, consigo (a veces) inicializar el equipo. El test de memoria que escribí llega a poder copiar el patrón de test de la ROM a la pantalla, pero no siempre lo hace y a veces se queda la CPU como atascada. Sospecho que hay algo en el mecanismo de contención de memoria que no está funcionando correctamente. Tendré que probar en alguna otra que no sea 4B y que tenga el Z80 en zócalo (cosa bastante menos probable que la ULA). ACTUALIZACION: he probado en una placa issue 2 (no soportada oficialmente por el motivo que se expone arriba) y en ésta, el Z80 CMOS ha funcionado, así que las sospechas se cierran en torno al retraso de las puertas lógicas que se usan en los multiplexores.
Con un Z80 NMOS (los originales que vienen en el Spectrum), el módulo funciona sin problemas.