// license:BSD-3-Clause // copyright-holders:Bryan McPhail, David Haywood /* Boogie Wings (aka The Great Ragtime Show) Data East, 1992 PCB No: DE-0379-1 CPU: DE102 Sound: HuC6280A, YM2151, YM3012, OKI M6295 (x2) OSC: 32.220MHz, 28.000MHz DIPs: 8 position (x2) PALs: (not dumped) VF-00 (PAL16L8) VF-01 (PAL16L8) VF-02 (22CV10P) VF-03 (PAL16L8) VF-04 (PAL16L8) VF-05 (PAL16L8) PROM: MB7122 (compatible to 82S137, located near MBD-09) RAM: 62256 (x2), 6264 (x5) Data East Chips: 52 (x2) 141 (x2) 102 104 113 99 71 (x2) 200 ROMs: kn00-2.2b 27c2001 \ kn01-2.4b 27c2001 | Main program kn02-2.2e 27c2001 | kn03-2.4e 27c2001 / kn04.8e 27c512 \ kn05.9e 27c512 / near 141's and MBD-00, MBD-01 and MBD-02 kn06.18p 27c512 Sound Program mbd-00.8b 16M mbd-01.9b 16M mbd-02.10e 4M mbd-03.13b 16M mbd-04.14b 16M mbd-05.16b 16M mbd-06.17b 16M mbd-07.18b 16M mbd-08.19b 16M mbd-09.16p 4M Oki Samples mbd-10.17p 4M Oki Samples Driver by Bryan McPhail and David Haywood. DECO 99 "ACE" Chip hooked up by cam900. Todo: * Sprite priorities aren't verified to be 100% accurate. (Addendum - all known issues seem to be correct - see Sprite Priority Notes below). * There may be some kind of fullscreen palette effect (controlled by bit 3 in priority word - used at end of each level, and on final boss). * A shadow effect (used in level 1) is not implemented. * ACE Chip aren't fully emulated. Sprite Priority Notes: * On the Imperial Science Museum level at the beginning, you fly behind a wall, but your shots go in front of it. This is verified to be correct behavior by Guru. * There's a level where the player passes through several columns in a building and the player goes behind every 2nd one. That is correct as well. * There is a fire hydrant with an odd-looking spray of water on various levels. If you drop the hydrant in front of an enemy (a tank, for example), the priorities are wrong. This is actual PCB behavior. Also, the strange-looking water spray is correct. Alpha Blend Note: * There are semi-transparent round spots around your plane while fighting the final boss. These are correct. * The final boss shoots a blue beam downwards during the battle. This should have alpha. It fades in to blue, then fades out to nothing again after a few seconds (Guru). (Potentially related to note above about bit 3 in priority word) 2008-07 Dip Locations added according to the manual of the JPN version */ #include "emu.h" #include "includes/boogwing.h" #include "cpu/m68000/m68000.h" #include "machine/deco102.h" #include "machine/decocrpt.h" #include "machine/gen_latch.h" #include "sound/ym2151.h" #include "sound/okim6295.h" #include "screen.h" #include "speaker.h" #define MAIN_XTAL XTAL(28'000'000) #define SOUND_XTAL XTAL(32'220'000) READ16_MEMBER( boogwing_state::boogwing_protection_region_0_104_r ) { int real_address = 0 + (offset *2); int deco146_addr = bitswap<32>(real_address, /* NC */31,30,29,28,27,26,25,24,23,22,21,20,19,18, 13,12,11,/**/ 17,16,15,14, 10,9,8, 7,6,5,4, 3,2,1,0) & 0x7fff; uint8_t cs = 0; uint16_t data = m_deco104->read_data( deco146_addr, mem_mask, cs ); return data; } WRITE16_MEMBER( boogwing_state::boogwing_protection_region_0_104_w ) { int real_address = 0 + (offset *2); int deco146_addr = bitswap<32>(real_address, /* NC */31,30,29,28,27,26,25,24,23,22,21,20,19,18, 13,12,11,/**/ 17,16,15,14, 10,9,8, 7,6,5,4, 3,2,1,0) & 0x7fff; uint8_t cs = 0; m_deco104->write_data( space, deco146_addr, data, mem_mask, cs ); } WRITE16_MEMBER( boogwing_state::priority_w ) { COMBINE_DATA(&m_priority); m_deco_ace->set_palette_effect_max((m_priority & 0x8) ? 0x6ff : 0xfff); } void boogwing_state::boogwing_map(address_map &map) { map(0x000000, 0x0fffff).rom(); map(0x200000, 0x20ffff).ram(); map(0x220000, 0x220001).w(FUNC(boogwing_state::priority_w)); map(0x220002, 0x22000f).noprw(); map(0x240000, 0x240001).w(m_spriteram[0], FUNC(buffered_spriteram16_device::write)); map(0x242000, 0x2427ff).ram().share("spriteram1"); map(0x244000, 0x244001).w(m_spriteram[1], FUNC(buffered_spriteram16_device::write)); map(0x246000, 0x2467ff).ram().share("spriteram2"); // map(0x24e6c0, 0x24e6c1).portr("DSW"); // map(0x24e138, 0x24e139).portr("SYSTEM"); // map(0x24e344, 0x24e345).portr("INPUTS"); map(0x24e000, 0x24efff).rw(FUNC(boogwing_state::boogwing_protection_region_0_104_r), FUNC(boogwing_state::boogwing_protection_region_0_104_w)).share("prot16ram"); /* Protection device */ map(0x260000, 0x26000f).w(m_deco_tilegen[0], FUNC(deco16ic_device::pf_control_w)); map(0x264000, 0x265fff).rw(m_deco_tilegen[0], FUNC(deco16ic_device::pf1_data_r), FUNC(deco16ic_device::pf1_data_w)); map(0x266000, 0x267fff).rw(m_deco_tilegen[0], FUNC(deco16ic_device::pf2_data_r), FUNC(deco16ic_device::pf2_data_w)); map(0x268000, 0x268fff).ram().share("pf1_rowscroll"); map(0x26a000, 0x26afff).ram().share("pf2_rowscroll"); map(0x270000, 0x27000f).w(m_deco_tilegen[1], FUNC(deco16ic_device::pf_control_w)); map(0x274000, 0x275fff).ram().w(m_deco_tilegen[1], FUNC(deco16ic_device::pf1_data_w)); map(0x276000, 0x277fff).ram().w(m_deco_tilegen[1], FUNC(deco16ic_device::pf2_data_w)); map(0x278000, 0x278fff).ram().share("pf3_rowscroll"); map(0x27a000, 0x27afff).ram().share("pf4_rowscroll"); map(0x280000, 0x28000f).noprw(); // ? map(0x282000, 0x282001).noprw(); // Palette setup? map(0x282008, 0x282009).w(m_deco_ace, FUNC(deco_ace_device::palette_dma_w)); map(0x284000, 0x285fff).rw(m_deco_ace, FUNC(deco_ace_device::buffered_palette16_r), FUNC(deco_ace_device::buffered_palette16_w)); map(0x3c0000, 0x3c004f).rw(m_deco_ace, FUNC(deco_ace_device::ace_r), FUNC(deco_ace_device::ace_w)); } void boogwing_state::decrypted_opcodes_map(address_map &map) { map(0x000000, 0x0fffff).rom().share("decrypted_opcodes"); } void boogwing_state::audio_map(address_map &map) { map(0x000000, 0x00ffff).rom(); map(0x100000, 0x100001).noprw(); map(0x110000, 0x110001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)); map(0x120000, 0x120001).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x130000, 0x130001).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x140000, 0x140000).r(m_deco104, FUNC(deco104_device::soundlatch_r)); map(0x1f0000, 0x1f1fff).ram(); } /**********************************************************************************/ static INPUT_PORTS_START( boogwing ) PORT_START("SYSTEM") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") PORT_START("DSW") PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3") PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x0001, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x0006, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x0005, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x0003, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x0002, DEF_STR( 1C_6C ) ) PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:4,5,6") PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x0008, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x0030, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x0028, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x0018, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x0010, DEF_STR( 1C_6C ) ) PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x0080, 0x0080, "Continue Coin" ) PORT_DIPLOCATION("SW1:8") PORT_DIPSETTING( 0x0080, "Normal Coin Credit" ) PORT_DIPSETTING( 0x0000, "2 Start/1 Continue" ) PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x0100, "1" ) PORT_DIPSETTING( 0x0300, "2" ) PORT_DIPSETTING( 0x0200, "3" ) PORT_DIPSETTING( 0x0000, "4" ) PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4") PORT_DIPSETTING( 0x0800, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x0c00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x0400, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) ) PORT_DIPNAME( 0x1000, 0x1000, "Coin Slots" ) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x1000, "Common" ) PORT_DIPSETTING( 0x0000, "Individual" ) PORT_DIPNAME( 0x2000, 0x2000, "Stage Reset" ) PORT_DIPLOCATION("SW2:6") /* At loss of life */ PORT_DIPSETTING( 0x2000, "Point of Termination" ) PORT_DIPSETTING( 0x0000, "Beginning of Stage" ) PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") /* Manual shows as OFF and states "Don't Change" */ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_START("INPUTS") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 ) INPUT_PORTS_END /**********************************************************************************/ static const gfx_layout tile_8x8_layout = { 8,8, RGN_FRAC(1,2), 4, { RGN_FRAC(1,2)+8,RGN_FRAC(1,2)+0,RGN_FRAC(0,2)+8,RGN_FRAC(0,2)+0 }, { STEP8(0,1) }, { STEP8(0,8*2) }, 8*16 }; static const gfx_layout tile_16x16_layout_5bpp = { 16,16, RGN_FRAC(1,3), 5, { RGN_FRAC(2,3), RGN_FRAC(1,3)+8,RGN_FRAC(1,3)+0,RGN_FRAC(0,3)+8,RGN_FRAC(0,3)+0 }, { STEP8(16*8*2,1), STEP8(0,1) }, { STEP16(0,8*2) }, 32*16 }; static const gfx_layout tile_16x16_layout = { 16,16, RGN_FRAC(1,2), 4, { RGN_FRAC(1,2)+8,RGN_FRAC(1,2)+0,RGN_FRAC(0,2)+8,RGN_FRAC(0,2)+0 }, { STEP8(16*8*2,1), STEP8(0,1) }, { STEP16(0,8*2) }, 32*16 }; static const gfx_layout spritelayout = { 16,16, RGN_FRAC(1,1), 4, { 24,8,16,0 }, { STEP8(16*8*4,1), STEP8(0,1) }, { STEP16(0,8*4) }, 32*32 }; static GFXDECODE_START( gfx_boogwing ) GFXDECODE_ENTRY( "tiles1", 0, tile_8x8_layout, 0, 16 ) /* Tiles (8x8) */ GFXDECODE_ENTRY( "tiles2", 0, tile_16x16_layout_5bpp, 0x100, 16 ) /* Tiles (16x16) */ GFXDECODE_ENTRY( "tiles3", 0, tile_16x16_layout, 0x300, 32 ) /* Tiles (16x16) */ GFXDECODE_ENTRY( "sprites1", 0, spritelayout, 0x500, 32 ) /* Sprites (16x16) */ GFXDECODE_ENTRY( "sprites2", 0, spritelayout, 0x700, 16 ) /* Sprites (16x16) */ GFXDECODE_END /**********************************************************************************/ void boogwing_state::machine_reset() { m_priority = 0; } WRITE8_MEMBER(boogwing_state::sound_bankswitch_w) { m_oki[1]->set_rom_bank((data & 2) >> 1); m_oki[0]->set_rom_bank(data & 1); } DECO16IC_BANK_CB_MEMBER(boogwing_state::bank_callback) { return ((bank >> 4) & 0x7) * 0x1000; } DECO16IC_BANK_CB_MEMBER(boogwing_state::bank_callback2) { int offset = ((bank >> 4) & 0x7) * 0x1000; if ((bank & 0xf) == 0xa) offset += 0x800; // strange - transporter level return offset; } MACHINE_CONFIG_START(boogwing_state::boogwing) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", M68000, MAIN_XTAL/2) /* DE102 */ MCFG_DEVICE_PROGRAM_MAP(boogwing_map) MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", boogwing_state, irq6_line_hold) H6280(config, m_audiocpu, SOUND_XTAL/4); m_audiocpu->set_addrmap(AS_PROGRAM, &boogwing_state::audio_map); m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MAIN_XTAL / 4, 442, 0, 320, 274, 8, 248) // same as robocop2(cninja.cpp)? verify this from real pcb. MCFG_SCREEN_UPDATE_DRIVER(boogwing_state, screen_update_boogwing) MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, m_deco_ace, gfx_boogwing) MCFG_DEVICE_ADD("spriteram1", BUFFERED_SPRITERAM16) MCFG_DEVICE_ADD("spriteram2", BUFFERED_SPRITERAM16) DECO_ACE(config, m_deco_ace, 0); DECO16IC(config, m_deco_tilegen[0], 0); m_deco_tilegen[0]->set_split(0); m_deco_tilegen[0]->set_pf1_size(DECO_64x32); m_deco_tilegen[0]->set_pf2_size(DECO_64x32); m_deco_tilegen[0]->set_pf1_trans_mask(0x0f); m_deco_tilegen[0]->set_pf2_trans_mask(0x1f); // pf2 has 5bpp graphics m_deco_tilegen[0]->set_pf1_col_bank(0); m_deco_tilegen[0]->set_pf2_col_bank(0); // pf2 is non default m_deco_tilegen[0]->set_pf1_col_mask(0x0f); m_deco_tilegen[0]->set_pf2_col_mask(0x0f); // no bank1 callback m_deco_tilegen[0]->set_bank2_callback(FUNC(boogwing_state::bank_callback), this); m_deco_tilegen[0]->set_pf12_8x8_bank(0); m_deco_tilegen[0]->set_pf12_16x16_bank(1); m_deco_tilegen[0]->set_gfxdecode_tag("gfxdecode"); DECO16IC(config, m_deco_tilegen[1], 0); m_deco_tilegen[1]->set_split(0); m_deco_tilegen[1]->set_pf1_size(DECO_64x32); m_deco_tilegen[1]->set_pf2_size(DECO_64x32); m_deco_tilegen[1]->set_pf1_trans_mask(0x0f); m_deco_tilegen[1]->set_pf2_trans_mask(0x0f); m_deco_tilegen[1]->set_pf1_col_bank(0); m_deco_tilegen[1]->set_pf2_col_bank(16); m_deco_tilegen[1]->set_pf1_col_mask(0x0f); m_deco_tilegen[1]->set_pf2_col_mask(0x0f); m_deco_tilegen[1]->set_bank1_callback(FUNC(boogwing_state::bank_callback2), this); m_deco_tilegen[1]->set_bank2_callback(FUNC(boogwing_state::bank_callback2), this); m_deco_tilegen[1]->set_pf12_8x8_bank(0); m_deco_tilegen[1]->set_pf12_16x16_bank(2); m_deco_tilegen[1]->set_gfxdecode_tag("gfxdecode"); DECO_SPRITE(config, m_sprgen[0], 0); m_sprgen[0]->set_gfx_region(3); m_sprgen[0]->set_gfxdecode_tag("gfxdecode"); DECO_SPRITE(config, m_sprgen[1], 0); m_sprgen[1]->set_gfx_region(4); m_sprgen[1]->set_gfxdecode_tag("gfxdecode"); DECO104PROT(config, m_deco104, 0); m_deco104->port_a_cb().set_ioport("INPUTS"); m_deco104->port_b_cb().set_ioport("SYSTEM"); m_deco104->port_c_cb().set_ioport("DSW"); m_deco104->soundlatch_irq_cb().set_inputline(m_audiocpu, 0); m_deco104->set_interface_scramble_reverse(); m_deco104->set_use_magic_read_address_xor(true); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); ym2151_device &ymsnd(YM2151(config, "ymsnd", SOUND_XTAL/9)); ymsnd.irq_handler().set_inputline(m_audiocpu, 1); /* IRQ2 */ ymsnd.port_write_handler().set(FUNC(boogwing_state::sound_bankswitch_w)); ymsnd.add_route(0, "lspeaker", 0.80); ymsnd.add_route(1, "rspeaker", 0.80); MCFG_DEVICE_ADD("oki1", OKIM6295, SOUND_XTAL/32, okim6295_device::PIN7_HIGH) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.40) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.40) MCFG_DEVICE_ADD("oki2", OKIM6295, SOUND_XTAL/16, okim6295_device::PIN7_HIGH) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.30) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.30) MACHINE_CONFIG_END /**********************************************************************************/ ROM_START( boogwing ) /* VER 1.5 EUR 92.12.07 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* DE102 code (encrypted) */ ROM_LOAD16_BYTE( "kn_00-2.2b", 0x000000, 0x040000, CRC(e38892b9) SHA1(49b5637965a43e0378e1258c5f0a780926f1f283) ) ROM_LOAD16_BYTE( "kn_02-2.2e", 0x000001, 0x040000, CRC(8426efef) SHA1(2ea33cbd58b638053d75668a484648dbf67dabb8) ) ROM_LOAD16_BYTE( "kn_01-2.4b", 0x080000, 0x040000, CRC(3ad4b54c) SHA1(5141001768266995078407851b445378b21453de) ) ROM_LOAD16_BYTE( "kn_03-2.4e", 0x080001, 0x040000, CRC(10b61f4a) SHA1(41d7f670defbd7dae89afafac9839a9e237814d5) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "km06.18p", 0x00000, 0x10000, CRC(3e8bc4e1) SHA1(7e4c357afefa47b8f101727e06485eb9ebae635d) ) ROM_REGION( 0x20000, "tiles1", 0 ) /* Tiles 1 */ ROM_LOAD16_BYTE( "km05.9e", 0x00000, 0x010000, CRC(d10aef95) SHA1(a611a35ab312caee19c31da079c647679d31673d) ) ROM_LOAD16_BYTE( "km04.8e", 0x00001, 0x010000, CRC(329323a8) SHA1(e2ec7b059301c0a2e052dfc683e044c808ad9b33) ) ROM_REGION( 0x300000, "tiles2", 0 ) /* Tiles 2 */ ROM_LOAD( "mbd-01.9b", 0x000000, 0x100000, CRC(d7de4f4b) SHA1(4747f8795e277ed8106667b6f68e1176d95db684) ) ROM_LOAD( "mbd-00.8b", 0x100000, 0x100000, CRC(adb20ba9) SHA1(2ffa1dd19a438a4d2f5743b1050a8037183a3e7d) ) /* 0x100000 bytes expanded from mbd-02.10e copied here later */ ROM_REGION( 0x200000, "tiles3", 0 ) /* Tiles 3 */ ROM_LOAD( "mbd-03.13b", 0x000000, 0x100000, CRC(cf798f2c) SHA1(f484a22679d6a4d4b0dcac820de3f1a37cbc478f) ) ROM_LOAD( "mbd-04.14b", 0x100000, 0x100000, CRC(d9764d0b) SHA1(74d6f09d65d073606a6e10556cedf740aa50ff08) ) ROM_REGION( 0x400000, "sprites1", 0 ) /* Sprites 1 */ ROM_LOAD16_BYTE( "mbd-05.16b", 0x000001, 0x200000, CRC(1768c66a) SHA1(06bf3bb187c65db9dcce959a43a7231e2ac45c17) ) ROM_LOAD16_BYTE( "mbd-06.17b", 0x000000, 0x200000, CRC(7750847a) SHA1(358266ed68a9816094e7aab0905d958284c8ce98) ) ROM_REGION( 0x400000, "sprites2", 0 ) /* Sprites 2 */ ROM_LOAD16_BYTE( "mbd-07.18b", 0x000001, 0x200000, CRC(241faac1) SHA1(588be0cf2647c1d185a99c987a5a20ab7ad8dea8) ) ROM_LOAD16_BYTE( "mbd-08.19b", 0x000000, 0x200000, CRC(f13b1e56) SHA1(f8f5e8c4e6c159f076d4e6505bd901ade5c6a0ca) ) ROM_REGION( 0x0100000, "gfx6", 0 ) /* 1bpp graphics */ ROM_LOAD16_BYTE( "mbd-02.10e", 0x000000, 0x080000, CRC(b25aa721) SHA1(efe800759080bd1dac2da93bd79062a48c5da2b2) ) ROM_REGION( 0x80000, "oki1", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-10.17p", 0x000000, 0x080000, CRC(f159f76a) SHA1(0b1ea69fecdd151e2b1fa96a21eade492499691d) ) ROM_REGION( 0x80000, "oki2", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-09.16p", 0x000000, 0x080000, CRC(f44f2f87) SHA1(d941520bdfc9e6d88c45462bc1f697c18f33498e) ) ROM_REGION( 0x000400, "proms", 0 ) /* Priority (not used) */ ROM_LOAD( "kj-00.15n", 0x000000, 0x00400, CRC(add4d50b) SHA1(080e5a8192a146d5141aef5c8d9996ddf8cd3ab4) ) ROM_END ROM_START( boogwingu ) /* VER 1.7 USA 92.12.14 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* DE102 code (encrypted) */ ROM_LOAD16_BYTE( "kl_00.2b", 0x000000, 0x040000, CRC(4dc14798) SHA1(f991edf8e308087ed7222b3b4e3bc959980f8f66) ) ROM_LOAD16_BYTE( "kl_02.2e", 0x000001, 0x040000, CRC(3bb3b0a0) SHA1(ba892ea52b6bb8d110050efdaa5effd8447c1b2a) ) ROM_LOAD16_BYTE( "kl_01.4b", 0x080000, 0x040000, CRC(d109ba13) SHA1(93fcda71e260ba94141e2d4d6b248f2cb8530b61) ) ROM_LOAD16_BYTE( "kl_03.4e", 0x080001, 0x040000, CRC(fef2a176) SHA1(b0505466237fe17b6aaa7eea47e309cd679208d1) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "kl06.18p", 0x00000, 0x10000, CRC(3e8bc4e1) SHA1(7e4c357afefa47b8f101727e06485eb9ebae635d) ) /* same as other sets but labeled KL */ ROM_REGION( 0x20000, "tiles1", 0 ) /* Tiles 1 */ ROM_LOAD16_BYTE( "kl05.9e", 0x00000, 0x010000, CRC(d10aef95) SHA1(a611a35ab312caee19c31da079c647679d31673d) ) /* same as other sets but labeled KL */ ROM_LOAD16_BYTE( "kl04.8e", 0x00001, 0x010000, CRC(329323a8) SHA1(e2ec7b059301c0a2e052dfc683e044c808ad9b33) ) /* same as other sets but labeled KL */ ROM_REGION( 0x300000, "tiles2", 0 ) /* Tiles 2 */ ROM_LOAD( "mbd-01.9b", 0x000000, 0x100000, CRC(d7de4f4b) SHA1(4747f8795e277ed8106667b6f68e1176d95db684) ) ROM_LOAD( "mbd-00.8b", 0x100000, 0x100000, CRC(adb20ba9) SHA1(2ffa1dd19a438a4d2f5743b1050a8037183a3e7d) ) /* 0x100000 bytes expanded from mbd-02.10e copied here later */ ROM_REGION( 0x200000, "tiles3", 0 ) /* Tiles 3 */ ROM_LOAD( "mbd-03.13b", 0x000000, 0x100000, CRC(cf798f2c) SHA1(f484a22679d6a4d4b0dcac820de3f1a37cbc478f) ) ROM_LOAD( "mbd-04.14b", 0x100000, 0x100000, CRC(d9764d0b) SHA1(74d6f09d65d073606a6e10556cedf740aa50ff08) ) ROM_REGION( 0x400000, "sprites1", 0 ) /* Sprites 1 */ ROM_LOAD16_BYTE( "mbd-05.16b", 0x000001, 0x200000, CRC(1768c66a) SHA1(06bf3bb187c65db9dcce959a43a7231e2ac45c17) ) ROM_LOAD16_BYTE( "mbd-06.17b", 0x000000, 0x200000, CRC(7750847a) SHA1(358266ed68a9816094e7aab0905d958284c8ce98) ) ROM_REGION( 0x400000, "sprites2", 0 ) /* Sprites 2 */ ROM_LOAD16_BYTE( "mbd-07.18b", 0x000001, 0x200000, CRC(241faac1) SHA1(588be0cf2647c1d185a99c987a5a20ab7ad8dea8) ) ROM_LOAD16_BYTE( "mbd-08.19b", 0x000000, 0x200000, CRC(f13b1e56) SHA1(f8f5e8c4e6c159f076d4e6505bd901ade5c6a0ca) ) ROM_REGION( 0x0100000, "gfx6", 0 ) /* 1bpp graphics */ ROM_LOAD16_BYTE( "mbd-02.10e", 0x000000, 0x080000, CRC(b25aa721) SHA1(efe800759080bd1dac2da93bd79062a48c5da2b2) ) ROM_REGION( 0x80000, "oki1", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-10.17p", 0x000000, 0x080000, CRC(f159f76a) SHA1(0b1ea69fecdd151e2b1fa96a21eade492499691d) ) ROM_REGION( 0x80000, "oki2", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-09.16p", 0x000000, 0x080000, CRC(f44f2f87) SHA1(d941520bdfc9e6d88c45462bc1f697c18f33498e) ) ROM_REGION( 0x000400, "proms", 0 ) /* Priority (not used) */ ROM_LOAD( "kj-00.15n", 0x000000, 0x00400, CRC(add4d50b) SHA1(080e5a8192a146d5141aef5c8d9996ddf8cd3ab4) ) ROM_END ROM_START( boogwinga ) /* VER 1.5 ASA 92.12.07 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* DE102 code (encrypted) */ ROM_LOAD16_BYTE( "km_00-2.2b", 0x000000, 0x040000, CRC(71ab71c6) SHA1(00bfd71dd9ae5f12c574ab0ecc07d85898930c4b) ) ROM_LOAD16_BYTE( "km_02-2.2e", 0x000001, 0x040000, CRC(e90f07f9) SHA1(1e8bd3983ed875f4752cbf2ab1c7e748d3df019c) ) ROM_LOAD16_BYTE( "km_01-2.4b", 0x080000, 0x040000, CRC(7fdce2d3) SHA1(5ce9b8ac26700f1c3bfb3ce4845f890b81241823) ) ROM_LOAD16_BYTE( "km_03-2.4e", 0x080001, 0x040000, CRC(0b582de3) SHA1(f5c58c7e0e8a227506a81e38c266356596dcda7b) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "km06.18p", 0x00000, 0x10000, CRC(3e8bc4e1) SHA1(7e4c357afefa47b8f101727e06485eb9ebae635d) ) ROM_REGION( 0x20000, "tiles1", 0 ) /* Tiles 1 */ ROM_LOAD16_BYTE( "km05.9e", 0x00000, 0x010000, CRC(d10aef95) SHA1(a611a35ab312caee19c31da079c647679d31673d) ) ROM_LOAD16_BYTE( "km04.8e", 0x00001, 0x010000, CRC(329323a8) SHA1(e2ec7b059301c0a2e052dfc683e044c808ad9b33) ) ROM_REGION( 0x300000, "tiles2", 0 ) /* Tiles 2 */ ROM_LOAD( "mbd-01.9b", 0x000000, 0x100000, CRC(d7de4f4b) SHA1(4747f8795e277ed8106667b6f68e1176d95db684) ) ROM_LOAD( "mbd-00.8b", 0x100000, 0x100000, CRC(adb20ba9) SHA1(2ffa1dd19a438a4d2f5743b1050a8037183a3e7d) ) /* 0x100000 bytes expanded from mbd-02.10e copied here later */ ROM_REGION( 0x200000, "tiles3", 0 ) /* Tiles 3 */ ROM_LOAD( "mbd-03.13b", 0x000000, 0x100000, CRC(cf798f2c) SHA1(f484a22679d6a4d4b0dcac820de3f1a37cbc478f) ) ROM_LOAD( "mbd-04.14b", 0x100000, 0x100000, CRC(d9764d0b) SHA1(74d6f09d65d073606a6e10556cedf740aa50ff08) ) ROM_REGION( 0x400000, "sprites1", 0 ) /* Sprites 1 */ ROM_LOAD16_BYTE( "mbd-05.16b", 0x000001, 0x200000, CRC(1768c66a) SHA1(06bf3bb187c65db9dcce959a43a7231e2ac45c17) ) ROM_LOAD16_BYTE( "mbd-06.17b", 0x000000, 0x200000, CRC(7750847a) SHA1(358266ed68a9816094e7aab0905d958284c8ce98) ) ROM_REGION( 0x400000, "sprites2", 0 ) /* Sprites 2 */ ROM_LOAD16_BYTE( "mbd-07.18b", 0x000001, 0x200000, CRC(241faac1) SHA1(588be0cf2647c1d185a99c987a5a20ab7ad8dea8) ) ROM_LOAD16_BYTE( "mbd-08.19b", 0x000000, 0x200000, CRC(f13b1e56) SHA1(f8f5e8c4e6c159f076d4e6505bd901ade5c6a0ca) ) ROM_REGION( 0x0100000, "gfx6", 0 ) /* 1bpp graphics */ ROM_LOAD16_BYTE( "mbd-02.10e", 0x000000, 0x080000, CRC(b25aa721) SHA1(efe800759080bd1dac2da93bd79062a48c5da2b2) ) ROM_REGION( 0x80000, "oki1", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-10.17p", 0x000000, 0x080000, CRC(f159f76a) SHA1(0b1ea69fecdd151e2b1fa96a21eade492499691d) ) ROM_REGION( 0x80000, "oki2", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-09.16p", 0x000000, 0x080000, CRC(f44f2f87) SHA1(d941520bdfc9e6d88c45462bc1f697c18f33498e) ) ROM_REGION( 0x000400, "proms", 0 ) /* Priority (not used) */ ROM_LOAD( "kj-00.15n", 0x000000, 0x00400, CRC(add4d50b) SHA1(080e5a8192a146d5141aef5c8d9996ddf8cd3ab4) ) ROM_END ROM_START( ragtime ) /* VER 1.5 JPN 92.12.07 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* DE102 code (encrypted) */ ROM_LOAD16_BYTE( "kh_00-2.2b", 0x000000, 0x040000, CRC(553e179f) SHA1(ab156d9eca4a74084da944989529fd8f5a147dfc) ) ROM_LOAD16_BYTE( "kh_02-2.2e", 0x000001, 0x040000, CRC(6c759ec0) SHA1(f503d225c31543a7cd975fc599811a31ff729251) ) ROM_LOAD16_BYTE( "kh_01-2.4b", 0x080000, 0x040000, CRC(12dfee70) SHA1(a7c8fd118f589ef13bcb43a6aa446ff81015f5b3) ) ROM_LOAD16_BYTE( "kh_03-2.4e", 0x080001, 0x040000, CRC(076fea18) SHA1(342ca71b6d8c8be92dbf221ada717bdbd0061226) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "km06.18p", 0x00000, 0x10000, CRC(3e8bc4e1) SHA1(7e4c357afefa47b8f101727e06485eb9ebae635d) ) ROM_REGION( 0x20000, "tiles1", 0 ) /* Tiles 1 */ ROM_LOAD16_BYTE( "km05.9e", 0x00000, 0x010000, CRC(d10aef95) SHA1(a611a35ab312caee19c31da079c647679d31673d) ) ROM_LOAD16_BYTE( "km04.8e", 0x00001, 0x010000, CRC(329323a8) SHA1(e2ec7b059301c0a2e052dfc683e044c808ad9b33) ) ROM_REGION( 0x300000, "tiles2", 0 ) /* Tiles 2 */ ROM_LOAD( "mbd-01.9b", 0x000000, 0x100000, CRC(d7de4f4b) SHA1(4747f8795e277ed8106667b6f68e1176d95db684) ) ROM_LOAD( "mbd-00.8b", 0x100000, 0x100000, CRC(adb20ba9) SHA1(2ffa1dd19a438a4d2f5743b1050a8037183a3e7d) ) /* 0x100000 bytes expanded from mbd-02.10e copied here later */ ROM_REGION( 0x200000, "tiles3", 0 ) /* Tiles 3 */ ROM_LOAD( "mbd-03.13b", 0x000000, 0x100000, CRC(cf798f2c) SHA1(f484a22679d6a4d4b0dcac820de3f1a37cbc478f) ) ROM_LOAD( "mbd-04.14b", 0x100000, 0x100000, CRC(d9764d0b) SHA1(74d6f09d65d073606a6e10556cedf740aa50ff08) ) ROM_REGION( 0x400000, "sprites1", 0 ) /* Sprites 1 */ ROM_LOAD16_BYTE( "mbd-05.16b", 0x000001, 0x200000, CRC(1768c66a) SHA1(06bf3bb187c65db9dcce959a43a7231e2ac45c17) ) ROM_LOAD16_BYTE( "mbd-06.17b", 0x000000, 0x200000, CRC(7750847a) SHA1(358266ed68a9816094e7aab0905d958284c8ce98) ) ROM_REGION( 0x400000, "sprites2", 0 ) /* Sprites 2 */ ROM_LOAD16_BYTE( "mbd-07.18b", 0x000001, 0x200000, CRC(241faac1) SHA1(588be0cf2647c1d185a99c987a5a20ab7ad8dea8) ) ROM_LOAD16_BYTE( "mbd-08.19b", 0x000000, 0x200000, CRC(f13b1e56) SHA1(f8f5e8c4e6c159f076d4e6505bd901ade5c6a0ca) ) ROM_REGION( 0x0100000, "gfx6", 0 ) /* 1bpp graphics */ ROM_LOAD16_BYTE( "mbd-02.10e", 0x000000, 0x080000, CRC(b25aa721) SHA1(efe800759080bd1dac2da93bd79062a48c5da2b2) ) ROM_REGION( 0x80000, "oki1", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-10.17p", 0x000000, 0x080000, CRC(f159f76a) SHA1(0b1ea69fecdd151e2b1fa96a21eade492499691d) ) ROM_REGION( 0x80000, "oki2", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-09.16p", 0x000000, 0x080000, CRC(f44f2f87) SHA1(d941520bdfc9e6d88c45462bc1f697c18f33498e) ) ROM_REGION( 0x000400, "proms", 0 ) /* Priority (not used) */ ROM_LOAD( "kj-00.15n", 0x000000, 0x00400, CRC(add4d50b) SHA1(080e5a8192a146d5141aef5c8d9996ddf8cd3ab4) ) ROM_END ROM_START( ragtimea ) /* VER 1.3 JPN 92.11.26 */ ROM_REGION( 0x100000, "maincpu", 0 ) /* DE102 code (encrypted) */ ROM_LOAD16_BYTE( "kh_00-1.2b", 0x000000, 0x040000, CRC(88f0155a) SHA1(6f11cc91e36cd68b7143e3326d92b258f051012e) ) ROM_LOAD16_BYTE( "kh_02-1.2e", 0x000001, 0x040000, CRC(8811b41b) SHA1(d395338bcd812add0de3d1554d1dc3e048d0e4c9) ) ROM_LOAD16_BYTE( "kh_01-1.4b", 0x080000, 0x040000, CRC(4dab63ad) SHA1(8c6f6e8382bcbba6e1a7ced504397181e7d6e1d1) ) ROM_LOAD16_BYTE( "kh_03-1.4e", 0x080001, 0x040000, CRC(8a4cbb18) SHA1(272c8e2b20b0a38ce37552be00130c4117533ea9) ) ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "km06.18p", 0x00000, 0x10000, CRC(3e8bc4e1) SHA1(7e4c357afefa47b8f101727e06485eb9ebae635d) ) ROM_REGION( 0x20000, "tiles1", 0 ) /* Tiles 1 */ ROM_LOAD16_BYTE( "km05.9e", 0x00000, 0x010000, CRC(d10aef95) SHA1(a611a35ab312caee19c31da079c647679d31673d) ) ROM_LOAD16_BYTE( "km04.8e", 0x00001, 0x010000, CRC(329323a8) SHA1(e2ec7b059301c0a2e052dfc683e044c808ad9b33) ) ROM_REGION( 0x300000, "tiles2", 0 ) /* Tiles 2 */ ROM_LOAD( "mbd-01.9b", 0x000000, 0x100000, CRC(d7de4f4b) SHA1(4747f8795e277ed8106667b6f68e1176d95db684) ) ROM_LOAD( "mbd-00.8b", 0x100000, 0x100000, CRC(adb20ba9) SHA1(2ffa1dd19a438a4d2f5743b1050a8037183a3e7d) ) /* 0x100000 bytes expanded from mbd-02.10e copied here later */ ROM_REGION( 0x200000, "tiles3", 0 ) /* Tiles 3 */ ROM_LOAD( "mbd-03.13b", 0x000000, 0x100000, CRC(cf798f2c) SHA1(f484a22679d6a4d4b0dcac820de3f1a37cbc478f) ) ROM_LOAD( "mbd-04.14b", 0x100000, 0x100000, CRC(d9764d0b) SHA1(74d6f09d65d073606a6e10556cedf740aa50ff08) ) ROM_REGION( 0x400000, "sprites1", 0 ) /* Sprites 1 */ ROM_LOAD16_BYTE( "mbd-05.16b", 0x000001, 0x200000, CRC(1768c66a) SHA1(06bf3bb187c65db9dcce959a43a7231e2ac45c17) ) ROM_LOAD16_BYTE( "mbd-06.17b", 0x000000, 0x200000, CRC(7750847a) SHA1(358266ed68a9816094e7aab0905d958284c8ce98) ) ROM_REGION( 0x400000, "sprites2", 0 ) /* Sprites 2 */ ROM_LOAD16_BYTE( "mbd-07.18b", 0x000001, 0x200000, CRC(241faac1) SHA1(588be0cf2647c1d185a99c987a5a20ab7ad8dea8) ) ROM_LOAD16_BYTE( "mbd-08.19b", 0x000000, 0x200000, CRC(f13b1e56) SHA1(f8f5e8c4e6c159f076d4e6505bd901ade5c6a0ca) ) ROM_REGION( 0x0100000, "gfx6", 0 ) /* 1bpp graphics */ ROM_LOAD16_BYTE( "mbd-02.10e", 0x000000, 0x080000, CRC(b25aa721) SHA1(efe800759080bd1dac2da93bd79062a48c5da2b2) ) ROM_REGION( 0x80000, "oki1", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-10.17p", 0x000000, 0x080000, CRC(f159f76a) SHA1(0b1ea69fecdd151e2b1fa96a21eade492499691d) ) ROM_REGION( 0x80000, "oki2", 0 ) /* Oki samples 1 */ ROM_LOAD( "mbd-09.16p", 0x000000, 0x080000, CRC(f44f2f87) SHA1(d941520bdfc9e6d88c45462bc1f697c18f33498e) ) ROM_REGION( 0x000400, "proms", 0 ) /* Priority (not used) */ ROM_LOAD( "kj-00.15n", 0x000000, 0x00400, CRC(add4d50b) SHA1(080e5a8192a146d5141aef5c8d9996ddf8cd3ab4) ) ROM_END void boogwing_state::init_boogwing() { const uint8_t* src = memregion("gfx6")->base(); uint8_t* dst = memregion("tiles2")->base() + 0x200000; deco56_decrypt_gfx(machine(), "tiles1"); deco56_decrypt_gfx(machine(), "tiles2"); deco56_decrypt_gfx(machine(), "tiles3"); deco56_remap_gfx(machine(), "gfx6"); deco102_decrypt_cpu((uint16_t *)memregion("maincpu")->base(), m_decrypted_opcodes, 0x100000, 0x42ba, 0x00, 0x18); memcpy(dst, src, 0x100000); } GAME( 1992, boogwing, 0, boogwing, boogwing, boogwing_state, init_boogwing, ROT0, "Data East Corporation", "Boogie Wings (Euro v1.5, 92.12.07)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) GAME( 1992, boogwingu, boogwing, boogwing, boogwing, boogwing_state, init_boogwing, ROT0, "Data East Corporation", "Boogie Wings (USA v1.7, 92.12.14)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) GAME( 1992, boogwinga, boogwing, boogwing, boogwing, boogwing_state, init_boogwing, ROT0, "Data East Corporation", "Boogie Wings (Asia v1.5, 92.12.07)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) GAME( 1992, ragtime, boogwing, boogwing, boogwing, boogwing_state, init_boogwing, ROT0, "Data East Corporation", "The Great Ragtime Show (Japan v1.5, 92.12.07)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) GAME( 1992, ragtimea, boogwing, boogwing, boogwing, boogwing_state, init_boogwing, ROT0, "Data East Corporation", "The Great Ragtime Show (Japan v1.3, 92.11.26)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )