Autor Tema: Crear un set desencriptado para Three Wonders versión ETC  (Leído 3348 veces)

enricnes

  • *****
  • Mensajes: 362
Crear un set desencriptado para Three Wonders versión ETC
« en: 13 de Abril de 2013, a las 22:38 horas »
Buenas,
me he puesto en contacto con Tim de Arcadecollecting.com (la pagina con informacion sobre baterias suicida entre otras cosas). Resulta que nadie se ha puesto a crear un set de roms desencriptadas para Three Wonders, version ETC, y esta dispuesto a echar una mano si alguien se pone. Ya me ha pasado su fichero de Three wonders desensamblado y con los ajustes.
Lo cierto es que no se mucho de ensamblador de 68000, pero dado que es una CPU muy utilizada en las placas arcade, estoy dispuesto a aprenderlo.
Es por esto que abro este hilo, para sondear si alguien quiere echar una mano y crear un grupo de trabajo.
Asi pues, todas las aportaciones son bienvenidas.
Un saludo!

PD: Me he equivocado de lugar al abrir este hilo aqui, deberia ir en proyectos, algun admin puede moverlo??
« última modificación: 14 de Abril de 2013, a las 00:05 horas por enricnes »

Marcos75

  • ****
  • Mensajes: 3042
  • Arcadero de los 80s
Re: Crear un set desencriptado para Three Wonders versión ETC
« Respuesta #1 en: 14 de Abril de 2013, a las 07:25 horas »
Movido y modificado ligeramente el título para que se entienda bien de lo que va el hilo.

Yo me he pegado con el ensamblador del 68000 para desencriptar juegos Sega System 16.

Ahora mismo no tengo tiempo de meterme en un proyecto de este estilo, pero todas las dudas puntuales que puedan surgir estaré encantado de tratar de solventarlas.

Un saludo.


enricnes

  • *****
  • Mensajes: 362
Re: Crear un set desencriptado para Three Wonders versión ETC
« Respuesta #2 en: 14 de Abril de 2013, a las 11:40 horas »
Buenas Marcos,
cualquier ayuda sera bienvenida!
Ya tengo las roms de programa desensambladas y ya he empezado a comparar con el fichero de Tim, si alguien quiere echar un vistazo al desensamblado que lo diga.
Marcos, sabes de algun manual de ensamblador (no pasa nada si esta en ingles) de 68000? Quiero que sea solo de 68000, para que no añada paja que no me es util.
El de la pagina de Freescale añade toda la familia de CPU's y es un monstruo de 600 paginas.
Saludos!!


PD: Para los que se pregunten para que hago esto: Si teneis una placa que ha muerto por la bateria suicida, si quereis volver a jugar con ella no teneis mas remedio que convertirla en version USA, teniendo que descartar todas las mask rom, y rompiendo el aspecto "estetico" de la placa. Con un romset parcheado, solo seria cuestion de grabar 4 memorias, pudiendo aprovechar todo lo demas.

ricky2001

  • ****
  • Mensajes: 1444
  • Arcade Adicto
Re: Crear un set desencriptado para Three Wonders versión ETC
« Respuesta #3 en: 14 de Abril de 2013, a las 13:06 horas »
Me parece estupendo lo que vas a hacer, ojalá supiera de programación para poderte ayudar.

Al ataque!!!

Marcos75

  • ****
  • Mensajes: 3042
  • Arcadero de los 80s
Re: Crear un set desencriptado para Three Wonders versión ETC
« Respuesta #4 en: 14 de Abril de 2013, a las 13:08 horas »
Pues si ya has manejado el lenguaje ensamblador alguna vez, y conoces la arquitectura de microprocesadores, te bastará con esto:

http://www.mediafire.com/?skdpsk6b0e6xer1

Es una guía (que ni me acuerdo de dónde conseguí) de sólo 58 páginas con la descripción de las instrucciones del 68000, y una hoja con los vectores de interrupción.

Un saludo.


enricnes

  • *****
  • Mensajes: 362
