Salvando ando... parches para el Firfurcio

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Salvando ando... parches para el Firfurcio

Mensaje por zup » Mié Feb 26, 2014 2:43 pm

Estoy pasando a un nuevo nivel con mis conversiones a disco... ahora estoy examinando qué opciones tengo para que los juegos carguen o graben a disco. Como primer experimento, toca Supervivencia: El Firfurcio.

Voy a hacer un spoiler aquí: el parche es una chapuza. Es mi primer experimento y tengo ideas para mejorarlo, pero de momento funciona y así se queda.

Empecemos un poco con los datos básicos sobre el juego. Voy a usar la versión publicada en Microhobby (hay una en WOS algo diferente).

El juego carga en la dirección 28657, y durante su ejecución vemos que el stack anda por debajo de la dirección 28000. Eso nos deja mucha memoria libre para meter rutinas de carga y grabación a disco. Ejecutamos el juego y empezamos a buscar 1366 (punto de entrada a LOAD, otra variante popular es 1378) por toda la memoria. Mala suerte, no están ninguna de las dos.

Probemos con 1218... vale, está en la dirección 30731. Si subimos algo más arriba, vemos que la rutina de grabación de datos empieza en la dirección 30722, y que graba 544 bytes a partir de la dirección 34144. Ya tenemos la rutina de grabación localizada. ¿Cómo localizamos la de carga?

Pues bueno, ya sabemos dónde debería cargar y cuántos datos debería cargar... así que buscamos 34144 ( o podríamos buscar 544, a veces los juegos primero cargan los datos en otra parte y luego los mueven). Después de unos cuantos saltos, aterrizamos en 30764. Poco más abajo hay un call 2050 (que a su vez hace un call 1366, la rutina de carga de la ROM), y si subimos vemos que la rutina de carga empieza a cargar registros en 30761.

Así que mi parche me ha quedado algo así...

Código: Seleccionar todo

dos_open   equ 262
dos_close   equ 265
dos_abandon   equ 268
dos_read   equ 274
dos_write   equ 277
dos_set1346   equ 319
dos_free_space   equ 289
BANK678      equ 23399
BANKM      equ 23388
; estas definiciones pueden usarse en otras rutinas

rutload      equ 27000
rutsave      equ 27100
saveini      equ 34144
savelen      equ 544
loadini      equ 34144
loadlen      equ 544

; inicio

org rutload

; paginar DOS
ld a,$07
call paginar   ; poner ROM2/RAM7 (configuración para +3DOS)

; abrir fichero
ld bc,$0503
ld de,$0002
ld hl,fichero
call dos_open
jr nc,salir

ld bc,$500
ld hl,loadini
ld de,loadlen
call dos_read   ; se lee el bloque
jr nc,salir

cerrar:
ld b,5
call dos_close   ; se cierra el fichero
jr nc,salir

salir:
; paginar ROM BASIC
ld a,$10
call paginar
; retornar al BASIC
ccf ;cuidado: en la rutina de disco y en la de cinta, el acarreo significa lo contrario
ret

; rutina de paginación
; necesita la página a establecer en a
paginar:
di
ld bc,32765
ld (BANKM),a   ; actualizamos BANKM
out (c),a   ; paginamos
ei
ret

; variables

fichero:
; es el nombre del fichero con los datos
db 'FIRFURCI.SAV',$ff

org rutsave

; paginar DOS
ld a,$07
call paginar   ; poner ROM2/RAM7 (configuración para +3DOS)

; abrir fichero
ld bc,$0503
ld de,$0203
ld hl,fichero
call dos_open
jr nc,salir2

ld bc,$500
ld hl,saveini
ld de,savelen
call dos_write   ; se lee el bloque
jr nc,salir2

ld b,5
call dos_close   ; se cierra el fichero
jr nc,salir2

salir2:
; paginar ROM BASIC
ld a,$10
call paginar
; retornar al BASIC
ccf
ret

;parches
org 30722
db 0,0,0,0
db 0,0,0
db 0,0
call rutsave

org 30761
db 0,0
db 0
db 0,0,0,0
db 0,0,0
call rutload


El parche consiste en una rutina de carga y otra de grabación. La de carga abre un fichero y lo carga en las direcciones que hemos averiguado antes. La de grabación crea un fichero (si no existe) y graba los datos. Si hubiera ya un savegame, se renombra a .BAK y graba el nuevo save.

Como tengo memoria de sobra, he puesto una rutina a partir de la dirección 27000 y la otra a partir de la 27100. Una vez parcheado el juego, deberíamos grabar todo a partir de la dirección 27000, y en el cargador BASIC poner un CLEAR en 26999.

Chapuzas/mejoras:
Este parche está hecho como experimento, admite muchas mejoras. Entre ellas:
- Las rutinas de SAVE y LOAD tienen muchos puntos en común, podrían fusionarse entre ellas o poner algunas porciones como subrutinas.
- Queda un hueco bastante gordo entre 27200 y el inicio del CODE, podía haber puesto las rutinas bastante más adelante.
- Hablando de lo cual, una forma elegante (solo para juegos que admitan ejecutarse en modo USR0) de esconder parte del código sería ponerlo en la página 7.

Pensamientos aleatorios:
- Cuando hice mi propia conversión a disco de la Aventura original y Don Quijote, pensé que eran algo chapuceras porque no cargaban o guardaban a disco. Hace poco pegué un repaso y resulta que las versiones que publicó Dinamic en disco tampoco lo hacen.
- He encontrado juegos (Mercenary) que graban y cargan con turbo... a saber cómo lo convierto a algo utilizable.
- Y todavía me falta por encontrar las rutinas de grabación y carga de otras aventuras de Dinamic... pero esto es más fácil.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

