summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Robert <Robbbert@users.noreply.github.com>2018-06-17 23:09:38 +1000
committer GitHub <noreply@github.com>2018-06-17 23:09:38 +1000
commitac64504889b141406606892bbc5e68a801e926c1 (patch)
tree54c5db94e268678cbe8a6d2fa7aa11ee92d81c9a
parent0f3def161e9e9935e4af3e8cca43c30de9028e08 (diff)
parenta936aab0363a054eb98e153730c997429e3fa464 (diff)
Merge pull request #3667 from cam900/wmg_clean
Make wmg.cpp Working again. Hopefully.
-rw-r--r--src/mame/drivers/wmg.cpp136
1 files changed, 85 insertions, 51 deletions
diff --git a/src/mame/drivers/wmg.cpp b/src/mame/drivers/wmg.cpp
index 372f1fb4185..4e10de31200 100644
--- a/src/mame/drivers/wmg.cpp
+++ b/src/mame/drivers/wmg.cpp
@@ -89,15 +89,17 @@ public:
: williams_state(mconfig, type, tag)
, m_p_ram(*this, "nvram")
, m_keyboard(*this, "X%d", 0)
+ , m_codebank(*this, "codebank")
+ , m_soundbank(*this, "soundbank")
{ }
- DECLARE_MACHINE_RESET(wmg);
void init_wmg();
DECLARE_READ8_MEMBER(wmg_nvram_r);
DECLARE_WRITE8_MEMBER(wmg_nvram_w);
DECLARE_READ8_MEMBER(wmg_pia_0_r);
DECLARE_WRITE8_MEMBER(wmg_c400_w);
DECLARE_WRITE8_MEMBER(wmg_d000_w);
+ DECLARE_WRITE8_MEMBER(wmg_blitter_w);
DECLARE_WRITE_LINE_MEMBER(wmg_port_select_w);
DECLARE_WRITE8_MEMBER(wmg_sound_reset_w);
DECLARE_WRITE8_MEMBER(wmg_vram_select_w);
@@ -106,14 +108,21 @@ public:
void wmg(machine_config &config);
void wmg_cpu1(address_map &map);
void wmg_cpu2(address_map &map);
-private:
+ void wmg_banked_map(address_map &map);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+private:
uint8_t m_wmg_c400;
uint8_t m_wmg_d000;
uint8_t m_wmg_port_select;
uint8_t m_wmg_vram_bank;
required_shared_ptr<uint8_t> m_p_ram;
required_ioport_array<17> m_keyboard;
+ required_memory_bank m_codebank;
+ required_memory_bank m_soundbank;
};
@@ -125,10 +134,10 @@ private:
*************************************/
void wmg_state::wmg_cpu1(address_map &map)
{
- map(0x0000, 0x8fff).bankr("bank1").writeonly().share("videoram");
+ map(0x0000, 0x8fff).bankr("mainbank").writeonly().share("videoram");
map(0x9000, 0xbfff).ram();
- map(0xc000, 0xcfff).bankr("bank7");
- map(0xd000, 0xffff).bankr("bank5");
+ map(0xc000, 0xcfff).m(m_bankc000, FUNC(address_map_bank_device::amap8));
+ map(0xd000, 0xffff).bankr("codebank");
map(0xd000, 0xd000).w(FUNC(wmg_state::wmg_d000_w));
}
@@ -137,10 +146,25 @@ void wmg_state::wmg_cpu2(address_map &map)
map(0x0000, 0x007f).ram(); /* internal RAM */
map(0x0080, 0x00ff).ram(); /* MC6810 RAM */
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
-/* These next 2 are actually banked in CPU 1, but its not something Mame can handle very well. Placed here instead. */
- map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram");
+ map(0xf000, 0xffff).bankr("soundbank");
+}
+
+void wmg_state::wmg_banked_map(address_map &map)
+{
+ map(0x0000, 0x000f).mirror(0x03e0).writeonly().share("paletteram");
+ map(0x0010, 0x001f).mirror(0x03e0).w(FUNC(williams_state::defender_video_control_w));
+ map(0x0400, 0x0400).w(FUNC(wmg_state::wmg_c400_w));
+ map(0x0401, 0x0401).w(FUNC(wmg_state::wmg_sound_reset_w));
+ map(0x0804, 0x0807).r(FUNC(wmg_state::wmg_pia_0_r)).w(m_pia[0], FUNC(pia6821_device::write));
+ map(0x080c, 0x080f).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
+ map(0x0900, 0x09ff).w(FUNC(wmg_state::wmg_vram_select_w));
+ map(0x0a00, 0x0a07).w(FUNC(wmg_state::wmg_blitter_w));
+ map(0x0b00, 0x0bff).r(FUNC(williams_state::williams_video_counter_r));
+ map(0x0bff, 0x0bff).w(FUNC(williams_state::williams_watchdog_reset_w));
+ map(0x0c00, 0x0fff).rw(FUNC(wmg_state::wmg_nvram_r), FUNC(wmg_state::wmg_nvram_w));
+ map(0x1000, 0x4fff).rom().region("maincpu", 0x68000); // Defender roms
+/* These next one is actually banked in CPU 1, but its not something Mame can handle very well. Placed here instead. */
map(0xd000, 0xefff).ram().share("nvram");
- map(0xf000, 0xffff).bankr("bank6");
}
/***************************************************************
@@ -311,6 +335,17 @@ WRITE8_MEMBER( wmg_state::wmg_nvram_w )
/*************************************
*
+ * Blitter
+ *
+ *************************************/
+
+WRITE8_MEMBER( wmg_state::wmg_blitter_w )
+{
+ williams_blitter_w(m_maincpu->space(AS_PROGRAM), offset, data, mem_mask);
+}
+
+/*************************************
+ *
* Bankswitching
*
*************************************/
@@ -328,10 +363,9 @@ WRITE8_MEMBER( wmg_state::wmg_c400_w )
{
m_wmg_c400 = data;
wmg_d000_w( space, 0, 0); // select i/o
- uint8_t *cpu = memregion("maincpu")->base();
- memcpy( &cpu[0x10000], &cpu[(data << 16) + 0x20000], 0x9000 ); // Gfx etc
- membank("bank5")->set_entry(data); // Code
- membank("bank6")->set_entry(data); // Sound
+ m_mainbank->set_entry(m_wmg_vram_bank ? (1+m_wmg_c400) : 0); // Gfx etc
+ m_codebank->set_entry(data); // Code
+ m_soundbank->set_entry(data); // Sound
m_soundcpu->reset();
}
}
@@ -346,7 +380,7 @@ WRITE8_MEMBER( wmg_state::wmg_vram_select_w )
{
/* VRAM/ROM banking from bit 0 */
m_wmg_vram_bank = BIT(data, 0);
- membank("bank1")->set_entry(m_wmg_vram_bank);
+ m_mainbank->set_entry(m_wmg_vram_bank ? (1+m_wmg_c400) : 0);
/* cocktail flip from bit 1 */
m_cocktail = BIT(data, 1);
@@ -364,23 +398,17 @@ WRITE8_MEMBER( wmg_state::wmg_d000_w )
if ((m_wmg_c400 == 5) && (data))
{
// replace i/o with defender roms
- if (m_wmg_d000 == 0) // was i/o?
- {
- space.install_read_bank(0xc000, 0xcfff, "bank7");
- space.unmap_write(0xc000, 0xcfff);
- }
-
switch (data)
{
/* pages 1,2,3,7 map to ROM banks */
case 1:
case 2:
case 3:
- membank("bank7")->set_entry(data);
+ m_bankc000->set_bank(data);
break;
case 7:
- membank("bank7")->set_entry(4);
+ m_bankc000->set_bank(4);
break;
default:
@@ -392,26 +420,29 @@ WRITE8_MEMBER( wmg_state::wmg_d000_w )
if (data == 0)
{
/* install the i/o devices into c000-cfff */
- space.unmap_read(0xc000, 0xcfff); // throw out bank7
- space.install_write_bank (0xc000, 0xc00f, "bank4");
- membank("bank4")->set_base(m_paletteram);
- space.install_write_handler (0xc010, 0xc01f, write8_delegate(FUNC(williams_state::defender_video_control_w),this));
- space.install_write_handler (0xc400, 0xc400, write8_delegate(FUNC(wmg_state::wmg_c400_w),this));
- space.install_write_handler (0xc401, 0xc401, write8_delegate(FUNC(wmg_state::wmg_sound_reset_w),this));
- space.install_readwrite_handler(0xc804, 0xc807, read8_delegate(FUNC(wmg_state::wmg_pia_0_r),this), write8_delegate(FUNC(pia6821_device::write), m_pia[0].target()));
- space.install_readwrite_handler(0xc80c, 0xc80f, read8_delegate(FUNC(pia6821_device::read), m_pia[1].target()), write8_delegate(FUNC(pia6821_device::write), m_pia[1].target()));
- space.install_write_handler (0xc900, 0xc9ff, write8_delegate(FUNC(wmg_state::wmg_vram_select_w),this));
- space.install_write_handler (0xca00, 0xca07, write8_delegate(FUNC(williams_state::williams_blitter_w),this));
- space.install_write_handler (0xcbff, 0xcbff, write8_delegate(FUNC(williams_state::williams_watchdog_reset_w),this));
- space.install_read_handler (0xcb00, 0xcbff, read8_delegate(FUNC(williams_state::williams_video_counter_r),this));
- space.install_readwrite_handler(0xcc00, 0xcfff, read8_delegate(FUNC(wmg_state::wmg_nvram_r), this), write8_delegate(FUNC(wmg_state::wmg_nvram_w),this));
+ m_bankc000->set_bank(0);
}
m_wmg_d000 = data;
}
-MACHINE_RESET_MEMBER( wmg_state, wmg )
+void wmg_state::machine_start()
+{
+ uint8_t *cpu = memregion("maincpu")->base();
+ uint8_t *snd = memregion("soundcpu")->base();
+ m_mainbank->configure_entry(0, m_videoram);
+ m_mainbank->configure_entries(1, 8, &cpu[0x10000], 0x10000); // Gfx etc
+ m_codebank->configure_entries(0, 8, &cpu[0x1d000], 0x10000); // Code
+ m_soundbank->configure_entries(0, 8, &snd[0x10000], 0x1000); // Sound
+
+ save_item(NAME(m_wmg_c400));
+ save_item(NAME(m_wmg_d000));
+ save_item(NAME(m_wmg_port_select));
+ save_item(NAME(m_wmg_vram_bank));
+}
+
+void wmg_state::machine_reset()
{
address_space &space1 = m_maincpu->space(AS_PROGRAM);
m_wmg_c400=0xff;
@@ -473,11 +504,6 @@ READ8_MEMBER( wmg_state::wmg_pia_0_r )
*************************************/
void wmg_state::init_wmg()
{
- uint8_t *cpu = memregion("maincpu")->base();
- uint8_t *snd = memregion("soundcpu")->base();
- membank("bank5")->configure_entries(0, 8, &cpu[0x2d000], 0x10000); // Code
- membank("bank6")->configure_entries(0, 8, &snd[0x10000], 0x1000); // Sound
- membank("bank7")->configure_entries(1, 4, &cpu[0x78000], 0x1000); // Defender roms
m_blitter_config = WILLIAMS_BLITTER_SC1;
m_blitter_clip_address = 0xc000;
}
@@ -496,10 +522,15 @@ MACHINE_CONFIG_START(wmg_state::wmg)
MCFG_DEVICE_ADD("soundcpu", M6808, SOUND_CLOCK)
MCFG_DEVICE_PROGRAM_MAP(wmg_cpu2)
- MCFG_MACHINE_START_OVERRIDE(williams_state,williams)
- MCFG_MACHINE_RESET_OVERRIDE(wmg_state, wmg)
MCFG_NVRAM_ADD_0FILL("nvram")
+ MCFG_DEVICE_ADD("bankc000", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(wmg_banked_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG)
+ MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8)
+ MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000)
+
// set a timer to go off every 32 scanlines, to toggle the VA11 line and update the screen
MCFG_TIMER_DRIVER_ADD_SCANLINE("scan_timer", williams_state, williams_va11_callback, "screen", 0, 32)
@@ -516,6 +547,9 @@ MACHINE_CONFIG_START(wmg_state::wmg)
MCFG_VIDEO_START_OVERRIDE(williams_state,williams)
+ MCFG_PALETTE_ADD("palette", 256)
+ MCFG_PALETTE_INIT_OWNER(williams_state,williams)
+
/* sound hardware */
SPEAKER(config, "speaker").front_center();
@@ -553,20 +587,20 @@ MACHINE_CONFIG_END
*
*************************************/
ROM_START( wmg )
- ROM_REGION( 0xa0000, "maincpu", 0 )
- ROM_LOAD( "wmg.cpu", 0x20000, 0x80000, CRC(975516ec) SHA1(571aaf9bff8ebfc36448cd9394b47bcfae7d1b83) )
+ ROM_REGION( 0x90000, "maincpu", 0 )
+ ROM_LOAD( "wmg.cpu", 0x10000, 0x80000, CRC(975516ec) SHA1(571aaf9bff8ebfc36448cd9394b47bcfae7d1b83) )
/* This little HACK! lets the menu boot up.
It patches a jump to some new code, which sets a few memory locations, and sets the stack pointer.
Then it jumps back to continue the main run. */
- ROM_COPY( "maincpu", 0x2e0da, 0x2f800, 0x0001b )
- ROM_FILL( 0x2f81b, 1, 0x7e )
- ROM_FILL( 0x2f81c, 1, 0xe0 )
- ROM_FILL( 0x2f81d, 1, 0xba )
- ROM_FILL( 0x2e0b7, 1, 0x7e )
- ROM_FILL( 0x2e0b8, 1, 0xf8 )
- ROM_FILL( 0x2e0b9, 1, 0x00 )
+ ROM_COPY( "maincpu", 0x1e0da, 0x1f800, 0x0001b )
+ ROM_FILL( 0x1f81b, 1, 0x7e )
+ ROM_FILL( 0x1f81c, 1, 0xe0 )
+ ROM_FILL( 0x1f81d, 1, 0xba )
+ ROM_FILL( 0x1e0b7, 1, 0x7e )
+ ROM_FILL( 0x1e0b8, 1, 0xf8 )
+ ROM_FILL( 0x1e0b9, 1, 0x00 )
ROM_REGION( 0x18000, "soundcpu", 0 )
ROM_LOAD( "wmg.snd", 0x10000, 0x8000, CRC(1d08990e) SHA1(7bfb29426b3876f113e6ec3bc6c2fce9d2d1eb0c) )