Ale.
pues he aqui dos de los mas jodidos que he echo hasta ahora
Double Dragon3
https://mega.nz/file/jd0x3aSY#YEmKUPGSl ... 2ZplPfzNh0
Nigel Mansell's World Championship
https://mega.nz/file/6FEkURaQ#Ah7VXbPwz ... _CbDKm06Go
jodidos por que los cargadores son muy muy especificos y tienen que hilar muy fino.
ambos funcionan tanto en disquetera como en disco 0 y disco 1 asi como en A: B: C: D:
ahora unos detalles tecnicos de cada uno:
-------------------------------------------
Double Dragon III - The Rosetta Stone.
LOAD "DDRAGON3"
El DSK no cabe en un disco de 3", en un plus3 normal se podra jugar con una gotek o una disquetera de 3,5 con discos de 720Kb
El juego en cada carga el primer bloque que carga se cepilla el banco 7 del buffer del dos asi como la zona de variables de $5b00-$5cff
despues de un analisis completo pude determinar:
que el banco 4 era usado como buffer para descomprimir los sprites que iva a necesitar, asi que pude cargar el bloque 7 en el banco 4 y al terminar de cargar lo paso al banco 7.
y que la zona de variables es pisada por el buffer de video, que se restablece despues de cada carga. osea puedo restablecer las variables desde el backup y al terminar de cargar el juego reinicia el buffer de video.
el proceso de carga es el siguiente
en el programa basic, se inicializa la rutina de carga para guardar para las futuras cargas, la unidad de la cual estamos cargando y el nombre de la particion montada si estamos cargando desde +3e
y se hace un backup de la zona de variables en el banco 3 en #fe00 ya no parece que se use ese cacho de memoria durante el juego.
una vez empezamos a jugar para cargar los niveles..
uso las rutinas de borrado de zona y la rutina de impresion del juego para imprimir "LOADING"
se restablece la zona de variables desde el banco 3 para poder usar la rom de DOS.
re reinicilaizan los buffers de disco y disquetera desde la ROM
se cargan los bloques que se necesitan, cargando el bloque del banco 7 en el banco 4.
al terminar de cargar muevo lo cargado en el banco 4 al banco 7
pongo a cero el contador de sprites cargados (los que estaban en el banco 4)
y devuelvo el control al juego que borra la zona de impresion y reinicia sus bufferes de sprites y video
ojo no lo he terminado, he probado que carga todos los niveles, pero no he conseguido pasar del nivel 6 jugando soy un poco torpe
-------------------------------------------
Nigel Mansen WorldChampion ship.
LOAD ""NIGELMWC"
En este he usado compresion zx0 y este si cabe en un disquete de 3"
este ha sico algo mas complicado, igualmente en cada carga se cepilla el banco 7 y toda la zona de variables de $5b00-$5cff con una tabla de rotacion
ya que incluso se pisa parte del programa principal en cada carga y tiene llamadas cruzadas.....
la solucion, como el bloque 7 se pisa en cada carga, he tenido que partir el bloque 7 en varias partes, cargarlo por los huecos y al finalizar la carga, recolocar y descomprimir todo.
en el analisis pude decubrir la rutina generadora de la tabla de rotacion. asi como las rutinas de borrado de buffer y pantalla que usa el juego
utilizo la pantalla como buffer de carga y alojamiento de la rutin descompresar zx0.
el proceso de carga.
el programa basic reinicia la rutina de carga de disco para guardar la unidad y la particion que estamos usando , hace una copia de la zona de variables en un hueco del banco 4 que no se usa y procede a cargar el main1.
que tiene la intro a la cual le he rebajado los tiempos de pausa a la mitad .....
y despues de la intro carga el juego ya usando el loader.
el loader hace lo siguiente
modifica el nombre del fichero que vamos a cargar
se restablece la zona de variables desde el banco 4 para poder usar la rom de DOS.
se reinicilaizan los buffers de disco y disquetera desde la ROM
carga desde el fichero la tabla de bloques a cargar en un buffer de tabla
y empieza un bucle siguiendo la tabla cargada, para ir cargando los bloques en sus posicions de memoria desde el disco, el ultimo bloque recarga la tabla con una tabla nueva con la tabla de descompresion en el mismo sitio.
una vez terminada la carga se cierra el fichero, y se apaga el motor de la disquetera si estaba en uso.
y se procede con un nuevo bucle siguiendo la tabla de descompresion que ha pisado la tabla anterior.
una vez descomprimido todo.
se llama a la rutina de regeneracion de la tabla de rotacion y borrado de buffer del propio juego.
se coge la variable que usa el juego para almacenar la ultima pagina de memoria mapeada, se restablecen las interrupciones y se devuelve el control al juego en la misma pagina de memoria que estaba.
he usado 508 bytes que he liberado de las tablas originales, mensajes de cinta, rutinas propias del juego para manejar la cinta (tenia una copia de LD_BYTES en ram, etc) dejando las dos entradas que usa el juego para carga el bloque 0 y el bloque 1 en el mismo sitio, para no modificar las llamadas del juego.
No habia mas sitio y tube que cargar las tablas por partes de cada fichero.
poner la rutina zx0 en la pantalla, que se carga de cada fichero, y los atributos de LOADER +3E que tambien se cargan desde cada fichero
no he probado todos los campenatos ni circuitos, he entrado en un campeonato y va cargando los bien los circuitos....
DISCLAIMER:
descartelos y pruebalos bajo tu responsabilidad.
Los juegos han sido probados, pero podria sufrir algun cuelgue por alguna llamada oculta que no haya visto a la zona del cargador de cinta.
en teoria no pasaria gran cosa salvo un cuelgue que se solucione con un reinicio, pero no me hago responsable de ningun daño ocasionado a ningun fichero del disco.
saludos