From 4ef450ccbeab8455efdcb31f0d76363a534608b3 Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Fri, 17 Jul 2020 20:03:10 +0100 Subject: [PATCH] Modular System: minor improvements --- src/mame/drivers/bigkarnk_ms.cpp | 53 ++-- src/mame/drivers/bloodbro_ms.cpp | 194 +++++++++++--- src/mame/drivers/galpanic_ms.cpp | 270 +++++++++++++++++-- src/mame/drivers/raiden_ms.cpp | 429 +++++++++++++++++++++++++++++-- src/mame/drivers/splash_ms.cpp | 41 ++- src/mame/drivers/toki_ms.cpp | 124 ++++----- 6 files changed, 908 insertions(+), 203 deletions(-) diff --git a/src/mame/drivers/bigkarnk_ms.cpp b/src/mame/drivers/bigkarnk_ms.cpp index 1f24b1e5320..1fa9c9a72d1 100644 --- a/src/mame/drivers/bigkarnk_ms.cpp +++ b/src/mame/drivers/bigkarnk_ms.cpp @@ -369,6 +369,8 @@ private: void splash_adpcm_data_w(uint8_t data); void splash_adpcm_control_w(uint8_t data); int m_adpcm_data; + + void descramble_16x16tiles(uint8_t* src, int len); }; uint16_t bigkarnk_ms_state::unknown_0x40000x_r() @@ -520,7 +522,9 @@ uint32_t bigkarnk_ms_state::screen_update(screen_device &screen, bitmap_ind16 &b m_bg_tilemap2->draw(screen, bitmap, cliprect, 0, 0); + // TODO, convert to device, share between Modualar System games const int NUM_SPRITES = 0x200; + const int X_EXTRA_OFFSET = 112; for (int i = NUM_SPRITES-2; i >= 0; i-=2) { @@ -545,7 +549,7 @@ uint32_t bigkarnk_ms_state::screen_update(screen_device &screen, bitmap_ind16 &b int flipx = (attr1 & 0x0040); int flipy = (attr1 & 0x0080); - gfx->transpen(bitmap,cliprect,tile,(attr2&0x0f00)>>8,flipx,flipy,xpos-16-112,ypos-16,15); + gfx->transpen(bitmap,cliprect,tile,(attr2&0x0f00)>>8,flipx,flipy,xpos-16-X_EXTRA_OFFSET,ypos-16,15); } m_bg_tilemap1->draw(screen, bitmap, cliprect, 0, 0); @@ -640,17 +644,6 @@ static const gfx_layout tiles16x16x4_layout = 16 * 16 * 4 }; -static const gfx_layout tiles16x16x4alt_layout = -{ - 16,16, - RGN_FRAC(1,1), - 4, - { 0,8,16,24 }, - { 0,1,2,3,4,5,6,7, 512+0,512+1,512+2,512+3,512+4,512+5,512+6,512+7 }, - { STEP8(0,32), STEP8(256,32) }, - 32 * 32 -}; - static const gfx_layout tiles8x8x4_layout = { 8,8, @@ -664,7 +657,7 @@ static const gfx_layout tiles8x8x4_layout = static GFXDECODE_START( gfx_bigkarnk_ms ) - GFXDECODE_ENTRY( "bgtile", 0, tiles16x16x4alt_layout, 0, 32 ) + GFXDECODE_ENTRY( "bgtile", 0, tiles16x16x4_layout, 0, 32 ) GFXDECODE_ENTRY( "bgtile", 0, tiles8x8x4_layout, 0, 32 ) GFXDECODE_ENTRY( "sprites", 0, tiles16x16x4_layout, 0x200, 32 ) GFXDECODE_END @@ -676,9 +669,18 @@ void bigkarnk_ms_state::splash_adpcm_data_w(uint8_t data) void bigkarnk_ms_state::splash_adpcm_control_w(uint8_t data) { -// printf("splash_adpcm_control_w %02x\n", data); m_msm->reset_w(BIT(data, 7)); - m_soundrom->set_bank(data & 0xf); + + int bank = data & 0x7f; + + if ((bank != 0x02) && + (bank != 0x04) && (bank != 0x05) && (bank != 0x06) && (bank != 0x07) && + (bank != 0x0c) && (bank != 0x0d) && (bank != 0x0e) && (bank != 0x0f)) + { + logerror("splash_adpcm_control_w %02x\n", data); + } + + m_soundrom->set_bank(bank & 0xf); } WRITE_LINE_MEMBER(bigkarnk_ms_state::splash_msm5205_int) @@ -686,8 +688,6 @@ WRITE_LINE_MEMBER(bigkarnk_ms_state::splash_msm5205_int) m_msm->data_w(m_adpcm_data >> 4); m_adpcm_data = (m_adpcm_data << 4) & 0xf0; } - - void bigkarnk_ms_state::sound_map(address_map &map) { map(0x0000, 0x7fff).rom(); @@ -749,12 +749,10 @@ void bigkarnk_ms_state::bigkarnkm(machine_config &config) m_msm->add_route(ALL_OUTPUTS, "mono", 0.80); } -void bigkarnk_ms_state::init_bigkarnkm() -{ - // reorganize graphics into something we can decode with a single pass - uint8_t *src = memregion("bgtile")->base(); - int len = memregion("bgtile")->bytes(); +// reorganize graphics into something we can decode with a single pass +void bigkarnk_ms_state::descramble_16x16tiles(uint8_t* src, int len) +{ std::vector buffer(len); { for (int i = 0; i < len; i++) @@ -767,6 +765,12 @@ void bigkarnk_ms_state::init_bigkarnkm() } } +void bigkarnk_ms_state::init_bigkarnkm() +{ + descramble_16x16tiles(memregion("bgtile")->base(), memregion("bgtile")->bytes()); +} + + void bigkarnk_ms_state::machine_reset() { m_soundrom->set_bank(0); @@ -782,8 +786,9 @@ ROM_START( bigkarnkm ) ROM_LOAD16_BYTE( "cpu_ka_6.ic20", 0x040000, 0x020000, CRC(332d6dea) SHA1(cd7e402642f57c12cb7405c49b75bfaa0d104421) ) ROM_REGION( 0x040000, "soundcpu", 0 ) /* Z80 code (uses YM3812 + M5205) */ - ROM_LOAD( "snd_ka.ic6", 0x000000, 0x010000, CRC(48a66be8) SHA1(0ca8e4ef5b5e257d56afda6946c5f2a0712917a3) ) - ROM_LOAD( "snd_ka.ic11", 0x010000, 0x020000, CRC(8e53a6b8) SHA1(5082bbcb042216a6d58c654a52c98d75df700ac8) ) + ROM_LOAD( "snd_ka.ic6", 0x000000, 0x010000, CRC(48a66be8) SHA1(0ca8e4ef5b5e257d56afda6946c5f2a0712917a3) ) // 0,1,2,3 + ROM_LOAD( "snd_ka.ic11", 0x010000, 0x010000, CRC(8e53a6b8) SHA1(5082bbcb042216a6d58c654a52c98d75df700ac8) ) // 4,5,6,7 + ROM_CONTINUE(0x30000,0x10000) // c,d,e,f ROM_REGION( 0x180000, "sprites", ROMREGION_ERASEFF | ROMREGION_INVERT ) // sprites (same rom subboard type as galpanic_ms.cpp) ROM_LOAD32_BYTE( "5_ka.ic4", 0x080003, 0x020000, CRC(2bee07ea) SHA1(afd8769955314768db894e4e98f65422fc0dbb4f) ) diff --git a/src/mame/drivers/bloodbro_ms.cpp b/src/mame/drivers/bloodbro_ms.cpp index 9d3060e76de..96e79f418e5 100644 --- a/src/mame/drivers/bloodbro_ms.cpp +++ b/src/mame/drivers/bloodbro_ms.cpp @@ -39,27 +39,59 @@ public: bloodbro_ms_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_screen(*this, "screen") + m_palette(*this, "palette"), + m_screen(*this, "screen"), + m_spriteram(*this, "spriteram"), + m_gfxdecode(*this, "gfxdecode") { } void bloodbrom(machine_config &config); + void init_bloodbrom(); protected: virtual void machine_start() override; private: required_device m_maincpu; + required_device m_palette; required_device m_screen; + required_shared_ptr m_spriteram; + required_device m_gfxdecode; uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void bloodbrom_map(address_map &map); + + void descramble_16x16tiles(uint8_t* src, int len); }; void bloodbro_ms_state::bloodbrom_map(address_map &map) { - map(0x000000, 0x7ffff).rom(); + map(0x000000, 0x07ffff).rom(); + + + map(0x080000, 0x08ffff).ram(); // original vram is in here, but bootleg copies some of it elsewhere for use + + map(0x0a0000, 0x0a0001).nopw(); + map(0x0a0008, 0x0a0009).nopw(); + map(0x0a000c, 0x0a000d).nopw(); + + map(0x0c0100, 0x0c0101).nopw(); + + map(0x0e000e, 0x0e000f).nopw(); + + + map(0x100000, 0x1003ff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); + map(0x100400, 0x1007ff).ram().w(m_palette, FUNC(palette_device::write16_ext)).share("palette_ext"); + map(0x100800, 0x100fff).ram(); + map(0x101000, 0x1017ff).ram().share("spriteram"); + map(0x101800, 0x101fff).ram(); + + map(0x102000, 0x102001).nopw(); + + map(0x18d000, 0x18dfff).ram(); + } @@ -70,20 +102,82 @@ void bloodbro_ms_state::machine_start() uint32_t bloodbro_ms_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + bitmap.fill(0, cliprect); + + // TODO, convert to device, share between Modualar System games + const int NUM_SPRITES = 0x200; + const int X_EXTRA_OFFSET = 256; + + for (int i = NUM_SPRITES-2; i >= 0; i-=2) + { + gfx_element *gfx = m_gfxdecode->gfx(0); + + uint16_t attr0 = m_spriteram[i + 0]; + uint16_t attr1 = m_spriteram[i + 1]; + + uint16_t attr2 = m_spriteram[i + NUM_SPRITES]; + //uint16_t attr3 = m_spriteram[i + NUM_SPRITES + 1]; // unused? + + int ypos = attr0 & 0x00ff; + int xpos = (attr1 & 0xff00)>>8; + xpos |= (attr2 & 0x8000) ? 0x100 : 0x000; + + ypos = (0xff - ypos); + + int tile = (attr0 & 0xff00) >> 8; + tile |= (attr1 & 0x003f) << 8; + + int flipx = (attr1 & 0x0040); + int flipy = (attr2 & 0x4000); + + gfx->transpen(bitmap,cliprect,tile,(attr2&0x0f00)>>8,flipx,flipy,xpos-16-X_EXTRA_OFFSET,ypos-16,15); + } + return 0; } -static INPUT_PORTS_START( bloodbrom ) -INPUT_PORTS_END + + +static const gfx_layout tiles16x16x4_layout = +{ + 16,16, + RGN_FRAC(1,1), + 4, + { 0,8,16,24 }, + { 0,1,2,3,4,5,6,7, 512,513,514,515,516,517,518,519 }, + { STEP16(0,32) }, + 16 * 16 * 4 +}; + +/* +static const gfx_layout tiles8x8x4_layout = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { 0,8,16,24 }, + { 0,1,2,3,4,5,6,7 }, + { STEP8(0,32) }, + 16 * 16 +}; +*/ static GFXDECODE_START( gfx_bloodbro_ms ) + GFXDECODE_ENTRY( "sprites", 0, tiles16x16x4_layout, 0x100, 32 ) + GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x4_layout, 0x000, 32 ) + GFXDECODE_ENTRY( "gfx2", 0, tiles16x16x4_layout, 0x000, 32 ) GFXDECODE_END + +static INPUT_PORTS_START( bloodbrom ) +INPUT_PORTS_END + void bloodbro_ms_state::bloodbrom(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, 22.1184_MHz_XTAL / 2); // divisor unknown m_maincpu->set_addrmap(AS_PROGRAM, &bloodbro_ms_state::bloodbrom_map); + m_maincpu->set_vblank_int("screen", FUNC(bloodbro_ms_state::irq4_line_hold)); Z80(config, "audiocpu", 24_MHz_XTAL / 8).set_disable(); // divisor unknown, no XTAL on the PCB, might also use the 20 MHz one @@ -96,7 +190,7 @@ void bloodbro_ms_state::bloodbrom(machine_config &config) m_screen->set_screen_update(FUNC(bloodbro_ms_state::screen_update)); m_screen->set_palette("palette"); - PALETTE(config, "palette").set_format(palette_device::xBRG_444, 1024); + PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 0x400); GFXDECODE(config, "gfxdecode", "palette", gfx_bloodbro_ms); @@ -112,12 +206,36 @@ void bloodbro_ms_state::bloodbrom(machine_config &config) MSM5205(config, "msm", 24_MHz_XTAL / 8).add_route(ALL_OUTPUTS, "mono", 0.15); // divisor unknown, no XTAL on the PCB, might also use the 20 MHz one } +// reorganize graphics into something we can decode with a single pass +void bloodbro_ms_state::descramble_16x16tiles(uint8_t* src, int len) +{ + std::vector buffer(len); + { + for (int i = 0; i < len; i++) + { + int j = bitswap<20>(i, 19,18,17,16,15,12,11,10,9,8,7,6,5,14,13,4,3,2,1,0); + buffer[j] = src[i]; + } + + std::copy(buffer.begin(), buffer.end(), &src[0]); + } +} + +void bloodbro_ms_state::init_bloodbrom() +{ + descramble_16x16tiles(memregion("gfx1")->base(), memregion("gfx1")->bytes()); + descramble_16x16tiles(memregion("gfx2")->base(), memregion("gfx2")->bytes()); +} + + + + ROM_START( bloodbrom ) ROM_REGION( 0x100000, "maincpu", 0 ) // on MOD 6/1 board ROM_LOAD16_BYTE( "6-1_bb606.ic8", 0x00001, 0x10000, CRC(3c069061) SHA1(537a10376ad24537367fb221817789bdc31787fa) ) - ROM_LOAD16_BYTE( "6-1_bb605.ic11", 0x20001, 0x10000, CRC(2dc3fb8c) SHA1(44e8e4136979464101385531f97cce27abe1de34) ) ROM_LOAD16_BYTE( "6-1_bb603.ic17", 0x00000, 0x10000, CRC(10f4c8e9) SHA1(e5c078395b70b73d21c100c6b60cff89e4668473) ) - ROM_LOAD16_BYTE( "6-1_bb602.ic20", 0x10000, 0x10000, CRC(8e507cce) SHA1(93bef8838cf8f73eb158dfe276f53c29f364fd45) ) + ROM_LOAD16_BYTE( "6-1_bb605.ic11", 0x20001, 0x10000, CRC(2dc3fb8c) SHA1(44e8e4136979464101385531f97cce27abe1de34) ) + ROM_LOAD16_BYTE( "6-1_bb602.ic20", 0x20000, 0x10000, CRC(8e507cce) SHA1(93bef8838cf8f73eb158dfe276f53c29f364fd45) ) ROM_LOAD16_BYTE( "6-1_bb604.ic25", 0x40001, 0x10000, CRC(cc069a40) SHA1(314b27cde5427b285272840f41da097326b39ee9) ) ROM_LOAD16_BYTE( "6-1_bb601.ic26", 0x40000, 0x10000, CRC(d06bf68d) SHA1(7df7a99805aa7dd2ad91fb3d641e369c058cc6ae) ) @@ -128,34 +246,41 @@ ROM_START( bloodbrom ) // with pins 32, 31 and 31 soldered together and pin 2 connected between all four chips, // while the sockets are for 28 pin chips (with 27C512 silkscreened on the PCB behind the chips) ROM_REGION( 0x80000, "gfx1", 0 ) // on one of the MOD 4/3 boards - ROM_LOAD( "4-3-a_bb4a1.ic17", 0x00000, 0x20000, CRC(499c91db) SHA1(bd7142a311a4f3e606f8a31aafc0b504f3d5a2e4) ) - ROM_LOAD( "4-3-a_bb4a2.ic16", 0x20000, 0x20000, CRC(e8f87153) SHA1(f4147c971d1c66e7c6133c6318357ced7e30e217) ) - ROM_LOAD( "4-3-a_bb4a3.ic15", 0x40000, 0x20000, CRC(13b888f2) SHA1(7a53f78f22a09fe4db45c36bf3912ad379deca64) ) - ROM_LOAD( "4-3-a_bb4a4.ic14", 0x60000, 0x20000, CRC(19bc0508) SHA1(01c4eb570dc7ba9401085012d23bdb865df78029) ) + ROM_LOAD32_BYTE( "4-3-a_bb4a1.ic17", 0x00003, 0x20000, CRC(499c91db) SHA1(bd7142a311a4f3e606f8a31aafc0b504f3d5a2e4) ) + ROM_LOAD32_BYTE( "4-3-a_bb4a2.ic16", 0x00002, 0x20000, CRC(e8f87153) SHA1(f4147c971d1c66e7c6133c6318357ced7e30e217) ) + ROM_LOAD32_BYTE( "4-3-a_bb4a3.ic15", 0x00001, 0x20000, CRC(13b888f2) SHA1(7a53f78f22a09fe4db45c36bf3912ad379deca64) ) + ROM_LOAD32_BYTE( "4-3-a_bb4a4.ic14", 0x00000, 0x20000, CRC(19bc0508) SHA1(01c4eb570dc7ba9401085012d23bdb865df78029) ) ROM_REGION( 0x80000, "gfx2", 0 ) // on another MOD 4/3 board - ROM_LOAD( "4-3-b_bb4b1.ic17", 0x00000, 0x20000, CRC(aa86ae59) SHA1(c15a78eaaca36bebd3261cb2c4a2c232b967a135) ) - ROM_LOAD( "4-3-b_bb4b2.ic16", 0x20000, 0x20000, CRC(f25dd182) SHA1(eff29970c7b898744b08a151f9e17b68ce77e78d) ) - ROM_LOAD( "4-3-b_bb4b3.ic15", 0x40000, 0x20000, CRC(3efcb6aa) SHA1(0a162285d08e171e946147e0725db879643ae113) ) - ROM_LOAD( "4-3-b_bb4b4.ic14", 0x60000, 0x20000, CRC(6b5254fa) SHA1(1e9e3096e5f29554fb8f8cb0df0e5157f940f8c9) ) + ROM_LOAD32_BYTE( "4-3-b_bb4b1.ic17", 0x00003, 0x20000, CRC(aa86ae59) SHA1(c15a78eaaca36bebd3261cb2c4a2c232b967a135) ) + ROM_LOAD32_BYTE( "4-3-b_bb4b2.ic16", 0x00002, 0x20000, CRC(f25dd182) SHA1(eff29970c7b898744b08a151f9e17b68ce77e78d) ) + ROM_LOAD32_BYTE( "4-3-b_bb4b3.ic15", 0x00001, 0x20000, CRC(3efcb6aa) SHA1(0a162285d08e171e946147e0725db879643ae113) ) + ROM_LOAD32_BYTE( "4-3-b_bb4b4.ic14", 0x00000, 0x20000, CRC(6b5254fa) SHA1(1e9e3096e5f29554fb8f8cb0df0e5157f940f8c9) ) + + // ROMs for frontmost tile layer (text) are missing? + ROM_REGION( 0x80000, "gfx3", 0 ) // on another MOD 4/3 board + ROM_LOAD32_BYTE( "text.ic17", 0x00003, 0x20000, NO_DUMP ) + ROM_LOAD32_BYTE( "text.ic16", 0x00002, 0x20000, NO_DUMP ) + ROM_LOAD32_BYTE( "text.ic15", 0x00001, 0x20000, NO_DUMP ) + ROM_LOAD32_BYTE( "text.ic14", 0x00000, 0x20000, NO_DUMP ) - ROM_REGION( 0x100000, "gfx3", 0 ) // on MOD 51/1 board - ROM_LOAD( "51-1-b_bb503.ic3", 0x00000, 0x10000, CRC(9d2a382d) SHA1(734b495ace73f07c622f64b305dafe43099395c1) ) - ROM_LOAD( "51-1-b_bb504.ic4", 0x10000, 0x10000, CRC(1fc7f229) SHA1(37120c85a170f31bc4fbf287b1ba80bc319522ec) ) - ROM_LOAD( "51-1-b_bb505.ic5", 0x20000, 0x10000, CRC(3ec650ce) SHA1(28091f535fcd580f2d3a941251a9c4f662fcf2e4) ) - ROM_LOAD( "51-1-b_bb506.ic6", 0x30000, 0x10000, CRC(10dba663) SHA1(ea0e4115ebb1c9f894c044a1eb11f135fcf5aba8) ) - ROM_LOAD( "51-1-b_bb512.ic12", 0x40000, 0x10000, CRC(83bbb220) SHA1(8f43354c7cea89938d1115d7a0f27ede8f7d3e96) ) - ROM_LOAD( "51-1-b_bb513.ic13", 0x50000, 0x10000, CRC(3767456b) SHA1(3680807282079862cdfb5ec055e7d771e708545b) ) - ROM_LOAD( "51-1-b_bb514.ic14", 0x60000, 0x10000, CRC(a29a2f44) SHA1(4e039d9a9b225179e84590d450eca3bed05bd3b8) ) - ROM_LOAD( "51-1-b_bb515.ic15", 0x70000, 0x10000, CRC(30110411) SHA1(fe9f418070c224d3a9acf6913bd4597b55afcc94) ) - ROM_LOAD( "51-1-b_bb518.ic18", 0x80000, 0x10000, CRC(efcf5b1d) SHA1(515b27f8e6df7ac7ed172cbd1ac64b14791de99f) ) - ROM_LOAD( "51-1-b_bb519.ic19", 0x90000, 0x10000, CRC(77670244) SHA1(27a5572d86ae6e9a5ef076572a4b3a04a22c86e9) ) - ROM_LOAD( "51-1-b_bb520.ic20", 0xa0000, 0x10000, CRC(d7f3b09a) SHA1(339206a7c3389d4eac63e8314ba7fdda9de73be7) ) - ROM_LOAD( "51-1-b_bb521.ic21", 0xb0000, 0x10000, CRC(fb8cff4c) SHA1(5fa0b52140959e029911a28928b3efad4aa9f1db) ) - ROM_LOAD( "51-1-b_bb524.ic24", 0xc0000, 0x10000, CRC(c4ccf38d) SHA1(be93ce6ed87c79fbd13838c0fe80526ce7e7e870) ) - ROM_LOAD( "51-1-b_bb525.ic25", 0xd0000, 0x10000, CRC(25b4e119) SHA1(7e7d95aefee2b8d4dddf105c16d347ec65cd76a5) ) - ROM_LOAD( "51-1-b_bb526.ic26", 0xe0000, 0x10000, CRC(1c2d70b0) SHA1(703f1acbcdaa7ff539f58829890d25b51a2e269e) ) - ROM_LOAD( "51-1-b_bb527.ic27", 0xf0000, 0x10000, CRC(a73cd7a5) SHA1(9106565d1c8a8e0efa8f5035106f3cdac2189107) ) + ROM_REGION( 0x100000, "sprites", ROMREGION_INVERT ) // on MOD 51/1 board + ROM_LOAD32_BYTE( "51-1-b_bb503.ic3", 0x00003, 0x10000, CRC(9d2a382d) SHA1(734b495ace73f07c622f64b305dafe43099395c1) ) + ROM_LOAD32_BYTE( "51-1-b_bb512.ic12", 0x00002, 0x10000, CRC(83bbb220) SHA1(8f43354c7cea89938d1115d7a0f27ede8f7d3e96) ) + ROM_LOAD32_BYTE( "51-1-b_bb518.ic18", 0x00001, 0x10000, CRC(efcf5b1d) SHA1(515b27f8e6df7ac7ed172cbd1ac64b14791de99f) ) + ROM_LOAD32_BYTE( "51-1-b_bb524.ic24", 0x00000, 0x10000, CRC(c4ccf38d) SHA1(be93ce6ed87c79fbd13838c0fe80526ce7e7e870) ) + ROM_LOAD32_BYTE( "51-1-b_bb504.ic4", 0x40003, 0x10000, CRC(1fc7f229) SHA1(37120c85a170f31bc4fbf287b1ba80bc319522ec) ) + ROM_LOAD32_BYTE( "51-1-b_bb513.ic13", 0x40002, 0x10000, CRC(3767456b) SHA1(3680807282079862cdfb5ec055e7d771e708545b) ) + ROM_LOAD32_BYTE( "51-1-b_bb519.ic19", 0x40001, 0x10000, CRC(77670244) SHA1(27a5572d86ae6e9a5ef076572a4b3a04a22c86e9) ) + ROM_LOAD32_BYTE( "51-1-b_bb525.ic25", 0x40000, 0x10000, CRC(25b4e119) SHA1(7e7d95aefee2b8d4dddf105c16d347ec65cd76a5) ) + ROM_LOAD32_BYTE( "51-1-b_bb505.ic5", 0x80003, 0x10000, CRC(3ec650ce) SHA1(28091f535fcd580f2d3a941251a9c4f662fcf2e4) ) + ROM_LOAD32_BYTE( "51-1-b_bb514.ic14", 0x80002, 0x10000, CRC(a29a2f44) SHA1(4e039d9a9b225179e84590d450eca3bed05bd3b8) ) + ROM_LOAD32_BYTE( "51-1-b_bb520.ic20", 0x80001, 0x10000, CRC(d7f3b09a) SHA1(339206a7c3389d4eac63e8314ba7fdda9de73be7) ) + ROM_LOAD32_BYTE( "51-1-b_bb526.ic26", 0x80000, 0x10000, CRC(1c2d70b0) SHA1(703f1acbcdaa7ff539f58829890d25b51a2e269e) ) + ROM_LOAD32_BYTE( "51-1-b_bb506.ic6", 0xc0003, 0x10000, CRC(10dba663) SHA1(ea0e4115ebb1c9f894c044a1eb11f135fcf5aba8) ) + ROM_LOAD32_BYTE( "51-1-b_bb515.ic15", 0xc0002, 0x10000, CRC(30110411) SHA1(fe9f418070c224d3a9acf6913bd4597b55afcc94) ) + ROM_LOAD32_BYTE( "51-1-b_bb521.ic21", 0xc0001, 0x10000, CRC(fb8cff4c) SHA1(5fa0b52140959e029911a28928b3efad4aa9f1db) ) + ROM_LOAD32_BYTE( "51-1-b_bb527.ic27", 0xc0000, 0x10000, CRC(a73cd7a5) SHA1(9106565d1c8a8e0efa8f5035106f3cdac2189107) ) ROM_REGION( 0x0400, "proms", 0 ) // PROMs (function unknown) ROM_LOAD( "1-2_110_tbp18s030.ic20", 0x000, 0x020, CRC(e26e680a) SHA1(9bbe30e98e952a6113c64e1171330153ddf22ce7) ) @@ -174,4 +299,7 @@ ROM_START( bloodbrom ) ROM_LOAD( "51-1-b_5246_gal16v8-20hb1.ic8", 0x000, 0x117, NO_DUMP ) // Protected ROM_END -GAME( 199?, bloodbrom, bloodbro, bloodbrom, bloodbrom, bloodbro_ms_state, empty_init, ROT0, "bootleg (Gaelco / Ervisa)", "Blood Bros. (Modular System)", MACHINE_IS_SKELETON ) + + + +GAME( 199?, bloodbrom, bloodbro, bloodbrom, bloodbrom, bloodbro_ms_state, init_bloodbrom, ROT0, "bootleg (Gaelco / Ervisa)", "Blood Bros. (Modular System)", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/galpanic_ms.cpp b/src/mame/drivers/galpanic_ms.cpp index 68043aea23d..40d4c228de3 100644 --- a/src/mame/drivers/galpanic_ms.cpp +++ b/src/mame/drivers/galpanic_ms.cpp @@ -18,6 +18,9 @@ MOD51/3 - Sprite board (ROM sockets used for plug in board below) COMP AEREO MOD/5-1 (MODULAR SYSTEM 2) - Sprite ROM board, plugs into above, 24 sprite ROMs MOD 4/3 - Tilemap board, has logic + 4 tilemap ROMs, long thin sub-board (CAR-0484/1 SOLD) with no chips, just routing along one edge + + + -- does the sound board have a MSM5205 or not? */ @@ -26,7 +29,12 @@ #include "emupal.h" #include "screen.h" #include "speaker.h" - +#include "tilemap.h" +#include "cpu/z80/z80.h" +#include "sound/2203intf.h" +#include "machine/gen_latch.h" +#include "machine/bankdev.h" +#include "sound/msm5205.h" class galspanic_ms_state : public driver_device { @@ -34,27 +42,48 @@ public: galspanic_ms_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_soundcpu(*this, "soundcpu"), + m_ym1(*this, "ym1"), + m_ym2(*this, "ym2"), m_palette(*this, "palette"), m_screen(*this, "screen"), m_paletteram(*this, "palette"), + m_spriteram(*this, "spriteram"), m_fg_ind8_pixram(*this, "fg_ind8ram"), m_bg_rgb555_pixram(*this, "bg_rgb555ram"), - m_gfxdecode(*this, "gfxdecode") + m_videoram2(*this, "videoram2"), + m_scrollram(*this, "scrollram"), + m_gfxdecode(*this, "gfxdecode"), + m_msm(*this, "msm"), + m_soundrom(*this, "soundrom"), + m_soundlatch(*this, "soundlatch") { } void newquiz(machine_config &config); + void init_galpanicms(); private: required_device m_maincpu; + required_device m_soundcpu; + required_device m_ym1; + required_device m_ym2; required_device m_palette; required_device m_screen; required_shared_ptr m_paletteram; + required_shared_ptr m_spriteram; required_shared_ptr m_fg_ind8_pixram; required_shared_ptr m_bg_rgb555_pixram; + required_shared_ptr m_videoram2; + required_shared_ptr m_scrollram; required_device m_gfxdecode; + required_device m_msm; + required_device m_soundrom; + required_device m_soundlatch; virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; void galspanic_ms_palette(palette_device &palette) const; uint32_t screen_update_backgrounds(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -63,14 +92,60 @@ private: // comad uint16_t comad_timer_r(); void newquiz_map(address_map &map); + void sound_map(address_map &map); + void soundrom_map(address_map &map); + uint8_t unk_r() + { + return machine().rand(); + } + + uint16_t vram2_r(offs_t offset, uint16_t mem_mask); + void vram2_w(offs_t offset, uint16_t data, uint16_t mem_mask); + + TILE_GET_INFO_MEMBER(get_tile_info_tilemap2); + + tilemap_t *m_bg_tilemap2; + + DECLARE_WRITE_LINE_MEMBER(splash_msm5205_int); + void splash_adpcm_data_w(uint8_t data); + void splash_adpcm_control_w(uint8_t data); + int m_adpcm_data; + + void descramble_16x16tiles(uint8_t* src, int len); }; +TILE_GET_INFO_MEMBER(galspanic_ms_state::get_tile_info_tilemap2) +{ + int tile = m_videoram2[tile_index*2]; + + //int attr = m_videoram2[(tile_index*2)+1] & 0xff; + //int fx = (m_videoram2[(tile_index*2)+1] & 0xc0)>>6; + + int col = (tile & 0xf000)>>12; + tile &= 0x0fff; + + tileinfo.set(1,tile,col,0); +} + +uint16_t galspanic_ms_state::vram2_r(offs_t offset, uint16_t mem_mask) +{ + return m_videoram2[offset]; +} + +void galspanic_ms_state::vram2_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_videoram2[offset]); + m_bg_tilemap2->mark_tile_dirty(offset/2); +} + + uint16_t galspanic_ms_state::comad_timer_r() { return (m_screen->vpos() & 0x07) << 8; } +// lots of bad / leftover reads/writes from the original code in here void galspanic_ms_state::newquiz_map(address_map &map) { map(0x000000, 0x03ffff).rom(); @@ -80,25 +155,38 @@ void galspanic_ms_state::newquiz_map(address_map &map) map(0x500000, 0x51ffff).ram().share("fg_ind8ram"); map(0x520000, 0x53ffff).ram().share("bg_rgb555ram"); - map(0x584000, 0x587fff).ram(); // was view2 tilemaps (moved from 0x580000 on original) presumably still 'gfx3' tiles tho + map(0x581000, 0x581fff).ram(); + map(0x584000, 0x5847ff).rw(FUNC(galspanic_ms_state::vram2_r), FUNC(galspanic_ms_state::vram2_w)).share("videoram2"); // was view2 tilemaps (moved from 0x580000 on original) presumably still 'bgtile' tiles tho + map(0x584800, 0x584fff).ram().share("scrollram"); + map(0x585000, 0x58ffff).ram(); map(0x600000, 0x600fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x680000, 0x68001f).ram(); // was view2 tilemap regs - map(0x700000, 0x700fff).ram().share("spriteram"); // original spriteram? - drawing from here results in corrupt / missing sprites + map(0x700000, 0x700fff).ram().share("oldspriteram"); // original spriteram? - drawing from here results in corrupt / missing sprites - map(0x704000, 0x7047ff).ram().share("boot_spriteram"); // bootleg uses this instead? + map(0x704000, 0x7047ff).ram().share("spriteram"); // bootleg uses this instead? + + map(0x780000, 0x78001f).ram(); map(0x800000, 0x800001).portr("DSW1"); map(0x800002, 0x800003).portr("DSW2"); map(0x800004, 0x800005).portr("SYSTEM"); - map(0x80000e, 0x80000f).r(FUNC(galspanic_ms_state::comad_timer_r)); + map(0x80000e, 0x80000f).r(FUNC(galspanic_ms_state::comad_timer_r)).w(m_soundlatch, FUNC(generic_latch_8_device::write)); + + map(0x840000, 0x840001).ram(); + + map(0x900000, 0x900001).ram(); + + map(0xa00000, 0xa00001).ram(); map(0xb00000, 0xbfffff).rom().region("user1", 0); // reads girl data here map(0xc80000, 0xc8ffff).ram(); + + map(0xe00012, 0xe00013).ram(); } @@ -106,6 +194,68 @@ void galspanic_ms_state::machine_start() { } + +void galspanic_ms_state::machine_reset() +{ + m_soundrom->set_bank(2); +} + +void galspanic_ms_state::splash_adpcm_data_w(uint8_t data) +{ + m_adpcm_data = data; +} + +void galspanic_ms_state::splash_adpcm_control_w(uint8_t data) +{ + m_msm->reset_w(BIT(data, 7)); + + int bank = data & 0x7f; + + if ((bank != 0x02) && + (bank != 0x04) && (bank != 0x05) && (bank != 0x06) && (bank != 0x07) && + (bank != 0x0c) && (bank != 0x0d) && (bank != 0x0e) && (bank != 0x0f)) + { + logerror("splash_adpcm_control_w %02x\n", data); + } + + m_soundrom->set_bank(bank & 0xf); +} + +WRITE_LINE_MEMBER(galspanic_ms_state::splash_msm5205_int) +{ + m_msm->data_w(m_adpcm_data >> 4); + m_adpcm_data = (m_adpcm_data << 4) & 0xf0; +} +void galspanic_ms_state::sound_map(address_map &map) +{ + map(0x0000, 0x7fff).rom(); + map(0x8000, 0x8fff).ram(); + map(0x9000, 0x97ff).ram().mirror(0x0800); + + + map(0xc000, 0xc000).nopw(); + + //map(0x8000, 0xbfff).m(m_soundrom, FUNC(address_map_bank_device::amap8)); + +// map(0xe000, 0xe000).w(FUNC(galspanic_ms_state::splash_adpcm_control_w)); +// map(0xe400, 0xe400).w(FUNC(galspanic_ms_state::splash_adpcm_data_w)); + + map(0xa000, 0xa001).rw(m_ym1, FUNC(ym2203_device::read), FUNC(ym2203_device::write)).mirror(0x0008); + map(0xa002, 0xa003).rw(m_ym2, FUNC(ym2203_device::read), FUNC(ym2203_device::write)).mirror(0x0008); +} + +void galspanic_ms_state::soundrom_map(address_map &map) +{ + map(0x00000, 0x3ffff).rom().region("soundcpu", 0x000000); +} + + +void galspanic_ms_state::video_start() +{ + m_bg_tilemap2 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(galspanic_ms_state::get_tile_info_tilemap2)), TILEMAP_SCAN_ROWS, 16, 16, 32, 16); + m_bg_tilemap2->set_transparent_pen(15); +} + void galspanic_ms_state::galspanic_ms_palette(palette_device &palette) const { // first 2048 colors are dynamic @@ -127,7 +277,7 @@ uint32_t galspanic_ms_state::screen_update_backgrounds(screen_device &screen, bi { uint16_t dat = (m_bg_rgb555_pixram[count] & 0xfffe)>>1; dat += 2048; - dest[x] = dat; + dest[(x-1)&0xff] = dat; count++; } } @@ -154,8 +304,42 @@ uint32_t galspanic_ms_state::screen_update_backgrounds(screen_device &screen, bi uint32_t galspanic_ms_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { screen_update_backgrounds(screen, bitmap, cliprect); -// m_kaneko_spr->render_sprites(cliprect, m_spriteram, m_spriteram.bytes()); -// m_kaneko_spr->copybitmap(bitmap, cliprect, screen.priority()); + + m_bg_tilemap2->set_scrollx(0, 64+m_scrollram[0x400/2]); + m_bg_tilemap2->set_scrolly(0, 48-m_scrollram[0x402/2]); + + m_bg_tilemap2->draw(screen, bitmap, cliprect, 0, 0); + + // TODO, convert to device, share between Modualar System games + const int NUM_SPRITES = 0x200; + const int X_EXTRA_OFFSET = 240; + + for (int i = NUM_SPRITES-2; i >= 0; i-=2) + { + gfx_element *gfx = m_gfxdecode->gfx(0); + + uint16_t attr0 = m_spriteram[i + 0]; + uint16_t attr1 = m_spriteram[i + 1]; + + uint16_t attr2 = m_spriteram[i + NUM_SPRITES]; + //uint16_t attr3 = m_spriteram[i + NUM_SPRITES + 1]; // unused? + + int ypos = attr0 & 0x00ff; + int xpos = (attr1 & 0xff00)>>8; + xpos |= (attr2 & 0x8000) ? 0x100 : 0x000; + + ypos = (0xff - ypos); + + int tile = (attr0 & 0xff00) >> 8; + tile |= (attr1 & 0x003f) << 8; + + int flipx = 0; // different + int flipy = (attr2 & 0x4000); + + gfx->transpen(bitmap,cliprect,tile,(attr2&0x0f00)>>8,flipx,flipy,xpos-16-X_EXTRA_OFFSET,ypos-14,15); + } + + return 0; } @@ -249,8 +433,8 @@ static const gfx_layout tiles16x16x4_layout = }; static GFXDECODE_START( gfx_galspanic_ms ) - GFXDECODE_ENTRY( "kan_spr", 0, tiles16x16x4_layout, 0, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, tiles16x16x4_layout, 0, 16 ) + GFXDECODE_ENTRY( "kan_spr", 0, tiles16x16x4_layout, 0x100, 16 ) + GFXDECODE_ENTRY( "bgtile", 0, tiles16x16x4_layout, 0x400, 16 ) GFXDECODE_END @@ -276,21 +460,30 @@ void galspanic_ms_state::newquiz(machine_config &config) GFXDECODE(config, m_gfxdecode, "palette", gfx_galspanic_ms); -// does not use original video hardware, will implement different hardware in driver instead -// KANEKO_TMAP(config, m_view2); -// m_view2->set_colbase(0x400); -// m_view2->set_offset(0x5b, 0x8, 256, 224); -// m_view2->set_palette(m_palette); -// m_view2->set_tile_callback(kaneko_view2_tilemap_device::view2_cb_delegate(FUNC(galspanic_ms_state::tile_callback), this)); - -// KANEKO_VU002_SPRITE(config, m_kaneko_spr); -// m_kaneko_spr->set_priorities(8,8,8,8); // above all (not verified) -// m_kaneko_spr->set_offsets(0, -0x40); -// m_kaneko_spr->set_palette(m_palette); -// m_kaneko_spr->set_color_base(0x100); - /* sound hardware */ SPEAKER(config, "mono").front_center(); + + Z80(config, m_soundcpu, 16_MHz_XTAL/4); + m_soundcpu->set_addrmap(AS_PROGRAM, &galspanic_ms_state::sound_map); +// m_soundcpu->set_periodic_int(FUNC(galspanic_ms_state::nmi_line_pulse), attotime::from_hz(60*64)); // no NMI here, just retn + + ADDRESS_MAP_BANK(config, m_soundrom).set_map(&galspanic_ms_state::soundrom_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x4000); + + GENERIC_LATCH_8(config, m_soundlatch); + //m_soundlatch->data_pending_callback().set_inputline(m_soundcpu, INPUT_LINE_IRQ0); + + YM2203(config, m_ym1, XTAL(20'000'000)/16).add_route(ALL_OUTPUTS, "mono", 0.40); + m_ym1->port_a_read_callback().set(FUNC(galspanic_ms_state::unk_r)); + m_ym1->port_b_read_callback().set(FUNC(galspanic_ms_state::unk_r)); + + YM2203(config, m_ym2, XTAL(20'000'000)/16).add_route(ALL_OUTPUTS, "mono", 0.40); + m_ym2->port_a_read_callback().set(FUNC(galspanic_ms_state::unk_r)); + m_ym2->port_b_read_callback().set(FUNC(galspanic_ms_state::unk_r)); + + MSM5205(config, m_msm, XTAL(384'000)); + m_msm->vck_legacy_callback().set(FUNC(galspanic_ms_state::splash_msm5205_int)); + m_msm->set_prescaler_selector(msm5205_device::S48_4B); + m_msm->add_route(ALL_OUTPUTS, "mono", 0.80); } @@ -299,7 +492,7 @@ ROM_START( galpanicms ) ROM_LOAD16_BYTE( "cpu_ic17.bin", 0x000000, 0x80000, CRC(c65104e1) SHA1(189dde2a34b949bd1763d8ee0d74c86fead549b9) ) // AM27C040 ROM_LOAD16_BYTE( "cpu_ic8.bin", 0x000001, 0x20000, CRC(e2e201e5) SHA1(2a8257f66139178af951d701fd263144aacf2808) ) // AM27C010 - ROM_REGION( 0x10000, "soundcpu", 0 ) // Z80 code + ROM_REGION( 0x40000, "soundcpu", 0 ) // Z80 code ROM_LOAD( "snd_1.ic12", 0x000000, 0x10000, CRC(409e9233) SHA1(f13de7ddc00857c889250621ebccdae1b494cfd0) ) // TMS27C512 ROM_REGION16_BE( 0x100000, "userx", ROMREGION_ERASEFF ) // 68000 data @ 0x200000 @@ -310,7 +503,7 @@ ROM_START( galpanicms ) ROM_LOAD16_BYTE( "cpu_ic26.bin", 0x080000, 0x40000, CRC(c7e2135b) SHA1(8cf0c21c9b64e48da458bc29cfb15e1a5189c551) ) // D27C020 ROM_LOAD16_BYTE( "cpu_ic25.bin", 0x080001, 0x40000, CRC(406c2e3e) SHA1(ae229f01bdf0dea72a89c63b60f513a338fd8061) ) // AM27C020 - ROM_REGION( 0x200000, "kan_spr", ROMREGION_ERASEFF ) // sprites (seems to be the same as Gals Panic but alt ROM arrangement / decoding) + ROM_REGION( 0x200000, "kan_spr", ROMREGION_ERASEFF | ROMREGION_INVERT ) // sprites (seems to be the same as Gals Panic but alt ROM arrangement / decoding) ROM_LOAD32_BYTE( "5_gp_501.ic1", 0x000003, 0x010000, CRC(55ce19e8) SHA1(6aee3a43c731f017427b9316a6d2a536d7d44d35) ) // all TMS27C512 ROM_LOAD32_BYTE( "5_gp_510.ic10", 0x000002, 0x010000, CRC(95cfabc0) SHA1(36708945b4a7c153e67c5f8d8a8a71e7b6cb0ca3) ) ROM_LOAD32_BYTE( "5_gp_516.ic16", 0x000001, 0x010000, CRC(93c82aa3) SHA1(70d9beda4e2a93f89d2f0589c9fdbdb2ba4c7d7a) ) @@ -341,7 +534,7 @@ ROM_START( galpanicms ) ROM_LOAD32_BYTE( "5_gp_521.ic21", 0x140001, 0x010000, CRC(00ed84f5) SHA1(d3704a0a0e0b3f0f6509f3ab80a7203794b61cca) ) ROM_LOAD32_BYTE( "5_gp_527.ic27", 0x140000, 0x010000, CRC(689a8fae) SHA1(b16c33f02966aff3796b9dc528d3c2ca08ae49b1) ) - ROM_REGION( 0x40000, "gfx3", 0 ) // tilemap (less data than the encrypted layer on Gals Panic, probably no animation?) + ROM_REGION( 0x40000, "bgtile", ROMREGION_INVERT ) // tilemap (less data than the encrypted layer on Gals Panic, probably no animation?) ROM_LOAD32_BYTE( "4_gp_401.ic17", 0x000003, 0x010000, CRC(cd7060f6) SHA1(c548b0ccdff0ae33a2b6eef3bf49d18bd0935321) ) // MC27C512AQ ROM_LOAD32_BYTE( "4_gp_402.ic16", 0x000002, 0x010000, CRC(c4627916) SHA1(9d30251a3a7ac0198f89c797ae59285870d21033) ) // MC27C512AQ ROM_LOAD32_BYTE( "4_gp_403.ic15", 0x000001, 0x010000, CRC(35d2bce4) SHA1(050e7adad47ea10a59761e59d8d4aee11960b0db) ) // MC27C512AQ @@ -368,5 +561,26 @@ ROM_START( galpanicms ) ROM_LOAD( "cpu_647_gal16v8.ic7", 0, 1, NO_DUMP ) ROM_END +// reorganize graphics into something we can decode with a single pass +void galspanic_ms_state::descramble_16x16tiles(uint8_t* src, int len) +{ + std::vector buffer(len); + { + for (int i = 0; i < len; i++) + { + int j = bitswap<20>(i, 19,18,17,16,15,12,11,10,9,8,7,6,5,14,13,4,3,2,1,0); + buffer[j] = src[i]; + } -GAME( 1991, galpanicms, galsnew, newquiz, newquiz, galspanic_ms_state, empty_init, ROT90, "bootleg (Kaenko)", "New Quiz (Modular System bootleg)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) + std::copy(buffer.begin(), buffer.end(), &src[0]); + } +} + +void galspanic_ms_state::init_galpanicms() +{ + descramble_16x16tiles(memregion("bgtile")->base(), memregion("bgtile")->bytes()); +} + + + +GAME( 1991, galpanicms, galsnew, newquiz, newquiz, galspanic_ms_state, init_galpanicms, ROT90, "bootleg (Kaenko)", "New Quiz (Modular System bootleg of Gals Panic)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff --git a/src/mame/drivers/raiden_ms.cpp b/src/mame/drivers/raiden_ms.cpp index b675b37059a..28323371cd3 100644 --- a/src/mame/drivers/raiden_ms.cpp +++ b/src/mame/drivers/raiden_ms.cpp @@ -39,29 +39,96 @@ public: raiden_ms_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_screen(*this, "screen") + m_subcpu(*this, "subcpu"), + m_soundcpu(*this, "soundcpu"), + m_screen(*this, "screen"), + m_ym1(*this, "ym1"), + m_ym2(*this, "ym2"), + m_msm(*this, "msm5205"), + m_spriteram(*this, "spriteram"), + m_gfxdecode(*this, "gfxdecode") { } void raidenm(machine_config &config); + void init_raidenm(); protected: virtual void machine_start() override; private: required_device m_maincpu; + required_device m_subcpu; + required_device m_soundcpu; required_device m_screen; + required_device m_ym1; + required_device m_ym2; + required_device m_msm; + required_shared_ptr m_spriteram; + required_device m_gfxdecode; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void raidenm_map(address_map &map); + void raidenm_sub_map(address_map &map); + void raidenm_sound_map(address_map &map); + + DECLARE_WRITE_LINE_MEMBER(vblank_irq); + + void descramble_16x16tiles(uint8_t* src, int len); + }; void raiden_ms_state::raidenm_map(address_map &map) { + map(0x00000, 0x06fff).ram(); + map(0x07000, 0x07fff).ram(); + map(0x08000, 0x08fff).ram(); + map(0x0a000, 0x0afff).ram().share("shared_ram"); + + map(0x0b000, 0x0b001).portr("P1"); + map(0x0b002, 0x0b003).portr("P2"); + map(0x0b004, 0x0b005).portr("P3"); + map(0x0b008, 0x0b009).portr("P4"); + + map(0x0b006, 0x0b007).ram(); + + + + map(0x0c000, 0x0cfff).ram(); + map(0x0d800, 0x0dfff).ram().share("spriteram"); + map(0xa0000, 0xfffff).rom(); } +void raiden_ms_state::raidenm_sub_map(address_map &map) +{ + map(0x00000, 0x01fff).ram(); + map(0x02000, 0x02fff).ram(); + map(0x03000, 0x03fff).ram(); + + map(0x07ffe, 0x07fff).ram(); + + map(0x04000, 0x04fff).ram().share("shared_ram"); + + map(0xc0000, 0xfffff).rom(); +} + + +void raiden_ms_state::raidenm_sound_map(address_map &map) +{ + map(0x0000, 0x7fff).rom(); + + map(0xdff0, 0xdfff).ram(); + + map(0xc000, 0xc7ff).ram(); + map(0xe000, 0xe001).w(m_ym1, FUNC(ym2203_device::write)); + map(0xe002, 0xe003).w(m_ym2, FUNC(ym2203_device::write)); + map(0xe008, 0xe009).r(m_ym1, FUNC(ym2203_device::read)); + map(0xe00a, 0xe00b).r(m_ym2, FUNC(ym2203_device::read)); +} + void raiden_ms_state::machine_start() { @@ -70,24 +137,295 @@ void raiden_ms_state::machine_start() uint32_t raiden_ms_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + bitmap.fill(0, cliprect); + + // TODO, convert to device, share between Modualar System games + const int NUM_SPRITES = 0x400; + const int X_EXTRA_OFFSET = 0; + + for (int i = NUM_SPRITES-2; i >= 0; i-=2) + { + gfx_element *gfx = m_gfxdecode->gfx(0); + + uint16_t attr0 = m_spriteram[i + 0]; + uint16_t attr1 = m_spriteram[i + 1]; + + uint16_t attr2 = m_spriteram[i + NUM_SPRITES]; + //uint16_t attr3 = m_spriteram[i + NUM_SPRITES + 1]; // unused? + + int ypos = attr0 & 0x00ff; + int xpos = (attr1 & 0xff00)>>8; + xpos |= (attr2 & 0x8000) ? 0x100 : 0x000; + + ypos = (0xff - ypos); + + int tile = (attr0 & 0xff00) >> 8; + tile |= (attr1 & 0x003f) << 8; + + int flipx = (attr1 & 0x0040); + int flipy = (attr2 & 0x4000); + + gfx->transpen(bitmap,cliprect,tile,(attr2&0x0f00)>>8,flipx,flipy,xpos-16-X_EXTRA_OFFSET,ypos-16,15); + } + return 0; } static INPUT_PORTS_START( raidenm ) + PORT_START("P1") + PORT_DIPNAME( 0x0001, 0x0001, "P1" ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("P2") + PORT_DIPNAME( 0x0001, 0x0001, "P2" ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("P3") + PORT_DIPNAME( 0x0001, 0x0001, "P3" ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("P4") + PORT_DIPNAME( 0x0001, 0x0001, "P4" ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END +static const gfx_layout tiles16x16x4_layout = +{ + 16,16, + RGN_FRAC(1,1), + 4, + { 0,8,16,24 }, + { 0,1,2,3,4,5,6,7, 512,513,514,515,516,517,518,519 }, + { STEP16(0,32) }, + 16 * 16 * 4 +}; + + +static const gfx_layout tiles8x8x4_layout = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { 0,8,16,24 }, + { 0,1,2,3,4,5,6,7 }, + { STEP8(0,32) }, + 16 * 16 +}; + + static GFXDECODE_START( gfx_raiden_ms ) + GFXDECODE_ENTRY( "sprites", 0, tiles16x16x4_layout, 0x100, 32 ) + + GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x4_layout, 0x000, 32 ) + GFXDECODE_ENTRY( "gfx2", 0, tiles16x16x4_layout, 0x000, 32 ) + GFXDECODE_ENTRY( "gfx3", 0, tiles8x8x4_layout, 0x000, 32 ) GFXDECODE_END +WRITE_LINE_MEMBER(raiden_ms_state::vblank_irq) +{ + if (state) + { + m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8/4); // V30 + m_subcpu->set_input_line_and_vector(0, HOLD_LINE, 0xc8/4); // V30 + } +} + + void raiden_ms_state::raidenm(machine_config &config) { /* basic machine hardware */ V30(config, m_maincpu, 20_MHz_XTAL / 2); // divisor unknown m_maincpu->set_addrmap(AS_PROGRAM, &raiden_ms_state::raidenm_map); - V30(config, "subcpu", 20_MHz_XTAL / 2).set_disable(); // divisor unknown + V30(config, m_subcpu, 20_MHz_XTAL / 2); // divisor unknown + m_subcpu->set_addrmap(AS_PROGRAM, &raiden_ms_state::raidenm_sub_map); - Z80(config, "audiocpu", 24_MHz_XTAL / 8).set_disable(); // divisor unknown, no XTAL on the PCB, might also use the 20 MHz one + Z80(config, m_soundcpu, 24_MHz_XTAL / 8); // divisor unknown, no XTAL on the PCB, might also use the 20 MHz one + m_soundcpu->set_addrmap(AS_PROGRAM, &raiden_ms_state::raidenm_sound_map); /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); // all wrong @@ -97,6 +435,7 @@ void raiden_ms_state::raidenm(machine_config &config) m_screen->set_visarea(0, 256-1, 0, 256-32-1); m_screen->set_screen_update(FUNC(raiden_ms_state::screen_update)); m_screen->set_palette("palette"); + m_screen->screen_vblank().set(FUNC(raiden_ms_state::vblank_irq)); PALETTE(config, "palette").set_format(palette_device::xBRG_444, 1024); @@ -107,13 +446,49 @@ void raiden_ms_state::raidenm(machine_config &config) GENERIC_LATCH_8(config, "soundlatch"); - YM2203(config, "ym1", 24_MHz_XTAL / 8).add_route(ALL_OUTPUTS, "mono", 0.15); // divisor unknown, no XTAL on the PCB, might also use the 20 MHz one + YM2203(config, m_ym1, 24_MHz_XTAL / 8); // unknown clock + m_ym1->add_route(0, "mono", 0.15); + m_ym1->add_route(1, "mono", 0.15); + m_ym1->add_route(2, "mono", 0.15); + m_ym1->add_route(3, "mono", 0.10); - YM2203(config, "ym2", 24_MHz_XTAL / 8).add_route(ALL_OUTPUTS, "mono", 0.15); // divisor unknown, no XTAL on the PCB, might also use the 20 MHz one + YM2203(config, m_ym2, 24_MHz_XTAL / 8); // unknown clock + m_ym2->add_route(0, "mono", 0.15); + m_ym2->add_route(1, "mono", 0.15); + m_ym2->add_route(2, "mono", 0.15); + m_ym2->add_route(3, "mono", 0.10); + + MSM5205(config, m_msm, XTAL(384'000)); // unknown clock +// m_msm->vck_legacy_callback().set(FUNC(toki_ms_state::adpcm_int)); +// m_msm->set_prescaler_selector(msm5205_device::S48_4B); // unverified + m_msm->add_route(ALL_OUTPUTS, "mono", 0.25); - MSM5205(config, "msm", 24_MHz_XTAL / 8).add_route(ALL_OUTPUTS, "mono", 0.15); // divisor unknown, no XTAL on the PCB, might also use the 20 MHz one } +// reorganize graphics into something we can decode with a single pass +void raiden_ms_state::descramble_16x16tiles(uint8_t* src, int len) +{ + std::vector buffer(len); + { + for (int i = 0; i < len; i++) + { + int j = bitswap<20>(i, 19,18,17,16,15,12,11,10,9,8,7,6,5,14,13,4,3,2,1,0); + buffer[j] = src[i]; + } + + std::copy(buffer.begin(), buffer.end(), &src[0]); + } +} + +void raiden_ms_state::init_raidenm() +{ + descramble_16x16tiles(memregion("gfx1")->base(), memregion("gfx1")->bytes()); + descramble_16x16tiles(memregion("gfx2")->base(), memregion("gfx2")->bytes()); + // gfx3 is 8x8 tiles +} + + + ROM_START( raidenm ) ROM_REGION( 0x100000, "maincpu", 0 ) // on red board ROM_LOAD16_BYTE( "msraid_6-1-8086-1_rd604.u7", 0x0a0000, 0x10000, CRC(a4b12785) SHA1(446314e82ce01315cb3e3d1f323eaa2ad6fb48dd) ) @@ -122,38 +497,38 @@ ROM_START( raidenm ) ROM_LOAD16_BYTE( "msraid_6-1-8086-1_rd601b.u6", 0x0c0001, 0x20000, CRC(bf6245e1) SHA1(8eccd42f1eef012a5c937d77d2f877de14dcf39c) ) ROM_REGION( 0x100000, "subcpu", 0 ) // on red board - ROM_LOAD16_BYTE( "msraid_6-1-8086-1_rd606b.u19", 0x0c0000, 0x20000, CRC(58eac0b6) SHA1(618813c7593d13271d2826739f24e08dda400b0d) ) - ROM_LOAD16_BYTE( "msraid_6-1-8086-1_rd605b.u18", 0x0c0001, 0x20000, CRC(251fef93) SHA1(818095a77cb94fd4acc9eb26954615ee93e8432c) ) + ROM_LOAD16_BYTE( "msraid_6-1-8086-1_rd606b.u19", 0x0c0001, 0x20000, CRC(58eac0b6) SHA1(618813c7593d13271d2826739f24e08dda400b0d) ) + ROM_LOAD16_BYTE( "msraid_6-1-8086-1_rd605b.u18", 0x0c0000, 0x20000, CRC(251fef93) SHA1(818095a77cb94fd4acc9eb26954615ee93e8432c) ) - ROM_REGION( 0x10000, "audiocpu", 0 ) // on MOD 1/5 board + ROM_REGION( 0x10000, "soundcpu", 0 ) // on MOD 1/5 board ROM_LOAD( "msraid_1-5_rd101.ic12", 0x00000, 0x10000, CRC(2b76e371) SHA1(4c9732950f576e498d02fde485ba92fb293d5594) ) // dumper's note: ROMs [rd4b1, rd4b2, rb4b3, rd4b4] and [rd4a1, rd4a2, rb4a3, rd4a4] have a strange setup // with pins 32, 31 and 31 soldered together and pin 2 connected between all four chips, while the sockets are for 28 pin chips // (with 27C512 silkscreened on the PCB behind the chips) ROM_REGION( 0x80000, "gfx1", 0 ) // on one of the MOD 4/3 boards - ROM_LOAD( "msraid_4-3-1_rd4b1.ic17", 0x00000, 0x20000, CRC(ff35b830) SHA1(fb552b2aa50aed12c3adb6ef9032a438adf6f37f) ) - ROM_LOAD( "msraid_4-3-1_rd4b2.ic16", 0x20000, 0x20000, CRC(da0b2fca) SHA1(4ffe177587759ea03e73bcc5c36bedc869653ce5) ) - ROM_LOAD( "msraid_4-3-1_rd4b3.ic15", 0x40000, 0x20000, CRC(00e5953f) SHA1(488ac889a587bf4108be424faa9123abe73b5246) ) - ROM_LOAD( "msraid_4-3-1_rd4b4.ic14", 0x60000, 0x20000, CRC(932f8407) SHA1(0c7a0b18bbc3ac1f30bdb0ba4466c1e253130305) ) + ROM_LOAD32_BYTE( "msraid_4-3-1_rd4b1.ic17", 0x00003, 0x20000, CRC(ff35b830) SHA1(fb552b2aa50aed12c3adb6ef9032a438adf6f37f) ) + ROM_LOAD32_BYTE( "msraid_4-3-1_rd4b2.ic16", 0x00002, 0x20000, CRC(da0b2fca) SHA1(4ffe177587759ea03e73bcc5c36bedc869653ce5) ) + ROM_LOAD32_BYTE( "msraid_4-3-1_rd4b3.ic15", 0x00001, 0x20000, CRC(00e5953f) SHA1(488ac889a587bf4108be424faa9123abe73b5246) ) + ROM_LOAD32_BYTE( "msraid_4-3-1_rd4b4.ic14", 0x00000, 0x20000, CRC(932f8407) SHA1(0c7a0b18bbc3ac1f30bdb0ba4466c1e253130305) ) ROM_REGION( 0x80000, "gfx2", 0 ) // on another MOD 4/3 board - ROM_LOAD( "msraid_4-3-2_rd4a1.ic17", 0x00000, 0x20000, CRC(32892554) SHA1(8136626bf7073cdf19a8a38d19f6d0c52405df16) ) - ROM_LOAD( "msraid_4-3-2_rd4a2.ic16", 0x20000, 0x20000, CRC(cb325246) SHA1(f0a7bf8b1b5145541af78eba0375392a3030e2d9) ) - ROM_LOAD( "msraid_4-3-2_rd4a3.ic15", 0x40000, 0x20000, CRC(7554acef) SHA1(ec418ef2246c889d0e308925e11b1d3328bd83f9) ) - ROM_LOAD( "msraid_4-3-2_rd4a4.ic14", 0x60000, 0x20000, CRC(1e1537a5) SHA1(3f17a85c185dd8be7f7b3a5adb28d508f9f059a5) ) + ROM_LOAD32_BYTE( "msraid_4-3-2_rd4a1.ic17", 0x00003, 0x20000, CRC(32892554) SHA1(8136626bf7073cdf19a8a38d19f6d0c52405df16) ) + ROM_LOAD32_BYTE( "msraid_4-3-2_rd4a2.ic16", 0x00002, 0x20000, CRC(cb325246) SHA1(f0a7bf8b1b5145541af78eba0375392a3030e2d9) ) + ROM_LOAD32_BYTE( "msraid_4-3-2_rd4a3.ic15", 0x00001, 0x20000, CRC(7554acef) SHA1(ec418ef2246c889d0e308925e11b1d3328bd83f9) ) + ROM_LOAD32_BYTE( "msraid_4-3-2_rd4a4.ic14", 0x00000, 0x20000, CRC(1e1537a5) SHA1(3f17a85c185dd8be7f7b3a5adb28d508f9f059a5) ) ROM_REGION( 0x20000, "gfx3", 0 ) // on a third MOD 4/3 board, all 1st and 2nd half identical - ROM_LOAD( "msraid_4-3-3_rd404.ic17", 0x00000, 0x08000, CRC(caec39f5) SHA1(c61bd1f02515c6597d276dfcb21ed0969b556b8b) ) - ROM_LOAD( "msraid_4-3-3_rd403.ic16", 0x08000, 0x08000, CRC(0e817530) SHA1(efbc05d31ab38d0213387f4e61977f5203e19ace) ) - ROM_LOAD( "msraid_4-3-3_rd402.ic15", 0x10000, 0x08000, CRC(55dd887b) SHA1(efa687afe0b19fc741626b8fe5cd6ab541874396) ) - ROM_LOAD( "msraid_4-3-3_rd401.ic14", 0x18000, 0x08000, CRC(da82ab5d) SHA1(462db31a3cc1494fdc163d5abdf6d74a182a1421) ) + ROM_LOAD32_BYTE( "msraid_4-3-3_rd404.ic17", 0x00003, 0x08000, CRC(caec39f5) SHA1(c61bd1f02515c6597d276dfcb21ed0969b556b8b) ) + ROM_LOAD32_BYTE( "msraid_4-3-3_rd403.ic16", 0x00002, 0x08000, CRC(0e817530) SHA1(efbc05d31ab38d0213387f4e61977f5203e19ace) ) + ROM_LOAD32_BYTE( "msraid_4-3-3_rd402.ic15", 0x00001, 0x08000, CRC(55dd887b) SHA1(efa687afe0b19fc741626b8fe5cd6ab541874396) ) + ROM_LOAD32_BYTE( "msraid_4-3-3_rd401.ic14", 0x00000, 0x08000, CRC(da82ab5d) SHA1(462db31a3cc1494fdc163d5abdf6d74a182a1421) ) - ROM_REGION( 0x80000, "gfx4", 0 ) // on MOD 51/3 board - ROM_LOAD( "msraid_51-3_rd501.ic43", 0x00000, 0x20000, CRC(fcd1fc21) SHA1(465036348f19dd3ff999c12e6591b172a7fb621e) ) - ROM_LOAD( "msraid_51-3_rd502.ic42", 0x20000, 0x20000, CRC(faba2544) SHA1(1d32b370f43bf6f7cb3bbe052775e52403a7ccb6) ) - ROM_LOAD( "msraid_51-3_rd503.ic41", 0x40000, 0x20000, CRC(ae4001e9) SHA1(5f21a042cad1807d2ef5e7f4f2cfd86cadc0503b) ) - ROM_LOAD( "msraid_51-3_rd504.ic40", 0x60000, 0x20000, CRC(0452eb10) SHA1(3b998da404bd7133d12aadcadd57ee21a0cfc226) ) + ROM_REGION( 0x80000, "sprites", ROMREGION_INVERT ) // on MOD 51/3 board + ROM_LOAD32_BYTE( "msraid_51-3_rd501.ic43", 0x00003, 0x20000, CRC(fcd1fc21) SHA1(465036348f19dd3ff999c12e6591b172a7fb621e) ) + ROM_LOAD32_BYTE( "msraid_51-3_rd502.ic42", 0x00002, 0x20000, CRC(faba2544) SHA1(1d32b370f43bf6f7cb3bbe052775e52403a7ccb6) ) + ROM_LOAD32_BYTE( "msraid_51-3_rd503.ic41", 0x00001, 0x20000, CRC(ae4001e9) SHA1(5f21a042cad1807d2ef5e7f4f2cfd86cadc0503b) ) + ROM_LOAD32_BYTE( "msraid_51-3_rd504.ic40", 0x00000, 0x20000, CRC(0452eb10) SHA1(3b998da404bd7133d12aadcadd57ee21a0cfc226) ) ROM_REGION( 0x0700, "proms", 0 ) /* PROMs (function unknown) */ ROM_LOAD( "msraid_1-5_110_82s123.ic20", 0x0000, 0x0020, CRC(e26e680a) SHA1(9bbe30e98e952a6113c64e1171330153ddf22ce7) ) @@ -172,4 +547,4 @@ ROM_START( raidenm ) ROM_LOAD( "msraid_6-1-8086-1_645d_gal16v8.u27", 0x000, 0x117, NO_DUMP ) ROM_END -GAME( 199?, raidenm, raiden, raidenm, raidenm, raiden_ms_state, empty_init, ROT0, "bootleg (Gaelco / Ervisa)", "Raiden (Modular System)", MACHINE_IS_SKELETON ) +GAME( 199?, raidenm, raiden, raidenm, raidenm, raiden_ms_state, init_raidenm, ROT270, "bootleg (Gaelco / Ervisa)", "Raiden (Modular System)", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/splash_ms.cpp b/src/mame/drivers/splash_ms.cpp index 61defa706c1..143710bed45 100644 --- a/src/mame/drivers/splash_ms.cpp +++ b/src/mame/drivers/splash_ms.cpp @@ -103,6 +103,8 @@ private: void subrambank_map(address_map& map); void subrombank_map(address_map& map); + + void descramble_16x16tiles(uint8_t* src, int len); }; @@ -200,15 +202,19 @@ uint32_t splashms_state::screen_update(screen_device &screen, bitmap_ind16 &bitm m_bg_tilemap2->draw(screen, bitmap, cliprect, 0, 0); - for (int i = 0x100-2; i >= 0; i-=2) + // TODO, convert to device, share between Modualar System games + const int NUM_SPRITES = 0x100; + const int X_EXTRA_OFFSET = 64; + + for (int i = NUM_SPRITES-2; i >= 0; i-=2) { gfx_element *gfx = m_gfxdecode->gfx(0); uint16_t attr0 = m_spriteram[i + 0]; uint16_t attr1 = m_spriteram[i + 1]; - uint16_t attr2 = m_spriteram[i + 0x100]; - //uint16_t attr3 = m_spriteram[i + 0x101]; // unused? + uint16_t attr2 = m_spriteram[i + NUM_SPRITES]; + //uint16_t attr3 = m_spriteram[i + NUM_SPRITES+1]; // unused? int ypos = attr0 & 0x00ff; int xpos = (attr1 & 0xff00)>>8; @@ -223,7 +229,7 @@ uint32_t splashms_state::screen_update(screen_device &screen, bitmap_ind16 &bitm int flipx = (attr1 & 0x0040); int flipy = (attr1 & 0x0080); - gfx->transpen(bitmap,cliprect,tile,(attr2&0x0f00)>>8,flipx,flipy,xpos-16-64,ypos-16,15); + gfx->transpen(bitmap,cliprect,tile,(attr2&0x0f00)>>8,flipx,flipy,xpos-16-X_EXTRA_OFFSET,ypos-16,15); } m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); @@ -411,22 +417,11 @@ static const gfx_layout tiles8x8x4_layout = 16 * 16 }; -static const gfx_layout tiles16x16x4alt_layout = -{ - 16,16, - RGN_FRAC(1,1), - 4, - { 0,8,16,24 }, - { 0,1,2,3,4,5,6,7, 512+0,512+1,512+2,512+3,512+4,512+5,512+6,512+7 }, - { STEP8(0,32), STEP8(256,32) }, - 32 * 32 -}; - static GFXDECODE_START( gfx_splashms ) GFXDECODE_ENTRY( "sprites", 0, tiles16x16x4_layout, 0x200, 16 ) GFXDECODE_ENTRY( "fgtile", 0, tiles8x8x4_layout, 0, 16 ) - GFXDECODE_ENTRY( "bgtile", 0, tiles16x16x4alt_layout, 0, 16 ) + GFXDECODE_ENTRY( "bgtile", 0, tiles16x16x4_layout, 0, 16 ) GFXDECODE_END void splashms_state::splash_adpcm_data_w(uint8_t data) @@ -502,12 +497,9 @@ void splashms_state::splashms(machine_config &config) m_msm->add_route(ALL_OUTPUTS, "mono", 0.80); } -void splashms_state::init_splashms() +// reorganize graphics into something we can decode with a single pass +void splashms_state::descramble_16x16tiles(uint8_t* src, int len) { - // reorganize graphics into something we can decode with a single pass - uint8_t *src = memregion("bgtile")->base(); - int len = memregion("bgtile")->bytes(); - std::vector buffer(len); { for (int i = 0; i < len; i++) @@ -520,6 +512,13 @@ void splashms_state::init_splashms() } } +void splashms_state::init_splashms() +{ + descramble_16x16tiles(memregion("bgtile")->base(), memregion("bgtile")->bytes()); + // fgtile is 8x8 tiles +} + + ROM_START( splashms ) ROM_REGION( 0x040000, "maincpu", 0 ) diff --git a/src/mame/drivers/toki_ms.cpp b/src/mame/drivers/toki_ms.cpp index 1794603f2b7..5940a16d71c 100644 --- a/src/mame/drivers/toki_ms.cpp +++ b/src/mame/drivers/toki_ms.cpp @@ -334,6 +334,8 @@ private: void adpcm_w(u8 data); DECLARE_WRITE_LINE_MEMBER(adpcm_int); u8 m_adpcm_data; + + void descramble_16x16tiles(uint8_t* src, int len); }; TILE_GET_INFO_MEMBER(toki_ms_state::get_tile_info) @@ -545,7 +547,7 @@ void toki_ms_state::audio_map(address_map &map) map(0xc000, 0xc7ff).ram(); map(0xd000, 0xd7ff).ram(); // area 0xdff0-5 is never ever readback, applying a RAM mirror causes sound to go significantly worse, - // what they are even for? + // what they are even for? (offset select bankswitch rather than data select?) map(0xdfff, 0xdfff).r(m_soundlatch, FUNC(generic_latch_8_device::read)); map(0xe000, 0xe001).w(m_ym1, FUNC(ym2203_device::write)); map(0xe002, 0xe003).w(m_ym2, FUNC(ym2203_device::write)); @@ -637,6 +639,7 @@ static INPUT_PORTS_START( tokims ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) INPUT_PORTS_END + static const gfx_layout tiles16x16x4_layout = { 16,16, @@ -649,29 +652,27 @@ static const gfx_layout tiles16x16x4_layout = }; -static const gfx_layout tokib_tilelayout = +static const gfx_layout tiles8x8x4_layout = { - 16,16, /* 16 by 16 */ - 4096, /* 4096 characters */ - 4, /* 4 bits per pixel */ - { 4096*16*16*3,4096*16*16*2,4096*16*16*1,4096*16*16*0 }, /* planes */ - { 0, 1, 2, 3, 4, 5, 6, 7, - 0x8000*8+0, 0x8000*8+1, 0x8000*8+2, 0x8000*8+3, 0x8000*8+4, - 0x8000*8+5, 0x8000*8+6, 0x8000*8+7 }, /* x bit */ - { - 0,8,16,24,32,40,48,56, - 0x10000*8+ 0, 0x10000*8+ 8, 0x10000*8+16, 0x10000*8+24, 0x10000*8+32, - 0x10000*8+40, 0x10000*8+48, 0x10000*8+56 }, /* y bit */ - 8*8 + 8,8, + RGN_FRAC(1,1), + 4, + { 0,8,16,24 }, + { 0,1,2,3,4,5,6,7 }, + { STEP8(0,32) }, + 16 * 16 }; + static GFXDECODE_START( gfx_toki_ms ) - GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_planar, 0x100, 16 ) - GFXDECODE_ENTRY( "gfx2", 0, tiles16x16x4_layout, 0x000, 16 ) - GFXDECODE_ENTRY( "gfx3", 0, tokib_tilelayout, 0x200, 16 ) - GFXDECODE_ENTRY( "gfx4", 0, tokib_tilelayout, 0x300, 16 ) + GFXDECODE_ENTRY( "gfx1", 0, tiles8x8x4_layout, 0x100, 16 ) + + GFXDECODE_ENTRY( "sprites", 0, tiles16x16x4_layout, 0x000, 16 ) + GFXDECODE_ENTRY( "gfx3", 0, tiles16x16x4_layout, 0x200, 16 ) + GFXDECODE_ENTRY( "gfx4", 0, tiles16x16x4_layout, 0x300, 16 ) GFXDECODE_END + void toki_ms_state::machine_start() { membank("sound_bank")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000); @@ -742,51 +743,48 @@ ROM_START( tokims ) ROM_LOAD( "1_tk_101.c19", 0x000000, 0x10000, CRC(a447a394) SHA1(ccaa6aca5c2afc7c05035cb551b8368b18188dd6) ) ROM_REGION( 0x040000, "gfx1", 0 ) - ROM_LOAD( "8_tk_825.ic9", 0x000000, 0x10000, CRC(6d04def0) SHA1(36f23b0893dfae6cf4c6f4414ff54bb13cfdad41) ) - ROM_LOAD( "8_tk_826.ic16", 0x010000, 0x10000, CRC(d3a2a038) SHA1(a2a020397a427f5fd401aad09048c7d4a21cd728) ) - ROM_LOAD( "8_tk_827.ic24", 0x020000, 0x10000, CRC(d254ae6c) SHA1(cdbdd7d7c6cd4de8b8a0f54e1543caba5f3d11cb) ) - ROM_LOAD( "8_tk_828.ic31", 0x030000, 0x10000, CRC(a6fae34b) SHA1(d9a276d30bdcc25d9cd299c2502cf910273890f6) ) + ROM_LOAD32_BYTE( "8_tk_825.ic9", 0x000003, 0x10000, CRC(6d04def0) SHA1(36f23b0893dfae6cf4c6f4414ff54bb13cfdad41) ) + ROM_LOAD32_BYTE( "8_tk_826.ic16", 0x000002, 0x10000, CRC(d3a2a038) SHA1(a2a020397a427f5fd401aad09048c7d4a21cd728) ) + ROM_LOAD32_BYTE( "8_tk_827.ic24", 0x000001, 0x10000, CRC(d254ae6c) SHA1(cdbdd7d7c6cd4de8b8a0f54e1543caba5f3d11cb) ) + ROM_LOAD32_BYTE( "8_tk_828.ic31", 0x000000, 0x10000, CRC(a6fae34b) SHA1(d9a276d30bdcc25d9cd299c2502cf910273890f6) ) - ROM_REGION( 0x100000, "gfx2", ROMREGION_ERASEFF | ROMREGION_INVERT ) // sprites (same rom subboard type as galpanic_ms.cpp) + ROM_REGION( 0x100000, "sprites", ROMREGION_ERASEFF | ROMREGION_INVERT ) // sprites (same rom subboard type as galpanic_ms.cpp) ROM_LOAD32_BYTE( "5_tk_501.ic3", 0x000003, 0x010000, CRC(c3cd26b6) SHA1(20d5a68eada4150642365dd61c699b7771de5372) ) ROM_LOAD32_BYTE( "5_tk_505.ic12", 0x000002, 0x010000, CRC(ec096351) SHA1(10417266c2280b2d9c301423d8c41ed73d9654c9) ) ROM_LOAD32_BYTE( "5_tk_509.ic18", 0x000001, 0x010000, CRC(a1a4ef7b) SHA1(92aad84f14f8257477920012bd1fe033ec96301b) ) ROM_LOAD32_BYTE( "5_tk_513.ic24", 0x000000, 0x010000, CRC(8dfda6fa) SHA1(ee2600d6cdcb27500e61dd1beebed904fd2c3ac5) ) - ROM_LOAD32_BYTE( "5_tk_502.ic4", 0x040003, 0x010000, CRC(122d59eb) SHA1(5dc9c55667021630f49cfb70c0c70bdf3ac1e3a7) ) ROM_LOAD32_BYTE( "5_tk_506.ic13", 0x040002, 0x010000, CRC(ed92289f) SHA1(fe612e704bf6aefdbd85f1d49a9bbc4d0fef0f95) ) ROM_LOAD32_BYTE( "5_tk_510.ic19", 0x040001, 0x010000, CRC(56eb4876) SHA1(113d2b300d7670068e3587f63b4f0b0bd38d84a3) ) ROM_LOAD32_BYTE( "5_tk_514.ic25", 0x040000, 0x010000, CRC(b0c7801c) SHA1(99e898bcb4a8c4dc00726908f9095df512539776) ) - ROM_LOAD32_BYTE( "5_tk_503.ic5", 0x080003, 0x010000, CRC(9201545b) SHA1(dee1736946ec781ee035714281298f2e2a48fec1) ) ROM_LOAD32_BYTE( "5_tk_507.ic14", 0x080002, 0x010000, CRC(e61eebbd) SHA1(1f854ba98a1cde4473107b8282b88e6412094d19) ) ROM_LOAD32_BYTE( "5_tk_511.ic20", 0x080001, 0x010000, CRC(06d9fd86) SHA1(22472905672c956941d41b3e5febb4cb57c91283) ) ROM_LOAD32_BYTE( "5_tk_515.ic26", 0x080000, 0x010000, CRC(04b575a7) SHA1(c6c65745511e27b594818e3f7ba7313c0a6f599e) ) - ROM_LOAD32_BYTE( "5_tk_504.ic6", 0x0c0003, 0x010000, CRC(cec71122) SHA1(283d38f998b1ca4fa080bf9fac797f5ac91dd072) ) ROM_LOAD32_BYTE( "5_tk_508.ic15", 0x0c0002, 0x010000, CRC(1873ae38) SHA1(a1633ab5c417e9851e285a6b322c06e7d2d0bccd) ) ROM_LOAD32_BYTE( "5_tk_512.ic21", 0x0c0001, 0x010000, CRC(0228110f) SHA1(33a29f9f458ca9d0af3c8da8a5b67bab79cecdec) ) ROM_LOAD32_BYTE( "5_tk_516.ic27", 0x0c0000, 0x010000, CRC(f4e29429) SHA1(706050b51e0afbddf6ec5c8f14d3649bb05c8550) ) ROM_REGION( 0x080000, "gfx3", 0 ) // same ROMs as some of the other Toki bootlegs - ROM_LOAD( "8_tk_809.ic13", 0x000000, 0x10000, CRC(feb13d35) SHA1(1b78ce1e48d16e58ad0721b30ab87765ded7d24e) ) - ROM_LOAD( "8_tk_813.ic12", 0x010000, 0x10000, CRC(5b365637) SHA1(434775b0614d904beaf40d7e00c1eaf59b704cb1) ) - ROM_LOAD( "8_tk_810.ic20", 0x020000, 0x10000, CRC(617c32e6) SHA1(a80f93c83a06acf836e638e4ad2453692622015d) ) - ROM_LOAD( "8_tk_814.ic19", 0x030000, 0x10000, CRC(2a11c0f0) SHA1(f9b1910c4932f5b95e5a9a8e8d5376c7210bcde7) ) - ROM_LOAD( "8_tk_811.ic28", 0x040000, 0x10000, CRC(fbc3d456) SHA1(dd10455f2e6c415fb5e39fb239904c499b38ca3e) ) - ROM_LOAD( "8_tk_815.ic27", 0x050000, 0x10000, CRC(4c2a72e1) SHA1(52a31f88e02e1689c2fffbbd86cbccd0bdab7dcc) ) - ROM_LOAD( "8_tk_812.ic35", 0x060000, 0x10000, CRC(46a1b821) SHA1(74d9762aef3891463dc100d1bc2d4fdc3c1d163f) ) - ROM_LOAD( "8_tk_816.ic34", 0x070000, 0x10000, CRC(82ce27f6) SHA1(db29396a336098664f48e3c04930b973a6ffe969) ) + ROM_LOAD32_BYTE( "8_tk_809.ic13", 0x000003, 0x10000, CRC(feb13d35) SHA1(1b78ce1e48d16e58ad0721b30ab87765ded7d24e) ) + ROM_LOAD32_BYTE( "8_tk_810.ic20", 0x000002, 0x10000, CRC(617c32e6) SHA1(a80f93c83a06acf836e638e4ad2453692622015d) ) + ROM_LOAD32_BYTE( "8_tk_811.ic28", 0x000001, 0x10000, CRC(fbc3d456) SHA1(dd10455f2e6c415fb5e39fb239904c499b38ca3e) ) + ROM_LOAD32_BYTE( "8_tk_812.ic35", 0x000000, 0x10000, CRC(46a1b821) SHA1(74d9762aef3891463dc100d1bc2d4fdc3c1d163f) ) + ROM_LOAD32_BYTE( "8_tk_813.ic12", 0x040003, 0x10000, CRC(5b365637) SHA1(434775b0614d904beaf40d7e00c1eaf59b704cb1) ) + ROM_LOAD32_BYTE( "8_tk_814.ic19", 0x040002, 0x10000, CRC(2a11c0f0) SHA1(f9b1910c4932f5b95e5a9a8e8d5376c7210bcde7) ) + ROM_LOAD32_BYTE( "8_tk_815.ic27", 0x040001, 0x10000, CRC(4c2a72e1) SHA1(52a31f88e02e1689c2fffbbd86cbccd0bdab7dcc) ) + ROM_LOAD32_BYTE( "8_tk_816.ic34", 0x040000, 0x10000, CRC(82ce27f6) SHA1(db29396a336098664f48e3c04930b973a6ffe969) ) ROM_REGION( 0x080000, "gfx4", 0 ) // same ROMs as some of the other Toki bootlegs - ROM_LOAD( "8_tk_801.ic15", 0x000000, 0x10000, CRC(63026cad) SHA1(c8f3898985d99f2a61d4e17eba66b5989a23d0d7) ) - ROM_LOAD( "8_tk_805.ic14", 0x010000, 0x10000, CRC(a7f2ce26) SHA1(6b12b3bd872112b42d91ce3c0d5bc95c0fc0f5b5) ) - ROM_LOAD( "8_tk_802.ic22", 0x020000, 0x10000, CRC(48989aa0) SHA1(109c68c9f0966862194226cecc8b269d9307dd25) ) - ROM_LOAD( "8_tk_806.ic21", 0x030000, 0x10000, CRC(c2ad9342) SHA1(7c9b5c14c8061e1a57797b79677741b1b98e64fa) ) - ROM_LOAD( "8_tk_803.ic30", 0x040000, 0x10000, CRC(6cd22b18) SHA1(8281cfd46738448b6890c50c64fb72941e169bee) ) - ROM_LOAD( "8_tk_807.ic29", 0x050000, 0x10000, CRC(859e313a) SHA1(18ac471a72b3ed42ba74456789adbe323f723660) ) - ROM_LOAD( "8_tk_804.ic37", 0x060000, 0x10000, CRC(e15c1d0f) SHA1(d0d571dd1055d7307379850313216da86b0704e6) ) - ROM_LOAD( "8_tk_808.ic36", 0x070000, 0x10000, CRC(6f4b878a) SHA1(4560b1e705a0eb9fad7fdc11fadf952ff67eb264) ) + ROM_LOAD32_BYTE( "8_tk_801.ic15", 0x000003, 0x10000, CRC(63026cad) SHA1(c8f3898985d99f2a61d4e17eba66b5989a23d0d7) ) + ROM_LOAD32_BYTE( "8_tk_802.ic22", 0x000002, 0x10000, CRC(48989aa0) SHA1(109c68c9f0966862194226cecc8b269d9307dd25) ) + ROM_LOAD32_BYTE( "8_tk_803.ic30", 0x000001, 0x10000, CRC(6cd22b18) SHA1(8281cfd46738448b6890c50c64fb72941e169bee) ) + ROM_LOAD32_BYTE( "8_tk_804.ic37", 0x000000, 0x10000, CRC(e15c1d0f) SHA1(d0d571dd1055d7307379850313216da86b0704e6) ) + ROM_LOAD32_BYTE( "8_tk_805.ic14", 0x040003, 0x10000, CRC(a7f2ce26) SHA1(6b12b3bd872112b42d91ce3c0d5bc95c0fc0f5b5) ) + ROM_LOAD32_BYTE( "8_tk_806.ic21", 0x040002, 0x10000, CRC(c2ad9342) SHA1(7c9b5c14c8061e1a57797b79677741b1b98e64fa) ) + ROM_LOAD32_BYTE( "8_tk_807.ic29", 0x040001, 0x10000, CRC(859e313a) SHA1(18ac471a72b3ed42ba74456789adbe323f723660) ) + ROM_LOAD32_BYTE( "8_tk_808.ic36", 0x040000, 0x10000, CRC(6f4b878a) SHA1(4560b1e705a0eb9fad7fdc11fadf952ff67eb264) ) ROM_REGION( 0x100, "protpal", 0 ) // all read protected ROM_LOAD( "5_5140_palce16v8h-25pc.ic9", 0, 1, NO_DUMP ) @@ -808,40 +806,26 @@ ROM_START( tokims ) ROM_LOAD( "1_10110_82s123.ic20", 0x0300, 0x020, CRC(e26e680a) SHA1(9bbe30e98e952a6113c64e1171330153ddf22ce7) ) ROM_END -void toki_ms_state::init_tokims() +// reorganize graphics into something we can decode with a single pass +void toki_ms_state::descramble_16x16tiles(uint8_t* src, int len) { - // copied verbatim from toki.cpp - u8 temp[0x20000]; - - int len = memregion("gfx3")->bytes(); - u8 *rom = memregion("gfx3")->base(); - for (int offs = 0; offs < len; offs += 0x20000) + std::vector buffer(len); { - u8 *base = &rom[offs]; - memcpy (&temp[0], base, 65536 * 2); - for (int i = 0; i < 16; i++) + for (int i = 0; i < len; i++) { - memcpy(&base[0x00000 + i * 0x800], &temp[0x0000 + i * 0x2000], 0x800); - memcpy(&base[0x10000 + i * 0x800], &temp[0x0800 + i * 0x2000], 0x800); - memcpy(&base[0x08000 + i * 0x800], &temp[0x1000 + i * 0x2000], 0x800); - memcpy(&base[0x18000 + i * 0x800], &temp[0x1800 + i * 0x2000], 0x800); + int j = bitswap<20>(i, 19,18,17,16,15,12,11,10,9,8,7,6,5,14,13,4,3,2,1,0); + buffer[j] = src[i]; } - } - len = memregion("gfx4")->bytes(); - rom = memregion("gfx4")->base(); - for (int offs = 0; offs < len; offs += 0x20000) - { - u8 *base = &rom[offs]; - memcpy (&temp[0], base, 65536 * 2); - for (int i = 0; i < 16; i++) - { - memcpy(&base[0x00000 + i * 0x800], &temp[0x0000 + i * 0x2000], 0x800); - memcpy(&base[0x10000 + i * 0x800], &temp[0x0800 + i * 0x2000], 0x800); - memcpy(&base[0x08000 + i * 0x800], &temp[0x1000 + i * 0x2000], 0x800); - memcpy(&base[0x18000 + i * 0x800], &temp[0x1800 + i * 0x2000], 0x800); - } + std::copy(buffer.begin(), buffer.end(), &src[0]); } } +void toki_ms_state::init_tokims() +{ + descramble_16x16tiles(memregion("gfx3")->base(), memregion("gfx3")->bytes()); + descramble_16x16tiles(memregion("gfx4")->base(), memregion("gfx4")->bytes()); + // gfx3 is 8x8 tiles +} + GAME( 1991, tokims, toki, tokims, tokims, toki_ms_state, init_tokims, ROT0, "bootleg", "Toki (Modular System)", MACHINE_IMPERFECT_SOUND )