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!!