Re: Crear un set desencriptado para Three Wonders versión ETC
« Respuesta #5 en: 16 de Abril de 2013, a las 00:29 horas »
Novedades en el frente, resulta que un tipo lo hizo alrededor de enero de este año (el set desencriptado) y me lo ha pasado. No descarto intentarlo yo tambien por aprender ensamblador de 68K, ya que es una cpu muy usada en arcade.
Le he pedido si podia enviar los ficheros a Tim de arcadecollecting, asi que estoy a la espera.
Un saludo!

enricnes

  • *****
  • Mensajes: 362
Re: Crear un set desencriptado para Three Wonders versión ETC
« Respuesta #6 en: 17 de Abril de 2013, a las 16:04 horas »
Buenas a todos,
ya han añadido nuevos romsets para las cps1.
Voy a poner un poco de royo teorico de lo que ocurre con las placas CPS1.
Como todos sabeis, las CPS1 tienen las placas A, B y C como comunmente se denominan. En la placa C reside un integrado custom llamado CPS-B....., que es el que da los problemas cuando la bateria se agota. En particular los CPS-B21 son los que tienen bateria "suicida", pero la informacion no es que este encriptada como con los System 16 de Sega, sino que esta bateria habilida unos modos de funcionamiento que el CPS-B21 no tienen sin ella.
De mame src/mame/video/cps1.c:
/*                     CPSB ID    multiply protection      unknown      ctrl     priority masks   palctrl    layer enable masks  */
#define CPS_B_21_DEF 0x32,  -1,   0x00,0x02,0x04,0x06, 0x08, -1,  -1,   0x26,{0x28,0x2a,0x2c,0x2e},0x30, {0x02,0x04,0x08,0x30,0x30} // pang3 sets layer enable to 0x26 on startup
#define CPS_B_21_BT1 0x32,0x0800, 0x0e,0x0c,0x0a,0x08, 0x06,0x04,0x02,  0x28,{0x26,0x24,0x22,0x20},0x30, {0x20,0x04,0x08,0x12,0x12}
#define CPS_B_21_BT2  -1,   -1,   0x1e,0x1c,0x1a,0x18,  -1, 0x0c,0x0a,  0x20,{0x2e,0x2c,0x2a,0x28},0x30, {0x30,0x08,0x30,0x00,0x00}
#define CPS_B_21_BT3  -1,   -1,   0x06,0x04,0x02,0x00, 0x0e,0x0c,0x0a,  0x20,{0x2e,0x2c,0x2a,0x28},0x30, {0x20,0x12,0x12,0x00,0x00}
#define CPS_B_21_BT4  -1,   -1,   0x06,0x04,0x02,0x00, 0x1e,0x1c,0x1a,  0x28,{0x26,0x24,0x22,0x20},0x30, {0x20,0x10,0x02,0x00,0x00}
#define CPS_B_21_BT5 0x32,  -1,   0x0e,0x0c,0x0a,0x08, 0x1e,0x1c,0x1a,  0x20,{0x2e,0x2c,0x2a,0x28},0x30, {0x20,0x04,0x02,0x00,0x00}
#define CPS_B_21_BT6  -1,   -1,    -1,  -1,  -1,  -1,   -1,  -1,  -1,   0x20,{0x2e,0x2c,0x2a,0x28},0x30, {0x20,0x14,0x14,0x00,0x00}
#define CPS_B_21_BT7  -1,   -1,    -1,  -1,  -1,  -1,   -1,  -1,  -1,   0x2c,{ -1,  -1,  -1,  -1 },0x12, {0x14,0x02,0x14,0x00,0x00}
#define CPS_B_21_QS1  -1,   -1,    -1,  -1,  -1,  -1,   -1,  -1,  -1,   0x22,{0x24,0x26,0x28,0x2a},0x2c, {0x10,0x08,0x04,0x00,0x00}
#define CPS_B_21_QS2  -1,   -1,    -1,  -1,  -1,  -1,   -1, 0x2e,0x20,  0x0a,{0x0c,0x0e,0x00,0x02},0x04, {0x16,0x16,0x16,0x00,0x00}
#define CPS_B_21_QS3 0x0e,0x0c00,  -1,  -1,  -1,  -1,  0x2c, -1,  -1,   0x12,{0x14,0x16,0x08,0x0a},0x0c, {0x04,0x02,0x20,0x00,0x00}
#define CPS_B_21_QS4 0x2e,0x0c01,  -1,  -1,  -1,  -1,  0x1c,0x1e,0x08,  0x16,{0x00,0x02,0x28,0x2a},0x2c, {0x04,0x08,0x10,0x00,0x00}
#define CPS_B_21_QS5 0x1e,0x0c02,  -1,  -1,  -1,  -1,  0x0c, -1,  -1,   0x2a,{0x2c,0x2e,0x30,0x32},0x1c, {0x04,0x08,0x10,0x00,0x00}
#define HACK_B_1      -1,   -1,    -1,  -1,  -1,  -1,   -1,  -1,  -1,   0x14,{0x12,0x10,0x0e,0x0c},0x0a, {0x0e,0x0e,0x0e,0x30,0x30}
/*

CPS_B_21_DEF is CPS-B-21 at default settings (no battery)
CPS_B_21_BTx are various battery configurations
CPS_B_21_QSx are various battery configurations in Q-Sound games
De mame src/mame/drivers/cps1, el mapa de la memoria de los CPS1 es esta:
AM_RANGE(0x000000, 0x3fffff) AM_ROM
AM_RANGE(0x800000, 0x800007) AM_READ_PORT("IN1")            /* Player input ports */
/* forgottn, willow, cawing, nemo, varth read from 800010. Probably debug input leftover from development */
AM_RANGE(0x800018, 0x80001f) AM_READ(cps1_dsw_r)            /* System input ports / Dip Switches */
AM_RANGE(0x800020, 0x800021) AM_READNOP                     /* ? Used by Rockman ? not mapped according to PAL */
AM_RANGE(0x800030, 0x800037) AM_WRITE(cps1_coinctrl_w)
/* Forgotten Worlds has dial controls on B-board mapped at 800040-80005f. See DRIVER_INIT */
AM_RANGE(0x800100, 0x80013f) AM_WRITE(cps1_cps_a_w) AM_SHARE("cps_a_regs")  /* CPS-A custom */
/* CPS-B custom is mapped by the PAL IOB2 on the B-board. SF2 revision "E" World and USA 910228 has it a a different
address, see DRIVER_INIT */
AM_RANGE(0x800140, 0x80017f) AM_READWRITE(cps1_cps_b_r, cps1_cps_b_w) AM_SHARE("cps_b_regs")
AM_RANGE(0x800180, 0x800187) AM_WRITE(cps1_soundlatch_w)    /* Sound command */
AM_RANGE(0x800188, 0x80018f) AM_WRITE(cps1_soundlatch2_w)   /* Sound timer fade */
AM_RANGE(0x900000, 0x92ffff) AM_RAM_WRITE(cps1_gfxram_w) AM_SHARE("gfxram") /* SF2CE executes code from here */
AM_RANGE(0xff0000, 0xffffff) AM_RAM AM_SHARE("mainram")

