From a936aab0363a054eb98e153730c997429e3fa464 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sat, 16 Jun 2018 23:53:33 +0900 Subject: Make wmg.cpp Working again, nw wmg.cpp : Cleanups, Add address_map_bank_device for IO Bankswitching, Add machine_start/reset instead MCFG_MACHINE_START/RESET, Add save state, Fix naming, Fix crash --- src/mame/drivers/wmg.cpp | 136 +++++++++++++++++++++++++++++------------------ 1 file 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 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"); } /*************************************************************** @@ -309,6 +333,17 @@ WRITE8_MEMBER( wmg_state::wmg_nvram_w ) m_p_ram[offset+(m_wmg_c400<<10)] = data; } +/************************************* + * + * 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) ) -- cgit v1.2.3