fixed layer enable at the end of stage 4 in Varth.

increased Varth CPU clock to 12MHz to reduce slowdowns (the game was released after sf2ce so the faster A-board was available).
verified more gfx rom mappings against PAL dumps (thanks to Corrado Tomaselli).
verified memory maps using A-board PAL dumps (thanks to Charles McDonald).
separated the address ranges for CPS-A and CPS-B customs. This finally clarifies why some registers are fixed and some change with every game.
identified three new unknown registers in the CPS-B-21 custom. Their purpose is unknown.
all unhandled accesses to CPS-A/CPS-B registers will now be reported. There shouldn't be any left. Look out for "contact MAMDEV" popups.
cleaned memory maps. Moved forgotten worlds special input mmeory handlers to DRIVER_INIT.
moved extra input handlers to video/cps1.c since the extra connectors are on the C-board.
added sound to Final Crash.
This commit is contained in:
Nicola Salmoria 2008-04-19 22:14:00 +00:00
parent 9dd3f691ba
commit 5782fedb11
5 changed files with 1030 additions and 750 deletions

View File

@ -161,17 +161,16 @@ Stephh's log (2006.09.20) :
#include "cps1.h" /* External CPS1 definitions */ #include "cps1.h" /* External CPS1 definitions */
READ16_HANDLER( cps1_input_r ) READ16_HANDLER( cps1_dsw_r )
{ {
static const char *const dswname[] = { "IN0", "DSWA", "DSWB", "DSWC" }; static const char *const dswname[] = { "IN0", "DSWA", "DSWB", "DSWC" };
int in = input_port_read(machine, dswname[offset]); int in = input_port_read(machine, dswname[offset]);
return in << 8; return (in << 8) | 0xff;
} }
READ16_HANDLER( cps1_in1_r ) READ16_HANDLER( cps1_in1_r )
{ {
int buttons = input_port_read(machine, "IN1"); return input_port_read(machine, "IN1");
return buttons;
} }
READ16_HANDLER( cps1_in2_r ) READ16_HANDLER( cps1_in2_r )
@ -213,18 +212,14 @@ static WRITE16_HANDLER( forgottn_dial_1_reset_w )
static WRITE8_HANDLER( cps1_snd_bankswitch_w ) static WRITE8_HANDLER( cps1_snd_bankswitch_w )
{ {
UINT8 *RAM = memory_region(REGION_CPU2); UINT8 *RAM = memory_region(REGION_CPU2);
int length = memory_region_length(REGION_CPU2) - 0x10000;
int bankaddr; int bankaddr;
bankaddr = (data * 0x4000) & (length-1); bankaddr = ((data & 1) * 0x4000);
memory_set_bankptr(1,&RAM[0x10000 + bankaddr]); memory_set_bankptr(1,&RAM[0x10000 + bankaddr]);
if (data & 0xfe) logerror("%04x: write %02x to f004\n",activecpu_get_pc(),data);
} }
static WRITE8_HANDLER( cps1_oki_pin7_w ) static WRITE8_HANDLER( cps1_oki_pin7_w )
{ {
logerror("%04x: write %02x to f006 (Oki Pin 7)\n",activecpu_get_pc(),data);
OKIM6295_set_pin7(0, (data & 1)); OKIM6295_set_pin7(0, (data & 1));
} }
@ -242,8 +237,6 @@ static WRITE16_HANDLER( cps1_soundlatch2_w )
WRITE16_HANDLER( cps1_coinctrl_w ) WRITE16_HANDLER( cps1_coinctrl_w )
{ {
// popmessage("coinctrl %04x",data);
if (ACCESSING_BITS_8_15) if (ACCESSING_BITS_8_15)
{ {
coin_counter_w(0,data & 0x0100); coin_counter_w(0,data & 0x0100);
@ -253,15 +246,6 @@ WRITE16_HANDLER( cps1_coinctrl_w )
// bit 15 = CPS-A custom reset? // bit 15 = CPS-A custom reset?
} }
// there's no trace of this in the Forgotten Worlds schematics
if (ACCESSING_BITS_0_7)
{
/* mercs sets bit 0 */
set_led_status(0,data & 0x02);
set_led_status(1,data & 0x04);
set_led_status(2,data & 0x08);
}
} }
static WRITE16_HANDLER( cpsq_coinctrl2_w ) static WRITE16_HANDLER( cpsq_coinctrl2_w )
@ -278,8 +262,7 @@ static WRITE16_HANDLER( cpsq_coinctrl2_w )
INTERRUPT_GEN( cps1_interrupt ) INTERRUPT_GEN( cps1_interrupt )
{ {
/* Strider also has a IRQ4 handler. It is input port related, but the game */ /* Strider also has a IRQ4 handler. It is input port related, but the game */
/* works without it (maybe it's used to multiplex controls). It is the */ /* works without it. It is the *only* CPS1 game to have that. */
/* *only* game to have that. */
cpunum_set_input_line(machine, 0, 2, HOLD_LINE); cpunum_set_input_line(machine, 0, 2, HOLD_LINE);
} }
@ -432,27 +415,142 @@ WRITE16_HANDLER( cps1_eeprom_port_w )
/*
PAL PRG1 (16P8B @ 12H):
I0 = AS
I1 = /BGACKB
I2 = A23
I3 = A22
I4 = A21
I5 = A20
I6 = A19
I7 = A18
I8 = A17
I9 = A16
n.c. = pin19 = ( !I0 & I1 )
n.c. = pin18 = ( !I0 & I1 )
n.c. = pin17 = ! ( I0 & I1 & (!I2 | !I3 | !I4 | !I5 | !I6 | !I7) )
n.c. = pin16 = ! ( I2 & I3 & I4 & I5 & I6 & I7 )
/IOCS = pin15 = ! ( I0 & I1 & I2 & !I3 & !I4 & !I5 )
/ONE WAIT = pin14 = ! ( I0 & I1 & ((!I2 & !I3) | ( I2 & !I3) | ( I2 & I3)) )
/databus = pin13 = ! ( I0 & I1 & (!I2 | !I3 | !I4 | !I5 | !I6 | !I7) )
/workram = pin12 = ! ( I0 & I1 & I2 & I3 & I4 & I5 & I6 & I7 )
PAL IOA1 (16P8B @ 12F):
I0 = /IOCS
I1 = /RDB
I2 = /UDSWR
I3 = /LDSWR
I4 = AB8
I5 = AB7
I6 = AB6
I7 = AB5
I8 = AB4
I9 = AB3
player input = pin19 = ! ( !I0 & !I1 & !I4 & !I5 & !I6 & !I7 & !I8 & !I9 )
system input/dips = pin18 = ! ( !I0 & !I1 & !I4 & !I5 & !I6 & !I7 & I8 & I9 )
outputs = pin17 = ! ( !I0 & !I2 & !I4 & !I5 & !I6 & I7 & I8 & !I9 )
sound 1B = pin16 = ! ( !I0 & !I3 & I4 & I5 & !I6 & !I7 & !I8 & I9 )
sound 0B = pin15 = ! ( !I0 & !I3 & I4 & I5 & !I6 & !I7 & !I8 & !I9 )
n.c. = pin14 = ( !I1 & !I2 )
/PPU1 = pin13 = ! ( !I0 & I4 & !I5 & !I6 )
n.c. = pin12 = ( !I1 & !I2 )
PAL BUF1 (16P8B @ 16H):
I0 = A23 (all address lines can come both from 68000 and CPS-A custom)
I1 = A22
I2 = A21
I3 = A20
I4 = A19
I5 = A18
I6 = A17
I7 = A16
I8 = ASB
BUF0 = pin19 = ! ( I0 & !I1 & !I2 & I3 & !I4 & !I5 & !I6 & !I7 )
BUF1 = pin18 = ! ( I0 & !I1 & !I2 & I3 & !I4 & !I5 & !I6 & I7 )
BUF2 = pin17 = ! ( I0 & !I1 & !I2 & I3 & !I4 & !I5 & I6 & !I7 )
BUF3 = pin16 = ! ( I0 & !I1 & !I2 & I3 & !I4 & !I5 & I6 & I7 )
BUF4 = pin15 = ! ( I0 & !I1 & !I2 & I3 & !I4 & I5 & !I6 & !I7 )
BUF5 = pin14 = ! ( I0 & !I1 & !I2 & I3 & !I4 & I5 & !I6 & I7 )
BUF6 = pin13 = ! ( I0 & !I1 & !I2 & I3 & !I4 & I5 & I6 & !I7 )
/RDB = pin12 = ( I0 & !I1 & !I2 & I3 & !I8 )
BUF0-BUF2 are gfxram on A-board. BUF3-BUF6 go to B-board (provision for expansion, never used)
PAL ROM1 (16P8B @ 15H):
I0 = A23 (all address lines can come both from 68000 and CPS-A custom)
I1 = A22
I2 = A21
I3 = A20
I4 = A19
I5 = A18
I6 = A17
I7 = A16
I8 = ASB
PRG0 = pin17 = ! ( !I8 & !I0 & !I1 & !I2 & !I3 & !I4 & !I5 )
PRG1 = pin16 = ! ( !I8 & !I0 & !I1 & !I2 & !I3 & !I4 & I5 )
PRG2 = pin15 = ! ( !I8 & !I0 & !I1 & !I2 & !I3 & I4 & !I5 )
PRG3 = pin14 = ! ( !I8 & !I0 & !I1 & !I2 & !I3 & I4 & I5 )
PRG4 = pin19 = ! ( !I8 & !I0 & !I1 & !I2 & I3 & !I4 )
PRG5 = pin18 = ! ( !I8 & !I0 & !I1 & !I2 & I3 & I4 )
PRG6 = pin13 = ! ( !I8 & !I0 & !I1 & I2 & !I3 & !I4 )
/RDB = pin12 = ( !I8 & !I0 & !I1 )
All PRGx go to B-board. Provision for up to 4MB of ROM space, which was never used in full.
*/
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x1fffff) AM_ROM AM_RANGE(0x000000, 0x3fffff) AM_ROM
AM_RANGE(0x800000, 0x800001) AM_READ(cps1_in1_r) /* Player input ports */ AM_RANGE(0x800000, 0x800007) AM_READ(cps1_in1_r) /* Player input ports */
AM_RANGE(0x800010, 0x800011) AM_READ(cps1_in1_r) /* mirror? */ /* forgottn, willow, cawing, nemo, varth read from 800010. Probably debug input leftover from development */
AM_RANGE(0x800018, 0x80001f) AM_READ(cps1_input_r) /* System input ports / Dip Switches */ AM_RANGE(0x800018, 0x80001f) AM_READ(cps1_dsw_r) /* System input ports / Dip Switches */
AM_RANGE(0x800020, 0x800021) AM_READNOP /* ? Used by Rockman ? */ AM_RANGE(0x800020, 0x800021) AM_READNOP /* ? Used by Rockman ? not mapped according to PAL */
AM_RANGE(0x800030, 0x800031) AM_WRITE(cps1_coinctrl_w) AM_RANGE(0x800030, 0x800037) AM_WRITE(cps1_coinctrl_w)
AM_RANGE(0x800040, 0x800041) AM_WRITE(forgottn_dial_0_reset_w) /* Forgotten Worlds has dial controls on B-board mapped at 800040-80005f. See DRIVER_INIT */
AM_RANGE(0x800048, 0x800049) AM_WRITE(forgottn_dial_1_reset_w) AM_RANGE(0x800100, 0x80013f) AM_WRITE(cps1_cps_a_w) AM_BASE(&cps1_cps_a_regs) /* CPS-A custom */
AM_RANGE(0x800052, 0x800055) AM_READ(forgottn_dial_0_r) /* Forgotten Worlds */ AM_RANGE(0x800140, 0x80017f) AM_READWRITE(cps1_cps_b_r, cps1_cps_b_w) AM_BASE(&cps1_cps_b_regs) /* CPS-B custom */
AM_RANGE(0x80005a, 0x80005d) AM_READ(forgottn_dial_1_r) /* Forgotten Worlds */
AM_RANGE(0x800176, 0x800177) AM_READ(cps1_in2_r) /* Extra input ports (on C-board) */
AM_RANGE(0x800178, 0x800179) AM_READ(cps1_in3_r) /* Player 4 controls (on C-board) ("Captain Commando") */
AM_RANGE(0x800180, 0x800187) AM_WRITE(cps1_soundlatch_w) /* Sound command */ 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(0x800188, 0x80018f) AM_WRITE(cps1_soundlatch2_w) /* Sound timer fade */
AM_RANGE(0x8001fc, 0x8001fd) AM_READ(cps1_in2_r) /* Extra input ports ("SF Rev E") */ AM_RANGE(0x8001c0, 0x8001ff) AM_READWRITE(cps1_cps_b_r, cps1_cps_b_w) /* mirror (SF2 revision "E" US 910228) */
AM_RANGE(0x800100, 0x8001ff) AM_READWRITE(cps1_output_r, cps1_output_w) AM_BASE(&cps1_output) AM_SIZE(&cps1_output_size) /* CPS-B custom */
AM_RANGE(0x900000, 0x92ffff) AM_RAM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) /* SF2CE executes code from here */ AM_RANGE(0x900000, 0x92ffff) AM_RAM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) /* SF2CE executes code from here */
AM_RANGE(0xff0000, 0xffffff) AM_RAM AM_RANGE(0xff0000, 0xffffff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
/*
PAL SOU1 (16P8 @ 13E):
I0 = /MREQ
I1 = A15
I2 = A14
I3 = A13
I4 = A12
I5 = bank latch
I6 = /RD
I7 = /WR
I8 = /BANK
bank latch = pin19 = ! ( !I0 & !I7 & !I8 )
/SWR = pin18 = ! ( !I0 & !I7 )
/SRD = pin17 = ! ( !I0 & !I6 )
ls138 = pin16 = ! ( !I0 & I1 & I2 & I3 & I4 )
workram = pin15 = ! ( !I0 & I1 & I2 & !I3 & I4 )
SOUNDA14 = pin14 = ! ( !I0 & ((!I1 & !I2) | ( I1 & !I2 & !I5)) )
SOUNDA15 = pin13 = ( I1 )
/SOUNDCE = pin12 = ! ( !I0 & (!I1 | ( I1 & !I2)) )
*/
static ADDRESS_MAP_START( sub_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( sub_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(1) AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(1)
@ -469,11 +567,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( qsound_main_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( qsound_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x1fffff) AM_ROM AM_RANGE(0x000000, 0x1fffff) AM_ROM
AM_RANGE(0x800000, 0x800001) AM_READ(cps1_in1_r) /* Player input ports */ AM_RANGE(0x800000, 0x800007) AM_READ(cps1_in1_r) /* Player input ports */
AM_RANGE(0x800010, 0x800011) AM_READ(cps1_in1_r) /* mirror? */ AM_RANGE(0x800018, 0x80001f) AM_READ(cps1_dsw_r) /* System input ports / Dip Switches */
AM_RANGE(0x800018, 0x80001f) AM_READ(cps1_input_r) /* System input ports / Dip Switches */ AM_RANGE(0x800030, 0x800037) AM_WRITE(cps1_coinctrl_w)
AM_RANGE(0x800030, 0x800031) AM_WRITE(cps1_coinctrl_w) AM_RANGE(0x800100, 0x80013f) AM_WRITE(cps1_cps_a_w) AM_BASE(&cps1_cps_a_regs) /* CPS-A custom */
AM_RANGE(0x800100, 0x8001ff) AM_READWRITE(cps1_output_r, cps1_output_w) AM_BASE(&cps1_output) AM_SIZE(&cps1_output_size) /* CPS-B custom */ AM_RANGE(0x800140, 0x80017f) AM_READWRITE(cps1_cps_b_r, cps1_cps_b_w) AM_BASE(&cps1_cps_b_regs) /* CPS-B custom */
AM_RANGE(0x900000, 0x92ffff) AM_RAM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) /* SF2CE executes code from here */ AM_RANGE(0x900000, 0x92ffff) AM_RAM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) /* SF2CE executes code from here */
AM_RANGE(0xf00000, 0xf0ffff) AM_READ(qsound_rom_r) /* Slammasters protection */ AM_RANGE(0xf00000, 0xf0ffff) AM_READ(qsound_rom_r) /* Slammasters protection */
AM_RANGE(0xf18000, 0xf19fff) AM_READWRITE(qsound_sharedram1_r, qsound_sharedram1_w) /* Q RAM */ AM_RANGE(0xf18000, 0xf19fff) AM_READWRITE(qsound_sharedram1_r, qsound_sharedram1_w) /* Q RAM */
@ -3517,7 +3615,7 @@ MACHINE_DRIVER_END
***************************************************************************/ ***************************************************************************/
#define CODE_SIZE 0x200000 #define CODE_SIZE 0x400000
ROM_START( forgottn ) ROM_START( forgottn )
ROM_REGION( CODE_SIZE, REGION_CPU1, 0 ) ROM_REGION( CODE_SIZE, REGION_CPU1, 0 )
@ -3845,8 +3943,8 @@ ROM_START( dynwar )
ROM_CONTINUE( 0x10000, 0x08000 ) ROM_CONTINUE( 0x10000, 0x08000 )
ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* Samples */ ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* Samples */
ROM_LOAD( "tke19.12c", 0x20000, 0x20000, CRC(068741db) SHA1(ab48aff639a7ac218b7d5304145e10e92d61fd9f) )
ROM_LOAD( "tke18.11c", 0x00000, 0x20000, CRC(ac6e307d) SHA1(b490ce625bb7ce0904b0fd121fbfbd5252790f7a) ) ROM_LOAD( "tke18.11c", 0x00000, 0x20000, CRC(ac6e307d) SHA1(b490ce625bb7ce0904b0fd121fbfbd5252790f7a) )
ROM_LOAD( "tke19.12c", 0x20000, 0x20000, CRC(068741db) SHA1(ab48aff639a7ac218b7d5304145e10e92d61fd9f) )
ROM_END ROM_END
/* the content of the smaller roms in this set is 99% identical, just japanese program roms /* the content of the smaller roms in this set is 99% identical, just japanese program roms
@ -4031,8 +4129,9 @@ ROM_START( unsquad )
ROM_LOAD( "unsquad.09", 0x00000, 0x08000, CRC(f3dd1367) SHA1(09eef72e862ac6b1a5cce5a45938b45bf4e456ad) ) ROM_LOAD( "unsquad.09", 0x00000, 0x08000, CRC(f3dd1367) SHA1(09eef72e862ac6b1a5cce5a45938b45bf4e456ad) )
ROM_CONTINUE( 0x10000, 0x08000 ) ROM_CONTINUE( 0x10000, 0x08000 )
ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* Samples */ ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* Samples */
ROM_LOAD( "unsquad.18", 0x00000, 0x20000, CRC(584b43a9) SHA1(7820815c8c67d484baf2fdad7e55d8c14b98b860) ) ROM_LOAD( "unsquad.18", 0x00000, 0x20000, CRC(584b43a9) SHA1(7820815c8c67d484baf2fdad7e55d8c14b98b860) )
/* 20000-3ffff empty */
ROM_END ROM_END
ROM_START( area88 ) ROM_START( area88 )
@ -4056,8 +4155,9 @@ ROM_START( area88 )
ROM_LOAD( "unsquad.09", 0x00000, 0x08000, CRC(f3dd1367) SHA1(09eef72e862ac6b1a5cce5a45938b45bf4e456ad) ) ROM_LOAD( "unsquad.09", 0x00000, 0x08000, CRC(f3dd1367) SHA1(09eef72e862ac6b1a5cce5a45938b45bf4e456ad) )
ROM_CONTINUE( 0x10000, 0x08000 ) ROM_CONTINUE( 0x10000, 0x08000 )
ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* Samples */ ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* Samples */
ROM_LOAD( "unsquad.18", 0x00000, 0x20000, CRC(584b43a9) SHA1(7820815c8c67d484baf2fdad7e55d8c14b98b860) ) ROM_LOAD( "unsquad.18", 0x00000, 0x20000, CRC(584b43a9) SHA1(7820815c8c67d484baf2fdad7e55d8c14b98b860) )
/* 20000-3ffff empty */
ROM_END ROM_END
ROM_START( ffight ) ROM_START( ffight )
@ -5288,7 +5388,6 @@ ROM_START( wonder3 )
ROM_LOAD16_BYTE( "rtj42.bin", 0x00001, 0x20000, CRC(b4baa117) SHA1(44486b3d50f9b0a8c32c2c2dc5f1a046aface7b6) ) ROM_LOAD16_BYTE( "rtj42.bin", 0x00001, 0x20000, CRC(b4baa117) SHA1(44486b3d50f9b0a8c32c2c2dc5f1a046aface7b6) )
ROM_LOAD16_BYTE( "rtj37.bin", 0x40000, 0x20000, CRC(a1f677b0) SHA1(e1511ea0fa4a689d1355119ac37c075192880dde) ) ROM_LOAD16_BYTE( "rtj37.bin", 0x40000, 0x20000, CRC(a1f677b0) SHA1(e1511ea0fa4a689d1355119ac37c075192880dde) )
ROM_LOAD16_BYTE( "rtj43.bin", 0x40001, 0x20000, CRC(85337a47) SHA1(0a247aa56c5cc17b1e888df7b502f65e88715469) ) ROM_LOAD16_BYTE( "rtj43.bin", 0x40001, 0x20000, CRC(85337a47) SHA1(0a247aa56c5cc17b1e888df7b502f65e88715469) )
ROM_LOAD16_BYTE( "3wonders.28", 0x80000, 0x20000, CRC(054137c8) SHA1(e4c406e0a32198323a5931093fbaa6836510b8ad) ) ROM_LOAD16_BYTE( "3wonders.28", 0x80000, 0x20000, CRC(054137c8) SHA1(e4c406e0a32198323a5931093fbaa6836510b8ad) )
ROM_LOAD16_BYTE( "3wonders.33", 0x80001, 0x20000, CRC(7264cb1b) SHA1(b367acb9f6579569321ecaa98a14e29dd775b9db) ) ROM_LOAD16_BYTE( "3wonders.33", 0x80001, 0x20000, CRC(7264cb1b) SHA1(b367acb9f6579569321ecaa98a14e29dd775b9db) )
ROM_LOAD16_BYTE( "rtj35.bin", 0xc0000, 0x20000, CRC(e72f9ea3) SHA1(c63df200416bd61af73e8589204f7daef743041e) ) ROM_LOAD16_BYTE( "rtj35.bin", 0xc0000, 0x20000, CRC(e72f9ea3) SHA1(c63df200416bd61af73e8589204f7daef743041e) )
@ -7207,7 +7306,7 @@ ROM_START( megaman )
ROM_REGION( 0x28000, REGION_CPU2, 0 ) /* 64k for the audio CPU (+banks) */ ROM_REGION( 0x28000, REGION_CPU2, 0 ) /* 64k for the audio CPU (+banks) */
ROM_LOAD( "rcm_09.rom", 0x00000, 0x08000, CRC(9632d6ef) SHA1(2bcb6f17005ffbc9ef8fa4478a814f24b2e6e0b6) ) ROM_LOAD( "rcm_09.rom", 0x00000, 0x08000, CRC(9632d6ef) SHA1(2bcb6f17005ffbc9ef8fa4478a814f24b2e6e0b6) )
ROM_CONTINUE( 0x10000, 0x18000 ) ROM_CONTINUE( 0x10000, 0x18000 ) // second half of ROM is empty, not mapped in memory
ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* Samples */ ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* Samples */
ROM_LOAD( "rcm_18.rom", 0x00000, 0x20000, CRC(80f1f8aa) SHA1(4a5b7b2a6941ad68da7472c63362c7bcd353fa54) ) ROM_LOAD( "rcm_18.rom", 0x00000, 0x20000, CRC(80f1f8aa) SHA1(4a5b7b2a6941ad68da7472c63362c7bcd353fa54) )
@ -7243,7 +7342,7 @@ ROM_START( rockmanj )
ROM_REGION( 0x28000, REGION_CPU2, 0 ) /* 64k for the audio CPU (+banks) */ ROM_REGION( 0x28000, REGION_CPU2, 0 ) /* 64k for the audio CPU (+banks) */
ROM_LOAD( "rcm_09.rom", 0x00000, 0x08000, CRC(9632d6ef) SHA1(2bcb6f17005ffbc9ef8fa4478a814f24b2e6e0b6) ) ROM_LOAD( "rcm_09.rom", 0x00000, 0x08000, CRC(9632d6ef) SHA1(2bcb6f17005ffbc9ef8fa4478a814f24b2e6e0b6) )
ROM_CONTINUE( 0x10000, 0x18000 ) ROM_CONTINUE( 0x10000, 0x18000 ) // second half of ROM is empty, not mapped in memory
ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* Samples */ ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* Samples */
ROM_LOAD( "rcm_18.rom", 0x00000, 0x20000, CRC(80f1f8aa) SHA1(4a5b7b2a6941ad68da7472c63362c7bcd353fa54) ) ROM_LOAD( "rcm_18.rom", 0x00000, 0x20000, CRC(80f1f8aa) SHA1(4a5b7b2a6941ad68da7472c63362c7bcd353fa54) )
@ -7252,6 +7351,18 @@ ROM_END
#ifndef MESS #ifndef MESS
static DRIVER_INIT( forgottn )
{
/* Forgotten Worlds has extra inputs on the B-board CN-MOWS connector for the dial controls. */
memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x800040, 0x800041, 0, 0, forgottn_dial_0_reset_w);
memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x800048, 0x800049, 0, 0, forgottn_dial_1_reset_w);
memory_install_read16_handler (machine, 0, ADDRESS_SPACE_PROGRAM, 0x800052, 0x800055, 0, 0, forgottn_dial_0_r);
memory_install_read16_handler (machine, 0, ADDRESS_SPACE_PROGRAM, 0x80005a, 0x80005d, 0, 0, forgottn_dial_1_r);
DRIVER_INIT_CALL(cps1);
}
static DRIVER_INIT( wof ) static DRIVER_INIT( wof )
{ {
wof_decode(); wof_decode();
@ -7278,7 +7389,8 @@ static DRIVER_INIT( slammast )
static DRIVER_INIT( pang3 ) static DRIVER_INIT( pang3 )
{ {
/* Pang 3 EEPROM interface is at a different address */ /* Pang 3 is the only non-QSound game to have an EEPROM. */
/* It is mapped in the CPS-B address range so probably is on the C-board. */
memory_install_readwrite16_handler (machine, 0, ADDRESS_SPACE_PROGRAM, 0x80017a, 0x80017b, 0, 0, cps1_eeprom_port_r, cps1_eeprom_port_w); memory_install_readwrite16_handler (machine, 0, ADDRESS_SPACE_PROGRAM, 0x80017a, 0x80017b, 0, 0, cps1_eeprom_port_r, cps1_eeprom_port_w);
DRIVER_INIT_CALL(cps1); DRIVER_INIT_CALL(cps1);
@ -7310,8 +7422,8 @@ static DRIVER_INIT( pang3j )
#endif #endif
GAME( 1988, forgottn, 0, cps1_10MHz, forgottn, cps1, ROT0, "Capcom", "Forgotten Worlds (US)", 0 ) GAME( 1988, forgottn, 0, cps1_10MHz, forgottn, forgottn, ROT0, "Capcom", "Forgotten Worlds (US)", 0 )
GAME( 1988, lostwrld, forgottn, cps1_10MHz, forgottn, cps1, ROT0, "Capcom", "Lost Worlds (Japan)", 0 ) GAME( 1988, lostwrld, forgottn, cps1_10MHz, forgottn, forgottn, ROT0, "Capcom", "Lost Worlds (Japan)", 0 )
GAME( 1988, ghouls, 0, cps1_10MHz, ghouls, cps1, ROT0, "Capcom", "Ghouls'n Ghosts (World)" , 0) // Wed.26.10.1988 in the ROMS GAME( 1988, ghouls, 0, cps1_10MHz, ghouls, cps1, ROT0, "Capcom", "Ghouls'n Ghosts (World)" , 0) // Wed.26.10.1988 in the ROMS
GAME( 1988, ghoulsu, ghouls, cps1_10MHz, ghoulsu, cps1, ROT0, "Capcom", "Ghouls'n Ghosts (US)" , 0) // Wed.26.10.1988 in the ROMS GAME( 1988, ghoulsu, ghouls, cps1_10MHz, ghoulsu, cps1, ROT0, "Capcom", "Ghouls'n Ghosts (US)" , 0) // Wed.26.10.1988 in the ROMS
GAME( 1988, daimakai, ghouls, cps1_10MHz, daimakai, cps1, ROT0, "Capcom", "Dai Makai-Mura (Japan)" , 0) // Wed.26.10.1988 in the ROMS GAME( 1988, daimakai, ghouls, cps1_10MHz, daimakai, cps1, ROT0, "Capcom", "Dai Makai-Mura (Japan)" , 0) // Wed.26.10.1988 in the ROMS
@ -7394,10 +7506,10 @@ GAME( 1992, sf2m6, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "bootleg
GAME( 1992, sf2m7, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "bootleg","Street Fighter II' - Champion Edition (M7)", 0 ) GAME( 1992, sf2m7, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "bootleg","Street Fighter II' - Champion Edition (M7)", 0 )
GAME( 1992, sf2yyc, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "bootleg","Street Fighter II' - Champion Edition (YYC)", 0 ) GAME( 1992, sf2yyc, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "bootleg","Street Fighter II' - Champion Edition (YYC)", 0 )
GAME( 1992, sf2koryu, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "bootleg","Street Fighter II' - Champion Edition (Kouryu)", 0 ) GAME( 1992, sf2koryu, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "bootleg","Street Fighter II' - Champion Edition (Kouryu)", 0 )
GAME( 1992, varth, 0, cps1_10MHz, varth, cps1, ROT270, "Capcom", "Varth - Operation Thunderstorm (World 920714)" , 0) // "ETC" GAME( 1992, varth, 0, cps1_12MHz, varth, cps1, ROT270, "Capcom", "Varth - Operation Thunderstorm (World 920714)" , 0) // "ETC" 12MHz not verified but game slows down at 10MHz
GAME( 1992, varthr1, varth, cps1_10MHz, varth, cps1, ROT270, "Capcom", "Varth - Operation Thunderstorm (World 920612)" , 0) // "ETC" GAME( 1992, varthr1, varth, cps1_12MHz, varth, cps1, ROT270, "Capcom", "Varth - Operation Thunderstorm (World 920612)" , 0) // "ETC"
GAME( 1992, varthu, varth, cps1_10MHz, varth, cps1, ROT270, "Capcom (Romstar license)", "Varth - Operation Thunderstorm (US 920612)", 0 ) GAME( 1992, varthu, varth, cps1_12MHz, varth, cps1, ROT270, "Capcom (Romstar license)", "Varth - Operation Thunderstorm (US 920612)", 0 )
GAME( 1992, varthj, varth, cps1_10MHz, varth, cps1, ROT270, "Capcom", "Varth - Operation Thunderstorm (Japan 920714)", 0 ) GAME( 1992, varthj, varth, cps1_12MHz, varth, cps1, ROT270, "Capcom", "Varth - Operation Thunderstorm (Japan 920714)", 0 )
GAME( 1992, cworld2j, 0, cps1_10MHz, cworld2j, cps1, ROT0, "Capcom", "Capcom World 2 (Japan 920611)", 0 ) GAME( 1992, cworld2j, 0, cps1_10MHz, cworld2j, cps1, ROT0, "Capcom", "Capcom World 2 (Japan 920611)", 0 )
GAME( 1992, sf2hf, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "Capcom", "Street Fighter II' - Hyper Fighting (World 921209)", 0 ) GAME( 1992, sf2hf, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "Capcom", "Street Fighter II' - Hyper Fighting (World 921209)", 0 )
GAME( 1992, sf2t, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "Capcom", "Street Fighter II' - Hyper Fighting (US 921209)", 0 ) GAME( 1992, sf2t, sf2ce, cps1_12MHz, sf2, cps1, ROT0, "Capcom", "Street Fighter II' - Hyper Fighting (US 921209)", 0 )
@ -7421,8 +7533,8 @@ GAME( 1993, punishrj, punisher, qsound, punisher, punisher, ROT0, "Capcom"
GAME( 1993, slammast, 0, qsound, slammast, slammast, ROT0, "Capcom", "Saturday Night Slam Masters (World 930713)" , 0) // "ETC" GAME( 1993, slammast, 0, qsound, slammast, slammast, ROT0, "Capcom", "Saturday Night Slam Masters (World 930713)" , 0) // "ETC"
GAME( 1993, slammasu, slammast, qsound, slammast, slammast, ROT0, "Capcom", "Saturday Night Slam Masters (US 930713)", 0 ) GAME( 1993, slammasu, slammast, qsound, slammast, slammast, ROT0, "Capcom", "Saturday Night Slam Masters (US 930713)", 0 )
GAME( 1993, mbomberj, slammast, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber - The Body Explosion (Japan 930713)", 0 ) GAME( 1993, mbomberj, slammast, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber - The Body Explosion (Japan 930713)", 0 )
GAME( 1993, mbombrd, slammast, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber Duo - Ultimate Team Battle (World 931206)" , 0) // "ETC" GAME( 1993, mbombrd, 0, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber Duo - Ultimate Team Battle (World 931206)" , 0) // "ETC"
GAME( 1993, mbombrdj, slammast, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber Duo - Heat Up Warriors (Japan 931206)", 0 ) GAME( 1993, mbombrdj, mbombrd, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber Duo - Heat Up Warriors (Japan 931206)", 0 )
GAME( 1994, pnickj, 0, cps1_10MHz, pnickj, cps1, ROT0, "Compile (Capcom license)", "Pnickies (Japan 940608)", 0 ) GAME( 1994, pnickj, 0, cps1_10MHz, pnickj, cps1, ROT0, "Compile (Capcom license)", "Pnickies (Japan 940608)", 0 )
/* Japanese version of Pang 3 is encrypted, Euro version is not */ /* Japanese version of Pang 3 is encrypted, Euro version is not */

View File

@ -646,17 +646,17 @@ static INTERRUPT_GEN( cps2_interrupt )
} }
scancount++; scancount++;
if(cps1_output[0x50/2] & 0x8000) if (cps1_cps_b_regs[0x10/2] & 0x8000)
cps1_output[0x50/2] = cps1_output[0x50/2] & 0x1ff; cps1_cps_b_regs[0x10/2] = cps1_cps_b_regs[0x10/2] & 0x1ff;
if(cps1_output[0x52/2] & 0x8000) if (cps1_cps_b_regs[0x12/2] & 0x8000)
cps1_output[0x52/2] = cps1_output[0x52/2] & 0x1ff; cps1_cps_b_regs[0x12/2] = cps1_cps_b_regs[0x12/2] & 0x1ff;
// popmessage("%04x %04x - %04x %04x",cps1_scanline1,cps1_scanline2,cps1_output[0x50/2],cps1_output[0x52/2]); // popmessage("%04x %04x - %04x %04x",cps1_scanline1,cps1_scanline2,cps1_cps_b_regs[0x10/2],cps1_cps_b_regs[0x12/2]);
/* raster effects */ /* raster effects */
if(cps1_scanline1 == scancount || (cps1_scanline1 < scancount && !cps1_scancalls)) if(cps1_scanline1 == scancount || (cps1_scanline1 < scancount && !cps1_scancalls))
{ {
cps1_output[0x50/2] = 0; cps1_cps_b_regs[0x10/2] = 0;
cpunum_set_input_line(machine, 0, 4, HOLD_LINE); cpunum_set_input_line(machine, 0, 4, HOLD_LINE);
cps2_set_sprite_priorities(); cps2_set_sprite_priorities();
video_screen_update_partial(machine->primary_screen, 16 - 10 + scancount); /* visarea.min_y - [first visible line?] + scancount */ video_screen_update_partial(machine->primary_screen, 16 - 10 + scancount); /* visarea.min_y - [first visible line?] + scancount */
@ -667,7 +667,7 @@ static INTERRUPT_GEN( cps2_interrupt )
/* raster effects */ /* raster effects */
if(cps1_scanline2 == scancount || (cps1_scanline2 < scancount && !cps1_scancalls)) if(cps1_scanline2 == scancount || (cps1_scanline2 < scancount && !cps1_scancalls))
{ {
cps1_output[0x52/2] = 0; cps1_cps_b_regs[0x12/2] = 0;
cpunum_set_input_line(machine, 0, 4, HOLD_LINE); cpunum_set_input_line(machine, 0, 4, HOLD_LINE);
cps2_set_sprite_priorities(); cps2_set_sprite_priorities();
video_screen_update_partial(machine->primary_screen, 16 - 10 + scancount); /* visarea.min_y - [first visible line?] + scancount */ video_screen_update_partial(machine->primary_screen, 16 - 10 + scancount); /* visarea.min_y - [first visible line?] + scancount */
@ -677,8 +677,8 @@ static INTERRUPT_GEN( cps2_interrupt )
if(scancount == 256) /* VBlank */ if(scancount == 256) /* VBlank */
{ {
cps1_output[0x50/2] = cps1_scanline1; cps1_cps_b_regs[0x10/2] = cps1_scanline1;
cps1_output[0x52/2] = cps1_scanline2; cps1_cps_b_regs[0x12/2] = cps1_scanline2;
cpunum_set_input_line(machine, 0, 2, HOLD_LINE); cpunum_set_input_line(machine, 0, 2, HOLD_LINE);
if(cps1_scancalls) if(cps1_scancalls)
{ {
@ -873,13 +873,13 @@ static ADDRESS_MAP_START( cps2_readmem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x70a000, 0x70bfff) AM_READ(cps2_objram2_r) /* mirror */ AM_RANGE(0x70a000, 0x70bfff) AM_READ(cps2_objram2_r) /* mirror */
AM_RANGE(0x70c000, 0x70dfff) AM_READ(cps2_objram2_r) /* mirror */ AM_RANGE(0x70c000, 0x70dfff) AM_READ(cps2_objram2_r) /* mirror */
AM_RANGE(0x70e000, 0x70ffff) AM_READ(cps2_objram2_r) /* mirror */ AM_RANGE(0x70e000, 0x70ffff) AM_READ(cps2_objram2_r) /* mirror */
AM_RANGE(0x800100, 0x8001ff) AM_READ(cps1_output_r) /* Output ports mirror (sfa) */ AM_RANGE(0x800140, 0x80017f) AM_READ(cps1_cps_b_r) /* mirror (sfa) */
AM_RANGE(0x804000, 0x804001) AM_READ_PORT("IN0") /* IN0 */ AM_RANGE(0x804000, 0x804001) AM_READ_PORT("IN0") /* IN0 */
AM_RANGE(0x804010, 0x804011) AM_READ_PORT("IN1") /* IN1 */ AM_RANGE(0x804010, 0x804011) AM_READ_PORT("IN1") /* IN1 */
AM_RANGE(0x804020, 0x804021) AM_READ_PORT("IN2") /* IN2 + EEPROM */ AM_RANGE(0x804020, 0x804021) AM_READ_PORT("IN2") /* IN2 + EEPROM */
AM_RANGE(0x804030, 0x804031) AM_READ(cps2_qsound_volume_r) /* Master volume. Also when bit 14=0 addon memory is present, when bit 15=0 network adapter present. */ AM_RANGE(0x804030, 0x804031) AM_READ(cps2_qsound_volume_r) /* Master volume. Also when bit 14=0 addon memory is present, when bit 15=0 network adapter present. */
AM_RANGE(0x8040b0, 0x8040b3) AM_READ(kludge_r) /* unknown (xmcotaj hangs if this is 0) */ AM_RANGE(0x8040b0, 0x8040b3) AM_READ(kludge_r) /* unknown (xmcotaj hangs if this is 0) */
AM_RANGE(0x804100, 0x8041ff) AM_READ(cps1_output_r) /* CPS1 Output ports */ AM_RANGE(0x804140, 0x80417f) AM_READ(cps1_cps_b_r) /* CPS-B custom */
AM_RANGE(0x900000, 0x92ffff) AM_READ(SMH_RAM) /* Video RAM */ AM_RANGE(0x900000, 0x92ffff) AM_READ(SMH_RAM) /* Video RAM */
AM_RANGE(0xff0000, 0xffffff) AM_READ(SMH_RAM) /* RAM */ AM_RANGE(0xff0000, 0xffffff) AM_READ(SMH_RAM) /* RAM */
ADDRESS_MAP_END ADDRESS_MAP_END
@ -898,11 +898,13 @@ static ADDRESS_MAP_START( cps2_writemem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x70a000, 0x70bfff) AM_WRITE(cps2_objram2_w) /* mirror */ AM_RANGE(0x70a000, 0x70bfff) AM_WRITE(cps2_objram2_w) /* mirror */
AM_RANGE(0x70c000, 0x70dfff) AM_WRITE(cps2_objram2_w) /* mirror */ AM_RANGE(0x70c000, 0x70dfff) AM_WRITE(cps2_objram2_w) /* mirror */
AM_RANGE(0x70e000, 0x70ffff) AM_WRITE(cps2_objram2_w) /* mirror */ AM_RANGE(0x70e000, 0x70ffff) AM_WRITE(cps2_objram2_w) /* mirror */
AM_RANGE(0x800100, 0x8001ff) AM_WRITE(cps1_output_w) /* Output ports mirror (sfa) */ AM_RANGE(0x800100, 0x80013f) AM_WRITE(cps1_cps_a_w) AM_BASE(&cps1_cps_a_regs) /* mirror (sfa) */
AM_RANGE(0x800140, 0x80017f) AM_WRITE(cps1_cps_b_w) AM_BASE(&cps1_cps_b_regs) /* mirror (sfa) */
AM_RANGE(0x804040, 0x804041) AM_WRITE(cps2_eeprom_port_w) /* EEPROM */ AM_RANGE(0x804040, 0x804041) AM_WRITE(cps2_eeprom_port_w) /* EEPROM */
AM_RANGE(0x8040a0, 0x8040a1) AM_WRITE(SMH_NOP) /* Unknown (reset once on startup) */ AM_RANGE(0x8040a0, 0x8040a1) AM_WRITE(SMH_NOP) /* Unknown (reset once on startup) */
AM_RANGE(0x8040e0, 0x8040e1) AM_WRITE(cps2_objram_bank_w) /* bit 0 = Object ram bank swap */ AM_RANGE(0x8040e0, 0x8040e1) AM_WRITE(cps2_objram_bank_w) /* bit 0 = Object ram bank swap */
AM_RANGE(0x804100, 0x8041ff) AM_WRITE(cps1_output_w) AM_BASE(&cps1_output) AM_SIZE(&cps1_output_size) /* Output ports */ AM_RANGE(0x804100, 0x80413f) AM_WRITE(cps1_cps_a_w) AM_BASE(&cps1_cps_a_regs) /* CPS-A custom */
AM_RANGE(0x804140, 0x80417f) AM_WRITE(cps1_cps_b_w) AM_BASE(&cps1_cps_b_regs) /* CPS-B custom */
AM_RANGE(0x900000, 0x92ffff) AM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) AM_RANGE(0x900000, 0x92ffff) AM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size)
AM_RANGE(0xff0000, 0xffffff) AM_WRITE(SMH_RAM) /* RAM */ AM_RANGE(0xff0000, 0xffffff) AM_WRITE(SMH_RAM) /* RAM */
ADDRESS_MAP_END ADDRESS_MAP_END
@ -7175,6 +7177,11 @@ GAME( 1993, ssf2jr2, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Su
GAME( 1993, ssf2tb, ssf2, cps2, cps2_2p6b, ssf2tb, ROT0, "Capcom", "Super Street Fighter II: The Tournament Battle (World 931119)", 0 ) // works, but not in tournament mode GAME( 1993, ssf2tb, ssf2, cps2, cps2_2p6b, ssf2tb, ROT0, "Capcom", "Super Street Fighter II: The Tournament Battle (World 931119)", 0 ) // works, but not in tournament mode
GAME( 1993, ssf2tbr1, ssf2, cps2, cps2_2p6b, ssf2tb, ROT0, "Capcom", "Super Street Fighter II: The Tournament Battle (World 930911)", 0 ) // works, but not in tournament mode GAME( 1993, ssf2tbr1, ssf2, cps2, cps2_2p6b, ssf2tb, ROT0, "Capcom", "Super Street Fighter II: The Tournament Battle (World 930911)", 0 ) // works, but not in tournament mode
GAME( 1993, ssf2tbj, ssf2, cps2, cps2_2p6b, ssf2tb, ROT0, "Capcom", "Super Street Fighter II: The Tournament Battle (Japan 930911)", 0 ) // works, but not in tournament mode GAME( 1993, ssf2tbj, ssf2, cps2, cps2_2p6b, ssf2tb, ROT0, "Capcom", "Super Street Fighter II: The Tournament Battle (Japan 930911)", 0 ) // works, but not in tournament mode
GAME( 1993, ecofghtr, 0, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Eco Fighters (World 931203)", 0 )
GAME( 1993, ecofghtu, ecofghtr, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Eco Fighters (USA 940215)", 0 )
GAME( 1993, ecofgtu1, ecofghtr, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Eco Fighters (USA 931203)", 0 )
GAME( 1993, uecology, ecofghtr, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Ultimate Ecology (Japan 931203)", 0 )
GAME( 1993, ecofghta, ecofghtr, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Eco Fighters (Asia 931203)", 0 )
GAME( 1993, ddtod, 0, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Euro 940412)", 0 ) GAME( 1993, ddtod, 0, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Euro 940412)", 0 )
GAME( 1993, ddtodr1, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Euro 940113)", 0 ) GAME( 1993, ddtodr1, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Euro 940113)", 0 )
GAME( 1993, ddtodu, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (USA 940125)", 0 ) GAME( 1993, ddtodu, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (USA 940125)", 0 )
@ -7184,30 +7191,11 @@ GAME( 1993, ddtodjr1, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Du
GAME( 1993, ddtodjr2, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Japan 940113)", 0 ) GAME( 1993, ddtodjr2, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Japan 940113)", 0 )
GAME( 1993, ddtoda, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Asia 940113)", 0 ) GAME( 1993, ddtoda, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Asia 940113)", 0 )
GAME( 1993, ddtodh, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Hispanic 940125)", 0 ) GAME( 1993, ddtodh, ddtod, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Tower of Doom (Hispanic 940125)", 0 )
GAME( 1993, ecofghtr, 0, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Eco Fighters (World 931203)", 0 )
GAME( 1993, ecofghtu, ecofghtr, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Eco Fighters (USA 940215)", 0 )
GAME( 1993, ecofgtu1, ecofghtr, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Eco Fighters (USA 931203)", 0 )
GAME( 1993, uecology, ecofghtr, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Ultimate Ecology (Japan 931203)", 0 )
GAME( 1993, ecofghta, ecofghtr, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Eco Fighters (Asia 931203)", 0 )
GAME( 1994, ssf2t, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II Turbo (World 940223)", 0 ) GAME( 1994, ssf2t, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II Turbo (World 940223)", 0 )
GAME( 1994, ssf2ta, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II Turbo (Asia 940223)", 0 ) GAME( 1994, ssf2ta, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II Turbo (Asia 940223)", 0 )
GAME( 1994, ssf2tu, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II Turbo (USA 940323)", 0 ) GAME( 1994, ssf2tu, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II Turbo (USA 940323)", 0 )
GAME( 1994, ssf2tur1, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II Turbo (USA 940223)", 0 ) GAME( 1994, ssf2tur1, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II Turbo (USA 940223)", 0 )
GAME( 1994, ssf2xj, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II X: Grand Master Challenge (Japan 940223)", 0 ) GAME( 1994, ssf2xj, ssf2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Street Fighter II X: Grand Master Challenge (Japan 940223)", 0 )
GAME( 1994, xmcota, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Euro 950105)", 0 )
GAME( 1994, xmcotau, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (USA 950105)", 0 )
GAME( 1994, xmcotah, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Hispanic 950331)", 0 )
GAME( 1994, xmcotaj, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Japan 941222)", 0 )
GAME( 1994, xmcotaj1, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Japan 941219)", 0 )
GAME( 1994, xmcotaj2, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Japan 941217)", 0 )
GAME( 1994, xmcotajr, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Japan 941208 rent version)", 0 )
GAME( 1994, xmcotaa, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Asia 941217)", 0 )
GAME( 1994, armwar, 0, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Armored Warriors (Euro 941024)", 0 )
GAME( 1994, armwarr1, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Armored Warriors (Euro 941011)", 0 )
GAME( 1994, armwaru, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Armored Warriors (USA 941024)", 0 )
GAME( 1994, pgear, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Powered Gear: Strategic Variant Armor Equipment (Japan 941024)", 0 )
GAME( 1994, pgearr1, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Powered Gear: Strategic Variant Armor Equipment (Japan 940916)", 0 )
GAME( 1994, armwara, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Armored Warriors (Asia 940920)", 0 )
GAME( 1994, avsp, 0, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Alien vs. Predator (Euro 940520)", 0 ) GAME( 1994, avsp, 0, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Alien vs. Predator (Euro 940520)", 0 )
GAME( 1994, avspu, avsp, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Alien vs. Predator (USA 940520)", 0 ) GAME( 1994, avspu, avsp, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Alien vs. Predator (USA 940520)", 0 )
GAME( 1994, avspj, avsp, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Alien vs. Predator (Japan 940520)", 0 ) GAME( 1994, avspj, avsp, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Alien vs. Predator (Japan 940520)", 0 )
@ -7223,16 +7211,20 @@ GAME( 1994, vampjr1, dstlk, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Va
GAME( 1994, ringdest, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Ring of Destruction: Slammasters II (Euro 940902)", 0 ) GAME( 1994, ringdest, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Ring of Destruction: Slammasters II (Euro 940902)", 0 )
GAME( 1994, smbomb, ringdest, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Muscle Bomber: The International Blowout (Japan 940831)", 0 ) GAME( 1994, smbomb, ringdest, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Muscle Bomber: The International Blowout (Japan 940831)", 0 )
GAME( 1994, smbombr1, ringdest, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Muscle Bomber: The International Blowout (Japan 940808)", 0 ) GAME( 1994, smbombr1, ringdest, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Super Muscle Bomber: The International Blowout (Japan 940808)", 0 )
GAME( 1995, cybots, 0, cps2, cybots, cps2, ROT0, "Capcom", "Cyberbots: Fullmetal Madness (Euro 950424)", 0 ) GAME( 1994, armwar, 0, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Armored Warriors (Euro 941024)", 0 )
GAME( 1995, cybotsu, cybots, cps2, cybots, cps2, ROT0, "Capcom", "Cyberbots: Fullmetal Madness (USA 950424)", 0 ) GAME( 1994, armwarr1, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Armored Warriors (Euro 941011)", 0 )
GAME( 1995, cybotsj, cybots, cps2, cybots, cps2, ROT0, "Capcom", "Cyberbots: Fullmetal Madness (Japan 950420)", 0 ) GAME( 1994, armwaru, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Armored Warriors (USA 941024)", 0 )
GAME( 1995, msh, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Euro 951024)", 0 ) GAME( 1994, pgear, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Powered Gear: Strategic Variant Armor Equipment (Japan 941024)", 0 )
GAME( 1995, mshu, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (USA 951024)", 0 ) GAME( 1994, pgearr1, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Powered Gear: Strategic Variant Armor Equipment (Japan 940916)", 0 )
GAME( 1995, mshj, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Japan 951117)", 0 ) GAME( 1994, armwara, armwar, cps2, cps2_3p3b, cps2, ROT0, "Capcom", "Armored Warriors (Asia 940920)", 0 )
GAME( 1995, mshjr1, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Japan 951024)", 0 ) GAME( 1994, xmcota, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Euro 950105)", 0 )
GAME( 1995, msha, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Asia 951024)", 0 ) GAME( 1994, xmcotau, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (USA 950105)", 0 )
GAME( 1995, mshh, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Hispanic 951117)", 0 ) GAME( 1994, xmcotah, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Hispanic 950331)", 0 )
GAME( 1995, mshb, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Brazil 951117)", 0 ) GAME( 1994, xmcotaj, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Japan 941222)", 0 )
GAME( 1994, xmcotaj1, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Japan 941219)", 0 )
GAME( 1994, xmcotaj2, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Japan 941217)", 0 )
GAME( 1994, xmcotajr, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Japan 941208 rent version)", 0 )
GAME( 1994, xmcotaa, xmcota, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men: Children of the Atom (Asia 941217)", 0 )
GAME( 1995, nwarr, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Night Warriors: Darkstalkers' Revenge (Euro 950316)", 0 ) GAME( 1995, nwarr, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Night Warriors: Darkstalkers' Revenge (Euro 950316)", 0 )
GAME( 1995, nwarru, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Night Warriors: Darkstalkers' Revenge (USA 950406)", 0 ) GAME( 1995, nwarru, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Night Warriors: Darkstalkers' Revenge (USA 950406)", 0 )
GAME( 1995, nwarrh, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Night Warriors: Darkstalkers' Revenge (Hispanic 950403)", 0 ) GAME( 1995, nwarrh, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Night Warriors: Darkstalkers' Revenge (Hispanic 950403)", 0 )
@ -7240,6 +7232,9 @@ GAME( 1995, nwarrb, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Ni
GAME( 1995, vhuntj, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter: Darkstalkers' Revenge (Japan 950316)", 0 ) GAME( 1995, vhuntj, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter: Darkstalkers' Revenge (Japan 950316)", 0 )
GAME( 1995, vhuntjr1, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter: Darkstalkers' Revenge (Japan 950307)", 0 ) GAME( 1995, vhuntjr1, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter: Darkstalkers' Revenge (Japan 950307)", 0 )
GAME( 1995, vhuntjr2, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter: Darkstalkers' Revenge (Japan 950302)", 0 ) GAME( 1995, vhuntjr2, nwarr, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter: Darkstalkers' Revenge (Japan 950302)", 0 )
GAME( 1995, cybots, 0, cps2, cybots, cps2, ROT0, "Capcom", "Cyberbots: Fullmetal Madness (Euro 950424)", 0 )
GAME( 1995, cybotsu, cybots, cps2, cybots, cps2, ROT0, "Capcom", "Cyberbots: Fullmetal Madness (USA 950424)", 0 )
GAME( 1995, cybotsj, cybots, cps2, cybots, cps2, ROT0, "Capcom", "Cyberbots: Fullmetal Madness (Japan 950420)", 0 )
GAME( 1995, sfa, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Alpha: Warriors' Dreams (Euro 950727)", 0 ) GAME( 1995, sfa, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Alpha: Warriors' Dreams (Euro 950727)", 0 )
GAME( 1995, sfar1, sfa, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Alpha: Warriors' Dreams (Euro 950718)", 0 ) GAME( 1995, sfar1, sfa, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Alpha: Warriors' Dreams (Euro 950718)", 0 )
GAME( 1995, sfar2, sfa, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Alpha: Warriors' Dreams (Euro 950627)", 0 ) GAME( 1995, sfar2, sfa, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Alpha: Warriors' Dreams (Euro 950627)", 0 )
@ -7254,6 +7249,13 @@ GAME( 1995, sfzb, sfa, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "St
GAME( 1995, sfzbr1, sfa, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Zero (Brazil 950727)", 0 ) GAME( 1995, sfzbr1, sfa, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Zero (Brazil 950727)", 0 )
GAME( 1995, mmancp2u, megaman, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Mega Man - The Power Battle (CPS2, USA 951006, SAMPLE Version)", 0 ) GAME( 1995, mmancp2u, megaman, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Mega Man - The Power Battle (CPS2, USA 951006, SAMPLE Version)", 0 )
GAME( 1995, rmancp2j, megaman, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Rockman: The Power Battle (CPS2, Japan 950922)", 0 ) GAME( 1995, rmancp2j, megaman, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Rockman: The Power Battle (CPS2, Japan 950922)", 0 )
GAME( 1995, msh, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Euro 951024)", 0 )
GAME( 1995, mshu, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (USA 951024)", 0 )
GAME( 1995, mshj, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Japan 951117)", 0 )
GAME( 1995, mshjr1, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Japan 951024)", 0 )
GAME( 1995, msha, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Asia 951024)", 0 )
GAME( 1995, mshh, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Hispanic 951117)", 0 )
GAME( 1995, mshb, msh, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes (Brazil 951117)", 0 )
GAME( 1996, 19xx, 0, cps2, cps2_2p2b, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (USA 951207)", 0 ) GAME( 1996, 19xx, 0, cps2, cps2_2p2b, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (USA 951207)", 0 )
GAME( 1996, 19xxa, 19xx, cps2, cps2_2p2b, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (Asia 951207)", 0 ) GAME( 1996, 19xxa, 19xx, cps2, cps2_2p2b, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (Asia 951207)", 0 )
GAME( 1996, 19xxj, 19xx, cps2, cps2_2p2b, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (Japan 951225)", 0 ) GAME( 1996, 19xxj, 19xx, cps2, cps2_2p2b, cps2, ROT270, "Capcom", "19XX: The War Against Destiny (Japan 951225)", 0 )
@ -7270,10 +7272,6 @@ GAME( 1996, ddsomj, ddsom, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Du
GAME( 1996, ddsomjr1, ddsom, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Japan 960206)", 0 ) GAME( 1996, ddsomjr1, ddsom, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Japan 960206)", 0 )
GAME( 1996, ddsoma, ddsom, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Asia 960619)", 0 ) GAME( 1996, ddsoma, ddsom, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Asia 960619)", 0 )
GAME( 1996, ddsomb, ddsom, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Brazil 960223)", 0 ) GAME( 1996, ddsomb, ddsom, cps2, cps2_4p4b, cps2, ROT0, "Capcom", "Dungeons & Dragons: Shadow over Mystara (Brazil 960223)", 0 )
GAME( 1996, megaman2, 0, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Mega Man 2: The Power Fighters (USA 960708)", 0 )
GAME( 1996, megamn2a, megaman2, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Mega Man 2: The Power Fighters (Asia 960708)", 0 )
GAME( 1996, rckman2j, megaman2, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Rockman 2: The Power Fighters (Japan 960708)", 0 )
GAME( 1996, qndream, 0, cps2, qndream, cps2, ROT0, "Capcom", "Quiz Nanairo Dreams: Nijiirochou no Kiseki (Japan 960826)", 0 )
GAME( 1996, sfa2, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Alpha 2 (USA 960306)", 0 ) GAME( 1996, sfa2, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Alpha 2 (USA 960306)", 0 )
GAME( 1996, sfz2j, sfa2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Zero 2 (Japan 960227)", 0 ) GAME( 1996, sfz2j, sfa2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Zero 2 (Japan 960227)", 0 )
GAME( 1996, sfz2a, sfa2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Zero 2 (Asia 960227)", 0 ) GAME( 1996, sfz2a, sfa2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Street Fighter Zero 2 (Asia 960227)", 0 )
@ -7288,6 +7286,10 @@ GAME( 1996, sfz2aa, sfa2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "St
GAME( 1996, spf2t, 0, cps2, cps2_2p2b, cps2, ROT0, "Capcom", "Super Puzzle Fighter II Turbo (USA 960620)", 0 ) GAME( 1996, spf2t, 0, cps2, cps2_2p2b, cps2, ROT0, "Capcom", "Super Puzzle Fighter II Turbo (USA 960620)", 0 )
GAME( 1996, spf2xj, spf2t, cps2, cps2_2p2b, cps2, ROT0, "Capcom", "Super Puzzle Fighter II X (Japan 960531)", 0 ) GAME( 1996, spf2xj, spf2t, cps2, cps2_2p2b, cps2, ROT0, "Capcom", "Super Puzzle Fighter II X (Japan 960531)", 0 )
GAME( 1996, spf2ta, spf2t, cps2, cps2_2p2b, cps2, ROT0, "Capcom", "Super Puzzle Fighter II Turbo (Asia 960529)", 0 ) GAME( 1996, spf2ta, spf2t, cps2, cps2_2p2b, cps2, ROT0, "Capcom", "Super Puzzle Fighter II Turbo (Asia 960529)", 0 )
GAME( 1996, megaman2, 0, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Mega Man 2: The Power Fighters (USA 960708)", 0 )
GAME( 1996, megamn2a, megaman2, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Mega Man 2: The Power Fighters (Asia 960708)", 0 )
GAME( 1996, rckman2j, megaman2, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Rockman 2: The Power Fighters (Japan 960708)", 0 )
GAME( 1996, qndream, 0, cps2, qndream, cps2, ROT0, "Capcom", "Quiz Nanairo Dreams: Nijiirochou no Kiseki (Japan 960826)", 0 )
GAME( 1996, xmvsf, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men Vs. Street Fighter (Euro 961004)", 0 ) GAME( 1996, xmvsf, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men Vs. Street Fighter (Euro 961004)", 0 )
GAME( 1996, xmvsfr1, xmvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men Vs. Street Fighter (Euro 960910)", 0 ) GAME( 1996, xmvsfr1, xmvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men Vs. Street Fighter (Euro 960910)", 0 )
GAME( 1996, xmvsfu, xmvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men Vs. Street Fighter (USA 961023)", 0 ) GAME( 1996, xmvsfu, xmvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-Men Vs. Street Fighter (USA 961023)", 0 )
@ -7302,10 +7304,11 @@ GAME( 1996, xmvsfb, xmvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "X-
GAME( 1997, batcir, 0, cps2, cps2_4p2b, cps2, ROT0, "Capcom", "Battle Circuit (Euro 970319)", 0 ) GAME( 1997, batcir, 0, cps2, cps2_4p2b, cps2, ROT0, "Capcom", "Battle Circuit (Euro 970319)", 0 )
GAME( 1997, batcira, batcir, cps2, cps2_4p2b, cps2, ROT0, "Capcom", "Battle Circuit (Asia 970319)", 0 ) GAME( 1997, batcira, batcir, cps2, cps2_4p2b, cps2, ROT0, "Capcom", "Battle Circuit (Asia 970319)", 0 )
GAME( 1997, batcirj, batcir, cps2, cps2_4p2b, cps2, ROT0, "Capcom", "Battle Circuit (Japan 970319)", 0 ) GAME( 1997, batcirj, batcir, cps2, cps2_4p2b, cps2, ROT0, "Capcom", "Battle Circuit (Japan 970319)", 0 )
GAME( 1997, csclub, 0, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Capcom Sports Club (Euro 970722)", 0 ) GAME( 1997, vsav, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (Euro 970519)", 0 )
GAME( 1997, cscluba, csclub, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Capcom Sports Club (Asia 970722)", 0 ) GAME( 1997, vsavu, vsav, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (USA 970519)", 0 )
GAME( 1997, csclubj, csclub, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Capcom Sports Club (Japan 970722)", 0 ) GAME( 1997, vsavj, vsav, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (Japan 970519)", 0 )
GAME( 1997, csclubh, csclub, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Capcom Sports Club (Hispanic 970722)", 0 ) GAME( 1997, vsava, vsav, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (Asia 970519)", 0 )
GAME( 1997, vsavh, vsav, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (Hispanic 970519)", 0 )
GAME( 1997, mshvsf, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (Euro 970625)", 0 ) GAME( 1997, mshvsf, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (Euro 970625)", 0 )
GAME( 1997, mshvsfu, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (USA 970827)", 0 ) GAME( 1997, mshvsfu, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (USA 970827)", 0 )
GAME( 1997, mshvsfu1, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (USA 970625)", 0 ) GAME( 1997, mshvsfu1, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (USA 970625)", 0 )
@ -7317,17 +7320,16 @@ GAME( 1997, mshvsfa, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Ma
GAME( 1997, mshvsfa1, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (Asia 970620)", 0 ) GAME( 1997, mshvsfa1, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (Asia 970620)", 0 )
GAME( 1997, mshvsfb, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (Brazil 970827)", 0 ) GAME( 1997, mshvsfb, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (Brazil 970827)", 0 )
GAME( 1997, mshvsfb1, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (Brazil 970625)", 0 ) GAME( 1997, mshvsfb1, mshvsf, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Super Heroes Vs. Street Fighter (Brazil 970625)", 0 )
GAME( 1997, csclub, 0, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Capcom Sports Club (Euro 970722)", 0 )
GAME( 1997, cscluba, csclub, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Capcom Sports Club (Asia 970722)", 0 )
GAME( 1997, csclubj, csclub, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Capcom Sports Club (Japan 970722)", 0 )
GAME( 1997, csclubh, csclub, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Capcom Sports Club (Hispanic 970722)", 0 )
GAME( 1997, sgemf, 0, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Super Gem Fighter Mini Mix (USA 970904)", 0 ) GAME( 1997, sgemf, 0, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Super Gem Fighter Mini Mix (USA 970904)", 0 )
GAME( 1997, pfghtj, sgemf, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Pocket Fighter (Japan 970904)", 0 ) GAME( 1997, pfghtj, sgemf, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Pocket Fighter (Japan 970904)", 0 )
GAME( 1997, sgemfa, sgemf, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Super Gem Fighter: Mini Mix (Asia 970904)", 0 ) GAME( 1997, sgemfa, sgemf, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Super Gem Fighter: Mini Mix (Asia 970904)", 0 )
GAME( 1997, sgemfh, sgemf, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Super Gem Fighter: Mini Mix (Hispanic 970904)", 0 ) GAME( 1997, sgemfh, sgemf, cps2, cps2_2p3b, cps2, ROT0, "Capcom", "Super Gem Fighter: Mini Mix (Hispanic 970904)", 0 )
GAME( 1997, vhunt2, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter 2: Darkstalkers Revenge (Japan 970929)", 0 ) GAME( 1997, vhunt2, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter 2: Darkstalkers Revenge (Japan 970929)", 0 )
GAME( 1997, vhunt2r1, vhunt2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter 2: Darkstalkers Revenge (Japan 970913)", 0 ) GAME( 1997, vhunt2r1, vhunt2, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Hunter 2: Darkstalkers Revenge (Japan 970913)", 0 )
GAME( 1997, vsav, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (Euro 970519)", 0 )
GAME( 1997, vsavu, vsav, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (USA 970519)", 0 )
GAME( 1997, vsavj, vsav, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (Japan 970519)", 0 )
GAME( 1997, vsava, vsav, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (Asia 970519)", 0 )
GAME( 1997, vsavh, vsav, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior: The Lord of Vampire (Hispanic 970519)", 0 )
GAME( 1997, vsav2, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior 2: The Lord of Vampire (Japan 970913)", 0 ) GAME( 1997, vsav2, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Vampire Savior 2: The Lord of Vampire (Japan 970913)", 0 )
GAME( 1998, mvsc, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Vs. Capcom: Clash of Super Heroes (Euro 980112)", 0 ) GAME( 1998, mvsc, 0, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Vs. Capcom: Clash of Super Heroes (Euro 980112)", 0 )
GAME( 1998, mvscu, mvsc, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Vs. Capcom: Clash of Super Heroes (USA 980123)", 0 ) GAME( 1998, mvscu, mvsc, cps2, cps2_2p6b, cps2, ROT0, "Capcom", "Marvel Vs. Capcom: Clash of Super Heroes (USA 980123)", 0 )

View File

@ -4,14 +4,13 @@
Final Crash is a bootleg of Final Fight Final Crash is a bootleg of Final Fight
Final Fight is by Capcom and runs on CPS1 hardawre Final Fight is by Capcom and runs on CPS1 hardware
The bootleg was manufactured by Playmark of Italy The bootleg was manufactured by Playmark of Italy
this driver depends heavily on cps1.c, but has been this driver depends heavily on cps1.c, but has been
kept apart in an attempt to keep cps1.c clutter free kept apart in an attempt to keep cps1.c clutter free
todo: Sound is very different from CPS1.
Add Sound (very different to CPS1)
--- ---
@ -36,19 +35,75 @@ from 2.bin to 9.bin program eproms
#include "driver.h" #include "driver.h"
#include "cpu/m68000/m68kmame.h" #include "cpu/m68000/m68kmame.h"
#include "cps1.h" #include "cps1.h"
#include "sound/2203intf.h"
#include "sound/msm5205.h"
static int sample_buffer1, sample_buffer2;
static int sample_select1, sample_select2;
static WRITE16_HANDLER( fcrash_soundlatch_w )
{
if (ACCESSING_BITS_0_7)
{
soundlatch_w(machine,0,data & 0xff);
cpunum_set_input_line(machine, 1, 0, HOLD_LINE);
}
}
static WRITE8_HANDLER( fcrash_snd_bankswitch_w )
{
UINT8 *RAM = memory_region(REGION_CPU2);
int bankaddr;
sndti_set_output_gain(SOUND_MSM5205, 0, 0, (data & 0x08) ? 0.0 : 1.0);
sndti_set_output_gain(SOUND_MSM5205, 1, 0, (data & 0x10) ? 0.0 : 1.0);
bankaddr = ((data & 7) * 0x4000);
memory_set_bankptr(1,&RAM[0x10000 + bankaddr]);
}
static void m5205_int1(int data)
{
MSM5205_data_w(0, sample_buffer1 & 0x0F);
sample_buffer1 >>= 4;
sample_select1 ^= 1;
if (sample_select1 == 0)
cpunum_set_input_line(Machine, 1, INPUT_LINE_NMI, PULSE_LINE);
}
static void m5205_int2(int data)
{
MSM5205_data_w(1, sample_buffer2 & 0x0F);
sample_buffer2 >>= 4;
sample_select2 ^= 1;
}
static WRITE8_HANDLER( fcrash_msm5205_0_data_w )
{
sample_buffer1 = data;
}
static WRITE8_HANDLER( fcrash_msm5205_1_data_w )
{
sample_buffer2 = data;
}
/* not verified */ /* not verified */
#define CPS1_ROWSCROLL_OFFS 0x20 /* base of row scroll offsets in other RAM */ #define CPS1_ROWSCROLL_OFFS (0x20/2) /* base of row scroll offsets in other RAM */
static void fcrash_update_transmasks(void) static void fcrash_update_transmasks(void)
{ {
int i; int i;
int priority[4]; int priority[4];
priority[0]=0x66; priority[0]=0x26;
priority[1]=0x70; priority[1]=0x30;
priority[2]=0x68; priority[2]=0x28;
priority[3]=0x72; priority[3]=0x32;
for (i = 0;i < 4;i++) for (i = 0;i < 4;i++)
{ {
@ -56,7 +111,7 @@ static void fcrash_update_transmasks(void)
/* Get transparency registers */ /* Get transparency registers */
if (priority[i]) if (priority[i])
mask = cps1_port(priority[i]) ^ 0xffff; mask = cps1_cps_b_regs[priority[i]/2] ^ 0xffff;
else mask = 0xffff; /* completely transparent if priority masks not defined (mercs, qad) */ else mask = 0xffff; /* completely transparent if priority masks not defined (mercs, qad) */
tilemap_set_transmask(cps1_bg_tilemap[0],i,mask,0x8000); tilemap_set_transmask(cps1_bg_tilemap[0],i,mask,0x8000);
@ -147,12 +202,12 @@ static void fcrash_build_palette(running_machine *machine)
static VIDEO_UPDATE( fcrash ) static VIDEO_UPDATE( fcrash )
{ {
int layercontrol,l0,l1,l2,l3; int layercontrol,l0,l1,l2,l3;
int videocontrol=cps1_port(0x22); int videocontrol=cps1_cps_a_regs[0x22/2];
flip_screen_set(videocontrol & 0x8000); flip_screen_set(videocontrol & 0x8000);
layercontrol = cps1_output[0x60/2]; layercontrol = cps1_cps_b_regs[0x20/2];
/* Get video memory base registers */ /* Get video memory base registers */
cps1_get_video_base(); cps1_get_video_base();
@ -172,7 +227,7 @@ static VIDEO_UPDATE( fcrash )
tilemap_set_scroll_rows(cps1_bg_tilemap[1],1024); tilemap_set_scroll_rows(cps1_bg_tilemap[1],1024);
otheroffs = cps1_port(CPS1_ROWSCROLL_OFFS); otheroffs = cps1_cps_a_regs[CPS1_ROWSCROLL_OFFS];
for (i = 0;i < 256;i++) for (i = 0;i < 256;i++)
tilemap_set_scrollx(cps1_bg_tilemap[1],(i - scrly) & 0x3ff,cps1_scroll2x + cps1_other[(i + otheroffs) & 0x3ff]); tilemap_set_scrollx(cps1_bg_tilemap[1],(i - scrly) & 0x3ff,cps1_scroll2x + cps1_other[(i + otheroffs) & 0x3ff]);
@ -215,23 +270,32 @@ static VIDEO_UPDATE( fcrash )
} }
static ADDRESS_MAP_START( fcrash_readmem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x1fffff) AM_READ(SMH_ROM) /* 68000 ROM */ static ADDRESS_MAP_START( fcrash_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x1fffff) AM_ROM
AM_RANGE(0x800030, 0x800031) AM_WRITE(cps1_coinctrl_w)
AM_RANGE(0x800100, 0x80013f) AM_RAM AM_BASE(&cps1_cps_a_regs) /* CPS-A custom */
AM_RANGE(0x800140, 0x80017f) AM_RAM AM_BASE(&cps1_cps_b_regs) /* CPS-B custom */
AM_RANGE(0x880000, 0x880001) AM_READ(cps1_in1_r) /* Player input ports */ AM_RANGE(0x880000, 0x880001) AM_READ(cps1_in1_r) /* Player input ports */
AM_RANGE(0x880008, 0x88000f) AM_READ(cps1_input_r) /* System input ports / Dip Switches */ AM_RANGE(0x880006, 0x880007) AM_WRITE(fcrash_soundlatch_w) /* Sound command */
AM_RANGE(0x800100, 0x8001ff) AM_READ(cps1_output_r) /* Output ports */ AM_RANGE(0x880008, 0x88000f) AM_READ(cps1_dsw_r) /* System input ports / Dip Switches */
AM_RANGE(0x900000, 0x92ffff) AM_READ(SMH_RAM) /* SF2CE executes code from here */ AM_RANGE(0x890000, 0x890001) AM_WRITENOP // palette related?
AM_RANGE(0xf1c000, 0xf1c001) AM_READ(cps1_in2_r) AM_RANGE(0x900000, 0x92ffff) AM_RAM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size)
AM_RANGE(0xf1c002, 0xf1c003) AM_READ(cps1_in3_r) AM_RANGE(0xff0000, 0xffffff) AM_RAM
AM_RANGE(0xff0000, 0xffffff) AM_READ(SMH_RAM) /* RAM */
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( fcrash_writemem, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x000000, 0x1fffff) AM_WRITE(SMH_ROM) /* ROM */ AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x800030, 0x800031) AM_WRITE(cps1_coinctrl_w) AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(1)
AM_RANGE(0x800100, 0x8001ff) AM_WRITE(cps1_output_w) AM_BASE(&cps1_output) AM_SIZE(&cps1_output_size) /* Output ports */ AM_RANGE(0xd000, 0xd7ff) AM_RAM
AM_RANGE(0x900000, 0x92ffff) AM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) AM_RANGE(0xd800, 0xd800) AM_READWRITE(YM2203_status_port_0_r, YM2203_control_port_0_w)
AM_RANGE(0xff0000, 0xffffff) AM_WRITE(SMH_RAM) /* RAM */ AM_RANGE(0xd801, 0xd801) AM_READWRITE(YM2203_read_port_0_r, YM2203_write_port_0_w)
AM_RANGE(0xdc00, 0xdc00) AM_READWRITE(YM2203_status_port_0_r, YM2203_control_port_0_w)
AM_RANGE(0xdc01, 0xdc01) AM_READWRITE(YM2203_read_port_0_r, YM2203_write_port_0_w)
AM_RANGE(0xe000, 0xe000) AM_WRITE(fcrash_snd_bankswitch_w)
AM_RANGE(0xe400, 0xe400) AM_READ(soundlatch_r)
AM_RANGE(0xe800, 0xe800) AM_WRITE(fcrash_msm5205_0_data_w)
AM_RANGE(0xec00, 0xec00) AM_WRITE(fcrash_msm5205_1_data_w)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -340,16 +404,29 @@ static INPUT_PORTS_START( fcrash )
INPUT_PORTS_END INPUT_PORTS_END
static const struct MSM5205interface msm5205_interface1 =
{
m5205_int1, /* interrupt function */
MSM5205_S96_4B /* 4KHz 4-bit */
};
static const struct MSM5205interface msm5205_interface2 =
{
m5205_int2, /* interrupt function */
MSM5205_S96_4B /* 4KHz 4-bit */
};
static MACHINE_DRIVER_START( fcrash ) static MACHINE_DRIVER_START( fcrash )
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD_TAG("main", M68000, 10000000) MDRV_CPU_ADD_TAG("main", M68000, 10000000)
MDRV_CPU_PROGRAM_MAP(fcrash_readmem,fcrash_writemem) MDRV_CPU_PROGRAM_MAP(fcrash_map,0)
MDRV_CPU_VBLANK_INT("main", cps1_interrupt) MDRV_CPU_VBLANK_INT("main", cps1_interrupt)
// MDRV_CPU_ADD_TAG("sound", Z80, 4000000) /* ???? */ MDRV_CPU_ADD_TAG("sound", Z80, 24000000/6) /* ? */
// /* audio CPU */ MDRV_CPU_PROGRAM_MAP(sound_map,0)
// MDRV_CPU_PROGRAM_MAP(sound_readmem,sound_writemem)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("main", RASTER) MDRV_SCREEN_ADD("main", RASTER)
@ -365,6 +442,29 @@ static MACHINE_DRIVER_START( fcrash )
MDRV_VIDEO_START(cps1) MDRV_VIDEO_START(cps1)
MDRV_VIDEO_EOF(cps1) MDRV_VIDEO_EOF(cps1)
MDRV_VIDEO_UPDATE(fcrash) MDRV_VIDEO_UPDATE(fcrash)
// sound hardware
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD(YM2203, 24000000/6) /* ? */
MDRV_SOUND_ROUTE(0, "mono", 0.10)
MDRV_SOUND_ROUTE(1, "mono", 0.10)
MDRV_SOUND_ROUTE(2, "mono", 0.10)
MDRV_SOUND_ROUTE(3, "mono", 1.0)
MDRV_SOUND_ADD(YM2203, 24000000/6) /* ? */
MDRV_SOUND_ROUTE(0, "mono", 0.10)
MDRV_SOUND_ROUTE(1, "mono", 0.10)
MDRV_SOUND_ROUTE(2, "mono", 0.10)
MDRV_SOUND_ROUTE(3, "mono", 1.0)
MDRV_SOUND_ADD(MSM5205, 24000000/64) /* ? */
MDRV_SOUND_CONFIG(msm5205_interface1)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MDRV_SOUND_ADD(MSM5205, 24000000/64) /* ? */
MDRV_SOUND_CONFIG(msm5205_interface2)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_DRIVER_END MACHINE_DRIVER_END
@ -405,4 +505,4 @@ ROM_START( fcrash )
ROM_RELOAD( 0x10000, 0x20000 ) ROM_RELOAD( 0x10000, 0x20000 )
ROM_END ROM_END
GAME( 1990, fcrash, ffight, fcrash, fcrash, cps1, ROT0, "Playmark, bootleg [Capcom]", "Final Crash (World, bootleg)",GAME_NO_SOUND ) GAME( 1990, fcrash, ffight, fcrash, fcrash, cps1, ROT0, "Playmark, bootleg [Capcom]", "Final Crash (World, bootleg)", 0 )

View File

@ -15,7 +15,7 @@ INTERRUPT_GEN( cps1_qsound_interrupt );
extern const struct QSound_interface qsound_interface; extern const struct QSound_interface qsound_interface;
READ16_HANDLER( cps1_input_r ); READ16_HANDLER( cps1_dsw_r );
READ16_HANDLER( cps1_in1_r ); READ16_HANDLER( cps1_in1_r );
READ16_HANDLER( cps1_in2_r ); READ16_HANDLER( cps1_in2_r );
READ16_HANDLER( cps1_in3_r ); READ16_HANDLER( cps1_in3_r );
@ -45,9 +45,9 @@ extern int cps1_scanline2;
extern int cps1_scancalls; extern int cps1_scancalls;
extern UINT16 *cps1_gfxram; /* Video RAM */ extern UINT16 *cps1_gfxram; /* Video RAM */
extern UINT16 *cps1_output; /* Output ports */ extern UINT16 *cps1_cps_a_regs;
extern UINT16 *cps1_cps_b_regs;
extern size_t cps1_gfxram_size; extern size_t cps1_gfxram_size;
extern size_t cps1_output_size;
extern UINT16 *cps1_other; extern UINT16 *cps1_other;
extern tilemap *cps1_bg_tilemap[3]; extern tilemap *cps1_bg_tilemap[3];
@ -60,9 +60,9 @@ extern UINT16 *cps2_objram1,*cps2_objram2;
extern UINT16 *cps2_output; extern UINT16 *cps2_output;
extern size_t cps2_output_size; extern size_t cps2_output_size;
int cps1_port(int offset); WRITE16_HANDLER( cps1_cps_a_w );
READ16_HANDLER( cps1_output_r ); WRITE16_HANDLER( cps1_cps_b_w );
WRITE16_HANDLER( cps1_output_w ); READ16_HANDLER( cps1_cps_b_r );
DRIVER_INIT( cps1 ); DRIVER_INIT( cps1 );
DRIVER_INIT( cps2_video ); DRIVER_INIT( cps2_video );

View File

@ -25,17 +25,19 @@ Forgotten Worlds / Lost Worlds 1988 88618B-2 LWCHR LWI
Ghouls 'n Ghosts (World / US) 1988 88620B-2 DM620 LWIO None CPS-B-01 DL-0411-10001 None Ghouls 'n Ghosts (World / US) 1988 88620B-2 DM620 LWIO None CPS-B-01 DL-0411-10001 None
(alt B-board revision - Japan) 88622B-2 DM22A LWIO 88622-C-1 CPS-B-01 DL-0411-10001 None (alt B-board revision - Japan) 88622B-2 DM22A LWIO 88622-C-1 CPS-B-01 DL-0411-10001 None
Strider 1989 89624B-2 ST24M1 LWIO 88622-C-1 CPS-B-01 DL-0411-10001 None Strider 1989 89624B-2 ST24M1 LWIO 88622-C-1 CPS-B-01 DL-0411-10001 None
(alt B-board revision) 89624B-3 ST24B2 LWIO (alt B-board revision) 89624B-2 ST24M2 LWIO 88622-C-2 CPS-B-01 DL-0411-10001 None
(alt B-board revision) 89624B-3 ST24B2 LWIO 88622-C-2 CPS-B-01 DL-0411-10001 None
(alt B-board revision) ? ST22B ? (alt B-board revision) ? ST22B ?
Dynasty Wars 1989 88622B-3 TK22B IOB1 88622-C-2 CPS-B-02 DL-0411-10002 Dynasty Wars 1989 88624B-3 TK24B? ? 88622-C-2 CPS-B-02 DL-0411-10002
(alt B-board revision - Japan) 88622B-3 TK22B IOB1
Willow 1989 89624B-3 WL24B LWIO 88622-C-4 CPS-B-03 DL-0411-10003 None Willow 1989 89624B-3 WL24B LWIO 88622-C-4 CPS-B-03 DL-0411-10003 None
(alt C-board revision) 88622-C-2 (alt C-board revision) 88622-C-2
UN Squadron / Area 88 1989 89624B-3 AR24B LWIO 88622-C-4 CPS-B-11 DL-0411-10004 None UN Squadron / Area 88 1989 89624B-3 AR24B LWIO 88622-C-4 CPS-B-11 DL-0411-10004 None
(alt B-board revision - Japan) 88622B-2 AR22B LWIO (alt B-board revision - Japan) 88622B-2 AR22B LWIO
Final Fight (first rev) 1989 89624B-3 S224B IOB1 88622-C-5 CPS-B-04 DL-0411-10005 None Final Fight (first rev) 1989 89624B-3 S224B IOB1 88622-C-5 CPS-B-04 DL-0411-10005 None
Final Fight (US 900112) ? CPS-B-04@ DL-0411-10001 None Final Fight (US 900112) ? CPS-B-04@ DL-0411-10001 None
Final Fight (US 900613) ? CPS-B-05 DL-0411-10006 Final Fight (US 900613) 88622-C-5 CPS-B-05 DL-0411-10006
Final Fight (Japan 900305) (alt B-board revision) ? ? ? CPS-B-02 DL-0411-10002 Final Fight (Japan 900305) (alt B-board revision) 88622B-2 S222B? LWIO 88622-C-5 CPS-B-02 DL-0411-10002
1941 1990 ? YI24B ? 88622-C-5 CPS-B-05 DL-0411-10006 ? 1941 1990 ? YI24B ? 88622-C-5 CPS-B-05 DL-0411-10006 ?
Mercs 1990 89624B-3 0224B IOB1 90628-C-1 CPS-B-12 DL-0411-10007 C628 Mercs 1990 89624B-3 0224B IOB1 90628-C-1 CPS-B-12 DL-0411-10007 C628
(alt C-board revision) 90628-C-2 (alt C-board revision) 90628-C-2
@ -44,9 +46,9 @@ Chiki Chiki Boys / Mega Twins 1990 89624B-3 CK24B IOB
Nemo 1990 89624B-3 NM24B IOB1 88622-C-5 CPS-B-15 DL-0411-10010 None Nemo 1990 89624B-3 NM24B IOB1 88622-C-5 CPS-B-15 DL-0411-10010 None
Carrier Air Wing / U.S. Navy 1990 89624B-3 CA24B IOB1 88622-C-5 CPS-B-16 DL-0411-10011 None Carrier Air Wing / U.S. Navy 1990 89624B-3 CA24B IOB1 88622-C-5 CPS-B-16 DL-0411-10011 None
(alt B-board revision - Japan) 89625B-1 CA22B (alt B-board revision - Japan) 89625B-1 CA22B
Street Fighter II (910214) 1991 89622B-3 STF29 IOB1 90632C-1 CPS-B-17 DL-0411-10012 C632 Street Fighter II (910214) 1991 90629B-2 STF29 IOB1 90632C-1 CPS-B-17 DL-0411-10012 C632
Street Fighter II (US 910206) CPS-B-17 DL-0411-10012 Street Fighter II (US 910206) CPS-B-17 DL-0411-10012
Street Fighter II (US 910228) ? CPS-B-18 ? Street Fighter II (US 910228) CPS-B-18 DL-0411-10013 C632B
Street Fighter II (Japan 910306) CPS-B-12 DL-0411-10007 Street Fighter II (Japan 910306) CPS-B-12 DL-0411-10007
Street Fighter II (US 910318) CPS-B-05 DL-0411-10006 Street Fighter II (US 910318) CPS-B-05 DL-0411-10006
Street Fighter II (US 910411) CPS-B-15 DL-0411-10010 Street Fighter II (US 910411) CPS-B-15 DL-0411-10010
@ -56,6 +58,7 @@ Street Fighter II (US 911101)
Street Fighter II (Japan 911210) CPS-B-13 DL-0411-10008 Street Fighter II (Japan 911210) CPS-B-13 DL-0411-10008
Three Wonders* 1991 89624B-3 RT24B IOB1 90630C-4 CPS-B-21 DL-0921-10014 IOC1 Three Wonders* 1991 89624B-3 RT24B IOB1 90630C-4 CPS-B-21 DL-0921-10014 IOC1
(alt B-board revision - Japan) 89625B-1 RT22B IOB1 (alt B-board revision - Japan) 89625B-1 RT22B IOB1
(alt B-board revision) 91634B-2 ? ?
King of Dragons* 1991 90629B-3 KD29B IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 King of Dragons* 1991 90629B-3 KD29B IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1
Captain Commando* 1991 91635B-2 CC63B CCPRG IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 Captain Commando* 1991 91635B-2 CC63B CCPRG IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1
Knights of the Round* 1991 91635B-2 KR63B BPRG1 IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 Knights of the Round* 1991 91635B-2 KR63B BPRG1 IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1
@ -87,7 +90,8 @@ values as Street Fighter 2 CE/Turbo.
OUTPUT PORTS CPS-A Registers
---------------
0x00-0x01 OBJ RAM base (/256) 0x00-0x01 OBJ RAM base (/256)
0x02-0x03 Scroll1 (8x8) RAM base (/256) 0x02-0x03 Scroll1 (8x8) RAM base (/256)
0x04-0x05 Scroll2 (16x16) RAM base (/256) 0x04-0x05 Scroll2 (16x16) RAM base (/256)
@ -125,7 +129,7 @@ OUTPUT PORTS
Mega Twins (underwater, cave) Mega Twins (underwater, cave)
Carrier Air Wing (hazy background at beginning of mission 8, put 07 at ff8501 to jump there) Carrier Air Wing (hazy background at beginning of mission 8, put 07 at ff8501 to jump there)
Magic Sword (fire on floor 3; screen distort after continue) Magic Sword (fire on floor 3; screen distort after continue)
Varth (title screen) Varth (title screen, end of stage 4)
Captain Commando (end game sequence) Captain Commando (end game sequence)
Tests done on msword at the beginning of gameplay (many thanks to Corrado Tomaselli for these): Tests done on msword at the beginning of gameplay (many thanks to Corrado Tomaselli for these):
@ -141,10 +145,14 @@ OUTPUT PORTS
TODO: TODO:
the scroll2/scroll3 disable bits are supported by the emulation, the scroll2/scroll3 disable bits are supported by the emulation,
while the scroll1 weird effect is not (it doesn't seem to make a while the scroll1 weird effect is not (it doesn't seem to make a
difference on any game). difference in any game).
Some registers move from game to game.. following example strider CPS-B Registers
---------------
Unlike CPS-A registers, which are at fixed addresses, CPS-B registers move from game to game.
Following example strider
0x66-0x67 Layer control register 0x66-0x67 Layer control register
bits 14-15 seem to be unused bits 14-15 seem to be unused
ghouls sets bits 15 in service mode when you press button 2 in ghouls sets bits 15 in service mode when you press button 2 in
@ -197,10 +205,6 @@ Some registers move from game to game.. following example strider
bits 0-3 have been verified on a msword pcb, while bits 4-5 are only bits 0-3 have been verified on a msword pcb, while bits 4-5 are only
supposed. supposed.
Fixed registers
0x80-0x81 Sound command
0x88-0x89 Sound fade
A special note has to be made about tile/sprite codes. Even if all graphics are A special note has to be made about tile/sprite codes. Even if all graphics are
stored together in the same ROMs, the hardware knows which part of the ROM space stored together in the same ROMs, the hardware knows which part of the ROM space
@ -269,27 +273,22 @@ CPS2:
IRQ4 is some sort of scanline interrupt used for that purpose. IRQ4 is some sort of scanline interrupt used for that purpose.
* Its unknown what CPS2_OBJ_BASE register (0x400000) does but it is not a object base * Its unknown what CPS2_OBJ_BASE register (0x400000) does but it is not a object base
register. All games use 0x7000 even if 0x7080 is used at this register (checked on register. The base is 0x7000 for all games even if 0x7080 is written to this register
real HW). Maybe it sets the object bank used when cps2_objram_bank is set. (checked on real HW). Maybe it sets the object bank used when cps2_objram_bank is set.
* Sprites are currently lagged by one frame to keep sync with backgrounds. This causes * Sprites are currently lagged by one frame to keep sync with backgrounds. This causes
sprites to stay on screen one frame longer (visable in VSAV attract mode). sprites to stay on screen one frame longer (visible in VSAV attract mode).
Marvel Vs. Capcom Marvel Vs. Capcom
* Sometimes currupt gfx are displayed on the 32x32 layer as the screen flashes at the * Sometimes corrupt gfx are displayed on the 32x32 layer as the screen flashes at the
start of super combo moves. The problem seems to be due to tiles being fetched before start of super combo moves. The problem seems to be due to tiles being fetched before
the first 32x32 tile offset and results in data coming from 16x16 or 8x8 tiles instead. the first 32x32 tile offset and results in data coming from 16x16 or 8x8 tiles instead.
CPS1: CPS1:
SF2 SF2
* Missing chain in the foreground in Ken's level, and sign in Chun Li's level. * Missing chain in the foreground in Ken's level, and sign in Chun Li's level.
Those graphics are in the backmost layer. Those graphics are in the backmost layer. Probably they are leftover from game
development and aren't supposed to be visible.
King of Dragons (World).
* Distortion effect missing on character description screen during attract
mode. The game rapidly toggles on and off the layer enable bit.
I think this IS the correct behaviour. The Japanese version does the
distortion as expected.
3wonders 3wonders
* writes to output ports 42, 44, 46. * writes to output ports 42, 44, 46.
@ -302,7 +301,7 @@ Unknown issues
============== ==============
There are often some redundant high bits in the scroll layer's attributes. There are often some redundant high bits in the scroll layer's attributes.
I think that these are spare bits that the game uses for to store additional I think that these are spare bits that the game uses to store additional
information, not used by the hardware. information, not used by the hardware.
The games seem to use them to mark platforms, kill zones and no-go areas. The games seem to use them to mark platforms, kill zones and no-go areas.
@ -358,26 +357,27 @@ struct CPS1config
int mult_result_lo; int mult_result_lo;
int mult_result_hi; int mult_result_hi;
/* unknown registers which might be related to the multiply protection */
int unknown1;
int unknown2;
int unknown3;
int layer_control; int layer_control;
int priority[4]; int priority[4];
int palette_control; /* Control register? seems to be always 0x3f */ int palette_control;
/* ideally, the layer enable masks should consist of only one bit, */ /* ideally, the layer enable masks should consist of only one bit, */
/* but in many cases it is unknown which bit is which. */ /* but in many cases it is unknown which bit is which. */
int layer_enable_mask[5]; int layer_enable_mask[5];
/* these depend on the B-board model and PAL */
int bank_sizes[4]; int bank_sizes[4];
const struct gfx_range *bank_mapper; const struct gfx_range *bank_mapper;
int bank_scroll1; /* some C-boards have additional I/O for extra buttons/extra players */
int bank_scroll2; int in2_addr;
int bank_scroll3; int in3_addr;
int out2_addr;
/* Some characters aren't visible */
const int start_scroll2;
const int end_scroll2;
const int start_scroll3;
const int end_scroll3;
int bootleg_kludge; int bootleg_kludge;
}; };
@ -385,35 +385,42 @@ struct CPS1config
static const struct CPS1config *cps1_game_config; static const struct CPS1config *cps1_game_config;
/* CPSB ID multiply protection ctrl priority masks palctrl layer enable masks */ #define __not_applicable__ -1,-1,-1,-1,-1,-1,-1
#define CPS_B_01 0x00,0x0000, 0,0,0,0, /* n/a */ 0x66,{0x68,0x6a,0x6c,0x6e},0x70, {0x02,0x04,0x08,0x30,0x30}
#define CPS_B_02 0x60,0x0002, 0,0,0,0, /* n/a */ 0x6c,{0x6a,0x68,0x66,0x64},0x62, {0x02,0x04,0x08,0x00,0x00}
#define CPS_B_03 0x00,0x0000, 0,0,0,0, /* n/a */ 0x70,{0x6e,0x6c,0x6a,0x68},0x66, {0x20,0x10,0x08,0x00,0x00}
#define CPS_B_04 0x60,0x0004, 0,0,0,0, /* n/a */ 0x6e,{0x66,0x70,0x68,0x72},0x6a, {0x02,0x0c,0x0c,0x00,0x00}
#define CPS_B_05 0x60,0x0005, 0,0,0,0, /* n/a */ 0x68,{0x6a,0x6c,0x6e,0x70},0x72, {0x02,0x08,0x20,0x14,0x14}
#define CPS_B_11 0x72,0x0401, 0,0,0,0, /* n/a */ 0x66,{0x68,0x6a,0x6c,0x6e},0x70, {0x08,0x10,0x20,0x00,0x00}
#define CPS_B_12 0x60,0x0402, 0,0,0,0, /* n/a */ 0x6c,{0x6a,0x68,0x66,0x64},0x62, {0x02,0x04,0x08,0x00,0x00}
#define CPS_B_13 0x6e,0x0403, 0,0,0,0, /* n/a */ 0x62,{0x64,0x66,0x68,0x6a},0x6c, {0x20,0x02,0x04,0x00,0x00}
#define CPS_B_14 0x5e,0x0404, 0,0,0,0, /* n/a */ 0x52,{0x54,0x56,0x58,0x5a},0x5c, {0x08,0x20,0x10,0x00,0x00}
#define CPS_B_15 0x4e,0x0405, 0,0,0,0, /* n/a */ 0x42,{0x44,0x46,0x48,0x4a},0x4c, {0x04,0x02,0x20,0x00,0x00}
#define CPS_B_16 0x40,0x0406, 0,0,0,0, /* n/a */ 0x4c,{0x4a,0x48,0x46,0x44},0x42, {0x10,0x0a,0x0a,0x00,0x00}
#define CPS_B_17 0x48,0x0407, 0,0,0,0, /* n/a */ 0x54,{0x52,0x50,0x4e,0x4c},0x4a, {0x08,0x10,0x02,0x00,0x00}
#define CPS_B_18 0xd0,0x0408, 0,0,0,0, /* n/a */ 0xdc,{0xda,0xd8,0xd6,0xd4},0xd2, {0x10,0x08,0x02,0x00,0x00}
#define NOBATTRY 0x00,0x0000, 0x40,0x42,0x44,0x46, 0x66,{0x68,0x6a,0x6c,0x6e},0x70, {0x02,0x04,0x08,0x30,0x30} // pang3 sets layer enable to 0x26 on startup
#define BATTRY_1 0x72,0x0800, 0x4e,0x4c,0x4a,0x48, 0x68,{0x66,0x64,0x62,0x60},0x70, {0x20,0x04,0x08,0x12,0x12}
#define BATTRY_2 0x00,0x0000, 0x5e,0x5c,0x5a,0x58, 0x60,{0x6e,0x6c,0x6a,0x68},0x70, {0x30,0x08,0x30,0x00,0x00}
#define BATTRY_3 0x00,0x0000, 0x46,0x44,0x42,0x40, 0x60,{0x6e,0x6c,0x6a,0x68},0x70, {0x20,0x12,0x12,0x00,0x00}
#define BATTRY_4 0x00,0x0000, 0x46,0x44,0x42,0x40, 0x68,{0x66,0x64,0x62,0x60},0x70, {0x20,0x10,0x02,0x00,0x00}
#define BATTRY_5 0x00,0x0000, 0x4e,0x4c,0x4a,0x48, 0x60,{0x6e,0x6c,0x6a,0x68},0x70, {0x20,0x06,0x06,0x00,0x00}
#define BATTRY_6 0x00,0x0000, 0x00,0x00,0x00,0x00, 0x60,{0x6e,0x6c,0x6a,0x68},0x70, {0x20,0x14,0x14,0x00,0x00}
#define BATTRY_7 0x00,0x0000, 0x00,0x00,0x00,0x00, 0x6c,{0x00,0x00,0x00,0x00},0x52, {0x14,0x02,0x14,0x00,0x00}
#define QSOUND_1 0x00,0x0000, 0x00,0x00,0x00,0x00, 0x62,{0x64,0x66,0x68,0x6a},0x6c, {0x10,0x08,0x04,0x00,0x00}
#define QSOUND_2 0x00,0x0000, 0x00,0x00,0x00,0x00, 0x4a,{0x4c,0x4e,0x40,0x42},0x44, {0x16,0x16,0x16,0x00,0x00}
#define QSOUND_3 0x4e,0x0c00, 0x00,0x00,0x00,0x00, 0x52,{0x54,0x56,0x48,0x4a},0x4c, {0x04,0x02,0x20,0x00,0x00}
#define QSOUND_4 0x6e,0x0c01, 0x00,0x00,0x00,0x00, 0x56,{0x40,0x42,0x68,0x6a},0x6c, {0x04,0x08,0x10,0x00,0x00}
#define QSOUND_5 0x5e,0x0c02, 0x00,0x00,0x00,0x00, 0x6a,{0x6c,0x6e,0x70,0x72},0x5c, {0x04,0x08,0x10,0x00,0x00}
#define HACK_B_1 0x00,0x0000, 0x00,0x00,0x00,0x00, 0x54,{0x52,0x50,0x4e,0x4c},0x5c, {0xff,0xff,0xff,0x00,0x00}
/* CPSB ID multiply protection unknown ctrl priority masks palctrl layer enable masks */
#define CPS_B_01 -1, 0x0000, __not_applicable__, 0x26,{0x28,0x2a,0x2c,0x2e},0x30, {0x02,0x04,0x08,0x30,0x30}
#define CPS_B_02 0x20,0x0002, __not_applicable__, 0x2c,{0x2a,0x28,0x26,0x24},0x22, {0x02,0x04,0x08,0x00,0x00}
#define CPS_B_03 -1, 0x0000, __not_applicable__, 0x30,{0x2e,0x2c,0x2a,0x28},0x26, {0x20,0x10,0x08,0x00,0x00}
#define CPS_B_04 0x20,0x0004, __not_applicable__, 0x2e,{0x26,0x30,0x28,0x32},0x2a, {0x02,0x04,0x08,0x00,0x00}
#define CPS_B_05 0x20,0x0005, __not_applicable__, 0x28,{0x2a,0x2c,0x2e,0x30},0x32, {0x02,0x08,0x20,0x14,0x14}
#define CPS_B_11 0x32,0x0401, __not_applicable__, 0x26,{0x28,0x2a,0x2c,0x2e},0x30, {0x08,0x10,0x20,0x00,0x00}
#define CPS_B_12 0x20,0x0402, __not_applicable__, 0x2c,{0x2a,0x28,0x26,0x24},0x22, {0x02,0x04,0x08,0x00,0x00}
#define CPS_B_13 0x2e,0x0403, __not_applicable__, 0x22,{0x24,0x26,0x28,0x2a},0x2c, {0x20,0x02,0x04,0x00,0x00}
#define CPS_B_14 0x1e,0x0404, __not_applicable__, 0x12,{0x14,0x16,0x18,0x1a},0x1c, {0x08,0x20,0x10,0x00,0x00}
#define CPS_B_15 0x0e,0x0405, __not_applicable__, 0x02,{0x04,0x06,0x08,0x0a},0x0c, {0x04,0x02,0x20,0x00,0x00}
#define CPS_B_16 0x00,0x0406, __not_applicable__, 0x0c,{0x0a,0x08,0x06,0x04},0x02, {0x10,0x0a,0x0a,0x00,0x00}
#define CPS_B_17 0x08,0x0407, __not_applicable__, 0x14,{0x12,0x10,0x0e,0x0c},0x0a, {0x08,0x10,0x02,0x00,0x00}
#define CPS_B_18 0x10,0x0408, __not_applicable__, 0x1c,{0x1a,0x18,0x16,0x14},0x12, {0x10,0x08,0x02,0x00,0x00}
#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,0x0a, 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},0x1c, {0xff,0xff,0xff,0x00,0x00}
/*
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
*/
#define mapper_LWCHR { 0x8000, 0x8000, 0, 0 }, mapper_LWCHR_table #define mapper_LWCHR { 0x8000, 0x8000, 0, 0 }, mapper_LWCHR_table
@ -482,15 +489,24 @@ static const struct gfx_range mapper_ST22B_table[] =
}; };
#define mapper_TK22B { 0x8000, 0x8000, 0, 0 }, mapper_TK22B_table #define mapper_TK22B { 0x4000, 0x4000, 0x4000, 0x4000 }, mapper_TK22B_table
static const struct gfx_range mapper_TK22B_table[] = // unknown PAL static const struct gfx_range mapper_TK22B_table[] =
{ {
/* type start end bank */ // verified from PAL dump:
{ GFXTYPE_SPRITES, 0x0000, 0x5fff, 0 }, // bank 0 = pin 19 (ROMs 1,5, 9,13,17,24,32,38)
{ GFXTYPE_SCROLL1, 0x6000, 0x7fff, 0 }, // bank 1 = pin 16 (ROMs 2,6,10,14,18,25,33,39)
// bank 2 = pin 14 (ROMs 3,7,11,15,19,21,26,28)
// bank 3 = pin 12 (ROMS 4,8,12,16,20,22,27,29)
{ GFXTYPE_SCROLL3, 0x0000, 0x3fff, 1 }, // 8000-bfff physical /* type start end bank */
{ GFXTYPE_SCROLL2, 0x4000, 0x7fff, 1 }, // c000-ffff physical { GFXTYPE_SPRITES, 0x0000, 0x3fff, 0 },
{ GFXTYPE_SPRITES, 0x4000, 0x5fff, 1 },
{ GFXTYPE_SCROLL1, 0x6000, 0x7fff, 1 },
{ GFXTYPE_SCROLL3, 0x0000, 0x3fff, 2 },
{ GFXTYPE_SCROLL2, 0x4000, 0x7fff, 3 },
{ 0 } { 0 }
}; };
@ -703,20 +719,50 @@ static const struct gfx_range mapper_CA24B_table[] =
}; };
#define mapper_STF29 { 0x10000, 0x8000, 0, 0 }, mapper_STF29_table #define mapper_STF29 { 0x8000, 0x8000, 0x8000, 0 }, mapper_STF29_table
static const struct gfx_range mapper_STF29_table[] = static const struct gfx_range mapper_STF29_table[] =
{ {
/* type start end bank */ // verified from PAL dump:
{ GFXTYPE_SPRITES, 0x00000, 0x0ffff, 0 }, // bank 0 = pin 19 (ROMs 5,6,7,8)
// bank 1 = pin 14 (ROMs 14,15,16,17)
// bank 2 = pin 12 (ROMS 24,25,26,27)
{ GFXTYPE_SPRITES, 0x10000, 0x11fff, 1 }, /* type start end bank */
{ GFXTYPE_SCROLL3, 0x02000, 0x03fff, 1 }, // 12000-13fff physical { GFXTYPE_SPRITES, 0x00000, 0x07fff, 0 },
{ GFXTYPE_SCROLL1, 0x04000, 0x04fff, 1 }, // 14000-14fff physical
{ GFXTYPE_SCROLL2, 0x05000, 0x07fff, 1 }, // 15000-17fff physical { GFXTYPE_SPRITES, 0x08000, 0x0ffff, 1 },
{ GFXTYPE_SPRITES, 0x10000, 0x11fff, 2 },
{ GFXTYPE_SCROLL3, 0x02000, 0x03fff, 2 },
{ GFXTYPE_SCROLL1, 0x04000, 0x04fff, 2 },
{ GFXTYPE_SCROLL2, 0x05000, 0x07fff, 2 },
{ 0 } { 0 }
}; };
// RT24B and RT22B are equivalent, but since we could dump both PALs we are
// documenting both.
#define mapper_RT24B { 0x8000, 0x8000, 0, 0 }, mapper_RT24B_table
static const struct gfx_range mapper_RT24B_table[] =
{
// verified from PAL dump:
// bank 0 = pin 16 (ROMs 1,3,5,7)
// bank 1 = pin 19 (ROMs 2,4,6,8)
// pin 12 & pin 14 are never enabled
/* type start end bank */
{ GFXTYPE_SPRITES, 0x0000, 0x53ff, 0 },
{ GFXTYPE_SCROLL1, 0x5400, 0x6fff, 0 },
{ GFXTYPE_SCROLL3, 0x7000, 0x7fff, 0 },
{ GFXTYPE_SCROLL3, 0x0000, 0x3fff, 1 },
{ GFXTYPE_SCROLL2, 0x2800, 0x7fff, 1 },
{ GFXTYPE_SPRITES, 0x5400, 0x7fff, 1 },
{ 0 }
};
#define mapper_RT22B { 0x4000, 0x4000, 0x4000, 0x4000 }, mapper_RT22B_table #define mapper_RT22B { 0x4000, 0x4000, 0x4000, 0x4000 }, mapper_RT22B_table
static const struct gfx_range mapper_RT22B_table[] = static const struct gfx_range mapper_RT22B_table[] =
{ {
@ -784,16 +830,18 @@ static const struct gfx_range mapper_KR63B_table[] =
}; };
#define mapper_S9263B { 0x10000, 0x8000, 0, 0 }, mapper_S9263B_table #define mapper_S9263B { 0x8000, 0x8000, 0x8000, 0 }, mapper_S9263B_table
static const struct gfx_range mapper_S9263B_table[] = static const struct gfx_range mapper_S9263B_table[] =
{ {
/* type start end bank */ /* type start end bank */
{ GFXTYPE_SPRITES, 0x00000, 0x0ffff, 0 }, { GFXTYPE_SPRITES, 0x00000, 0x07fff, 0 },
{ GFXTYPE_SPRITES, 0x10000, 0x11fff, 1 }, { GFXTYPE_SPRITES, 0x08000, 0x0ffff, 1 },
{ GFXTYPE_SCROLL3, 0x02000, 0x03fff, 1 }, // 12000-13fff physical
{ GFXTYPE_SCROLL1, 0x04000, 0x04fff, 1 }, // 14000-14fff physical { GFXTYPE_SPRITES, 0x10000, 0x11fff, 2 },
{ GFXTYPE_SCROLL2, 0x05000, 0x07fff, 1 }, // 15000-17fff physical { GFXTYPE_SCROLL3, 0x02000, 0x03fff, 2 }, // 12000-13fff physical
{ GFXTYPE_SCROLL1, 0x04000, 0x04fff, 2 }, // 14000-14fff physical
{ GFXTYPE_SCROLL2, 0x05000, 0x07fff, 2 }, // 15000-17fff physical
{ 0 } { 0 }
}; };
@ -859,15 +907,17 @@ static const struct gfx_range mapper_PS63B_table[] =
}; };
#define mapper_MB63B { 0x10000, 0x8000, 0, 0 }, mapper_MB63B_table #define mapper_MB63B { 0x8000, 0x8000, 0x8000, 0 }, mapper_MB63B_table
static const struct gfx_range mapper_MB63B_table[] = static const struct gfx_range mapper_MB63B_table[] =
{ {
/* type start end bank */ /* type start end bank */
{ GFXTYPE_SCROLL1, 0x00000, 0x00fff, 0 }, { GFXTYPE_SCROLL1, 0x00000, 0x00fff, 0 },
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL2, 0x01000, 0x0ffff, 0 }, { GFXTYPE_SPRITES | GFXTYPE_SCROLL2, 0x01000, 0x07fff, 0 },
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL2, 0x10000, 0x167ff, 1 }, { GFXTYPE_SPRITES | GFXTYPE_SCROLL2, 0x08000, 0x0ffff, 1 },
{ GFXTYPE_SCROLL3, 0x16800, 0x17fff, 1 },
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL2, 0x10000, 0x167ff, 2 },
{ GFXTYPE_SCROLL3, 0x16800, 0x17fff, 2 },
{ 0 } { 0 }
}; };
@ -971,7 +1021,7 @@ static const struct gfx_range mapper_cps2_table[] =
static const struct CPS1config cps1_config_table[]= static const struct CPS1config cps1_config_table[]=
{ {
/* name CPSB gfx mapper kludge */ /* name CPSB gfx mapper in2 in3 out2 kludge */
{"forgottn", CPS_B_01, mapper_LWCHR }, {"forgottn", CPS_B_01, mapper_LWCHR },
{"lostwrld", CPS_B_01, mapper_LWCHR }, {"lostwrld", CPS_B_01, mapper_LWCHR },
{"ghouls", CPS_B_01, mapper_DM620 }, {"ghouls", CPS_B_01, mapper_DM620 },
@ -996,10 +1046,10 @@ static const struct CPS1config cps1_config_table[]=
{"1941j", CPS_B_05, mapper_YI24B }, {"1941j", CPS_B_05, mapper_YI24B },
{"unsquad", CPS_B_11, mapper_AR24B }, /* CPSB ID not checked, but it's the same as sf2eg */ {"unsquad", CPS_B_11, mapper_AR24B }, /* CPSB ID not checked, but it's the same as sf2eg */
{"area88", CPS_B_11, mapper_AR24B }, /* CPSB ID not checked, but it's the same as sf2eg */ {"area88", CPS_B_11, mapper_AR24B }, /* CPSB ID not checked, but it's the same as sf2eg */
{"mercs", CPS_B_12, mapper_0224B }, /* (uses port 74) */ {"mercs", CPS_B_12, mapper_0224B, 0x36, 0, 0x34 },
{"mercsu", CPS_B_12, mapper_0224B }, /* (uses port 74) */ {"mercsu", CPS_B_12, mapper_0224B, 0x36, 0, 0x34 },
{"mercsua", CPS_B_12, mapper_0224B }, /* (uses port 74) */ {"mercsua", CPS_B_12, mapper_0224B, 0x36, 0, 0x34 },
{"mercsj", CPS_B_12, mapper_0224B }, /* (uses port 74) */ {"mercsj", CPS_B_12, mapper_0224B, 0x36, 0, 0x34 },
{"msword", CPS_B_13, mapper_MS24B }, /* CPSB ID not checked, but it's the same as sf2j */ {"msword", CPS_B_13, mapper_MS24B }, /* CPSB ID not checked, but it's the same as sf2j */
{"mswordr1", CPS_B_13, mapper_MS24B }, /* CPSB ID not checked, but it's the same as sf2j */ {"mswordr1", CPS_B_13, mapper_MS24B }, /* CPSB ID not checked, but it's the same as sf2j */
{"mswordu", CPS_B_13, mapper_MS24B }, /* CPSB ID not checked, but it's the same as sf2j */ {"mswordu", CPS_B_13, mapper_MS24B }, /* CPSB ID not checked, but it's the same as sf2j */
@ -1012,88 +1062,88 @@ static const struct CPS1config cps1_config_table[]=
{"cawingr1", CPS_B_16, mapper_CA24B }, {"cawingr1", CPS_B_16, mapper_CA24B },
{"cawingu", CPS_B_16, mapper_CA24B }, {"cawingu", CPS_B_16, mapper_CA24B },
{"cawingj", CPS_B_16, mapper_CA24B }, {"cawingj", CPS_B_16, mapper_CA24B },
{"sf2", CPS_B_11, mapper_STF29 }, {"sf2", CPS_B_11, mapper_STF29, 0x36 },
{"sf2eb", CPS_B_17, mapper_STF29 }, {"sf2eb", CPS_B_17, mapper_STF29, 0x36 },
{"sf2ua", CPS_B_17, mapper_STF29 }, {"sf2ua", CPS_B_17, mapper_STF29, 0x36 },
{"sf2ub", CPS_B_17, mapper_STF29 }, {"sf2ub", CPS_B_17, mapper_STF29, 0x36 },
{"sf2ud", CPS_B_05, mapper_STF29 }, {"sf2ud", CPS_B_05, mapper_STF29, 0x36 },
{"sf2ue", CPS_B_18, mapper_STF29 }, {"sf2ue", CPS_B_18, mapper_STF29, 0x3c },
{"sf2uf", CPS_B_15, mapper_STF29 }, {"sf2uf", CPS_B_15, mapper_STF29, 0x36 },
{"sf2ui", CPS_B_14, mapper_STF29 }, {"sf2ui", CPS_B_14, mapper_STF29, 0x36 },
{"sf2uk", CPS_B_17, mapper_STF29 }, // check CPS_B {"sf2uk", CPS_B_17, mapper_STF29, 0x36 }, // check CPS_B
{"sf2j", CPS_B_13, mapper_STF29 }, {"sf2j", CPS_B_13, mapper_STF29, 0x36 },
{"sf2ja", CPS_B_17, mapper_STF29 }, {"sf2ja", CPS_B_17, mapper_STF29, 0x36 },
{"sf2jc", CPS_B_12, mapper_STF29 }, {"sf2jc", CPS_B_12, mapper_STF29, 0x36 },
/* from here onwards the CPS-B board has suicide battery and multiply protection */ /* from here onwards the CPS-B board has suicide battery and multiply protection */
{"3wonders", BATTRY_1, mapper_RT22B }, {"3wonders", CPS_B_21_BT1, mapper_RT24B },
{"3wonderu", BATTRY_1, mapper_RT22B }, {"3wonderu", CPS_B_21_BT1, mapper_RT24B },
{"wonder3", BATTRY_1, mapper_RT22B }, {"wonder3", CPS_B_21_BT1, mapper_RT22B }, // equivalent to RT24B
{"kod", BATTRY_2, mapper_KD29B }, {"kod", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 },
{"kodu", BATTRY_2, mapper_KD29B }, {"kodu", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 },
{"kodj", BATTRY_2, mapper_KD29B }, {"kodj", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 },
{"kodb", BATTRY_2, mapper_KD29B }, /* bootleg, doesn't use multiply protection */ {"kodb", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 }, /* bootleg, doesn't use multiply protection */
{"captcomm", BATTRY_3, mapper_CC63B }, {"captcomm", CPS_B_21_BT3, mapper_CC63B, 0x36, 0x38, 0x34 },
{"captcomu", BATTRY_3, mapper_CC63B }, {"captcomu", CPS_B_21_BT3, mapper_CC63B, 0x36, 0x38, 0x34 },
{"captcomj", BATTRY_3, mapper_CC63B }, {"captcomj", CPS_B_21_BT3, mapper_CC63B, 0x36, 0x38, 0x34 },
{"knights", BATTRY_4, mapper_KR63B }, {"knights", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 },
{"knightsu", BATTRY_4, mapper_KR63B }, {"knightsu", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 },
{"knightsj", BATTRY_4, mapper_KR63B }, {"knightsj", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 },
{"sf2ce", NOBATTRY, mapper_S9263B }, {"sf2ce", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2ceua", NOBATTRY, mapper_S9263B }, {"sf2ceua", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2ceub", NOBATTRY, mapper_S9263B }, {"sf2ceub", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2ceuc", NOBATTRY, mapper_S9263B }, {"sf2ceuc", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2cej", NOBATTRY, mapper_S9263B }, {"sf2cej", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2rb", NOBATTRY, mapper_S9263B }, {"sf2rb", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2rb2", NOBATTRY, mapper_S9263B }, {"sf2rb2", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2red", NOBATTRY, mapper_S9263B }, {"sf2red", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2v004", NOBATTRY, mapper_S9263B }, {"sf2v004", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2accp2", NOBATTRY, mapper_S9263B }, {"sf2accp2", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2m1", NOBATTRY, mapper_S9263B }, {"sf2m1", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2m2", NOBATTRY, mapper_S9263B }, {"sf2m2", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2m3", NOBATTRY, mapper_S9263B }, {"sf2m3", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2m4", HACK_B_1, mapper_S9263B, 1 }, {"sf2m4", HACK_B_1, mapper_S9263B, 0x36, 0, 0, 1 },
{"sf2m5", NOBATTRY, mapper_S9263B, 1 }, {"sf2m5", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 1 },
{"sf2m6", NOBATTRY, mapper_S9263B, 1 }, {"sf2m6", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 1 },
{"sf2m7", NOBATTRY, mapper_S9263B, 1 }, {"sf2m7", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 1 },
{"sf2yyc", NOBATTRY, mapper_S9263B, 1 }, {"sf2yyc", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 1 },
{"sf2koryu", NOBATTRY, mapper_S9263B, 1 }, {"sf2koryu", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 1 },
{"varth", CPS_B_04, mapper_VA24B }, /* CPSB test has been patched out (60=0008) */ {"varth", CPS_B_04, mapper_VA24B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */
{"varthr1", CPS_B_04, mapper_VA24B }, /* CPSB test has been patched out (60=0008) */ {"varthr1", CPS_B_04, mapper_VA24B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */
{"varthu", CPS_B_04, mapper_VA24B }, /* CPSB test has been patched out (60=0008) */ {"varthu", CPS_B_04, mapper_VA24B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */
{"varthj", BATTRY_5, mapper_VA24B }, /* CPSB test has been patched out (72=0001) */ {"varthj", CPS_B_21_BT5, mapper_VA24B }, /* CPSB test has been patched out (72=0001) register is also written to, possibly leftover from development */
{"cworld2j", BATTRY_6, mapper_Q522B }, /* The 0x76 priority values are incorrect values */ {"cworld2j", CPS_B_21_BT6, mapper_Q522B, 0x36, 0, 0x34 }, /* (ports 36, 34 probably leftover input code from another game) */
{"wof", NOBATTRY, mapper_TK263B }, /* bootleg? */ {"wof", CPS_B_21_DEF, mapper_TK263B }, /* bootleg? */
{"wofa", NOBATTRY, mapper_TK263B }, /* bootleg? */ {"wofa", CPS_B_21_DEF, mapper_TK263B }, /* bootleg? */
{"wofu", QSOUND_1, mapper_TK263B }, {"wofu", CPS_B_21_QS1, mapper_TK263B },
{"wofj", QSOUND_1, mapper_TK263B }, {"wofj", CPS_B_21_QS1, mapper_TK263B },
{"dino", QSOUND_2, mapper_CD63B }, /* layer enable never used */ {"dino", CPS_B_21_QS2, mapper_CD63B }, /* layer enable never used */
{"dinou", QSOUND_2, mapper_CD63B }, /* layer enable never used */ {"dinou", CPS_B_21_QS2, mapper_CD63B }, /* layer enable never used */
{"dinoj", QSOUND_2, mapper_CD63B }, /* layer enable never used */ {"dinoj", CPS_B_21_QS2, mapper_CD63B }, /* layer enable never used */
{"punisher", QSOUND_3, mapper_PS63B }, {"punisher", CPS_B_21_QS3, mapper_PS63B },
{"punishru", QSOUND_3, mapper_PS63B }, {"punishru", CPS_B_21_QS3, mapper_PS63B },
{"punishrj", QSOUND_3, mapper_PS63B }, {"punishrj", CPS_B_21_QS3, mapper_PS63B },
{"slammast", QSOUND_4, mapper_MB63B }, {"slammast", CPS_B_21_QS4, mapper_MB63B },
{"slammasu", QSOUND_4, mapper_MB63B }, {"slammasu", CPS_B_21_QS4, mapper_MB63B },
{"mbomberj", QSOUND_4, mapper_MB63B }, {"mbomberj", CPS_B_21_QS4, mapper_MB63B },
{"mbombrd", QSOUND_5, mapper_MB63B }, {"mbombrd", CPS_B_21_QS5, mapper_MB63B },
{"mbombrdj", QSOUND_5, mapper_MB63B }, {"mbombrdj", CPS_B_21_QS5, mapper_MB63B },
{"sf2hf", NOBATTRY, mapper_S9263B }, {"sf2hf", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2t", NOBATTRY, mapper_S9263B }, {"sf2t", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"sf2tj", NOBATTRY, mapper_S9263B }, {"sf2tj", CPS_B_21_DEF, mapper_S9263B, 0x36 },
{"qad", BATTRY_7, mapper_QD22B }, /* TODO: layer enable */ {"qad", CPS_B_21_BT7, mapper_QD22B, 0x36 }, /* TODO: layer enable (port 36 probably leftover input code from another game) */
{"qadj", NOBATTRY, mapper_qadj }, {"qadj", CPS_B_21_DEF, mapper_qadj, 0x36, 0x38, 0x34 }, /* (ports 36, 38, 34 probably leftover input code from another game) */
{"qtono2", NOBATTRY, mapper_qtono2 }, {"qtono2", CPS_B_21_DEF, mapper_qtono2, 0x36, 0x38, 0x34 }, /* (ports 36, 38, 34 probably leftover input code from another game) */
{"megaman", NOBATTRY, mapper_RCM63B }, {"megaman", CPS_B_21_DEF, mapper_RCM63B },
{"rockmanj", NOBATTRY, mapper_RCM63B }, {"rockmanj", CPS_B_21_DEF, mapper_RCM63B },
{"pnickj", NOBATTRY, mapper_pnickj }, {"pnickj", CPS_B_21_DEF, mapper_pnickj },
{"pang3", NOBATTRY, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */ {"pang3", CPS_B_21_DEF, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */
{"pang3j", NOBATTRY, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */ {"pang3j", CPS_B_21_DEF, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */
#ifdef MESS #ifdef MESS
{"sfzch", NOBATTRY, mapper_cps2 }, {"sfzch", CPS_B_21_DEF, mapper_cps2 },
#endif #endif
/* CPS2 games */ /* CPS2 games */
{"cps2", NOBATTRY, mapper_cps2 }, {"cps2", CPS_B_21_DEF, mapper_cps2 },
{0} /* End of table */ {0} /* End of table */
}; };
@ -1102,10 +1152,10 @@ static const struct CPS1config cps1_config_table[]=
/* Public variables */ /* Public variables */
UINT16 *cps1_gfxram; UINT16 *cps1_gfxram;
UINT16 *cps1_output; UINT16 *cps1_cps_a_regs;
UINT16 *cps1_cps_b_regs;
size_t cps1_gfxram_size; size_t cps1_gfxram_size;
size_t cps1_output_size;
/* Offset of each palette entry */ /* Offset of each palette entry */
#define cps1_palette_entries (32*6) /* Number colour schemes in palette */ #define cps1_palette_entries (32*6) /* Number colour schemes in palette */
@ -1136,28 +1186,25 @@ int cps1_scroll3x, cps1_scroll3y;
static int stars1x, stars1y, stars2x, stars2y; static int stars1x, stars1y, stars2x, stars2y;
/* Output ports */ /* CPS-A registers */
#define CPS1_OBJ_BASE 0x00 /* Base address of objects */ #define CPS1_OBJ_BASE (0x00/2) /* Base address of objects */
#define CPS1_SCROLL1_BASE 0x02 /* Base address of scroll 1 */ #define CPS1_SCROLL1_BASE (0x02/2) /* Base address of scroll 1 */
#define CPS1_SCROLL2_BASE 0x04 /* Base address of scroll 2 */ #define CPS1_SCROLL2_BASE (0x04/2) /* Base address of scroll 2 */
#define CPS1_SCROLL3_BASE 0x06 /* Base address of scroll 3 */ #define CPS1_SCROLL3_BASE (0x06/2) /* Base address of scroll 3 */
#define CPS1_OTHER_BASE 0x08 /* Base address of other video */ #define CPS1_OTHER_BASE (0x08/2) /* Base address of other video */
#define CPS1_PALETTE_BASE 0x0a /* Base address of palette */ #define CPS1_PALETTE_BASE (0x0a/2) /* Base address of palette */
#define CPS1_SCROLL1_SCROLLX 0x0c /* Scroll 1 X */ #define CPS1_SCROLL1_SCROLLX (0x0c/2) /* Scroll 1 X */
#define CPS1_SCROLL1_SCROLLY 0x0e /* Scroll 1 Y */ #define CPS1_SCROLL1_SCROLLY (0x0e/2) /* Scroll 1 Y */
#define CPS1_SCROLL2_SCROLLX 0x10 /* Scroll 2 X */ #define CPS1_SCROLL2_SCROLLX (0x10/2) /* Scroll 2 X */
#define CPS1_SCROLL2_SCROLLY 0x12 /* Scroll 2 Y */ #define CPS1_SCROLL2_SCROLLY (0x12/2) /* Scroll 2 Y */
#define CPS1_SCROLL3_SCROLLX 0x14 /* Scroll 3 X */ #define CPS1_SCROLL3_SCROLLX (0x14/2) /* Scroll 3 X */
#define CPS1_SCROLL3_SCROLLY 0x16 /* Scroll 3 Y */ #define CPS1_SCROLL3_SCROLLY (0x16/2) /* Scroll 3 Y */
#define CPS1_STARS1_SCROLLX 0x18 /* Stars 1 X */ #define CPS1_STARS1_SCROLLX (0x18/2) /* Stars 1 X */
#define CPS1_STARS1_SCROLLY 0x1a /* Stars 1 Y */ #define CPS1_STARS1_SCROLLY (0x1a/2) /* Stars 1 Y */
#define CPS1_STARS2_SCROLLX 0x1c /* Stars 2 X */ #define CPS1_STARS2_SCROLLX (0x1c/2) /* Stars 2 X */
#define CPS1_STARS2_SCROLLY 0x1e /* Stars 2 Y */ #define CPS1_STARS2_SCROLLY (0x1e/2) /* Stars 2 Y */
#define CPS1_ROWSCROLL_OFFS 0x20 /* base of row scroll offsets in other RAM */ #define CPS1_ROWSCROLL_OFFS (0x20/2) /* base of row scroll offsets in other RAM */
#define CPS1_VIDEOCONTROL 0x22 /* flip screen, rowscroll enable */ #define CPS1_VIDEOCONTROL (0x22/2) /* flip screen, rowscroll enable */
#define CPS1_SCROLL2_WIDTH 0x40
#define CPS1_SCROLL2_HEIGHT 0x40
/* /*
@ -1260,14 +1307,10 @@ static MACHINE_RESET( cps )
} }
int cps1_port(int offset)
{
return cps1_output[offset/2];
}
INLINE UINT16 *cps1_base(int offset,int boundary) INLINE UINT16 *cps1_base(int offset,int boundary)
{ {
int base=cps1_port(offset)*256; int base = cps1_cps_a_regs[offset]*256;
/* /*
The scroll RAM must start on a 0x4000 boundary. The scroll RAM must start on a 0x4000 boundary.
Some games do not do this. Some games do not do this.
@ -1282,65 +1325,9 @@ INLINE UINT16 *cps1_base(int offset,int boundary)
READ16_HANDLER( cps1_output_r ) WRITE16_HANDLER( cps1_cps_a_w )
{ {
if (VERBOSE && offset >= 0x18/2) logerror("PC %06x: read output port %02x\n",activecpu_get_pc(),offset*2); data = COMBINE_DATA(&cps1_cps_a_regs[offset]);
/* Some games interrogate a couple of registers on bootup. */
/* These are CPS1 board B self test checks. They wander from game to */
/* game. */
if (offset && offset == cps1_game_config->cpsb_addr/2)
return cps1_game_config->cpsb_value;
/* some games use as a protection check the ability to do 16-bit multiplies */
/* with a 32-bit result, by writing the factors to two ports and reading the */
/* result from two other ports. */
if (offset && offset == cps1_game_config->mult_result_lo/2)
return (cps1_output[cps1_game_config->mult_factor1/2] *
cps1_output[cps1_game_config->mult_factor2/2]) & 0xffff;
if (offset && offset == cps1_game_config->mult_result_hi/2)
return (cps1_output[cps1_game_config->mult_factor1/2] *
cps1_output[cps1_game_config->mult_factor2/2]) >> 16;
return cps1_output[offset];
}
WRITE16_HANDLER( cps1_output_w )
{
data = COMBINE_DATA(&cps1_output[offset]);
/* To mark scanlines for raster effects */
if(offset == 0x52/2)
{
cps1_scanline2 = (data & 0x1ff);
}
if(offset == 0x50/2)
{
cps1_scanline1 = (data & 0x1ff);
}
#ifdef MAME_DEBUG
if (cps1_game_config->palette_control && offset == cps1_game_config->palette_control/2 && data != 0x3f)
logerror("palette_control = %04x",data);
#endif
if (VERBOSE)
{
if (offset > 0x22/2 &&
offset != cps1_game_config->layer_control/2 &&
offset != cps1_game_config->priority[0]/2 &&
offset != cps1_game_config->priority[1]/2 &&
offset != cps1_game_config->priority[2]/2 &&
offset != cps1_game_config->priority[3]/2 &&
offset != cps1_game_config->palette_control/2)
logerror("PC %06x: write %02x to output port %02x\n",activecpu_get_pc(),data,offset*2);
#ifdef MAME_DEBUG
if (cps1_game_config->priority[0] && offset == cps1_game_config->priority[0]/2 && data != 0x00)
popmessage("priority0 %04x",data);
#endif
}
/* /*
The main CPU writes the palette to gfxram, and the CPS-B custom copies it The main CPU writes the palette to gfxram, and the CPS-B custom copies it
@ -1350,8 +1337,112 @@ if (cps1_game_config->priority[0] && offset == cps1_game_config->priority[0]/2 &
should happen. We are assuming that the copy happens immediately, since it should happen. We are assuming that the copy happens immediately, since it
fixes glitches in the ghouls intro, but it might happen at next vblank. fixes glitches in the ghouls intro, but it might happen at next vblank.
*/ */
if (offset == CPS1_PALETTE_BASE/2) if (offset == CPS1_PALETTE_BASE)
cps1_build_palette(machine, cps1_base(CPS1_PALETTE_BASE,cps1_palette_align)); cps1_build_palette(machine, cps1_base(CPS1_PALETTE_BASE,cps1_palette_align));
if (offset > CPS1_VIDEOCONTROL)
popmessage("write to CPS-A register %02x contact MAMEDEV", offset*2);
}
READ16_HANDLER( cps1_cps_b_r )
{
/* Some games interrogate a couple of registers on bootup. */
/* These are CPS1 board B self test checks. They wander from game to */
/* game. */
if (offset == cps1_game_config->cpsb_addr/2)
return cps1_game_config->cpsb_value;
/* some games use as a protection check the ability to do 16-bit multiplications */
/* with a 32-bit result, by writing the factors to two ports and reading the */
/* result from two other ports. */
if (offset == cps1_game_config->mult_result_lo/2)
return (cps1_cps_b_regs[cps1_game_config->mult_factor1/2] *
cps1_cps_b_regs[cps1_game_config->mult_factor2/2]) & 0xffff;
if (offset == cps1_game_config->mult_result_hi/2)
return (cps1_cps_b_regs[cps1_game_config->mult_factor1/2] *
cps1_cps_b_regs[cps1_game_config->mult_factor2/2]) >> 16;
if (offset == cps1_game_config->in2_addr/2) /* Extra input ports (on C-board) */
return input_port_read(machine, "IN2");
if (offset == cps1_game_config->in3_addr/2) /* Player 4 controls (on C-board) ("Captain Commando") */
return input_port_read(machine, "IN3");
if (cps_version == 2)
{
if (offset == 0x12/2)
{
return cps1_cps_b_regs[0x12/2];
}
}
popmessage("CPS-B read port %02x contact MAMEDEV", offset*2);
return 0xffff;
}
WRITE16_HANDLER( cps1_cps_b_w )
{
data = COMBINE_DATA(&cps1_cps_b_regs[offset]);
if (cps_version == 2)
{
/* To mark scanlines for raster effects */
if (offset == 0x0e/2)
{
// UNKNOWN
return;
}
if (offset == 0x10/2)
{
cps1_scanline1 = (data & 0x1ff);
return;
}
if (offset == 0x12/2)
{
cps1_scanline2 = (data & 0x1ff);
return;
}
}
// additional outputs on C-board
if (offset == cps1_game_config->out2_addr/2)
{
if (ACCESSING_BITS_0_7)
{
if (cps1_game_config->cpsb_value == 0x0402) // Mercs (CN2 connector)
{
coin_lockout_w(2,~data & 0x01);
set_led_status(0,data & 0x02);
set_led_status(1,data & 0x04);
set_led_status(2,data & 0x08);
}
else // kod, captcomm, knights
{
coin_lockout_w(2,~data & 0x02);
coin_lockout_w(3,~data & 0x08);
}
}
}
if (offset != cps1_game_config->cpsb_addr/2 && // only varth writes here
offset != cps1_game_config->mult_factor1/2 &&
offset != cps1_game_config->mult_factor2/2 &&
offset != cps1_game_config->layer_control/2 &&
offset != cps1_game_config->unknown1/2 &&
offset != cps1_game_config->unknown2/2 &&
offset != cps1_game_config->unknown3/2 &&
offset != cps1_game_config->priority[0]/2 &&
offset != cps1_game_config->priority[1]/2 &&
offset != cps1_game_config->priority[2]/2 &&
offset != cps1_game_config->priority[3]/2 &&
offset != cps1_game_config->palette_control/2 &&
offset != cps1_game_config->out2_addr/2)
popmessage("CPS-B write %04x to port %02x contact MAMEDEV", data, offset*2);
} }
@ -1473,7 +1564,7 @@ void cps1_get_video_base(void )
/* Some of the sf2 hacks use only sprite port 0x9100 and the scroll layers are offset */ /* Some of the sf2 hacks use only sprite port 0x9100 and the scroll layers are offset */
if (cps1_game_config->bootleg_kludge == 1) if (cps1_game_config->bootleg_kludge == 1)
{ {
cps1_output[CPS1_OBJ_BASE/2] = 0x9100; cps1_cps_a_regs[CPS1_OBJ_BASE] = 0x9100;
cps1_obj = cps1_base(CPS1_OBJ_BASE, cps1_obj_size); cps1_obj = cps1_base(CPS1_OBJ_BASE, cps1_obj_size);
scroll1xoff = -0x0c; scroll1xoff = -0x0c;
scroll2xoff = -0x0e; scroll2xoff = -0x0e;
@ -1489,20 +1580,20 @@ void cps1_get_video_base(void )
cps1_other = cps1_base(CPS1_OTHER_BASE,cps1_other_size); cps1_other = cps1_base(CPS1_OTHER_BASE,cps1_other_size);
/* Get scroll values */ /* Get scroll values */
cps1_scroll1x=cps1_port(CPS1_SCROLL1_SCROLLX) + scroll1xoff; cps1_scroll1x = cps1_cps_a_regs[CPS1_SCROLL1_SCROLLX] + scroll1xoff;
cps1_scroll1y=cps1_port(CPS1_SCROLL1_SCROLLY); cps1_scroll1y = cps1_cps_a_regs[CPS1_SCROLL1_SCROLLY];
cps1_scroll2x=cps1_port(CPS1_SCROLL2_SCROLLX) + scroll2xoff; cps1_scroll2x = cps1_cps_a_regs[CPS1_SCROLL2_SCROLLX] + scroll2xoff;
cps1_scroll2y=cps1_port(CPS1_SCROLL2_SCROLLY); cps1_scroll2y = cps1_cps_a_regs[CPS1_SCROLL2_SCROLLY];
cps1_scroll3x=cps1_port(CPS1_SCROLL3_SCROLLX) + scroll3xoff; cps1_scroll3x = cps1_cps_a_regs[CPS1_SCROLL3_SCROLLX] + scroll3xoff;
cps1_scroll3y=cps1_port(CPS1_SCROLL3_SCROLLY); cps1_scroll3y = cps1_cps_a_regs[CPS1_SCROLL3_SCROLLY];
stars1x =cps1_port(CPS1_STARS1_SCROLLX); stars1x = cps1_cps_a_regs[CPS1_STARS1_SCROLLX];
stars1y =cps1_port(CPS1_STARS1_SCROLLY); stars1y = cps1_cps_a_regs[CPS1_STARS1_SCROLLY];
stars2x =cps1_port(CPS1_STARS2_SCROLLX); stars2x = cps1_cps_a_regs[CPS1_STARS2_SCROLLX];
stars2y =cps1_port(CPS1_STARS2_SCROLLY); stars2y = cps1_cps_a_regs[CPS1_STARS2_SCROLLY];
/* Get layer enable bits */ /* Get layer enable bits */
layercontrol=cps1_port(cps1_game_config->layer_control); layercontrol = cps1_cps_b_regs[cps1_game_config->layer_control/2];
videocontrol=cps1_port(CPS1_VIDEOCONTROL); videocontrol = cps1_cps_a_regs[CPS1_VIDEOCONTROL];
tilemap_set_enable(cps1_bg_tilemap[0],layercontrol & cps1_game_config->layer_enable_mask[0]); tilemap_set_enable(cps1_bg_tilemap[0],layercontrol & cps1_game_config->layer_enable_mask[0]);
tilemap_set_enable(cps1_bg_tilemap[1],(layercontrol & cps1_game_config->layer_enable_mask[1]) && (videocontrol & 4)); tilemap_set_enable(cps1_bg_tilemap[1],(layercontrol & cps1_game_config->layer_enable_mask[1]) && (videocontrol & 4));
tilemap_set_enable(cps1_bg_tilemap[2],(layercontrol & cps1_game_config->layer_enable_mask[2]) && (videocontrol & 8)); tilemap_set_enable(cps1_bg_tilemap[2],(layercontrol & cps1_game_config->layer_enable_mask[2]) && (videocontrol & 8));
@ -1510,31 +1601,9 @@ void cps1_get_video_base(void )
cps1_stars_enabled[1] = layercontrol & cps1_game_config->layer_enable_mask[4]; cps1_stars_enabled[1] = layercontrol & cps1_game_config->layer_enable_mask[4];
#ifdef MAME_DEBUG
{ {
int enablemask; int enablemask;
#if 0
if (input_code_pressed(KEYCODE_Z))
{
if (input_code_pressed(KEYCODE_Q)) cps1_layer_enabled[3]=0;
if (input_code_pressed(KEYCODE_W)) cps1_layer_enabled[2]=0;
if (input_code_pressed(KEYCODE_E)) cps1_layer_enabled[1]=0;
if (input_code_pressed(KEYCODE_R)) cps1_layer_enabled[0]=0;
if (input_code_pressed(KEYCODE_T))
{
popmessage("%d %d %d %d layer %02x",
(layercontrol>>0x06)&03,
(layercontrol>>0x08)&03,
(layercontrol>>0x0a)&03,
(layercontrol>>0x0c)&03,
layercontrol&0xc03f
);
}
}
#endif
enablemask = 0; enablemask = 0;
if (cps1_game_config->layer_enable_mask[0] == cps1_game_config->layer_enable_mask[1]) if (cps1_game_config->layer_enable_mask[0] == cps1_game_config->layer_enable_mask[1])
enablemask = cps1_game_config->layer_enable_mask[0]; enablemask = cps1_game_config->layer_enable_mask[0];
@ -1545,13 +1614,9 @@ if (input_code_pressed(KEYCODE_Z))
if (enablemask) if (enablemask)
{ {
if (((layercontrol & enablemask) && (layercontrol & enablemask) != enablemask)) if (((layercontrol & enablemask) && (layercontrol & enablemask) != enablemask))
popmessage("layer %02x",layercontrol&0xc03f); popmessage("layer %02x contact MAMEDEV",layercontrol&0xc03f);
} }
}
#endif
{
int enablemask;
enablemask = cps1_game_config->layer_enable_mask[0] | cps1_game_config->layer_enable_mask[1] enablemask = cps1_game_config->layer_enable_mask[0] | cps1_game_config->layer_enable_mask[1]
| cps1_game_config->layer_enable_mask[2] | cps1_game_config->layer_enable_mask[2]
| cps1_game_config->layer_enable_mask[3] | cps1_game_config->layer_enable_mask[4]; | cps1_game_config->layer_enable_mask[3] | cps1_game_config->layer_enable_mask[4];
@ -1567,11 +1632,11 @@ WRITE16_HANDLER( cps1_gfxram_w )
int page = (offset >> 7) & 0x3c0; int page = (offset >> 7) & 0x3c0;
COMBINE_DATA(&cps1_gfxram[offset]); COMBINE_DATA(&cps1_gfxram[offset]);
if (page == (cps1_port(CPS1_SCROLL1_BASE) & 0x3c0)) if (page == (cps1_cps_a_regs[CPS1_SCROLL1_BASE] & 0x3c0))
tilemap_mark_tile_dirty(cps1_bg_tilemap[0],offset/2 & 0x0fff); tilemap_mark_tile_dirty(cps1_bg_tilemap[0],offset/2 & 0x0fff);
if (page == (cps1_port(CPS1_SCROLL2_BASE) & 0x3c0)) if (page == (cps1_cps_a_regs[CPS1_SCROLL2_BASE] & 0x3c0))
tilemap_mark_tile_dirty(cps1_bg_tilemap[1],offset/2 & 0x0fff); tilemap_mark_tile_dirty(cps1_bg_tilemap[1],offset/2 & 0x0fff);
if (page == (cps1_port(CPS1_SCROLL3_BASE) & 0x3c0)) if (page == (cps1_cps_a_regs[CPS1_SCROLL3_BASE] & 0x3c0))
tilemap_mark_tile_dirty(cps1_bg_tilemap[2],offset/2 & 0x0fff); tilemap_mark_tile_dirty(cps1_bg_tilemap[2],offset/2 & 0x0fff);
} }
@ -1723,9 +1788,9 @@ static void cps1_update_transmasks(void)
int mask; int mask;
/* Get transparency registers */ /* Get transparency registers */
if (cps1_game_config->priority[i]) if (cps1_game_config->priority[i] != -1)
mask = cps1_port(cps1_game_config->priority[i]) ^ 0xffff; mask = cps1_cps_b_regs[cps1_game_config->priority[i]/2] ^ 0xffff;
else mask = 0xffff; /* completely transparent if priority masks not defined (mercs, qad) */ else mask = 0xffff; /* completely transparent if priority masks not defined (qad) */
tilemap_set_transmask(cps1_bg_tilemap[0],i,mask,0x8000); tilemap_set_transmask(cps1_bg_tilemap[0],i,mask,0x8000);
tilemap_set_transmask(cps1_bg_tilemap[1],i,mask,0x8000); tilemap_set_transmask(cps1_bg_tilemap[1],i,mask,0x8000);
@ -1763,7 +1828,8 @@ static VIDEO_START( cps )
} }
memset(cps1_gfxram, 0, cps1_gfxram_size); /* Clear GFX RAM */ memset(cps1_gfxram, 0, cps1_gfxram_size); /* Clear GFX RAM */
memset(cps1_output, 0, cps1_output_size); /* Clear output ports */ memset(cps1_cps_a_regs, 0, 0x40); /* Clear CPS-A registers */
memset(cps1_cps_b_regs, 0, 0x40); /* Clear CPS-B registers */
if (cps_version == 2) if (cps_version == 2)
{ {
@ -1772,11 +1838,11 @@ static VIDEO_START( cps )
} }
/* Put in some defaults */ /* Put in some defaults */
cps1_output[CPS1_OBJ_BASE/2] = 0x9200; cps1_cps_a_regs[CPS1_OBJ_BASE] = 0x9200;
cps1_output[CPS1_SCROLL1_BASE/2] = 0x9000; cps1_cps_a_regs[CPS1_SCROLL1_BASE] = 0x9000;
cps1_output[CPS1_SCROLL2_BASE/2] = 0x9040; cps1_cps_a_regs[CPS1_SCROLL2_BASE] = 0x9040;
cps1_output[CPS1_SCROLL3_BASE/2] = 0x9080; cps1_cps_a_regs[CPS1_SCROLL3_BASE] = 0x9080;
cps1_output[CPS1_OTHER_BASE/2] = 0x9100; cps1_cps_a_regs[CPS1_OTHER_BASE] = 0x9100;
assert_always(cps1_game_config, "cps1_game_config hasn't been set up yet"); assert_always(cps1_game_config, "cps1_game_config hasn't been set up yet");
@ -1810,7 +1876,7 @@ static void cps1_build_palette(running_machine *machine, const UINT16* const pal
int offset, page; int offset, page;
const UINT16 *palette_ram = palette_base; const UINT16 *palette_ram = palette_base;
int ctrl = cps1_port(cps1_game_config->palette_control); int ctrl = cps1_cps_b_regs[cps1_game_config->palette_control/2];
/* /*
The palette is copied only for pages that are enabled in the ctrl The palette is copied only for pages that are enabled in the ctrl
@ -2393,12 +2459,12 @@ static void cps1_render_high_layer(bitmap_t *bitmap, const rectangle *cliprect,
VIDEO_UPDATE( cps1 ) VIDEO_UPDATE( cps1 )
{ {
int layercontrol,l0,l1,l2,l3; int layercontrol,l0,l1,l2,l3;
int videocontrol=cps1_port(CPS1_VIDEOCONTROL); int videocontrol = cps1_cps_a_regs[CPS1_VIDEOCONTROL];
flip_screen_set(videocontrol & 0x8000); flip_screen_set(videocontrol & 0x8000);
layercontrol = cps1_output[cps1_game_config->layer_control/2]; layercontrol = cps1_cps_b_regs[cps1_game_config->layer_control/2];
/* Get video memory base registers */ /* Get video memory base registers */
cps1_get_video_base(); cps1_get_video_base();
@ -2422,7 +2488,7 @@ VIDEO_UPDATE( cps1 )
tilemap_set_scroll_rows(cps1_bg_tilemap[1],1024); tilemap_set_scroll_rows(cps1_bg_tilemap[1],1024);
otheroffs = cps1_port(CPS1_ROWSCROLL_OFFS); otheroffs = cps1_cps_a_regs[CPS1_ROWSCROLL_OFFS];
for (i = 0;i < 256;i++) for (i = 0;i < 256;i++)
tilemap_set_scrollx(cps1_bg_tilemap[1],(i - scrly) & 0x3ff,cps1_scroll2x + cps1_other[(i + otheroffs) & 0x3ff]); tilemap_set_scrollx(cps1_bg_tilemap[1],(i - scrly) & 0x3ff,cps1_scroll2x + cps1_other[(i + otheroffs) & 0x3ff]);