Retomamos los parches (después de muuuucho tiempo) con uno que ha dado bastante la lata.
Espero no tardar mucho en poner otros que tengo pendientes de subir en todo este tiempo.
Este juego me fue remitido por Fabio de MSX-Solutions, el cual ha realizado un video enseñando una partida completa al juego fixeado.
Agradecerle a él, y , como no, al genial Araubi, que han sido mis probadores de los fixes que iba haciendo.
Para que podáis entender un poco como está estructurado el juego, y la razón de que el parche que había hasta ahora no funcionara, os voy a poner un poco en antecedentes, ya que este juego tenía cosas mal por todos los lados:
Para empezar, el juego inicia con una carga BASIC, que carga los ficheros BIN principales.
La Fase 1, “va incluida” en la carga inicial, y después, el resto de fases, cargan ficheros numerados como 00 (Fase 2), 01 (Fase 3), …. 08 (Fase A) y por último el 09 (Pantalla Final).
Por cada fase, carga dos ficheros, un Fxx y un Ixx. El fichero Ixx contiene los gfx de fondo de la fase (tiles), y del enemigo final “comprimidos” (después explicaré como hace esto). El fichero Fxx contiene código, datos y algún gráfico adicional.
El parche que había hasta ahora, lo que decía era "coger el fichero F02 (Fase 4) y sustituirlo por el F00 (Fase 2) que era el que tenia el fallo". ¿Problema a esta solución? Cada fichero Fxx carga el siguiente, con lo cual de la Fase 2, pasaba a la Fase 5. Se perdían todas esas fases intermedias y la fase 2 no tenía el fondo que debía.
Eso sin considerar el resto de fallos que después veréis que también seguía teniendo:
- Primero de los fallos: En varias de las fases, al acabar, la rutina que pone el texto de "Fase xx", estaba mal (algunas estaba mal la dirección a donde tenía que saltar, con lo cual, se colgaba, otras saltaba directamente a la rutina de carga de fase nueva sin pasar por el enemigo final, otras el fallo estaba en la rutina de carga de nueva fase, donde la dirección a donde saltaba para poner el texto, no era correcto, y generaba un nuevo cuelgue). También hay una fase en la que se olvidaron de poner la rutina de impresión del texto de próxima fase.
- También en varias fases, ocurre una cosa curiosa. En la rutina que espera pulsar el disparo para seguir, estaba mal la dirección de retorno, y en vez de volver a la rutina que debía, lo que hacía era saltar a la rutina de carga de siguiente fase. Esto lo que hace es que al perder una vida, y presentar el texto de vidas, pues pasábamos de fase directamente (y sin pasar por el enemigo final).
- En todos los ficheros Fxx se han arreglado los tamaños. Deben tener todos la longitud 4A00h y algunos eran mas largos. Al no usar la longitud de la cabecera y cargar todo el fichero, esto generaba que se borraran partes de código que no se debía.
- Vamos con una de las modificaciones mas gordas: Fase 6, un enemigo final que antes no se veía, por algunos de los fallos que comentaba arriba, ahora se ve…. Con un problema... tiene los gfx corruptos y con los colores donde no deberían. Revisando el fichero I04 que es el que corresponde a esta fase, veo algo que no me gusta, y es una zona de 512 bytes rellenos del texto “DISCOVERY INFORMATICA LTDA.”. Posiblemente al sacar el DSK del disco original, el disco tendría alguna corrupción y ha cogido el sector que no debía en esta parte. Dado que el DSK que hay actualmente (o por lo menos los que yo he visto), no parecen ser el original, he creado un fix analizando la rutina “compresora” y cogiendo parte del fondo de la fase que se parecía mucho en la parte de abajo del enemigo final, y eso si, conservando el tamaño final de la imagen para que no quede corrupta. De este fix, quedan algunos errores gráficos en la base del enemigo final, pero son menores, y no tienen nada que ver con cómo se veía antes.
Otro de los mayores problemas del juego, y que se ve en todas las fases que tienen fondo, es un cuadrado corrupto en la parte de abajo. Esto no es debido a que los ficheros que se cargan estén mal. El problema viene por que los ficheros que se cargan (Fxx y Ixx) tienen una cabecera normal de fichero BIN, que además no es usada por el programa de carga, ya que siempre carga estos ficheros en la misma dirección de memoria (Ixx en 8100h y Fxx en 8C00h). Al tener esa cabecera, lo que hace es cargar ese fichero 7 bytes antes de esas direcciones. Una vez cargado el fichero Ixx, y después de hacer la descompresión, el fondo queda entre la dirección 4000h y 8BFFh. Supongo que podréis ver el problema si intentamos cargar un fichero en 8C00h con su cabecera 7 bytes antes…. Modificado el loader para que cargue los ficheros sin la cabecera y no los cargue 7 bytes antes de la dirección correcta (8100h o 8C00h) y modificados los ficheros necesarios para quitarles la cabecera que no se necesita (Todos los Fxx y los Ixx).
- También he añadido una nueva “rutina” para que cuando se acaba el juego y tiene que cargar el menú de nuevo, no lance un Syntax Error. El problema que había es que, lo que hace al final, es cargar desde ASM de nuevo el fichero BASIC en memoria, y lo ejecuta. ¿Problema? Para que el fichero BASIC funcione como debe, en la dirección 8000h tiene que tener un byte 00h. Como en toda la memoria se han cargado gráficos, lo más probable es que en esa dirección haya cualquier cosa menos un byte 00h. Solución: mi rutina hace que antes de cargar el fichero BASIC, pone un 00h en esa dirección.
- Hablando de la pantalla de High Score, si alguno habéis llegado a esta parte, os habréis dado cuenta que parece que no se puede escribir el nombre. Es debido a que solo detecta las teclas mayúsculas. Si de casualidad tenemos las teclas en minúsculas, no escribe nada. Arreglado para que detecte tanto mayúsculas como minúsculas.
- Por último, varias modificaciones en todos los Fxx y en algunos BIN iniciales: Arreglados varios valores erróneos enviados al PSG (FEh a BEh) y (C7h a 87h).
Descripción de los ficheros Ixx:
- Comienza con un salto a la rutina "descompresora".
- Dos bytes que son la dirección hasta donde va a leer la pantalla.
- Dos bytes con la dirección donde va a saltar al acabar de descomprimir en RAM la pantalla. (Esta rutina lo que hace es poner la información descomprimida del fondo, desde 8100h que es donde se ha descomprimido, a 4000h, con una longitud de 4C00h)
- Dos bytes con un offset a sumar a 8100h donde se va a copiar los datos comprimidos, y de hay se leerán para descomprimir en 8100h (si, es un poco lioso...).
- Un byte que usará para ver los datos repetidos (Puede variar dependiendo del fichero).
- A partir de aquí:
- Si se encuentra un byte distinto del anterior, se escribe directamente en el buffer.
- Si el byte es el anterior, se leen los dos siguientes. El primero es el número de veces que se va repetir, y el segundo el byte a repetir (Ej: 16h 65h 00h, se copiarán en el buffer 101 bytes 00h)