Quieres ver como se hizo el PATCH del Operation Wolf Ocean 1988 FX PCEFAN

By alexito

Hero (555)

Аватар пользователя alexito

20-02-2018, 19:10

Vamos a empezar buscando en internet una version para MSX y resulta que existe una que es la original (solo via CINTA o TAPE) y la otra que es casi similar pero con unos retoques muy utiles hechos por un conocido miembro de la comunidad MSX llamado FX. Para entonces me habia llegado un interface llamado CASDUINO que nos permitia cargar juegos en version .CAS asi que puse manos a la obra testeando por vez primera este interface y funciono de mil maravillas y nos pusimos a jugar la version de FX y encontre al juego muy atractivo pero eso esperar a cargar las FASES se hacia un poco aburrido y ademas la version de FX no soporta el segundo BOTON de disparo (GRANADAS) del Joystick MSX. Asi que me puse a revisar el archivo .CAS y encontre una utilidad que te dice cuantos bloques o archivos se encuentran dentro del fichero .CAS este se llama CASTOOL Ver 1.3

https://drive.google.com/open?id=1L0I7vP_d5tEZ-pzZOzxpkZclM0...

entonces nos dimos cuenta de la estructura de como diferentes files se encuentran dentro del fichero .CAS
y podemos definir:

opwolf binary 9200,9400,9200 significa que el primer fichero es en formato binario osea que usaremos BLOAD "CAS:",R para cargarlo en 0x9200 con una longitud de 0x200 bytes y ejecutarlo en 0x9200

https://drive.google.com/open?id=18uURGUVcRWnLnwW3YgROnGkOwH...

...............mas por venir luego pues tengo que ir a trabajar.

:-)

PD: Si deseas dejar sugerencias te recomendaria dejarlos en la seccion principal llamada:

Operation Wolf Ocean 1988 FX PCEFAN 256KB RAM REQUIRED

de esta manera podre seguir contandoles mis anecdotas con esta mi primera modificacion de un juego de CINTA a DISCO.

Для того, чтобы оставить комментарий, необходимо регистрация или !login

By locomosxca

Master (234)

Аватар пользователя locomosxca

20-02-2018, 19:51

Siempre es de admiración este tipo de modificaciones que mejoran las versiones originales.

Fantástico trabajo.

By alexito

Hero (555)

Аватар пользователя alexito

21-02-2018, 07:05

Continuando........

https://drive.google.com/open?id=1Rw_5HE2n3mLrp0368e32vDwf0f...

