From 55f1ba534ac5fbb4a8928a51b2da3f8af7201f78 Mon Sep 17 00:00:00 2001
From: Philip Bennett
Date: Mon, 3 Oct 2022 08:20:01 -0700
Subject: New working machines -------------------- Muscle Master [Phil
Bennett]
---
src/mame/arcade.flt | 1 +
src/mame/mame.lst | 3 +
src/mame/misc/musclem.cpp | 408 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 412 insertions(+)
create mode 100644 src/mame/misc/musclem.cpp
diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt
index ede0efc5325..7da375c72d5 100644
--- a/src/mame/arcade.flt
+++ b/src/mame/arcade.flt
@@ -810,6 +810,7 @@ misc/multfish.cpp
misc/multfish_boot.cpp
misc/murogem.cpp
misc/murogmbl.cpp
+misc/musclem.cpp
misc/neomania.cpp
misc/neoprint.cpp
misc/news.cpp
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index b899b54e8b7..af21324d318 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -31959,6 +31959,9 @@ murogemb // ???
murogmbl // ???
slotunbl // ???
+@source:misc/musclem.cpp
+musclem // (c) 1997 Inter Geo
+
@source:seibu/mustache.cpp
mustache // (c) 1987 March
mustachei // (c) 1987 IG SPA
diff --git a/src/mame/misc/musclem.cpp b/src/mame/misc/musclem.cpp
new file mode 100644
index 00000000000..9df84626ebb
--- /dev/null
+++ b/src/mame/misc/musclem.cpp
@@ -0,0 +1,408 @@
+// license:BSD-3-Clause
+// copyright-holders:Phil Bennett
+/***************************************************************************
+
+ Inter Geo Muscle Master hardware
+
+ driver by Phil Bennett
+
+ Known bugs:
+ * Music does not immediately play on stage 1 following 'Go!'
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/m68000/m68000.h"
+#include "sound/okim6295.h"
+
+#include "speaker.h"
+#include "emupal.h"
+#include "screen.h"
+#include "tilemap.h"
+
+
+namespace {
+
+/*************************************
+ *
+ * Definitions
+ *
+ *************************************/
+
+class musclem_state : public driver_device
+{
+public:
+ musclem_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_palette(*this, "palette"),
+ m_gfxdecode(*this, "gfxdecode"),
+ m_videoram0(*this, "videoram0"),
+ m_videoram1(*this, "videoram1"),
+ m_videoram2(*this, "videoram2"),
+ m_spriteram(*this, "spriteram"),
+ m_oki1(*this, "oki1"),
+ m_oki2(*this, "oki2")
+ { }
+
+ void musclem(machine_config &config);
+
+protected:
+ virtual void video_start() override;
+
+private:
+ required_device m_maincpu;
+ required_device m_palette;
+ required_device m_gfxdecode;
+ required_shared_ptr m_videoram0;
+ required_shared_ptr m_videoram1;
+ required_shared_ptr m_videoram2;
+ required_shared_ptr m_spriteram;
+
+ required_device m_oki1;
+ required_device m_oki2;
+
+ uint16_t m_paletteram[0x400];
+ tilemap_t * m_tilemap[3];
+
+ 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);
+ TILE_GET_INFO_MEMBER(get_tile_info0);
+ TILE_GET_INFO_MEMBER(get_tile_info1);
+ TILE_GET_INFO_MEMBER(get_tile_info2);
+ 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 lamps_w(uint16_t data);
+
+ void main_map(address_map &map);
+};
+
+
+
+/*************************************
+ *
+ * Video hardware
+ *
+ *************************************/
+
+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[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[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[0]->set_transparent_pen(0);
+ m_tilemap[1]->set_transparent_pen(0);
+
+ m_tilemap[0]->set_scrolldx(16, 0);
+ m_tilemap[2]->set_scrolldx(1, 0);
+
+ m_palette->basemem().set(m_paletteram, 0x400, 16, ENDIANNESS_LITTLE, 2);
+
+ save_item(NAME(m_paletteram));
+}
+
+uint32_t musclem_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ m_tilemap[2]->draw(screen, bitmap, cliprect, 0, 0);
+ m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0);
+ draw_sprites(screen, bitmap, cliprect);
+ m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
+
+ return 0;
+}
+
+void musclem_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ for (uint32_t i = 0; i < 0x200; ++i)
+ {
+ uint16_t code = m_spriteram[0 + i];
+
+ if (code == 0)
+ continue;
+
+ int16_t sy = (int16_t)((m_spriteram[0x200 + i] & 0x1ff) << 7) >> 7;
+ int16_t sx = (m_spriteram[0x400 + i] & 0x3ff);
+ sx -= 1;
+
+ m_gfxdecode->gfx(0)->transpen(bitmap, cliprect, code, 0, 0, 0, sx, sy, 0);
+
+ // Handle wraparound
+ if (sx > 512 - 16)
+ m_gfxdecode->gfx(0)->transpen(bitmap, cliprect, code, 0, 0, 0, sx - 512, sy, 0);
+ }
+}
+
+TILE_GET_INFO_MEMBER(musclem_state::get_tile_info0)
+{
+ int data = m_videoram0[tile_index];
+ tileinfo.set(3, data, 0, 0);
+}
+
+TILE_GET_INFO_MEMBER(musclem_state::get_tile_info1)
+{
+ int data = m_videoram1[tile_index];
+ tileinfo.set(2, data, 0, 0);
+}
+
+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);
+}
+
+void musclem_state::palette_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ m_palette->write16(offset, data, mem_mask);
+}
+
+
+
+/*************************************
+ *
+ * Misc
+ *
+ *************************************/
+
+void musclem_state::oki1_bank_w(uint16_t data)
+{
+ m_oki1->set_rom_bank(data & 3);
+ printf("BANK:%x\n", data);
+}
+
+
+void musclem_state::lamps_w(uint16_t data)
+{
+
+ // ........ ....1... - Lamp 1 (active low)
+ // ........ ..1..... - Lamp 2 (active low)
+}
+
+
+
+/*************************************
+ *
+ * Inputs
+ *
+ *************************************/
+
+static INPUT_PORTS_START( musclem )
+ PORT_START("DSW")
+ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("DSW1:1,2,3")
+ PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0003, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0005, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW1:4")
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0030, 0x0030, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DSW1:5,6")
+ PORT_DIPSETTING( 0x0010, DEF_STR( Very_Easy ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x0030, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Hard ) )
+ PORT_DIPNAME( 0x0040, 0x0040, "Demo Lamp" ) PORT_DIPLOCATION("DSW1:7")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW1:8")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW2:1")
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW2:2")
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW2:3")
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW2:4")
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW2:5")
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW2:6")
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW2:7")
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unused ) ) PORT_DIPLOCATION("DSW2:8")
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("PORT1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Pump sensor 1")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Pump sensor 2")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Pump sensor 3")
+ PORT_BIT( 0xff80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("PORT2")
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START )
+ PORT_BIT( 0xfc00, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+
+/*************************************
+ *
+ * Main CPU memory handlers
+ *
+ *************************************/
+
+void musclem_state::main_map(address_map &map)
+{
+ map(0x000000, 0x03ffff).rom();
+ map(0x200000, 0x20ffff).ram();
+ map(0x800000, 0x8007ff).ram().w(FUNC(musclem_state::videoram0_w)).share("videoram0");
+ map(0x840000, 0x840fff).ram().share("spriteram");
+ map(0x880000, 0x8807ff).ram().w(FUNC(musclem_state::videoram1_w)).share("videoram1");
+ map(0x8c0000, 0x8c07ff).ram().w(FUNC(musclem_state::videoram2_w)).share("videoram2");
+ map(0x900000, 0x9001ff).lw16(NAME([this](offs_t offset, u16 data, u16 mem_mask) { palette_w(offset, data, mem_mask); }));
+ map(0x900400, 0x9005ff).lw16(NAME([this](offs_t offset, u16 data, u16 mem_mask) { palette_w(0x100 + offset, data, mem_mask); }));
+ map(0x900800, 0x9009ff).lw16(NAME([this](offs_t offset, u16 data, u16 mem_mask) { palette_w(0x200 + offset, data, mem_mask); }));
+ map(0x900c00, 0x900dff).lw16(NAME([this](offs_t offset, u16 data, u16 mem_mask) { palette_w(0x300 + offset, data, mem_mask); }));
+ map(0xc00000, 0xc00001).portr("DSW");
+ 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(0xc00084, 0xc00085).lw16(NAME([this](u16 data) { m_tilemap[2]->set_scrollx(data); }));
+ map(0xc00086, 0xc00087).lw16(NAME([this](u16 data) { m_tilemap[2]->set_scrolly(data); }));
+ map(0xc00088, 0xc00089).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff);
+ map(0xc0008a, 0xc0008b).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write)).umask16(0x00ff);
+ map(0xc0008c, 0xc0008d).w(FUNC(musclem_state::oki1_bank_w));
+ map(0xc0008e, 0xc0008f).nopw(); // Written only once with 0
+ map(0xc00090, 0xc00091).portr("PORT1");
+ map(0xc00092, 0xc00093).portr("PORT2");
+ map(0xc00094, 0xc00095).w(FUNC(musclem_state::lamps_w));
+}
+
+
+
+/*************************************
+ *
+ * Graphics definitions
+ *
+ *************************************/
+
+static GFXDECODE_START( gfx_musclem )
+ GFXDECODE_ENTRY( "gfx1", 0, gfx_16x16x8_raw, 0x100, 1 )
+ GFXDECODE_ENTRY( "gfx2", 0, gfx_16x16x8_raw, 0x300, 1 )
+ GFXDECODE_ENTRY( "gfx3", 0, gfx_16x16x8_raw, 0x200, 1 )
+ GFXDECODE_ENTRY( "gfx4", 0, gfx_16x16x8_raw, 0x000, 1 )
+GFXDECODE_END
+
+
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+void musclem_state::musclem(machine_config &config)
+{
+ /* Basic machine hardware */
+ M68000(config, m_maincpu, XTAL(24'000'000) / 2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &musclem_state::main_map);
+ m_maincpu->set_vblank_int("screen", FUNC(musclem_state::irq4_line_hold));
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(14'318'181) / 2, 440, 16, 328, 273, 0, 240);
+
+ screen.set_screen_update(FUNC(musclem_state::screen_update));
+ screen.set_palette(m_palette);
+
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx_musclem);
+
+ PALETTE(config, "palette").set_format(palette_device::xBBBBBGGGGGRRRRR, 0x400);
+
+ SPEAKER(config, "mono").front_center();
+ OKIM6295(config, m_oki1, XTAL(4'000'000) / 4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+ OKIM6295(config, m_oki2, XTAL(4'000'000) / 4, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0);
+}
+
+
+
+/*************************************
+ *
+ * ROM definition(s)
+ *
+ *************************************/
+
+ROM_START( musclem )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD16_BYTE( "u-71.bin", 0x000000, 0x20000, CRC(da0648ad) SHA1(e7de583d5e6de4e2f0d617527d168fe691243728) )
+ ROM_LOAD16_BYTE( "u-67.bin", 0x000001, 0x20000, CRC(77f4b6ad) SHA1(8de11378903d48f0c57c6dde3923d8c5fa614ccc) )
+
+ ROM_REGION( 0x200000, "gfx1", 0 )
+ 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-25.bin", 0x000002, 0x80000, CRC(711563c0) SHA1(f0ddd102e5c6dc7286bbeac868c3f08012c54abd) )
+ 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_LOAD( "u-173.bin", 0x00000, 0x100000, CRC(d93bc7c2) SHA1(bfa3e3936e6fec4f94bfc0bf53cf8b04c085dc92) )
+
+ ROM_REGION( 0x040000, "oki2", 0 )
+ ROM_LOAD( "u-177.bin", 0x00000, 0x40000, CRC(622c7b2f) SHA1(6b1721b80f71e5a5b5463c3320efa2e400fd9eac) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/*************************************
+ *
+ * Game driver
+ *
+ *************************************/
+
+GAME( 1997, musclem, 0, musclem, musclem, musclem_state, empty_init, ROT0, "Inter Geo", "Muscle Master", 0 )
--
cgit v1.2.3