Mensajepor zup » 12 Dic 2012, 21:36
Caso práctico y solicitud de corrección de chapuzas:
Vale, me he pegado un bueno rato pasando a ficheros "limpios" el Rocky Horror Show de 128k, pero me ha quedado una chapuza. La descarga de este post está unos mensajes más adelante.
Descripción breve:
------------------------
- Cargador original en código máquina, con su propia rutina de carga.
- Carga (por este orden) las páginas 5, 0, 1 y 3 (completas).
- Después mete la página 2 y carga dos bloques de código.
- Por último mete la página 0 otra vez y salta al inicio del código.
Cosas a destacar:
-----------------------
Ha habido dos cosas que me han llamado la atención. Lo primero es que carga la página 5 completa. Eso significa que el momento en que lo hace, machaca el BASIC, zona de variables y todo lo que pilla por medio. En ese momento, además, la página 5 está dos veces en memoria (una en 4000h, y la otra en C000h).
La otra cosa que me ha llamado la atención es que los dos últimos bloques se deben cargar en la página 2, pero en vez de hacerlo en el segmento 8000h lo hace paginando la página 2 en el segmento C000h.
Problemas:
---------------
El primer problema ha sido la página 5. Si se carga la primera, el casque está casi asegurado. Tampoco puedo cargarla la última, porque tengo la memoria ocupada. La solución ha sido cargarla temporalmente a la página 6, y hacer una rutina a partir de la dirección 16384 para paginar, copiar de la 6 a la 5, poner el stack a martillazos en su sitio y saltar al inicio.
El segundo (y más mosqueante) problema es el hecho de que he sido incapaz de cargar correctamente la página 2. Este hecho aparentemente trivial (cargar dos bloques de código en su sitio) no se realizaba correctamente y todavía no sé por qué. ¿La solución? No la he encontrado. He usado el ZX Spin, he puesto un breakpoint en la dirección de ejecución del código y cuando ha parado el programa he sacado la página 2 tal cual estaba en la memoria con la opción que tiene.
Tercer problema (también mosqueante). A pesar de todo (stack en su sitio, páginas metidas en RAM correctamente), al ejecutarse se corrompe la pantalla de título (no la de carga, sino la que viene después de los rayos). El juego aparentemente se ejecuta bien, pero no sé por qué lo hace.
Descripción del cargador BASIC:
---------------------------------------
Como el resto de juegos 128k que preparo, usa el cargador "mutado" de Spellbound (es MUY efectivo). En los DATA de la línea 140 está la rutina de pagina-traslada datos-despagina; en los DATA de la línea 200 esta mi rutina de pagina-traslada datos-despagina-stackea-ejecuta.
Las líneas 150 en adelante cargan datos en la página 2 y luego los mueven a la página que se indique en A. Es muy sencillo y nunca falla.
Hay una "chapuza" que es que la pantalla de carga se carga dos veces. Está presente por separado en el juego, y también se copia al trasladar los datos de la página 6 a la 5. Se podría quitar el archivo del disco, o hacer el fichero rhs.5 más pequeño y trasladar menos datos. También quedan restos (PAUSEs, CLS extraños) de mis pruebas de depurado.
Pues eso... ¿alguno de los grandes entendidos del Spectrum puede mirar esto por encima a ver si detecta de donde vienen los fallos que he encontrado?
Última edición por
zup el 13 Dic 2012, 21:05, editado 2 veces en total.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!