Tenemos nuestro primer archivo lo llamaremos LOADER y se encuentra dentro del fichero .CAS el offset para llegar a el es 0x0026 con una longitud de 0x200 bytes lo que hace este programa al principio es testear la RAM manipulando el PRIMARY SLOT SELECT REGISTER (0xA8) como tambien el SECUNDARY SLOT SELECT REGISTER (#FFFF) rutina muy curiosa que parece funcionar muy bien con muchos MSX que no tienen expandido el PRIMARY SLOT 0 pues en maquinas que si como la A1WX de Panasonic esta rutina finalizara su busqueda alterando el contenido del SECUNDARY SLOT SELECT REGISTER (0xFFFF) y en consecuencia este no podra ser ejecutado correctamente en algunas Computadoras MSX. eso fue solucionado poniendo 2 NOPS en 0x9240: 00 00 eso hace que la rutina de busqueda de RAM solo vea en los PRIMARY SLOT 0,1,2,3 y no busque RAM en Sub-SLOTS.

https://drive.google.com/open?id=1k-WO-J9ALilUMRGaHen6CSSPIk...

Ahora la segunda parte del programa (LOADER) es movido a 0xf010 donde continua su ejecucion.

Lo que hace esta vez es cargar tres bloques alojados en el .CAS

https://drive.google.com/open?id=1JD8xV-l2nfNOIGsHeKrtpjv-nd...

Ahora observemos que el segundo archivo dentro del .CAS segun CASTOOL dice que empieza en el offset 0x0230

https://drive.google.com/open?id=1kEJyL_klZSRDLCYxespZInDR7U...

pero realmente el contenido que nos interesa comienza 8 bytes despues en el offset 0x0238 la longitud de este segundo archivo nos lo dice el programa (LOADER 002) ejecutado ahora en 0xF010.

(si estas interesado en en un editor de archivos en hexadecimal yo recomiendo ULTRAEDIT pero tu puedes usar el que mejor se acomode a tu Sistema Operativo yo aun uso Windows XP 32/64)

....y continuaremos otro dia.

By alexito

Hero (555)

Аватар пользователя alexito

21-02-2018, 16:44

Resumiendo entonces:

https://drive.google.com/open?id=1nkkIkVmgqbrNol3oaQR71FgWa8...

https://drive.google.com/open?id=13mXnIQa8b2SQIvoBCmf9nnnDsP...

Segun el LOADER este programa carga 3 archivos en 3 zonas del Z80 (Checkear Reg.HL) sus Longitudes estan especificadas con el Reg.BC y finalmente ejecutara el JUEGO (START-GAME ADDRESS) en 0x0A4D

Segundo archivo dentro del .CAS ---> Direccion Z80 0x0000 Longitud 0x4000
Tercer archivo dentro del .CAS ---> Direccion Z80 0x4000 Longitud 0x5800
Cuarto archivo dentro del .CAS ---> Direccion Z80 0x9800 Longitud 0x5800

Fue por eso que el la segunda parte del programa LOADER fue movido a la zona alta de 0xF010 para no tener problemas y poder cargar los 3 archivos llegando hasta la direccion 0xF000

Recordad que la BIOS del MSX inicializa la zonas/paginas de 16KB visible al Z80 via el MEMORY MAPPER REGISTER (0xFC ~ 0xFF)
y los deja asi:

Direccion Z80 0x0000 (0xFC = 0x00)
Direccion Z80 0x4000 (0xFD = 0x01)
Direccion Z80 0x8000 (0xFE = 0x02)
Direccion Z80 0xC000 (0xFF = 0x03)

Digo esto, por que el juego Operation Wolf es ejecutado originalmente considerando la clasica inicializacion del BIOS mas adelante nos daremos cuenta que se puede alterar esa inicializacion y fijarla en otras paginas mas arriba puesto que algunas computadoras poseen una Memoria Interna/Externa mas amplias:

Computadoras MSX con 64KB RAM (MEMORY MAPPER REGISTER 0xFC ~ 0xFF puede contener desde 0x00 ~ 0x03)
Computadoras MSX con 128KB RAM (MEMORY MAPPER REGISTER 0xFC ~ 0xFF puede contener desde 0x00 ~ 0x07)
Computadoras MSX con 256KB RAM (MEMORY MAPPER REGISTER 0xFC ~ 0xFF puede contener desde 0x00 ~ 0x0F)
Computadoras MSX con 512KB RAM (MEMORY MAPPER REGISTER 0xFC ~ 0xFF puede contener desde 0x00 ~ 0x1F)

Desde ahora nos referiremos al MEMORY MAPPER REGISTER como MMR

Es hora de contarles acerca un programa cargador hecho por Dennys Koller (SEGACONV LOADER) este fue uno de los primeros programas que tuve el placer de estudiar y contaba con la ayuda del autor para enterarme con mas detalles de como funcionaba este LOADER (CARGADOR) estaba especificamente hecho para que usuarios con FRANKY VDP pudieran gozar de juegos de SEGA MASTER SYSTEM en MSX.

(FRANKY LOADER es mi primera modificacion hecha para el MSX y es una adaptacion del SEGACONV.ASC)

https://drive.google.com/open?id=1PXk-GboM1euyf_S5VwekrEOD6H...

SEGACONV LOADER requeria FDD, 128KB RAM como minimo cargandose en la Direccion Z80 0xC000 MMR(0xFF=03) para luego cambiar a la ultima pagina RAM que el MSX tenga en nuestro caso sera 0x07 (MSX con 128KB RAM).

Como dijimos nuestro MSX cuenta solo con unos escasos 128KB RAM en este caso SEGACONV LOADER solo podra cargar archivos .SMS de como maximo 48KB y usara la direccion Z80 0x8000 MMR (0xFE=02) 16KB como memoria temporal ya que este carga de bloques 16KB en donde comenzara a buscar y alterar el codigo del juego de SEGA MASTER SYSTEM y luego empezaba a guardar el contenido de la Memoria temporal a la Direccion Z80 0x4000 pero esta vez inicializado un puntero via el MMR (0xFD=04) asi que la relacion entre longitud del fichero .SMS y el MMR (0xFD) es:

48KB SMS ROM MMR (0xFD)
-------------------------------------------
SMS 16KB PAGE 0x00 0x04
SMS 16KB PAGE 0x01 0x05
SMS 16KB PAGE 0x02 0x06

Cuando el SEGACONV LOADER finalize la carga y modificacion de codigo del todos los bloques de 16KB del fichero .SMS entonces pasara a reorganizar la memoria del MSX usando el MMR y dejandolo muy similar a como un SEGA MASTER SYSTEM MAPPER es:

SMS 16KB PAGE 0x00 MMR (0xFC=00)
SMS 16KB PAGE 0x01 MMR (0xFD=01)
SMS 16KB PAGE 0x02 MMR (0xFE=02)

Recordar que el programa que hace todas las cargas y finalmente la re-organizacion del memoria RAM esta en la ultima pagina del MSX RAM Direcion Z80 0xC000 osea MMR (FF=0x07)

Bueno lo que hicimos para el juego OPERATION WOLF fue usar el cargado de Dennis evitamos que modificara codigo, que solo cargase los bloques de 16KB y una vez hecha la RE-ORGANIZACION de la Memoria RAM en vez de que el MMR empieze en 0x00 este empezaria en 0x06

Operation Wolf MSX
--------------------------------------------------------
Direccion Z80 0x0000 MMR (0xFC=06)
Direccion Z80 0x4000 MMR (0xFD=07)
Direccion Z80 0x8000 MMR (0xFE=08)
Direccion Z80 0xC000 MMR (0xFF=09)

Que por que lo pusimos en las pagina altas apartir (0x06 ~ 0x09)

En otro momento les cuento.

By alexito

Hero (555)

Аватар пользователя alexito

22-02-2018, 08:59

~~~~~~~ ERRATA ~~~~~~ ERRATA ~~~~~~ ERRATA ~~~~~~ Lo que quise decir fue:

Recordad que la BIOS del MSX inicializa la zonas/paginas de 16KB visible al Z80 via el MEMORY MAPPER REGISTER (0xFC ~ 0xFF)
y los deja asi:

Direccion Z80 0x0000 (0xFC = 0x03)
Direccion Z80 0x4000 (0xFD = 0x02)
Direccion Z80 0x8000 (0xFE = 0x01)
Direccion Z80 0xC000 (0xFF = 0x00)

Bueno Continuando:

Entonces ya sabemos que el LOADER carga 3 archivos en MSX RAM y finalmente ejecuta el juego en 0x0A4D
es hora de instalar un BREAKPOINT en esa direccion y capturar los 64KB visibles del Z80.

https://drive.google.com/open?id=1TvgaIwUR7l3rwLKtfVEykAThUK...

En OpenMSX presionamos la tecla F10 el cual habrira otra ventana llamada CONSOLE y un cursor esperando por un commando o SCRIPT (save_debuggable memory dump.bin) lo que nos brinda este SCRIPT es capturar en un archivo el contenido de la memoria de la MSX desde la Direccion Z80 0x0000 ~ 0xFFFF osea 4 paginas de 16KB donde el OpenMSX refiere a estas paginas como Segmentos y el MSX BIOS inicializando los MMR asi:

Direccion Z80 0x0000 (0xFC = 0x03)
Direccion Z80 0x4000 (0xFD = 0x02)
Direccion Z80 0x8000 (0xFE = 0x01)
Direccion Z80 0xC000 (0xFF = 0x00)

https://drive.google.com/open?id=1150xqTCGvN9mzbZ96oPcgQmWTf...

Ahora como les habia comentado anteriormente acerca del programa cargador de Dennis Koller (SEGACONV.ASC) este cargaba fircheros de SEGA MASTER osea ROMs de 48KB o Mas y al vuelo los modificaba (PATCHEARLO para FRANKY VDP) y reorganizaba la Memoria de la MSX via el MMR ya que el MMR es un sistema de Mapeo de Memoria casi identico al usado en la SEGA MASTER SYSTEM. Entonces me dije voy a usar el cargador de Dennis bloqueando el modificador al vuelo (AUTO-PATCHING for FRANKY VDP) y en vez de saltar 0x0000 que salte al inicio del juego.Pero un problema surgio ya que el archivo capturado de Operation Wolf fue de una longitud de 64KB eso significan 4 paginas de 16KB y el cargador de Dennis necesita estar siempre funcionando en la Direccion Z80 0xC000 MMR (0xFF=00) ademas de usar la ultima pagina de 16KB del RAM y las paginas iniciales como BUFFERs Temporales.En La SEGA MASTER SYSTEM la Direccion Z80 0xC000 no se usa y el Operation Wolf si. Asi que la unica manera de setear la Direccion Z80 0xC000~0xFFFF con el contenido que pertenece al juego capturado (16KB) seria una rutina dentro de otras Direccion Z80 diferente de 0xC000~0xFFFF. Me puse a estudiar la Inicializacion del Juego Operation Wolf y descubri una rutina alojada en 0x0C8D con una longitud 0x1D8 bytes es movida una sola vez a una zona Alta de la RAM (0xD900) mira de nuevo la foto llamada "Breakpoint at 0xA4D and Saving MSX 64KB RAM.PNG" y te daras cuenta que conviene capturar los 64KB del juego luego de que mueva esos bytes puesto que esa zona quedara libre y disponible para agregar nuestras modificaciones.

Les dejo el archivo con los mini-programas que aloje en esa zona libre descubierta.

https://drive.google.com/open?id=1RAR_uplDVkwAWLxeOF7rm4LqIQ...

Y continuaremos luego de un descanso.

By alexito

Hero (555)

Аватар пользователя alexito

23-02-2018, 08:05

Ahora vamos analizar los archivos que corresponden a los diferentes niveles (BLOCK) de carga que estan dentro del archivo .CAS

https://drive.google.com/open?id=1x8HcBq1LH6IDcAJbfJlx4kdXoi...

https://drive.google.com/open?id=1PoTk_qL2RBzjnuIH9cS4GHiimN...

https://drive.google.com/open?id=186JkZIIpux2uuzuDeOzb1uj_1i...

Entonces podemos deducir que existen 6 cabezeras conteniendo 1 byte identificador que representa el numero del BLOCK - LEVEL y 6 bloques principales de 16KB por BLOCK - LEVEL.

Ahora solo queda encontrar las rutinas de carga de BLOCK - LEVEL dentro del juego:

https://drive.google.com/open?id=18ThRw20hR7j3BCebQ4Z5Z5-mRZ...

https://drive.google.com/open?id=1fimOKQ8BlfObaCtRjLL3DfGVpy...

La rutina en 0xDC0C se preguntaran por que usa el MMR (0xFD) alterandolo con lo que contenga la posicion RAM 0x9ADF pues resulta que 0x9ADF contiene el BLOCK - LEVEL en formato hexadecimal que ya esta cargado exitosamente dentro de la ventana 0x4000 ~ 0x7FFF

Asi que lo que hicimos fue crear un solo archivo de 160KB (96KB BLOCK - LEVEL + 64KB CAPTURADO via OpenMSX de Juego principal) recordar que estamos usando el cargador de SEGA MASTER SYSTEM (SEGACONV MODIFICADO) y este solo carga archivos .ROM y estos 160KB que equivalen a 10 bloques de 16KB es la mejor solucion.

para acceder osea llenar la ventana 0x4000 ~ 0x7FFF que el juego usa como ZONA de CARGA para los diferentes niveles basta con usar el MMR (0xFD), el numero de BLOCK 0x00, 0x01, 0x02, 0x03, 0x04, 0x05

por consecuencia los 64KB capturados de juego estan alojados apartir del MMR (0x06, 0x07, 0x08, 0x09)

El cargador de Dennis (SEGACONV.ASC) fue alterado de tal manera que cuando re-organiza la Memoria del MSX este tome encuenta que la captura del juego hecha con OpenMSX (primeros 48KB) deban configurarse de manera distinta:

MOVR:
ld a,#06 ; XOR A
OUT (#FC),A ;1st 16k block
INC A
OUT (#FD),A ;2nd 16k block
INC A
OUT (#FE),A ;3rd 16k block

Entonces luego saltamos a 0x0C8D y ejecutamos el primer mini-programa en C8D.ASM

Donde primero que todo Inhabilitamos las Interrupciones (DI) seteamos el STACK POINTER (0xAFC8) donde NO cree conflicto con la zona comprendida entre 0xC000 ~ 0xFFFF y luego devolvemos los ultimos 16KB de la captura hecha por el OpenMSX.

Nos queda explicar donde fueron los puntos de modificacion para Segundo Boton de Joystick pero si indagas y lees los comentarios en el fichero C8D.ASM podras facilmente darte cuenta.

Bueno eso fue todo amigos, espero que lo hayan disfrutado tanto como yo.

Un saludo afectuoso para todos y que el MSX nos acompañe por mucho tiempo mas.

:)

By mohai

Paladin (841)

Аватар пользователя mohai

07-03-2018, 18:10

Siempre es interesante ver los entresijos de un juego por dentro.
A veces ves cosas ingeresantes y otras, algunas chapuzas de conversiones.
La explicación bien.
Hace tiempo que me preguntaba por qué el cargador para Franky, necesita 128k para juegos de 48k. Me parece un poco chapuza, la verdad.

By DrWh0

Paladin (768)

Аватар пользователя DrWh0

07-03-2018, 21:45

Muy interesante alexito, muchas gracias por tomarte tu tiempo en explicarnos todo el proceso se agradece bastante Smile