musclem.cpp: simplify further with templates (nw)

This commit is contained in:
Philip Bennett 2022-10-04 00:15:10 -07:00
parent bdfdbd8796
commit 5626b95c7f

View File

@ -37,9 +37,7 @@ public:
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_palette(*this, "palette"), m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"), m_gfxdecode(*this, "gfxdecode"),
m_videoram0(*this, "videoram0"), m_vram(*this, "vram%u", 0U),
m_videoram1(*this, "videoram1"),
m_videoram2(*this, "videoram2"),
m_spriteram(*this, "spriteram"), m_spriteram(*this, "spriteram"),
m_oki1(*this, "oki1"), m_oki1(*this, "oki1"),
m_oki2(*this, "oki2") m_oki2(*this, "oki2")
@ -54,28 +52,19 @@ private:
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode; required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr<uint16_t> m_videoram0; required_shared_ptr_array<uint16_t, 3> m_vram;
required_shared_ptr<uint16_t> m_videoram1;
required_shared_ptr<uint16_t> m_videoram2;
required_shared_ptr<uint16_t> m_spriteram; required_shared_ptr<uint16_t> m_spriteram;
required_device<okim6295_device> m_oki1; required_device<okim6295_device> m_oki1;
required_device<okim6295_device> m_oki2; required_device<okim6295_device> m_oki2;
uint16_t m_paletteram[0x400]; uint16_t m_paletteram[0x400];
tilemap_t * m_tilemap[3]; tilemap_t * m_tilemap[3];
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TILE_GET_INFO_MEMBER(get_tile_info0); template<int which> TILE_GET_INFO_MEMBER(get_tile_info);
TILE_GET_INFO_MEMBER(get_tile_info1); template<int which> void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask);
TILE_GET_INFO_MEMBER(get_tile_info2); template<int base> void palette_w(offs_t offset, u16 data, u16 mem_mask);
TILE_GET_INFO_MEMBER(get_tile_info3);
void videoram0_w(offs_t offset, uint16_t data, uint16_t mem_mask);
void videoram1_w(offs_t offset, uint16_t data, uint16_t mem_mask);
void videoram2_w(offs_t offset, uint16_t data, uint16_t mem_mask);
void videoram3_w(offs_t offset, uint16_t data, uint16_t mem_mask);
void palette_w(offs_t offset, u16 data, u16 mem_mask);
void oki1_bank_w(uint16_t data); void oki1_bank_w(uint16_t data);
void lamps_w(uint16_t data); void lamps_w(uint16_t data);
@ -93,9 +82,9 @@ private:
void musclem_state::video_start() void musclem_state::video_start()
{ {
m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(musclem_state::get_tile_info0)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(musclem_state::get_tile_info<0>)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(musclem_state::get_tile_info1)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(musclem_state::get_tile_info<1>)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(musclem_state::get_tile_info2)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(musclem_state::get_tile_info<2>)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_tilemap[0]->set_transparent_pen(0); m_tilemap[0]->set_transparent_pen(0);
m_tilemap[1]->set_transparent_pen(0); m_tilemap[1]->set_transparent_pen(0);
@ -131,7 +120,7 @@ void musclem_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
int16_t sx = (m_spriteram[0x400 + i] & 0x3ff); int16_t sx = (m_spriteram[0x400 + i] & 0x3ff);
sx -= 1; sx -= 1;
m_gfxdecode->gfx(0)->transpen(bitmap, cliprect, code, 0, 0, 0, sx, sy, 0); m_gfxdecode->gfx(3)->transpen(bitmap, cliprect, code, 0, 0, 0, sx, sy, 0);
// Handle wraparound // Handle wraparound
if (sx > 512 - 16) if (sx > 512 - 16)
@ -139,45 +128,24 @@ void musclem_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
} }
} }
TILE_GET_INFO_MEMBER(musclem_state::get_tile_info0) template<int which>
TILE_GET_INFO_MEMBER(musclem_state::get_tile_info)
{ {
int data = m_videoram0[tile_index]; int data = m_vram[which][tile_index];
tileinfo.set(3, data, 0, 0); tileinfo.set(which, data, 0, 0);
} }
TILE_GET_INFO_MEMBER(musclem_state::get_tile_info1) template<int which>
void musclem_state::vram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{ {
int data = m_videoram1[tile_index]; m_vram[which][offset] = data;
tileinfo.set(2, data, 0, 0); m_tilemap[which]->mark_tile_dirty(offset);
}
TILE_GET_INFO_MEMBER(musclem_state::get_tile_info2)
{
int data = m_videoram2[tile_index];
tileinfo.set(1, data, 0, 0);
}
void musclem_state::videoram0_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_videoram0[offset] = data;
m_tilemap[0]->mark_tile_dirty(offset);
}
void musclem_state::videoram1_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_videoram1[offset] = data;
m_tilemap[1]->mark_tile_dirty(offset);
}
void musclem_state::videoram2_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_videoram2[offset] = data;
m_tilemap[2]->mark_tile_dirty(offset);
} }
template<int base>
void musclem_state::palette_w(offs_t offset, u16 data, u16 mem_mask) void musclem_state::palette_w(offs_t offset, u16 data, u16 mem_mask)
{ {
m_palette->write16(offset, data, mem_mask); m_palette->write16(base + offset, data, mem_mask);
} }
@ -197,8 +165,8 @@ void musclem_state::oki1_bank_w(uint16_t data)
void musclem_state::lamps_w(uint16_t data) void musclem_state::lamps_w(uint16_t data)
{ {
// ........ ....1... - Lamp 1 (active low) // ........ ....x... - Lamp 1 (active low)
// ........ ..1..... - Lamp 2 (active low) // ........ ..x..... - Lamp 2 (active low)
} }
@ -289,14 +257,14 @@ void musclem_state::main_map(address_map &map)
{ {
map(0x000000, 0x03ffff).rom(); map(0x000000, 0x03ffff).rom();
map(0x200000, 0x20ffff).ram(); map(0x200000, 0x20ffff).ram();
map(0x800000, 0x8007ff).ram().w(FUNC(musclem_state::videoram0_w)).share("videoram0"); map(0x800000, 0x8007ff).ram().w(FUNC(musclem_state::vram_w<0>)).share("vram0");
map(0x840000, 0x840fff).ram().share("spriteram"); map(0x840000, 0x840fff).ram().share("spriteram");
map(0x880000, 0x8807ff).ram().w(FUNC(musclem_state::videoram1_w)).share("videoram1"); map(0x880000, 0x8807ff).ram().w(FUNC(musclem_state::vram_w<1>)).share("vram1");
map(0x8c0000, 0x8c07ff).ram().w(FUNC(musclem_state::videoram2_w)).share("videoram2"); map(0x8c0000, 0x8c07ff).ram().w(FUNC(musclem_state::vram_w<2>)).share("vram2");
map(0x900000, 0x9001ff).lw16(NAME([this](offs_t offset, u16 data, u16 mem_mask) { palette_w(offset, data, mem_mask); })); map(0x900000, 0x9001ff).w(FUNC(musclem_state::palette_w<0>));
map(0x900400, 0x9005ff).lw16(NAME([this](offs_t offset, u16 data, u16 mem_mask) { palette_w(0x100 + offset, data, mem_mask); })); map(0x900400, 0x9005ff).w(FUNC(musclem_state::palette_w<0x100>));
map(0x900800, 0x9009ff).lw16(NAME([this](offs_t offset, u16 data, u16 mem_mask) { palette_w(0x200 + offset, data, mem_mask); })); map(0x900800, 0x9009ff).w(FUNC(musclem_state::palette_w<0x200>));
map(0x900c00, 0x900dff).lw16(NAME([this](offs_t offset, u16 data, u16 mem_mask) { palette_w(0x300 + offset, data, mem_mask); })); map(0x900c00, 0x900dff).w(FUNC(musclem_state::palette_w<0x300>));
map(0xc00000, 0xc00001).portr("DSW"); map(0xc00000, 0xc00001).portr("DSW");
map(0xc00080, 0xc00081).lw16(NAME([this](u16 data) { m_tilemap[1]->set_scrollx(data); })); map(0xc00080, 0xc00081).lw16(NAME([this](u16 data) { m_tilemap[1]->set_scrollx(data); }));
map(0xc00082, 0xc00083).lw16(NAME([this](u16 data) { m_tilemap[1]->set_scrolly(data); })); map(0xc00082, 0xc00083).lw16(NAME([this](u16 data) { m_tilemap[1]->set_scrolly(data); }));
@ -320,10 +288,10 @@ void musclem_state::main_map(address_map &map)
*************************************/ *************************************/
static GFXDECODE_START( gfx_musclem ) static GFXDECODE_START( gfx_musclem )
GFXDECODE_ENTRY( "gfx1", 0, gfx_16x16x8_raw, 0x100, 1 ) GFXDECODE_ENTRY( "gfx1", 0, gfx_16x16x8_raw, 0x000, 1 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_16x16x8_raw, 0x300, 1 ) GFXDECODE_ENTRY( "gfx2", 0, gfx_16x16x8_raw, 0x200, 1 )
GFXDECODE_ENTRY( "gfx3", 0, gfx_16x16x8_raw, 0x200, 1 ) GFXDECODE_ENTRY( "gfx3", 0, gfx_16x16x8_raw, 0x300, 1 )
GFXDECODE_ENTRY( "gfx4", 0, gfx_16x16x8_raw, 0x000, 1 ) GFXDECODE_ENTRY( "gfx4", 0, gfx_16x16x8_raw, 0x100, 1 )
GFXDECODE_END GFXDECODE_END
@ -370,23 +338,23 @@ ROM_START( musclem )
ROM_LOAD16_BYTE( "u-67.bin", 0x000001, 0x20000, CRC(77f4b6ad) SHA1(8de11378903d48f0c57c6dde3923d8c5fa614ccc) ) ROM_LOAD16_BYTE( "u-67.bin", 0x000001, 0x20000, CRC(77f4b6ad) SHA1(8de11378903d48f0c57c6dde3923d8c5fa614ccc) )
ROM_REGION( 0x200000, "gfx1", 0 ) ROM_REGION( 0x200000, "gfx1", 0 )
ROM_LOAD16_BYTE( "u-148.bin", 0x000000, 0x100000, CRC(97aa308a) SHA1(54b2f5a25dcd3c35330f384a9010fbf75a72b8d0) )
ROM_LOAD16_BYTE( "u-150.bin", 0x000001, 0x100000, CRC(0c7247bd) SHA1(cab4f83f56ac6567feb27c397d31116c213d0a86) )
ROM_REGION( 0x200000, "gfx2", 0 )
ROM_LOAD16_BYTE( "u-129.bin", 0x000000, 0x100000, CRC(8268bba6) SHA1(bef3ee971ddf452346c6a7877e1aba577cdaf82c) )
ROM_LOAD16_BYTE( "u-130.bin", 0x000001, 0x100000, CRC(be4755e6) SHA1(66a7444bad5def32d44031680a4e8e2f8c1bdc81) )
ROM_REGION( 0x100000, "gfx3", 0 )
ROM_LOAD16_BYTE( "u-134.bin", 0x000000, 0x080000, CRC(79c8f776) SHA1(830a3905fc4ae88af48946ffc9bc0d58a8906d81) )
ROM_LOAD16_BYTE( "u-135.bin", 0x000001, 0x080000, CRC(56b89595) SHA1(ea6efac73857189faa1aa46a31e480770b1b14c7) )
ROM_REGION( 0x200000, "gfx4", 0 )
ROM_LOAD32_BYTE( "u-21.bin", 0x000000, 0x80000, CRC(efc2ba0d) SHA1(a72e5943dc71870f7c7eec30015d38ab06ed1846) ) ROM_LOAD32_BYTE( "u-21.bin", 0x000000, 0x80000, CRC(efc2ba0d) SHA1(a72e5943dc71870f7c7eec30015d38ab06ed1846) )
ROM_LOAD32_BYTE( "u-23.bin", 0x000001, 0x80000, CRC(a8f96912) SHA1(69bc5c7c9a391e8a4b5b260bf9f05ffd44b9cadc) ) ROM_LOAD32_BYTE( "u-23.bin", 0x000001, 0x80000, CRC(a8f96912) SHA1(69bc5c7c9a391e8a4b5b260bf9f05ffd44b9cadc) )
ROM_LOAD32_BYTE( "u-25.bin", 0x000002, 0x80000, CRC(711563c0) SHA1(f0ddd102e5c6dc7286bbeac868c3f08012c54abd) ) ROM_LOAD32_BYTE( "u-25.bin", 0x000002, 0x80000, CRC(711563c0) SHA1(f0ddd102e5c6dc7286bbeac868c3f08012c54abd) )
ROM_LOAD32_BYTE( "u-27.bin", 0x000003, 0x80000, CRC(5d6026f3) SHA1(2afc247c7c6129c184c3ae2f98a39781183c99a5) ) ROM_LOAD32_BYTE( "u-27.bin", 0x000003, 0x80000, CRC(5d6026f3) SHA1(2afc247c7c6129c184c3ae2f98a39781183c99a5) )
ROM_REGION( 0x100000, "gfx2", 0 )
ROM_LOAD16_BYTE( "u-134.bin", 0x000000, 0x080000, CRC(79c8f776) SHA1(830a3905fc4ae88af48946ffc9bc0d58a8906d81) )
ROM_LOAD16_BYTE( "u-135.bin", 0x000001, 0x080000, CRC(56b89595) SHA1(ea6efac73857189faa1aa46a31e480770b1b14c7) )
ROM_REGION( 0x200000, "gfx3", 0 )
ROM_LOAD16_BYTE( "u-129.bin", 0x000000, 0x100000, CRC(8268bba6) SHA1(bef3ee971ddf452346c6a7877e1aba577cdaf82c) )
ROM_LOAD16_BYTE( "u-130.bin", 0x000001, 0x100000, CRC(be4755e6) SHA1(66a7444bad5def32d44031680a4e8e2f8c1bdc81) )
ROM_REGION( 0x200000, "gfx4", 0 )
ROM_LOAD16_BYTE( "u-148.bin", 0x000000, 0x100000, CRC(97aa308a) SHA1(54b2f5a25dcd3c35330f384a9010fbf75a72b8d0) )
ROM_LOAD16_BYTE( "u-150.bin", 0x000001, 0x100000, CRC(0c7247bd) SHA1(cab4f83f56ac6567feb27c397d31116c213d0a86) )
ROM_REGION( 0x100000, "oki1", 0 ) ROM_REGION( 0x100000, "oki1", 0 )
ROM_LOAD( "u-173.bin", 0x00000, 0x100000, CRC(d93bc7c2) SHA1(bfa3e3936e6fec4f94bfc0bf53cf8b04c085dc92) ) ROM_LOAD( "u-173.bin", 0x00000, 0x100000, CRC(d93bc7c2) SHA1(bfa3e3936e6fec4f94bfc0bf53cf8b04c085dc92) )