Como podeis ver la region de memoria para el custom CPS-B es de 0x800140 a 0x80017f, y los diferentes registros, layer masks y layer priority masks son offsets de 0x800140.

La posibilidad de "resucitar" estos juegos viene de que si se conectan los pines 45 y 46 del integrado custom CPS-B21 a 5V (levantando las patas o cortando pistas, etc) o incluso si se dejan al aire, este se comporta tal y como esta definido antes CPS_B_21_DEF.
Ahora solo tenemos que desensamblar el programa principal (en otro capitulo os explico como hacerlo de manera muy facil), revisar todo el codigo y parchearlo para que coincidan con los offsets de CPS_B_21_DEF.
Os pongo unos ejemplos de 3 wonders version USA (aunque la ETC es practicamente identica). 3 wonders tiene un custom CPS_B_21_BT1 (esto lo podeis ver en video/cps1.c tambien).
Os encontrais con instrucciones como:
move.w  #$3, $80014c.l, como podeis observar, esta haciendo una operacion sobre la region de memoria que tenemos que parchear, en concreto esta accediendo a 0x800140+0x0c, mirando la correspondencia en el CPS_B_21_DEF, podeis observar que 0x0C del CPS_B_21_BT1 se corresponde al 0x02 del CPS_B_21_DEF, asi pues, tenemos que modificar esa instruccion para que quede asi:
move.w  #$3, $800142.l  // 0x800140+0x02

