Pues esto ha dado mucho juego y diversión.
![Sonrisa :)](./images/smilies/sc_jsmiley.gif)
Como vi que con direcciones parciales era muy complicado seguir la ejecución, probé una barrabasada:
Hacer tres capturas, en cada una de ellas capturar 7 bits del bus de dirección y solapar ciertos bits entre ellas como comprobación. Así que hice lo siguiente:
- Primera captura: A0-A6
- Segunda captura: A5-A11
- Tercera captura: A9-A15
No las tenía todas conmigo, pero me hice un pequeño programa en C que leía las tres capturas, comprobaba que los bits de solape coincidían e iba componiendo las direcciones con esos tres trozos.
Tuve que hacer un ajuste inicial, porque las primeras muestras no coinciden, pero como muy al principio se salta a la dirección 0x8011 es sencillo ajustar las tres muestras para que empiecen igual con esta referencia, ya que tenemos cambios suficientes al principio para saber como tienen que evolucionar los tres segmentos de la dirección. Me parecía poco probable que no fuesen derivando los tres muestreos, pero, por probar...
El caso es que de los cuatro millones y pico de muestras que saqué no había ningún mismatch entre los solapes, así que pintaba bien.
Cogí por un lado el barrido del bus de direcciones, por otro mi desensamblado de la ROM de arranque y poco a poco fui avanzando, reduciendo los bucles a mano (intenté automatizarlo pero se me complicó demasiado, así que a fuerza bruta).
El resultado de este trabajo que me ha llevado un par de horitas es
esto, de donde se pueden sacar (creo yo) las siguientes conclusiones:
- El chequeo de la RAM principal (la que cambié completamente) es correcto (tengo que revisar unos chequeos que hace, porque parece que encuentra errores de paridad, pero creo que invertí la lógica en mi cabeza al comprobarlo
![Sonrisa :)](./images/smilies/sc_jsmiley.gif)
). Va escribiendo posición a posicion en los 64Kbytes de RAM principal y no encuentra ninguna inconsistencia entre lo que escribe y lo que lee, ya que nunca entra en la parte de código donde apunta los errores en algunas variables.
- El chequeo de la RAM de video es un desastre. Solo chequea el primer byte y falla. En el caso de la RAM de video, no se sigue comprobando y hace como si no pasara nada, pasando a inicializar las rutinas de video.
El problema es que la rutina de video se basa en un segmento de memoria donde apunta, entre otras cosas, la dirección de retorno al programa llamante. Este segmento de datos lo coloca en memoria de video, porque se ve que ix apunta a 0xf0 y antes de entrar en esta parte mapea la memoria de vídeo a 0x0000 y 0x4000. Luego utiliza el registro ix para direccionar esta memoria y en un momento dado, presumiblemente cuando intenta volver a la dirección de retorno hace:
ld l,(ix+006h)
ld h,(ix+007h)
jp (hl)
Esto provoca la siguiente secuencia en el bus de direcciones:
2.772878583: 0x84b1 ld l,(ix+006h)
2.772879583: 0x84b2
2.772880583: 0x84b3
2.772882583: 0x00f6 -->(ix+006h)
2.772883333: 0x84b4 ld h,(ix+007h)
2.772884333: 0x84b5
2.772885333: 0x84b6
2.772887333: 0x00f7 -->(ix+007h)
2.772888083: 0x84b7 jp (hl)
2.772889083: 0x0909
...
2.789069917: 0x2000
...
2.800343333: 0x3000
...
2.811616750: 0x4000
...
2.822890167: 0x5000
...
2.834163583: 0x6000
...
2.845437083: 0x7000
...
2.856710500: 0x8000
Es decir, salta a 0x0909 que no puede ser un retorno a la EPROM (si miramos el listado, vemos como la dirección de retorno se inicializa a 0x8ae1):
2.772592833: 0x8ad8 ld hl,video_ret_addr (8ae1)
2.772593833: 0x8ad9
2.772594583: 0x8ada
2.772595333: 0x8adb ld (00f6h), hl
2.772596333: 0x8adc
2.772597083: 0x8add
2.772599417: 0x8ade jp vdriver (8414h)
, y a partir de ahí, se recorre todas las direcciones de una en una (entiendo que porque no lee más que NOPs) hasta la 0x8000, que es de nuevo el comienzo de la EPROM, y vuelta a empezar.
Tarda en hacer esto unos 2.8 segundos, que es el tiempo que pasa entre pitidos aproximadamente.
Así que todo apunta a que la RAM de vídeo está mal, o no la lee bien por alguna razón. Lo que me extraña un poco es que se la encuentre toda a cero, no sé, esperaría un comportamiento más errático. Si bien es verdad que hay una fase donde pone a cero una buena parte de ella, de todos modos, estaría bien saber si lo que está mal es la RAM, o el acceso a la RAM.
Pues ha estado bien esto, lo malo es que ahora cierro los ojos, y ya solo veo mnemónicos de ensamblador de Z80.
Supongo que lo suyo será cambiar la RAM de video, veo que es de tipo AM9016EPC, pero son nada menos que 18 chips. ¿Sabéis si esta RAM es fácil de conseguir o cuales son equivalentes?