From c393eadd21d7e1c2d0779407ca51d731ca3e459b Mon Sep 17 00:00:00 2001 From: Robbbert Date: Mon, 8 Jun 2020 00:20:06 +1000 Subject: (nw) micral: don't write in regions --- src/mame/drivers/micral.cpp | 93 +++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 42 deletions(-) diff --git a/src/mame/drivers/micral.cpp b/src/mame/drivers/micral.cpp index ae3f8a90748..12c1c90f2af 100644 --- a/src/mame/drivers/micral.cpp +++ b/src/mame/drivers/micral.cpp @@ -73,8 +73,9 @@ public: micral_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_rom(*this, "maincpu") + , m_ram(*this, "mainram") //, m_beep(*this, "beeper") - , m_p_videoram(*this, "vram") , m_p_chargen(*this, "chargen") , m_uart(*this, "uart") , m_crtc(*this, "crtc") @@ -82,10 +83,9 @@ public: void micral(machine_config &config); - void init_micral(); - private: - DECLARE_MACHINE_RESET(micral); + virtual void machine_reset() override; + virtual void machine_start() override; u8 keyin_r(); u8 status_r(); u8 unk_r(); @@ -100,9 +100,12 @@ private: u16 s_curpos; u8 s_command; u8 s_data; + std::unique_ptr m_vram; + memory_passthrough_handler *m_rom_shadow_tap; required_device m_maincpu; + required_region_ptr m_rom; + required_shared_ptr m_ram; //required_device m_beep; - required_region_ptr m_p_videoram; required_region_ptr m_p_chargen; required_device m_uart; required_device m_crtc; @@ -131,7 +134,7 @@ u8 micral_state::video_r(offs_t offset) if (offset) return 0x07; else - return m_p_videoram[s_curpos]; + return m_vram[s_curpos]; } void micral_state::video_w(offs_t offset, u8 data) @@ -146,10 +149,10 @@ void micral_state::video_w(offs_t offset, u8 data) s_curpos = (s_curpos & 0xff) | ((s_data & 0x1f) << 8); else if (s_command == 0xa0) - m_p_videoram[s_curpos] = s_data; + m_vram[s_curpos] = s_data; //if (s_command < 0x10) - //m_crtc->write(space, s_command, s_data); + //m_crtc->write(s_command, s_data); } else { @@ -161,9 +164,8 @@ void micral_state::video_w(offs_t offset, u8 data) void micral_state::mem_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0xf7ff).ram(); - map(0xf800, 0xfeff).rom(); - map(0xff00, 0xffef).ram(); + map(0x0000, 0xffef).ram().share("mainram"); + map(0xf800, 0xfeff).rom().region("maincpu", 0); map(0xfff6, 0xfff7); // .nopw(); // unknown ports map(0xfff8, 0xfff9).rw(FUNC(micral_state::video_r), FUNC(micral_state::video_w)); map(0xfffa, 0xfffa).r(FUNC(micral_state::keyin_r)); @@ -335,7 +337,7 @@ uint32_t micral_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap gfx = 0; if (ra < 9) { - chr = m_p_videoram[x+ma]; + chr = m_vram[x+ma]; gfx = m_p_chargen[(chr<<4) | ra ]; if (((s_curpos & 0xff)==x) && ((s_curpos >> 8)==y)) gfx ^= 0xff; @@ -356,21 +358,8 @@ uint32_t micral_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap return 0; } -void micral_state::init_micral() -{ - //uint8_t *main = memregion("maincpu")->base(); - - //membank("bankr0")->configure_entry(1, &main[0xf800]); - //membank("bankr0")->configure_entry(0, &main[0x10000]); - //membank("bankw0")->configure_entry(0, &main[0xf800]); -} - -MACHINE_RESET_MEMBER( micral_state, micral ) +void micral_state::machine_reset() { - //membank("bankr0")->set_entry(0); // point at rom - //membank("bankw0")->set_entry(0); // always write to ram - m_maincpu->set_state_int(Z80_PC, 0xf800); - // no idea if these are hard-coded, or programmable m_uart->write_xr(0); m_uart->write_xr(1); @@ -382,6 +371,32 @@ MACHINE_RESET_MEMBER( micral_state, micral ) m_uart->write_eps(1); m_uart->write_cs(1); m_uart->write_cs(0); + + address_space &program = m_maincpu->space(AS_PROGRAM); + program.install_rom(0x0000, 0x07ff, m_rom); // do it here for F3 + m_rom_shadow_tap = program.install_read_tap(0xf800, 0xffff, "rom_shadow_r",[this](offs_t offset, u8 &data, u8 mem_mask) + { + if (!machine().side_effects_disabled()) + { + // delete this tap + m_rom_shadow_tap->remove(); + + // reinstall ram over the rom shadow + m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x07ff, m_ram); + } + + // return the original data + return data; + }); +} + +void micral_state::machine_start() +{ + m_vram = make_unique_clear(0x2000); + save_pointer(NAME(m_vram), 0x2000); + save_item(NAME(s_curpos)); + save_item(NAME(s_command)); + save_item(NAME(s_data)); } void micral_state::micral(machine_config &config) @@ -394,8 +409,6 @@ void micral_state::micral(machine_config &config) keyboard.set_addrmap(AS_PROGRAM, &micral_state::mem_kbd); keyboard.set_addrmap(AS_IO, &micral_state::io_kbd); - MCFG_MACHINE_RESET_OVERRIDE(micral_state, micral) - // video hardware screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green())); screen.set_refresh_hz(60); @@ -428,13 +441,11 @@ void micral_state::micral(machine_config &config) } ROM_START( micral ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "8022g.rom", 0xf800, 0x0800, CRC(882732a9) SHA1(3f37b82c450a54aedec209bd46fcbcf131c86313) ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "8022g.rom", 0x0000, 0x0800, CRC(882732a9) SHA1(3f37b82c450a54aedec209bd46fcbcf131c86313) ) - ROM_REGION( 0x400, "keyboard", 0 ) - ROM_LOAD( "2010221.rom", 0x000, 0x400, CRC(65123378) SHA1(401f0a648b78bf1662a1cd2546e83ba8e3cb7a42) ) - - ROM_REGION( 0x2000, "vram", ROMREGION_ERASEFF ) + ROM_REGION( 0x0400, "keyboard", 0 ) + ROM_LOAD( "2010221.rom", 0x0000, 0x0400, CRC(65123378) SHA1(401f0a648b78bf1662a1cd2546e83ba8e3cb7a42) ) // Using the chargen from 'c10' for now. ROM_REGION( 0x2000, "chargen", 0 ) @@ -442,14 +453,12 @@ ROM_START( micral ) ROM_END ROM_START( questarm ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "qm_547_1.rom", 0xf800, 0x0800, CRC(8e6dc953) SHA1(b31375af8c6769578d2000fff3e751e94e7ae4d4) ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "qm_547_1.rom", 0x0000, 0x0800, CRC(8e6dc953) SHA1(b31375af8c6769578d2000fff3e751e94e7ae4d4) ) // using the keyboard ROM from 'micral' for now - ROM_REGION( 0x400, "keyboard", 0 ) - ROM_LOAD( "2010221.rom", 0x000, 0x400, CRC(65123378) SHA1(401f0a648b78bf1662a1cd2546e83ba8e3cb7a42) ) - - ROM_REGION( 0x2000, "vram", ROMREGION_ERASEFF ) + ROM_REGION( 0x0400, "keyboard", 0 ) + ROM_LOAD( "2010221.rom", 0x0000, 0x0400, CRC(65123378) SHA1(401f0a648b78bf1662a1cd2546e83ba8e3cb7a42) ) // Using the chargen from 'c10' for now. ROM_REGION( 0x2000, "chargen", 0 ) @@ -459,5 +468,5 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1981, micral, 0, 0, micral, micral, micral_state, init_micral, "Bull R2E", "Micral 80-22G", MACHINE_IS_SKELETON ) -COMP( 1982, questarm, micral, 0, micral, micral, micral_state, init_micral, "Honeywell Bull", "Questar/M", MACHINE_IS_SKELETON ) +COMP( 1981, micral, 0, 0, micral, micral, micral_state, empty_init, "Bull R2E", "Micral 80-22G", MACHINE_IS_SKELETON | MACHINE_SUPPORTS_SAVE ) +COMP( 1982, questarm, micral, 0, micral, micral, micral_state, empty_init, "Honeywell Bull", "Questar/M", MACHINE_IS_SKELETON | MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3