Tambien teneis instrucciones como la siguiente:
bset    #$5, (-$728d,A5), esta esta relacionada con las mascaras de activacion de capas, en concreto vereis que en nuestro caso coinciden la 2 y la 3, pero la primera no, mientras que en el modo con bateria accede al bit  numero 5 empezando por 0 (0x20), sin bateria deberia ser (0x02), el bit numero 1, tambien empezando por cero.
Asi pues, esta instruccion parcheada quedaria como
bset #$1, (-$728d,A5)
La instruccion bclr    #$5, (-$728d,A5) se trataria de manera exactamente igual a la anterior.

Con esto tenemos parcheado mas del 95% de las roms de 3 wonders.

Estas roms tambien tenian algunas medidas de seguridad en forma de XOR que tambien habria que parchear.

Espero que haya sido del interes al menos de alguno!

Saludos!!


« última modificación: 19 de Abril de 2013, a las 11:51 horas por enricnes »

Marcos75

  • ****
  • Mensajes: 3042
  • Arcadero de los 80s
Re: Crear un set desencriptado para Three Wonders versión ETC
« Respuesta #7 en: 18 de Abril de 2013, a las 11:15 horas »
Hola enricnes.

¿Tienes algún método para "automatizar" ese 95% que comentas?

No sé cuántas instrucciones te puedes encontrar en un juego (por ejemplo en este) que haya que parchear. Si son pocas, puedes hacer un seguimiento manual, pero si son muchas puede ser una tarea tediosa...

Ya nos contarás más detalles.

Un saludo.


enricnes

  • *****
  • Mensajes: 362
Re: Crear un set desencriptado para Three Wonders versión ETC
« Respuesta #8 en: 18 de Abril de 2013, a las 12:53 horas »
Cita de: Marcos75 en18 de Abril de 2013, a las  11:15 horas
Hola enricnes.

¿Tienes algún método para "automatizar" ese 95% que comentas?

No sé cuántas instrucciones te puedes encontrar en un juego (por ejemplo en este) que haya que parchear. Si son pocas, puedes hacer un seguimiento manual, pero si son muchas puede ser una tarea tediosa...

Ya nos contarás más detalles.

Un saludo.
Un juego como el 3 wonders tiene del orden de 350 instrucciones para parchear. En realidad, las que he puesto antes son directas, y con un simple buscar y sustituir lo tienes hecho.
Por lo demas, es buscar cualquier actuacion sobre la region de memoria del custom CPS-B21.
Las que no son automaticas son las medidas de seguridad, las XOR, pero no son tan abundantes como para no poder afrontarlo manualmente con breakpoints y demas.
3 wonders tiene del orden de 300000 instrucciones en el desensamblado, asi que 350 no son una burrada.
En el archivo adjunto esta la informacion sobre la que he trabajado, asi como los parches realizados por Tim de arcadecollecting, en el podras ver que practicamente todos los parches realizados son del tipo expuesto.
Falta por ejemplo esta instruccion:
move.w  #$1b3d, $800144.l
y
move.w  D0, $800142.l
Que como ves, son los offsets 0x02 y 0x04 del CPS-B21-BT1 que no tienen equivalencia en el CPS-B21-DEF. La verdad es que todavia no acabo de ver claro que hace alli. No se si el toma una region de memoria que no se use del custom y lo toma como referencia en los siguientes.
Fichero adjunto

Saludos!