summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/bbc/tube/tube_32016.cpp30
-rw-r--r--src/devices/bus/bbc/tube/tube_32016.h2
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.cpp21
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.h2
-rw-r--r--src/devices/bus/electron/mc68k.cpp31
-rw-r--r--src/devices/bus/electron/mc68k.h2
-rw-r--r--src/devices/bus/vme/vme_cp31.cpp30
-rw-r--r--src/devices/bus/vme/vme_cp31.h5
-rw-r--r--src/devices/bus/vme/vme_hcpu30.cpp30
-rw-r--r--src/devices/bus/vme/vme_hcpu30.h5
-rw-r--r--src/devices/bus/vme/vme_mvme120.cpp21
-rw-r--r--src/devices/bus/vme/vme_mvme120.h5
-rw-r--r--src/devices/cpu/i386/i386.cpp6
-rw-r--r--src/devices/cpu/i386/i386.h4
-rw-r--r--src/devices/cpu/i386/i386segs.hxx10
-rw-r--r--src/emu/debug/debugcpu.cpp17
-rw-r--r--src/emu/debug/debugcpu.h6
-rw-r--r--src/emu/debug/express.cpp16
-rw-r--r--src/emu/debug/express.h9
-rw-r--r--src/emu/debug/points.cpp111
-rw-r--r--src/emu/debug/points.h6
-rw-r--r--src/emu/emu.h3
-rw-r--r--src/emu/emumem.cpp24
-rw-r--r--src/emu/emumem.h131
-rw-r--r--src/emu/emumem_aspace.cpp66
-rw-r--r--src/emu/emumem_hep.h12
-rw-r--r--src/emu/emumem_het.h8
-rw-r--r--src/emu/emumem_mview.cpp35
-rw-r--r--src/frontend/mame/luaengine.cpp5
-rw-r--r--src/frontend/mame/luaengine_debug.cpp256
-rw-r--r--src/frontend/mame/luaengine_mem.cpp140
-rw-r--r--src/lib/util/notifier.h240
-rw-r--r--src/mame/drivers/amust.cpp44
-rw-r--r--src/mame/drivers/apogee.cpp34
-rw-r--r--src/mame/drivers/argo.cpp48
-rw-r--r--src/mame/drivers/blit.cpp34
-rw-r--r--src/mame/drivers/c10.cpp45
-rw-r--r--src/mame/drivers/ckz80.cpp41
-rw-r--r--src/mame/drivers/imsai.cpp39
-rw-r--r--src/mame/drivers/lola8a.cpp38
-rw-r--r--src/mame/drivers/micral.cpp46
-rw-r--r--src/mame/drivers/modellot.cpp38
-rw-r--r--src/mame/drivers/okean240.cpp44
-rw-r--r--src/mame/drivers/pimps.cpp39
-rw-r--r--src/mame/drivers/plan80.cpp40
-rw-r--r--src/mame/drivers/positron.cpp58
-rw-r--r--src/mame/drivers/ptcsol.cpp59
-rw-r--r--src/mame/drivers/pulsar.cpp45
-rw-r--r--src/mame/drivers/sys2900.cpp40
-rw-r--r--src/mame/drivers/tekigw.cpp151
-rw-r--r--src/mame/drivers/unior.cpp46
-rw-r--r--src/mame/drivers/vector4.cpp41
-rw-r--r--src/mame/drivers/z80ne.cpp7
-rw-r--r--src/mame/drivers/z9001.cpp35
-rw-r--r--src/mame/includes/dai.h10
-rw-r--r--src/mame/includes/mikro80.h4
-rw-r--r--src/mame/includes/mikromik.h6
-rw-r--r--src/mame/includes/radio86.h2
-rw-r--r--src/mame/includes/sorcerer.h21
-rw-r--r--src/mame/includes/super80.h7
-rw-r--r--src/mame/includes/ut88.h8
-rw-r--r--src/mame/includes/z80ne.h4
-rw-r--r--src/mame/machine/dai.cpp30
-rw-r--r--src/mame/machine/fidel_clockdiv.cpp37
-rw-r--r--src/mame/machine/fidel_clockdiv.h4
-rw-r--r--src/mame/machine/mikro80.cpp32
-rw-r--r--src/mame/machine/radio86.cpp30
-rw-r--r--src/mame/machine/sorcerer.cpp28
-rw-r--r--src/mame/machine/super80.cpp30
-rw-r--r--src/mame/machine/ut88.cpp30
-rw-r--r--src/mame/machine/z80ne.cpp60
71 files changed, 1560 insertions, 1084 deletions
diff --git a/src/devices/bus/bbc/tube/tube_32016.cpp b/src/devices/bus/bbc/tube/tube_32016.cpp
index 8d40ec56eb8..4040330dc89 100644
--- a/src/devices/bus/bbc/tube/tube_32016.cpp
+++ b/src/devices/bus/bbc/tube/tube_32016.cpp
@@ -21,6 +21,7 @@
#include "emu.h"
#include "tube_32016.h"
+
#include "softlist_dev.h"
@@ -242,18 +243,23 @@ void bbc_tube_32016_device::device_reset()
// address map during booting
program.install_rom(0x000000, 0x007fff, 0xff8000, m_rom->base());
- m_rom_shadow_tap = program.install_write_tap(0x000000, 0xffffff, "rom_shadow_w",[this](offs_t offset, u16 &data, u16 mem_mask)
- {
- // delete this tap
- m_rom_shadow_tap->remove();
-
- // address map after booting
- m_maincpu->space(AS_PROGRAM).nop_readwrite(0x000000, 0xffffff);
- m_maincpu->space(AS_PROGRAM).install_ram(0x000000, m_ram->mask(), 0x7fffff ^ m_ram->mask(), m_ram->pointer());
- m_maincpu->space(AS_PROGRAM).install_rom(0xf00000, 0xf07fff, 0x038000, m_rom->base());
- m_maincpu->space(AS_PROGRAM).install_read_port(0xf90000, 0xf90001, 0x00fffe, "CONFIG");
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfffff0, 0xffffff, read8sm_delegate(*m_ula, FUNC(tube_device::parasite_r)), write8sm_delegate(*m_ula, FUNC(tube_device::parasite_w)), 0xff);
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_write_tap(
+ 0x000000, 0xffffff,
+ "rom_shadow_w",
+ [this] (offs_t offset, u16 &data, u16 mem_mask)
+ {
+ // delete this tap
+ m_rom_shadow_tap.remove();
+
+ // address map after booting
+ m_maincpu->space(AS_PROGRAM).nop_readwrite(0x000000, 0xffffff);
+ m_maincpu->space(AS_PROGRAM).install_ram(0x000000, m_ram->mask(), 0x7fffff ^ m_ram->mask(), m_ram->pointer());
+ m_maincpu->space(AS_PROGRAM).install_rom(0xf00000, 0xf07fff, 0x038000, m_rom->base());
+ m_maincpu->space(AS_PROGRAM).install_read_port(0xf90000, 0xf90001, 0x00fffe, "CONFIG");
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfffff0, 0xffffff, read8sm_delegate(*m_ula, FUNC(tube_device::parasite_r)), write8sm_delegate(*m_ula, FUNC(tube_device::parasite_w)), 0xff);
+ },
+ &m_rom_shadow_tap);
}
diff --git a/src/devices/bus/bbc/tube/tube_32016.h b/src/devices/bus/bbc/tube/tube_32016.h
index 6ffbab30ab1..fc83dd3f09e 100644
--- a/src/devices/bus/bbc/tube/tube_32016.h
+++ b/src/devices/bus/bbc/tube/tube_32016.h
@@ -57,7 +57,7 @@ protected:
required_device<ram_device> m_ram;
required_memory_region m_rom;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
void tube_32016_mem(address_map &map);
};
diff --git a/src/devices/bus/bbc/tube/tube_arm.cpp b/src/devices/bus/bbc/tube/tube_arm.cpp
index fb557357310..7b5c03d86fe 100644
--- a/src/devices/bus/bbc/tube/tube_arm.cpp
+++ b/src/devices/bus/bbc/tube/tube_arm.cpp
@@ -113,14 +113,19 @@ void bbc_tube_arm_device::device_reset()
/* enable the reset vector to be fetched from ROM */
m_maincpu->space(AS_PROGRAM).install_rom(0x000000, 0x003fff, 0x3fc000, m_bootstrap->base());
- m_rom_shadow_tap = program.install_write_tap(0x0000000, 0x03fffff, "rom_shadow_w",[this](offs_t offset, u32 &data, u32 mem_mask)
- {
- /* delete this tap */
- m_rom_shadow_tap->remove();
-
- /* install ram */
- m_maincpu->space(AS_PROGRAM).install_ram(0x0000000, 0x03fffff, m_ram->pointer());
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_write_tap(
+ 0x0000000, 0x03fffff,
+ "rom_shadow_w",
+ [this] (offs_t offset, u32 &data, u32 mem_mask)
+ {
+ /* delete this tap */
+ m_rom_shadow_tap.remove();
+
+ /* install ram */
+ m_maincpu->space(AS_PROGRAM).install_ram(0x0000000, 0x03fffff, m_ram->pointer());
+ },
+ &m_rom_shadow_tap);
}
diff --git a/src/devices/bus/bbc/tube/tube_arm.h b/src/devices/bus/bbc/tube/tube_arm.h
index a8388885840..3c2ecf02d2c 100644
--- a/src/devices/bus/bbc/tube/tube_arm.h
+++ b/src/devices/bus/bbc/tube/tube_arm.h
@@ -47,7 +47,7 @@ private:
required_device<ram_device> m_ram;
required_memory_region m_bootstrap;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
void tube_arm_mem(address_map &map);
};
diff --git a/src/devices/bus/electron/mc68k.cpp b/src/devices/bus/electron/mc68k.cpp
index b0d591f0985..06e39350977 100644
--- a/src/devices/bus/electron/mc68k.cpp
+++ b/src/devices/bus/electron/mc68k.cpp
@@ -30,6 +30,7 @@
#include "emu.h"
#include "mc68k.h"
+
#include "machine/6522via.h"
#include "machine/6850acia.h"
#include "machine/clock.h"
@@ -161,20 +162,22 @@ void electron_mc68k_device::device_reset()
// address map during booting
program.install_rom(0x0000, 0x0fff, m_boot_rom->base());
- m_rom_shadow_tap = program.install_read_tap(0x800000, 0xffffff, "rom_shadow_r", [this](offs_t offset, u16 &data, u16 mem_mask)
- {
- if (!machine().side_effects_disabled())
- {
- // delete this tap
- m_rom_shadow_tap->remove();
-
- // address map after booting
- m_maincpu->space(AS_PROGRAM).install_ram(0x000000, m_ram->mask(), m_ram->pointer());
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0x800000, 0xffffff,
+ "rom_shadow_r",
+ [this] (offs_t offset, u16 &data, u16 mem_mask)
+ {
+ if (!machine().side_effects_disabled())
+ {
+ // delete this tap
+ m_rom_shadow_tap.remove();
+
+ // address map after booting
+ m_maincpu->space(AS_PROGRAM).install_ram(0x000000, m_ram->mask(), m_ram->pointer());
+ }
+ },
+ &m_rom_shadow_tap);
}
//-------------------------------------------------
diff --git a/src/devices/bus/electron/mc68k.h b/src/devices/bus/electron/mc68k.h
index a95223a3f93..c469d06e357 100644
--- a/src/devices/bus/electron/mc68k.h
+++ b/src/devices/bus/electron/mc68k.h
@@ -48,7 +48,7 @@ private:
required_memory_region m_boot_rom;
required_memory_region m_exp_rom;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
void mem_map(address_map &map);
diff --git a/src/devices/bus/vme/vme_cp31.cpp b/src/devices/bus/vme/vme_cp31.cpp
index 130065fb57d..9f5d5d614b0 100644
--- a/src/devices/bus/vme/vme_cp31.cpp
+++ b/src/devices/bus/vme/vme_cp31.cpp
@@ -296,20 +296,22 @@ void vme_cp31_card_device::device_reset()
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x00000000, 0x00000007, m_sysrom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xff000000, 0xff007fff, "rom_shadow_r", [this](offs_t offset, u32 &data, u32 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(0x00000000, 0x00000007, m_p_ram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xff000000, 0xff007fff,
+ "rom_shadow_r",
+ [this] (offs_t offset, u32 &data, u32 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(0x00000000, 0x00000007, m_p_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void vme_cp31_card_device::device_timer(emu_timer &timer, device_timer_id id, int param)
diff --git a/src/devices/bus/vme/vme_cp31.h b/src/devices/bus/vme/vme_cp31.h
index f451e002c0e..5921eef9fe8 100644
--- a/src/devices/bus/vme/vme_cp31.h
+++ b/src/devices/bus/vme/vme_cp31.h
@@ -5,8 +5,9 @@
#pragma once
+#include "vme.h"
+
#include "bus/rs232/rs232.h"
-#include "bus/vme/vme.h"
#include "cpu/m68000/m68000.h"
#include "machine/68153bim.h"
#include "machine/68230pit.h"
@@ -44,7 +45,7 @@ private:
required_region_ptr<uint32_t> m_sysrom;
// Pointer to System ROMs needed by bootvect_r and masking RAM buffer for post reset accesses
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
bool m_bus_error;
emu_timer *m_bus_error_timer;
diff --git a/src/devices/bus/vme/vme_hcpu30.cpp b/src/devices/bus/vme/vme_hcpu30.cpp
index 93ae2c35daa..7aa814794e7 100644
--- a/src/devices/bus/vme/vme_hcpu30.cpp
+++ b/src/devices/bus/vme/vme_hcpu30.cpp
@@ -582,20 +582,22 @@ void vme_hcpu30_card_device::device_reset()
m_fdc->ready_w(false);
program.install_rom(0x00000000, 0x00000007, m_sysrom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xff000000, 0xff007fff, "rom_shadow_r", [this](offs_t offset, u32 &data, u32 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(0x00000000, 0x00000007, m_p_ram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xff000000, 0xff007fff,
+ "rom_shadow_r",
+ [this] (offs_t offset, u32 &data, u32 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(0x00000000, 0x00000007, m_p_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void vme_hcpu30_card_device::device_timer(emu_timer &timer, device_timer_id id, int param)
diff --git a/src/devices/bus/vme/vme_hcpu30.h b/src/devices/bus/vme/vme_hcpu30.h
index 851961b0e60..656e8b716b6 100644
--- a/src/devices/bus/vme/vme_hcpu30.h
+++ b/src/devices/bus/vme/vme_hcpu30.h
@@ -5,10 +5,11 @@
#pragma once
+#include "vme.h"
+
#include "bus/centronics/ctronics.h"
#include "bus/nscsi/hd.h"
#include "bus/rs232/rs232.h"
-#include "bus/vme/vme.h"
#include "cpu/m68000/m68000.h"
#include "imagedev/floppy.h"
#include "machine/clock.h"
@@ -60,7 +61,7 @@ private:
DECLARE_WRITE_LINE_MEMBER(fdcdrq_callback);
// Pointer to System ROMs needed by bootvect_r and masking RAM buffer for post reset accesses
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
uint16_t m_irq_state;
uint16_t m_irq_mask;
uint8_t m_rtc_reg[16];
diff --git a/src/devices/bus/vme/vme_mvme120.cpp b/src/devices/bus/vme/vme_mvme120.cpp
index 0be106f460e..19ddaf9b391 100644
--- a/src/devices/bus/vme/vme_mvme120.cpp
+++ b/src/devices/bus/vme/vme_mvme120.cpp
@@ -235,30 +235,33 @@ void vme_mvme120_device::device_reset()
program.install_rom(0x000000, 0x000007, m_sysrom);
m_memory_read_count = 0;
- m_rom_shadow_tap = program.install_read_tap(0x000000, 0x000007, "rom_shadow_r",[this](offs_t offset, u16 &data, u16 mem_mask)
- {
- rom_shadow_tap(offset, data, mem_mask);
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0x000000, 0x000007,
+ "rom_shadow_r",
+ [this] (offs_t offset, u16 &data, u16 mem_mask)
+ {
+ rom_shadow_tap(offset, data, mem_mask);
+ },
+ &m_rom_shadow_tap);
ctrlreg_w(0, 0xFF); // /RESET flips the latch bits to $FF
}
-uint16_t vme_mvme120_device::rom_shadow_tap(offs_t address, u16 data, u16 mem_mask)
+void vme_mvme120_device::rom_shadow_tap(offs_t address, u16 data, u16 mem_mask)
{
if(!machine().side_effects_disabled())
{
if(m_memory_read_count >= 3)
{
// delete this tap
- m_rom_shadow_tap->remove();
+ m_rom_shadow_tap.remove();
- // reinstall ram over the rom shadow
+ // reinstall RAM over the ROM shadow
m_maincpu->space(AS_PROGRAM).install_ram(0x000000, 0x000007, m_localram);
}
m_memory_read_count++;
}
-
- return data;
}
WRITE_LINE_MEMBER(vme_mvme120_device::watchdog_reset)
diff --git a/src/devices/bus/vme/vme_mvme120.h b/src/devices/bus/vme/vme_mvme120.h
index 1f39456370b..0aeaa8d171d 100644
--- a/src/devices/bus/vme/vme_mvme120.h
+++ b/src/devices/bus/vme/vme_mvme120.h
@@ -61,8 +61,7 @@ protected:
required_ioport m_input_s3;
- memory_passthrough_handler *m_rom_shadow_tap;
- memory_passthrough_handler *m_ram_wwp_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_region_ptr<uint16_t> m_sysrom;
required_shared_ptr<uint16_t> m_localram;
@@ -80,7 +79,7 @@ protected:
uint16_t vme_a16_r();
void vme_a16_w(uint16_t data);
- uint16_t rom_shadow_tap(offs_t address, u16 data, u16 mem_mask);
+ void rom_shadow_tap(offs_t address, u16 data, u16 mem_mask);
DECLARE_WRITE_LINE_MEMBER(watchdog_reset);
DECLARE_WRITE_LINE_MEMBER(mfp_interrupt);
diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp
index 67fcb48db3b..b10ae99b59b 100644
--- a/src/devices/cpu/i386/i386.cpp
+++ b/src/devices/cpu/i386/i386.cpp
@@ -56,7 +56,6 @@ i386_device::i386_device(const machine_config &mconfig, device_type type, const
, device_vtlb_interface(mconfig, *this, AS_PROGRAM)
, m_program_config("program", ENDIANNESS_LITTLE, program_data_width, program_addr_width, 0, 32, 12)
, m_io_config("io", ENDIANNESS_LITTLE, io_data_width, 16, 0)
- , m_dr_breakpoints{nullptr, nullptr, nullptr, nullptr}
, m_smiact(*this)
, m_ferr_handler(*this)
{
@@ -2026,10 +2025,7 @@ void i386_device::i386_common_init()
m_ferr_handler(0);
set_icountptr(m_cycles);
- m_notifier = m_program->add_change_notifier([this](read_or_write mode)
- {
- dri_changed();
- });
+ m_notifier = m_program->add_change_notifier([this] (read_or_write mode) { dri_changed(); });
}
void i386_device::device_start()
diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h
index f9f5f84913d..07522e0fb9d 100644
--- a/src/devices/cpu/i386/i386.h
+++ b/src/devices/cpu/i386/i386.h
@@ -274,8 +274,8 @@ protected:
uint32_t m_dr[8]; // Debug registers
uint32_t m_tr[8]; // Test registers
- memory_passthrough_handler* m_dr_breakpoints[4];
- int m_notifier;
+ memory_passthrough_handler m_dr_breakpoints[4];
+ util::notifier_subscription m_notifier;
//386 Debug Register change handlers.
inline void dri_changed();
diff --git a/src/devices/cpu/i386/i386segs.hxx b/src/devices/cpu/i386/i386segs.hxx
index 9b5eacbf16f..9015d0a3209 100644
--- a/src/devices/cpu/i386/i386segs.hxx
+++ b/src/devices/cpu/i386/i386segs.hxx
@@ -2482,7 +2482,7 @@ inline void i386_device::dri_changed()
if(!(m_dr[7] & 0xff)) return;
for(dr = 0; dr < 4; dr++)
{
- if(m_dr_breakpoints[dr]) m_dr_breakpoints[dr]->remove();
+ m_dr_breakpoints[dr].remove();
int dr_enabled = (m_dr[7] & (1 << (dr << 1))) || (m_dr[7] & (1 << ((dr << 1) + 1))); // Check both local enable AND global enable bits for this breakpoint.
if(dr_enabled)
{
@@ -2512,9 +2512,9 @@ inline void i386_device::dri_changed()
m_dr[6] |= 1 << dr;
i386_trap(1,0,0);
}
- }, m_dr_breakpoints[dr]);
+ }, &m_dr_breakpoints[dr]);
else if(breakpoint_type == 3) m_dr_breakpoints[dr] = m_program->install_readwrite_tap(phys_addr, phys_addr + 3, "i386_debug_readwrite_breakpoint",
- [&, dr, true_mask](offs_t offset, u32& data, u32 mem_mask)
+ [this, dr, true_mask](offs_t offset, u32& data, u32 mem_mask)
{
if(true_mask & mem_mask)
{
@@ -2522,14 +2522,14 @@ inline void i386_device::dri_changed()
i386_trap(1,0,0);
}
},
- [&, dr, true_mask](offs_t offset, u32& data, u32 mem_mask)
+ [this, dr, true_mask](offs_t offset, u32& data, u32 mem_mask)
{
if(true_mask & mem_mask)
{
m_dr[6] |= 1 << dr;
i386_trap(1,0,0);
}
- }, m_dr_breakpoints[dr]);
+ }, &m_dr_breakpoints[dr]);
}
}
}
diff --git a/src/emu/debug/debugcpu.cpp b/src/emu/debug/debugcpu.cpp
index 403d0b104ee..b4689bc9892 100644
--- a/src/emu/debug/debugcpu.cpp
+++ b/src/emu/debug/debugcpu.cpp
@@ -458,14 +458,14 @@ device_debug::device_debug(device_t &device)
// set up notifiers and clear the passthrough handlers
if (m_memory) {
int count = m_memory->max_space_count();
- m_phw.resize(count, nullptr);
+ m_phw.resize(count);
for (int i=0; i != count; i++)
if (m_memory->has_space(i)) {
address_space &space = m_memory->space(i);
- m_notifiers.push_back(space.add_change_notifier([this, &space](read_or_write mode) { reinstall(space, mode); }));
+ m_notifiers.emplace_back(space.add_change_notifier([this, &space] (read_or_write mode) { reinstall(space, mode); }));
}
else
- m_notifiers.push_back(-1);
+ m_notifiers.emplace_back();
}
// set up state-related stuff
@@ -562,15 +562,14 @@ void device_debug::reinstall(address_space &space, read_or_write mode)
int id = space.spacenum();
if (u32(mode) & u32(read_or_write::WRITE))
{
- if (m_phw[id])
- m_phw[id]->remove();
+ m_phw[id].remove();
if (m_track_mem)
switch (space.data_width())
{
- case 8: m_phw[id] = space.install_write_tap(0, space.addrmask(), "track_mem", [this, &space](offs_t address, u8 &data, u8 ) { write_tracking(space, address, data); }, m_phw[id]); break;
- case 16: m_phw[id] = space.install_write_tap(0, space.addrmask(), "track_mem", [this, &space](offs_t address, u16 &data, u16) { write_tracking(space, address, data); }, m_phw[id]); break;
- case 32: m_phw[id] = space.install_write_tap(0, space.addrmask(), "track_mem", [this, &space](offs_t address, u32 &data, u32) { write_tracking(space, address, data); }, m_phw[id]); break;
- case 64: m_phw[id] = space.install_write_tap(0, space.addrmask(), "track_mem", [this, &space](offs_t address, u64 &data, u64) { write_tracking(space, address, data); }, m_phw[id]); break;
+ case 8: m_phw[id] = space.install_write_tap(0, space.addrmask(), "track_mem", [this, &space] (offs_t address, u8 &data, u8 ) { write_tracking(space, address, data); }, &m_phw[id]); break;
+ case 16: m_phw[id] = space.install_write_tap(0, space.addrmask(), "track_mem", [this, &space] (offs_t address, u16 &data, u16) { write_tracking(space, address, data); }, &m_phw[id]); break;
+ case 32: m_phw[id] = space.install_write_tap(0, space.addrmask(), "track_mem", [this, &space] (offs_t address, u32 &data, u32) { write_tracking(space, address, data); }, &m_phw[id]); break;
+ case 64: m_phw[id] = space.install_write_tap(0, space.addrmask(), "track_mem", [this, &space] (offs_t address, u64 &data, u64) { write_tracking(space, address, data); }, &m_phw[id]); break;
}
}
}
diff --git a/src/emu/debug/debugcpu.h b/src/emu/debug/debugcpu.h
index 9e3d23d8d7f..a7d266df1e8 100644
--- a/src/emu/debug/debugcpu.h
+++ b/src/emu/debug/debugcpu.h
@@ -239,10 +239,10 @@ private:
// (0 = not tracing over,
// ~0 = not currently tracing over)
};
- std::unique_ptr<tracer> m_trace; // tracer state
+ std::unique_ptr<tracer> m_trace; // tracer state
- std::vector<memory_passthrough_handler *> m_phw; // passthrough handler reference for each space, write mode
- std::vector<int> m_notifiers; // notifiers for each space
+ std::vector<memory_passthrough_handler> m_phw; // passthrough handler reference for each space, write mode
+ std::vector<util::notifier_subscription> m_notifiers; // notifiers for each space
// pc tracking
class dasm_pc_tag
diff --git a/src/emu/debug/express.cpp b/src/emu/debug/express.cpp
index 8363928e5cb..f9074147b7b 100644
--- a/src/emu/debug/express.cpp
+++ b/src/emu/debug/express.cpp
@@ -387,10 +387,10 @@ void symbol_table::set_memory_modified_func(memory_modified_func modified)
// add - add a new u64 pointer symbol
//-------------------------------------------------
-void symbol_table::add(const char *name, read_write rw, u64 *ptr)
+symbol_entry &symbol_table::add(const char *name, read_write rw, u64 *ptr)
{
m_symlist.erase(name);
- m_symlist.emplace(name, std::make_unique<integer_symbol_entry>(*this, name, rw, ptr));
+ return *m_symlist.emplace(name, std::make_unique<integer_symbol_entry>(*this, name, rw, ptr)).first->second;
}
@@ -398,10 +398,10 @@ void symbol_table::add(const char *name, read_write rw, u64 *ptr)
// add - add a new value symbol
//-------------------------------------------------
-void symbol_table::add(const char *name, u64 value)
+symbol_entry &symbol_table::add(const char *name, u64 value)
{
m_symlist.erase(name);
- m_symlist.emplace(name, std::make_unique<integer_symbol_entry>(*this, name, value));
+ return *m_symlist.emplace(name, std::make_unique<integer_symbol_entry>(*this, name, value)).first->second;
}
@@ -409,10 +409,10 @@ void symbol_table::add(const char *name, u64 value)
// add - add a new register symbol
//-------------------------------------------------
-void symbol_table::add(const char *name, getter_func getter, setter_func setter, const std::string &format_string)
+symbol_entry &symbol_table::add(const char *name, getter_func getter, setter_func setter, const std::string &format_string)
{
m_symlist.erase(name);
- m_symlist.emplace(name, std::make_unique<integer_symbol_entry>(*this, name, getter, setter, format_string));
+ return *m_symlist.emplace(name, std::make_unique<integer_symbol_entry>(*this, name, getter, setter, format_string)).first->second;
}
@@ -420,10 +420,10 @@ void symbol_table::add(const char *name, getter_func getter, setter_func setter,
// add - add a new function symbol
//-------------------------------------------------
-void symbol_table::add(const char *name, int minparams, int maxparams, execute_func execute)
+symbol_entry &symbol_table::add(const char *name, int minparams, int maxparams, execute_func execute)
{
m_symlist.erase(name);
- m_symlist.emplace(name, std::make_unique<function_symbol_entry>(*this, name, minparams, maxparams, execute));
+ return *m_symlist.emplace(name, std::make_unique<function_symbol_entry>(*this, name, minparams, maxparams, execute)).first->second;
}
diff --git a/src/emu/debug/express.h b/src/emu/debug/express.h
index 23284193f47..74b52710959 100644
--- a/src/emu/debug/express.h
+++ b/src/emu/debug/express.h
@@ -175,15 +175,16 @@ public:
// getters
const std::unordered_map<std::string, std::unique_ptr<symbol_entry>> &entries() const { return m_symlist; }
symbol_table *parent() const { return m_parent; }
+ running_machine &machine() { return m_machine; }
// setters
void set_memory_modified_func(memory_modified_func modified);
// symbol access
- void add(const char *name, read_write rw, u64 *ptr = nullptr);
- void add(const char *name, u64 constvalue);
- void add(const char *name, getter_func getter, setter_func setter = nullptr, const std::string &format_string = "");
- void add(const char *name, int minparams, int maxparams, execute_func execute);
+ symbol_entry &add(const char *name, read_write rw, u64 *ptr = nullptr);
+ symbol_entry &add(const char *name, u64 constvalue);
+ symbol_entry &add(const char *name, getter_func getter, setter_func setter = nullptr, const std::string &format_string = "");
+ symbol_entry &add(const char *name, int minparams, int maxparams, execute_func execute);
symbol_entry *find(const char *name) const { if (name) { auto search = m_symlist.find(name); if (search != m_symlist.end()) return search->second.get(); else return nullptr; } else return nullptr; }
symbol_entry *find_deep(const char *name);
diff --git a/src/emu/debug/points.cpp b/src/emu/debug/points.cpp
index d4c1ebb3045..418dc7647aa 100644
--- a/src/emu/debug/points.cpp
+++ b/src/emu/debug/points.cpp
@@ -184,11 +184,9 @@ debug_watchpoint::debug_watchpoint(
debug_watchpoint::~debug_watchpoint()
{
- m_space.remove_change_notifier(m_notifier);
- if (m_phr)
- m_phr->remove();
- if (m_phw)
- m_phw->remove();
+ m_notifier.reset();
+ m_phr.remove();
+ m_phw.remove();
}
void debug_watchpoint::setEnabled(bool value)
@@ -201,10 +199,8 @@ void debug_watchpoint::setEnabled(bool value)
else
{
m_installing = true;
- if(m_phr)
- m_phr->remove();
- if(m_phw)
- m_phw->remove();
+ m_phr.remove();
+ m_phw.remove();
m_installing = false;
}
}
@@ -215,24 +211,28 @@ void debug_watchpoint::install(read_or_write mode)
if (m_installing)
return;
m_installing = true;
- if ((u32(mode) & u32(read_or_write::READ)) && m_phr)
- m_phr->remove();
- if ((u32(mode) & u32(read_or_write::WRITE)) && m_phw)
- m_phw->remove();
+ if (u32(mode) & u32(read_or_write::READ))
+ m_phr.remove();
+ if (u32(mode) & u32(read_or_write::WRITE))
+ m_phw.remove();
std::string name = util::string_format("wp@%x", m_address);
switch (m_space.data_width())
{
case 8:
if (u32(m_type) & u32(mode) & u32(read_or_write::READ))
- m_phr = m_space.install_read_tap(m_start_address[0], m_end_address[0], name,
- [this](offs_t offset, u8 &data, u8 mem_mask) {
- triggered(read_or_write::READ, offset, data, mem_mask);
- }, m_phr);
+ m_phr = m_space.install_read_tap(
+ m_start_address[0], m_end_address[0], name,
+ [this](offs_t offset, u8 &data, u8 mem_mask) {
+ triggered(read_or_write::READ, offset, data, mem_mask);
+ },
+ &m_phr);
if (u32(m_type) & u32(mode) & u32(read_or_write::WRITE))
- m_phw = m_space.install_write_tap(m_start_address[0], m_end_address[0], name,
- [this](offs_t offset, u8 &data, u8 mem_mask) {
- triggered(read_or_write::WRITE, offset, data, mem_mask);
- }, m_phw);
+ m_phw = m_space.install_write_tap(
+ m_start_address[0], m_end_address[0], name,
+ [this](offs_t offset, u8 &data, u8 mem_mask) {
+ triggered(read_or_write::WRITE, offset, data, mem_mask);
+ },
+ &m_phw);
break;
case 16:
@@ -241,17 +241,21 @@ void debug_watchpoint::install(read_or_write mode)
{
u16 mask = m_masks[i];
if (u32(m_type) & u32(mode) & u32(read_or_write::READ))
- m_phr = m_space.install_read_tap(m_start_address[i], m_end_address[i], name,
- [this, mask](offs_t offset, u16 &data, u16 mem_mask) {
- if (mem_mask & mask)
- triggered(read_or_write::READ, offset, data, mem_mask);
- }, m_phr);
+ m_phr = m_space.install_read_tap(
+ m_start_address[i], m_end_address[i], name,
+ [this, mask](offs_t offset, u16 &data, u16 mem_mask) {
+ if (mem_mask & mask)
+ triggered(read_or_write::READ, offset, data, mem_mask);
+ },
+ &m_phr);
if (u32(m_type) & u32(mode) & u32(read_or_write::WRITE))
- m_phw = m_space.install_write_tap(m_start_address[i], m_end_address[i], name,
- [this, mask](offs_t offset, u16 &data, u16 mem_mask) {
- if (mem_mask & mask)
- triggered(read_or_write::WRITE, offset, data, mem_mask);
- }, m_phw);
+ m_phw = m_space.install_write_tap(
+ m_start_address[i], m_end_address[i], name,
+ [this, mask](offs_t offset, u16 &data, u16 mem_mask) {
+ if (mem_mask & mask)
+ triggered(read_or_write::WRITE, offset, data, mem_mask);
+ },
+ &m_phw);
}
break;
@@ -261,17 +265,21 @@ void debug_watchpoint::install(read_or_write mode)
{
u32 mask = m_masks[i];
if (u32(m_type) & u32(mode) & u32(read_or_write::READ))
- m_phr = m_space.install_read_tap(m_start_address[i], m_end_address[i], name,
- [this, mask](offs_t offset, u32 &data, u32 mem_mask) {
- if (mem_mask & mask)
- triggered(read_or_write::READ, offset, data, mem_mask);
- }, m_phr);
+ m_phr = m_space.install_read_tap(
+ m_start_address[i], m_end_address[i], name,
+ [this, mask](offs_t offset, u32 &data, u32 mem_mask) {
+ if (mem_mask & mask)
+ triggered(read_or_write::READ, offset, data, mem_mask);
+ },
+ &m_phr);
if (u32(m_type) & u32(mode) & u32(read_or_write::WRITE))
- m_phw = m_space.install_write_tap(m_start_address[i], m_end_address[i], name,
- [this, mask](offs_t offset, u32 &data, u32 mem_mask) {
- if (mem_mask & mask)
- triggered(read_or_write::WRITE, offset, data, mem_mask);
- }, m_phw);
+ m_phw = m_space.install_write_tap(
+ m_start_address[i], m_end_address[i], name,
+ [this, mask](offs_t offset, u32 &data, u32 mem_mask) {
+ if (mem_mask & mask)
+ triggered(read_or_write::WRITE, offset, data, mem_mask);
+ },
+ &m_phw);
}
break;
@@ -281,17 +289,20 @@ void debug_watchpoint::install(read_or_write mode)
{
u64 mask = m_masks[i];
if (u32(m_type) & u32(mode) & u32(read_or_write::READ))
- m_phr = m_space.install_read_tap(m_start_address[i], m_end_address[i], name,
- [this, mask](offs_t offset, u64 &data, u64 mem_mask) {
- if (mem_mask & mask)
- triggered(read_or_write::READ, offset, data, mem_mask);
- }, m_phr);
+ m_phr = m_space.install_read_tap(
+ m_start_address[i], m_end_address[i], name,
+ [this, mask](offs_t offset, u64 &data, u64 mem_mask) {
+ if (mem_mask & mask)
+ triggered(read_or_write::READ, offset, data, mem_mask);
+ },
+ &m_phr);
if (u32(m_type) & u32(mode) & u32(read_or_write::WRITE))
m_phw = m_space.install_write_tap(m_start_address[i], m_end_address[i], name,
- [this, mask](offs_t offset, u64 &data, u64 mem_mask) {
- if (mem_mask & mask)
- triggered(read_or_write::WRITE, offset, data, mem_mask);
- }, m_phw);
+ [this, mask](offs_t offset, u64 &data, u64 mem_mask) {
+ if (mem_mask & mask)
+ triggered(read_or_write::WRITE, offset, data, mem_mask);
+ },
+ &m_phw);
}
break;
}
diff --git a/src/emu/debug/points.h b/src/emu/debug/points.h
index 84cdad7720b..62ad953626c 100644
--- a/src/emu/debug/points.h
+++ b/src/emu/debug/points.h
@@ -102,8 +102,8 @@ private:
void triggered(read_or_write type, offs_t address, u64 data, u64 mem_mask);
device_debug * m_debugInterface; // the interface we were created from
- memory_passthrough_handler *m_phr; // passthrough handler reference, read access
- memory_passthrough_handler *m_phw; // passthrough handler reference, write access
+ memory_passthrough_handler m_phr; // passthrough handler reference, read access
+ memory_passthrough_handler m_phw; // passthrough handler reference, write access
address_space & m_space; // address space
int m_index; // user reported index
bool m_enabled; // enabled?
@@ -112,7 +112,7 @@ private:
offs_t m_length; // length of watch area
parsed_expression m_condition; // condition
std::string m_action; // action
- int m_notifier; // address map change notifier id
+ util::notifier_subscription m_notifier; // address map change notifier ID
offs_t m_start_address[3]; // the start addresses of the checks to install
offs_t m_end_address[3]; // the end addresses
diff --git a/src/emu/emu.h b/src/emu/emu.h
index 6ab48540666..67d879cd772 100644
--- a/src/emu/emu.h
+++ b/src/emu/emu.h
@@ -18,6 +18,9 @@
#ifndef __EMU_H__
#define __EMU_H__
+// get forward declarations before anything else
+#include "emufwd.h"
+
#include <list>
#include <forward_list>
#include <vector>
diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp
index 3982debf2cc..b08657c9087 100644
--- a/src/emu/emumem.cpp
+++ b/src/emu/emumem.cpp
@@ -865,62 +865,62 @@ void address_space_installer::populate_map_entry(const address_map_entry &entry,
-memory_passthrough_handler *address_space_installer::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 8-bits wide bus read tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 16-bits wide bus read tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 32-bits wide bus read tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 64-bits wide bus read tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 8-bits wide bus write tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 16-bits wide bus write tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 32-bits wide bus write tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 64-bits wide bus write tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapr, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapw, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapr, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapw, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 8-bits wide bus read/write tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapr, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapw, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapr, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapw, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 16-bits wide bus read/write tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapr, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapr, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph)
{
fatalerror("Tryingw to install a 32-bits wide bus read/write tap in a %d-bits wide bus\n", data_width());
}
-memory_passthrough_handler *address_space_installer::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapr, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapw, memory_passthrough_handler *mph)
+memory_passthrough_handler address_space_installer::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapr, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapw, memory_passthrough_handler *mph)
{
fatalerror("Trying to install a 64-bits wide bus read/write tap in a %d-bits wide bus\n", data_width());
}
diff --git a/src/emu/emumem.h b/src/emu/emumem.h
index 3d4d664469e..3e01ecfc121 100644
--- a/src/emu/emumem.h
+++ b/src/emu/emumem.h
@@ -17,6 +17,8 @@
#ifndef MAME_EMU_EMUMEM_H
#define MAME_EMU_EMUMEM_H
+#include "notifier.h"
+
#include <optional>
#include <set>
#include <type_traits>
@@ -50,6 +52,14 @@ enum class read_or_write
};
+//**************************************************************************
+// FORWARD DECLARATIONS
+//**************************************************************************
+
+class handler_entry;
+template<int Width, int AddrShift> class handler_entry_read_passthrough;
+template<int Width, int AddrShift> class handler_entry_write_passthrough;
+
//**************************************************************************
// TYPE DEFINITIONS
@@ -90,7 +100,7 @@ struct memory_entry_context {
struct memory_entry {
offs_t start, end;
- class handler_entry *entry;
+ handler_entry *entry;
std::vector<memory_entry_context> context;
};
@@ -465,6 +475,29 @@ constexpr int handler_entry_dispatch_lowbits(int highbits, int width, int ashift
width + ashift;
}
+
+// =====================-> Passthrough handler management structure
+
+class memory_passthrough_handler_impl
+{
+public:
+ memory_passthrough_handler_impl(address_space &space) : m_space(space) {}
+ memory_passthrough_handler_impl(memory_passthrough_handler_impl const &) = delete;
+
+ void remove();
+
+private:
+ address_space &m_space;
+ std::unordered_set<handler_entry *> m_handlers;
+
+ void add_handler(handler_entry *handler) { m_handlers.insert(handler); }
+ void remove_handler(handler_entry *handler) { m_handlers.erase(m_handlers.find(handler)); }
+
+ friend address_space;
+ template<int Width, int AddrShift> friend class ::handler_entry_read_passthrough;
+ template<int Width, int AddrShift> friend class ::handler_entry_write_passthrough;
+};
+
} // namespace emu::detail
@@ -561,8 +594,6 @@ protected:
// Provides the populate/read/get_ptr/lookup API
-template<int Width, int AddrShift> class handler_entry_read_passthrough;
-
template<int Width, int AddrShift> class handler_entry_read : public handler_entry
{
public:
@@ -596,7 +627,7 @@ public:
virtual void populate_nomirror(offs_t start, offs_t end, offs_t ostart, offs_t oend, handler_entry_read<Width, AddrShift> *handler);
virtual void populate_mirror(offs_t start, offs_t end, offs_t ostart, offs_t oend, offs_t mirror, handler_entry_read<Width, AddrShift> *handler);
- inline void populate_mismatched(offs_t start, offs_t end, offs_t mirror, const memory_units_descriptor<Width, AddrShift> &descriptor) {
+ void populate_mismatched(offs_t start, offs_t end, offs_t mirror, const memory_units_descriptor<Width, AddrShift> &descriptor) {
start &= ~NATIVE_MASK;
end |= NATIVE_MASK;
std::vector<mapping> mappings;
@@ -609,7 +640,7 @@ public:
virtual void populate_mismatched_nomirror(offs_t start, offs_t end, offs_t ostart, offs_t oend, const memory_units_descriptor<Width, AddrShift> &descriptor, u8 rkey, std::vector<mapping> &mappings);
virtual void populate_mismatched_mirror(offs_t start, offs_t end, offs_t ostart, offs_t oend, offs_t mirror, const memory_units_descriptor<Width, AddrShift> &descriptor, std::vector<mapping> &mappings);
- inline void populate_passthrough(offs_t start, offs_t end, offs_t mirror, handler_entry_read_passthrough<Width, AddrShift> *handler) {
+ void populate_passthrough(offs_t start, offs_t end, offs_t mirror, handler_entry_read_passthrough<Width, AddrShift> *handler) {
start &= ~NATIVE_MASK;
end |= NATIVE_MASK;
std::vector<mapping> mappings;
@@ -636,8 +667,6 @@ public:
// Provides the populate/write/get_ptr/lookup API
-template<int Width, int AddrShift> class handler_entry_write_passthrough;
-
template<int Width, int AddrShift> class handler_entry_write : public handler_entry
{
public:
@@ -711,20 +740,21 @@ public:
// =====================-> Passthrough handler management structure
class memory_passthrough_handler
{
- template<int Width, int AddrShift> friend class handler_entry_read_passthrough;
- template<int Width, int AddrShift> friend class handler_entry_write_passthrough;
-
public:
- memory_passthrough_handler(address_space &space) : m_space(space) {}
+ memory_passthrough_handler() : m_impl() {}
+ memory_passthrough_handler(std::shared_ptr<emu::detail::memory_passthrough_handler_impl> const &impl) : m_impl(impl) {}
- inline void remove();
+ void remove()
+ {
+ auto impl(m_impl.lock());
+ if (impl)
+ impl->remove();
+ }
private:
- address_space &m_space;
- std::unordered_set<handler_entry *> m_handlers;
+ std::weak_ptr<emu::detail::memory_passthrough_handler_impl> m_impl;
- void add_handler(handler_entry *handler) { m_handlers.insert(handler); }
- void remove_handler(handler_entry *handler) { m_handlers.erase(m_handlers.find(handler)); }
+ friend class address_space;
};
// =====================-> Forward declaration for address_space
@@ -1687,32 +1717,32 @@ public:
virtual void install_device_delegate(offs_t addrstart, offs_t addrend, device_t &device, address_map_constructor &map, u64 unitmask = 0, int cswidth = 0, u16 flags = 0) = 0;
// install taps without mirroring
- memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_read_tap(addrstart, addrend, 0, name, tap, mph); }
- memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_read_tap(addrstart, addrend, 0, name, tap, mph); }
- memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_read_tap(addrstart, addrend, 0, name, tap, mph); }
- memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_read_tap(addrstart, addrend, 0, name, tap, mph); }
- memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_write_tap(addrstart, addrend, 0, name, tap, mph); }
- memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_write_tap(addrstart, addrend, 0, name, tap, mph); }
- memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_write_tap(addrstart, addrend, 0, name, tap, mph); }
- memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_write_tap(addrstart, addrend, 0, name, tap, mph); }
- memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapr, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr) { return install_readwrite_tap(addrstart, addrend, 0, name, tapr, tapw, mph); }
- memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapr, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr) { return install_readwrite_tap(addrstart, addrend, 0, name, tapr, tapw, mph); }
- memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapr, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr) { return install_readwrite_tap(addrstart, addrend, 0, name, tapr, tapw, mph); }
- memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapr, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr) { return install_readwrite_tap(addrstart, addrend, 0, name, tapr, tapw, mph); }
+ memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_read_tap(addrstart, addrend, 0, name, tap, mph); }
+ memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_read_tap(addrstart, addrend, 0, name, tap, mph); }
+ memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_read_tap(addrstart, addrend, 0, name, tap, mph); }
+ memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_read_tap(addrstart, addrend, 0, name, tap, mph); }
+ memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_write_tap(addrstart, addrend, 0, name, tap, mph); }
+ memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_write_tap(addrstart, addrend, 0, name, tap, mph); }
+ memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_write_tap(addrstart, addrend, 0, name, tap, mph); }
+ memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph = nullptr) { return install_write_tap(addrstart, addrend, 0, name, tap, mph); }
+ memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapr, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr) { return install_readwrite_tap(addrstart, addrend, 0, name, tapr, tapw, mph); }
+ memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapr, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr) { return install_readwrite_tap(addrstart, addrend, 0, name, tapr, tapw, mph); }
+ memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapr, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr) { return install_readwrite_tap(addrstart, addrend, 0, name, tapr, tapw, mph); }
+ memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapr, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr) { return install_readwrite_tap(addrstart, addrend, 0, name, tapr, tapw, mph); }
// install taps with mirroring
- virtual memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapr, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapr, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapr, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr);
- virtual memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapr, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tap, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapr, std::function<void (offs_t offset, u8 &data, u8 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapr, std::function<void (offs_t offset, u16 &data, u16 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapr, std::function<void (offs_t offset, u32 &data, u32 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr);
+ virtual memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapr, std::function<void (offs_t offset, u64 &data, u64 mem_mask)> tapw, memory_passthrough_handler *mph = nullptr);
// install views
void install_view(offs_t addrstart, offs_t addrend, memory_view &view) { install_view(addrstart, addrend, 0, view); }
@@ -1918,11 +1948,6 @@ class address_space : public address_space_installer
template<int Width, int AddrShift> friend class handler_entry_read_unmapped;
template<int Width, int AddrShift> friend class handler_entry_write_unmapped;
- struct notifier_t {
- std::function<void (read_or_write)> m_notifier;
- int m_id;
- };
-
protected:
// construction/destruction
address_space(memory_manager &manager, device_memory_interface &memory, int spacenum);
@@ -1962,15 +1987,14 @@ public:
v.set(this, get_specific_info());
}
- int add_change_notifier(std::function<void (read_or_write)> n);
- void remove_change_notifier(int id);
+ util::notifier_subscription add_change_notifier(delegate<void (read_or_write)> &&n);
+ template <typename T> util::notifier_subscription add_change_notifier(T &&n) { return add_change_notifier(delegate<void (read_or_write)>(std::forward<T>(n))); }
void invalidate_caches(read_or_write mode) {
if(u32(mode) & ~m_in_notification) {
u32 old = m_in_notification;
m_in_notification |= u32(mode);
- for(const auto &n : m_notifiers)
- n.m_notifier(mode);
+ m_notifiers(mode);
m_in_notification = old;
}
}
@@ -1981,7 +2005,7 @@ public:
u64 unmap() const { return m_unmap; }
- memory_passthrough_handler *make_mph();
+ std::shared_ptr<emu::detail::memory_passthrough_handler_impl> make_mph(memory_passthrough_handler *mph);
// debug helpers
virtual std::string get_handler_string(read_or_write readorwrite, offs_t byteaddress) const = 0;
@@ -2088,10 +2112,9 @@ protected:
handler_entry *m_nop_r;
handler_entry *m_nop_w;
- std::vector<std::unique_ptr<memory_passthrough_handler>> m_mphs;
+ std::vector<std::shared_ptr<emu::detail::memory_passthrough_handler_impl>> m_mphs;
- std::vector<notifier_t> m_notifiers; // notifier list for address map change
- int m_notifier_id; // next notifier id
+ util::notifier<read_or_write> m_notifiers; // notifier list for address map change
u32 m_in_notification; // notification(s) currently being done
};
@@ -2397,7 +2420,7 @@ write_native(offs_t address, typename emu::detail::handler_entry_size<Width>::uX
m_cache_w->write(address, data, mask);
}
-void memory_passthrough_handler::remove()
+inline void emu::detail::memory_passthrough_handler_impl::remove()
{
m_space.remove_passthrough(m_handlers);
}
diff --git a/src/emu/emumem_aspace.cpp b/src/emu/emumem_aspace.cpp
index 5aeea17c11a..cf7302ce104 100644
--- a/src/emu/emumem_aspace.cpp
+++ b/src/emu/emumem_aspace.cpp
@@ -292,9 +292,9 @@ public:
using address_space::install_write_tap;
using address_space::install_readwrite_tap;
- virtual memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph) override;
- virtual memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph) override;
- virtual memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapr, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapw, memory_passthrough_handler *mph) override;
+ virtual memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph) override;
+ virtual memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph) override;
+ virtual memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapr, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapw, memory_passthrough_handler *mph) override;
// construction/destruction
address_space_specific(memory_manager &manager, device_memory_interface &memory, int spacenum, int address_width)
@@ -810,7 +810,6 @@ address_space::address_space(memory_manager &manager, device_memory_interface &m
m_spacenum(spacenum),
m_log_unmap(true),
m_name(memory.space_config(spacenum)->name()),
- m_notifier_id(0),
m_in_notification(0)
{
}
@@ -1084,73 +1083,78 @@ template<int Level, int Width, int AddrShift, endianness_t Endian> void address_
view.make_subdispatch(""); // Must be called after populate
}
-memory_passthrough_handler *address_space::make_mph()
+std::shared_ptr<emu::detail::memory_passthrough_handler_impl> address_space::make_mph(memory_passthrough_handler *mph)
{
- m_mphs.emplace_back(std::make_unique<memory_passthrough_handler>(*this));
- return m_mphs.back().get();
+ if (mph)
+ {
+ auto impl(mph->m_impl.lock());
+ if (impl)
+ {
+ assert(&impl->m_space == this);
+ return impl;
+ }
+ }
+ return m_mphs.emplace_back(std::make_shared<emu::detail::memory_passthrough_handler_impl>(*this));
}
//-------------------------------------------------
// install_read_tap - install a read tap on the bus
//-------------------------------------------------
-template<int Level, int Width, int AddrShift, endianness_t Endian> memory_passthrough_handler *address_space_specific<Level, Width, AddrShift, Endian>::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph)
+template<int Level, int Width, int AddrShift, endianness_t Endian> memory_passthrough_handler address_space_specific<Level, Width, AddrShift, Endian>::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph)
{
offs_t nstart, nend, nmask, nmirror;
check_optimize_mirror("install_read_tap", addrstart, addrend, addrmirror, nstart, nend, nmask, nmirror);
- if (!mph)
- mph = make_mph();
+ auto impl = make_mph(mph);
- auto handler = new handler_entry_read_tap<Width, AddrShift>(this, *mph, name, tap);
+ auto handler = new handler_entry_read_tap<Width, AddrShift>(this, *impl, name, tap);
m_root_read->populate_passthrough(nstart, nend, nmirror, handler);
handler->unref();
invalidate_caches(read_or_write::READ);
- return mph;
+ return impl;
}
//-------------------------------------------------
// install_write_tap - install a write tap on the bus
//-------------------------------------------------
-template<int Level, int Width, int AddrShift, endianness_t Endian> memory_passthrough_handler *address_space_specific<Level, Width, AddrShift, Endian>::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph)
+template<int Level, int Width, int AddrShift, endianness_t Endian> memory_passthrough_handler address_space_specific<Level, Width, AddrShift, Endian>::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph)
{
offs_t nstart, nend, nmask, nmirror;
check_optimize_mirror("install_write_tap", addrstart, addrend, addrmirror, nstart, nend, nmask, nmirror);
- if (!mph)
- mph = make_mph();
+ auto impl = make_mph(mph);
- auto handler = new handler_entry_write_tap<Width, AddrShift>(this, *mph, name, tap);
+ auto handler = new handler_entry_write_tap<Width, AddrShift>(this, *impl, name, tap);
m_root_write->populate_passthrough(nstart, nend, nmirror, handler);
handler->unref();
invalidate_caches(read_or_write::WRITE);
- return mph;
+ return impl;
}
//-------------------------------------------------
// install_write_tap - install a read and a write tap on the bus
//-------------------------------------------------
-template<int Level, int Width, int AddrShift, endianness_t Endian> memory_passthrough_handler *address_space_specific<Level, Width, AddrShift, Endian>::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapr, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapw, memory_passthrough_handler *mph)
+template<int Level, int Width, int AddrShift, endianness_t Endian> memory_passthrough_handler address_space_specific<Level, Width, AddrShift, Endian>::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapr, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapw, memory_passthrough_handler *mph)
{
offs_t nstart, nend, nmask, nmirror;
check_optimize_mirror("install_readwrite_tap", addrstart, addrend, addrmirror, nstart, nend, nmask, nmirror);
- if (!mph)
- mph = make_mph();
+ auto impl = make_mph(mph);
- auto rhandler = new handler_entry_read_tap <Width, AddrShift>(this, *mph, name, tapr);
+ auto rhandler = new handler_entry_read_tap <Width, AddrShift>(this, *impl, name, tapr);
m_root_read ->populate_passthrough(nstart, nend, nmirror, rhandler);
rhandler->unref();
- auto whandler = new handler_entry_write_tap<Width, AddrShift>(this, *mph, name, tapw);
+ auto whandler = new handler_entry_write_tap<Width, AddrShift>(this, *impl, name, tapw);
m_root_write->populate_passthrough(nstart, nend, nmirror, whandler);
whandler->unref();
invalidate_caches(read_or_write::READWRITE);
- return mph;
+ return impl;
}
@@ -1291,19 +1295,7 @@ template<int Level, int Width, int AddrShift, endianness_t Endian> void address_
// MEMORY MAPPING HELPERS
//**************************************************************************
-int address_space::add_change_notifier(std::function<void (read_or_write)> n)
+util::notifier_subscription address_space::add_change_notifier(delegate<void (read_or_write)> &&n)
{
- int id = m_notifier_id++;
- m_notifiers.emplace_back(notifier_t{ std::move(n), id });
- return id;
-}
-
-void address_space::remove_change_notifier(int id)
-{
- for(auto i = m_notifiers.begin(); i != m_notifiers.end(); i++)
- if (i->m_id == id) {
- m_notifiers.erase(i);
- return;
- }
- fatalerror("Unknown notifier id %d, double remove?\n", id);
+ return m_notifiers.subscribe(std::move(n));
}
diff --git a/src/emu/emumem_hep.h b/src/emu/emumem_hep.h
index 60fc422b72e..a98b44c267d 100644
--- a/src/emu/emumem_hep.h
+++ b/src/emu/emumem_hep.h
@@ -10,7 +10,7 @@ template<int Width, int AddrShift> class handler_entry_read_passthrough : public
public:
using uX = typename emu::detail::handler_entry_size<Width>::uX;
- handler_entry_read_passthrough(address_space *space, memory_passthrough_handler &mph) : handler_entry_read<Width, AddrShift>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(nullptr) {}
+ handler_entry_read_passthrough(address_space *space, emu::detail::memory_passthrough_handler_impl &mph) : handler_entry_read<Width, AddrShift>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(nullptr) {}
~handler_entry_read_passthrough();
virtual handler_entry_read_passthrough<Width, AddrShift> *instantiate(handler_entry_read<Width, AddrShift> *next) const = 0;
@@ -20,10 +20,10 @@ public:
void detach(const std::unordered_set<handler_entry *> &handlers) override;
protected:
- memory_passthrough_handler &m_mph;
+ emu::detail::memory_passthrough_handler_impl &m_mph;
handler_entry_read<Width, AddrShift> *m_next;
- handler_entry_read_passthrough(address_space *space, memory_passthrough_handler &mph, handler_entry_read<Width, AddrShift> *next) : handler_entry_read<Width, AddrShift>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(next) { next->ref(); mph.add_handler(this); }
+ handler_entry_read_passthrough(address_space *space, emu::detail::memory_passthrough_handler_impl &mph, handler_entry_read<Width, AddrShift> *next) : handler_entry_read<Width, AddrShift>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(next) { next->ref(); mph.add_handler(this); }
};
template<int Width, int AddrShift> class handler_entry_write_passthrough : public handler_entry_write<Width, AddrShift>
@@ -31,7 +31,7 @@ template<int Width, int AddrShift> class handler_entry_write_passthrough : publi
public:
using uX = typename emu::detail::handler_entry_size<Width>::uX;
- handler_entry_write_passthrough(address_space *space, memory_passthrough_handler &mph) : handler_entry_write<Width, AddrShift>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(nullptr) {}
+ handler_entry_write_passthrough(address_space *space, emu::detail::memory_passthrough_handler_impl &mph) : handler_entry_write<Width, AddrShift>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(nullptr) {}
~handler_entry_write_passthrough();
virtual handler_entry_write_passthrough<Width, AddrShift> *instantiate(handler_entry_write<Width, AddrShift> *next) const = 0;
@@ -41,8 +41,8 @@ public:
void detach(const std::unordered_set<handler_entry *> &handlers) override;
protected:
- memory_passthrough_handler &m_mph;
+ emu::detail::memory_passthrough_handler_impl &m_mph;
handler_entry_write<Width, AddrShift> *m_next;
- handler_entry_write_passthrough(address_space *space, memory_passthrough_handler &mph, handler_entry_write<Width, AddrShift> *next) : handler_entry_write<Width, AddrShift>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(next) { next->ref(); mph.add_handler(this); }
+ handler_entry_write_passthrough(address_space *space, emu::detail::memory_passthrough_handler_impl &mph, handler_entry_write<Width, AddrShift> *next) : handler_entry_write<Width, AddrShift>(space, handler_entry::F_PASSTHROUGH), m_mph(mph), m_next(next) { next->ref(); mph.add_handler(this); }
};
diff --git a/src/emu/emumem_het.h b/src/emu/emumem_het.h
index 2914605772b..a148e3d3533 100644
--- a/src/emu/emumem_het.h
+++ b/src/emu/emumem_het.h
@@ -14,7 +14,7 @@ template<int Width, int AddrShift> class handler_entry_read_tap : public handler
public:
using uX = typename emu::detail::handler_entry_size<Width>::uX;
- handler_entry_read_tap(address_space *space, memory_passthrough_handler &mph, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_read_passthrough<Width, AddrShift>(space, mph), m_name(name), m_tap(std::move(tap)) {}
+ handler_entry_read_tap(address_space *space, emu::detail::memory_passthrough_handler_impl &mph, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_read_passthrough<Width, AddrShift>(space, mph), m_name(name), m_tap(std::move(tap)) {}
~handler_entry_read_tap() = default;
uX read(offs_t offset, uX mem_mask) const override;
@@ -28,7 +28,7 @@ protected:
std::string m_name;
std::function<void (offs_t offset, uX &data, uX mem_mask)> m_tap;
- handler_entry_read_tap(address_space *space, memory_passthrough_handler &mph, handler_entry_read<Width, AddrShift> *next, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_read_passthrough<Width, AddrShift>(space, mph, next), m_name(name), m_tap(tap) {}
+ handler_entry_read_tap(address_space *space, emu::detail::memory_passthrough_handler_impl &mph, handler_entry_read<Width, AddrShift> *next, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_read_passthrough<Width, AddrShift>(space, mph, next), m_name(name), m_tap(tap) {}
};
template<int Width, int AddrShift> class handler_entry_write_tap : public handler_entry_write_passthrough<Width, AddrShift>
@@ -36,7 +36,7 @@ template<int Width, int AddrShift> class handler_entry_write_tap : public handle
public:
using uX = typename emu::detail::handler_entry_size<Width>::uX;
- handler_entry_write_tap(address_space *space, memory_passthrough_handler &mph, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_write_passthrough<Width, AddrShift>(space, mph), m_name(name), m_tap(std::move(tap)) {}
+ handler_entry_write_tap(address_space *space, emu::detail::memory_passthrough_handler_impl &mph, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_write_passthrough<Width, AddrShift>(space, mph), m_name(name), m_tap(std::move(tap)) {}
~handler_entry_write_tap() = default;
void write(offs_t offset, uX data, uX mem_mask) const override;
@@ -50,7 +50,7 @@ protected:
std::string m_name;
std::function<void (offs_t offset, uX &data, uX mem_mask)> m_tap;
- handler_entry_write_tap(address_space *space, memory_passthrough_handler &mph, handler_entry_write<Width, AddrShift> *next, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_write_passthrough<Width, AddrShift>(space, mph, next), m_name(name), m_tap(tap) {}
+ handler_entry_write_tap(address_space *space, emu::detail::memory_passthrough_handler_impl &mph, handler_entry_write<Width, AddrShift> *next, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap) : handler_entry_write_passthrough<Width, AddrShift>(space, mph, next), m_name(name), m_tap(tap) {}
};
#endif // MAME_EMU_EMUMEM_HET_H
diff --git a/src/emu/emumem_mview.cpp b/src/emu/emumem_mview.cpp
index 06007c7d0b5..b916e3f951f 100644
--- a/src/emu/emumem_mview.cpp
+++ b/src/emu/emumem_mview.cpp
@@ -126,9 +126,9 @@ public:
using address_space_installer::install_write_tap;
using address_space_installer::install_readwrite_tap;
- virtual memory_passthrough_handler *install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph) override;
- virtual memory_passthrough_handler *install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph) override;
- virtual memory_passthrough_handler *install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapr, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapw, memory_passthrough_handler *mph) override;
+ virtual memory_passthrough_handler install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph) override;
+ virtual memory_passthrough_handler install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph) override;
+ virtual memory_passthrough_handler install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapr, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapw, memory_passthrough_handler *mph) override;
virtual void unmap_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, u16 flags, read_or_write readorwrite, bool quiet) override;
virtual void install_ram_generic(offs_t addrstart, offs_t addrend, offs_t addrmirror, u16 flags, read_or_write readorwrite, void *baseptr) override;
@@ -898,65 +898,62 @@ template<int Level, int Width, int AddrShift> void memory_view_entry_specific<Le
view.make_subdispatch(key()); // Must be called after populate
}
-template<int Level, int Width, int AddrShift> memory_passthrough_handler *memory_view_entry_specific<Level, Width, AddrShift>::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph)
+template<int Level, int Width, int AddrShift> memory_passthrough_handler memory_view_entry_specific<Level, Width, AddrShift>::install_read_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph)
{
offs_t nstart, nend, nmask, nmirror;
check_range_optimize_mirror("install_read_tap", addrstart, addrend, addrmirror, nstart, nend, nmask, nmirror);
- if (!mph)
- mph = m_view.m_space->make_mph();
+ auto impl = m_view.m_space->make_mph(mph);
r()->select_u(m_id);
w()->select_u(m_id);
- auto handler = new handler_entry_read_tap<Width, AddrShift>(m_view.m_space, *mph, name, tap);
+ auto handler = new handler_entry_read_tap<Width, AddrShift>(m_view.m_space, *impl, name, tap);
r()->populate_passthrough(nstart, nend, nmirror, handler);
handler->unref();
invalidate_caches(read_or_write::READ);
- return mph;
+ return impl;
}
-template<int Level, int Width, int AddrShift> memory_passthrough_handler *memory_view_entry_specific<Level, Width, AddrShift>::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph)
+template<int Level, int Width, int AddrShift> memory_passthrough_handler memory_view_entry_specific<Level, Width, AddrShift>::install_write_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tap, memory_passthrough_handler *mph)
{
offs_t nstart, nend, nmask, nmirror;
check_range_optimize_mirror("install_write_tap", addrstart, addrend, addrmirror, nstart, nend, nmask, nmirror);
- if (!mph)
- mph = m_view.m_space->make_mph();
+ auto impl = m_view.m_space->make_mph(mph);
r()->select_u(m_id);
w()->select_u(m_id);
- auto handler = new handler_entry_write_tap<Width, AddrShift>(m_view.m_space, *mph, name, tap);
+ auto handler = new handler_entry_write_tap<Width, AddrShift>(m_view.m_space, *impl, name, tap);
w()->populate_passthrough(nstart, nend, nmirror, handler);
handler->unref();
invalidate_caches(read_or_write::WRITE);
- return mph;
+ return impl;
}
-template<int Level, int Width, int AddrShift> memory_passthrough_handler *memory_view_entry_specific<Level, Width, AddrShift>::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapr, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapw, memory_passthrough_handler *mph)
+template<int Level, int Width, int AddrShift> memory_passthrough_handler memory_view_entry_specific<Level, Width, AddrShift>::install_readwrite_tap(offs_t addrstart, offs_t addrend, offs_t addrmirror, std::string name, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapr, std::function<void (offs_t offset, uX &data, uX mem_mask)> tapw, memory_passthrough_handler *mph)
{
offs_t nstart, nend, nmask, nmirror;
check_range_optimize_mirror("install_readwrite_tap", addrstart, addrend, addrmirror, nstart, nend, nmask, nmirror);
- if (!mph)
- mph = m_view.m_space->make_mph();
+ auto impl = m_view.m_space->make_mph(mph);
r()->select_u(m_id);
w()->select_u(m_id);
- auto rhandler = new handler_entry_read_tap <Width, AddrShift>(m_view.m_space, *mph, name, tapr);
+ auto rhandler = new handler_entry_read_tap <Width, AddrShift>(m_view.m_space, *impl, name, tapr);
r() ->populate_passthrough(nstart, nend, nmirror, rhandler);
rhandler->unref();
- auto whandler = new handler_entry_write_tap<Width, AddrShift>(m_view.m_space, *mph, name, tapw);
+ auto whandler = new handler_entry_write_tap<Width, AddrShift>(m_view.m_space, *impl, name, tapw);
w()->populate_passthrough(nstart, nend, nmirror, whandler);
whandler->unref();
invalidate_caches(read_or_write::READWRITE);
- return mph;
+ return impl;
}
template<int Level, int Width, int AddrShift> void memory_view_entry_specific<Level, Width, AddrShift>::install_device_delegate(offs_t addrstart, offs_t addrend, device_t &device, address_map_constructor &delegate, u64 unitmask, int cswidth, u16 flags)
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index 4798d7ca9d4..831f445faa5 100644
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -28,6 +28,7 @@
#include "uiinput.h"
#include "corestr.h"
+#include "notifier.h"
#include <cstring>
#include <thread>
@@ -741,6 +742,10 @@ void lua_engine::initialize()
[] (device_t &dev, int maxdepth) { return devenum<slot_interface_enumerator>(dev, maxdepth); });
+ auto notifier_subscription_type = sol().registry().new_usertype<util::notifier_subscription>("notifier_subscription", sol::no_constructor);
+ notifier_subscription_type["unsubscribe"] = &util::notifier_subscription::reset;
+ notifier_subscription_type["is_active"] = sol::property(&util::notifier_subscription::operator bool);
+
auto attotime_type = emu.new_usertype<attotime>(
"attotime",
sol::call_constructor, sol::constructors<attotime(), attotime(seconds_t, attoseconds_t), attotime(attotime const &)>());
diff --git a/src/frontend/mame/luaengine_debug.cpp b/src/frontend/mame/luaengine_debug.cpp
index 699c303f44f..749d4c34aa0 100644
--- a/src/frontend/mame/luaengine_debug.cpp
+++ b/src/frontend/mame/luaengine_debug.cpp
@@ -30,6 +30,78 @@ struct wrap_textbuf
};
+class symbol_table_wrapper
+{
+public:
+ symbol_table_wrapper(symbol_table_wrapper const &) = delete;
+
+ symbol_table_wrapper(running_machine &machine, std::shared_ptr<symbol_table_wrapper> const &parent, device_t *device)
+ : m_table(machine, parent ? &parent->table() : nullptr, device)
+ , m_parent(parent)
+ {
+ }
+
+ symbol_table &table() { return m_table; }
+ symbol_table const &table() const { return m_table; }
+ std::shared_ptr<symbol_table_wrapper> const &parent() { return m_parent; }
+
+ symbol_entry &add(char const *name) { return m_table.add(name, symbol_table::READ_WRITE); }
+ symbol_entry &add(char const *name, u64 value) { return m_table.add(name, value); }
+ symbol_entry *find(char const *name) const { return m_table.find(name); }
+ symbol_entry *find_deep(char const *name) { return m_table.find_deep(name); }
+
+ u64 value(const char *symbol) { return m_table.value(symbol); }
+ void set_value(const char *symbol, u64 value) { m_table.set_value(symbol, value); }
+
+private:
+ symbol_table m_table;
+ std::shared_ptr<symbol_table_wrapper> const m_parent;
+};
+
+
+class expression_wrapper
+{
+public:
+ expression_wrapper(expression_wrapper const &) = delete;
+ expression_wrapper &operator=(expression_wrapper const &) = delete;
+
+ expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &symtable)
+ : m_expression(symtable->table())
+ , m_symbols(symtable)
+ {
+ }
+
+ expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &symtable, char const *expression, int default_base)
+ : m_expression(symtable->table(), expression, default_base)
+ , m_symbols(symtable)
+ {
+ }
+
+ expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &symtable, char const *expression)
+ : m_expression(symtable->table(), expression)
+ , m_symbols(symtable)
+ {
+ }
+
+ void set_default_base(int base) { m_expression.set_default_base(base); }
+ void parse(char const *string) { m_expression.parse(string); }
+ u64 execute() { return m_expression.execute(); }
+ bool is_empty() const { return m_expression.is_empty(); }
+ char const *original_string() const { return m_expression.original_string(); }
+ std::shared_ptr<symbol_table_wrapper> const &symbols() { return m_symbols; }
+
+ void set_symbols(std::shared_ptr<symbol_table_wrapper> const &symtable)
+ {
+ m_expression.set_symbols(symtable->table());
+ m_symbols = symtable;
+ }
+
+private:
+ parsed_expression m_expression;
+ std::shared_ptr<symbol_table_wrapper> m_symbols;
+};
+
+
template <bool Enable>
sol::object do_breakpoint_enable(device_debug &dev, sol::this_state s, sol::object index)
{
@@ -106,12 +178,12 @@ void lua_engine::initialize_debug(sol::table &emu)
{ "m", EXPSPACE_REGION }
};
- auto const do_add_symbol = [this] (symbol_table &st, char const *name, sol::protected_function getter, std::optional<sol::protected_function> setter, std::optional<char const *> format)
+ auto const do_add_symbol = [this] (symbol_table_wrapper &st, char const *name, sol::protected_function getter, std::optional<sol::protected_function> setter, std::optional<char const *> format) -> symbol_entry &
{
symbol_table::setter_func setfun;
if (setter)
setfun = [this, cbfunc = std::move(*setter)] (u64 value) { invoke(cbfunc, value); };
- st.add(
+ return st.table().add(
name,
[this, cbfunc = std::move(getter)] () -> u64
{
@@ -130,46 +202,50 @@ void lua_engine::initialize_debug(sol::table &emu)
(format && *format) ? *format : "");
};
- auto symbol_table_type = emu.new_usertype<symbol_table>(
+ auto symbol_table_type = emu.new_usertype<symbol_table_wrapper>(
"symbol_table",
sol::call_constructor, sol::factories(
- [] (running_machine &machine, symbol_table *parent, device_t *device) { return std::make_unique<symbol_table>(machine, parent, device); },
- [] (running_machine &machine, symbol_table *parent) { return std::make_unique<symbol_table>(machine, parent); },
- [] (running_machine &machine, device_t &device) { return std::make_unique<symbol_table>(machine, nullptr, &device); },
- [] (running_machine &machine) { return std::make_unique<symbol_table>(machine); }));
+ [] (running_machine &machine)
+ { return std::make_shared<symbol_table_wrapper>(machine, nullptr, nullptr); },
+ [] (std::shared_ptr<symbol_table_wrapper> const &parent, device_t *device)
+ { return std::make_shared<symbol_table_wrapper>(parent->table().machine(), parent, device); },
+ [] (std::shared_ptr<symbol_table_wrapper> const &parent)
+ { return std::make_shared<symbol_table_wrapper>(parent->table().machine(), parent, nullptr); },
+ [] (device_t &device)
+ { return std::make_shared<symbol_table_wrapper>(device.machine(), nullptr, &device); }));
symbol_table_type["set_memory_modified_func"] =
- [this] (symbol_table &st, sol::object cb)
+ [this] (symbol_table_wrapper &st, sol::object cb)
{
if (cb == sol::lua_nil)
- st.set_memory_modified_func(nullptr);
+ st.table().set_memory_modified_func(nullptr);
else if (cb.is<sol::protected_function>())
- st.set_memory_modified_func([this, cbfunc = cb.as<sol::protected_function>()] () { invoke(cbfunc); });
+ st.table().set_memory_modified_func([this, cbfunc = cb.as<sol::protected_function>()] () { invoke(cbfunc); });
else
osd_printf_error("[LUA ERROR] must call set_memory_modified_func with function or nil\n");
};
symbol_table_type["add"] = sol::overload(
- [] (symbol_table &st, char const *name) { st.add(name, symbol_table::READ_WRITE); },
- static_cast<void (symbol_table::*)(char const *, u64)>(&symbol_table::add),
+ static_cast<symbol_entry &(symbol_table_wrapper::*)(char const *)>(&symbol_table_wrapper::add),
+ static_cast<symbol_entry &(symbol_table_wrapper::*)(char const *, u64)>(&symbol_table_wrapper::add),
do_add_symbol,
- [do_add_symbol] (symbol_table &st, char const *name, sol::protected_function getter, sol::lua_nil_t, char const *format)
+ [do_add_symbol] (symbol_table_wrapper &st, char const *name, sol::protected_function getter, sol::lua_nil_t, char const *format) -> symbol_entry &
{
- do_add_symbol(st, name, getter, std::nullopt, format);
+ return do_add_symbol(st, name, getter, std::nullopt, format);
},
- [do_add_symbol] (symbol_table &st, char const *name, sol::protected_function getter, std::optional<sol::protected_function> setter)
+ [do_add_symbol] (symbol_table_wrapper &st, char const *name, sol::protected_function getter, std::optional<sol::protected_function> setter) -> symbol_entry &
{
- do_add_symbol(st, name, getter, setter, nullptr);
+ return do_add_symbol(st, name, getter, setter, nullptr);
},
- [do_add_symbol] (symbol_table &st, char const *name, sol::protected_function getter, char const *format)
+ [do_add_symbol] (symbol_table_wrapper &st, char const *name, sol::protected_function getter, char const *format) -> symbol_entry &
{
- do_add_symbol(st, name, getter, std::nullopt, format);
+ return do_add_symbol(st, name, getter, std::nullopt, format);
},
- [do_add_symbol] (symbol_table &st, char const *name, sol::protected_function getter)
+ [do_add_symbol] (symbol_table_wrapper &st, char const *name, sol::protected_function getter) -> symbol_entry &
{
- do_add_symbol(st, name, getter, std::nullopt, nullptr);
+ return do_add_symbol(st, name, getter, std::nullopt, nullptr);
},
- [this] (symbol_table &st, char const *name, int minparams, int maxparams, sol::protected_function execute)
+ [this] (symbol_table_wrapper &st, char const *name, int minparams, int maxparams, sol::protected_function execute) -> symbol_entry &
{
- st.add(
+ return st.table().add(
name,
minparams,
maxparams,
@@ -185,41 +261,40 @@ void lua_engine::initialize_debug(sol::table &emu)
return result ? *result : 0;
});
});
- symbol_table_type["find"] = &symbol_table::find;
- symbol_table_type["find_deep"] = &symbol_table::find_deep;
- symbol_table_type["value"] = &symbol_table::value;
- symbol_table_type["set_value"] = &symbol_table::set_value;
+ symbol_table_type["find"] = &symbol_table_wrapper::find;
+ symbol_table_type["find_deep"] = &symbol_table_wrapper::find_deep;
+ symbol_table_type["value"] = &symbol_table_wrapper::value;
+ symbol_table_type["set_value"] = &symbol_table_wrapper::set_value;
symbol_table_type["memory_value"] =
- [] (symbol_table &st, char const *name, char const *space, u32 offset, int size, bool disable_se)
+ [] (symbol_table_wrapper &st, char const *name, char const *space, u32 offset, int size, bool disable_se)
{
expression_space const es = s_expression_space_parser(space);
- return st.memory_value(name, es, offset, size, disable_se);
+ return st.table().memory_value(name, es, offset, size, disable_se);
};
symbol_table_type["set_memory_value"] =
- [] (symbol_table &st, char const *name, char const *space, u32 offset, int size, u64 value, bool disable_se)
+ [] (symbol_table_wrapper &st, char const *name, char const *space, u32 offset, int size, u64 value, bool disable_se)
{
expression_space const es = s_expression_space_parser(space);
- st.set_memory_value(name, es, offset, size, value, disable_se);
+ st.table().set_memory_value(name, es, offset, size, value, disable_se);
};
//symbol_table_type["read_memory"] = &symbol_table::read_memory; crashes if you try to use it, need to work out why
//symbol_table_type["write_memory"] = &symbol_table::write_memory; crashes if you try to use it, need to work out why
- symbol_table_type["entries"] = sol::property([] (symbol_table const &st) { return standard_tag_object_ptr_map<symbol_entry>(st.entries()); });
- symbol_table_type["parent"] = sol::property(&symbol_table::parent);
+ symbol_table_type["entries"] = sol::property([] (symbol_table_wrapper const &st) { return standard_tag_object_ptr_map<symbol_entry>(st.table().entries()); });
+ symbol_table_type["parent"] = sol::property(&symbol_table_wrapper::parent);
- auto parsed_expression_type = emu.new_usertype<parsed_expression>(
+ auto parsed_expression_type = emu.new_usertype<expression_wrapper>(
"parsed_expression",
- sol::call_constructor, sol::factories(
- [] (symbol_table &symtable) { return std::make_unique<parsed_expression>(symtable); },
- [] (symbol_table &symtable, char const *expression, int default_base) { return std::make_unique<parsed_expression>(symtable, expression, default_base); },
- [] (symbol_table &symtable, char const *expression) { return std::make_unique<parsed_expression>(symtable, expression); },
- [] (parsed_expression const &src) { return std::make_unique<parsed_expression>(src); }));
- parsed_expression_type["set_default_base"] = &parsed_expression::set_default_base;
- parsed_expression_type["parse"] = [] (parsed_expression &e, char const *string) { e.parse(string); };
- parsed_expression_type["execute"] = &parsed_expression::execute;
- parsed_expression_type["is_empty"] = sol::property(&parsed_expression::is_empty);
- parsed_expression_type["original_string"] = sol::property(&parsed_expression::original_string);
- parsed_expression_type["symbols"] = sol::property(&parsed_expression::symbols, &parsed_expression::set_symbols);
+ sol::call_constructor, sol::constructors<
+ expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &),
+ expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &, char const *, int),
+ expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &, char const *)>());
+ parsed_expression_type["set_default_base"] = &expression_wrapper::set_default_base;
+ parsed_expression_type["parse"] = &expression_wrapper::parse;
+ parsed_expression_type["execute"] = &expression_wrapper::execute;
+ parsed_expression_type["is_empty"] = sol::property(&expression_wrapper::is_empty);
+ parsed_expression_type["original_string"] = sol::property(&expression_wrapper::original_string);
+ parsed_expression_type["symbols"] = sol::property(&expression_wrapper::symbols, &expression_wrapper::set_symbols);
auto symbol_entry_type = sol().registry().new_usertype<symbol_entry>("symbol_entry", sol::no_constructor);
@@ -266,22 +341,22 @@ void lua_engine::initialize_debug(sol::table &emu)
auto device_debug_type = sol().registry().new_usertype<device_debug>("device_debug", sol::no_constructor);
device_debug_type["step"] =
- [] (device_debug &dev, sol::object num)
- {
- int steps = 1;
- if (num.is<int>())
- steps = num.as<int>();
- dev.single_step(steps);
- };
+ [] (device_debug &dev, sol::object num)
+ {
+ int steps = 1;
+ if (num.is<int>())
+ steps = num.as<int>();
+ dev.single_step(steps);
+ };
device_debug_type["go"] = &device_debug::go;
device_debug_type["bpset"] =
- [] (device_debug &dev, offs_t address, char const *cond, char const *act)
- {
- int result(dev.breakpoint_set(address, cond, act));
- dev.device().machine().debug_view().update_all(DVT_DISASSEMBLY);
- dev.device().machine().debug_view().update_all(DVT_BREAK_POINTS);
- return result;
- };
+ [] (device_debug &dev, offs_t address, char const *cond, char const *act)
+ {
+ int result(dev.breakpoint_set(address, cond, act));
+ dev.device().machine().debug_view().update_all(DVT_DISASSEMBLY);
+ dev.device().machine().debug_view().update_all(DVT_BREAK_POINTS);
+ return result;
+ };
device_debug_type["bpclear"] = sol::overload(
[] (device_debug &dev, int index)
{
@@ -302,21 +377,21 @@ void lua_engine::initialize_debug(sol::table &emu)
device_debug_type["bpenable"] = &do_breakpoint_enable<true>;
device_debug_type["bpdisable"] = &do_breakpoint_enable<false>;
device_debug_type["bplist"] =
- [this] (device_debug &dev)
- {
- sol::table table = sol().create_table();
- for (auto const &bpp : dev.breakpoint_list())
- table[bpp.second->index()] = sol::make_reference(sol(), *bpp.second);
- return table;
- };
+ [this] (device_debug &dev)
+ {
+ sol::table table = sol().create_table();
+ for (auto const &bpp : dev.breakpoint_list())
+ table[bpp.second->index()] = sol::make_reference(sol(), bpp.second.get());
+ return table;
+ };
device_debug_type["wpset"] =
- [] (device_debug &dev, addr_space &sp, std::string const &type, offs_t addr, offs_t len, char const *cond, char const *act)
- {
- read_or_write const wptype = s_read_or_write_parser(type);
- int result(dev.watchpoint_set(sp.space, wptype, addr, len, cond, act));
- dev.device().machine().debug_view().update_all(DVT_WATCH_POINTS);
- return result;
- };
+ [] (device_debug &dev, addr_space &sp, std::string const &type, offs_t addr, offs_t len, char const *cond, char const *act)
+ {
+ read_or_write const wptype = s_read_or_write_parser(type);
+ int result(dev.watchpoint_set(sp.space, wptype, addr, len, cond, act));
+ dev.device().machine().debug_view().update_all(DVT_WATCH_POINTS);
+ return result;
+ };
device_debug_type["wpclear"] = sol::overload(
[] (device_debug &dev, int index)
{
@@ -333,18 +408,28 @@ void lua_engine::initialize_debug(sol::table &emu)
device_debug_type["wpenable"] = &do_watchpoint_enable<true>;
device_debug_type["wpdisable"] = &do_watchpoint_enable<false>;
device_debug_type["wplist"] =
- [this] (device_debug &dev, addr_space &sp)
- {
- sol::table table = sol().create_table();
- for (auto &wpp : dev.watchpoint_vector(sp.space.spacenum()))
- table[wpp->index()] = sol::make_reference(sol(), *wpp);
- return table;
- };
+ [this] (device_debug &dev, addr_space &sp)
+ {
+ sol::table table = sol().create_table();
+ for (auto &wpp : dev.watchpoint_vector(sp.space.spacenum()))
+ table[wpp->index()] = sol::make_reference(sol(), wpp.get());
+ return table;
+ };
auto breakpoint_type = sol().registry().new_usertype<debug_breakpoint>("breakpoint", sol::no_constructor);
breakpoint_type["index"] = sol::property(&debug_breakpoint::index);
- breakpoint_type["enabled"] = sol::property(&debug_breakpoint::enabled);
+ breakpoint_type["enabled"] = sol::property(
+ &debug_breakpoint::enabled,
+ [] (debug_breakpoint &bp, bool val)
+ {
+ if (bp.enabled() != val)
+ {
+ bp.setEnabled(val);
+ bp.debugInterface()->device().machine().debug_view().update_all(DVT_DISASSEMBLY);
+ bp.debugInterface()->device().machine().debug_view().update_all(DVT_BREAK_POINTS);
+ }
+ });
breakpoint_type["address"] = sol::property(&debug_breakpoint::address);
breakpoint_type["condition"] = sol::property(&debug_breakpoint::condition);
breakpoint_type["action"] = sol::property(&debug_breakpoint::action);
@@ -352,7 +437,16 @@ void lua_engine::initialize_debug(sol::table &emu)
auto watchpoint_type = sol().registry().new_usertype<debug_watchpoint>("watchpoint", sol::no_constructor);
watchpoint_type["index"] = sol::property(&debug_watchpoint::index);
- watchpoint_type["enabled"] = sol::property(&debug_watchpoint::enabled);
+ watchpoint_type["enabled"] = sol::property(
+ &debug_watchpoint::enabled,
+ [] (debug_watchpoint &wp, bool val)
+ {
+ if (wp.enabled() != val)
+ {
+ wp.setEnabled(val);
+ wp.debugInterface()->device().machine().debug_view().update_all(DVT_WATCH_POINTS);
+ }
+ });
watchpoint_type["type"] = sol::property(
[] (debug_watchpoint &wp) -> char const *
{
diff --git a/src/frontend/mame/luaengine_mem.cpp b/src/frontend/mame/luaengine_mem.cpp
index 26518931e9e..8ad5d6300bb 100644
--- a/src/frontend/mame/luaengine_mem.cpp
+++ b/src/frontend/mame/luaengine_mem.cpp
@@ -205,21 +205,19 @@ public:
: m_callback(std::move(callback))
, m_engine(engine)
, m_space(space)
- , m_handler(nullptr)
+ , m_handler()
, m_name(std::move(name))
, m_start(start)
, m_end(end)
, m_mode(mode)
- , m_installing(false)
- , m_installed(false)
+ , m_installing(0U)
{
reinstall();
}
~tap_helper()
{
- if (m_handler && m_installed)
- m_handler->remove();
+ remove();
}
offs_t start() const noexcept { return m_start; }
@@ -239,11 +237,9 @@ public:
void remove()
{
- if (m_handler)
- {
- m_handler->remove();
- m_installed = false;
- }
+ ++m_installing;
+ m_handler.remove();
+ --m_installing;
}
private:
@@ -252,9 +248,8 @@ private:
{
if (m_installing)
return;
- m_installing = true;
- if (m_handler)
- m_handler->remove();
+ ++m_installing;
+ m_handler.remove();
switch (m_mode)
{
@@ -269,7 +264,7 @@ private:
if (result)
data = *result;
},
- m_handler);
+ &m_handler);
break;
case read_or_write::WRITE:
m_handler = m_space.install_write_tap(
@@ -282,118 +277,25 @@ private:
if (result)
data = *result;
},
- m_handler);
+ &m_handler);
break;
case read_or_write::READWRITE:
// won't ever get here, but compilers complain about unhandled enum value
break;
}
- m_installed = true;
- m_installing = false;
+ --m_installing;
};
sol::protected_function m_callback;
lua_engine &m_engine;
address_space &m_space;
- memory_passthrough_handler *m_handler;
+ memory_passthrough_handler m_handler;
std::string m_name;
offs_t const m_start;
offs_t const m_end;
read_or_write const m_mode;
- bool m_installing;
- bool m_installed;
-};
-
-
-//-------------------------------------------------
-// addr_space_change_notif - helper for hanging
-// on to an address space change notification
-// subscription
-//-------------------------------------------------
-
-class lua_engine::addr_space_change_notif
-{
-public:
- addr_space_change_notif(addr_space_change_notif const &) = delete;
-
- addr_space_change_notif(addr_space_change_notif &&that)
- : m_callback(std::move(that.m_callback))
- , m_engine(that.m_engine)
- , m_space(that.m_space)
- , m_id(-1)
- {
- that.remove();
- install();
- }
-
- addr_space_change_notif &operator=(addr_space_change_notif &&that)
- {
- if (&that != this)
- {
- remove();
- m_callback = std::move(that.m_callback);
- m_engine = that.m_engine;
- m_space = that.m_space;
- that.remove();
- install();
- }
- return *this;
- }
-
- addr_space_change_notif(lua_engine &engine, address_space &space, sol::protected_function &&callback)
- : m_callback(std::move(callback))
- , m_engine(&engine)
- , m_space(&space)
- , m_id(-1)
- {
- install();
- }
-
- ~addr_space_change_notif()
- {
- if (m_space)
- m_space->remove_change_notifier(m_id);
- }
-
- void remove()
- {
- if (m_space)
- {
- m_space->remove_change_notifier(m_id);
- m_space = nullptr;
- m_id = -1;
- }
- }
-
-private:
- void install()
- {
- if (m_space)
- {
- m_id = m_space->add_change_notifier(
- [this] (read_or_write mode)
- {
- char const *modestr = "";
- switch (mode)
- {
- case read_or_write::READ: modestr = "r"; break;
- case read_or_write::WRITE: modestr = "w"; break;
- case read_or_write::READWRITE: modestr = "rw"; break;
- }
- m_engine->invoke(m_callback, modestr);
- });
- }
- else
- {
- m_id = -1;
- }
- }
-
- sol::protected_function m_callback;
- lua_engine *m_engine;
- address_space *m_space;
- int m_id;
+ unsigned m_installing;
};
@@ -724,7 +626,18 @@ void lua_engine::initialize_memory(sol::table &emu)
addr_space_type["add_change_notifier"] =
[this] (addr_space &sp, sol::protected_function &&cb)
{
- return addr_space_change_notif(*this, sp.space, std::move(cb));
+ return sp.space.add_change_notifier(
+ [this, callback = std::move(cb)] (read_or_write mode)
+ {
+ char const *modestr = "";
+ switch (mode)
+ {
+ case read_or_write::READ: modestr = "r"; break;
+ case read_or_write::WRITE: modestr = "w"; break;
+ case read_or_write::READWRITE: modestr = "rw"; break;
+ }
+ invoke(callback, modestr);
+ });
};
addr_space_type["install_read_tap"] =
[this] (addr_space &sp, offs_t start, offs_t end, std::string &&name, sol::protected_function &&cb)
@@ -745,9 +658,6 @@ void lua_engine::initialize_memory(sol::table &emu)
addr_space_type["map"] = sol::property([] (addr_space &sp) { return sp.space.map(); });
- auto change_notif_type = sol().registry().new_usertype<addr_space_change_notif>("addr_space_change", sol::no_constructor);
- change_notif_type["remove"] = &addr_space_change_notif::remove;
-
auto tap_type = sol().registry().new_usertype<tap_helper>("mempassthrough", sol::no_constructor);
tap_type["reinstall"] = &tap_helper::reinstall;
tap_type["remove"] = &tap_helper::remove;
diff --git a/src/lib/util/notifier.h b/src/lib/util/notifier.h
new file mode 100644
index 00000000000..b5dfaaa0f3c
--- /dev/null
+++ b/src/lib/util/notifier.h
@@ -0,0 +1,240 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/// \file
+/// \brief Simple broadcast notifier
+///
+/// Classes for managing subscriptions and calling multiple listener
+/// functions for notifications.
+#ifndef MAME_LIB_UTIL_NOTIFIER_H
+#define MAME_LIB_UTIL_NOTIFIER_H
+
+#pragma once
+
+#include "delegate.h"
+
+#include <cstddef>
+#include <memory>
+#include <utility>
+#include <vector>
+
+
+namespace util {
+
+/// \brief A subscription to a notification source
+///
+/// Class for representing a subscription to a notifier. Automatically
+/// unsubscribes on destruction, if explicitly reset, if assigned to, or
+/// when taking ownership of a different subscription by move
+/// assignment.
+/// \sa notifier
+class notifier_subscription
+{
+public:
+ /// \brief Create an empty subscription
+ ///
+ /// Initialises an instance not referring to a subscription.
+ notifier_subscription() noexcept : m_token(), m_live(nullptr), m_index(0U) { }
+
+ /// \brief Transfer ownership of a subscription
+ ///
+ /// Transfers ownership of a subscription to a new instance.
+ /// \param [in,out] that The subscription to transfer ownership
+ /// from. Will no longer refer to a subscription after ownership
+ /// is transferred away.
+ notifier_subscription(notifier_subscription &&that) noexcept :
+ m_token(std::move(that.m_token)),
+ m_live(that.m_live),
+ m_index(that.m_index)
+ {
+ that.m_token.reset();
+ }
+
+ /// \brief Unsubscribe and destroy a subscription
+ ///
+ /// Unsubscribes if the subscription is active and cleans up the
+ /// subscription instance.
+ ~notifier_subscription() noexcept
+ {
+ auto token(m_token.lock());
+ if (token)
+ (*m_live)[m_index] = false;
+ }
+
+ /// \brief Swap two subscriptions
+ ///
+ /// Exchanges ownership of subscriptions between two instances.
+ /// \param [in,out] that The subscription to exchange ownership
+ /// with.
+ void swap(notifier_subscription &that) noexcept
+ {
+ using std::swap;
+ swap(m_token, that.m_token);
+ swap(m_live, that.m_live);
+ swap(m_index, that.m_index);
+ }
+
+ /// \brief Unsubscribe from notifications
+ ///
+ /// If the instance refers to an active subscription, cancel it so
+ /// no future notifications will be received.
+ void reset() noexcept
+ {
+ auto token(m_token.lock());
+ if (token)
+ (*m_live)[m_index] = false;
+ m_token.reset();
+ }
+
+ /// \brief Test whether a subscription is active
+ ///
+ /// Tests whether a subscription is active. A subscription will be
+ /// inactive if it is default constructed, reset, transferred away,
+ /// or if the underlying notifier is destructed.
+ /// \return True if the subscription is active, false otherwise.
+ explicit operator bool() const noexcept { return bool(m_token.lock()); }
+
+ /// \brief Transfer ownership of a subscription
+ ///
+ /// Transfers ownership of a subscription to an existing instance.
+ /// If the subscription is active, it will be cancelled before it
+ /// takes ownership of the other subscription.
+ /// \param [in,out] that The subscription to transfer ownership
+ /// from. Will no longer refer to a subscription after ownership
+ /// is transferred away.
+ /// \return A reference to the instance that ownership was
+ /// transferred to.
+ notifier_subscription &operator=(notifier_subscription &&that) noexcept
+ {
+ {
+ auto token(m_token.lock());
+ if (token)
+ (*m_live)[m_index] = false;
+ }
+ m_token = std::move(that.m_token);
+ m_live = that.m_live;
+ m_index = that.m_index;
+ that.m_token.reset();
+ return *this;
+ }
+
+protected:
+ notifier_subscription(
+ std::shared_ptr<int> const &token,
+ std::vector<bool> &live,
+ std::vector<bool>::size_type index) :
+ m_token(token),
+ m_live(&live),
+ m_index(index)
+ {
+ }
+
+private:
+ notifier_subscription(notifier_subscription const &) = delete;
+ notifier_subscription &operator=(notifier_subscription const &) = delete;
+
+ std::weak_ptr<int> m_token;
+ std::vector<bool> *m_live;
+ std::vector<bool>::size_type m_index;
+};
+
+
+/// \brief Broadcast notifier
+///
+/// Calls multiple listener functions. Allows listeners to subscribe
+/// and unsubscribe. Subscriptions are managed using
+/// \c notifier_subscription instances.
+/// \tparam Params Argument types for the listener functions.
+/// \sa notifier_subscription
+template <typename... Params>
+class notifier
+{
+public:
+ /// \brief Listener delegate type
+ ///
+ /// The delegate type used to represent listener functions.
+ using delegate_type = delegate<void (Params...)>;
+
+ /// \brief Create a new notifier
+ ///
+ /// Creates a new notifier with no initial subscribers.
+ notifier() : m_token(std::make_shared<int>(0)) { }
+
+ /// \brief Destroy a notifier
+ ///
+ /// Destroys a notifier, causing any subscriptions to become
+ /// inactive.
+ ~notifier() noexcept { m_token.reset(); }
+
+ /// \brief Add a listener
+ ///
+ /// Adds a listener function subscription, returning an object for
+ /// managing the subscription.
+ /// \param [in] listener The function to be called on notifications.
+ /// \return A subscription object. Destroy the object or call its
+ /// \c reset member function to unsubscribe.
+ notifier_subscription subscribe(delegate_type &&listener)
+ {
+ struct subscription_impl : notifier_subscription
+ {
+ subscription_impl(notifier &host, std::size_t index) noexcept :
+ notifier_subscription(host.m_token, host.m_live, index)
+ {
+ }
+ };
+ for (std::size_t i = 0U; m_listeners.size() > i; ++i)
+ {
+ if (!m_live[i])
+ {
+ m_live[i] = true;
+ m_listeners[i] = std::move(listener);
+ return subscription_impl(*this, i);
+ }
+ }
+ m_live.emplace_back(true);
+ try
+ {
+ m_listeners.emplace_back(std::move(listener));
+ }
+ catch (...)
+ {
+ m_live.pop_back();
+ throw;
+ }
+ return subscription_impl(*this, m_listeners.size() - 1);
+ }
+
+ /// \brief Call listeners
+ ///
+ /// Calls all active listener functions.
+ /// \param [in] args Arguments to pass to the listener functions.
+ void operator()(Params... args) const
+ {
+ for (std::size_t i = 0U; m_listeners.size() > i; ++i)
+ {
+ if (m_live[i])
+ m_listeners[i](args...);
+ }
+ }
+
+private:
+ notifier(notifier const &) = delete;
+ notifier &operator=(notifier const &) = delete;
+
+ std::shared_ptr<int> m_token;
+ std::vector<bool> m_live;
+ std::vector<delegate_type> m_listeners;
+};
+
+
+/// \brief Swap two notifier subscriptions
+///
+/// Exchanges ownership of two notifier subscriptions. Allows the
+/// swappable idiom to be used with notifier subscriptions.
+/// \param [in,out] x Takes ownership of the subscription from \p y.
+/// \param [in,out] y Takes ownership of the subscription from \p x.
+/// \sa notifier_subscription
+inline void swap(notifier_subscription &x, notifier_subscription &y) noexcept { x.swap(y); }
+
+} // namespace util
+
+#endif // MAME_LIB_UTIL_NOTIFIER_H
diff --git a/src/mame/drivers/amust.cpp b/src/mame/drivers/amust.cpp
index da07a56b2e1..b2f1e6fd22f 100644
--- a/src/mame/drivers/amust.cpp
+++ b/src/mame/drivers/amust.cpp
@@ -76,22 +76,26 @@ ToDo:
*******************************************************************************************/
#include "emu.h"
+
+#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
#include "imagedev/floppy.h"
+#include "machine/clock.h"
#include "machine/i8251.h"
#include "machine/i8255.h"
#include "machine/pit8253.h"
-#include "machine/clock.h"
-#include "bus/rs232/rs232.h"
+#include "machine/timer.h"
#include "machine/upd765.h"
#include "sound/beep.h"
-#include "machine/timer.h"
#include "video/mc6845.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+namespace {
+
class amust_state : public driver_device
{
public:
@@ -149,7 +153,7 @@ private:
bool m_hsync = 0;
bool m_vsync = 0;
std::unique_ptr<u8[]> m_vram;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<palette_device> m_palette;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
@@ -417,20 +421,22 @@ void amust_state::machine_reset()
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;
- });
+ m_rom_shadow_tap.remove();
+ 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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void amust_state::machine_start()
@@ -536,6 +542,8 @@ ROM_START( amust )
ROM_LOAD( "kbd_3.rom", 0x000, 0x800, CRC(d9441b35) SHA1(ce250ab1e892a13fd75182703f259855388c6bf4) )
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/apogee.cpp b/src/mame/drivers/apogee.cpp
index a4b0326bf83..9ab9017a128 100644
--- a/src/mame/drivers/apogee.cpp
+++ b/src/mame/drivers/apogee.cpp
@@ -23,6 +23,8 @@
#include "formats/rk_cas.h"
+namespace {
+
class apogee_state : public radio86_state
{
public:
@@ -178,20 +180,22 @@ void apogee_state::machine_reset()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x0fff, m_rom+0x0800); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xf000, 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, 0x0fff, m_ram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xf000, 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, 0x0fff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void apogee_state::machine_start()
@@ -307,6 +311,8 @@ ROM_START( apogee )
ROM_LOAD ("apogee.fnt", 0x0000, 0x0800, CRC(fe5867f0) SHA1(82c5aca63ada5e4533eb0516384aaa7b77a1f8e2))
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/argo.cpp b/src/mame/drivers/argo.cpp
index a3a4c3832e4..027a2581379 100644
--- a/src/mame/drivers/argo.cpp
+++ b/src/mame/drivers/argo.cpp
@@ -27,18 +27,22 @@ ToDo:
****************************************************************************************/
#include "emu.h"
+
#include "cpu/z80/z80.h"
+#include "imagedev/cassette.h"
#include "machine/i8251.h"
-#include "machine/pit8253.h"
#include "machine/i8257.h"
-#include "video/i8275.h"
-#include "imagedev/cassette.h"
-//#include "sound/spkrdev.h"
-#include "speaker.h"
+#include "machine/pit8253.h"
#include "machine/timer.h"
+//#include "sound/spkrdev.h"
+#include "video/i8275.h"
+
#include "emupal.h"
#include "screen.h"
+#include "speaker.h"
+
+namespace {
class argo_state : public driver_device
{
@@ -76,7 +80,7 @@ private:
void io_map(address_map &map);
void mem_map(address_map &map);
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<z80_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -426,20 +430,22 @@ void argo_state::machine_reset()
{
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;
- });
+ m_rom_shadow_tap.remove();
+ 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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void argo_state::machine_start()
@@ -518,6 +524,8 @@ ROM_START( argo )
ROM_LOAD( "c10_char.bin", 0x0000, 0x2000, BAD_DUMP CRC(cb530b6f) SHA1(95590bbb433db9c4317f535723b29516b9b9fcbf))
ROM_END
+} // anonymous namespace
+
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
diff --git a/src/mame/drivers/blit.cpp b/src/mame/drivers/blit.cpp
index 4878a60865a..d75273aa559 100644
--- a/src/mame/drivers/blit.cpp
+++ b/src/mame/drivers/blit.cpp
@@ -56,6 +56,8 @@
#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__)
+namespace {
+
class blit_state : public driver_device
{
public:
@@ -95,7 +97,7 @@ private:
required_shared_ptr<uint16_t> m_p_ram;
required_region_ptr<uint16_t> m_sysrom;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
int m_videostart = 0;
};
@@ -211,20 +213,22 @@ void blit_state::machine_reset()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x000000, 0x000007, m_sysrom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0x040000, 0x045fff, "rom_shadow_r",[this](offs_t offset, u16 &data, u16 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(0x000000, 0x000007, m_p_ram);
- }
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0x040000, 0x045fff,
+ "rom_shadow_r",
+ [this] (offs_t offset, u16 &data, u16 mem_mask)
+ {
+ if (!machine().side_effects_disabled())
+ {
+ // delete this tap
+ m_rom_shadow_tap.remove();
- // return the original data
- return data;
- });
+ // reinstall ram over the rom shadow
+ m_maincpu->space(AS_PROGRAM).install_ram(0x000000, 0x000007, m_p_ram);
+ }
+ },
+ &m_rom_shadow_tap);
*m_misccr = 0;
}
@@ -284,6 +288,8 @@ ROM_START( blit )
ROMX_LOAD("rom5.bin", 0x4000, 0x08bf, CRC(d87f121f) SHA1(6e776ac29554b8a8bb332168c155bcc502c927b5), ROM_BIOS(0)|ROM_SKIP(1))
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1981, blit, 0, 0, blit, blit, blit_state, empty_init, "AT&T", "Blit", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/c10.cpp b/src/mame/drivers/c10.cpp
index fd7e5f5945b..117de280fa0 100644
--- a/src/mame/drivers/c10.cpp
+++ b/src/mame/drivers/c10.cpp
@@ -17,11 +17,15 @@ constantly looking at.
*****************************************************************************************************/
#include "emu.h"
+
#include "cpu/z80/z80.h"
+
#include "emupal.h"
#include "screen.h"
+namespace {
+
class c10_state : public driver_device
{
public:
@@ -34,15 +38,18 @@ public:
, m_p_chargen(*this, "chargen")
{ }
- u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void c10(machine_config &config);
private:
- void io_map(address_map &map);
- void mem_map(address_map &map);
void machine_reset() override;
void machine_start() override;
- memory_passthrough_handler *m_rom_shadow_tap;
+
+ void io_map(address_map &map);
+ void mem_map(address_map &map);
+
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<z80_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -77,20 +84,22 @@ void c10_state::machine_reset()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x0fff, m_rom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0x8000, 0x8fff, "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, 0x0fff, m_ram);
- }
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0x8000, 0x8fff,
+ "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();
- // return the original data
- return data;
- });
+ // reinstall RAM over the ROM shadow
+ m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x0fff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
/* This system appears to have inline attribute bytes of unknown meaning.
@@ -189,6 +198,8 @@ ROM_START( c10 )
ROM_LOAD( "c10_char.ic9", 0x0000, 0x2000, CRC(cb530b6f) SHA1(95590bbb433db9c4317f535723b29516b9b9fcbf))
ROM_END
+} // anonymous namespace
+
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
diff --git a/src/mame/drivers/ckz80.cpp b/src/mame/drivers/ckz80.cpp
index 747282277b5..b1667cf4fc2 100644
--- a/src/mame/drivers/ckz80.cpp
+++ b/src/mame/drivers/ckz80.cpp
@@ -39,16 +39,19 @@ I/O ports: These ranges are what is guessed
****************************************************************************/
#include "emu.h"
+
#include "cpu/z80/z80.h"
#include "imagedev/floppy.h"
+#include "machine/terminal.h"
#include "machine/upd765.h"
+#include "machine/z80ctc.h"
#include "machine/z80daisy.h"
#include "machine/z80pio.h"
#include "machine/z80sio.h"
-#include "machine/z80ctc.h"
-#include "machine/terminal.h"
+namespace {
+
class ckz80_state : public driver_device
{
public:
@@ -77,7 +80,7 @@ private:
void io_map(address_map &map);
void mem_map(address_map &map);
u8 m_term_data = 0U;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<z80_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -163,20 +166,22 @@ void ckz80_state::machine_reset()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x1fff, m_rom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xe000, 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, 0x1fff, m_ram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xe000, 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, 0x1fff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
m_bank1->set_entry(1);
}
@@ -227,6 +232,8 @@ ROM_START( ckz80 )
ROM_LOAD( "ckz80.rom", 0x0000, 0x2000, CRC(7081b7c6) SHA1(13f75b14ea73b252bdfa2384e6eead6e720e49e3))
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/imsai.cpp b/src/mame/drivers/imsai.cpp
index 2910ec18e0e..c1674aa4c3e 100644
--- a/src/mame/drivers/imsai.cpp
+++ b/src/mame/drivers/imsai.cpp
@@ -17,13 +17,16 @@
****************************************************************************/
#include "emu.h"
-#include "cpu/i8085/i8085.h"
+
//#include "bus/s100/s100.h"
+#include "cpu/i8085/i8085.h"
#include "machine/i8251.h"
#include "machine/pit8253.h"
#include "machine/terminal.h"
+namespace {
+
class imsai_state : public driver_device
{
public:
@@ -49,7 +52,7 @@ private:
u8 m_term_data = 0U;
void machine_reset() override;
void machine_start() override;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_device<generic_terminal_device> m_terminal;
@@ -109,20 +112,22 @@ void imsai_state::machine_reset()
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(0xd800, 0xdfff, "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();
-
- // remove from the memory map
- m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x0000, 0x07ff);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xd800, 0xdfff,
+ "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();
+
+ // remove from the memory map
+ m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x0000, 0x07ff);
+ }
+ },
+ &m_rom_shadow_tap);
}
void imsai_state::machine_start()
@@ -164,6 +169,8 @@ ROM_START( imsai )
ROM_LOAD( "74s288.u38", 0x00, 0x20, NO_DUMP )
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/lola8a.cpp b/src/mame/drivers/lola8a.cpp
index c9588a1f783..dfffd5a51ba 100644
--- a/src/mame/drivers/lola8a.cpp
+++ b/src/mame/drivers/lola8a.cpp
@@ -51,10 +51,12 @@ TO DO
****************************************************************************/
#include "emu.h"
+
#include "cpu/i8085/i8085.h"
#include "imagedev/cassette.h"
#include "sound/ay8910.h"
#include "video/mc6845.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@@ -64,6 +66,8 @@ TO DO
#define HD46505SP_TAG "h45"
+namespace {
+
class lola8a_state : public driver_device
{
public:
@@ -95,7 +99,7 @@ private:
void mem_map(address_map &map);
u8 m_portb = 0U;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<i8085a_cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -290,20 +294,22 @@ void lola8a_state::machine_reset()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x1fff, m_rom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0x8000, 0x9fff, "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, 0x1fff, m_ram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0x8000, 0x9fff,
+ "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, 0x1fff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void lola8a_state::machine_start()
@@ -361,6 +367,8 @@ ROM_START( lola8a )
ROM_LOAD( "lola 8a r2 w06 22.11.86.h67", 0x4000, 0x2000, CRC(1e7cd46b) SHA1(048b2583ee7baeb9621e629b79ed64583ac5d554))
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/micral.cpp b/src/mame/drivers/micral.cpp
index 829fd292128..915ab57fb98 100644
--- a/src/mame/drivers/micral.cpp
+++ b/src/mame/drivers/micral.cpp
@@ -9,7 +9,7 @@ Bull (Originally R2E) Micral 80-22G
http://www.ti99.com/exelvision/website/index.php?page=r2e-micral-8022-g
This expensive, futuristic-looking design featured a motherboard and slots,
-much like an ancient pc. The known chip complement is:
+much like an ancient PC. The known chip complement is:
Z80A, 4MHz; 64KB RAM, 2KB BIOS ROM, 256x4 prom (7611);
CRT8002, TMS9937 (=CRT5037), 4KB video RAM, 256x4 prom (7611);
2x 5.25 inch floppy drives, one ST506 5MB hard drive;
@@ -56,17 +56,21 @@ https://www.esocop.org/docs/Questar.pdf
*********************************************************************************/
#include "emu.h"
+
+#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
-#include "video/tms9927.h"
+#include "machine/ay31015.h"
+#include "machine/clock.h"
//#include "sound/beep.h"
+#include "video/tms9927.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
-#include "machine/ay31015.h"
-#include "machine/clock.h"
-#include "bus/rs232/rs232.h"
+namespace {
+
class micral_state : public driver_device
{
public:
@@ -101,7 +105,7 @@ private:
u8 s_command = 0U;
u8 s_data = 0U;
std::unique_ptr<u8[]> m_vram;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -373,20 +377,22 @@ void micral_state::machine_reset()
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);
- }
+ m_rom_shadow_tap.remove();
+ 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();
- // return the original data
- return data;
- });
+ // reinstall RAM over the ROM shadow
+ m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x07ff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void micral_state::machine_start()
@@ -464,6 +470,8 @@ ROM_START( questarm )
ROM_LOAD( "c10_char.bin", 0x0000, 0x2000, BAD_DUMP CRC(cb530b6f) SHA1(95590bbb433db9c4317f535723b29516b9b9fcbf))
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/modellot.cpp b/src/mame/drivers/modellot.cpp
index edb1b3d6929..6f6c84b871f 100644
--- a/src/mame/drivers/modellot.cpp
+++ b/src/mame/drivers/modellot.cpp
@@ -42,12 +42,16 @@ All input must in UPPER case.
***********************************************************************************/
#include "emu.h"
+
#include "cpu/z80/z80.h"
#include "machine/keyboard.h"
+
#include "emupal.h"
#include "screen.h"
+namespace {
+
class modellot_state : public driver_device
{
public:
@@ -74,7 +78,7 @@ private:
u8 m_term_data = 0U;
void machine_start() override;
void machine_reset() override;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -126,20 +130,22 @@ void modellot_state::machine_reset()
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(0xe000, 0xe7ff, "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;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xe000, 0xe7ff,
+ "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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void modellot_state::machine_start()
@@ -246,6 +252,8 @@ ROM_START( modellot )
ROM_CONTINUE(0x600, 0x200)
ROM_END
+} // anonymous namespace
+
/* Driver */
COMP( 1979, modellot, 0, 0, modellot, modellot, modellot_state, empty_init, "General Processor", "Modello T", MACHINE_IS_SKELETON | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/okean240.cpp b/src/mame/drivers/okean240.cpp
index 73619a79b1e..1ba324fc57c 100644
--- a/src/mame/drivers/okean240.cpp
+++ b/src/mame/drivers/okean240.cpp
@@ -75,18 +75,22 @@ Keyboard:
**********************************************************************************************/
#include "emu.h"
+
+#include "bus/rs232/rs232.h"
#include "cpu/i8085/i8085.h"
-#include "machine/keyboard.h"
#include "machine/i8251.h"
#include "machine/i8255.h"
+#include "machine/keyboard.h"
#include "machine/pic8259.h"
#include "machine/pit8253.h"
-#include "bus/rs232/rs232.h"
#include "machine/timer.h"
-#include "emupal.h"
+
#include "screen.h"
+#include "emupal.h"
+namespace {
+
class okean240_state : public driver_device
{
public:
@@ -132,7 +136,7 @@ private:
required_shared_ptr<u8> m_p_videoram;
optional_ioport_array<11> m_io_keyboard;
optional_ioport m_io_modifiers;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<i8080_cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -399,20 +403,22 @@ void okean240_state::machine_reset()
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x07ff, m_rom+0x2000); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xe000, 0xe7ff, "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;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xe000, 0xe7ff,
+ "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);
+ }
+ },
+ &m_rom_shadow_tap);
}
u32 okean240_state::screen_update_okean240(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@@ -554,6 +560,8 @@ ROM_START( okean240t )
ROM_LOAD( "test.bin", 0x2000, 0x0800, CRC(e9e2b7b9) SHA1(e4e0b6984a2514b6ba3e97500d487ea1a68b7577) )
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/pimps.cpp b/src/mame/drivers/pimps.cpp
index fa7a7614a3e..3e7d07075e6 100644
--- a/src/mame/drivers/pimps.cpp
+++ b/src/mame/drivers/pimps.cpp
@@ -68,12 +68,15 @@ Assembler:
****************************************************************************/
#include "emu.h"
+
+#include "bus/rs232/rs232.h"
#include "cpu/i8085/i8085.h"
#include "machine/clock.h"
#include "machine/i8251.h"
-#include "bus/rs232/rs232.h"
+namespace {
+
class pimps_state : public driver_device
{
public:
@@ -91,7 +94,7 @@ private:
void mem_map(address_map &map);
virtual void machine_reset() override;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -120,20 +123,22 @@ void pimps_state::machine_reset()
{
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(0xf000, 0xf7ff, "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;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xf000, 0xf7ff,
+ "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);
+ }
+ },
+ &m_rom_shadow_tap);
}
// baud is not documented, we will use 9600
@@ -185,6 +190,8 @@ ROM_START( pimps )
ROM_LOAD( "pimps.bin", 0x0000, 0x1000, CRC(5da1898f) SHA1(d20e31d0981a1f54c83186dbdfcf4280e49970d0))
ROM_END
+} // anonymous namespace
+
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS */
diff --git a/src/mame/drivers/plan80.cpp b/src/mame/drivers/plan80.cpp
index 095126b055d..6494cd47bec 100644
--- a/src/mame/drivers/plan80.cpp
+++ b/src/mame/drivers/plan80.cpp
@@ -24,13 +24,17 @@ ToDo:
****************************************************************************/
#include "emu.h"
+
#include "cpu/i8085/i8085.h"
+#include "sound/spkrdev.h"
+
#include "emupal.h"
#include "screen.h"
-#include "sound/spkrdev.h"
#include "speaker.h"
+namespace {
+
class plan80_state : public driver_device
{
public:
@@ -57,7 +61,7 @@ private:
bool m_spk_pol = 0;
virtual void machine_reset() override;
virtual void machine_start() override;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -171,20 +175,22 @@ void plan80_state::machine_reset()
{
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;
- });
+ m_rom_shadow_tap.remove();
+ 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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void plan80_state::machine_start()
@@ -278,6 +284,8 @@ ROM_START( plan80 )
ROM_LOAD( "pl80gzn.bin", 0x0000, 0x0800, CRC(b4ddbdb6) SHA1(31bf9cf0f2ed53f48dda29ea830f74cea7b9b9b2) )
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/positron.cpp b/src/mame/drivers/positron.cpp
index 92e9c5ef7fd..8b59791d7e4 100644
--- a/src/mame/drivers/positron.cpp
+++ b/src/mame/drivers/positron.cpp
@@ -22,7 +22,10 @@
#include "emu.h"
+#include "bus/ieee488/ieee488.h"
+#include "bus/rs232/rs232.h"
#include "cpu/m6809/m6809.h"
+#include "imagedev/cassette.h"
#include "machine/6840ptm.h"
#include "machine/6850acia.h"
#include "machine/bankdev.h"
@@ -32,13 +35,10 @@
#include "machine/ram.h"
#include "machine/tms9914.h"
#include "video/saa5050.h"
-#include "bus/ieee488/ieee488.h"
-#include "bus/rs232/rs232.h"
-#include "imagedev/cassette.h"
-#include "speaker.h"
#include "emupal.h"
#include "screen.h"
+#include "speaker.h"
// Debugging
@@ -112,7 +112,7 @@ private:
required_shared_ptr<uint8_t> m_lores_ram;
required_device<cassette_image_device> m_cassette;
- memory_passthrough_handler *m_mmu_shadow_tap;
+ memory_passthrough_handler m_mmu_shadow_tap;
uint8_t m_prev_opcode;
};
@@ -152,30 +152,32 @@ void positron_state::machine_reset()
m_mmu.active_key = 0;
address_space &program = m_maincpu->space(AS_PROGRAM);
- m_mmu_shadow_tap = program.install_read_tap(0x0000, 0xffff, "mmu_shadow_r",[this](offs_t offset, u8 &data, u8 mem_mask)
- {
- if (!machine().side_effects_disabled())
- {
- if (m_fuse_timer_running && m_prev_opcode == 0x3b) // RTI
- {
- m_mmu.active_key = m_mmu.operate_key;
- logerror("mmu_shadow_r: switched to task %d\n", m_mmu.active_key);
- m_mmu.sbit = false;
- m_fuse_timer_running = false;
- }
- else if (m_irq_ack && offset >= 0xfff0 && offset != 0xffff)
+ m_mmu_shadow_tap.remove();
+ m_mmu_shadow_tap = program.install_read_tap(
+ 0x0000, 0xffff,
+ "mmu_shadow_r",
+ [this] (offs_t offset, u8 &data, u8 mem_mask)
{
- m_mmu.active_key = 0;
- logerror("irq_callback: switched to task %d\n", m_mmu.active_key);
- m_mmu.sbit = true;
- m_irq_ack = false;
- data = m_maincpu->space(AS_PROGRAM).read_byte(offset);
- }
- }
-
- // return the original data
- return data;
- });
+ if (!machine().side_effects_disabled())
+ {
+ if (m_fuse_timer_running && m_prev_opcode == 0x3b) // RTI
+ {
+ m_mmu.active_key = m_mmu.operate_key;
+ logerror("mmu_shadow_r: switched to task %d\n", m_mmu.active_key);
+ m_mmu.sbit = false;
+ m_fuse_timer_running = false;
+ }
+ else if (m_irq_ack && offset >= 0xfff0 && offset != 0xffff)
+ {
+ m_mmu.active_key = 0;
+ logerror("irq_callback: switched to task %d\n", m_mmu.active_key);
+ m_mmu.sbit = true;
+ m_irq_ack = false;
+ data = m_maincpu->space(AS_PROGRAM).read_byte(offset);
+ }
+ }
+ },
+ &m_mmu_shadow_tap);
}
diff --git a/src/mame/drivers/ptcsol.cpp b/src/mame/drivers/ptcsol.cpp
index 803c734cda2..4020486d6f1 100644
--- a/src/mame/drivers/ptcsol.cpp
+++ b/src/mame/drivers/ptcsol.cpp
@@ -133,18 +133,7 @@
#include "formats/sol_cas.h"
-struct cass_data_t {
- struct {
- int length; /* time cassette level is at input.level */
- int level; /* cassette level */
- int bit; /* bit being read */
- } input;
- struct {
- int length; /* time cassette level is at output.level */
- int level; /* cassette level */
- int bit; /* bit to output */
- } output;
-};
+namespace {
class sol20_state : public driver_device
{
@@ -180,6 +169,20 @@ private:
TIMER_SOL20_CASSETTE_TC,
};
+ struct cass_data_t
+ {
+ struct {
+ int length; /* time cassette level is at input.level */
+ int level; /* cassette level */
+ int bit; /* bit being read */
+ } input;
+ struct {
+ int length; /* time cassette level is at output.level */
+ int level; /* cassette level */
+ int bit; /* bit to output */
+ } output;
+ };
+
u8 sol20_f8_r();
u8 sol20_fa_r();
u8 sol20_fc_r();
@@ -205,7 +208,7 @@ private:
cass_data_t m_cass_data;
emu_timer *m_cassette_timer;
cassette_image_device *cassette_device_image();
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<i8080a_cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -625,20 +628,22 @@ void sol20_state::machine_reset()
// Boot tap
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(0xc000, 0xc7ff, "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);
- }
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xc000, 0xc7ff,
+ "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();
- // return the original data
- return data;
- });
+ // reinstall RAM over the ROM shadow
+ m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x07ff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
@@ -821,6 +826,8 @@ ROM_START( sol20 )
ROM_LOAD( "8574.u18", 0x000, 0x100, NO_DUMP ) // 256x4 bipolar PROM or mask ROM; second half unused
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1976, sol20, 0, 0, sol20, sol20, sol20_state, empty_init, "Processor Technology Corporation", "Sol-20 Terminal Computer", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/pulsar.cpp b/src/mame/drivers/pulsar.cpp
index 9bd1e394bc9..f5cbab47b88 100644
--- a/src/mame/drivers/pulsar.cpp
+++ b/src/mame/drivers/pulsar.cpp
@@ -39,17 +39,20 @@ X - Test off-board memory banks
****************************************************************************/
#include "emu.h"
+
#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
#include "imagedev/floppy.h"
-#include "machine/z80daisy.h"
-#include "machine/z80sio.h"
-#include "machine/msm5832.h"
-#include "machine/i8255.h"
#include "machine/com8116.h"
+#include "machine/i8255.h"
+#include "machine/msm5832.h"
#include "machine/wd_fdc.h"
+#include "machine/z80daisy.h"
+#include "machine/z80sio.h"
+namespace {
+
class pulsar_state : public driver_device
{
public:
@@ -80,7 +83,7 @@ private:
void mem_map(address_map &map);
floppy_image_device *m_floppy;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<z80_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -191,20 +194,22 @@ void pulsar_state::machine_reset()
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;
- });
+ m_rom_shadow_tap.remove();
+ 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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void pulsar_state::machine_start()
@@ -264,6 +269,8 @@ ROM_START( pulsarlb )
ROMX_LOAD( "lboot6.u2", 0x0000, 0x0800, CRC(3bca9096) SHA1(ff99288e51a9e832785ce8e3ab5a9452b1064231), ROM_BIOS(1))
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/sys2900.cpp b/src/mame/drivers/sys2900.cpp
index 8862e9954ec..de993bd64f7 100644
--- a/src/mame/drivers/sys2900.cpp
+++ b/src/mame/drivers/sys2900.cpp
@@ -42,15 +42,19 @@ Status:
*****************************************************************************************/
#include "emu.h"
+
+//#include "bus/s100/s100.h"
#include "cpu/z80/z80.h"
#include "machine/z80ctc.h"
#include "machine/z80pio.h"
#include "machine/z80sio.h"
-//#include "bus/s100/s100.h"
+
#include "emupal.h"
#include "screen.h"
+namespace {
+
class sys2900_state : public driver_device
{
public:
@@ -70,7 +74,7 @@ private:
virtual void machine_reset() override;
virtual void machine_start() override;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<z80_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -105,20 +109,22 @@ void sys2900_state::machine_reset()
{
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(0xf000, 0xf7ff, "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;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xf000, 0xf7ff,
+ "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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void sys2900_state::machine_start()
@@ -160,6 +166,8 @@ ROM_START( sys2900 )
ROM_LOAD( "104401cpc.bin", 0x0000, 0x0800, CRC(6c8848bc) SHA1(890e0578e5cb0e3433b4b173e5ed71d72a92af26)) // label says BE 5 1/4 107701
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/tekigw.cpp b/src/mame/drivers/tekigw.cpp
index 8c63b079572..41abd5521f5 100644
--- a/src/mame/drivers/tekigw.cpp
+++ b/src/mame/drivers/tekigw.cpp
@@ -128,9 +128,10 @@ private:
u8 m_ssr; // system status register
// ram parity state
- memory_passthrough_handler *m_parity_mph;
- std::unique_ptr<u32[]> m_parity_flag;
+ memory_passthrough_handler m_parity_mph;
+ std::unique_ptr<u32 []> m_parity_flag;
unsigned m_parity_bad;
+ bool m_parity_check;
};
class tek6100_state : public tekigw_state_base
@@ -233,6 +234,8 @@ void tekigw_state_base::machine_start()
m_per = 0;
m_ssr = 0;
+ m_parity_check = false;
+
m_buserror = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tek4132_state::buserror), this));
}
@@ -349,93 +352,97 @@ void tekigw_state_base::scr_w(u8 data)
m_ssr &= ~(SSR_BERR | SSR_DMACH);
// install parity handlers
- if (!(m_scr & SCR_PARB) && (data & SCR_PARB) && !m_parity_mph)
+ if (!(m_scr & SCR_PARB) && (data & SCR_PARB) && !m_parity_check)
{
m_parity_flag = std::make_unique<u32[]>(m_ram->size() / 32);
m_parity_bad = 0;
+ m_parity_check = true;
- m_parity_mph = m_cpu->space(0).install_readwrite_tap(0, m_ram->mask(), "parity",
- [this](offs_t offset, u16 &data, u16 mem_mask)
- {
- if (m_scr & SCR_PARE)
- {
- bool error = false;
-
- // check bad parity (lo)
- if ((mem_mask & 0x00ff) && BIT(m_parity_flag[offset / 32], (offset & 31) + 0))
- {
- m_ssr |= SSR_PERR;
- m_per &= ~PER_PARADR;
- m_per |= PER_LOERR | ((offset >> 9) & PER_PARADR);
-
- error = true;
- }
-
- // check bad parity (hi)
- if ((mem_mask & 0xff00) && BIT(m_parity_flag[offset / 32], (offset & 31) + 1))
- {
- m_ssr |= SSR_PERR;
- m_per &= ~PER_PARADR;
- m_per |= PER_HIERR | ((offset >> 9) & PER_PARADR);
-
- error = true;
- }
-
- if (error && (m_scr & SCR_NMIE))
- m_cpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
- }
- },
- [this](offs_t offset, u16 &data, u16 mem_mask)
- {
- if (m_scr & SCR_PARB)
+ m_parity_mph = m_cpu->space(0).install_readwrite_tap(
+ 0, m_ram->mask(),
+ "parity",
+ [this] (offs_t offset, u16 &data, u16 mem_mask)
{
- // mark bad parity (lo)
- if ((mem_mask & 0x00ff) && !BIT(m_parity_flag[offset / 32], (offset & 31) + 0))
- {
- m_parity_flag[offset / 32] |= 1U << ((offset & 31) + 0);
- m_parity_bad++;
- }
-
- // mark bad parity (hi)
- if ((mem_mask & 0xff00) && !BIT(m_parity_flag[offset / 32], (offset & 31) + 1))
+ if (m_scr & SCR_PARE)
{
- m_parity_flag[offset / 32] |= 1U << ((offset & 31) + 1);
- m_parity_bad++;
+ bool error = false;
+
+ // check bad parity (lo)
+ if ((mem_mask & 0x00ff) && BIT(m_parity_flag[offset / 32], (offset & 31) + 0))
+ {
+ m_ssr |= SSR_PERR;
+ m_per &= ~PER_PARADR;
+ m_per |= PER_LOERR | ((offset >> 9) & PER_PARADR);
+
+ error = true;
+ }
+
+ // check bad parity (hi)
+ if ((mem_mask & 0xff00) && BIT(m_parity_flag[offset / 32], (offset & 31) + 1))
+ {
+ m_ssr |= SSR_PERR;
+ m_per &= ~PER_PARADR;
+ m_per |= PER_HIERR | ((offset >> 9) & PER_PARADR);
+
+ error = true;
+ }
+
+ if (error && (m_scr & SCR_NMIE))
+ m_cpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
- }
- else
+ },
+ [this] (offs_t offset, u16 &data, u16 mem_mask)
{
- // clear bad parity (lo)
- if ((mem_mask & 0x00ff) && BIT(m_parity_flag[offset / 32], (offset & 31) + 0))
+ if (m_scr & SCR_PARB)
{
- m_parity_flag[offset / 32] &= ~(1U << ((offset & 31) + 0));
- m_parity_bad--;
+ // mark bad parity (lo)
+ if ((mem_mask & 0x00ff) && !BIT(m_parity_flag[offset / 32], (offset & 31) + 0))
+ {
+ m_parity_flag[offset / 32] |= 1U << ((offset & 31) + 0);
+ m_parity_bad++;
+ }
+
+ // mark bad parity (hi)
+ if ((mem_mask & 0xff00) && !BIT(m_parity_flag[offset / 32], (offset & 31) + 1))
+ {
+ m_parity_flag[offset / 32] |= 1U << ((offset & 31) + 1);
+ m_parity_bad++;
+ }
}
-
- // clear bad parity (hi)
- if ((mem_mask & 0xff00) && BIT(m_parity_flag[offset / 32], (offset & 31) + 1))
- {
- m_parity_flag[offset / 32] &= ~(1U << ((offset & 31) + 1));
- m_parity_bad--;
- }
-
- // stop checking parity if all clear
- if (!m_parity_bad)
+ else
{
- m_parity_flag.reset();
- m_parity_mph->remove();
- m_parity_mph = nullptr;
+ // clear bad parity (lo)
+ if ((mem_mask & 0x00ff) && BIT(m_parity_flag[offset / 32], (offset & 31) + 0))
+ {
+ m_parity_flag[offset / 32] &= ~(1U << ((offset & 31) + 0));
+ m_parity_bad--;
+ }
+
+ // clear bad parity (hi)
+ if ((mem_mask & 0xff00) && BIT(m_parity_flag[offset / 32], (offset & 31) + 1))
+ {
+ m_parity_flag[offset / 32] &= ~(1U << ((offset & 31) + 1));
+ m_parity_bad--;
+ }
+
+ // stop checking parity if all clear
+ if (!m_parity_bad)
+ {
+ m_parity_flag.reset();
+ m_parity_mph.remove();
+ m_parity_check = false;
+ }
}
- }
- });
+ },
+ &m_parity_mph);
}
// stop checking parity if all clear
- if ((m_scr & SCR_PARB) && !(data & SCR_PARB) && m_parity_mph && !m_parity_bad)
+ if ((m_scr & SCR_PARB) && !(data & SCR_PARB) && m_parity_check && !m_parity_bad)
{
m_parity_flag.reset();
- m_parity_mph->remove();
- m_parity_mph = nullptr;
+ m_parity_mph.remove();
+ m_parity_check = false;
}
if (data & SCR_PARE)
diff --git a/src/mame/drivers/unior.cpp b/src/mame/drivers/unior.cpp
index 174d760028c..9b6d8590f2b 100644
--- a/src/mame/drivers/unior.cpp
+++ b/src/mame/drivers/unior.cpp
@@ -36,20 +36,24 @@ ToDo:
**********************************************************************************************/
#include "emu.h"
+
#include "cpu/i8085/i8085.h"
+#include "imagedev/cassette.h"
#include "machine/i8251.h"
-#include "machine/pit8253.h"
#include "machine/i8255.h"
#include "machine/i8257.h"
-#include "video/i8275.h"
-#include "imagedev/cassette.h"
-#include "sound/spkrdev.h"
+#include "machine/pit8253.h"
#include "machine/timer.h"
+#include "sound/spkrdev.h"
+#include "video/i8275.h"
+
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
+namespace {
+
class unior_state : public driver_device
{
public:
@@ -96,7 +100,7 @@ private:
virtual void machine_reset() override;
virtual void machine_start() override;
std::unique_ptr<u8[]> m_vram;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -441,20 +445,22 @@ void unior_state::machine_reset()
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;
- });
+ m_rom_shadow_tap.remove();
+ 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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void unior_state::machine_start()
@@ -545,6 +551,8 @@ ROM_START( unior )
ROM_LOAD( "palette.rom.d9", 0x0800, 0x0040, BAD_DUMP CRC(b4574ceb) SHA1(f7a82c61ab137de8f6a99b0c5acf3ac79291f26a))
ROM_END
+} // anonymous namespace
+
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
diff --git a/src/mame/drivers/vector4.cpp b/src/mame/drivers/vector4.cpp
index 545cd47502a..b26d4f13679 100644
--- a/src/mame/drivers/vector4.cpp
+++ b/src/mame/drivers/vector4.cpp
@@ -42,13 +42,16 @@ TODO:
****************************************************************************/
#include "emu.h"
+
+#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
#include "machine/clock.h"
#include "machine/i8251.h"
-#include "machine/pit8253.h"
#include "machine/i8255.h"
-#include "bus/rs232/rs232.h"
+#include "machine/pit8253.h"
+
+namespace {
class vector4_state : public driver_device
{
@@ -66,7 +69,7 @@ private:
void vector4_io(address_map &map);
void vector4_mem(address_map &map);
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -112,20 +115,22 @@ void vector4_state::machine_reset()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x0fff, m_rom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xe000, 0xefff, "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, 0x0fff, m_ram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xe000, 0xefff,
+ "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, 0x0fff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
@@ -204,6 +209,8 @@ ROM_START( vector4 )
ROM_LOAD( "chargen2.bin", 0x0800, 0x0800, NO_DUMP )
ROM_END
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/drivers/z80ne.cpp b/src/mame/drivers/z80ne.cpp
index 7c7b9af8322..fe974fe7948 100644
--- a/src/mame/drivers/z80ne.cpp
+++ b/src/mame/drivers/z80ne.cpp
@@ -128,13 +128,16 @@ Natural Keyboard and Paste:
/* Core includes */
#include "emu.h"
-#include "cpu/z80/z80.h"
#include "includes/z80ne.h"
-#include "formats/dmk_dsk.h"
+
+#include "cpu/z80/z80.h"
#include "machine/ram.h"
+
#include "softlist_dev.h"
#include "speaker.h"
+#include "formats/dmk_dsk.h"
+
/* Layout */
#include "z80ne.lh"
#include "z80net.lh"
diff --git a/src/mame/drivers/z9001.cpp b/src/mame/drivers/z9001.cpp
index 27ca8890340..382b750684e 100644
--- a/src/mame/drivers/z9001.cpp
+++ b/src/mame/drivers/z9001.cpp
@@ -50,6 +50,9 @@ ToDo:
// temporary
#include "machine/keyboard.h"
+
+namespace {
+
class z9001_state : public driver_device
{
public:
@@ -82,7 +85,7 @@ private:
bool m_cassbit = 0;
virtual void machine_reset() override;
virtual void machine_start() override;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<z80_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_shared_ptr<u8> m_ram;
@@ -150,20 +153,22 @@ void z9001_state::machine_reset()
{
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x0fff, m_rom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xf000, 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, 0x0fff, m_ram);
- }
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xf000, 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();
- // return the original data
- return data;
- });
+ // reinstall ram over the rom shadow
+ m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x0fff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void z9001_state::machine_start()
@@ -342,6 +347,8 @@ ROM_END
#define rom_kc87_21 rom_kc87_20
+} // anonymous namespace
+
/* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
diff --git a/src/mame/includes/dai.h b/src/mame/includes/dai.h
index 00dfdf79bf3..62a0745cabb 100644
--- a/src/mame/includes/dai.h
+++ b/src/mame/includes/dai.h
@@ -9,13 +9,15 @@
#ifndef MAME_INCLUDES_DAI_H
#define MAME_INCLUDES_DAI_H
-#include "cpu/i8085/i8085.h"
#include "audio/dai_snd.h"
+
+#include "cpu/i8085/i8085.h"
+#include "imagedev/cassette.h"
#include "machine/i8255.h"
#include "machine/pit8253.h"
-#include "machine/tms5501.h"
-#include "imagedev/cassette.h"
#include "machine/timer.h"
+#include "machine/tms5501.h"
+
#include "emupal.h"
@@ -65,7 +67,7 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_device<pit8253_device> m_pit;
required_device<tms5501_device> m_tms5501;
diff --git a/src/mame/includes/mikro80.h b/src/mame/includes/mikro80.h
index 9c425ac96ee..659aa06dab8 100644
--- a/src/mame/includes/mikro80.h
+++ b/src/mame/includes/mikro80.h
@@ -11,8 +11,8 @@
#pragma once
-#include "machine/i8255.h"
#include "imagedev/cassette.h"
+#include "machine/i8255.h"
#include "sound/dac.h"
class mikro80_state : public driver_device
@@ -59,7 +59,7 @@ private:
void mikro80_mem(address_map &map);
void radio99_io(address_map &map);
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_shared_ptr<uint8_t> m_aram;
required_shared_ptr<uint8_t> m_vram;
required_device<i8255_device> m_ppi;
diff --git a/src/mame/includes/mikromik.h b/src/mame/includes/mikromik.h
index a30c2f36852..8061892e7ad 100644
--- a/src/mame/includes/mikromik.h
+++ b/src/mame/includes/mikromik.h
@@ -7,7 +7,6 @@
#include "bus/rs232/rs232.h"
#include "cpu/i8085/i8085.h"
-#include "formats/mm_dsk.h"
#include "imagedev/floppy.h"
#include "machine/am9517a.h"
#include "machine/bankdev.h"
@@ -15,12 +14,15 @@
#include "machine/mm1kb.h"
#include "machine/pit8253.h"
#include "machine/ram.h"
-#include "machine/z80sio.h"
#include "machine/upd765.h"
+#include "machine/z80sio.h"
#include "video/i8275.h"
#include "video/upd7220.h"
+
#include "emupal.h"
+#include "formats/mm_dsk.h"
+
#define SCREEN_TAG "screen"
#define I8085A_TAG "ic40"
#define I8212_TAG "ic12"
diff --git a/src/mame/includes/radio86.h b/src/mame/includes/radio86.h
index 27c97170428..c0263cb852c 100644
--- a/src/mame/includes/radio86.h
+++ b/src/mame/includes/radio86.h
@@ -81,7 +81,7 @@ protected:
uint8_t memory_read_byte(offs_t offset);
void memory_write_byte(offs_t offset, uint8_t data);
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<cpu_device> m_maincpu;
required_device<cassette_image_device> m_cassette;
optional_device<generic_slot_device> m_cart; // for ROMDisk - only Radio86K & Orion?
diff --git a/src/mame/includes/sorcerer.h b/src/mame/includes/sorcerer.h
index 3cf2e5a9e35..69ee38c32a3 100644
--- a/src/mame/includes/sorcerer.h
+++ b/src/mame/includes/sorcerer.h
@@ -10,22 +10,23 @@
#pragma once
-#include "cpu/z80/z80.h"
-#include "machine/ay31015.h"
-#include "machine/clock.h"
#include "bus/centronics/ctronics.h"
+#include "bus/generic/carts.h"
+#include "bus/generic/slot.h"
#include "bus/rs232/rs232.h"
-#include "machine/ram.h"
+#include "cpu/z80/z80.h"
#include "imagedev/cassette.h"
-#include "imagedev/snapquik.h"
#include "imagedev/floppy.h"
-#include "formats/sorc_dsk.h"
-#include "formats/sorc_cas.h"
+#include "imagedev/snapquik.h"
+#include "machine/ay31015.h"
+#include "machine/clock.h"
#include "machine/micropolis.h"
+#include "machine/ram.h"
#include "machine/wd_fdc.h"
#include "machine/z80dma.h"
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
+
+#include "formats/sorc_cas.h"
+#include "formats/sorc_dsk.h"
class sorcerer_state : public driver_device
@@ -141,7 +142,7 @@ protected:
required_ioport m_iop_config;
required_ioport m_iop_vs;
required_ioport_array<16> m_iop_x;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
private:
u8 m_port48;
diff --git a/src/mame/includes/super80.h b/src/mame/includes/super80.h
index 240667f1ef1..f2b05671f69 100644
--- a/src/mame/includes/super80.h
+++ b/src/mame/includes/super80.h
@@ -19,9 +19,11 @@
#include "sound/samples.h"
#include "sound/spkrdev.h"
#include "video/mc6845.h"
+
#include "emupal.h"
#include "screen.h"
+
/* Bits in m_portf0 variable:
d5 cassette LED
d4 super80v rom or pcg bankswitch (1=pcg ram, 0=char gen rom)
@@ -84,7 +86,7 @@ protected:
required_device<screen_device> m_screen;
required_device<z80_device> m_maincpu;
required_region_ptr<u8> m_rom;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_shared_ptr<u8> m_ram;
required_region_ptr<u8> m_p_chargen;
required_device<z80pio_device> m_pio;
@@ -99,11 +101,12 @@ protected:
output_finder<> m_cass_led;
private:
-
void machine_reset() override;
void machine_start() override;
+
void portf1_w(u8 data);
TIMER_DEVICE_CALLBACK_MEMBER(timer_h);
+
uint32_t screen_update_super80(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_super80d(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_super80e(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
diff --git a/src/mame/includes/ut88.h b/src/mame/includes/ut88.h
index 2e3edd16491..dcf8ddb9bec 100644
--- a/src/mame/includes/ut88.h
+++ b/src/mame/includes/ut88.h
@@ -11,12 +11,14 @@
#pragma once
#include "cpu/i8085/i8085.h"
-#include "sound/dac.h"
-#include "machine/i8255.h"
#include "imagedev/cassette.h"
+#include "machine/i8255.h"
#include "machine/timer.h"
+#include "sound/dac.h"
+
#include "emupal.h"
+
class ut88_common : public driver_device
{
public:
@@ -79,7 +81,7 @@ private:
int m_keyboard_mask;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<i8255_device> m_ppi;
required_device<dac_bit_interface> m_dac;
required_shared_ptr<uint8_t> m_vram;
diff --git a/src/mame/includes/z80ne.h b/src/mame/includes/z80ne.h
index 92b66d0e343..2fb3fd8a944 100644
--- a/src/mame/includes/z80ne.h
+++ b/src/mame/includes/z80ne.h
@@ -15,7 +15,6 @@
#pragma once
-#include "video/mc6847.h"
#include "imagedev/cassette.h"
#include "imagedev/floppy.h"
#include "machine/ay31015.h"
@@ -23,6 +22,7 @@
#include "machine/kr2376.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
+#include "video/mc6847.h"
/***************************************************************************
CONSTANTS
@@ -120,7 +120,7 @@ protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param) override;
- memory_passthrough_handler *m_rom_shadow_tap;
+ memory_passthrough_handler m_rom_shadow_tap;
required_device<ay31015_device> m_uart;
required_device<clock_device> m_uart_clock;
required_device<cpu_device> m_maincpu;
diff --git a/src/mame/machine/dai.cpp b/src/mame/machine/dai.cpp
index aba8ac42d19..bd39bfe8212 100644
--- a/src/mame/machine/dai.cpp
+++ b/src/mame/machine/dai.cpp
@@ -73,20 +73,22 @@ void dai_state::machine_reset()
{
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(0xc000, 0xc7ff, "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;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xc000, 0xc7ff,
+ "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);
+ }
+ },
+ &m_rom_shadow_tap);
}
/***************************************************************************
diff --git a/src/mame/machine/fidel_clockdiv.cpp b/src/mame/machine/fidel_clockdiv.cpp
index 0f0d9ebc85f..77fd9de9b16 100644
--- a/src/mame/machine/fidel_clockdiv.cpp
+++ b/src/mame/machine/fidel_clockdiv.cpp
@@ -81,28 +81,29 @@ void fidel_clockdiv_state::div_refresh(ioport_value val)
m_div_timer->adjust(period, 0, period);
// set up memory passthroughs
- if (m_read_tap)
- {
- m_read_tap->remove();
- m_write_tap->remove();
- m_read_tap = nullptr;
- m_write_tap = nullptr;
- }
+ m_read_tap.remove();
+ m_write_tap.remove();
if (val)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
- m_read_tap = program.install_read_tap(0x0000, 0xffff, "program_div_r",[this](offs_t offset, u8 &data, u8 mem_mask)
- {
- if (!machine().side_effects_disabled())
- div_set_cpu_freq(offset & 0x6000);
- return data;
- });
- m_write_tap = program.install_write_tap(0x0000, 0xffff, "program_div_w",[this](offs_t offset, u8 &data, u8 mem_mask)
- {
- div_set_cpu_freq(offset & 0x6000);
- return data;
- });
+ m_read_tap = program.install_read_tap(
+ 0x0000, 0xffff,
+ "program_div_r",
+ [this] (offs_t offset, u8 &data, u8 mem_mask)
+ {
+ if (!machine().side_effects_disabled())
+ div_set_cpu_freq(offset & 0x6000);
+ },
+ &m_read_tap);
+ m_write_tap = program.install_write_tap(
+ 0x0000, 0xffff,
+ "program_div_w",
+ [this] (offs_t offset, u8 &data, u8 mem_mask)
+ {
+ div_set_cpu_freq(offset & 0x6000);
+ },
+ &m_write_tap);
}
}
diff --git a/src/mame/machine/fidel_clockdiv.h b/src/mame/machine/fidel_clockdiv.h
index c068b69afad..daf12fa66d1 100644
--- a/src/mame/machine/fidel_clockdiv.h
+++ b/src/mame/machine/fidel_clockdiv.h
@@ -36,8 +36,8 @@ protected:
private:
inline void div_set_cpu_freq(offs_t offset);
- memory_passthrough_handler *m_read_tap = nullptr;
- memory_passthrough_handler *m_write_tap = nullptr;
+ memory_passthrough_handler m_read_tap;
+ memory_passthrough_handler m_write_tap;
u16 m_div_status;
double m_div_scale;
diff --git a/src/mame/machine/mikro80.cpp b/src/mame/machine/mikro80.cpp
index 747f6be9aaf..1bfe4617854 100644
--- a/src/mame/machine/mikro80.cpp
+++ b/src/mame/machine/mikro80.cpp
@@ -65,25 +65,27 @@ void mikro80_state::machine_reset()
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;
- });
+ m_rom_shadow_tap.remove();
+ 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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void mikro80_state::tape_w(u8 data)
{
- // Todo: this is incorrect, to be fixed when the CMT schematic can be found
+ // TODO: this is incorrect, to be fixed when the CMT schematic can be found
m_cassette->output(BIT(data, 0) ? 1.0 : -1.0);
}
diff --git a/src/mame/machine/radio86.cpp b/src/mame/machine/radio86.cpp
index a347ddfc139..7f3e5705c1a 100644
--- a/src/mame/machine/radio86.cpp
+++ b/src/mame/machine/radio86.cpp
@@ -142,20 +142,22 @@ void radio86_state::machine_reset()
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x0fff, m_rom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xf000, 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, 0x0fff, m_ram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xf000, 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, 0x0fff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void radio86_state::machine_start()
diff --git a/src/mame/machine/sorcerer.cpp b/src/mame/machine/sorcerer.cpp
index e134321e63a..85729ba7041 100644
--- a/src/mame/machine/sorcerer.cpp
+++ b/src/mame/machine/sorcerer.cpp
@@ -498,20 +498,22 @@ void sorcerer_state::machine_reset_common()
portfe_w(0);
space.install_rom(0x0000, 0x0fff, m_rom); // do it here for F3
- m_rom_shadow_tap = space.install_read_tap(0xe000, 0xefff, "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, 0x0fff, m_ram->pointer());
- }
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = space.install_read_tap(
+ 0xe000, 0xefff,
+ "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();
- // return the original data
- return data;
- });
+ // reinstall RAM over the ROM shadow
+ m_maincpu->space(AS_PROGRAM).install_ram(0x0000, 0x0fff, m_ram->pointer());
+ }
+ },
+ &m_rom_shadow_tap);
}
void sorcerer_state::machine_reset()
diff --git a/src/mame/machine/super80.cpp b/src/mame/machine/super80.cpp
index 525451ebbcf..7f508155974 100644
--- a/src/mame/machine/super80.cpp
+++ b/src/mame/machine/super80.cpp
@@ -230,20 +230,22 @@ void super80_state::machine_reset_common()
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x0fff, m_rom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0xc000, 0xcfff, "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, 0x0fff, m_ram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0xc000, 0xcfff,
+ "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, 0x0fff, m_ram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void super80_state::machine_reset()
diff --git a/src/mame/machine/ut88.cpp b/src/mame/machine/ut88.cpp
index 45116248dc6..b94b5f9f1c7 100644
--- a/src/mame/machine/ut88.cpp
+++ b/src/mame/machine/ut88.cpp
@@ -70,20 +70,22 @@ void ut88_state::machine_reset()
m_keyboard_mask = 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;
- });
+ m_rom_shadow_tap.remove();
+ 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);
+ }
+ },
+ &m_rom_shadow_tap);
}
void ut88_state::machine_start()
diff --git a/src/mame/machine/z80ne.cpp b/src/mame/machine/z80ne.cpp
index 8c9519d300f..e2159af8010 100644
--- a/src/mame/machine/z80ne.cpp
+++ b/src/mame/machine/z80ne.cpp
@@ -265,20 +265,22 @@ void z80ne_state::machine_reset()
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_rom(0x0000, 0x03ff, m_rom); // do it here for F3
- m_rom_shadow_tap = program.install_read_tap(0x8000, 0x83ff, "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, 0x03ff, m_mram);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0x8000, 0x83ff,
+ "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, 0x03ff, m_mram);
+ }
+ },
+ &m_rom_shadow_tap);
}
void z80net_state::machine_reset()
@@ -303,20 +305,22 @@ void z80netf_state::machine_reset()
if ((m_io_config->read() & 0x07) != 2)
{
address_space &program = m_maincpu->space(AS_PROGRAM);
- m_rom_shadow_tap = program.install_read_tap(0x8000, 0xf3ff, "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_bank1->set_entry(0);
- }
-
- // return the original data
- return data;
- });
+ m_rom_shadow_tap.remove();
+ m_rom_shadow_tap = program.install_read_tap(
+ 0x8000, 0xf3ff,
+ "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_bank1->set_entry(0);
+ }
+ },
+ &m_rom_shadow_tap);
}
}