From d842fe22e3d7a15489054dc26d6d25ef1092df48 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 3 Sep 2024 14:37:17 +0200 Subject: misc: simplify bootrom bankswitch from before memory_view was added --- src/devices/machine/chessmachine.cpp | 41 ++++++++------------- src/devices/machine/chessmachine.h | 12 +++---- src/mame/chess/tasc.cpp | 48 +++++++++++-------------- src/mame/hegenerglaser/modular_tm.cpp | 47 +++++++----------------- src/mame/saitek/risc2500.cpp | 68 +++++++++++++++-------------------- 5 files changed, 82 insertions(+), 134 deletions(-) diff --git a/src/devices/machine/chessmachine.cpp b/src/devices/machine/chessmachine.cpp index a7db23f99fd..80ea45a91be 100644 --- a/src/devices/machine/chessmachine.cpp +++ b/src/devices/machine/chessmachine.cpp @@ -44,9 +44,7 @@ DEFINE_DEVICE_TYPE(CHESSMACHINE, chessmachine_device, "chessmachine", "Tasc Ches chessmachine_device::chessmachine_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, CHESSMACHINE, tag, owner, clock), m_maincpu(*this, "maincpu"), - m_bootrom(*this, "bootrom"), - m_ram(*this, "ram"), - m_disable_bootrom(*this, "disable_bootrom"), + m_boot_view(*this, "boot_view"), m_data_out(*this) { } @@ -58,12 +56,10 @@ chessmachine_device::chessmachine_device(const machine_config &mconfig, const ch void chessmachine_device::device_start() { - // zerofill - m_bootrom_enabled = false; memset(m_latch, 0, sizeof(m_latch)); + m_boot_timer = timer_alloc(FUNC(chessmachine_device::disable_bootrom), this); // register for savestates - save_item(NAME(m_bootrom_enabled)); save_item(NAME(m_latch)); } @@ -108,8 +104,12 @@ void chessmachine_device::reset_w_sync(s32 param) { m_maincpu->set_input_line(INPUT_LINE_RESET, param ? ASSERT_LINE : CLEAR_LINE); - if (!m_bootrom_enabled && param) - install_bootrom(true); + if (param) + { + // enable bootrom + m_boot_view.select(0); + m_boot_timer->adjust(attotime::never); + } } void chessmachine_device::reset_w(int state) @@ -123,31 +123,22 @@ void chessmachine_device::reset_w(int state) // internal //------------------------------------------------- -void chessmachine_device::install_bootrom(bool enable) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - program.unmap_readwrite(0, m_bootrom.bytes() - 1); - - if (enable) - program.install_rom(0, m_bootrom.bytes() - 1, m_bootrom); - else - program.install_ram(0, m_ram.bytes() - 1, m_ram); - - m_bootrom_enabled = enable; -} - u32 chessmachine_device::disable_bootrom_r() { // disconnect bootrom from the bus after next opcode - if (m_bootrom_enabled && !m_disable_bootrom->enabled() && !machine().side_effects_disabled()) - m_disable_bootrom->adjust(m_maincpu->cycles_to_attotime(5)); + if (!machine().side_effects_disabled() && m_boot_timer->remaining().is_never()) + m_boot_timer->adjust(m_maincpu->cycles_to_attotime(5)); return 0; } void chessmachine_device::main_map(address_map &map) { - map(0x00000000, 0x000fffff).ram().share("ram"); + map(0x00000000, 0x000fffff).ram(); + + map(0x00000000, 0x0000007f).view(m_boot_view); + m_boot_view[0](0x00000000, 0x0000007f).rom().region("bootrom", 0); + map(0x00400000, 0x00400003).mirror(0x003ffffc).rw(FUNC(chessmachine_device::internal_r), FUNC(chessmachine_device::internal_w)).umask32(0x000000ff); map(0x01800000, 0x01800003).r(FUNC(chessmachine_device::disable_bootrom_r)); } @@ -157,8 +148,6 @@ void chessmachine_device::device_add_mconfig(machine_config &config) ARM(config, m_maincpu, DERIVED_CLOCK(1,1)); m_maincpu->set_addrmap(AS_PROGRAM, &chessmachine_device::main_map); m_maincpu->set_copro_type(arm_cpu_device::copro_type::VL86C020); - - TIMER(config, "disable_bootrom").configure_generic(FUNC(chessmachine_device::disable_bootrom)); } diff --git a/src/devices/machine/chessmachine.h b/src/devices/machine/chessmachine.h index d07ac764e5b..3b863f2e268 100644 --- a/src/devices/machine/chessmachine.h +++ b/src/devices/machine/chessmachine.h @@ -12,7 +12,6 @@ #pragma once #include "cpu/arm/arm.h" -#include "machine/timer.h" class chessmachine_device : public device_t @@ -34,27 +33,24 @@ protected: virtual void device_start() override; virtual void device_reset_after_children() override { reset_w(1); } virtual void device_add_mconfig(machine_config &config) override; - virtual void device_post_load() override { install_bootrom(m_bootrom_enabled); } virtual const tiny_rom_entry *device_rom_region() const override; private: required_device m_maincpu; - required_region_ptr m_bootrom; - required_shared_ptr m_ram; - required_device m_disable_bootrom; + memory_view m_boot_view; devcb_write_line m_data_out; + emu_timer *m_boot_timer; + u8 m_latch[2]; - bool m_bootrom_enabled; void data0_w_sync(s32 param); void data1_w_sync(s32 param); void reset_w_sync(s32 param); - void install_bootrom(bool enable); - TIMER_DEVICE_CALLBACK_MEMBER(disable_bootrom) { install_bootrom(false); } + TIMER_CALLBACK_MEMBER(disable_bootrom) { m_boot_view.disable(); } u32 disable_bootrom_r(); u8 internal_r() { return m_latch[0]; } diff --git a/src/mame/chess/tasc.cpp b/src/mame/chess/tasc.cpp index 4a90b864f16..660f1b30907 100644 --- a/src/mame/chess/tasc.cpp +++ b/src/mame/chess/tasc.cpp @@ -59,7 +59,6 @@ BTANB: #include "machine/nvram.h" #include "machine/ram.h" #include "machine/smartboard.h" -#include "machine/timer.h" #include "sound/dac.h" #include "video/t6963c.h" @@ -77,13 +76,13 @@ public: tasc_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_boot_view(*this, "boot_view"), m_rom(*this, "maincpu"), m_ram(*this, "ram"), m_nvram(*this, "nvram", 0x20000, ENDIANNESS_LITTLE), m_lcd(*this, "lcd"), m_smartboard(*this, "smartboard"), m_dac(*this, "dac"), - m_disable_bootrom(*this, "disable_bootrom"), m_inputs(*this, "IN.%u", 0U), m_out_leds(*this, "pled%u", 0U) { } @@ -95,22 +94,21 @@ public: protected: virtual void machine_start() override; virtual void machine_reset() override; - virtual void device_post_load() override { install_bootrom(m_bootrom_enabled); } private: // devices/pointers required_device m_maincpu; + memory_view m_boot_view; required_region_ptr m_rom; required_device m_ram; memory_share_creator m_nvram; required_device m_lcd; required_device m_smartboard; required_device m_dac; - required_device m_disable_bootrom; required_ioport_array<4> m_inputs; output_finder<2> m_out_leds; - bool m_bootrom_enabled = false; + emu_timer *m_boot_timer; u32 m_control = 0; u32 m_prev_pc = 0; @@ -126,15 +124,23 @@ private: u8 nvram_r(offs_t offset) { return m_nvram[offset]; } void nvram_w(offs_t offset, u8 data) { m_nvram[offset] = data; } - void install_bootrom(bool enable); - TIMER_DEVICE_CALLBACK_MEMBER(disable_bootrom) { install_bootrom(false); } + TIMER_CALLBACK_MEMBER(disable_bootrom) { m_boot_view.select(1); } }; + + +/******************************************************************************* + Initialization +*******************************************************************************/ + void tasc_state::machine_start() { m_out_leds.resolve(); - save_item(NAME(m_bootrom_enabled)); + m_boot_timer = timer_alloc(FUNC(tasc_state::disable_bootrom), this); + m_boot_view[1].install_ram(0, m_ram->size() - 1, m_ram->pointer()); + + // register for savestates save_item(NAME(m_control)); save_item(NAME(m_prev_pc)); save_item(NAME(m_prev_cycle)); @@ -142,7 +148,8 @@ void tasc_state::machine_start() void tasc_state::machine_reset() { - install_bootrom(true); + m_boot_view.select(0); + m_boot_timer->adjust(attotime::never); m_prev_pc = m_maincpu->pc(); m_prev_cycle = m_maincpu->total_cycles(); @@ -160,27 +167,13 @@ INPUT_CHANGED_MEMBER(tasc_state::change_cpu_freq) I/O *******************************************************************************/ -void tasc_state::install_bootrom(bool enable) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - program.unmap_readwrite(0, std::max(m_rom.bytes(), size_t(m_ram->size())) - 1); - - // bootrom bankswitch - if (enable) - program.install_read_handler(0, m_rom.bytes() - 1, read32sm_delegate(*this, FUNC(tasc_state::rom_r))); - else - program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); - - m_bootrom_enabled = enable; -} - u32 tasc_state::input_r() { if (!machine().side_effects_disabled()) { // disconnect bootrom from the bus after next opcode - if (m_bootrom_enabled && !m_disable_bootrom->enabled()) - m_disable_bootrom->adjust(m_maincpu->cycles_to_attotime(10)); + if (m_boot_timer->remaining().is_never()) + m_boot_timer->adjust(m_maincpu->cycles_to_attotime(10)); m_maincpu->set_input_line(ARM_FIRQ_LINE, CLEAR_LINE); } @@ -254,6 +247,9 @@ u32 tasc_state::rom_r(offs_t offset) void tasc_state::main_map(address_map &map) { + map(0x00000000, 0x007fffff).view(m_boot_view); + m_boot_view[0](0x00000000, 0x0003ffff).r(FUNC(tasc_state::rom_r)); + map(0x01000000, 0x01000003).rw(FUNC(tasc_state::input_r), FUNC(tasc_state::control_w)); map(0x02000000, 0x0203ffff).r(FUNC(tasc_state::rom_r)); map(0x03000000, 0x0307ffff).rw(FUNC(tasc_state::nvram_r), FUNC(tasc_state::nvram_w)).umask32(0x000000ff); @@ -308,8 +304,6 @@ void tasc_state::tasc(machine_config &config) const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL / 128); // 256Hz m_maincpu->set_periodic_int(FUNC(tasc_state::irq1_line_assert), irq_period); - TIMER(config, "disable_bootrom").configure_generic(FUNC(tasc_state::disable_bootrom)); - RAM(config, m_ram).set_extra_options("512K, 1M, 2M, 4M, 8M"); // see driver notes m_ram->set_default_size("512K"); m_ram->set_default_value(0); diff --git a/src/mame/hegenerglaser/modular_tm.cpp b/src/mame/hegenerglaser/modular_tm.cpp index d87ead3d2c7..f80068626e0 100644 --- a/src/mame/hegenerglaser/modular_tm.cpp +++ b/src/mame/hegenerglaser/modular_tm.cpp @@ -47,7 +47,6 @@ After boot, it copies ROM to RAM, probably to circumvent waitstates on slow ROM. #include "cpu/m68000/m68030.h" #include "machine/nvram.h" -#include "machine/timer.h" // internal artwork #include "mephisto_modular_tm.lh" @@ -61,10 +60,8 @@ public: mmtm_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_mainram(*this, "mainram"), - m_nvram(*this, "nvram", 0x2000, ENDIANNESS_BIG), - m_disable_bootrom(*this, "disable_bootrom") + m_boot_view(*this, "boot_view"), + m_nvram(*this, "nvram", 0x2000, ENDIANNESS_BIG) { } // machine configs @@ -76,17 +73,14 @@ public: protected: virtual void machine_start() override; virtual void machine_reset() override; - virtual void device_post_load() override { install_bootrom(m_bootrom_enabled); } private: // devices/pointers required_device m_maincpu; - required_region_ptr m_rom; - required_shared_ptr m_mainram; + memory_view m_boot_view; memory_share_creator m_nvram; - required_device m_disable_bootrom; - bool m_bootrom_enabled = false; + emu_timer *m_boot_timer; // address maps void mmtm_2m_map(address_map &map); @@ -95,8 +89,7 @@ private: u8 nvram_r(offs_t offset) { return m_nvram[offset]; } void nvram_w(offs_t offset, u8 data) { m_nvram[offset] = data; } - void install_bootrom(bool enable); - TIMER_DEVICE_CALLBACK_MEMBER(disable_bootrom) { install_bootrom(false); } + TIMER_CALLBACK_MEMBER(disable_bootrom) { m_boot_view.select(1); } }; @@ -107,27 +100,14 @@ private: void mmtm_state::machine_start() { - save_item(NAME(m_bootrom_enabled)); + m_boot_timer = timer_alloc(FUNC(mmtm_state::disable_bootrom), this); } void mmtm_state::machine_reset() { // disable bootrom after reset - install_bootrom(true); - m_disable_bootrom->adjust(m_maincpu->cycles_to_attotime(50)); -} - -void mmtm_state::install_bootrom(bool enable) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - program.unmap_readwrite(0, std::max(m_rom.bytes(), m_mainram.bytes()) - 1); - - if (enable) - program.install_rom(0, m_rom.bytes() - 1, m_rom); - else - program.install_ram(0, m_mainram.bytes() - 1, m_mainram); - - m_bootrom_enabled = enable; + m_boot_view.select(0); + m_boot_timer->adjust(m_maincpu->cycles_to_attotime(50)); } INPUT_CHANGED_MEMBER(mmtm_state::change_cpu_freq) @@ -150,7 +130,10 @@ INPUT_CHANGED_MEMBER(mmtm_state::change_cpu_freq) void mmtm_state::mmtm_2m_map(address_map &map) { - map(0x00000000, 0x0003ffff).ram().share("mainram"); + map(0x00000000, 0x0003ffff).view(m_boot_view); + m_boot_view[0](0x00000000, 0x0003ffff).rom().region("maincpu", 0); + m_boot_view[1](0x00000000, 0x0003ffff).ram(); + map(0x80000000, 0x801fffff).ram(); map(0xf0000000, 0xf003ffff).rom().region("maincpu", 0); map(0xfc000000, 0xfc001fff).rw(FUNC(mmtm_state::nvram_r), FUNC(mmtm_state::nvram_w)).umask32(0xffffffff); @@ -167,9 +150,7 @@ void mmtm_state::mmtm_2m_map(address_map &map) void mmtm_state::mmtm_8m_map(address_map &map) { mmtm_2m_map(map); - map(0x80200000, 0x803fffff).ram(); - map(0x80400000, 0x805fffff).ram(); - map(0x80600000, 0x807fffff).ram(); + map(0x80000000, 0x807fffff).ram(); } @@ -217,8 +198,6 @@ void mmtm_state::mmtm_v(machine_config &config) const attotime irq_period = attotime::from_hz(12.288_MHz_XTAL / 0x8000); // through 4060, 375Hz m_maincpu->set_periodic_int(FUNC(mmtm_state::irq3_line_hold), irq_period); - TIMER(config, "disable_bootrom").configure_generic(FUNC(mmtm_state::disable_bootrom)); - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); MEPHISTO_SENSORS_BOARD(config, "board"); diff --git a/src/mame/saitek/risc2500.cpp b/src/mame/saitek/risc2500.cpp index 1ecb84778a7..7fa177f40cd 100644 --- a/src/mame/saitek/risc2500.cpp +++ b/src/mame/saitek/risc2500.cpp @@ -47,7 +47,6 @@ TODO: #include "machine/nvram.h" #include "machine/ram.h" #include "machine/sensorboard.h" -#include "machine/timer.h" #include "sound/dac.h" #include "video/sed1520.h" @@ -68,10 +67,10 @@ public: risc2500_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_boot_view(*this, "boot_view"), m_rom(*this, "maincpu"), m_ram(*this, "ram"), m_nvram(*this, "nvram"), - m_disable_bootrom(*this, "disable_bootrom"), m_dac(*this, "dac"), m_lcdc(*this, "lcdc"), m_board(*this, "board"), @@ -89,14 +88,13 @@ public: protected: virtual void machine_start() override; virtual void machine_reset() override; - virtual void device_post_load() override { install_bootrom(m_bootrom_enabled); } private: required_device m_maincpu; + memory_view m_boot_view; required_region_ptr m_rom; required_device m_ram; required_device m_nvram; - required_device m_disable_bootrom; required_device m_dac; required_device m_lcdc; required_device m_board; @@ -105,13 +103,13 @@ private: output_finder<14> m_syms; output_finder<16> m_leds; + emu_timer *m_boot_timer; + bool m_power = false; u32 m_control = 0; u32 m_prev_pc = 0; u64 m_prev_cycle = 0; - bool m_bootrom_enabled = false; - void risc2500_mem(address_map &map); void lcd_palette(palette_device &palette) const; @@ -121,22 +119,28 @@ private: u32 rom_r(offs_t offset); void power_off(); - u32 disable_boot_rom_r(); - void install_bootrom(bool enable); - TIMER_DEVICE_CALLBACK_MEMBER(disable_bootrom) { install_bootrom(false); } + u32 disable_bootrom_r(); + TIMER_CALLBACK_MEMBER(disable_bootrom) { m_boot_view.select(1); } }; + + +/******************************************************************************* + Initialization +*******************************************************************************/ + void risc2500_state::machine_start() { m_digits.resolve(); m_syms.resolve(); m_leds.resolve(); + m_boot_timer = timer_alloc(FUNC(risc2500_state::disable_bootrom), this); + m_boot_view[1].install_ram(0, m_ram->size() - 1, m_ram->pointer()); m_nvram->set_base(m_ram->pointer(), m_ram->size()); // register for savestates save_item(NAME(m_power)); - save_item(NAME(m_bootrom_enabled)); save_item(NAME(m_control)); save_item(NAME(m_prev_pc)); save_item(NAME(m_prev_cycle)); @@ -144,7 +148,8 @@ void risc2500_state::machine_start() void risc2500_state::machine_reset() { - install_bootrom(true); + m_boot_view.select(0); + m_boot_timer->adjust(attotime::never); m_power = true; m_control = 0; @@ -211,31 +216,6 @@ SED1520_UPDATE_CB(risc2500_state::screen_update_cb) I/O *******************************************************************************/ -// bootrom bankswitch - -void risc2500_state::install_bootrom(bool enable) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - program.unmap_readwrite(0, std::max(m_rom.bytes(), size_t(m_ram->size())) - 1); - - if (enable) - program.install_read_handler(0, m_rom.bytes() - 1, read32sm_delegate(*this, FUNC(risc2500_state::rom_r))); - else - program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); - - m_bootrom_enabled = enable; -} - -u32 risc2500_state::disable_boot_rom_r() -{ - // disconnect bootrom from the bus after next opcode - if (m_bootrom_enabled && !m_disable_bootrom->enabled() && !machine().side_effects_disabled()) - m_disable_bootrom->adjust(m_maincpu->cycles_to_attotime(10)); - - return 0; -} - - // soft power on/off INPUT_CHANGED_MEMBER(risc2500_state::on_button) @@ -316,6 +296,15 @@ void risc2500_state::control_w(u32 data) m_control = data; } +u32 risc2500_state::disable_bootrom_r() +{ + // disconnect bootrom from the bus after next opcode + if (!machine().side_effects_disabled() && m_boot_timer->remaining().is_never()) + m_boot_timer->adjust(m_maincpu->cycles_to_attotime(10)); + + return 0; +} + u32 risc2500_state::rom_r(offs_t offset) { if (!machine().side_effects_disabled()) @@ -352,7 +341,10 @@ u32 risc2500_state::rom_r(offs_t offset) void risc2500_state::risc2500_mem(address_map &map) { - map(0x01800000, 0x01800003).r(FUNC(risc2500_state::disable_boot_rom_r)); + map(0x00000000, 0x001fffff).view(m_boot_view); + m_boot_view[0](0x00000000, 0x0003ffff).r(FUNC(risc2500_state::rom_r)); + + map(0x01800000, 0x01800003).r(FUNC(risc2500_state::disable_bootrom_r)); map(0x01000000, 0x01000003).rw(FUNC(risc2500_state::input_r), FUNC(risc2500_state::control_w)); map(0x02000000, 0x0203ffff).r(FUNC(risc2500_state::rom_r)); } @@ -426,8 +418,6 @@ void risc2500_state::risc2500(machine_config &config) const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL / 128); // 256Hz m_maincpu->set_periodic_int(FUNC(risc2500_state::irq1_line_assert), irq_period); - TIMER(config, "disable_bootrom").configure_generic(FUNC(risc2500_state::disable_bootrom)); - RAM(config, m_ram).set_extra_options("128K, 256K, 512K, 1M, 2M"); m_ram->set_default_size("128K"); m_ram->set_default_value(0); -- cgit v1.2.3