(en la sala de los diferenciales)
House: El paciente refiere incapacidad para arrancar. Cuadraditos con flash, cambiantes, y un extraño ruido que cruza toda la pantalla y se superpone a la imagen. La placa es una issue 6A.
Foreman: tiene toda la pinta de un típico fallo de la RAM inferior. Busca el chip o los chips dañados y sustitúyelos. Para por la tarde ya estará cargando el Sabre Wulf como si nada. ¿Habéis mirado las tensiones de la RAM?
Chase: según el informe de urgencias lo miraron con un polímetro digital: los valores eran perfectos: 12V, y -5V. La tensión de 5V también es correcta, ya que la ULA da imagen.
Cameron: ¿y podemos fiarnos de la ULA?
House: sí, claro. Estamos aquí de cháchara porque a un tonto en urgencias no se le ocurrió cambiar la ULA por otra por si se había jodido. Claro que la ULA está bien! Es lo primero que cualquier enfermerito mira. De todas formas, no estaría mal que lo volviérais a comprobar.
Cameron: hay cuadraditos y no hace intención de arrancar. Sugiero comprobar el Z80A. Incluso con la memoria baja en mal estado debería hacer el intento. Explicaría los cuadraditos en flash.
Foreman: Pero no explica el ruido en la pantalla. Un fallo en la memoria baja explica ambos síntomas: la memoria no trabaja bien, y el Z80A no puede ejecutar el test de memoria de la ROM, lo que explica el cuelgue. Además, la memoria en mal estado puede causar ruidos en los circuitos adyacentes, o en sus propias lineas de datos, lo que hace que la ULA recoja basura y la muestre en la pantalla: un fallo en la memoria baja explica ambas cosas.
House: Bien. Cameron, testea el Z80A, Chase y Foreman: averiguad qué chip de la memoria baja es el que está pidiendo a gritos que lo tiremos a la basura.
(Cameron sale primero, al cabo de un ratito vuelve)
Cameron: el test del Z80A dio negativo para cuelgues, reset permanente y fallo en los buses. Obviamente, la CPU intenta arrancar pero no puede. Los niveles de MREQ, RD, M1 y WR son normales. La señal de CLK de la ULA también es normal.
(un rato después, Chase y Foreman en la sala de tests de memoria baja)
Chase: Bien, arranca el test de memoria baja del cartucho ROM. Este test vuelca una pantalla de prueba desde la memoria ROM hasta la pantalla. El programa que lo realiza no usa la memoria principal en ningún momento como almacenamiento temporal. No hay pila ni se usan interrupciones. Si hay algún bit de esta memoria que falla, lo veremos enseguida: la pantalla se deivide en tres zonas. En la primera mostramos un patrón de 8 líneas de caracteres, cada una de ellas muestra el estado de un único bit a 1 y los demás a 0. En la segunda zona mostramos la versión en negativo de la primera zona: cada línea de caracteres muestra un bit específico a 0 mientras los demás quedan a 1. La tercera zona muestra un enrejado para comprobar si hay ruido entre bit vecinos.
Foreman: .... Chase, aquí hay algo raro.
Chase: ¿Qué quieres decir, Foreman? ¿Qué sale en la pant.... ¡¡oh, Dios mio!!
Foreman: ¡todos!, ¡están todos los chips de memoria baja jodidos!. ¿Qué le ha pasado a este trasto?
(fundido en negro para publicidad)
PUBLICIDAD: http://www.zxprojects.com
(de vuelta en la sala de diferenciales)
House: (viendo la captura de pantalla del ordenador) ¡Chase! ¿quieres decirme que esto no lo has dibujado tú como cuando te sacas la minga y dibujas con el pipí en la arena? ¿O acaso es que has dejado que emerja el negrata graffitero que duerme dentro de Foreman y se ha ensañado con la pantalla?
Foreman: repetimos las pruebas muchas veces. En todos los casos, no hay chip de memoria baja que se salve. Todos, en algún sitio tienen fallos.. El ruido sigue aunque no se note en esa captura, claro está.
Chase: y la memoria alta está bien. Para poder extraer esa pantalla incluimos en la ROM de pruebas una rutina que remeda el SAVE de la ROM de Sinclair. De esa forma podemos sacar hacia afuera cualquier zona de memoria del ordenador enfermo, siempre, claro está, que tengamos algo de memoria RAM en buen estado para usar como pila, ya que la rutina que usamos es la mismita que hay en la ROM, y ésta necesita guardar algunas cosas en la pila. Además, hemos incluido otro test que lo que hace es primero volcar la pantalla-patrón en memoria alta, a partir de la posición 32768, y los volcados a memoria de pantalla los hacemos desde allí. Lo que hemos sacado del ordenador muestra que la memoria superior, al menos sus primeros 6144 bytes, están correctos. En cambio la memoria baja...
House: quitad todos los chips de la memoria baja, pero sin romperlos. Aún tenemos que averiguar si realmente están todos estropeados. Poned zócalos y traed el adaptador SIMM para sustituir la memoria extraida.
(Foreman y Chase salen)
Cameron: ¿y el ZX8401? Recuerda que desde el issue 5 en adelante se sustituyeron seis circuitos integrados por esta pequeña CPLD, que también está marcada como PFC1306P. Y es ella precisamente quien gobierna los accesos desde la CPU hasta la memoria RAM, tanto inferior como superior. Nuestra ROM de pruebas funciona porque precisamente tiene comunicación directa con la CPU, pero la memoria...
House: ¿y cómo explicas que la memoria superior funcione?
Cameron: a fin de cuentas, en el ZX8401 hay módulos distintos. José Leandro Novellón estudió su comportamiento y descubrió que no es más que una forma barata de empaquetar esos seis integrados originales. Si esos integrados están de alguna forma dentro del ZX8401, alguno de ellos, quizás uno de los 74LS157 asociados al direccionamiento de la memoria de pantalla, estén mal.
House: el ZX8401 no tiene dentro seis circuitos integrados juntitos como niñas que se quedan a dormir en el salón de la casa de una de ellas jugando a ver a quien le han crecido más las tetas. Es una CPLD: desde el punto de vista funcional, equivale a esos seis circuitos, pero desde el punto de vista electrónico, es completamente diferente. Es un único chip más complejo. Si se ha jodido, no deberíamos poder acceder a la memoria superior...
House:... además, si tienes razón, este Spectrum está jodido. No tenemos repuestos para ese chip. Tiene que ser otra cosa. Además, ¿cómo explicas el ruido? El ZX8401 comparte las lineas de direcciones con la memoria baja, pero no el bus de datos, que es de donde la ULA coge la información para presentar la pantalla... y su ruido.
(Foreman y Chase vuelven justo cuando House está aún hablando)
Foreman: no tan deprisa, House. Hemos puesto el módulo SIMM y vuelto a ejecutar el test de memoria baja, pero esta vez cargando una pantalla del Jet Pac. Esto es lo que tenemos:
House: ¿no os había dicho que no me enseñéis capturas de pantalla cuando estoy hasta arriba de whisky?... O quizás no es eso. Déjame ver la pantalla original.
Foreman: Aquí la tienes. He marcado en rojo, verde y azul los tres tercios de 2048 bytes que forman la pantalla. Cada tercio contiene 8 filas de caracteres, que puedes ver resaltadas.
House: bien. A ver niños, repasemos lo que sabéis de la disposición de la memoria de pantalla del Spectrum. Una dirección de memoria tiene 16 bits. Las direcciones de memoria que pertenecen a la zona de la pantalla son de la forma 010X XXXX XXXX XXXX...
Cameron:... donde esas X se distribuyen de la siguiente forma:
Código: Seleccionar todo
010 BB SSS FFF CCCCC
BB = numero de bloque: 0,1,2 (bits 3 y 4 de la fila)
SSS = numero de scan dentro de una posicion de caracter (0 a 7)
FFF = numero de fila dentro de un bloque (0 a 7). Si se junta con BB, forma BBFFF y es el número de fila de caracter (0 a 23)
CCCCC = numero de columna (0 a 31)
House: muy bien! Ahora fijáos: donde debería ir el rótulo de Jet Pac tenemos una copia de lo que hay en el tercio inferior. El segundo tercio en cambio está en su sitio. Da la sensación de que cuando BB debería vale 00, acaba valiendo 10. La primera B corresponde al bit 12 de la dirección, y la segunda, al bit 11. ¿Está la línea A12 jodida?
Foreman: Pero el segundo tercio se muestra normalmente, y eso corresponde a BB=01. Ambos bits de direcciones, el 11 y el 12, conmutan de 0 a 1 y de 1 a 0 sin problemas. Si A12 estuviera fijada a 1, no veríamos el segundo bloque, sino que veríamos basura de la zona de atributos (BB=11)
Chase: además, A12 interviene durante el uso que hemos hecho de la RAM superior. Si está jodida, no es en la parte del Z80A, sino en el tramo de bus que hay desde el ZX8401 hasta la RAM inferior.
House: lo que quieras, majo. Pero mira además esto: la información está repetida. Hay dos símbolos de copyright uno justo encima del otro. Es como si las líneas se pintaran 8 si, 8 no... ¡¡Dame el dibujo original!!
(House se sienta delante del Paint Shop Pro y comienza a mover bloques de pantalla)
House: ¿qué os parece?
Foreman: es... ¡idéntico a la captura de imagen!
House: vale. Esto es lo que obtienes cuando copias cada linea de caracteres impar en la línea de caracteres par que tiene justo encima. Si a eso le añades que he cogido el tercio inferior, ya "liado" y lo he copiado en el tercio superior...
Cameron: pero eso significa que...
Chase, Cameron, Foreman: ¡¡A12 no es la única línea de dirección jodida!!
House: ¡Exacto! ¿Y qué linea de dirección es la responsable de cambiar de carácter en carácter dentro de un tercio de pantalla?
Cameron: según la disposición de la pantalla de Sinclair, después de pintar un scan de píxeles de una línea de caracteres se dibuja el correspondiente scan de píxeles de la siguiente línea de caracteres...
Chase: dado que hay 32 caracteres en cada scan, eso nos da que la distancia entre una posición dentro de una fila de caracteres par y su equivalente en la siguiente fila, impar, ¡es 32!
Foreman: 32 es 2 elevado a 5, es decir, la línea A5, que corresponde al bit menos signficativo de la posición de fila. Sólo se pintan filas impares, lo que significa que el bit menos significativo de ese valor es siempre 1. Cuando se quiere acceder a la fila 2, en realidad se está accediendo a la 3.
Cameron: pero habíamos descartado a la ULA como causante de esto. Si está leyendo mal la información de pantalla...
House:... es porque alguien está dándole mal esa información. La ULA sólo lee la memoria, monada, no escribe en ella. Eso es prerrogativa exclusiva de la CPU... y la CPU sólo puede acceder a la memoria a través del ZX8401.
Chase: Además... fíjate en el esquema de José Leandro:
Chase: A12 y A5 convergen en el mismo multiplexor. Es más, son las entradas A y B de uno de los cuatro multiplexores que seleccionan fila/columna para la memoria baja. Su salida va al mismo bit del bus de direcciones de la memoria baja. En el Z80A están bien. Es el ZX8401 el que lo está fastidiando todo.
House: en ese caso... hay que ir pensando en sustituir ese componente.
(fundido en negro y publicidad otra vez)
Ya he puesto la URL de la web. No quiero ser pesado y volver a ponerla.
Chase: Basándome en el trabajo de José Leandro y de Yarek Adamski he preparado un repuesto usando una CPLD de Atmel, una 2500C. Es más que suficiente para suplir las funciones del chip original, y además tiene el mismo formato. Sin embargo, las patillas no guardan el mismo orden, con lo que he diseñado una pequeña placa que haga las conexiones desde el zócalo original del ZX8401 a la nueva CPLD.
Chase: es pequeña, pero puede que no lo suficiente para evitar chocar contra el disipador del regulador. En cualquier caso, no podemos hacer gran cosa con el espacio que tenemos ahí.
Foreman: además, hemos encontrado una soldadura fría en uno de los condensadores aledaños al ZX8401. Lo hemos arreglado pero no parece haber surtido efecto.
Cameron: acaban de llamar del Museo de Informática de la ETSII de Sevilla. Pueden dejarnos un ZX8401 que funciona, para probarlo en este equipo.
House: Cameron, haz las pruebas. Chase: haz un par de plaquitas PCB del reemplazo del ZX8401, pide las CPLD's, y reza para que al final no nos hagan falta. La huelga de transportistas puede hacer que las CPLD's lleguen cuando ya sea demasiado tarde...
(después de las pruebas de Cameron)
Cameron: el ZX8401 del Spectrum averiado funciona en otro Spectrum. El ZX8401 de ese otro Spectrum no resuelve nada de nada en el averiado.
House: No es el Z80A, no es la ROM, no es la ULA, no es el ZX8401, no es la memoria superior (Foreman quitó temporalmente las 8 resistencias que acoplan el bus de datos de la memoria de pantalla con el bus de datos de la memoria superior y la ROM), ¿qué es?
Foreman: error en la temporización de RAS y CAS. Sugiero comprobar los condensadores que retardan esas señales.
House: en el issue 6A quien retarda RAS y CAS en la memoria inferior son un par de inversores, y el retraso es de unos 18 ns. Ya sea han probado y están bien.
Cameron: ¿y el módulo SIMM? Podría estar mal.
House: el módulo SIMM funcionó estupendamente en un issue 3B. Lo comenté en el foro de speccy.org.
Chase: sí, pero recuerda lo que pasó con la ULA.... ¡ruido! y era problema de temporización, y precisamente con una ULA modelo 6C001-7, que es la que tiene este Spectrum.
House: De acuerdo. Cameron: quita el módulo SIMM y busca memorias 4116 genuinas para poner. Volved a hacer el test del Jet Pac, a ver si A12 y A5 han vuelto a su ser.
(al rato vuelven con los resultados del test)
Cameron: La pantalla vuelve a estar ordenada, pero sigue habiendo ruido y bits que cambian de estado de forma aleatoria.
House: ¿mediste las tensiones?
Cameron: sí, sin memorias y luego, con las memorias insertadas. 12V y -5V.
House: El ruido... la clave está en el ruido... ¡¡Dadme el oscilsocopio!!
House: Vamos a hacer el recorrido del ruido, desde sus consecuencias, hasta averiguar su origen. ¿Dónde es más evidente?
Todos: ¡En la pantalla!
House: Bien. El componente que genera la señal PAL que vemos es el LM1889. Veámoslo. Si mido aquí, tendremos la subportadora de color de 4,43 MHz, pero.... ¿qué es esto? ¿Una señal superpuesta a la portadora? Retirad el LM1889 enseguida.
(después de retirarlo)
Chase: el ruido ha desaparecido de la pantalla, pero la memoria sigue haciendo cosas extrañas.
House (con la sonda del osciloscopio): Sigamos la senda del ruido. ¿Ha desaparecido del todo? Eso parece. Un LM1889 jodido no es extraño. Mmmm, aquí vuelve a aparecer, pero en lugar de haber una señal de 4,43 MHz con la señal superpuesta, sólo está esa señal encima de una componente de contínua... ¿qué genera en el interior del Spectrum una señal de unos 114 kHz?
Cameron: ruido en otros integrados
House: eso es ruido blanco, por agitación térmica. No es una señal periódica como ésta.
Foreman: ¿la interrupción vertical de la ULA?
House: 50 Hz. Muy lejos de esta frecuencia.
Chase: ¿en qué pin estás midiendo esa señal...?
House: (después de una pausa al comprender lo que pasa)...
House: ...en la línea de alimentación de 12V que va al LM1889.
Foreman: ruido de 114kHz en la línea de 12V, eso sólo puede venir de...
Cameron: ¡el conversor DC-DC que genera esos 12V a partir de los 9V de la alimentación. ¡¡El transformador interno!!
House: ¡Claro! El oscilador que forman TR4 y TR5 opera precisamente a esa frecuencia. La tensión de 12V se obtiene por rectificación usando un diodo y un condensador para filtrar la componente alterna residual.
Chase: la componente continua existe, porque las medidas así lo atestiguan: hay 12V.
House: eso indica que el diodo funciona, pero si hay picos, es que el condensador no filtra. ¿Qué pasa si pongo la sonda del osciloscopio en el ánodo y en el cátodo de D19?
House: Anodo: señal alterna de 114 kHz, con una amplitud de unos 15Vpp.
House: Cátodo: señal contínua de unos 12V, con picos periódicos de 114 kHz, y una amplitud de 15V...
House: D19 está bien. C44, el condensador de filtro, está fallando. No filtra.
(después del cambio de C44)
House: esto es lo que pasa. En urgencias midieron la tensión de todos los raíles de potencia con un tester y los dieron por buenos... porque el tester no puede enseñarte el ruido superpuesto. La memoria SIMM ayudó algo, ya que no usa esa tensión, pero su temporización es incompatible con el circuito RAS/CAS de la ULA. Por eso veíamos líos en A12 y A5. Cuando volvimos a las memorias originales 4116 desapareció el lío en la pantalla. No lo vimos en la primera prueba porque la soldadura fría que detectó Foreman realmente estaba jodiendo el asunto un poco. Sólo cuando hemos vuelto a verificar las tensiones con el osciloscopio hemos detectado el origen del ruido. En realidad el ruido siempre ha sido el causante, lo hemos tenido delante de nuestros ojos, y lo habíamos estado desechando atribuyéndolo desde el principio a un fallo no relacionado con la parte digital. No había ningún chip de memoria estropeado... sólo estaban mal alimentados.
(días más tarde)
House: bien, señor ZXevious. Parece que al final su Spectrum sí que funcionará. Aquí lo tiene usted vivito y coleando...
Y además, jugando precisamente al Xevious...