diff options
Diffstat (limited to 'src/mame/drivers/chinagat.c')
-rw-r--r-- | src/mame/drivers/chinagat.c | 845 |
1 files changed, 845 insertions, 0 deletions
diff --git a/src/mame/drivers/chinagat.c b/src/mame/drivers/chinagat.c new file mode 100644 index 00000000000..5541ea44b5c --- /dev/null +++ b/src/mame/drivers/chinagat.c @@ -0,0 +1,845 @@ +/* +China Gate. +By Paul Hampson from First Principles +(IE: Roms + a description of their contents and a list of CPUs on board.) + +Based on ddragon.c: +"Double Dragon, Double Dragon (bootleg) & Double Dragon II" +"By Carlos A. Lozano & Rob Rosenbrock et. al." + +NOTES: +A couple of things unaccounted for: + +No backgrounds ROMs from the original board... +- This may be related to the SubCPU. I don't think it's contributing + much right now, but I could be wrong. And it would explain that vast + expanse of bankswitch ROM on a slave CPU.... +- Just had a look at the sprites, and they seem like kosher sprites all + the way up.... So it must be hidden in the sub-cpu somewhere? +- Got two bootleg sets with background gfx roms. Using those on the + original games for now. + +OBVIOUS SPEED PROBLEMS... +- Timers are too fast and/or too slow, and the whole thing's moving too fast + +Port 0x2800 on the Sub CPU. +- All those I/O looking ports on the main CPU (0x3exx and 0x3fxx) +- One's scroll control. Prolly other video control as well. +- Location 0x1a2ec in cgate51.bin (The main CPU's ROM) is 88. This is + copied to videoram, and causes that minor visual discrepancy on + the title screen. But the CPU tests that part of the ROM and passes + it OK. Since it's just a simple summing of words, another word + somewhere (or others in total) has lost 0x8000. Or the original + game had this problem. (Not on the screenshot I got) +- The Japanese ones have a different title screen so I can't check. + +ADPCM in the bootlegs is not quite right.... Misusing the data? +- They're nibble-swapped versions of the original roms... +- There's an Intel i8748 CPU on the bootlegs (bootleg 1 lists D8749 but + the microcode dump's the same). This in conjunction with the different + ADPCM chip (msm5205) are used to 'fake' a M6295. +- Bootleg 1 ADPCM is now wired up, but still not working :-( + Definantly sync problems between the i8049 and the m5205 which need + further looking at. + + +There's also a few small dumps from the boards. + + +MAJOR DIFFERENCES FROM DOUBLE DRAGON: +Sound system is like Double Dragon II (In fact for MAME's +purposes it's identical. I think DD3 and one or two others +also use this. Was it an addon on the original? +The dual-CPU setup looked similar to DD at first, but +the second CPU doesn't talk to the sprite RAM at all, but +just through the shared memory (which DD1 doesn't have, +except for the sprite RAM.) +Also the 2nd CPU in China Gate has just as much code as +the first CPU, and bankswitches similarly, where DD1 and DD2 have +different Sprite CPUs but only a small bank of code each. +More characters and colours of characters than DD1 or 2. +More sprites than DD1, less than DD2. +But the formats are the same (allowing for extra chars and colours) +Video hardware's like DD1 (thank god) +Input is unique but has a few similarities to DD2 (the coin inputs) + + +*/ + + + +#include "driver.h" +#include "cpu/m6809/m6809.h" +#include "cpu/z80/z80.h" +#include "cpu/i8039/i8039.h" +#include "sound/2151intf.h" +#include "sound/2203intf.h" +#include "sound/okim6295.h" +#include "sound/msm5205.h" + +/**************** Video stuff ******************/ + +WRITE8_HANDLER( ddragon_bgvideoram_w ); +WRITE8_HANDLER( ddragon_fgvideoram_w ); + +VIDEO_START( chinagat ); +VIDEO_UPDATE( ddragon ); + +extern int technos_video_hw; +extern int ddragon_scrollx_hi, ddragon_scrolly_hi; +extern UINT8 *ddragon_scrollx_lo; +extern UINT8 *ddragon_scrolly_lo; +extern UINT8 *ddragon_bgvideoram,*ddragon_fgvideoram; + +/**************** Machine stuff ******************/ +static int sprite_irq, sound_irq, adpcm_sound_irq; +static int saiyugb1_adpcm_addr; +static int saiyugb1_i8748_P1; +static int saiyugb1_i8748_P2; +static int saiyugb1_pcm_shift; +static int saiyugb1_pcm_nibble; +static int saiyugb1_mcu_command; +#if 0 +static int saiyugb1_m5205_clk; +#endif + + + +static MACHINE_RESET( chinagat ) +{ + technos_video_hw = 1; + sprite_irq = M6809_IRQ_LINE; + sound_irq = INPUT_LINE_NMI; +} + +static WRITE8_HANDLER( chinagat_video_ctrl_w ) +{ + /*************************** + ---- ---x X Scroll MSB + ---- --x- Y Scroll MSB + ---- -x-- Flip screen + --x- ---- Enable video ??? + ****************************/ + + ddragon_scrolly_hi = ( ( data & 0x02 ) << 7 ); + ddragon_scrollx_hi = ( ( data & 0x01 ) << 8 ); + + flip_screen_set(~data & 0x04); +} + +static WRITE8_HANDLER( chinagat_bankswitch_w ) +{ + UINT8 *RAM = memory_region(REGION_CPU1); + memory_set_bankptr( 1,&RAM[ 0x10000 + (0x4000 * (data & 7)) ] ); +} + +static WRITE8_HANDLER( chinagat_sub_bankswitch_w ) +{ + UINT8 *RAM = memory_region( REGION_CPU2 ); + memory_set_bankptr( 4,&RAM[ 0x10000 + (0x4000 * (data & 7)) ] ); +} + +static WRITE8_HANDLER( chinagat_sub_IRQ_w ) +{ + cpunum_set_input_line( 1, sprite_irq, (sprite_irq == INPUT_LINE_NMI) ? PULSE_LINE : HOLD_LINE ); +} + +static WRITE8_HANDLER( chinagat_cpu_sound_cmd_w ) +{ + soundlatch_w( offset, data ); + cpunum_set_input_line( 2, sound_irq, (sound_irq == INPUT_LINE_NMI) ? PULSE_LINE : HOLD_LINE ); +} + +static READ8_HANDLER( saiyugb1_mcu_command_r ) +{ +#if 0 + if (saiyugb1_mcu_command == 0x78) + { + cpunum_suspend(3, SUSPEND_REASON_HALT, 1); /* Suspend (speed up) */ + } +#endif + return saiyugb1_mcu_command; +} + +static WRITE8_HANDLER( saiyugb1_mcu_command_w ) +{ + saiyugb1_mcu_command = data; +#if 0 + if (data != 0x78) + { + cpunum_resume(3, SUSPEND_REASON_HALT); /* Wake up */ + } +#endif +} + +static WRITE8_HANDLER( saiyugb1_adpcm_rom_addr_w ) +{ + /* i8748 Port 1 write */ + saiyugb1_i8748_P1 = data; +} + +static WRITE8_HANDLER( saiyugb1_adpcm_control_w ) +{ + /* i8748 Port 2 write */ + + UINT8 *saiyugb1_adpcm_rom = memory_region(REGION_SOUND1); + + if (data & 0x80) /* Reset m5205 and disable ADPCM ROM outputs */ + { + logerror("ADPCM output disabled\n"); + saiyugb1_pcm_nibble = 0x0f; + MSM5205_reset_w(0,1); + } + else + { + if ( (saiyugb1_i8748_P2 & 0xc) != (data & 0xc) ) + { + if ((saiyugb1_i8748_P2 & 0xc) == 0) /* Latch MSB Address */ + { +/// logerror("Latching MSB\n"); + saiyugb1_adpcm_addr = (saiyugb1_adpcm_addr & 0x3807f) | (saiyugb1_i8748_P1 << 7); + } + if ((saiyugb1_i8748_P2 & 0xc) == 4) /* Latch LSB Address */ + { +/// logerror("Latching LSB\n"); + saiyugb1_adpcm_addr = (saiyugb1_adpcm_addr & 0x3ff80) | (saiyugb1_i8748_P1 >> 1); + saiyugb1_pcm_shift = (saiyugb1_i8748_P1 & 1) * 4; + } + } + + saiyugb1_adpcm_addr = ((saiyugb1_adpcm_addr & 0x07fff) | (data & 0x70 << 11)); + + saiyugb1_pcm_nibble = saiyugb1_adpcm_rom[saiyugb1_adpcm_addr & 0x3ffff]; + + saiyugb1_pcm_nibble = (saiyugb1_pcm_nibble >> saiyugb1_pcm_shift) & 0x0f; + +/// logerror("Writing %02x to m5205. $ROM=%08x P1=%02x P2=%02x Prev_P2=%02x Nibble=%08x\n",saiyugb1_pcm_nibble,saiyugb1_adpcm_addr,saiyugb1_i8748_P1,data,saiyugb1_i8748_P2,saiyugb1_pcm_shift); + + if ( ((saiyugb1_i8748_P2 & 0xc) >= 8) && ((data & 0xc) == 4) ) + { + MSM5205_data_w (0, saiyugb1_pcm_nibble); + logerror("Writing %02x to m5205\n",saiyugb1_pcm_nibble); + } + logerror("$ROM=%08x P1=%02x P2=%02x Prev_P2=%02x Nibble=%1x PCM_data=%02x\n",saiyugb1_adpcm_addr,saiyugb1_i8748_P1,data,saiyugb1_i8748_P2,saiyugb1_pcm_shift,saiyugb1_pcm_nibble); + } + saiyugb1_i8748_P2 = data; +} + +static WRITE8_HANDLER( saiyugb1_m5205_clk_w ) +{ + /* i8748 T0 output clk mode */ + /* This signal goes through a divide by 8 counter */ + /* to the xtal pins of the MSM5205 */ + + /* Actually, T0 output clk mode is not supported by the i8048 core */ + +#if 0 + saiyugb1_m5205_clk++; + if (saiyugb1_m5205_clk == 8) + } + MSM5205_vclk_w (0, 1); /* ??? */ + saiyugb1_m5205_clk = 0; + } + else + } + MSM5205_vclk_w (0, 0); /* ??? */ + } +#endif +} + +static READ8_HANDLER( saiyugb1_m5205_irq_r ) +{ + if (adpcm_sound_irq) + { + adpcm_sound_irq = 0; + return 1; + } + return 0; +} +static void saiyugb1_m5205_irq_w(int num) +{ + adpcm_sound_irq = 1; +} + +static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_RAM AM_SHARE(1) + AM_RANGE(0x2000, 0x27ff) AM_READWRITE(MRA8_RAM, ddragon_fgvideoram_w) AM_BASE(&ddragon_fgvideoram) + AM_RANGE(0x2800, 0x2fff) AM_READWRITE(MRA8_RAM, ddragon_bgvideoram_w) AM_BASE(&ddragon_bgvideoram) + AM_RANGE(0x3000, 0x317f) AM_WRITE(paletteram_xxxxBBBBGGGGRRRR_split1_w) AM_BASE(&paletteram) + AM_RANGE(0x3400, 0x357f) AM_WRITE(paletteram_xxxxBBBBGGGGRRRR_split2_w) AM_BASE(&paletteram_2) + AM_RANGE(0x3800, 0x397f) AM_WRITE(MWA8_BANK3) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) + AM_RANGE(0x3e00, 0x3e00) AM_WRITE(chinagat_cpu_sound_cmd_w) +// AM_RANGE(0x3e01, 0x3e01) AM_WRITE(MWA8_NOP) +// AM_RANGE(0x3e02, 0x3e02) AM_WRITE(MWA8_NOP) +// AM_RANGE(0x3e03, 0x3e03) AM_WRITE(MWA8_NOP) + AM_RANGE(0x3e04, 0x3e04) AM_WRITE(chinagat_sub_IRQ_w) + AM_RANGE(0x3e06, 0x3e06) AM_WRITE(MWA8_RAM) AM_BASE(&ddragon_scrolly_lo) + AM_RANGE(0x3e07, 0x3e07) AM_WRITE(MWA8_RAM) AM_BASE(&ddragon_scrollx_lo) + AM_RANGE(0x3f00, 0x3f00) AM_WRITE(chinagat_video_ctrl_w) + AM_RANGE(0x3f01, 0x3f01) AM_WRITE(chinagat_bankswitch_w) + AM_RANGE(0x3f00, 0x3f00) AM_READ(input_port_0_r) + AM_RANGE(0x3f01, 0x3f01) AM_READ(input_port_1_r) + AM_RANGE(0x3f02, 0x3f02) AM_READ(input_port_2_r) + AM_RANGE(0x3f03, 0x3f03) AM_READ(input_port_3_r) + AM_RANGE(0x3f04, 0x3f04) AM_READ(input_port_4_r) + AM_RANGE(0x4000, 0x7fff) AM_ROMBANK(1) + AM_RANGE(0x8000, 0xffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( sub_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_RAM AM_SHARE(1) + AM_RANGE(0x2000, 0x2000) AM_WRITE(chinagat_sub_bankswitch_w) + AM_RANGE(0x2800, 0x2800) AM_WRITE(MWA8_RAM) /* Called on CPU start and after return from jump table */ +// AM_RANGE(0x2a2b, 0x2a2b) AM_READ(MRA8_NOP) /* What lives here? */ +// AM_RANGE(0x2a30, 0x2a30) AM_READ(MRA8_NOP) /* What lives here? */ + AM_RANGE(0x4000, 0x7fff) AM_ROMBANK(4) + AM_RANGE(0x8000, 0xffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0x8000, 0x87ff) AM_RAM + AM_RANGE(0x8800, 0x8800) AM_WRITE(YM2151_register_port_0_w) + AM_RANGE(0x8801, 0x8801) AM_READWRITE(YM2151_status_port_0_r, YM2151_data_port_0_w) + AM_RANGE(0x9800, 0x9800) AM_READWRITE(OKIM6295_status_0_r, OKIM6295_data_0_w) + AM_RANGE(0xA000, 0xA000) AM_READ(soundlatch_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ym2203c_sound_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0x8000, 0x87ff) AM_RAM +// 8804 and/or 8805 make a gong sound when the coin goes in +// but only on the title screen.... + + AM_RANGE(0x8800, 0x8800) AM_READWRITE(YM2203_status_port_0_r, YM2203_control_port_0_w) + AM_RANGE(0x8801, 0x8801) AM_WRITE(YM2203_write_port_0_w) +// AM_RANGE(0x8802, 0x8802) AM_READWRITE(OKIM6295_data_0_w, OKIM6295_status_0_r) +// AM_RANGE(0x8803, 0x8803) AM_WRITE(OKIM6295_data_0_w) + AM_RANGE(0x8804, 0x8804) AM_READWRITE(YM2203_status_port_1_r, YM2203_control_port_1_w) + AM_RANGE(0x8805, 0x8805) AM_WRITE(YM2203_write_port_1_w) +// AM_RANGE(0x8804, 0x8804) AM_WRITE(MWA8_RAM) +// AM_RANGE(0x8805, 0x8805) AM_WRITE(MWA8_RAM) + +// AM_RANGE(0x8800, 0x8800) AM_WRITE(YM2151_register_port_0_w) +// AM_RANGE(0x8801, 0x8801) AM_WRITE(YM2151_data_port_0_w) +// AM_RANGE(0x9800, 0x9800) AM_READWRITE(OKIM6295_status_0_r, OKIM6295_data_0_w) + AM_RANGE(0xA000, 0xA000) AM_READ(soundlatch_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( saiyugb1_sound_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0x8000, 0x87ff) AM_RAM + AM_RANGE(0x8800, 0x8800) AM_WRITE(YM2151_register_port_0_w) + AM_RANGE(0x8801, 0x8801) AM_READWRITE(YM2151_status_port_0_r, YM2151_data_port_0_w) + AM_RANGE(0x9800, 0x9800) AM_WRITE(saiyugb1_mcu_command_w) + AM_RANGE(0xA000, 0xA000) AM_READ(soundlatch_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( i8748_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x03ff) AM_ROM + AM_RANGE(0x0400, 0x07ff) AM_ROM /* i8749 version */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( i8748_portmap, ADDRESS_SPACE_IO, 8 ) + AM_RANGE(I8039_bus, I8039_bus) AM_READ(saiyugb1_mcu_command_r) + AM_RANGE(I8039_t0, I8039_t0) AM_WRITE(saiyugb1_m5205_clk_w) /* Drives the clock on the m5205 at 1/8 of this frequency */ + AM_RANGE(I8039_t1, I8039_t1) AM_READ(saiyugb1_m5205_irq_r) + AM_RANGE(I8039_p1, I8039_p1) AM_WRITE(saiyugb1_adpcm_rom_addr_w) + AM_RANGE(I8039_p2, I8039_p2) AM_WRITE(saiyugb1_adpcm_control_w) +ADDRESS_MAP_END + + + +static INPUT_PORTS_START( chinagat ) + PORT_START + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_VBLANK ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_5C ) ) + PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x38, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x30, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x28, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x18, DEF_STR( 1C_5C ) ) + /*PORT_DIPNAME( 0x40, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) )*/ + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x03, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On )) + PORT_DIPNAME( 0x30, 0x30, "Timer" ) + PORT_DIPSETTING( 0x00, "50" ) + PORT_DIPSETTING( 0x20, "55" ) + PORT_DIPSETTING( 0x30, "60" ) + PORT_DIPSETTING( 0x10, "70" ) + PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0xc0, "2" ) + PORT_DIPSETTING( 0x80, "3" ) + PORT_DIPSETTING( 0x40, "4" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_START + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) + + PORT_START + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) +INPUT_PORTS_END + +static const gfx_layout charlayout = +{ + 8,8, /* 8*8 chars */ + RGN_FRAC(1,1), /* num of characters */ + 4, /* 4 bits per pixel */ + { 0, 2, 4, 6 }, /* plane offset */ + { 1, 0, 65, 64, 129, 128, 193, 192 }, + { STEP8(0,8) }, /* { 0*8, 1*8 ... 6*8, 7*8 }, */ + 32*8 /* every char takes 32 consecutive bytes */ +}; + +static const gfx_layout tilelayout = +{ + 16,16, /* 16x16 chars */ + RGN_FRAC(1,2), /* num of Tiles/Sprites */ + 4, /* 4 bits per pixel */ + { RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4, 0,4 }, /* plane offset */ + { 3, 2, 1, 0, 16*8+3, 16*8+2, 16*8+1, 16*8+0, + 32*8+3,32*8+2 ,32*8+1 ,32*8+0 ,48*8+3 ,48*8+2 ,48*8+1 ,48*8+0 }, + { STEP16(0,8) }, /* { 0*8, 1*8 ... 14*8, 15*8 }, */ + 64*8 /* every char takes 64 consecutive bytes */ +}; + +static GFXDECODE_START( chinagat ) + GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0,16 ) /* 8x8 chars */ + GFXDECODE_ENTRY( REGION_GFX2, 0, tilelayout, 128, 8 ) /* 16x16 sprites */ + GFXDECODE_ENTRY( REGION_GFX3, 0, tilelayout, 256, 8 ) /* 16x16 background tiles */ +GFXDECODE_END + +static void chinagat_irq_handler(int irq) { + cpunum_set_input_line( 2, 0, irq ? ASSERT_LINE : CLEAR_LINE ); +} + +static struct YM2151interface ym2151_interface = +{ + chinagat_irq_handler +}; + + +/* This on the bootleg board, instead of the m6295 */ +static struct MSM5205interface msm5205_interface = +{ + saiyugb1_m5205_irq_w, /* Interrupt function */ + MSM5205_S64_4B /* vclk input mode (6030Hz, 4-bit) */ +}; + +static INTERRUPT_GEN( chinagat_interrupt ) +{ + cpunum_set_input_line(0, 1, HOLD_LINE); /* hold the FIRQ line */ + cpunum_set_input_line(0, INPUT_LINE_NMI, PULSE_LINE); /* pulse the NMI line */ +} + +/* This is only on the second bootleg board */ +static struct YM2203interface ym2203_interface = +{ + 0, + 0, + 0, + 0, + chinagat_irq_handler +}; + +static MACHINE_DRIVER_START( chinagat ) + + /* basic machine hardware */ + MDRV_CPU_ADD(HD6309,12000000/8) /* 1.5 MHz (12MHz oscillator ???) */ + MDRV_CPU_PROGRAM_MAP(main_map,0) + MDRV_CPU_VBLANK_INT(chinagat_interrupt,1) + + MDRV_CPU_ADD(HD6309,12000000/8) /* 1.5 MHz (12MHz oscillator ???) */ + MDRV_CPU_PROGRAM_MAP(sub_map,0) + + MDRV_CPU_ADD(Z80, 3579545) /* 3.579545 MHz */ + MDRV_CPU_PROGRAM_MAP(sound_map,0) + + MDRV_SCREEN_REFRESH_RATE(56) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(100) /* heavy interleaving to sync up sprite<->main cpu's */ + + MDRV_MACHINE_RESET(chinagat) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) + MDRV_GFXDECODE(chinagat) + MDRV_PALETTE_LENGTH(384) + + MDRV_VIDEO_START(chinagat) + MDRV_VIDEO_UPDATE(ddragon) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(YM2151, 3579545) + MDRV_SOUND_CONFIG(ym2151_interface) + MDRV_SOUND_ROUTE(0, "mono", 0.80) + MDRV_SOUND_ROUTE(1, "mono", 0.80) + + MDRV_SOUND_ADD(OKIM6295, 1452000) + MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high) // clock frequency & pin 7 not verified + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45) +MACHINE_DRIVER_END + +static MACHINE_DRIVER_START( saiyugb1 ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M6809,12000000/8) /* 68B09EP 1.5 MHz (12MHz oscillator) */ + MDRV_CPU_PROGRAM_MAP(main_map,0) + MDRV_CPU_VBLANK_INT(chinagat_interrupt,1) + + MDRV_CPU_ADD(M6809,12000000/8) /* 68B09EP 1.5 MHz (12MHz oscillator) */ + MDRV_CPU_PROGRAM_MAP(sub_map,0) + + MDRV_CPU_ADD(Z80, 3579545) /* 3.579545 MHz oscillator */ + MDRV_CPU_PROGRAM_MAP(saiyugb1_sound_map,0) + + MDRV_CPU_ADD(I8048,9263750/3) /* 3.087916 MHz (9.263750 MHz oscillator) */ + MDRV_CPU_PROGRAM_MAP(i8748_map,0) + MDRV_CPU_IO_MAP(i8748_portmap,0) + + MDRV_SCREEN_REFRESH_RATE(56) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(100) /* heavy interleaving to sync up sprite<->main cpu's */ + + MDRV_MACHINE_RESET(chinagat) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) + MDRV_GFXDECODE(chinagat) + MDRV_PALETTE_LENGTH(384) + + MDRV_VIDEO_START(chinagat) + MDRV_VIDEO_UPDATE(ddragon) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(YM2151, 3579545) + MDRV_SOUND_CONFIG(ym2151_interface) + MDRV_SOUND_ROUTE(0, "mono", 0.80) + MDRV_SOUND_ROUTE(1, "mono", 0.80) + + MDRV_SOUND_ADD(MSM5205, 9263750 / 24) + MDRV_SOUND_CONFIG(msm5205_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) +MACHINE_DRIVER_END + +static MACHINE_DRIVER_START( saiyugb2 ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M6809,12000000/8) /* 1.5 MHz (12MHz oscillator) */ + MDRV_CPU_PROGRAM_MAP(main_map,0) + MDRV_CPU_VBLANK_INT(chinagat_interrupt,1) + + MDRV_CPU_ADD(M6809,12000000/8) /* 1.5 MHz (12MHz oscillator) */ + MDRV_CPU_PROGRAM_MAP(sub_map,0) + + MDRV_CPU_ADD(Z80, 3579545) /* 3.579545 MHz oscillator */ + MDRV_CPU_PROGRAM_MAP(ym2203c_sound_map,0) + + MDRV_SCREEN_REFRESH_RATE(56) + MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION) + MDRV_INTERLEAVE(100) /* heavy interleaving to sync up sprite<->main cpu's */ + + MDRV_MACHINE_RESET(chinagat) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MDRV_SCREEN_SIZE(32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) + MDRV_GFXDECODE(chinagat) + MDRV_PALETTE_LENGTH(384) + + MDRV_VIDEO_START(chinagat) + MDRV_VIDEO_UPDATE(ddragon) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(YM2203, 3579545) + MDRV_SOUND_CONFIG(ym2203_interface) + MDRV_SOUND_ROUTE(0, "mono", 0.50) + MDRV_SOUND_ROUTE(1, "mono", 0.50) + MDRV_SOUND_ROUTE(2, "mono", 0.50) + MDRV_SOUND_ROUTE(3, "mono", 0.80) + + MDRV_SOUND_ADD(YM2203, 3579545) + MDRV_SOUND_ROUTE(0, "mono", 0.50) + MDRV_SOUND_ROUTE(1, "mono", 0.50) + MDRV_SOUND_ROUTE(2, "mono", 0.50) + MDRV_SOUND_ROUTE(3, "mono", 0.80) +MACHINE_DRIVER_END + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( chinagat ) + ROM_REGION( 0x28000, REGION_CPU1, 0 ) /* Main CPU: 128KB for code (bankswitched using $3F01) */ + ROM_LOAD( "cgate51.bin", 0x10000, 0x18000, CRC(439a3b19) SHA1(01393b4302ac7a66390270b01e2757582240f6b8) ) /* Banks 0x4000 long @ 0x4000 */ + ROM_CONTINUE( 0x08000, 0x08000 ) /* Static code */ + + ROM_REGION( 0x28000, REGION_CPU2, 0 ) /* Slave CPU: 128KB for code (bankswitched using $2000) */ + ROM_LOAD( "23j4-0.48", 0x10000, 0x18000, CRC(2914af38) SHA1(3d690fa50b7d36a22de82c026d59a16126a7b73c) ) /* Banks 0x4000 long @ 0x4000 */ + ROM_CONTINUE( 0x08000, 0x08000 ) /* Static code */ + + ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* Music CPU, 64KB */ + ROM_LOAD( "23j0-0.40", 0x00000, 0x08000, CRC(9ffcadb6) SHA1(606dbdd73aee3cabb2142200ac6f8c96169e4b19) ) + + ROM_REGION(0x20000, REGION_GFX1, ROMREGION_DISPOSE ) /* Text */ + ROM_LOAD( "cgate18.bin", 0x00000, 0x20000, CRC(8d88d64d) SHA1(57265138ebb0c6419542cce5953aee7335bfa2bd) ) /* 0,1,2,3 */ + + ROM_REGION(0x80000, REGION_GFX2, ROMREGION_DISPOSE ) /* Sprites */ + ROM_LOAD( "23j7-0.103", 0x00000, 0x20000, CRC(2f445030) SHA1(3fcf32097e655e963d952d01a30396dc195269ca) ) /* 2,3 */ + ROM_LOAD( "23j8-0.102", 0x20000, 0x20000, CRC(237f725a) SHA1(47bebe5b9878ca10fe6efd4f353717e53a372416) ) /* 2,3 */ + ROM_LOAD( "23j9-0.101", 0x40000, 0x20000, CRC(8caf6097) SHA1(50ad192f831b055586a4a9974f8c6c2f2063ede5) ) /* 0,1 */ + ROM_LOAD( "23ja-0.100", 0x60000, 0x20000, CRC(f678594f) SHA1(4bdcf9407543925f4630a8c7f1f48b85f76343a9) ) /* 0,1 */ + + ROM_REGION(0x40000, REGION_GFX3, ROMREGION_DISPOSE ) /* Background */ + ROM_LOAD( "a-13", 0x00000, 0x10000, NO_DUMP ) /* Where are */ + ROM_LOAD( "a-12", 0x10000, 0x10000, NO_DUMP ) /* these on the */ + ROM_LOAD( "a-15", 0x20000, 0x10000, NO_DUMP ) /* real board ? */ + ROM_LOAD( "a-14", 0x30000, 0x10000, NO_DUMP ) + + ROM_REGION(0x40000, REGION_SOUND1, 0 ) /* ADPCM */ + ROM_LOAD( "23j1-0.53", 0x00000, 0x20000, CRC(f91f1001) SHA1(378402a3c966cabd61e9662ae5decd66672a228b) ) + ROM_LOAD( "23j2-0.52", 0x20000, 0x20000, CRC(8b6f26e9) SHA1(7da26ae846814b3957b19c38b6bf7e83617dc6cc) ) + + ROM_REGION(0x300, REGION_USER1, 0 ) /* Unknown Bipolar PROMs */ + ROM_LOAD( "23jb-0.16", 0x000, 0x200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* 82S131 on video board */ + ROM_LOAD( "23j5-0.45", 0x200, 0x100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* 82S129 on main board */ +ROM_END + + +ROM_START( saiyugou ) + ROM_REGION( 0x28000, REGION_CPU1, 0 ) /* Main CPU: 128KB for code (bankswitched using $3F01) */ + ROM_LOAD( "23j3-0.51", 0x10000, 0x18000, CRC(aa8132a2) SHA1(87c3bd447767f263113c4865afc905a0e484a625) ) /* Banks 0x4000 long @ 0x4000 */ + ROM_CONTINUE( 0x08000, 0x08000) /* Static code */ + + ROM_REGION( 0x28000, REGION_CPU2, 0 ) /* Slave CPU: 128KB for code (bankswitched using $2000) */ + ROM_LOAD( "23j4-0.48", 0x10000, 0x18000, CRC(2914af38) SHA1(3d690fa50b7d36a22de82c026d59a16126a7b73c) ) /* Banks 0x4000 long @ 0x4000 */ + ROM_CONTINUE( 0x08000, 0x08000) /* Static code */ + + ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* Music CPU, 64KB */ + ROM_LOAD( "23j0-0.40", 0x00000, 0x8000, CRC(9ffcadb6) SHA1(606dbdd73aee3cabb2142200ac6f8c96169e4b19) ) + + ROM_REGION(0x20000, REGION_GFX1, ROMREGION_DISPOSE ) /* Text */ + ROM_LOAD( "23j6-0.18", 0x00000, 0x20000, CRC(86d33df0) SHA1(3419959c28703c5177de9c11b61e1dba9e76aca5) ) /* 0,1,2,3 */ + + ROM_REGION(0x80000, REGION_GFX2, ROMREGION_DISPOSE ) /* Sprites */ + ROM_LOAD( "23j7-0.103", 0x00000, 0x20000, CRC(2f445030) SHA1(3fcf32097e655e963d952d01a30396dc195269ca) ) /* 2,3 */ + ROM_LOAD( "23j8-0.102", 0x20000, 0x20000, CRC(237f725a) SHA1(47bebe5b9878ca10fe6efd4f353717e53a372416) ) /* 2,3 */ + ROM_LOAD( "23j9-0.101", 0x40000, 0x20000, CRC(8caf6097) SHA1(50ad192f831b055586a4a9974f8c6c2f2063ede5) ) /* 0,1 */ + ROM_LOAD( "23ja-0.100", 0x60000, 0x20000, CRC(f678594f) SHA1(4bdcf9407543925f4630a8c7f1f48b85f76343a9) ) /* 0,1 */ + + ROM_REGION(0x40000, REGION_GFX3, ROMREGION_DISPOSE ) /* Background */ + ROM_LOAD( "a-13", 0x00000, 0x10000, NO_DUMP ) + ROM_LOAD( "a-12", 0x10000, 0x10000, NO_DUMP ) + ROM_LOAD( "a-15", 0x20000, 0x10000, NO_DUMP ) + ROM_LOAD( "a-14", 0x30000, 0x10000, NO_DUMP ) + + ROM_REGION(0x40000, REGION_SOUND1, 0 ) /* ADPCM */ + ROM_LOAD( "23j1-0.53", 0x00000, 0x20000, CRC(f91f1001) SHA1(378402a3c966cabd61e9662ae5decd66672a228b) ) + ROM_LOAD( "23j2-0.52", 0x20000, 0x20000, CRC(8b6f26e9) SHA1(7da26ae846814b3957b19c38b6bf7e83617dc6cc) ) + + ROM_REGION(0x300, REGION_USER1, 0 ) /* Unknown Bipolar PROMs */ + ROM_LOAD( "23jb-0.16", 0x000, 0x200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* 82S131 on video board */ + ROM_LOAD( "23j5-0.45", 0x200, 0x100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* 82S129 on main board */ +ROM_END + +ROM_START( saiyugb1 ) + ROM_REGION( 0x28000, REGION_CPU1, 0 ) /* Main CPU: 128KB for code (bankswitched using $3F01) */ + ROM_LOAD( "23j3-0.51", 0x10000, 0x18000, CRC(aa8132a2) SHA1(87c3bd447767f263113c4865afc905a0e484a625) ) /* Banks 0x4000 long @ 0x4000 */ + /* Orientation of bootleg ROMs which are split, but otherwise the same. + ROM_LOAD( "a-5.bin", 0x10000, 0x10000, CRC(39795aa5) ) Banks 0x4000 long @ 0x4000 + ROM_LOAD( "a-9.bin", 0x20000, 0x08000, CRC(051ebe92) ) Banks 0x4000 long @ 0x4000 + */ + ROM_CONTINUE( 0x08000, 0x08000 ) /* Static code */ + + ROM_REGION( 0x28000, REGION_CPU2, 0 ) /* Slave CPU: 128KB for code (bankswitched using $2000) */ + ROM_LOAD( "23j4-0.48", 0x10000, 0x18000, CRC(2914af38) SHA1(3d690fa50b7d36a22de82c026d59a16126a7b73c) ) /* Banks 0x4000 long @ 0x4000 */ + /* Orientation of bootleg ROMs which are split, but otherwise the same. + ROM_LOAD( "a-4.bin", 0x10000, 0x10000, CRC(9effddc1) ) Banks 0x4000 long @ 0x4000 + ROM_LOAD( "a-8.bin", 0x20000, 0x08000, CRC(a436edb8) ) Banks 0x4000 long @ 0x4000 + */ + ROM_CONTINUE( 0x08000, 0x08000 ) /* Static code */ + + ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* Music CPU, 64KB */ + ROM_LOAD( "a-1.bin", 0x00000, 0x8000, CRC(46e5a6d4) SHA1(965ed7bdb727ab32ce3322ca49f1a4e3786e8051) ) + + ROM_REGION( 0x800, REGION_CPU4, 0 ) /* ADPCM CPU, 1KB */ + ROM_LOAD( "mcu8748.bin", 0x000, 0x400, CRC(6d28d6c5) SHA1(20582c62a72545e68c2e155b063ee7e95e1228ce) ) + + ROM_REGION(0x20000, REGION_GFX1, ROMREGION_DISPOSE ) /* Text */ + ROM_LOAD( "23j6-0.18", 0x00000, 0x20000, CRC(86d33df0) SHA1(3419959c28703c5177de9c11b61e1dba9e76aca5) ) /* 0,1,2,3 */ + /* Orientation of bootleg ROMs which are split, but otherwise the same. + ROM_LOAD( "a-2.bin", 0x00000, 0x10000, CRC(baa5a3b9) ) 0,1 + ROM_LOAD( "a-3.bin", 0x10000, 0x10000, CRC(532d59be) ) 2,3 + */ + + ROM_REGION(0x80000, REGION_GFX2, ROMREGION_DISPOSE ) /* Sprites */ + ROM_LOAD( "23j7-0.103", 0x00000, 0x20000, CRC(2f445030) SHA1(3fcf32097e655e963d952d01a30396dc195269ca) ) /* 2,3 */ + ROM_LOAD( "23j8-0.102", 0x20000, 0x20000, CRC(237f725a) SHA1(47bebe5b9878ca10fe6efd4f353717e53a372416) ) /* 2,3 */ + ROM_LOAD( "23j9-0.101", 0x40000, 0x20000, CRC(8caf6097) SHA1(50ad192f831b055586a4a9974f8c6c2f2063ede5) ) /* 0,1 */ + ROM_LOAD( "23ja-0.100", 0x60000, 0x20000, CRC(f678594f) SHA1(4bdcf9407543925f4630a8c7f1f48b85f76343a9) ) /* 0,1 */ + /* Orientation of bootleg ROMs which are split, but otherwise the same + ROM_LOAD( "a-23.bin", 0x00000, 0x10000, CRC(12b56225) ) 2,3 + ROM_LOAD( "a-22.bin", 0x10000, 0x10000, CRC(b592aa9b) ) 2,3 + ROM_LOAD( "a-21.bin", 0x20000, 0x10000, CRC(a331ba3d) ) 2,3 + ROM_LOAD( "a-20.bin", 0x30000, 0x10000, CRC(2515d742) ) 2,3 + ROM_LOAD( "a-19.bin", 0x40000, 0x10000, CRC(d796f2e4) ) 0,1 + ROM_LOAD( "a-18.bin", 0x50000, 0x10000, CRC(c9e1c2f9) ) 0,1 + ROM_LOAD( "a-17.bin", 0x60000, 0x10000, CRC(00b6db0a) ) 0,1 + ROM_LOAD( "a-16.bin", 0x70000, 0x10000, CRC(f196818b) ) 0,1 + */ + + ROM_REGION(0x40000, REGION_GFX3, ROMREGION_DISPOSE ) /* Background */ + ROM_LOAD( "a-13", 0x00000, 0x10000, CRC(b745cac4) SHA1(759767ca7c5123b03b9e1a42bb105d194cb76400) ) + ROM_LOAD( "a-12", 0x10000, 0x10000, CRC(3c864299) SHA1(cb12616e4d6c53a82beb4cd51510a632894b359c) ) + ROM_LOAD( "a-15", 0x20000, 0x10000, CRC(2f268f37) SHA1(f82cfe3b2001d5ed2a709ca9c51febcf624bb627) ) + ROM_LOAD( "a-14", 0x30000, 0x10000, CRC(aef814c8) SHA1(f6b9229ca7beb9a0e47d1f6a1083c6102fdd20c8) ) + + /* Some bootlegs have incorrectly halved the ADPCM data ! */ + /* These are same as the 128k sample except nibble-swapped */ + ROM_REGION(0x40000, REGION_SOUND1, 0 ) /* ADPCM */ /* Bootleggers wrong data */ + ROM_LOAD ( "a-6.bin", 0x00000, 0x10000, CRC(4da4e935) SHA1(235a1589165a23cfad29e07cf66d7c3a777fc904) ) /* 0x8000, 0x7cd47f01 */ + ROM_LOAD ( "a-7.bin", 0x10000, 0x10000, CRC(6284c254) SHA1(e01be1bd4768ae0ccb1cec65b3a6bc80ed7a4b00) ) /* 0x8000, 0x7091959c */ + ROM_LOAD ( "a-10.bin", 0x20000, 0x10000, CRC(b728ec6e) SHA1(433b5f907e4918e89b79bd927e2993ad3030017b) ) /* 0x8000, 0x78349cb6 */ + ROM_LOAD ( "a-11.bin", 0x30000, 0x10000, CRC(a50d1895) SHA1(0c2c1f8a2e945d6c53ce43413f0e63ced45bae17) ) /* 0x8000, 0xaa5b6834 */ + + ROM_REGION(0x300, REGION_USER1, 0 ) /* Unknown Bipolar PROMs */ + ROM_LOAD( "23jb-0.16", 0x000, 0x200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* 82S131 on video board */ + ROM_LOAD( "23j5-0.45", 0x200, 0x100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* 82S129 on main board */ +ROM_END + +ROM_START( saiyugb2 ) + ROM_REGION( 0x28000, REGION_CPU1, 0 ) /* Main CPU: 128KB for code (bankswitched using $3F01) */ + ROM_LOAD( "23j3-0.51", 0x10000, 0x18000, CRC(aa8132a2) SHA1(87c3bd447767f263113c4865afc905a0e484a625) ) /* Banks 0x4000 long @ 0x4000 */ + /* Orientation of bootleg ROMs which are split, but otherwise the same. + ROM_LOAD( "sai5.bin", 0x10000, 0x10000, CRC(39795aa5) ) Banks 0x4000 long @ 0x4000 + ROM_LOAD( "sai9.bin", 0x20000, 0x08000, CRC(051ebe92) ) Banks 0x4000 long @ 0x4000 + */ + ROM_CONTINUE( 0x08000, 0x08000 ) /* Static code */ + + ROM_REGION( 0x28000, REGION_CPU2, 0 ) /* Slave CPU: 128KB for code (bankswitched using $2000) */ + ROM_LOAD( "23j4-0.48", 0x10000, 0x18000, CRC(2914af38) SHA1(3d690fa50b7d36a22de82c026d59a16126a7b73c) ) /* Banks 0x4000 long @ 0x4000 */ + /* Orientation of bootleg ROMs which are split, but otherwise the same. + ROM_LOAD( "sai4.bin", 0x10000, 0x10000, CRC(9effddc1) ) Banks 0x4000 long @ 0x4000 + ROM_LOAD( "sai8.bin", 0x20000, 0x08000, CRC(a436edb8) ) Banks 0x4000 long @ 0x4000 + */ + ROM_CONTINUE( 0x08000, 0x08000 ) /* Static code */ + + ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* Music CPU, 64KB */ + ROM_LOAD( "sai-alt1.bin", 0x00000, 0x8000, CRC(8d397a8d) SHA1(52599521c3dbcecc1ae56bb80dc855e76d700134) ) + +// ROM_REGION( 0x800, REGION_CPU4, 0 ) /* ADPCM CPU, 1KB */ +// ROM_LOAD( "sgr-8749.bin", 0x000, 0x800, CRC(9237e8c5) ) /* same as above but padded with 00 for different mcu */ + + ROM_REGION(0x20000, REGION_GFX1, ROMREGION_DISPOSE ) /* Text */ + ROM_LOAD( "23j6-0.18", 0x00000, 0x20000, CRC(86d33df0) SHA1(3419959c28703c5177de9c11b61e1dba9e76aca5) ) /* 0,1,2,3 */ + /* Orientation of bootleg ROMs which are split, but otherwise the same. + ROM_LOAD( "sai2.bin", 0x00000, 0x10000, CRC(baa5a3b9) ) 0,1 + ROM_LOAD( "sai3.bin", 0x10000, 0x10000, CRC(532d59be) ) 2,3 + */ + + ROM_REGION(0x80000, REGION_GFX2, ROMREGION_DISPOSE ) /* Sprites */ + ROM_LOAD( "23j7-0.103", 0x00000, 0x20000, CRC(2f445030) SHA1(3fcf32097e655e963d952d01a30396dc195269ca) ) /* 2,3 */ + ROM_LOAD( "23j8-0.102", 0x20000, 0x20000, CRC(237f725a) SHA1(47bebe5b9878ca10fe6efd4f353717e53a372416) ) /* 2,3 */ + ROM_LOAD( "23j9-0.101", 0x40000, 0x20000, CRC(8caf6097) SHA1(50ad192f831b055586a4a9974f8c6c2f2063ede5) ) /* 0,1 */ + ROM_LOAD( "23ja-0.100", 0x60000, 0x20000, CRC(f678594f) SHA1(4bdcf9407543925f4630a8c7f1f48b85f76343a9) ) /* 0,1 */ + /* Orientation of bootleg ROMs which are split, but otherwise the same + ROM_LOAD( "sai23.bin", 0x00000, 0x10000, CRC(12b56225) ) 2,3 + ROM_LOAD( "sai22.bin", 0x10000, 0x10000, CRC(b592aa9b) ) 2,3 + ROM_LOAD( "sai21.bin", 0x20000, 0x10000, CRC(a331ba3d) ) 2,3 + ROM_LOAD( "sai20.bin", 0x30000, 0x10000, CRC(2515d742) ) 2,3 + ROM_LOAD( "sai19.bin", 0x40000, 0x10000, CRC(d796f2e4) ) 0,1 + ROM_LOAD( "sai18.bin", 0x50000, 0x10000, CRC(c9e1c2f9) ) 0,1 + ROM_LOAD( "roku17.bin",0x60000, 0x10000, CRC(00b6db0a) ) 0,1 + ROM_LOAD( "sai16.bin", 0x70000, 0x10000, CRC(f196818b) ) 0,1 + */ + + ROM_REGION(0x40000, REGION_GFX3, ROMREGION_DISPOSE ) /* Background */ + ROM_LOAD( "a-13", 0x00000, 0x10000, CRC(b745cac4) SHA1(759767ca7c5123b03b9e1a42bb105d194cb76400) ) + ROM_LOAD( "a-12", 0x10000, 0x10000, CRC(3c864299) SHA1(cb12616e4d6c53a82beb4cd51510a632894b359c) ) + ROM_LOAD( "a-15", 0x20000, 0x10000, CRC(2f268f37) SHA1(f82cfe3b2001d5ed2a709ca9c51febcf624bb627) ) + ROM_LOAD( "a-14", 0x30000, 0x10000, CRC(aef814c8) SHA1(f6b9229ca7beb9a0e47d1f6a1083c6102fdd20c8) ) + + ROM_REGION(0x40000, REGION_SOUND1, 0 ) /* ADPCM */ + /* These are same as the 128k sample except nibble-swapped */ + /* Some bootlegs have incorrectly halved the ADPCM data ! Bootleggers wrong data */ + ROM_LOAD ( "a-6.bin", 0x00000, 0x10000, CRC(4da4e935) SHA1(235a1589165a23cfad29e07cf66d7c3a777fc904) ) /* 0x8000, 0x7cd47f01 */ + ROM_LOAD ( "a-7.bin", 0x10000, 0x10000, CRC(6284c254) SHA1(e01be1bd4768ae0ccb1cec65b3a6bc80ed7a4b00) ) /* 0x8000, 0x7091959c */ + ROM_LOAD ( "a-10.bin", 0x20000, 0x10000, CRC(b728ec6e) SHA1(433b5f907e4918e89b79bd927e2993ad3030017b) ) /* 0x8000, 0x78349cb6 */ + ROM_LOAD ( "a-11.bin", 0x30000, 0x10000, CRC(a50d1895) SHA1(0c2c1f8a2e945d6c53ce43413f0e63ced45bae17) ) /* 0x8000, 0xaa5b6834 */ + + ROM_REGION(0x300, REGION_USER1, 0 ) /* Unknown Bipolar PROMs */ + ROM_LOAD( "23jb-0.16", 0x000, 0x200, CRC(46339529) SHA1(64f4c42a826d67b7cbaa8a23a45ebc4eb6248891) ) /* 82S131 on video board */ + ROM_LOAD( "23j5-0.45", 0x200, 0x100, CRC(fdb130a9) SHA1(4c4f214229b9fab2b5d69c745ec5428787b89e1f) ) /* 82S129 on main board */ +ROM_END + + + +/* ( YEAR NAME PARENT MACHINE INPUT INIT MONITOR COMPANY FULLNAME FLAGS ) */ +GAME( 1988, chinagat, 0, chinagat, chinagat, 0 , ROT0, "[Technos] (Taito Romstar license)", "China Gate (US)", 0 ) +GAME( 1988, saiyugou, chinagat, chinagat, chinagat, 0 , ROT0, "Technos", "Sai Yu Gou Ma Roku (Japan)", 0 ) +GAME( 1988, saiyugb1, chinagat, saiyugb1, chinagat, 0 , ROT0, "bootleg", "Sai Yu Gou Ma Roku (Japan bootleg 1)", GAME_IMPERFECT_SOUND ) +GAME( 1988, saiyugb2, chinagat, saiyugb2, chinagat, 0 , ROT0, "bootleg", "Sai Yu Gou Ma Roku (Japan bootleg 2)", 0 ) |