less hacky implementation of region protection, with some help from Haze

This commit is contained in:
Michaël Banaan Ananas 2013-06-06 18:59:20 +00:00
parent 7d929c24c9
commit 2d2330ea56
3 changed files with 113 additions and 108 deletions

View File

@ -1,6 +1,7 @@
/* /*
Seibu SPI Hardware Seibu SPI Hardware
Seibu SYS386 Seibu SYS386I
Seibu SYS386F
Driver by Ville Linde Driver by Ville Linde
@ -21,7 +22,7 @@
YMF271F Sound chip YMF271F Sound chip
Seibu Custom GFX chip Seibu Custom GFX chip
SYS386 seems like a lower-cost version of single-board SPI. SYS386I seems like a lower-cost version of single-board SPI.
It has a 40MHz AMD 386 and a considerably weaker sound system (dual MSM6295). It has a 40MHz AMD 386 and a considerably weaker sound system (dual MSM6295).
TODO: TODO:
@ -45,6 +46,9 @@ to the alternative position. This re-flashes some ROMs for a few minutes
put the jumper back to the original position and reboot the PCB. The new put the jumper back to the original position and reboot the PCB. The new
game then plays. game then plays.
The SPI mainboard is region locked. You can only play cartridges that are
from the same region, otherwise the updater will give a checksum error.
There were a few revisions of this hardware, though most are the same with only There were a few revisions of this hardware, though most are the same with only
minor changes such as different IC revisions etc. minor changes such as different IC revisions etc.
@ -1029,7 +1033,7 @@ ADDRESS_MAP_END
/********************************************************************/ /********************************************************************/
static ADDRESS_MAP_START( seibu386_map, AS_PROGRAM, 32, seibuspi_state ) static ADDRESS_MAP_START( sys386i_map, AS_PROGRAM, 32, seibuspi_state )
AM_RANGE(0x00000000, 0x000003ff) AM_RAM AM_RANGE(0x00000000, 0x000003ff) AM_RAM
AM_RANGE(0x00000414, 0x00000417) AM_WRITENOP AM_RANGE(0x00000414, 0x00000417) AM_WRITENOP
AM_RANGE(0x00000418, 0x0000041b) AM_READWRITE(spi_layer_bank_r, spi_layer_bank_w) AM_RANGE(0x00000418, 0x0000041b) AM_READWRITE(spi_layer_bank_r, spi_layer_bank_w)
@ -1061,7 +1065,7 @@ ADDRESS_MAP_END
/********************************************************************/ /********************************************************************/
static ADDRESS_MAP_START( sys386f2_map, AS_PROGRAM, 32, seibuspi_state ) static ADDRESS_MAP_START( sys386f_map, AS_PROGRAM, 32, seibuspi_state )
AM_RANGE(0x00000000, 0x0000000f) AM_RAM AM_RANGE(0x00000000, 0x0000000f) AM_RAM
AM_RANGE(0x00000010, 0x00000013) AM_READ(spi_int_r) // ? AM_RANGE(0x00000010, 0x00000013) AM_READ(spi_int_r) // ?
AM_RANGE(0x00000090, 0x000003ff) AM_RAM AM_RANGE(0x00000090, 0x000003ff) AM_RAM
@ -1087,7 +1091,13 @@ ADDRESS_MAP_END
READ8_MEMBER(seibuspi_state::flashrom_read) READ8_MEMBER(seibuspi_state::flashrom_read)
{ {
offset &= 0x1fffff; offset &= 0x1fffff;
if (offset < 0x100000)
// offset 0 goes directly to the SPI mainboard region code
// this data is not stored on the flashrom itself
if (offset == 0)
return m_region_code;
else if (offset < 0x100000)
return m_soundflash1->read(offset); return m_soundflash1->read(offset);
else else
return m_soundflash2->read(offset & 0x0fffff); return m_soundflash2->read(offset & 0x0fffff);
@ -1166,7 +1176,7 @@ static INPUT_PORTS_START( spi_3button )
PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
INPUT_PORTS_END INPUT_PORTS_END
static INPUT_PORTS_START( seibu386_2button ) static INPUT_PORTS_START( sys386i_2button )
PORT_START("INPUTS") PORT_START("INPUTS")
PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
@ -1317,7 +1327,7 @@ CUSTOM_INPUT_MEMBER(seibuspi_state::ejsakura_keyboard_r)
return 0xffffffff; return 0xffffffff;
} }
static INPUT_PORTS_START( spi_ejsakura ) static INPUT_PORTS_START( sys386f_ejsakura )
PORT_START("INPUTS") PORT_START("INPUTS")
PORT_BIT( 0xffffffff, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, seibuspi_state,ejsakura_keyboard_r, NULL) PORT_BIT( 0xffffffff, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, seibuspi_state,ejsakura_keyboard_r, NULL)
@ -1727,7 +1737,7 @@ static GFXDECODE_START( spi )
#endif #endif
GFXDECODE_END GFXDECODE_END
static const gfx_layout sys386f2_spritelayout = static const gfx_layout sys386f_spritelayout =
{ {
16,16, 16,16,
RGN_FRAC(1,4), RGN_FRAC(1,4),
@ -1742,10 +1752,10 @@ static const gfx_layout sys386f2_spritelayout =
16*32 16*32
}; };
static GFXDECODE_START( sys386f2) static GFXDECODE_START( sys386f)
GFXDECODE_ENTRY( "gfx1", 0, spi_charlayout, 5632, 16 ) // Not used GFXDECODE_ENTRY( "gfx1", 0, spi_charlayout, 5632, 16 ) // Not used
GFXDECODE_ENTRY( "gfx2", 0, spi_tilelayout, 4096, 24 ) // Not used GFXDECODE_ENTRY( "gfx2", 0, spi_tilelayout, 4096, 24 ) // Not used
GFXDECODE_ENTRY( "gfx3", 0, sys386f2_spritelayout, 0, 96 ) GFXDECODE_ENTRY( "gfx3", 0, sys386f_spritelayout, 0, 96 )
GFXDECODE_END GFXDECODE_END
/********************************************************************************/ /********************************************************************************/
@ -1755,7 +1765,7 @@ static const eeprom_interface eeprom_intf =
{ {
6, /* address bits */ 6, /* address bits */
16, /* data bits */ 16, /* data bits */
"*110", /* read command */ "*110", /* read command */
"*101", /* write command */ "*101", /* write command */
"*111", /* erase command */ "*111", /* erase command */
"*10000xxxx", /* lock command */ "*10000xxxx", /* lock command */
@ -1811,6 +1821,31 @@ void seibuspi_state::init_rise11()
MACHINE_START_MEMBER(seibuspi_state,spi) MACHINE_START_MEMBER(seibuspi_state,spi)
{ {
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(seibuspi_state::spi_irq_callback),this)); m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(seibuspi_state::spi_irq_callback),this));
// Where is the region code located? hardcoded on the pcb maybe? or on a PAL?
// Luckily for us, it's also on a fixed location in the PRG ROM...
m_region_code = memregion("maincpu")->base()[0x1ffffc];
logerror("Game region code: %02X\n", m_region_code);
/*
regions known:
0x01 Japan
0x10 US
0x20 Taiwan
0x22 Asia / Hong Kong
0x24 Korea
0x28 China
0x80 Europe / Germany
0x82 Austria
0x92 Italy
0x9c Switzerland
0x9e Australia
0xbe World?
On SPI, 0xff will give a Hardware Error 81,
an unmatched region will give a checksum error
*/
} }
MACHINE_RESET_MEMBER(seibuspi_state,spi) MACHINE_RESET_MEMBER(seibuspi_state,spi)
@ -1820,18 +1855,6 @@ MACHINE_RESET_MEMBER(seibuspi_state,spi)
membank("bank1")->set_entry(0); membank("bank1")->set_entry(0);
m_z80_lastbank = 0; m_z80_lastbank = 0;
m_z80_prg_transfer_pos = 0; m_z80_prg_transfer_pos = 0;
/* If the first value doesn't match, the game shows a checksum error */
/* If any of the other values are wrong, the game goes to update mode */
UINT8 *rombase = memregion("maincpu")->base();
UINT8 country_code = rombase[0x1ffffc];
m_soundflash1->write(0, 0xff);
m_soundflash1->write(0, 0x10);
m_soundflash1->write(0, country_code);
m_soundflash1->write(0, 0xff);
m_soundflash2->write(0, 0xff);
} }
static MACHINE_CONFIG_START( spi, seibuspi_state ) static MACHINE_CONFIG_START( spi, seibuspi_state )
@ -1853,8 +1876,8 @@ static MACHINE_CONFIG_START( spi, seibuspi_state )
MCFG_DS2404_ADD("ds2404", 1995, 1, 1) MCFG_DS2404_ADD("ds2404", 1995, 1, 1)
MCFG_INTEL_E28F008SA_ADD("soundflash1") MCFG_INTEL_E28F008SA_ADD("soundflash1") // Sharp LH28F008 on newer mainboard revision
MCFG_INTEL_E28F008SA_ADD("soundflash2") MCFG_INTEL_E28F008SA_ADD("soundflash2") // "
MCFG_FIFO7200_ADD("soundfifo1", 0x200) // LH5496D, but on single board hw it's one CY7C421 MCFG_FIFO7200_ADD("soundfifo1", 0x200) // LH5496D, but on single board hw it's one CY7C421
MCFG_FIFO7200_ADD("soundfifo2", 0x200) // " MCFG_FIFO7200_ADD("soundfifo2", 0x200) // "
@ -1887,11 +1910,6 @@ MACHINE_CONFIG_END
/* single boards */ /* single boards */
MACHINE_START_MEMBER(seibuspi_state,sxx2e)
{
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(seibuspi_state::spi_irq_callback),this));
}
MACHINE_RESET_MEMBER(seibuspi_state,sxx2e) MACHINE_RESET_MEMBER(seibuspi_state,sxx2e)
{ {
membank("bank1")->set_entry(0); membank("bank1")->set_entry(0);
@ -1908,7 +1926,7 @@ static MACHINE_CONFIG_DERIVED( sxx2e, spi )
MCFG_CPU_MODIFY("audiocpu") MCFG_CPU_MODIFY("audiocpu")
MCFG_CPU_PROGRAM_MAP(sbsound_map) MCFG_CPU_PROGRAM_MAP(sbsound_map)
MCFG_MACHINE_START_OVERRIDE(seibuspi_state, sxx2e) MCFG_MACHINE_START_OVERRIDE(seibuspi_state, spi)
MCFG_MACHINE_RESET_OVERRIDE(seibuspi_state, sxx2e) MCFG_MACHINE_RESET_OVERRIDE(seibuspi_state, sxx2e)
MCFG_DEVICE_REMOVE("soundflash1") MCFG_DEVICE_REMOVE("soundflash1")
@ -1952,26 +1970,16 @@ static MACHINE_CONFIG_DERIVED( sxx2g, sxx2f ) // clocks differ, but otherwise sa
MACHINE_CONFIG_END MACHINE_CONFIG_END
/* SYS386 */ /* SYS386I */
MACHINE_START_MEMBER(seibuspi_state,seibu386) static MACHINE_CONFIG_START( sys386i, seibuspi_state )
{
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(seibuspi_state::spi_irq_callback),this));
}
MACHINE_RESET_MEMBER(seibuspi_state,seibu386)
{
}
static MACHINE_CONFIG_START( seibu386, seibuspi_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", I386, XTAL_40MHz) // AMD 386DX, 40MHz MCFG_CPU_ADD("maincpu", I386, XTAL_40MHz) // AMD 386DX, 40MHz
MCFG_CPU_PROGRAM_MAP(seibu386_map) MCFG_CPU_PROGRAM_MAP(sys386i_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", seibuspi_state, spi_interrupt) MCFG_CPU_VBLANK_INT_DRIVER("screen", seibuspi_state, spi_interrupt)
MCFG_MACHINE_START_OVERRIDE(seibuspi_state, seibu386) MCFG_MACHINE_START_OVERRIDE(seibuspi_state, spi)
MCFG_MACHINE_RESET_OVERRIDE(seibuspi_state, seibu386)
MCFG_EEPROM_ADD("eeprom", eeprom_intf) MCFG_EEPROM_ADD("eeprom", eeprom_intf)
@ -1999,9 +2007,9 @@ static MACHINE_CONFIG_START( seibu386, seibuspi_state )
MACHINE_CONFIG_END MACHINE_CONFIG_END
/* SYS386-F V2.0 */ /* SYS386F */
DRIVER_INIT_MEMBER(seibuspi_state,sys386f2) DRIVER_INIT_MEMBER(seibuspi_state,sys386f)
{ {
int i, j; int i, j;
UINT16 *src = (UINT16 *)memregion("gfx3")->base(); UINT16 *src = (UINT16 *)memregion("gfx3")->base();
@ -2020,15 +2028,14 @@ DRIVER_INIT_MEMBER(seibuspi_state,sys386f2)
} }
} }
static MACHINE_CONFIG_START( sys386f2, seibuspi_state ) static MACHINE_CONFIG_START( sys386f, seibuspi_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", I386, XTAL_50MHz/2) // Intel i386DX, 25MHz MCFG_CPU_ADD("maincpu", I386, XTAL_50MHz/2) // Intel i386DX, 25MHz
MCFG_CPU_PROGRAM_MAP(sys386f2_map) MCFG_CPU_PROGRAM_MAP(sys386f_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", seibuspi_state, spi_interrupt) MCFG_CPU_VBLANK_INT_DRIVER("screen", seibuspi_state, spi_interrupt)
MCFG_MACHINE_START_OVERRIDE(seibuspi_state, seibu386) MCFG_MACHINE_START_OVERRIDE(seibuspi_state, spi)
MCFG_MACHINE_RESET_OVERRIDE(seibuspi_state, seibu386)
MCFG_EEPROM_ADD("eeprom", eeprom_intf) MCFG_EEPROM_ADD("eeprom", eeprom_intf)
@ -2039,11 +2046,11 @@ static MACHINE_CONFIG_START( sys386f2, seibuspi_state )
MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_SIZE(64*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1)
MCFG_GFXDECODE(sys386f2) MCFG_GFXDECODE(sys386f)
MCFG_PALETTE_LENGTH(8192) MCFG_PALETTE_LENGTH(8192)
MCFG_VIDEO_START_OVERRIDE(seibuspi_state, sys386f2) MCFG_VIDEO_START_OVERRIDE(seibuspi_state, sys386f)
MCFG_SCREEN_UPDATE_DRIVER(seibuspi_state, screen_update_sys386f2) MCFG_SCREEN_UPDATE_DRIVER(seibuspi_state, screen_update_sys386f)
/* sound hardware */ /* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
@ -3468,7 +3475,7 @@ ROM_END
/*******************************************************************/ /*******************************************************************/
/* SYS386 games */ /* SYS386 games */
ROM_START( rdft22kc ) ROM_START( rdft22kc ) /* SYS386I */
ROM_REGION32_LE( 0x200000, "maincpu", 0 ) /* i386 program */ ROM_REGION32_LE( 0x200000, "maincpu", 0 ) /* i386 program */
ROM_LOAD32_WORD("prg0-1.267", 0x000000, 0x100000, CRC(0d7d6eb8) SHA1(3a71e1e0ba5bb500dc026debbb6189723c0c2890) ) ROM_LOAD32_WORD("prg0-1.267", 0x000000, 0x100000, CRC(0d7d6eb8) SHA1(3a71e1e0ba5bb500dc026debbb6189723c0c2890) )
ROM_LOAD32_WORD("prg2-3.266", 0x000002, 0x100000, CRC(ead53e69) SHA1(b0e2e06f403317054ecb48d2747034424245f129) ) ROM_LOAD32_WORD("prg2-3.266", 0x000002, 0x100000, CRC(ead53e69) SHA1(b0e2e06f403317054ecb48d2747034424245f129) )
@ -3499,7 +3506,7 @@ ROM_START( rdft22kc )
ROM_LOAD("pcm1.1023", 0x000000, 0x80000, CRC(8b716356) SHA1(42ee1896c02518cd1e9cb0dc130321834665a79e) ) ROM_LOAD("pcm1.1023", 0x000000, 0x80000, CRC(8b716356) SHA1(42ee1896c02518cd1e9cb0dc130321834665a79e) )
ROM_END ROM_END
ROM_START( rfjet2kc ) ROM_START( rfjet2kc ) /* SYS386I */
ROM_REGION32_LE( 0x200000, "maincpu", 0 ) /* i386 program */ ROM_REGION32_LE( 0x200000, "maincpu", 0 ) /* i386 program */
ROM_LOAD32_WORD("prg01.u267", 0x000000, 0x100000, CRC(36019fa8) SHA1(28baf0ed4a53b818c1e6986d5d3491373524eca1) ) ROM_LOAD32_WORD("prg01.u267", 0x000000, 0x100000, CRC(36019fa8) SHA1(28baf0ed4a53b818c1e6986d5d3491373524eca1) )
ROM_LOAD32_WORD("prg23.u266", 0x000002, 0x100000, CRC(65695dde) SHA1(1b25dde03bc9319414144fc13b34c455112f4076) ) ROM_LOAD32_WORD("prg23.u266", 0x000002, 0x100000, CRC(65695dde) SHA1(1b25dde03bc9319414144fc13b34c455112f4076) )
@ -3575,62 +3582,62 @@ ROM_END
/*******************************************************************/ /*******************************************************************/
/* SPI */ /* SPI */
GAME( 1995, senkyu, 0, spi, spi_3button, seibuspi_state, senkyu, ROT0, "Seibu Kaihatsu", "Senkyu (Japan set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, senkyu, 0, spi, spi_3button, seibuspi_state, senkyu, ROT0, "Seibu Kaihatsu", "Senkyu (Japan set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, senkyua, senkyu, spi, spi_3button, seibuspi_state, senkyua, ROT0, "Seibu Kaihatsu", "Senkyu (Japan set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, senkyua, senkyu, spi, spi_3button, seibuspi_state, senkyua, ROT0, "Seibu Kaihatsu", "Senkyu (Japan set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, batlball, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Europe)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, batlball, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Germany)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, batlballu, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Fabtek license)", "Battle Balls (US)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, batlballu, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Fabtek license)", "Battle Balls (US)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, batlballa, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Asia)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, batlballa, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Asia)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, batlballe, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Asia, earlier)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, batlballe, senkyu, spi, spi_3button, seibuspi_state, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Asia, earlier)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, viprp1, 0, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, World)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, viprp1, 0, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, World)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, viprp1u, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu (Fabtek license)", "Viper Phase 1 (New Version, US set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* New version, "=U.S.A=" seems part of title */ GAME( 1995, viprp1u, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu (Fabtek license)", "Viper Phase 1 (New Version, US set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* New version, "=U.S.A=" seems part of title */
GAME( 1995, viprp1ua, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu (Fabtek license)", "Viper Phase 1 (New Version, US set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* New version, "=U.S.A=" seems part of title */ GAME( 1995, viprp1ua, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu (Fabtek license)", "Viper Phase 1 (New Version, US set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* New version, "=U.S.A=" seems part of title */
GAME( 1995, viprp1j, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, viprp1j, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, viprp1s, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Switzerland)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, viprp1s, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (New Version, Switzerland)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, viprp1ot, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Tuning license)", "Viper Phase 1 (Europe)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, viprp1ot, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Tuning license)", "Viper Phase 1 (Europe)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, viprp1oj, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, viprp1oj, viprp1, spi, spi_3button, seibuspi_state, viprp1o, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1995, viprp1hk, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Viper Phase 1 (Hong Kong)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* "=HONG KONG=" seems part of title */ GAME( 1995, viprp1hk, viprp1, spi, spi_3button, seibuspi_state, viprp1, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Viper Phase 1 (Hong Kong)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* "=HONG KONG=" seems part of title */
GAME( 1996, ejanhs, 0, spi, spi_ejanhs, seibuspi_state, ejanhs, ROT0, "Seibu Kaihatsu", "E-Jan High School (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, ejanhs, 0, spi, spi_ejanhs, seibuspi_state, ejanhs, ROT0, "Seibu Kaihatsu", "E-Jan High School (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1996, rdft, 0, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdft, 0, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1996, rdftj, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdftj, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Japan set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1996, rdftu, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters (US)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdftu, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters (US)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1996, rdftam, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters (Asia)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdftam, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters (Asia)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1996, rdftadi, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdftadi, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1996, rdftau, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Australia)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdftau, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Australia)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1996, rdftit, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Italy)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdftit, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Italy)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1996, rdfta, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Austria)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdfta, rdft, spi, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu", "Raiden Fighters (Austria)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1997, rdft2, 0, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters 2 - Operation Hell Dive (Europe)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, rdft2, 0, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters 2 - Operation Hell Dive (Europe)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1997, rdft2u, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, rdft2u, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1997, rdft2j, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, rdft2j, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1997, rdft2j2, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, rdft2j2, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Japan set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1997, rdft2a, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters 2 - Operation Hell Dive (Asia)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, rdft2a, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Metrotainment license)", "Raiden Fighters 2 - Operation Hell Dive (Asia)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1997, rdft2a2, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters 2 - Operation Hell Dive (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, rdft2a2, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters 2 - Operation Hell Dive (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1997, rdft2t, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Taiwan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, rdft2t, rdft2, spi, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive (Taiwan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1998, rfjet, 0, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters Jet (Europe)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, rfjet, 0, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Tuning license)", "Raiden Fighters Jet (Europe)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1998, rfjetu, rfjet, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters Jet (US)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, rfjetu, rfjet, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters Jet (US)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1998, rfjetj, rfjet, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, rfjetj, rfjet, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1998, rfjeta, rfjet, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters Jet (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, rfjeta, rfjet, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu (Dream Island license)", "Raiden Fighters Jet (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1998, rfjett, rfjet, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Taiwan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, rfjett, rfjet, spi, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (Taiwan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
/* SXX2E */ /* SXX2E */
GAME( 1996, rdfts, rdft, sxx2e, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Explorer System Corp. license)", "Raiden Fighters (Taiwan, single board)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, rdfts, rdft, sxx2e, spi_3button, seibuspi_state, rdft, ROT270, "Seibu Kaihatsu (Explorer System Corp. license)", "Raiden Fighters (Taiwan, single board)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
/* SXX2F */ /* SXX2F */
GAME( 1997, rdft2us, rdft2, sxx2f, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US, single board)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) // title screen shows small '.1' GAME( 1997, rdft2us, rdft2, sxx2f, spi_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu (Fabtek license)", "Raiden Fighters 2 - Operation Hell Dive (US, single board)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) // title screen shows small '.1'
/* SXX2G */ /* SXX2G */
GAME( 1999, rfjets, rfjet, sxx2g, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (US, single board set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) // has 1998-99 copyright + planes unlocked GAME( 1999, rfjets, rfjet, sxx2g, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (US, single board set 1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) // has 1998-99 copyright + planes unlocked
GAME( 1999, rfjetsa, rfjet, sxx2g, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (US, single board set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) // has 1998-99 copyright + planes unlocked GAME( 1999, rfjetsa, rfjet, sxx2g, spi_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet (US, single board set 2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) // has 1998-99 copyright + planes unlocked
/* SYS386I */ /* SYS386I */
GAME( 2000, rdft22kc, rdft2, seibu386, seibu386_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive 2000 (China, SYS386I)", GAME_IMPERFECT_GRAPHICS ) GAME( 2000, rdft22kc, rdft2, sys386i, sys386i_2button, seibuspi_state, rdft2, ROT270, "Seibu Kaihatsu", "Raiden Fighters 2 - Operation Hell Dive 2000 (China, SYS386I)", GAME_IMPERFECT_GRAPHICS )
GAME( 2000, rfjet2kc, rfjet, seibu386, seibu386_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet 2000 (China, SYS386I)", GAME_IMPERFECT_GRAPHICS ) GAME( 2000, rfjet2kc, rfjet, sys386i, sys386i_2button, seibuspi_state, rfjet, ROT270, "Seibu Kaihatsu", "Raiden Fighters Jet 2000 (China, SYS386I)", GAME_IMPERFECT_GRAPHICS )
/* SYS386F V2.0 */ /* SYS386F */
GAME( 1999, ejsakura, 0, sys386f2, spi_ejsakura, seibuspi_state, sys386f2, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou (v2.0)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1999, ejsakura, 0, sys386f, sys386f_ejsakura, seibuspi_state, sys386f, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou (Japan, SYS386F V2.0)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
GAME( 1999, ejsakura12, ejsakura, sys386f2, spi_ejsakura, seibuspi_state, sys386f2, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou (v1.2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1999, ejsakura12, ejsakura, sys386f, sys386f_ejsakura, seibuspi_state, sys386f, ROT0, "Seibu Kaihatsu", "E-Jan Sakurasou (Japan, SYS386F V1.2)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )

View File

@ -43,6 +43,7 @@ public:
int m_z80_prg_transfer_pos; int m_z80_prg_transfer_pos;
int m_z80_lastbank; int m_z80_lastbank;
UINT8 m_region_code;
UINT8 m_sb_coin_latch; UINT8 m_sb_coin_latch;
UINT8 m_ejsakura_input_port; UINT8 m_ejsakura_input_port;
tilemap_t *m_text_layer; tilemap_t *m_text_layer;
@ -110,7 +111,7 @@ public:
DECLARE_DRIVER_INIT(senkyua); DECLARE_DRIVER_INIT(senkyua);
DECLARE_DRIVER_INIT(rdft2); DECLARE_DRIVER_INIT(rdft2);
DECLARE_DRIVER_INIT(ejanhs); DECLARE_DRIVER_INIT(ejanhs);
DECLARE_DRIVER_INIT(sys386f2); DECLARE_DRIVER_INIT(sys386f);
TILE_GET_INFO_MEMBER(get_text_tile_info); TILE_GET_INFO_MEMBER(get_text_tile_info);
TILE_GET_INFO_MEMBER(get_back_tile_info); TILE_GET_INFO_MEMBER(get_back_tile_info);
TILE_GET_INFO_MEMBER(get_mid_tile_info); TILE_GET_INFO_MEMBER(get_mid_tile_info);
@ -118,13 +119,10 @@ public:
DECLARE_MACHINE_START(spi); DECLARE_MACHINE_START(spi);
DECLARE_MACHINE_RESET(spi); DECLARE_MACHINE_RESET(spi);
DECLARE_VIDEO_START(spi); DECLARE_VIDEO_START(spi);
DECLARE_MACHINE_START(seibu386); DECLARE_VIDEO_START(sys386f);
DECLARE_MACHINE_RESET(seibu386);
DECLARE_VIDEO_START(sys386f2);
DECLARE_MACHINE_START(sxx2e);
DECLARE_MACHINE_RESET(sxx2e); DECLARE_MACHINE_RESET(sxx2e);
UINT32 screen_update_spi(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update_spi(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT32 screen_update_sys386f2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update_sys386f(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(spi_interrupt); INTERRUPT_GEN_MEMBER(spi_interrupt);
IRQ_CALLBACK_MEMBER(spi_irq_callback); IRQ_CALLBACK_MEMBER(spi_irq_callback);
DECLARE_WRITE_LINE_MEMBER(ymf_irqhandler); DECLARE_WRITE_LINE_MEMBER(ymf_irqhandler);

View File

@ -666,7 +666,7 @@ UINT32 seibuspi_state::screen_update_spi(screen_device &screen, bitmap_rgb32 &bi
return 0; return 0;
} }
VIDEO_START_MEMBER(seibuspi_state,sys386f2) VIDEO_START_MEMBER(seibuspi_state,sys386f)
{ {
int i; int i;
@ -685,7 +685,7 @@ VIDEO_START_MEMBER(seibuspi_state,sys386f2)
memset(m_alpha_table, 0, 8192 * sizeof(UINT8)); memset(m_alpha_table, 0, 8192 * sizeof(UINT8));
} }
UINT32 seibuspi_state::screen_update_sys386f2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) UINT32 seibuspi_state::screen_update_sys386f(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
bitmap.fill(0, cliprect); bitmap.fill(0, cliprect);
draw_sprites(bitmap, cliprect, 0); draw_sprites(bitmap, cliprect, 0);