Avatar de Usuario
Uto
Jack The Nipper
Mensajes: 180
Registrado: Jue Sep 06, 2007 3:32 pm

Re: Salvando ando... parches para el Firfurcio

Mensaje por Uto » Jue Feb 27, 2014 12:35 am

El Firfucio es un juego hecho con PAW, por lo que en teoría la misma técnica del Firfucio es aplicable a otros juegos similares, con la salvedad de que es posible que en otros juegos similares no te quede hueco para meter las rutinas de grabar/cargar.

Otro problema puede venir por la versión de PAW, que lo mismo provoca que no siempre esté la misma rutina en el mismo sitio (ignoro si todas las versiones cargan el interprete en la 28657,pero si no lo hacen, la llamada que buscas estará "movida").

Aun en este último caso, quizá sea posible programar un "parcheador" que busque las llamadas y las sustituya, y que meta las rutinas de carga "donde quede hueco".

Como habrás visto en el link de WOS, hay 410 juegos hechos con PAW (y más que habrá que no estén en WOS).

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Salvando ando... parches para el Firfurcio

Mensaje por zup » Jue Feb 27, 2014 10:51 am

Es un tema algo experimental. Desde hace tiempo me he entretenido pasando juegos de cinta a disco para que funcionen en un +3e, pero me parecía un poco raro hacer que los juegos cargasen de disco duro pero solo pudieran salvar a cinta.

Ahora mismo estoy desarrollando parches para algunos que algunos juegos lo hagan desde cinta. Esto es un ejemplo de cómo buscarlo (ni me he molestado en comentar las rutinas de SAVE/LOAD), mi idea no era hacer un buscador automático. La idea es coger un juego concreto, parchearlo y pasarlo a disco.

Hablemos de huecos y memoria... todo el parche se ensambla en unos 180 bytes (que no es mucho, pero los juegos ya suelen ir apretados). Fusionando ambas rutinas podría conseguir bajarlo a menos de 150 bytes, y creo que tengo la opción de guardar parte del parche en la página 7 para ahorrar más memoria. En el caso del Firfurcio, hay sitio de sobra y tienes razón que en otros juegos habría que afinar más. Además, tendría que tener la pila por debajo de 49152 para que funcione y no sé si es imprescindible tener la zona de variables "libre".

El sistema de salvado del Firfurcio también tiene sus particularidades. A diferencia de otras aventuras que he mirado, el firfurcio graba sus datos en un bloque sin cabecera; el resto de las que he mirado graban en bloques con cabecera y piden nombre de archivo antes de grabar. Esto complica algo las cosas, pero la mayor diferencia es que en otras aventuras no es tan fácil averiguar cómo cargan (llaman a rutinas BASIC de la ROM, se meten a las rutinas de carga por sitios raros). Parece como si esta aventura fuese un caso único entre las que usan PAW y la rutina de grabación fuera diferente en el resto. Supongo que algún especialista en PAW nos lo podría solucionar.

Los siguientes candidatos a caer en mis garras son Impact! y La abadía del crimen, que también tienen huecos hermosotes y ya sé dónde colocar las rutinas. Otro que me suena que debería modificar es Ace 2088. En cuanto a las aventuras... cuando esté de humor para complicarme mucho la vida (el resto de las que me interesan usaron GAC o DAAD).
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

speccy
Sabreman
Mensajes: 353
Registrado: Jue Sep 06, 2007 4:20 pm

Re: Salvando ando... parches para el Firfurcio

Mensaje por speccy » Dom Abr 13, 2014 1:11 am

Si no los tienes hecho ya, el F16 Combat Pilot y el F19 Stealth Fighter pueden ser muy buenos candidatos... ;)

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Salvando ando... parches para el Firfurcio

Mensaje por zup » Dom Abr 13, 2014 11:11 am

Voy demasiado lento debido a una problema biológico que va a cumplir tres meses.

He encontrado cómo graba los datos la Aventura Original (llama a cierto punto de la rutina de SAVE con cabecera de la ROM), y tengo una ligera idea de cómo hacer que funcione pero no he avanzado más.

F-19 Stealth fighter es un tema muy espinoso. Microprose ya hizo una versión en disquete que supongo que carga y graba al disquete, pero no se podría transferir al disco duro del +3e. Si realmente quieres una versión compatible con +3e, la cosa se complica mucho. El primer paso sería hacer que el juego cargue desde ficheros de disco usando la ROM (para que sea factible transferirlo al disco duro). Una vez resuelto ese problema, que no es trivial (NUNCA se carga todo el juego en memoria, va cargando cosas poco a poco), vendría el intentar que cargue los datos del piloto desde disco... que probablemente sea mucho más sencillo.

En cuanto al F-16 Combat Pilot, los tiros van por el mismo lado. Si el juego carga completamente en memoria, pasarlo a disco no dará mucha guerra. Si no se puede, la tenemos liada.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

speccy
Sabreman
Mensajes: 353
Registrado: Jue Sep 06, 2007 4:20 pm

Re: Salvando ando... parches para el Firfurcio

Mensaje por speccy » Dom Abr 13, 2014 12:36 pm

A eso voy, a que se puedan cargar y grabar los datos del piloto desde disco.... No veas la cantidad de cosas que cargan ámbos. Aunque igual lo de los datos del piloto ya lo tienen solucionado.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados