Modular System: minor improvements

This commit is contained in:
David Haywood 2020-07-17 20:03:10 +01:00 committed by GitHub
parent f5fbf6dd2c
commit 4ef450ccbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 908 additions and 203 deletions

View File

@ -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<uint8_t> 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) )

View File

@ -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<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
required_shared_ptr<uint16_t> m_spriteram;
required_device<gfxdecode_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<uint8_t> 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 )

View File

@ -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<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
required_device<ym2203_device> m_ym1;
required_device<ym2203_device> m_ym2;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
required_shared_ptr<uint16_t> m_paletteram;
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_fg_ind8_pixram;
required_shared_ptr<uint16_t> m_bg_rgb555_pixram;
required_shared_ptr<uint16_t> m_videoram2;
required_shared_ptr<uint16_t> m_scrollram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<msm5205_device> m_msm;
required_device<address_map_bank_device> m_soundrom;
required_device<generic_latch_8_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<uint8_t> 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 )

View File

@ -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<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
required_device<cpu_device> m_soundcpu;
required_device<screen_device> m_screen;
required_device<ym2203_device> m_ym1;
required_device<ym2203_device> m_ym2;
required_device<msm5205_device> m_msm;
required_shared_ptr<uint16_t> m_spriteram;
required_device<gfxdecode_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<uint8_t> 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 )

View File

@ -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<uint8_t> 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 )

View File

@ -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<uint8_t> 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 )