summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/8x300/8x300.cpp12
-rw-r--r--src/devices/cpu/8x300/8x300.h6
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.cpp23
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.h8
-rw-r--r--src/devices/cpu/am29000/am29000.cpp15
-rw-r--r--src/devices/cpu/am29000/am29000.h11
-rw-r--r--src/devices/cpu/am29000/am29ops.h10
-rw-r--r--src/devices/cpu/arm/arm.cpp8
-rw-r--r--src/devices/cpu/arm/arm.h2
-rw-r--r--src/devices/cpu/arm7/arm7.cpp12
-rw-r--r--src/devices/cpu/arm7/arm7.h2
-rw-r--r--src/devices/cpu/asap/asap.cpp40
-rw-r--r--src/devices/cpu/asap/asap.h4
-rw-r--r--src/devices/cpu/bcp/dp8344.cpp23
-rw-r--r--src/devices/cpu/bcp/dp8344.h6
-rw-r--r--src/devices/cpu/capricorn/capricorn.cpp10
-rw-r--r--src/devices/cpu/capricorn/capricorn.h4
-rw-r--r--src/devices/cpu/ccpu/ccpu.cpp18
-rw-r--r--src/devices/cpu/ccpu/ccpu.h8
-rw-r--r--src/devices/cpu/cop400/cop400.cpp15
-rw-r--r--src/devices/cpu/cop400/cop400.h7
-rw-r--r--src/devices/cpu/cosmac/cosmac.cpp21
-rw-r--r--src/devices/cpu/cosmac/cosmac.h6
-rw-r--r--src/devices/cpu/cr16b/cr16b.cpp6
-rw-r--r--src/devices/cpu/cr16b/cr16b.h4
-rw-r--r--src/devices/cpu/cubeqcpu/cubeqcpu.cpp18
-rw-r--r--src/devices/cpu/cubeqcpu/cubeqcpu.h13
-rw-r--r--src/devices/cpu/diablo/diablo1300.cpp21
-rw-r--r--src/devices/cpu/diablo/diablo1300.h6
-rw-r--r--src/devices/cpu/dsp16/dsp16.cpp16
-rw-r--r--src/devices/cpu/dsp16/dsp16.h2
-rw-r--r--src/devices/cpu/dsp16/dsp16fe.cpp6
-rw-r--r--src/devices/cpu/dsp16/dsp16fe.h8
-rw-r--r--src/devices/cpu/dsp32/dsp32.cpp20
-rw-r--r--src/devices/cpu/dsp32/dsp32.h4
-rw-r--r--src/devices/cpu/dsp56156/dsp56156.cpp10
-rw-r--r--src/devices/cpu/dsp56156/dsp56156.h6
-rw-r--r--src/devices/cpu/dsp56156/dsp56ops.hxx46
-rw-r--r--src/devices/cpu/dsp56156/dsp56pcu.cpp6
-rw-r--r--src/devices/cpu/dspp/dspp.cpp25
-rw-r--r--src/devices/cpu/dspp/dspp.h8
-rw-r--r--src/devices/cpu/dspp/dsppdrc.cpp8
-rw-r--r--src/devices/cpu/e132xs/e132xs.cpp18
-rw-r--r--src/devices/cpu/e132xs/e132xs.h3
-rw-r--r--src/devices/cpu/esrip/esrip.cpp6
-rw-r--r--src/devices/cpu/esrip/esrip.h4
-rw-r--r--src/devices/cpu/f8/f8.cpp147
-rw-r--r--src/devices/cpu/f8/f8.h7
-rw-r--r--src/devices/cpu/fr/fr.cpp8
-rw-r--r--src/devices/cpu/fr/fr.h4
-rw-r--r--src/devices/cpu/g65816/g65816.cpp7
-rw-r--r--src/devices/cpu/g65816/g65816.h7
-rw-r--r--src/devices/cpu/g65816/g65816cm.h8
-rw-r--r--src/devices/cpu/h6280/h6280.cpp40
-rw-r--r--src/devices/cpu/h6280/h6280.h6
-rw-r--r--src/devices/cpu/h8/h8.cpp18
-rw-r--r--src/devices/cpu/h8/h8.h5
-rw-r--r--src/devices/cpu/h8500/h8500.cpp4
-rw-r--r--src/devices/cpu/h8500/h8500.h2
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.cpp18
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.h6
-rw-r--r--src/devices/cpu/i386/athlon.cpp54
-rw-r--r--src/devices/cpu/i386/athlon.h6
-rw-r--r--src/devices/cpu/i386/i386.cpp4
-rw-r--r--src/devices/cpu/i386/i386.h16
-rw-r--r--src/devices/cpu/i8008/i8008.cpp20
-rw-r--r--src/devices/cpu/i8008/i8008.h6
-rw-r--r--src/devices/cpu/i8085/i8085.cpp32
-rw-r--r--src/devices/cpu/i8085/i8085.h7
-rw-r--r--src/devices/cpu/i86/i86.cpp8
-rw-r--r--src/devices/cpu/i86/i86.h3
-rw-r--r--src/devices/cpu/i960/i960.cpp130
-rw-r--r--src/devices/cpu/i960/i960.h4
-rw-r--r--src/devices/cpu/ie15/ie15.cpp19
-rw-r--r--src/devices/cpu/ie15/ie15.h6
-rw-r--r--src/devices/cpu/jaguar/jaguar.cpp24
-rw-r--r--src/devices/cpu/jaguar/jaguar.h6
-rw-r--r--src/devices/cpu/ks0164/ks0164.cpp78
-rw-r--r--src/devices/cpu/ks0164/ks0164.h4
-rw-r--r--src/devices/cpu/lc8670/lc8670.cpp34
-rw-r--r--src/devices/cpu/lc8670/lc8670.h8
-rw-r--r--src/devices/cpu/lh5801/5801tbl.hxx342
-rw-r--r--src/devices/cpu/lh5801/lh5801.cpp14
-rw-r--r--src/devices/cpu/lh5801/lh5801.h8
-rw-r--r--src/devices/cpu/m37710/m37710.cpp4
-rw-r--r--src/devices/cpu/m37710/m37710.h4
-rw-r--r--src/devices/cpu/m37710/m37710cm.h12
-rw-r--r--src/devices/cpu/m6502/m4510.cpp8
-rw-r--r--src/devices/cpu/m6502/m6502.cpp16
-rw-r--r--src/devices/cpu/m6502/m6502.h4
-rw-r--r--src/devices/cpu/m6502/m6504.cpp8
-rw-r--r--src/devices/cpu/m6502/m6507.cpp8
-rw-r--r--src/devices/cpu/m6502/m6509.cpp12
-rw-r--r--src/devices/cpu/m6502/m6510.cpp16
-rw-r--r--src/devices/cpu/m6502/n2a03.cpp2
-rw-r--r--src/devices/cpu/m6502/r65c19.cpp24
-rw-r--r--src/devices/cpu/m6502/r65c19.h6
-rw-r--r--src/devices/cpu/m6502/st2204.cpp27
-rw-r--r--src/devices/cpu/m6502/st2205u.cpp30
-rw-r--r--src/devices/cpu/m6502/st2xxx.h4
-rw-r--r--src/devices/cpu/m6502/xavix.cpp4
-rw-r--r--src/devices/cpu/m6800/m6800.cpp15
-rw-r--r--src/devices/cpu/m6800/m6800.h4
-rw-r--r--src/devices/cpu/m68000/m68000.h7
-rw-r--r--src/devices/cpu/m68000/m68kcpu.cpp212
-rw-r--r--src/devices/cpu/m6805/6805ops.hxx66
-rw-r--r--src/devices/cpu/m6805/m6805.cpp221
-rw-r--r--src/devices/cpu/m6805/m6805.h224
-rw-r--r--src/devices/cpu/m6805/m6805defs.h54
-rw-r--r--src/devices/cpu/m6805/m68705.cpp44
-rw-r--r--src/devices/cpu/m6805/m68hc05.cpp35
-rw-r--r--src/devices/cpu/m6809/m6809.cpp16
-rw-r--r--src/devices/cpu/m6809/m6809.h4
-rw-r--r--src/devices/cpu/m88000/m88000.cpp6
-rw-r--r--src/devices/cpu/m88000/m88000.h4
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp59
-rw-r--r--src/devices/cpu/mb86233/mb86233.h8
-rw-r--r--src/devices/cpu/mb86235/mb86235.cpp10
-rw-r--r--src/devices/cpu/mb86235/mb86235.h9
-rw-r--r--src/devices/cpu/mb86235/mb86235fe.cpp2
-rw-r--r--src/devices/cpu/mb86235/mb86235ops.cpp16
-rw-r--r--src/devices/cpu/mb88xx/mb88xx.cpp12
-rw-r--r--src/devices/cpu/mb88xx/mb88xx.h7
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.cpp24
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.h8
-rw-r--r--src/devices/cpu/mcs40/mcs40.cpp7
-rw-r--r--src/devices/cpu/mcs40/mcs40.h2
-rw-r--r--src/devices/cpu/mcs48/mcs48.cpp14
-rw-r--r--src/devices/cpu/mcs48/mcs48.h17
-rw-r--r--src/devices/cpu/mcs51/mcs51.cpp43
-rw-r--r--src/devices/cpu/mcs51/mcs51.h7
-rw-r--r--src/devices/cpu/mcs96/mcs96.cpp8
-rw-r--r--src/devices/cpu/mcs96/mcs96.h2
-rw-r--r--src/devices/cpu/mips/mips3.cpp24
-rw-r--r--src/devices/cpu/mips/mips3.h5
-rw-r--r--src/devices/cpu/nanoprocessor/nanoprocessor.cpp14
-rw-r--r--src/devices/cpu/nanoprocessor/nanoprocessor.h6
-rw-r--r--src/devices/cpu/nec/nec.cpp12
-rw-r--r--src/devices/cpu/nec/nec.h3
-rw-r--r--src/devices/cpu/nec/v25.cpp8
-rw-r--r--src/devices/cpu/nec/v25.h3
-rw-r--r--src/devices/cpu/pace/pace.cpp26
-rw-r--r--src/devices/cpu/pace/pace.h4
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.cpp13
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.h5
-rw-r--r--src/devices/cpu/pic16c62x/pic16c62x.cpp22
-rw-r--r--src/devices/cpu/pic16c62x/pic16c62x.h8
-rw-r--r--src/devices/cpu/powerpc/ppc.h2
-rw-r--r--src/devices/cpu/powerpc/ppccom.cpp18
-rw-r--r--src/devices/cpu/pps4/pps4.cpp25
-rw-r--r--src/devices/cpu/pps4/pps4.h8
-rw-r--r--src/devices/cpu/psx/psx.cpp24
-rw-r--r--src/devices/cpu/psx/psx.h4
-rw-r--r--src/devices/cpu/rii/riscii.cpp121
-rw-r--r--src/devices/cpu/rii/riscii.h6
-rw-r--r--src/devices/cpu/rsp/rsp.cpp32
-rw-r--r--src/devices/cpu/rsp/rsp.h4
-rw-r--r--src/devices/cpu/rsp/rspdrc.cpp12
-rw-r--r--src/devices/cpu/rsp/rspfe.cpp2
-rw-r--r--src/devices/cpu/rx01/rx01.cpp16
-rw-r--r--src/devices/cpu/rx01/rx01.h4
-rw-r--r--src/devices/cpu/s2650/s2650.cpp27
-rw-r--r--src/devices/cpu/s2650/s2650.h5
-rw-r--r--src/devices/cpu/saturn/satops.ipp8
-rw-r--r--src/devices/cpu/saturn/saturn.cpp5
-rw-r--r--src/devices/cpu/saturn/saturn.h4
-rw-r--r--src/devices/cpu/sc61860/sc61860.cpp4
-rw-r--r--src/devices/cpu/sc61860/sc61860.h5
-rw-r--r--src/devices/cpu/sc61860/scops.hxx12
-rw-r--r--src/devices/cpu/scmp/scmp.cpp14
-rw-r--r--src/devices/cpu/scmp/scmp.h4
-rw-r--r--src/devices/cpu/score/score.cpp18
-rw-r--r--src/devices/cpu/score/score.h4
-rw-r--r--src/devices/cpu/se3208/se3208.cpp98
-rw-r--r--src/devices/cpu/se3208/se3208.h8
-rw-r--r--src/devices/cpu/sh/sh.h3
-rw-r--r--src/devices/cpu/sh/sh2.cpp12
-rw-r--r--src/devices/cpu/sh/sh2.h2
-rw-r--r--src/devices/cpu/sh/sh4.cpp24
-rw-r--r--src/devices/cpu/sparc/sparc.cpp6
-rw-r--r--src/devices/cpu/sparc/sparc.h2
-rw-r--r--src/devices/cpu/ssp1601/ssp1601.cpp14
-rw-r--r--src/devices/cpu/ssp1601/ssp1601.h6
-rw-r--r--src/devices/cpu/t11/t11.cpp14
-rw-r--r--src/devices/cpu/t11/t11.h4
-rw-r--r--src/devices/cpu/tms32010/tms32010.cpp24
-rw-r--r--src/devices/cpu/tms32010/tms32010.h8
-rw-r--r--src/devices/cpu/tms32025/tms32025.cpp140
-rw-r--r--src/devices/cpu/tms32025/tms32025.h8
-rw-r--r--src/devices/cpu/tms32031/tms32031.cpp20
-rw-r--r--src/devices/cpu/tms32031/tms32031.h4
-rw-r--r--src/devices/cpu/tms32051/32051ops.hxx2
-rw-r--r--src/devices/cpu/tms32051/tms32051.cpp22
-rw-r--r--src/devices/cpu/tms32051/tms32051.h8
-rw-r--r--src/devices/cpu/tms32082/mp_ops.cpp54
-rw-r--r--src/devices/cpu/tms32082/tms32082.cpp50
-rw-r--r--src/devices/cpu/tms32082/tms32082.h8
-rw-r--r--src/devices/cpu/tms34010/34010gfx.hxx96
-rw-r--r--src/devices/cpu/tms34010/34010ops.h16
-rw-r--r--src/devices/cpu/tms34010/34010ops.hxx6
-rw-r--r--src/devices/cpu/tms34010/tms34010.cpp20
-rw-r--r--src/devices/cpu/tms34010/tms34010.h26
-rw-r--r--src/devices/cpu/tms7000/tms7000.cpp6
-rw-r--r--src/devices/cpu/tms7000/tms7000.h44
-rw-r--r--src/devices/cpu/unsp/unsp.cpp13
-rw-r--r--src/devices/cpu/unsp/unsp.h11
-rw-r--r--src/devices/cpu/unsp/unspdrc.cpp12
-rw-r--r--src/devices/cpu/unsp/unspfe.cpp2
-rw-r--r--src/devices/cpu/upd7725/upd7725.cpp15
-rw-r--r--src/devices/cpu/upd7725/upd7725.h5
-rw-r--r--src/devices/cpu/upd7810/upd7810.cpp4
-rw-r--r--src/devices/cpu/upd7810/upd7810.h4
-rw-r--r--src/devices/cpu/upd7810/upd7810_macros.h8
-rw-r--r--src/devices/cpu/upd78k/upd78k0.cpp14
-rw-r--r--src/devices/cpu/upd78k/upd78k0.h8
-rw-r--r--src/devices/cpu/upd78k/upd78k2.cpp14
-rw-r--r--src/devices/cpu/upd78k/upd78k2.h8
-rw-r--r--src/devices/cpu/upd78k/upd78k3.cpp14
-rw-r--r--src/devices/cpu/upd78k/upd78k3.h9
-rw-r--r--src/devices/cpu/v30mz/v30mz.cpp24
-rw-r--r--src/devices/cpu/v30mz/v30mz.h6
-rw-r--r--src/devices/cpu/v60/v60.cpp16
-rw-r--r--src/devices/cpu/v60/v60.h3
-rw-r--r--src/devices/cpu/v810/v810.cpp32
-rw-r--r--src/devices/cpu/v810/v810.h6
-rw-r--r--src/devices/cpu/vt50/vt50.cpp24
-rw-r--r--src/devices/cpu/vt50/vt50.h4
-rw-r--r--src/devices/cpu/vt61/vt61.cpp9
-rw-r--r--src/devices/cpu/vt61/vt61.h6
-rw-r--r--src/devices/cpu/we32000/we32100.cpp14
-rw-r--r--src/devices/cpu/we32000/we32100.h4
-rw-r--r--src/devices/cpu/xavix2/xavix2.cpp108
-rw-r--r--src/devices/cpu/xavix2/xavix2.h4
-rw-r--r--src/devices/cpu/z180/z180.cpp25
-rw-r--r--src/devices/cpu/z180/z180.h8
-rw-r--r--src/devices/cpu/z180/z180dd.hxx2
-rw-r--r--src/devices/cpu/z180/z180ed.hxx2
-rw-r--r--src/devices/cpu/z180/z180ops.h10
-rw-r--r--src/devices/cpu/z8/z8.cpp28
-rw-r--r--src/devices/cpu/z8/z8.h20
-rw-r--r--src/devices/cpu/z8/z8ops.hxx36
-rw-r--r--src/devices/cpu/z80/z80.cpp27
-rw-r--r--src/devices/cpu/z80/z80.h10
-rw-r--r--src/devices/cpu/z8000/z8000.cpp83
-rw-r--r--src/devices/cpu/z8000/z8000.h26
-rw-r--r--src/devices/cpu/z8000/z8000ops.hxx348
246 files changed, 2708 insertions, 2625 deletions
diff --git a/src/devices/cpu/8x300/8x300.cpp b/src/devices/cpu/8x300/8x300.cpp
index a8a9b9dcdad..1b0aecfc4c4 100644
--- a/src/devices/cpu/8x300/8x300.cpp
+++ b/src/devices/cpu/8x300/8x300.cpp
@@ -14,10 +14,10 @@
#include "8x300dasm.h"
#include "debugger.h"
-#define FETCHOP(a) (m_cache->read_word(a))
+#define FETCHOP(a) (m_cache.read_word(a))
#define CYCLES(x) do { m_icount -= (x); } while (0)
-#define READPORT(a) (m_io->read_byte(a))
-#define WRITEPORT(a,v) (m_io->write_byte((a), (v)))
+#define READPORT(a) (m_io.read_byte(a))
+#define WRITEPORT(a,v) (m_io.write_byte((a), (v)))
#define SRC ((opcode & 0x1f00) >> 8)
#define DST (opcode & 0x001f)
@@ -153,9 +153,9 @@ void n8x300_cpu_device::device_resolve_objects()
void n8x300_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_BIG>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_PC));
save_item(NAME(m_AR));
diff --git a/src/devices/cpu/8x300/8x300.h b/src/devices/cpu/8x300/8x300.h
index b37acb119e0..0c95ddc2002 100644
--- a/src/devices/cpu/8x300/8x300.h
+++ b/src/devices/cpu/8x300/8x300.h
@@ -82,9 +82,9 @@ protected:
int m_icount;
bool m_increment_pc;
- address_space *m_program;
- memory_access_cache<1, -1, ENDIANNESS_BIG> *m_cache;
- address_space *m_io;
+ memory_access<13, 1, -1, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<13, 1, -1, ENDIANNESS_BIG>::specific m_program;
+ memory_access< 9, 0, 0, ENDIANNESS_BIG>::specific m_io;
devcb_write8 m_sc_callback; // Select Command (address latch)
diff --git a/src/devices/cpu/adsp2100/adsp2100.cpp b/src/devices/cpu/adsp2100/adsp2100.cpp
index 7ef7136f66d..2f0b609ad5b 100644
--- a/src/devices/cpu/adsp2100/adsp2100.cpp
+++ b/src/devices/cpu/adsp2100/adsp2100.cpp
@@ -417,10 +417,11 @@ void adsp21xx_device::device_start()
m_dmovlay_cb.resolve();
// get our address spaces
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, -2, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
- m_io = has_space(AS_IO) ? &space(AS_IO) : nullptr;
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ if(has_space(AS_IO))
+ space(AS_IO).specific(m_io);
// "core"
save_item(NAME(m_core.ax0.u));
@@ -776,37 +777,37 @@ std::unique_ptr<util::disasm_interface> adsp21xx_device::create_disassembler()
inline uint16_t adsp21xx_device::data_read(uint32_t addr)
{
- return m_data->read_word(addr);
+ return m_data.read_word(addr);
}
inline void adsp21xx_device::data_write(uint32_t addr, uint16_t data)
{
- m_data->write_word(addr, data);
+ m_data.write_word(addr, data);
}
inline uint16_t adsp21xx_device::io_read(uint32_t addr)
{
- return m_io->read_word(addr);
+ return m_io.read_word(addr);
}
inline void adsp21xx_device::io_write(uint32_t addr, uint16_t data)
{
- m_io->write_word(addr, data);
+ m_io.write_word(addr, data);
}
inline uint32_t adsp21xx_device::program_read(uint32_t addr)
{
- return m_program->read_dword(addr);
+ return m_program.read_dword(addr);
}
inline void adsp21xx_device::program_write(uint32_t addr, uint32_t data)
{
- m_program->write_dword(addr, data & 0xffffff);
+ m_program.write_dword(addr, data & 0xffffff);
}
inline uint32_t adsp21xx_device::opcode_read()
{
- return m_cache->read_dword(m_pc);
+ return m_cache.read_dword(m_pc);
}
diff --git a/src/devices/cpu/adsp2100/adsp2100.h b/src/devices/cpu/adsp2100/adsp2100.h
index 6f0e3b07160..9910a7ac2b3 100644
--- a/src/devices/cpu/adsp2100/adsp2100.h
+++ b/src/devices/cpu/adsp2100/adsp2100.h
@@ -429,10 +429,10 @@ protected:
adsp_core m_alt;
// address spaces
- address_space * m_program;
- address_space * m_data;
- address_space * m_io;
- memory_access_cache<2, -2, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<14, 2, -2, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<14, 2, -2, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<14, 1, -1, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access<11, 1, -1, ENDIANNESS_LITTLE>::specific m_io;
// tables
uint8_t m_condition_table[0x1000];
diff --git a/src/devices/cpu/am29000/am29000.cpp b/src/devices/cpu/am29000/am29000.cpp
index a3f0c4ca91c..43f221102ae 100644
--- a/src/devices/cpu/am29000/am29000.cpp
+++ b/src/devices/cpu/am29000/am29000.cpp
@@ -130,11 +130,12 @@ device_memory_interface::space_config_vector am29000_cpu_device::memory_space_co
void am29000_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
- m_data = &space(AS_DATA);
- m_datacache = m_data->cache<2, 0, ENDIANNESS_BIG>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).cache(m_datacache);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
+
m_cfg = (PRL_AM29000 | PRL_REV_D) << CFG_PRL_SHIFT;
/* Register state for saving */
@@ -511,7 +512,7 @@ uint32_t am29000_cpu_device::read_program_word(uint32_t address)
{
/* TODO: ROM enable? */
if (m_cps & CPS_PI || m_cps & CPS_RE)
- return m_cache->read_dword(address);
+ return m_cache.read_dword(address);
else
{
fatalerror("Am29000 instruction MMU translation enabled!\n");
@@ -658,7 +659,7 @@ void am29000_cpu_device::execute_run()
if (m_cfg & CFG_VF)
{
uint32_t vaddr = m_vab | m_exception_queue[0] * 4;
- uint32_t vect = m_datacache->read_dword(vaddr);
+ uint32_t vect = m_datacache.read_dword(vaddr);
m_pc = vect & ~3;
m_next_pc = m_pc;
diff --git a/src/devices/cpu/am29000/am29000.h b/src/devices/cpu/am29000/am29000.h
index 673ee6237fe..c19eeb8b9f2 100644
--- a/src/devices/cpu/am29000/am29000.h
+++ b/src/devices/cpu/am29000/am29000.h
@@ -629,12 +629,11 @@ protected:
uint32_t m_exec_pc;
uint32_t m_next_pc;
- address_space *m_program;
- memory_access_cache<2, 0, ENDIANNESS_BIG> *m_cache;
- address_space *m_data;
-
- memory_access_cache<2, 0, ENDIANNESS_BIG> *m_datacache;
- address_space *m_io;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_datacache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_data;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_io;
typedef void ( am29000_cpu_device::*opcode_func ) ();
struct op_info {
diff --git a/src/devices/cpu/am29000/am29ops.h b/src/devices/cpu/am29000/am29ops.h
index 3c44c506077..74f6eef48f9 100644
--- a/src/devices/cpu/am29000/am29ops.h
+++ b/src/devices/cpu/am29000/am29ops.h
@@ -947,7 +947,7 @@ void am29000_cpu_device::LOAD()
return;
}
- r = m_data->read_dword(addr);
+ r = m_data.read_dword(addr);
}
}
@@ -1013,7 +1013,7 @@ void am29000_cpu_device::LOADM()
return;
}
- r = m_data->read_dword(addr);
+ r = m_data.read_dword(addr);
}
}
@@ -1035,7 +1035,7 @@ void am29000_cpu_device::LOADM()
for (int32_t cnt = 0; cnt <= GET_CHC_CR; ++cnt)
{
- m_r[r] = m_data->read_dword(addr);
+ m_r[r] = m_data.read_dword(addr);
// SET_CHC_CR(cnt - 1);
addr += 4;
@@ -1076,7 +1076,7 @@ void am29000_cpu_device::STORE()
}
}
- m_data->write_dword(addr, m_r[RA]);
+ m_data.write_dword(addr, m_r[RA]);
if (!FREEZE_MODE)
{
@@ -1148,7 +1148,7 @@ void am29000_cpu_device::STOREM()
for (int32_t cnt = 0; cnt <= GET_CHC_CR; ++cnt)
{
- m_data->write_dword(addr, m_r[r]);
+ m_data.write_dword(addr, m_r[r]);
addr += 4;
diff --git a/src/devices/cpu/arm/arm.cpp b/src/devices/cpu/arm/arm.cpp
index 2e3ded89dfb..13a6cf7c64b 100644
--- a/src/devices/cpu/arm/arm.cpp
+++ b/src/devices/cpu/arm/arm.cpp
@@ -498,11 +498,11 @@ void arm_cpu_device::device_start()
m_program = &space(AS_PROGRAM);
if(m_program->endianness() == ENDIANNESS_LITTLE) {
- auto cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
+ m_program->cache(m_cachele);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cachele.read_dword(address); };
} else {
- auto cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
+ m_program->cache(m_cachebe);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cachebe.read_dword(address); };
}
save_item(NAME(m_sArmRegister));
diff --git a/src/devices/cpu/arm/arm.h b/src/devices/cpu/arm/arm.h
index 1c018f16763..bfa16724463 100644
--- a/src/devices/cpu/arm/arm.h
+++ b/src/devices/cpu/arm/arm.h
@@ -64,6 +64,8 @@ protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
address_space_config m_program_config;
+ memory_access<26, 2, 0, ENDIANNESS_LITTLE>::cache m_cachele;
+ memory_access<26, 2, 0, ENDIANNESS_BIG>::cache m_cachebe;
int m_icount;
uint32_t m_sArmRegister[27];
diff --git a/src/devices/cpu/arm7/arm7.cpp b/src/devices/cpu/arm7/arm7.cpp
index 0637c42ddc4..d496265d41d 100644
--- a/src/devices/cpu/arm7/arm7.cpp
+++ b/src/devices/cpu/arm7/arm7.cpp
@@ -622,13 +622,13 @@ void arm7_cpu_device::device_start()
m_program = &space(AS_PROGRAM);
if(m_program->endianness() == ENDIANNESS_LITTLE) {
- auto cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ m_program->cache(m_cachele);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cachele.read_dword(address); };
+ m_prptr = [this](offs_t address) -> const void * { return m_cachele.read_ptr(address); };
} else {
- auto cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ m_program->cache(m_cachebe);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cachebe.read_dword(address); };
+ m_prptr = [this](offs_t address) -> const void * { return m_cachebe.read_ptr(address); };
}
save_item(NAME(m_insn_prefetch_depth));
diff --git a/src/devices/cpu/arm7/arm7.h b/src/devices/cpu/arm7/arm7.h
index 5a7ca665b6f..0a7a451ccfa 100644
--- a/src/devices/cpu/arm7/arm7.h
+++ b/src/devices/cpu/arm7/arm7.h
@@ -139,6 +139,8 @@ protected:
virtual bool get_t_flag() const override;
address_space_config m_program_config;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cachele;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cachebe;
uint32_t m_r[/*NUM_REGS*/37];
diff --git a/src/devices/cpu/asap/asap.cpp b/src/devices/cpu/asap/asap.cpp
index 4b2505d847a..9df9049d5ba 100644
--- a/src/devices/cpu/asap/asap.cpp
+++ b/src/devices/cpu/asap/asap.cpp
@@ -151,9 +151,7 @@ asap_device::asap_device(const machine_config &mconfig, const char *tag, device_
m_ppc(0),
m_nextpc(0),
m_irq_state(0),
- m_icount(0),
- m_program(nullptr),
- m_cache(nullptr)
+ m_icount(0)
{
// initialize the src2val table to contain immediates for low values
for (int i = 0; i < REGBASE; i++)
@@ -183,8 +181,8 @@ asap_device::asap_device(const machine_config &mconfig, const char *tag, device_
void asap_device::device_start()
{
// get our address spaces
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
@@ -321,7 +319,7 @@ std::unique_ptr<util::disasm_interface> asap_device::create_disassembler()
inline uint32_t asap_device::readop(offs_t pc)
{
- return m_cache->read_dword(pc);
+ return m_cache.read_dword(pc);
}
@@ -332,7 +330,7 @@ inline uint32_t asap_device::readop(offs_t pc)
inline uint8_t asap_device::readbyte(offs_t address)
{
// no alignment issues with bytes
- return m_program->read_byte(address);
+ return m_program.read_byte(address);
}
@@ -344,10 +342,10 @@ inline uint16_t asap_device::readword(offs_t address)
{
// aligned reads are easy
if (WORD_ALIGNED(address))
- return m_program->read_word(address);
+ return m_program.read_word(address);
// misaligned reads are tricky
- return m_program->read_dword(address & ~3) >> (address & 3);
+ return m_program.read_dword(address & ~3) >> (address & 3);
}
@@ -359,10 +357,10 @@ inline uint32_t asap_device::readlong(offs_t address)
{
// aligned reads are easy
if (DWORD_ALIGNED(address))
- return m_program->read_dword(address);
+ return m_program.read_dword(address);
// misaligned reads are tricky
- return m_program->read_dword(address & ~3) >> (address & 3);
+ return m_program.read_dword(address & ~3) >> (address & 3);
}
@@ -373,7 +371,7 @@ inline uint32_t asap_device::readlong(offs_t address)
inline void asap_device::writebyte(offs_t address, uint8_t data)
{
// no alignment issues with bytes
- m_program->write_byte(address, data);
+ m_program.write_byte(address, data);
}
@@ -386,18 +384,18 @@ inline void asap_device::writeword(offs_t address, uint16_t data)
// aligned writes are easy
if (WORD_ALIGNED(address))
{
- m_program->write_word(address, data);
+ m_program.write_word(address, data);
return;
}
// misaligned writes are tricky
if (!(address & 2))
{
- m_program->write_byte(address + 1, data);
- m_program->write_byte(address + 2, data >> 8);
+ m_program.write_byte(address + 1, data);
+ m_program.write_byte(address + 2, data >> 8);
}
else
- m_program->write_byte(address + 1, data);
+ m_program.write_byte(address + 1, data);
}
@@ -410,7 +408,7 @@ inline void asap_device::writelong(offs_t address, uint32_t data)
// aligned writes are easy
if (DWORD_ALIGNED(address))
{
- m_program->write_dword(address, data);
+ m_program.write_dword(address, data);
return;
}
@@ -418,14 +416,14 @@ inline void asap_device::writelong(offs_t address, uint32_t data)
switch (address & 3)
{
case 1:
- m_program->write_byte(address, data);
- m_program->write_word(address + 1, data >> 8);
+ m_program.write_byte(address, data);
+ m_program.write_word(address + 1, data >> 8);
break;
case 2:
- m_program->write_word(address, data);
+ m_program.write_word(address, data);
break;
case 3:
- m_program->write_byte(address, data);
+ m_program.write_byte(address, data);
break;
}
}
diff --git a/src/devices/cpu/asap/asap.h b/src/devices/cpu/asap/asap.h
index fe14835f247..3adb9ef37f4 100644
--- a/src/devices/cpu/asap/asap.h
+++ b/src/devices/cpu/asap/asap.h
@@ -237,8 +237,8 @@ protected:
uint32_t m_nextpc;
uint8_t m_irq_state;
int m_icount;
- address_space * m_program;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_program;
// src2val table, registers are at the end
uint32_t m_src2val[65536];
diff --git a/src/devices/cpu/bcp/dp8344.cpp b/src/devices/cpu/bcp/dp8344.cpp
index 28c99a8ebed..fcc872855eb 100644
--- a/src/devices/cpu/bcp/dp8344.cpp
+++ b/src/devices/cpu/bcp/dp8344.cpp
@@ -66,9 +66,6 @@ dp8344_device::dp8344_device(const machine_config &mconfig, device_type type, co
: cpu_device(mconfig, type, tag, owner, clock)
, m_inst_config("instruction", ENDIANNESS_LITTLE, 16, 16, -1)
, m_data_config("data", ENDIANNESS_LITTLE, 8, 16, 0)
- , m_inst_space(nullptr)
- , m_data_space(nullptr)
- , m_inst_cache(nullptr)
, m_birq_out_cb(*this)
, m_data_out_cb(*this)
, m_data_dly_cb(*this)
@@ -174,9 +171,9 @@ void dp8344_device::device_resolve_objects()
void dp8344_device::device_start()
{
// get memory spaces
- m_inst_space = &space(AS_PROGRAM);
- m_data_space = &space(AS_DATA);
- m_inst_cache = m_inst_space->cache<1, -1, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_inst_cache);
+ space(AS_PROGRAM).specific(m_inst_space);
+ space(AS_DATA).specific(m_data_space);
set_icountptr(m_icount);
@@ -1490,7 +1487,7 @@ void dp8344_device::execute_set_input(int irqline, int state)
void dp8344_device::prefetch_instruction()
{
- m_latched_instr = m_inst_cache->read_word(m_pc);
+ m_latched_instr = m_inst_cache.read_word(m_pc);
}
@@ -1844,7 +1841,7 @@ void dp8344_device::data_write()
break;
}
- m_data_space->write_byte(m_data_address, m_source_data);
+ m_data_space.write_byte(m_data_address, m_source_data);
}
@@ -1855,7 +1852,7 @@ void dp8344_device::data_write()
void dp8344_device::data_read()
{
- write_register(m_latched_instr & ((m_latched_instr & 0xf000) == 0x9000 ? 0x000f : 0x001f), m_data_space->read_byte(m_data_address));
+ write_register(m_latched_instr & ((m_latched_instr & 0xf000) == 0x9000 ? 0x000f : 0x001f), m_data_space.read_byte(m_data_address));
}
@@ -2086,13 +2083,13 @@ u8 dp8344_device::remote_read(offs_t offset)
{
case 0x00:
// Read from data memory
- data = m_data_space->read_byte(offset);
+ data = m_data_space.read_byte(offset);
break;
case 0x01:
// Read from instruction memory
if (!m_hib && !machine().side_effects_disabled())
- m_latched_instr = m_inst_space->read_word(m_pc);
+ m_latched_instr = m_inst_space.read_word(m_pc);
data = m_hib ? m_latched_instr >> 8 : m_latched_instr & 0xff;
if (!machine().side_effects_disabled())
{
@@ -2133,7 +2130,7 @@ void dp8344_device::remote_write(offs_t offset, u8 data)
{
case 0x00:
// Write to data memory
- m_data_space->write_byte(offset, data);
+ m_data_space.write_byte(offset, data);
break;
case 0x01:
@@ -2146,7 +2143,7 @@ void dp8344_device::remote_write(offs_t offset, u8 data)
{
m_hib = !m_hib;
if (!m_hib)
- m_inst_space->write_word(m_pc++, m_latched_instr);
+ m_inst_space.write_word(m_pc++, m_latched_instr);
}
break;
diff --git a/src/devices/cpu/bcp/dp8344.h b/src/devices/cpu/bcp/dp8344.h
index eca4c3e16d4..95e0a671a0b 100644
--- a/src/devices/cpu/bcp/dp8344.h
+++ b/src/devices/cpu/bcp/dp8344.h
@@ -144,9 +144,9 @@ private:
// address spaces
const address_space_config m_inst_config;
const address_space_config m_data_config;
- address_space *m_inst_space;
- address_space *m_data_space;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_inst_cache;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::cache m_inst_cache;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_inst_space;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_data_space;
// output callbacks
devcb_write_line m_birq_out_cb;
diff --git a/src/devices/cpu/capricorn/capricorn.cpp b/src/devices/cpu/capricorn/capricorn.cpp
index 799f2859309..0f937891e47 100644
--- a/src/devices/cpu/capricorn/capricorn.cpp
+++ b/src/devices/cpu/capricorn/capricorn.cpp
@@ -172,8 +172,8 @@ void capricorn_cpu_device::device_start()
// Flags
state_add(STATE_GENFLAGS , "GENFLAGS" , m_flags).noshow().formatstr("%9s");
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
save_item(NAME(m_reg));
save_item(NAME(m_arp));
@@ -290,7 +290,7 @@ uint8_t capricorn_cpu_device::RM(ea_addr_t& addr)
res = m_reg[ addr & ARP_DRP_MASK ];
} else {
m_curr_addr = (uint16_t)(addr & ADDR_MASK);
- res = m_program->read_byte(m_flatten ? m_start_addr : m_curr_addr);
+ res = m_program.read_byte(m_flatten ? m_start_addr : m_curr_addr);
}
addr++;
return res;
@@ -302,7 +302,7 @@ void capricorn_cpu_device::WM(ea_addr_t& addr , uint8_t v)
m_reg[ addr & ARP_DRP_MASK ] = v;
} else {
m_curr_addr = (uint16_t)(addr & ADDR_MASK);
- m_program->write_byte(m_flatten ? m_start_addr : m_curr_addr , v);
+ m_program.write_byte(m_flatten ? m_start_addr : m_curr_addr , v);
}
addr++;
}
@@ -311,7 +311,7 @@ uint8_t capricorn_cpu_device::fetch()
{
m_genpc = read_u16(REG_PC | GP_REG_MASK);
start_mem_burst(m_genpc , false);
- return m_cache->read_byte(m_genpc);
+ return m_cache.read_byte(m_genpc);
}
void capricorn_cpu_device::offset_pc(uint16_t offset)
diff --git a/src/devices/cpu/capricorn/capricorn.h b/src/devices/cpu/capricorn/capricorn.h
index 5ec08e84a9f..40bbb2cc3ab 100644
--- a/src/devices/cpu/capricorn/capricorn.h
+++ b/src/devices/cpu/capricorn/capricorn.h
@@ -57,8 +57,8 @@ protected:
private:
address_space_config m_program_config;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
int m_icount;
diff --git a/src/devices/cpu/ccpu/ccpu.cpp b/src/devices/cpu/ccpu/ccpu.cpp
index 52c235abc5c..55bba0dd96e 100644
--- a/src/devices/cpu/ccpu/ccpu.cpp
+++ b/src/devices/cpu/ccpu/ccpu.cpp
@@ -23,13 +23,13 @@ DEFINE_DEVICE_TYPE(CCPU, ccpu_cpu_device, "ccpu", "Cinematronics CPU")
MACROS
***************************************************************************/
-#define READOP(a) (m_cache->read_byte(a))
+#define READOP(a) (m_cache.read_byte(a))
-#define RDMEM(a) (m_data->read_word((a) & 0xfff))
-#define WRMEM(a,v) (m_data->write_word((a), (v)))
+#define RDMEM(a) (m_data.read_word((a) & 0xfff))
+#define WRMEM(a,v) (m_data.write_word((a), (v)))
-#define READPORT(a) (m_io->read_byte(a))
-#define WRITEPORT(a,v) (m_io->write_byte((a), (v)))
+#define READPORT(a) (m_io.read_byte(a))
+#define WRITEPORT(a,v) (m_io.write_byte((a), (v)))
#define SET_A0 do { m_a0flag = m_A; } while (0)
#define SET_CMP_VAL(x) do { m_cmpacc = *m_acc; m_cmpval = (x) & 0xfff; } while (0)
@@ -107,10 +107,10 @@ void ccpu_cpu_device::device_start()
m_vector_callback.resolve();
assert(!m_vector_callback.isnull());
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_PC));
save_item(NAME(m_A));
diff --git a/src/devices/cpu/ccpu/ccpu.h b/src/devices/cpu/ccpu/ccpu.h
index 24d5c422693..c4377f251e3 100644
--- a/src/devices/cpu/ccpu/ccpu.h
+++ b/src/devices/cpu/ccpu/ccpu.h
@@ -100,10 +100,10 @@ protected:
int m_icount;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<15, 0, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<15, 0, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access<32, 1, -1, ENDIANNESS_BIG>::specific m_data;
+ memory_access< 5, 0, 0, ENDIANNESS_BIG>::specific m_io;
uint16_t m_flags;
};
diff --git a/src/devices/cpu/cop400/cop400.cpp b/src/devices/cpu/cop400/cop400.cpp
index 5c8d2c61be6..22495ff2c92 100644
--- a/src/devices/cpu/cop400/cop400.cpp
+++ b/src/devices/cpu/cop400/cop400.cpp
@@ -96,9 +96,9 @@ DEFINE_DEVICE_TYPE(COP446C, cop446c_cpu_device, "cop446c", "National Semiconduct
MACROS
***************************************************************************/
-#define ROM(a) m_cache->read_byte(a)
-#define RAM_R(a) m_data->read_byte(a)
-#define RAM_W(a, v) m_data->write_byte(a, v)
+#define ROM(a) m_program.read_byte(a)
+#define RAM_R(a) m_data.read_byte(a)
+#define RAM_W(a, v) m_data.write_byte(a, v)
#define IN_G() (m_read_g(0, 0xff) & m_g_mask)
#define IN_L() m_read_l(0, 0xff)
@@ -1073,9 +1073,8 @@ void cop400_cpu_device::device_timer(emu_timer &timer, device_timer_id id, int p
void cop400_cpu_device::device_start()
{
/* find address spaces */
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
+ space(AS_PROGRAM).cache(m_program);
+ space(AS_DATA).specific(m_data);
/* find i/o handlers */
m_read_l.resolve_safe(0);
@@ -1125,7 +1124,7 @@ void cop400_cpu_device::device_start()
save_item(NAME(m_second_byte));
// setup debugger state display
- offs_t pc_mask = m_program->addrmask();
+ offs_t pc_mask = m_program.space().addrmask();
using namespace std::placeholders;
state_add(STATE_GENPC, "GENPC", m_pc).mask(pc_mask).noshow();
@@ -1330,7 +1329,7 @@ void cop400_cpu_device::set_flags(uint8_t flags)
m_skl = BIT(flags, 0);
}
-uint8_t cop400_cpu_device::get_m() const
+uint8_t cop400_cpu_device::get_m()
{
auto dis = machine().disable_side_effects();
return RAM_R(B);
diff --git a/src/devices/cpu/cop400/cop400.h b/src/devices/cpu/cop400/cop400.h
index 1427463a9cf..b51732fecf8 100644
--- a/src/devices/cpu/cop400/cop400.h
+++ b/src/devices/cpu/cop400/cop400.h
@@ -184,9 +184,8 @@ protected:
bool m_has_counter;
bool m_has_inil;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_data;
+ memory_access<11, 0, 0, ENDIANNESS_LITTLE>::cache m_program;
+ memory_access< 7, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
uint8_t m_featuremask;
@@ -265,7 +264,7 @@ protected:
uint8_t get_flags() const;
void set_flags(uint8_t flags);
- uint8_t get_m() const;
+ uint8_t get_m();
void set_m(uint8_t m);
void illegal(uint8_t operand);
diff --git a/src/devices/cpu/cosmac/cosmac.cpp b/src/devices/cpu/cosmac/cosmac.cpp
index cc773ebd8a3..6f824b90d64 100644
--- a/src/devices/cpu/cosmac/cosmac.cpp
+++ b/src/devices/cpu/cosmac/cosmac.cpp
@@ -381,10 +381,7 @@ cosmac_device::cosmac_device(const machine_config &mconfig, device_type type, co
m_clear(true),
m_irq(CLEAR_LINE),
m_dmain(CLEAR_LINE),
- m_dmaout(CLEAR_LINE),
- m_program(nullptr),
- m_io(nullptr),
- m_cache(nullptr)
+ m_dmaout(CLEAR_LINE)
{
for (auto & elem : m_ef)
elem = CLEAR_LINE;
@@ -467,9 +464,9 @@ void cosmac_device::device_start()
m_write_tpb.resolve_safe();
// get our address spaces
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", m_pc).callimport().callexport().noshow();
@@ -644,7 +641,7 @@ std::unique_ptr<util::disasm_interface> cdp1805_device::create_disassembler()
inline uint8_t cosmac_device::read_opcode(offs_t pc)
{
- return m_cache->read_byte(pc);
+ return m_cache.read_byte(pc);
}
@@ -654,7 +651,7 @@ inline uint8_t cosmac_device::read_opcode(offs_t pc)
inline uint8_t cosmac_device::read_byte(offs_t address)
{
- return m_program->read_byte(address);
+ return m_program.read_byte(address);
}
@@ -665,7 +662,7 @@ inline uint8_t cosmac_device::read_byte(offs_t address)
inline uint8_t cosmac_device::read_io_byte(offs_t address)
{
- return m_io->read_byte(address);
+ return m_io.read_byte(address);
}
@@ -675,7 +672,7 @@ inline uint8_t cosmac_device::read_io_byte(offs_t address)
inline void cosmac_device::write_byte(offs_t address, uint8_t data)
{
- m_program->write_byte(address, data);
+ m_program.write_byte(address, data);
}
@@ -686,7 +683,7 @@ inline void cosmac_device::write_byte(offs_t address, uint8_t data)
inline void cosmac_device::write_io_byte(offs_t address, uint8_t data)
{
- m_io->write_byte(address, data);
+ m_io.write_byte(address, data);
}
diff --git a/src/devices/cpu/cosmac/cosmac.h b/src/devices/cpu/cosmac/cosmac.h
index 891e7f837a6..314bad599e8 100644
--- a/src/devices/cpu/cosmac/cosmac.h
+++ b/src/devices/cpu/cosmac/cosmac.h
@@ -415,9 +415,9 @@ protected:
// internal stuff
int m_icount;
- address_space * m_program;
- address_space * m_io;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access< 3, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
// opcode/condition tables
typedef void (cosmac_device::*ophandler)();
diff --git a/src/devices/cpu/cr16b/cr16b.cpp b/src/devices/cpu/cr16b/cr16b.cpp
index e3f330bf3f7..c9c6d414caf 100644
--- a/src/devices/cpu/cr16b/cr16b.cpp
+++ b/src/devices/cpu/cr16b/cr16b.cpp
@@ -18,8 +18,6 @@ DEFINE_DEVICE_TYPE(CR16B, cr16b_device, "cr16b", "CompactRISC CR16B")
cr16b_device::cr16b_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor map)
: cpu_device(mconfig, type, tag, owner, clock)
, m_space_config("program", ENDIANNESS_LITTLE, 16, 21, 0, map)
- , m_space(nullptr)
- , m_cache(nullptr)
, m_regs{0}
, m_pc(0)
, m_isp(0)
@@ -53,8 +51,8 @@ device_memory_interface::space_config_vector cr16b_device::memory_space_config()
void cr16b_device::device_start()
{
- m_space = &space(AS_PROGRAM);
- m_cache = m_space->cache<1, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_space);
set_icountptr(m_icount);
diff --git a/src/devices/cpu/cr16b/cr16b.h b/src/devices/cpu/cr16b/cr16b.h
index 09334dfeff9..a8028b03108 100644
--- a/src/devices/cpu/cr16b/cr16b.h
+++ b/src/devices/cpu/cr16b/cr16b.h
@@ -42,8 +42,8 @@ protected:
private:
// address space
address_space_config m_space_config;
- address_space *m_space;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<21, 1, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<21, 1, 0, ENDIANNESS_LITTLE>::specific m_space;
// internal state
u16 m_regs[16];
diff --git a/src/devices/cpu/cubeqcpu/cubeqcpu.cpp b/src/devices/cpu/cubeqcpu/cubeqcpu.cpp
index 85f435a68a1..a33fd877505 100644
--- a/src/devices/cpu/cubeqcpu/cubeqcpu.cpp
+++ b/src/devices/cpu/cubeqcpu/cubeqcpu.cpp
@@ -182,8 +182,8 @@ void cquestsnd_cpu_device::device_start()
assert(m_sound_region_tag != nullptr);
m_sound_data = (u16*)machine().root_device().memregion(m_sound_region_tag)->base();
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<3, -3, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
memset(m_ram, 0, sizeof(m_ram));
m_q = 0;
@@ -261,8 +261,8 @@ void cquestrot_cpu_device::device_start()
{
m_linedata_w.resolve_safe();
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<3, -3, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
memset(m_ram, 0, sizeof(m_ram));
m_q = 0;
@@ -392,8 +392,8 @@ void cquestlin_cpu_device::device_start()
{
m_linedata_r.resolve_safe(0);
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<3, -3, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
memset(m_ram, 0, sizeof(m_ram));
m_q = 0;
@@ -542,7 +542,7 @@ void cquestsnd_cpu_device::execute_run()
do
{
/* Decode the instruction */
- u64 inst = m_cache->read_qword(SND_PC);
+ u64 inst = m_cache.read_qword(SND_PC);
u32 inslow = inst & 0xffffffff;
u32 inshig = inst >> 32;
@@ -798,7 +798,7 @@ void cquestrot_cpu_device::execute_run()
do
{
/* Decode the instruction */
- u64 inst = m_cache->read_qword(ROT_PC);
+ u64 inst = m_cache.read_qword(ROT_PC);
u32 inslow = inst & 0xffffffff;
u32 inshig = inst >> 32;
@@ -1218,7 +1218,7 @@ void cquestlin_cpu_device::execute_run()
int prog = (m_clkcnt & 3) ? BACKGROUND : FOREGROUND;
m_curpc = LINE_PC;
- u64 inst = m_cache->read_qword(LINE_PC);
+ u64 inst = m_cache.read_qword(LINE_PC);
u32 inslow = inst & 0xffffffff;
u32 inshig = inst >> 32;
diff --git a/src/devices/cpu/cubeqcpu/cubeqcpu.h b/src/devices/cpu/cubeqcpu/cubeqcpu.h
index 9f3f215566a..54070a1bd48 100644
--- a/src/devices/cpu/cubeqcpu/cubeqcpu.h
+++ b/src/devices/cpu/cubeqcpu/cubeqcpu.h
@@ -99,8 +99,9 @@ private:
const char *m_sound_region_tag;
u16 *m_sound_data;
- address_space *m_program;
- memory_access_cache<3, -3, ENDIANNESS_BIG> *m_cache;
+ memory_access<9, 3, -3, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<9, 3, -3, ENDIANNESS_BIG>::specific m_program;
+
int m_icount;
bool do_sndjmp(u8 jmp);
@@ -208,8 +209,8 @@ private:
u8 m_rc;
u8 m_clkcnt;
- address_space *m_program;
- memory_access_cache<3, -3, ENDIANNESS_BIG> *m_cache;
+ memory_access<9, 3, -3, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<9, 3, -3, ENDIANNESS_BIG>::specific m_program;
int m_icount;
// For the debugger
@@ -325,8 +326,8 @@ private:
u32 m_e_stack[32768]; /* Stack DRAM: 32kx20 */
u32 m_o_stack[32768]; /* Stack DRAM: 32kx20 */
- address_space *m_program;
- memory_access_cache<3, -3, ENDIANNESS_BIG> *m_cache;
+ memory_access<9, 3, -3, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<9, 3, -3, ENDIANNESS_BIG>::specific m_program;
int m_icount;
// For the debugger
diff --git a/src/devices/cpu/diablo/diablo1300.cpp b/src/devices/cpu/diablo/diablo1300.cpp
index e9eef2275a9..81fe6e4142b 100644
--- a/src/devices/cpu/diablo/diablo1300.cpp
+++ b/src/devices/cpu/diablo/diablo1300.cpp
@@ -29,29 +29,27 @@
inline uint16_t diablo1300_cpu_device::opcode_read(uint16_t address)
{
- return m_cache->read_word(address);
+ return m_cache.read_word(address);
}
inline uint16_t diablo1300_cpu_device::program_read16(uint16_t address)
{
- return m_program->read_word(address);
+ return m_program.read_word(address);
}
inline void diablo1300_cpu_device::program_write16(uint16_t address, uint16_t data)
{
- m_program->write_word(address, data);
- return;
+ m_program.write_word(address, data);
}
inline uint8_t diablo1300_cpu_device::data_read8(uint16_t address)
{
- return m_data->read_byte(address);
+ return m_data.read_byte(address);
}
inline void diablo1300_cpu_device::data_write8(uint16_t address, uint8_t data)
{
- m_data->write_byte(address, data);
- return;
+ m_data.write_byte(address, data);
}
inline uint8_t diablo1300_cpu_device::read_reg(uint16_t reg)
@@ -98,9 +96,6 @@ diablo1300_cpu_device::diablo1300_cpu_device(const machine_config &mconfig, cons
, m_b(0)
, m_carry(0)
, m_power_on(ASSERT_LINE)
- , m_program(nullptr)
- , m_data(nullptr)
- , m_cache(nullptr)
, m_table(nullptr)
{
// Allocate & setup
@@ -109,9 +104,9 @@ diablo1300_cpu_device::diablo1300_cpu_device(const machine_config &mconfig, cons
void diablo1300_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_data = &space(AS_DATA);
- m_cache = m_program->cache<1, -1, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
m_table = memregion("trom");
// register our state for the debugger
diff --git a/src/devices/cpu/diablo/diablo1300.h b/src/devices/cpu/diablo/diablo1300.h
index c4af0f1c56e..ebccc694654 100644
--- a/src/devices/cpu/diablo/diablo1300.h
+++ b/src/devices/cpu/diablo/diablo1300.h
@@ -72,9 +72,9 @@ protected:
int m_icount;
// address spaces
- address_space *m_program;
- address_space *m_data;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<9, 1, -1, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<9, 1, -1, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<5, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
// rom regions
memory_region *m_table;
diff --git a/src/devices/cpu/dsp16/dsp16.cpp b/src/devices/cpu/dsp16/dsp16.cpp
index f0c28c5ca32..778d2efb701 100644
--- a/src/devices/cpu/dsp16/dsp16.cpp
+++ b/src/devices/cpu/dsp16/dsp16.cpp
@@ -186,7 +186,7 @@ dsp16_device_base::dsp16_device_base(
{ "ram", ENDIANNESS_BIG, 16, yaau_bits, -1, std::move(data_map) },
{ "exm", ENDIANNESS_BIG, 16, 16, -1 } }
, m_yaau_bits(yaau_bits)
- , m_workram(*this, "workram"), m_spaces{ nullptr, nullptr, nullptr }, m_pcache(nullptr), m_workram_mask(0U)
+ , m_workram(*this, "workram"), m_spaces{ nullptr, nullptr, nullptr }, m_workram_mask(0U)
, m_drc_cache(CACHE_SIZE), m_core(nullptr, [] (core_state *core) { core->~core_state(); }), m_recompiler()
, m_cache_mode(cache::NONE), m_phase(phase::PURGE), m_int_enable{ 0U, 0U }, m_flags(FLAGS_NONE), m_cache_ptr(0U), m_cache_limit(0U), m_cache_iterations(0U)
, m_exm_in(1U), m_int_in(CLEAR_LINE), m_iack_out(1U)
@@ -231,7 +231,7 @@ void dsp16_device_base::device_start()
m_spaces[AS_PROGRAM] = &space(AS_PROGRAM);
m_spaces[AS_DATA] = &space(AS_DATA);
m_spaces[AS_IO] = &space(AS_IO);
- m_pcache = m_spaces[AS_PROGRAM]->cache<1, -1, ENDIANNESS_BIG>();
+ m_spaces[AS_PROGRAM]->cache(m_pcache);
m_workram_mask = u16((m_workram.bytes() >> 1) - 1);
if (allow_drc())
@@ -1133,7 +1133,7 @@ template <bool Debugger, bool Caching> inline void dsp16_device_base::execute_so
set_predicate(predicate);
if (fetch_target)
- *fetch_target = m_pcache->read_word(fetch_addr);
+ *fetch_target = m_pcache.read_word(fetch_addr);
if (phase::OP1 == m_phase)
{
@@ -1274,7 +1274,7 @@ template <bool Debugger> inline void dsp16_device_base::execute_some_cache()
m_core->op_dau_ad(op) = d;
if (last_instruction)
{
- m_rom_data = m_pcache->read_word(m_core->xaau_pt);
+ m_rom_data = m_pcache.read_word(m_core->xaau_pt);
m_phase = phase::OP2;
}
else
@@ -1289,7 +1289,7 @@ template <bool Debugger> inline void dsp16_device_base::execute_some_cache()
m_core->op_dau_ad(op) = m_core->dau_f1(op);
m_core->dau_temp = s16(m_core->dau_y >> 16);
m_core->dau_set_y(yaau_read<Debugger>(op));
- m_rom_data = m_pcache->read_word(m_core->xaau_pt);
+ m_rom_data = m_pcache.read_word(m_core->xaau_pt);
m_phase = phase::OP2;
break;
@@ -1298,7 +1298,7 @@ template <bool Debugger> inline void dsp16_device_base::execute_some_cache()
m_core->dau_set_y(yaau_read<Debugger>(op));
if (last_instruction)
{
- m_rom_data = m_pcache->read_word(m_core->xaau_pt);
+ m_rom_data = m_pcache.read_word(m_core->xaau_pt);
m_phase = phase::OP2;
}
else
@@ -1384,7 +1384,7 @@ template <bool Debugger> inline void dsp16_device_base::execute_some_cache()
// overlapped fetch of next instruction from ROM
mode_change = true;
m_cache_mode = cache::NONE;
- m_cache[m_cache_ptr = 0] = m_pcache->read_word(m_core->xaau_pc);
+ m_cache[m_cache_ptr = 0] = m_pcache.read_word(m_core->xaau_pc);
m_st_pcbase = m_core->xaau_pc;
}
else
@@ -1420,7 +1420,7 @@ inline void dsp16_device_base::overlap_rom_data_read()
case 0x19: // F1 ; y = a0 ; x = *pt++[i]
case 0x1b: // F1 ; y = a1 ; x = *pt++[i]
case 0x1f: // F1 ; y = Y ; x = *pt++[i]
- m_rom_data = m_pcache->read_word(m_core->xaau_pt);
+ m_rom_data = m_pcache.read_word(m_core->xaau_pt);
break;
}
}
diff --git a/src/devices/cpu/dsp16/dsp16.h b/src/devices/cpu/dsp16/dsp16.h
index 13fa045341b..5cc6c6a67f2 100644
--- a/src/devices/cpu/dsp16/dsp16.h
+++ b/src/devices/cpu/dsp16/dsp16.h
@@ -275,7 +275,7 @@ private:
// memory system access
required_shared_ptr<u16> m_workram;
address_space *m_spaces[3];
- memory_access_cache<1, -1, ENDIANNESS_BIG> *m_pcache;
+ memory_access<16, 1, -1, ENDIANNESS_BIG>::cache m_pcache;
u16 m_workram_mask;
// recompiler stuff
diff --git a/src/devices/cpu/dsp16/dsp16fe.cpp b/src/devices/cpu/dsp16/dsp16fe.cpp
index 2e79371bdd2..a972d14d8ff 100644
--- a/src/devices/cpu/dsp16/dsp16fe.cpp
+++ b/src/devices/cpu/dsp16/dsp16fe.cpp
@@ -30,7 +30,7 @@ bool dsp16_device_base::frontend::describe(opcode_desc &desc, opcode_desc const
desc.length = 1U;
desc.cycles = 1U;
- u16 const op(m_host.m_pcache->read_word(desc.physpc));
+ u16 const op(m_host.m_pcache.read_word(desc.physpc));
switch (op >> 11)
{
case 0x00: // goto JA
@@ -219,9 +219,9 @@ bool dsp16_device_base::frontend::describe(opcode_desc &desc, opcode_desc const
program fetch helpers
***********************************************************************/
-u16 dsp16_device_base::frontend::read_op(opcode_desc const &desc, u16 offset) const
+u16 dsp16_device_base::frontend::read_op(opcode_desc const &desc, u16 offset)
{
- return m_host.m_pcache->read_word((desc.physpc & XAAU_I_EXT) | ((desc.physpc + offset) & XAAU_I_MASK));
+ return m_host.m_pcache.read_word((desc.physpc & XAAU_I_EXT) | ((desc.physpc + offset) & XAAU_I_MASK));
}
/***********************************************************************
diff --git a/src/devices/cpu/dsp16/dsp16fe.h b/src/devices/cpu/dsp16/dsp16fe.h
index e61c383f2c8..8dc3b96700e 100644
--- a/src/devices/cpu/dsp16/dsp16fe.h
+++ b/src/devices/cpu/dsp16/dsp16fe.h
@@ -66,9 +66,9 @@ protected:
private:
// program fetch helpers
- u16 read_op(opcode_desc const &desc, u16 offset) const;
- u16 read_op(opcode_desc const &desc) const { return read_op(desc, 0U); }
- u16 read_imm(opcode_desc const &desc) const { return read_op(desc, 1U); }
+ u16 read_op(opcode_desc const &desc, u16 offset);
+ u16 read_op(opcode_desc const &desc) { return read_op(desc, 0U); }
+ u16 read_imm(opcode_desc const &desc) { return read_op(desc, 1U); }
// non-trivial instruction helpers
bool describe_goto_b(opcode_desc &desc, u16 op);
@@ -98,7 +98,7 @@ private:
template <typename... T> static void flag_required_output_reg(opcode_desc &desc, T... reg) { flag_reg(desc.regreq, reg...); }
// need access to host device for program fetch
- dsp16_device_base const &m_host;
+ dsp16_device_base &m_host;
// for making sweeping assumptions
u32 m_cache_cycles = 0U, m_cache_last_cycles = 0U, m_cache_flags = 0U;
diff --git a/src/devices/cpu/dsp32/dsp32.cpp b/src/devices/cpu/dsp32/dsp32.cpp
index 6586276395f..c7452161137 100644
--- a/src/devices/cpu/dsp32/dsp32.cpp
+++ b/src/devices/cpu/dsp32/dsp32.cpp
@@ -174,8 +174,6 @@ dsp32c_device::dsp32c_device(const machine_config &mconfig, const char *tag, dev
m_icount(0),
m_lastpins(0),
m_ppc(0),
- m_program(nullptr),
- m_cache(nullptr),
m_output_pins_changed(*this)
{
// set our instruction counter
@@ -191,8 +189,8 @@ void dsp32c_device::device_start()
m_output_pins_changed.resolve_safe();
// get our address spaces
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", m_r[15]).noshow();
@@ -415,17 +413,17 @@ std::unique_ptr<util::disasm_interface> dsp32c_device::create_disassembler()
inline uint32_t dsp32c_device::ROPCODE(offs_t pc)
{
- return m_cache->read_dword(pc);
+ return m_cache.read_dword(pc);
}
inline uint8_t dsp32c_device::RBYTE(offs_t addr)
{
- return m_program->read_byte(addr);
+ return m_program.read_byte(addr);
}
inline void dsp32c_device::WBYTE(offs_t addr, uint8_t data)
{
- m_program->write_byte(addr, data);
+ m_program.write_byte(addr, data);
}
inline uint16_t dsp32c_device::RWORD(offs_t addr)
@@ -434,7 +432,7 @@ inline uint16_t dsp32c_device::RWORD(offs_t addr)
if (!WORD_ALIGNED(addr))
osd_printf_error("Unaligned word read @ %06X, PC=%06X\n", addr, PC);
#endif
- return m_program->read_word(addr);
+ return m_program.read_word(addr);
}
inline uint32_t dsp32c_device::RLONG(offs_t addr)
@@ -443,7 +441,7 @@ inline uint32_t dsp32c_device::RLONG(offs_t addr)
if (!DWORD_ALIGNED(addr))
osd_printf_error("Unaligned long read @ %06X, PC=%06X\n", addr, PC);
#endif
- return m_program->read_dword(addr);
+ return m_program.read_dword(addr);
}
inline void dsp32c_device::WWORD(offs_t addr, uint16_t data)
@@ -452,7 +450,7 @@ inline void dsp32c_device::WWORD(offs_t addr, uint16_t data)
if (!WORD_ALIGNED(addr))
osd_printf_error("Unaligned word write @ %06X, PC=%06X\n", addr, PC);
#endif
- m_program->write_word(addr, data);
+ m_program.write_word(addr, data);
}
inline void dsp32c_device::WLONG(offs_t addr, uint32_t data)
@@ -461,7 +459,7 @@ inline void dsp32c_device::WLONG(offs_t addr, uint32_t data)
if (!DWORD_ALIGNED(addr))
osd_printf_error("Unaligned long write @ %06X, PC=%06X\n", addr, PC);
#endif
- m_program->write_dword(addr, data);
+ m_program.write_dword(addr, data);
}
diff --git a/src/devices/cpu/dsp32/dsp32.h b/src/devices/cpu/dsp32/dsp32.h
index e30de0a29b6..90ede0181fa 100644
--- a/src/devices/cpu/dsp32/dsp32.h
+++ b/src/devices/cpu/dsp32/dsp32.h
@@ -416,8 +416,8 @@ protected:
int m_icount;
uint8_t m_lastpins;
uint32_t m_ppc;
- address_space * m_program;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<24, 2, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<24, 2, 0, ENDIANNESS_LITTLE>::specific m_program;
devcb_write32 m_output_pins_changed;
// tables
diff --git a/src/devices/cpu/dsp56156/dsp56156.cpp b/src/devices/cpu/dsp56156/dsp56156.cpp
index b6c5b4fd672..04952c0f7d3 100644
--- a/src/devices/cpu/dsp56156/dsp56156.cpp
+++ b/src/devices/cpu/dsp56156/dsp56156.cpp
@@ -141,7 +141,7 @@ device_memory_interface::space_config_vector dsp56156_device::memory_space_confi
/***************************************************************************
MEMORY ACCESSORS
***************************************************************************/
-#define ROPCODE(pc) cpustate->cache->read_word(pc)
+#define ROPCODE(pc) cpustate->cache.read_word(pc)
/***************************************************************************
@@ -291,9 +291,9 @@ void dsp56156_device::device_start()
save_item(NAME(m_core.peripheral_ram));
- m_core.program = &space(AS_PROGRAM);
- m_core.cache = m_core.program->cache<1, -1, ENDIANNESS_LITTLE>();
- m_core.data = &space(AS_DATA);
+ space(AS_PROGRAM).cache(m_core.cache);
+ space(AS_PROGRAM).specific(m_core.program);
+ space(AS_DATA).specific(m_core.data);
state_add(DSP56156_PC, "PC", m_core.PCU.pc).formatstr("%04X");
state_add(DSP56156_SR, "SR", m_core.PCU.sr).formatstr("%04X");
@@ -445,7 +445,7 @@ void dsp56156_device::device_reset()
m_core.ppc = m_core.PCU.pc;
/* HACK - Put a jump to 0x0000 at 0x0000 - this keeps the CPU locked to the instruction at address 0x0000 */
- m_core.program->write_word(0x0000, 0x0124);
+ m_core.program.write_word(0x0000, 0x0124);
}
diff --git a/src/devices/cpu/dsp56156/dsp56156.h b/src/devices/cpu/dsp56156/dsp56156.h
index 4b1169f07d9..09801c54407 100644
--- a/src/devices/cpu/dsp56156/dsp56156.h
+++ b/src/devices/cpu/dsp56156/dsp56156.h
@@ -191,9 +191,9 @@ struct dsp56156_core
int interrupt_cycles;
void (*output_pins_changed)(uint32_t pins);
cpu_device *device;
- address_space *program;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *cache;
- address_space *data;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::cache cache;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific program;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific data;
uint16_t peripheral_ram[0x40];
uint16_t *program_ram;
diff --git a/src/devices/cpu/dsp56156/dsp56ops.hxx b/src/devices/cpu/dsp56156/dsp56ops.hxx
index 52ff4f5560c..d6b2b82f97d 100644
--- a/src/devices/cpu/dsp56156/dsp56ops.hxx
+++ b/src/devices/cpu/dsp56156/dsp56ops.hxx
@@ -2308,7 +2308,7 @@ static size_t dsp56156_op_bfop(dsp56156_core* cpustate, const uint16_t op, const
decode_BBB_bitmask(cpustate, BITS(op2,0xe000), &iVal);
workAddr = assemble_address_from_Pppppp_table(cpustate, BITS(op,0x0020), BITS(op,0x001f));
- previousValue = cpustate->data->read_word(workAddr);
+ previousValue = cpustate->data.read_word(workAddr);
workingWord = previousValue;
switch(BITS(op2, 0x1f00))
@@ -2374,7 +2374,7 @@ static size_t dsp56156_op_bfop_1(dsp56156_core* cpustate, const uint16_t op, con
decode_RR_table(cpustate, BITS(op,0x0003), &R);
workAddr = *((uint16_t*)R.addr);
- previousValue = cpustate->data->read_word(workAddr);
+ previousValue = cpustate->data.read_word(workAddr);
workingWord = previousValue;
switch(BITS(op2, 0x1f00))
@@ -3265,7 +3265,7 @@ static size_t dsp56156_op_movec(dsp56156_core* cpustate, const uint16_t op, uint
if (W)
{
/* Write D */
- uint16_t value = cpustate->data->read_word(*((uint16_t*)R.addr)) ;
+ uint16_t value = cpustate->data.read_word(*((uint16_t*)R.addr)) ;
typed_pointer temp_src = { &value, DT_WORD };
SetDestinationValue(temp_src, SD);
}
@@ -3307,7 +3307,7 @@ static size_t dsp56156_op_movec_1(dsp56156_core* cpustate, const uint16_t op, ui
if (W)
{
/* Write D */
- uint16_t tempData = cpustate->data->read_word(memOffset);
+ uint16_t tempData = cpustate->data.read_word(memOffset);
typed_pointer temp_src = { (void*)&tempData, DT_WORD };
SetDestinationValue(temp_src, SD);
}
@@ -3351,7 +3351,7 @@ static size_t dsp56156_op_movec_2(dsp56156_core* cpustate, const uint16_t op, ui
if (W)
{
/* Write D */
- uint16_t tempData = cpustate->data->read_word(memOffset);
+ uint16_t tempData = cpustate->data.read_word(memOffset);
typed_pointer temp_src = { (void*)&tempData, DT_WORD };
SetDestinationValue(temp_src, SD);
}
@@ -3402,7 +3402,7 @@ static size_t dsp56156_op_movec_3(dsp56156_core* cpustate, const uint16_t op, co
else
{
/* 16-bit long address */
- uint16_t tempD = cpustate->data->read_word(op2);
+ uint16_t tempD = cpustate->data.read_word(op2);
typed_pointer tempTP = {&tempD, DT_WORD};
SetDestinationValue(tempTP, SD);
}
@@ -3480,7 +3480,7 @@ static size_t dsp56156_op_movec_5(dsp56156_core* cpustate, const uint16_t op, co
if (W)
{
/* Write D */
- uint16_t tempData = cpustate->data->read_word(memOffset);
+ uint16_t tempData = cpustate->data.read_word(memOffset);
typed_pointer temp_src = { (void*)&tempData, DT_WORD };
SetDestinationValue(temp_src, SD);
}
@@ -3543,7 +3543,7 @@ static size_t dsp56156_op_movem(dsp56156_core* cpustate, const uint16_t op, uint
{
/* Read from Program Memory */
typed_pointer data;
- uint16_t ldata = cpustate->program->read_word(*((uint16_t*)R.addr));
+ uint16_t ldata = cpustate->program.read_word(*((uint16_t*)R.addr));
data.addr = &ldata;
data.data_type = DT_WORD;
@@ -3597,7 +3597,7 @@ static size_t dsp56156_op_movep(dsp56156_core* cpustate, const uint16_t op, uint
if (W)
{
- uint16_t data = cpustate->data->read_word(pp);
+ uint16_t data = cpustate->data.read_word(pp);
typed_pointer tempTP;
tempTP.addr = &data;
@@ -3636,7 +3636,7 @@ static size_t dsp56156_op_movep_1(dsp56156_core* cpustate, const uint16_t op, ui
/* A little different than most W if's - opposite read and write */
if (W)
{
- uint16_t data = cpustate->data->read_word(*((uint16_t*)SD.addr));
+ uint16_t data = cpustate->data.read_word(*((uint16_t*)SD.addr));
typed_pointer tempTP;
tempTP.addr = &data;
@@ -4663,7 +4663,7 @@ static void execute_x_memory_data_move(dsp56156_core* cpustate, const uint16_t o
if (W)
{
/* From X:<ea> to SD */
- uint16_t data = cpustate->data->read_word(*((uint16_t*)R.addr));
+ uint16_t data = cpustate->data.read_word(*((uint16_t*)R.addr));
typed_pointer tempTP;
tempTP.addr = &data;
@@ -4711,7 +4711,7 @@ static void execute_x_memory_data_move2(dsp56156_core* cpustate, const uint16_t
if (W)
{
/* Write D */
- uint16_t value = cpustate->data->read_word(*mem_offset);
+ uint16_t value = cpustate->data.read_word(*mem_offset);
typed_pointer tempV = {&value, DT_WORD};
SetDestinationValue(tempV, SD);
}
@@ -4739,7 +4739,7 @@ static void execute_x_memory_data_move_with_short_displacement(dsp56156_core* cp
if (W)
{
/* Write D */
- uint16_t tempData = cpustate->data->read_word(memOffset);
+ uint16_t tempData = cpustate->data.read_word(memOffset);
typed_pointer temp_src = { (void*)&tempData, DT_WORD };
SetDestinationValue(temp_src, SD);
}
@@ -4775,13 +4775,13 @@ static void execute_dual_x_memory_data_read(dsp56156_core* cpustate, const uint1
fatalerror("Dsp56156: Unimplemented access to external X Data Memory >= 0xffc0 in Dual X Memory Data Read.\n");
/* First memmove */
- srcVal1 = cpustate->data->read_word(*((uint16_t*)R.addr));
+ srcVal1 = cpustate->data.read_word(*((uint16_t*)R.addr));
tempV.addr = &srcVal1;
tempV.data_type = DT_WORD;
SetDestinationValue(tempV, D1);
/* Second memmove */
- srcVal2 = cpustate->data->read_word(R3);
+ srcVal2 = cpustate->data.read_word(R3);
tempV.addr = &srcVal2;
tempV.data_type = DT_WORD;
SetDestinationValue(tempV, D2);
@@ -4877,13 +4877,13 @@ static void SetDataMemoryValue(dsp56156_core* cpustate, typed_pointer source, ui
{
switch(source.data_type)
{
- case DT_BYTE: cpustate->data->write_word(destinationAddr, (uint16_t)( (*((uint8_t*) source.addr) & 0xff) ) ) ; break ;
- case DT_WORD: cpustate->data->write_word(destinationAddr, (uint16_t)( (*((uint16_t*)source.addr) & 0xffff) ) ) ; break ;
- case DT_DOUBLE_WORD: cpustate->data->write_word(destinationAddr, (uint16_t)( (*((uint32_t*)source.addr) & 0x0000ffff) ) ) ; break ;
+ case DT_BYTE: cpustate->data.write_word(destinationAddr, (uint16_t)( (*((uint8_t*) source.addr) & 0xff) ) ) ; break ;
+ case DT_WORD: cpustate->data.write_word(destinationAddr, (uint16_t)( (*((uint16_t*)source.addr) & 0xffff) ) ) ; break ;
+ case DT_DOUBLE_WORD: cpustate->data.write_word(destinationAddr, (uint16_t)( (*((uint32_t*)source.addr) & 0x0000ffff) ) ) ; break ;
/* !!! Is this universal ??? */
/* !!! Forget not, yon shift-limiter !!! */
- case DT_LONG_WORD: cpustate->data->write_word(destinationAddr, (uint16_t)( ((*((uint64_t*)source.addr)) & 0x00000000ffff0000U) >> 16) ) ; break ;
+ case DT_LONG_WORD: cpustate->data.write_word(destinationAddr, (uint16_t)( ((*((uint64_t*)source.addr)) & 0x00000000ffff0000U) >> 16) ) ; break ;
}
}
@@ -4892,12 +4892,12 @@ static void SetProgramMemoryValue(dsp56156_core* cpustate, typed_pointer source,
{
switch(source.data_type)
{
- case DT_BYTE: cpustate->program->write_word(destinationAddr, (uint16_t)( (*((uint8_t*) source.addr) & 0xff) ) ) ; break ;
- case DT_WORD: cpustate->program->write_word(destinationAddr, (uint16_t)( (*((uint16_t*)source.addr) & 0xffff) ) ) ; break ;
- case DT_DOUBLE_WORD: cpustate->program->write_word(destinationAddr, (uint16_t)( (*((uint32_t*)source.addr) & 0x0000ffff) ) ) ; break ;
+ case DT_BYTE: cpustate->program.write_word(destinationAddr, (uint16_t)( (*((uint8_t*) source.addr) & 0xff) ) ) ; break ;
+ case DT_WORD: cpustate->program.write_word(destinationAddr, (uint16_t)( (*((uint16_t*)source.addr) & 0xffff) ) ) ; break ;
+ case DT_DOUBLE_WORD: cpustate->program.write_word(destinationAddr, (uint16_t)( (*((uint32_t*)source.addr) & 0x0000ffff) ) ) ; break ;
/* !!! Is this universal ??? */
/* !!! Forget not, yon shift-limiter !!! */
- case DT_LONG_WORD: cpustate->program->write_word(destinationAddr, (uint16_t)( ((*((uint64_t*)source.addr)) & 0x00000000ffff0000U) >> 16) ) ; break ;
+ case DT_LONG_WORD: cpustate->program.write_word(destinationAddr, (uint16_t)( ((*((uint64_t*)source.addr)) & 0x00000000ffff0000U) >> 16) ) ; break ;
}
}
diff --git a/src/devices/cpu/dsp56156/dsp56pcu.cpp b/src/devices/cpu/dsp56156/dsp56pcu.cpp
index 94ca3b1caae..3714dff41de 100644
--- a/src/devices/cpu/dsp56156/dsp56pcu.cpp
+++ b/src/devices/cpu/dsp56156/dsp56pcu.cpp
@@ -146,8 +146,8 @@ void pcu_reset(dsp56156_core* cpustate)
/* ... */
/* P:$cffe -> Internal P:$07ff low byte */
/* P:$cfff -> Internal P:$07ff high byte */
- uint8_t mem_value_low = cpustate->program->read_byte(mem_offset); /* TODO: IS THIS READING RIGHT? */
- uint8_t mem_value_high = cpustate->program->read_byte(mem_offset);
+ uint8_t mem_value_low = cpustate->program.read_byte(mem_offset); /* TODO: IS THIS READING RIGHT? */
+ uint8_t mem_value_high = cpustate->program.read_byte(mem_offset);
cpustate->program_ram[i] = (mem_value_high << 8) | mem_value_low;
}
@@ -168,7 +168,7 @@ void pcu_reset(dsp56156_core* cpustate)
/* they need. Once they've had their fill, they turn bootstrap mode off */
/* and the CPU begins execution at 0x0000; */
/* HACK - Read bit 15 at 0xc000 to see if we're working with the SSIO or host interface. */
- if (cpustate->program->read_word(0xc000<<1) & 0x8000)
+ if (cpustate->program.read_word(0xc000<<1) & 0x8000)
{
cpustate->bootstrap_mode = BOOTSTRAP_SSIX;
cpustate->device->logerror("DSP56156 : Currently in (hacked) bootstrap mode - reading from SSIx.\n");
diff --git a/src/devices/cpu/dspp/dspp.cpp b/src/devices/cpu/dspp/dspp.cpp
index 44ced48c56c..d4f889df01a 100644
--- a/src/devices/cpu/dspp/dspp.cpp
+++ b/src/devices/cpu/dspp/dspp.cpp
@@ -100,8 +100,6 @@ dspp_device::dspp_device(const machine_config &mconfig, device_type type, const
m_dma_write_handler(*this),
m_code_config("code", ENDIANNESS_BIG, 16, 10, -1, code_map_ctor),
m_data_config("data", ENDIANNESS_BIG, 16, 10, -1, data_map_ctor),
- m_code(nullptr),
- m_data(nullptr),
m_output_fifo_start(0),
m_output_fifo_count(0),
m_dspx_reset(0),
@@ -160,12 +158,9 @@ void dspp_device::device_start()
m_dma_write_handler.resolve_safe();
// Get our address spaces
- m_code = &space(AS_PROGRAM);
- m_data = &space(AS_DATA);
- auto code_cache = m_code->cache<1, -1, ENDIANNESS_BIG>();
- m_code_cache = code_cache;
- m_code16 = [code_cache](offs_t address) -> uint16_t { return code_cache->read_word(address); };
- m_codeptr = [code_cache](offs_t address) -> const void * { return code_cache->read_ptr(address); };
+ space(AS_PROGRAM).cache(m_code_cache);
+ space(AS_PROGRAM).specific(m_code);
+ space(AS_DATA).specific(m_data);
// Register our state for the debugger
state_add(DSPP_PC, "PC", m_core->m_pc);
@@ -369,7 +364,7 @@ inline void dspp_device::update_ticks()
uint16_t dspp_device::read_op(offs_t pc)
{
- return m_code_cache->read_word(pc);
+ return m_code_cache.read_word(pc);
}
@@ -379,7 +374,7 @@ uint16_t dspp_device::read_op(offs_t pc)
inline uint16_t dspp_device::read_data(offs_t addr)
{
- return m_data->read_word(addr);
+ return m_data.read_word(addr);
}
@@ -389,7 +384,7 @@ inline uint16_t dspp_device::read_data(offs_t addr)
inline void dspp_device::write_data(offs_t addr, uint16_t data)
{
- m_data->write_word(addr, data);
+ m_data.write_word(addr, data);
}
@@ -2344,12 +2339,12 @@ READ32_MEMBER( dspp_device::read )
if (offset < 0x1000/4)
{
// 16-bit code memory
- return m_code->read_word(offset);
+ return m_code.read_word(offset);
}
else if (offset >= 0x1000/4 && offset < 0x2000/4)
{
// 16-bit data memory and registers
- return m_data->read_word((offset - 0x1000/4));
+ return m_data.read_word((offset - 0x1000/4));
}
else if(offset >= 0x5000/4 && offset < 0x6000/4)
{
@@ -2505,12 +2500,12 @@ WRITE32_MEMBER( dspp_device::write )
if (offset < 0x1000/4)
{
// 16-bit code memory
- m_code->write_word(offset, data);
+ m_code.write_word(offset, data);
}
else if (offset >= 0x1000/4 && offset < 0x2000/4)
{
// 16-bit data memory and registers
- m_data->write_word((offset - 0x1000/4), data);
+ m_data.write_word((offset - 0x1000/4), data);
}
else if(offset >= 0x5000/4 && offset < 0x6000/4)
{
diff --git a/src/devices/cpu/dspp/dspp.h b/src/devices/cpu/dspp/dspp.h
index 1137400da3f..493c88d8ef0 100644
--- a/src/devices/cpu/dspp/dspp.h
+++ b/src/devices/cpu/dspp/dspp.h
@@ -199,11 +199,9 @@ private:
// Address spaces
const address_space_config m_code_config;
const address_space_config m_data_config;
- address_space * m_code;
- address_space * m_data;
- memory_access_cache<1, -1, ENDIANNESS_BIG> *m_code_cache;
- std::function<uint16_t (offs_t)> m_code16;
- std::function<const void * (offs_t)> m_codeptr;
+ memory_access<10, 1, -1, ENDIANNESS_BIG>::cache m_code_cache;
+ memory_access<10, 1, -1, ENDIANNESS_BIG>::specific m_code;
+ memory_access<10, 1, -1, ENDIANNESS_BIG>::specific m_data;
struct dspp_internal_state
{
diff --git a/src/devices/cpu/dspp/dsppdrc.cpp b/src/devices/cpu/dspp/dsppdrc.cpp
index 68b0c3cb741..947c698576f 100644
--- a/src/devices/cpu/dspp/dsppdrc.cpp
+++ b/src/devices/cpu/dspp/dsppdrc.cpp
@@ -292,7 +292,7 @@ void dspp_device::generate_checksum_block(drcuml_block &block, compiler_state *c
{
uint32_t sum = seqhead->opptr.w[0];
uint32_t addr = seqhead->physpc;
- const void *base = m_codeptr(addr);
+ const void *base = m_code_cache.read_ptr(addr);
UML_MOV(block, I0, 0);
UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); // load i0,base,0,word
@@ -306,14 +306,14 @@ void dspp_device::generate_checksum_block(drcuml_block &block, compiler_state *c
{
uint32_t sum = 0;
uint32_t addr = seqhead->physpc;
- const void *base = m_codeptr(addr);
+ const void *base = m_code_cache.read_ptr(addr);
UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); // load i0,base,0,dword
sum += seqhead->opptr.w[0];
for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next())
if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP))
{
addr = curdesc->physpc;
- base = m_codeptr(addr);
+ base = m_code_cache.read_ptr(addr);
assert(base != nullptr);
UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); // load i1,base,dword
UML_ADD(block, I0, I0, I1); // add i0,i0,i1
@@ -830,7 +830,7 @@ void dspp_device::generate_parse_operands(drcuml_block &block, compiler_state *c
uint32_t opoffset = 1;
while (opidx < numops)
{
- operand = m_code16(desc->pc + opoffset);
+ operand = m_code_cache.read_word(desc->pc + opoffset);
opoffset++;
if (operand & 0x8000)
diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp
index cce03566729..2311ba75a8b 100644
--- a/src/devices/cpu/e132xs/e132xs.cpp
+++ b/src/devices/cpu/e132xs/e132xs.cpp
@@ -1115,24 +1115,24 @@ void hyperstone_device::init(int scale_mask)
m_program = &space(AS_PROGRAM);
if (m_program->data_width() == 16)
{
- auto cache = m_program->cache<1, 0, ENDIANNESS_BIG>();
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ m_program->cache(m_cache16);
+ m_pr16 = [this](offs_t address) -> u16 { return m_cache16.read_word(address); };
+ m_prptr = [this](offs_t address) -> const void * { return m_cache16.read_ptr(address); };
}
else
{
- auto cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
+ m_program->cache(m_cache32);
+ m_pr16 = [this](offs_t address) -> u16 { return m_cache32.read_word(address); };
if (ENDIANNESS_NATIVE != ENDIANNESS_BIG)
- m_prptr = [cache](offs_t address) -> const void * {
- const u16 *ptr = static_cast<u16 *>(cache->read_ptr(address & ~3));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u16 *ptr = static_cast<u16 *>(m_cache32.read_ptr(address & ~3));
if(!(address & 2))
ptr++;
return ptr;
};
else
- m_prptr = [cache](offs_t address) -> const void * {
- const u16 *ptr = static_cast<u16 *>(cache->read_ptr(address & ~3));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u16 *ptr = static_cast<u16 *>(m_cache32.read_ptr(address & ~3));
if(address & 2)
ptr++;
return ptr;
diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h
index 6c838fefb37..fb50a3dfb5b 100644
--- a/src/devices/cpu/e132xs/e132xs.h
+++ b/src/devices/cpu/e132xs/e132xs.h
@@ -305,6 +305,9 @@ protected:
const address_space_config m_program_config;
const address_space_config m_io_config;
address_space *m_program;
+ memory_access<32, 1, 0, ENDIANNESS_BIG>::cache m_cache16;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cache32;
+
std::function<u16 (offs_t)> m_pr16;
std::function<const void * (offs_t)> m_prptr;
address_space *m_io;
diff --git a/src/devices/cpu/esrip/esrip.cpp b/src/devices/cpu/esrip/esrip.cpp
index 5fa6788d24b..931b5866308 100644
--- a/src/devices/cpu/esrip/esrip.cpp
+++ b/src/devices/cpu/esrip/esrip.cpp
@@ -192,8 +192,8 @@ void esrip_device::device_start()
/* Allocate image pointer table RAM */
m_ipt_ram.resize(IPT_RAM_SIZE/2);
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<3, -3, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", m_rip_pc).noshow();
@@ -1880,7 +1880,7 @@ void esrip_device::execute_run()
m_pl7 = m_l7;
/* Latch instruction */
- inst = m_cache->read_qword(RIP_PC);
+ inst = m_cache.read_qword(RIP_PC);
in_h = inst >> 32;
in_l = inst & 0xffffffff;
diff --git a/src/devices/cpu/esrip/esrip.h b/src/devices/cpu/esrip/esrip.h
index 19a4cde150d..f58b2d41a97 100644
--- a/src/devices/cpu/esrip/esrip.h
+++ b/src/devices/cpu/esrip/esrip.h
@@ -176,8 +176,8 @@ protected:
std::vector<uint16_t> m_ipt_ram;
uint8_t *m_lbrm;
- address_space *m_program;
- memory_access_cache<3, -3, ENDIANNESS_BIG> *m_cache;
+ memory_access<9, 3, -3, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<9, 3, -3, ENDIANNESS_BIG>::specific m_program;
int m_icount;
diff --git a/src/devices/cpu/f8/f8.cpp b/src/devices/cpu/f8/f8.cpp
index 6f6ea70512c..9aa27af8f54 100644
--- a/src/devices/cpu/f8/f8.cpp
+++ b/src/devices/cpu/f8/f8.cpp
@@ -108,10 +108,9 @@ void f8_cpu_device::state_string_export(const device_state_entry &entry, std::st
void f8_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
- m_r = space(AS_DATA).cache<0, 0, ENDIANNESS_BIG>();
- m_iospace = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_program);
+ space(AS_DATA).cache(m_r);
+ space(AS_IO).specific(m_ios);
// zerofill
m_debug_pc = 0;
@@ -282,7 +281,7 @@ void f8_cpu_device::ROMC_00(int insttim)
* of PC0.
*/
- m_dbus = m_cache->read_byte(m_pc0);
+ m_dbus = m_program.read_byte(m_pc0);
m_pc0 += 1;
m_icount -= insttim; /* ROMC00 is usually short, not short+long, but DS is long */
}
@@ -295,7 +294,7 @@ void f8_cpu_device::ROMC_01()
* location addressed by PC0; then all devices add the 8-bit value
* on the data bus as signed binary number to PC0.
*/
- m_dbus = m_cache->read_byte(m_pc0);
+ m_dbus = m_program.read_byte(m_pc0);
m_pc0 += (s8)m_dbus;
m_icount -= cL;
}
@@ -308,7 +307,7 @@ void f8_cpu_device::ROMC_02()
* the memory location addressed by DC0; then all devices increment
* DC0.
*/
- m_dbus = m_program->read_byte(m_dc0);
+ m_dbus = m_program.read_byte(m_dc0);
m_dc0 += 1;
m_icount -= cL;
}
@@ -319,7 +318,7 @@ void f8_cpu_device::ROMC_03(int insttim)
* Similiar to 0x00, except that it is used for immediate operands
* fetches (using PC0) instead of instruction fetches.
*/
- m_dbus = m_io = m_cache->read_byte(m_pc0);
+ m_dbus = m_io = m_program.read_byte(m_pc0);
m_pc0 += 1;
m_icount -= insttim;
}
@@ -339,7 +338,7 @@ void f8_cpu_device::ROMC_05()
* Store the data bus contents into the memory location pointed
* to by DC0; increment DC0.
*/
- m_program->write_byte(m_dc0, m_dbus);
+ m_program.write_byte(m_dc0, m_dbus);
m_dc0 += 1;
m_icount -= cL;
}
@@ -413,7 +412,7 @@ void f8_cpu_device::ROMC_0C()
* by PC0 into the data bus; then all devices move the value that
* has just been placed on the data bus into the low order byte of PC0.
*/
- m_dbus = m_cache->read_byte(m_pc0);
+ m_dbus = m_program.read_byte(m_pc0);
m_pc0 = (m_pc0 & 0xff00) | m_dbus;
m_icount -= cL;
}
@@ -436,7 +435,7 @@ void f8_cpu_device::ROMC_0E()
* The value on the data bus is then moved to the low order byte
* of DC0 by all devices.
*/
- m_dbus = m_cache->read_byte(m_pc0);
+ m_dbus = m_program.read_byte(m_pc0);
m_dc0 = (m_dc0 & 0xff00) | m_dbus;
m_icount -= cL;
}
@@ -474,7 +473,7 @@ void f8_cpu_device::ROMC_11()
* data bus. All devices must then move the contents of the
* data bus to the upper byte of DC0.
*/
- m_dbus = m_cache->read_byte(m_pc0);
+ m_dbus = m_program.read_byte(m_pc0);
m_dc0 = (m_dc0 & 0x00ff) | (m_dbus << 8);
m_icount -= cL;
}
@@ -573,7 +572,7 @@ void f8_cpu_device::ROMC_1A()
* register was addressed; the device containing the addressed port
* must place the contents of the data bus into the address port.
*/
- m_iospace->write_byte(m_io, m_dbus);
+ m_ios.write_byte(m_io, m_dbus);
m_icount -= cL;
}
@@ -586,7 +585,7 @@ void f8_cpu_device::ROMC_1B()
* contents of timer and interrupt control registers cannot be read
* back onto the data bus).
*/
- m_dbus = m_iospace->read_byte(m_io);
+ m_dbus = m_ios.read_byte(m_io);
m_icount -= cL;
}
@@ -644,7 +643,7 @@ void f8_cpu_device::illegal()
***************************************************/
void f8_cpu_device::f8_lr_a_ku()
{
- m_a = m_r->read_byte(12);
+ m_a = m_r.read_byte(12);
}
/***************************************************
@@ -653,7 +652,7 @@ void f8_cpu_device::f8_lr_a_ku()
***************************************************/
void f8_cpu_device::f8_lr_a_kl()
{
- m_a = m_r->read_byte(13);
+ m_a = m_r.read_byte(13);
}
/***************************************************
@@ -662,7 +661,7 @@ void f8_cpu_device::f8_lr_a_kl()
***************************************************/
void f8_cpu_device::f8_lr_a_qu()
{
- m_a = m_r->read_byte(14);
+ m_a = m_r.read_byte(14);
}
/***************************************************
@@ -671,7 +670,7 @@ void f8_cpu_device::f8_lr_a_qu()
***************************************************/
void f8_cpu_device::f8_lr_a_ql()
{
- m_a = m_r->read_byte(15);
+ m_a = m_r.read_byte(15);
}
/***************************************************
@@ -680,7 +679,7 @@ void f8_cpu_device::f8_lr_a_ql()
***************************************************/
void f8_cpu_device::f8_lr_ku_a()
{
- m_r->write_byte(12, m_a);
+ m_r.write_byte(12, m_a);
}
/***************************************************
@@ -689,7 +688,7 @@ void f8_cpu_device::f8_lr_ku_a()
***************************************************/
void f8_cpu_device::f8_lr_kl_a()
{
- m_r->write_byte(13, m_a);
+ m_r.write_byte(13, m_a);
}
/***************************************************
@@ -698,7 +697,7 @@ void f8_cpu_device::f8_lr_kl_a()
***************************************************/
void f8_cpu_device::f8_lr_qu_a()
{
- m_r->write_byte(14, m_a);
+ m_r.write_byte(14, m_a);
}
/***************************************************
@@ -707,7 +706,7 @@ void f8_cpu_device::f8_lr_qu_a()
***************************************************/
void f8_cpu_device::f8_lr_ql_a()
{
- m_r->write_byte(15, m_a);
+ m_r.write_byte(15, m_a);
}
/***************************************************
@@ -717,9 +716,9 @@ void f8_cpu_device::f8_lr_ql_a()
void f8_cpu_device::f8_lr_k_p()
{
ROMC_07();
- m_r->write_byte(12, m_dbus);
+ m_r.write_byte(12, m_dbus);
ROMC_0B();
- m_r->write_byte(13, m_dbus);
+ m_r.write_byte(13, m_dbus);
}
/***************************************************
@@ -728,9 +727,9 @@ void f8_cpu_device::f8_lr_k_p()
***************************************************/
void f8_cpu_device::f8_lr_p_k()
{
- m_dbus = m_r->read_byte(12);
+ m_dbus = m_r.read_byte(12);
ROMC_15();
- m_dbus = m_r->read_byte(13);
+ m_dbus = m_r.read_byte(13);
ROMC_18();
}
@@ -758,9 +757,9 @@ void f8_cpu_device::f8_lr_is_a()
***************************************************/
void f8_cpu_device::f8_pk()
{
- m_dbus = m_r->read_byte(13);
+ m_dbus = m_r.read_byte(13);
ROMC_12();
- m_dbus = m_r->read_byte(12);
+ m_dbus = m_r.read_byte(12);
ROMC_14();
}
@@ -770,9 +769,9 @@ void f8_cpu_device::f8_pk()
***************************************************/
void f8_cpu_device::f8_lr_p0_q()
{
- m_dbus = m_r->read_byte(15);
+ m_dbus = m_r.read_byte(15);
ROMC_17();
- m_dbus = m_r->read_byte(14);
+ m_dbus = m_r.read_byte(14);
ROMC_14();
}
@@ -783,9 +782,9 @@ void f8_cpu_device::f8_lr_p0_q()
void f8_cpu_device::f8_lr_q_dc()
{
ROMC_06();
- m_r->write_byte(14, m_dbus);
+ m_r.write_byte(14, m_dbus);
ROMC_09();
- m_r->write_byte(15, m_dbus);
+ m_r.write_byte(15, m_dbus);
}
/***************************************************
@@ -794,9 +793,9 @@ void f8_cpu_device::f8_lr_q_dc()
***************************************************/
void f8_cpu_device::f8_lr_dc_q()
{
- m_dbus = m_r->read_byte(14);
+ m_dbus = m_r.read_byte(14);
ROMC_16();
- m_dbus = m_r->read_byte(15);
+ m_dbus = m_r.read_byte(15);
ROMC_19();
}
@@ -806,9 +805,9 @@ void f8_cpu_device::f8_lr_dc_q()
***************************************************/
void f8_cpu_device::f8_lr_dc_h()
{
- m_dbus = m_r->read_byte(10);
+ m_dbus = m_r.read_byte(10);
ROMC_16();
- m_dbus = m_r->read_byte(11);
+ m_dbus = m_r.read_byte(11);
ROMC_19();
}
@@ -819,9 +818,9 @@ void f8_cpu_device::f8_lr_dc_h()
void f8_cpu_device::f8_lr_h_dc()
{
ROMC_06();
- m_r->write_byte(10, m_dbus);
+ m_r.write_byte(10, m_dbus);
ROMC_09();
- m_r->write_byte(11, m_dbus);
+ m_r.write_byte(11, m_dbus);
}
/***************************************************
@@ -948,7 +947,7 @@ void f8_cpu_device::f8_pop()
void f8_cpu_device::f8_lr_w_j()
{
ROMC_1C(cS);
- m_w = m_r->read_byte(9) & 0x1f;
+ m_w = m_r.read_byte(9) & 0x1f;
}
/***************************************************
@@ -957,7 +956,7 @@ void f8_cpu_device::f8_lr_w_j()
***************************************************/
void f8_cpu_device::f8_lr_j_w()
{
- m_r->write_byte(9, m_w);
+ m_r.write_byte(9, m_w);
}
/***************************************************
@@ -1127,8 +1126,8 @@ void f8_cpu_device::f8_xdc()
void f8_cpu_device::f8_ds_r(int r)
{
CLR_OZCS();
- int d = do_add(m_r->read_byte(r), 0xff);
- m_r->write_byte(r, d);
+ int d = do_add(m_r.read_byte(r), 0xff);
+ m_r.write_byte(r, d);
SET_SZ(d);
}
@@ -1139,8 +1138,8 @@ void f8_cpu_device::f8_ds_r(int r)
void f8_cpu_device::f8_ds_isar()
{
CLR_OZCS();
- int d = do_add(m_r->read_byte(m_is), 0xff);
- m_r->write_byte(m_is, d);
+ int d = do_add(m_r.read_byte(m_is), 0xff);
+ m_r.write_byte(m_is, d);
SET_SZ(d);
}
@@ -1151,8 +1150,8 @@ void f8_cpu_device::f8_ds_isar()
void f8_cpu_device::f8_ds_isar_i()
{
CLR_OZCS();
- int d = do_add(m_r->read_byte(m_is), 0xff);
- m_r->write_byte(m_is, d);
+ int d = do_add(m_r.read_byte(m_is), 0xff);
+ m_r.write_byte(m_is, d);
SET_SZ(d);
m_is = (m_is & 0x38) | ((m_is + 1) & 0x07);
}
@@ -1164,8 +1163,8 @@ void f8_cpu_device::f8_ds_isar_i()
void f8_cpu_device::f8_ds_isar_d()
{
CLR_OZCS();
- int d = do_add(m_r->read_byte(m_is), 0xff);
- m_r->write_byte(m_is, d);
+ int d = do_add(m_r.read_byte(m_is), 0xff);
+ m_r.write_byte(m_is, d);
SET_SZ(d);
m_is = (m_is & 0x38) | ((m_is - 1) & 0x07);
}
@@ -1176,7 +1175,7 @@ void f8_cpu_device::f8_ds_isar_d()
***************************************************/
void f8_cpu_device::f8_lr_a_r(int r)
{
- m_a = m_r->read_byte(r);
+ m_a = m_r.read_byte(r);
}
/***************************************************
@@ -1185,7 +1184,7 @@ void f8_cpu_device::f8_lr_a_r(int r)
***************************************************/
void f8_cpu_device::f8_lr_a_isar()
{
- m_a = m_r->read_byte(m_is);
+ m_a = m_r.read_byte(m_is);
}
/***************************************************
@@ -1194,7 +1193,7 @@ void f8_cpu_device::f8_lr_a_isar()
***************************************************/
void f8_cpu_device::f8_lr_a_isar_i()
{
- m_a = m_r->read_byte(m_is);
+ m_a = m_r.read_byte(m_is);
m_is = (m_is & 0x38) | ((m_is + 1) & 0x07);
}
@@ -1204,7 +1203,7 @@ void f8_cpu_device::f8_lr_a_isar_i()
***************************************************/
void f8_cpu_device::f8_lr_a_isar_d()
{
- m_a = m_r->read_byte(m_is);
+ m_a = m_r.read_byte(m_is);
m_is = (m_is & 0x38) | ((m_is - 1) & 0x07);
}
@@ -1214,7 +1213,7 @@ void f8_cpu_device::f8_lr_a_isar_d()
***************************************************/
void f8_cpu_device::f8_lr_r_a(int r)
{
- m_r->write_byte(r, m_a);
+ m_r.write_byte(r, m_a);
}
/***************************************************
@@ -1223,7 +1222,7 @@ void f8_cpu_device::f8_lr_r_a(int r)
***************************************************/
void f8_cpu_device::f8_lr_isar_a()
{
- m_r->write_byte(m_is, m_a);
+ m_r.write_byte(m_is, m_a);
}
/***************************************************
@@ -1232,7 +1231,7 @@ void f8_cpu_device::f8_lr_isar_a()
***************************************************/
void f8_cpu_device::f8_lr_isar_i_a()
{
- m_r->write_byte(m_is, m_a);
+ m_r.write_byte(m_is, m_a);
m_is = (m_is & 0x38) | ((m_is + 1) & 0x07);
}
@@ -1242,7 +1241,7 @@ void f8_cpu_device::f8_lr_isar_i_a()
***************************************************/
void f8_cpu_device::f8_lr_isar_d_a()
{
- m_r->write_byte(m_is, m_a);
+ m_r.write_byte(m_is, m_a);
m_is = (m_is & 0x38) | ((m_is - 1) & 0x07);
}
@@ -1398,7 +1397,7 @@ void f8_cpu_device::f8_ins_0(int n)
{
ROMC_1C(cS);
CLR_OZCS();
- m_a = m_iospace->read_byte(n);
+ m_a = m_ios.read_byte(n);
SET_SZ(m_a);
}
@@ -1423,7 +1422,7 @@ void f8_cpu_device::f8_ins_1(int n)
void f8_cpu_device::f8_outs_0(int n)
{
ROMC_1C(cS);
- m_iospace->write_byte(n, m_a);
+ m_ios.write_byte(n, m_a);
}
/***************************************************
@@ -1445,7 +1444,7 @@ void f8_cpu_device::f8_outs_1(int n)
void f8_cpu_device::f8_as(int r)
{
CLR_OZCS();
- m_a = do_add(m_a, m_r->read_byte(r));
+ m_a = do_add(m_a, m_r.read_byte(r));
SET_SZ(m_a);
}
@@ -1456,7 +1455,7 @@ void f8_cpu_device::f8_as(int r)
void f8_cpu_device::f8_as_isar()
{
CLR_OZCS();
- m_a = do_add(m_a, m_r->read_byte(m_is));
+ m_a = do_add(m_a, m_r.read_byte(m_is));
SET_SZ(m_a);
}
@@ -1467,7 +1466,7 @@ void f8_cpu_device::f8_as_isar()
void f8_cpu_device::f8_as_isar_i()
{
CLR_OZCS();
- m_a = do_add(m_a, m_r->read_byte(m_is));
+ m_a = do_add(m_a, m_r.read_byte(m_is));
SET_SZ(m_a);
m_is = (m_is & 0x38) | ((m_is + 1) & 0x07);
}
@@ -1479,7 +1478,7 @@ void f8_cpu_device::f8_as_isar_i()
void f8_cpu_device::f8_as_isar_d()
{
CLR_OZCS();
- m_a = do_add(m_a, m_r->read_byte(m_is));
+ m_a = do_add(m_a, m_r.read_byte(m_is));
SET_SZ(m_a);
m_is = (m_is & 0x38) | ((m_is - 1) & 0x07);
}
@@ -1491,7 +1490,7 @@ void f8_cpu_device::f8_as_isar_d()
void f8_cpu_device::f8_asd(int r)
{
ROMC_1C(cS);
- m_a = do_add_decimal(m_a, m_r->read_byte(r));
+ m_a = do_add_decimal(m_a, m_r.read_byte(r));
}
/***************************************************
@@ -1501,7 +1500,7 @@ void f8_cpu_device::f8_asd(int r)
void f8_cpu_device::f8_asd_isar()
{
ROMC_1C(cS);
- m_a = do_add_decimal(m_a, m_r->read_byte(m_is));
+ m_a = do_add_decimal(m_a, m_r.read_byte(m_is));
}
/***************************************************
@@ -1511,7 +1510,7 @@ void f8_cpu_device::f8_asd_isar()
void f8_cpu_device::f8_asd_isar_i()
{
ROMC_1C(cS);
- m_a = do_add_decimal(m_a, m_r->read_byte(m_is));
+ m_a = do_add_decimal(m_a, m_r.read_byte(m_is));
m_is = (m_is & 0x38) | ((m_is + 1) & 0x07);
}
@@ -1522,7 +1521,7 @@ void f8_cpu_device::f8_asd_isar_i()
void f8_cpu_device::f8_asd_isar_d()
{
ROMC_1C(cS);
- m_a = do_add_decimal(m_a, m_r->read_byte(m_is));
+ m_a = do_add_decimal(m_a, m_r.read_byte(m_is));
m_is = (m_is & 0x38) | ((m_is - 1) & 0x07);
}
@@ -1533,7 +1532,7 @@ void f8_cpu_device::f8_asd_isar_d()
void f8_cpu_device::f8_xs(int r)
{
CLR_OZCS();
- m_a ^= m_r->read_byte(r);
+ m_a ^= m_r.read_byte(r);
SET_SZ(m_a);
}
@@ -1544,7 +1543,7 @@ void f8_cpu_device::f8_xs(int r)
void f8_cpu_device::f8_xs_isar()
{
CLR_OZCS();
- m_a ^= m_r->read_byte(m_is);
+ m_a ^= m_r.read_byte(m_is);
SET_SZ(m_a);
}
@@ -1555,7 +1554,7 @@ void f8_cpu_device::f8_xs_isar()
void f8_cpu_device::f8_xs_isar_i()
{
CLR_OZCS();
- m_a ^= m_r->read_byte(m_is);
+ m_a ^= m_r.read_byte(m_is);
SET_SZ(m_a);
m_is = (m_is & 0x38) | ((m_is + 1) & 0x07);
}
@@ -1567,7 +1566,7 @@ void f8_cpu_device::f8_xs_isar_i()
void f8_cpu_device::f8_xs_isar_d()
{
CLR_OZCS();
- m_a ^= m_r->read_byte(m_is);
+ m_a ^= m_r.read_byte(m_is);
SET_SZ(m_a);
m_is = (m_is & 0x38) | ((m_is - 1) & 0x07);
}
@@ -1579,7 +1578,7 @@ void f8_cpu_device::f8_xs_isar_d()
void f8_cpu_device::f8_ns(int r)
{
CLR_OZCS();
- m_a &= m_r->read_byte(r);
+ m_a &= m_r.read_byte(r);
SET_SZ(m_a);
}
@@ -1590,7 +1589,7 @@ void f8_cpu_device::f8_ns(int r)
void f8_cpu_device::f8_ns_isar()
{
CLR_OZCS();
- m_a &= m_r->read_byte(m_is);
+ m_a &= m_r.read_byte(m_is);
SET_SZ(m_a);
}
@@ -1601,7 +1600,7 @@ void f8_cpu_device::f8_ns_isar()
void f8_cpu_device::f8_ns_isar_i()
{
CLR_OZCS();
- m_a &= m_r->read_byte(m_is);
+ m_a &= m_r.read_byte(m_is);
SET_SZ(m_a);
m_is = (m_is & 0x38) | ((m_is + 1) & 0x07);
}
@@ -1613,7 +1612,7 @@ void f8_cpu_device::f8_ns_isar_i()
void f8_cpu_device::f8_ns_isar_d()
{
CLR_OZCS();
- m_a &= m_r->read_byte(m_is);
+ m_a &= m_r.read_byte(m_is);
SET_SZ(m_a);
m_is = (m_is & 0x38) | ((m_is - 1) & 0x07);
}
diff --git a/src/devices/cpu/f8/f8.h b/src/devices/cpu/f8/f8.h
index e8851da127e..ed12ecab708 100644
--- a/src/devices/cpu/f8/f8.h
+++ b/src/devices/cpu/f8/f8.h
@@ -66,10 +66,9 @@ private:
u8 m_dbus; /* data bus value */
u16 m_io; /* last I/O address */
u16 m_irq_vector;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_r;
- address_space *m_iospace;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_program;
+ memory_access<6, 0, 0, ENDIANNESS_BIG>::cache m_r;
+ memory_access<8, 0, 0, ENDIANNESS_BIG>::specific m_ios;
int m_icount;
int m_irq_request;
diff --git a/src/devices/cpu/fr/fr.cpp b/src/devices/cpu/fr/fr.cpp
index 187b2782a4f..51ae7313780 100644
--- a/src/devices/cpu/fr/fr.cpp
+++ b/src/devices/cpu/fr/fr.cpp
@@ -18,8 +18,6 @@ DEFINE_DEVICE_TYPE(MB91F155A, mb91f155a_device, "mb91f155a", "Fujitsu MB91F155A"
fr_cpu_device::fr_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int addrbits, address_map_constructor map)
: cpu_device(mconfig, type, tag, owner, clock)
, m_space_config("program", ENDIANNESS_BIG, 32, addrbits, 0, map)
- , m_space(nullptr)
- , m_cache(nullptr)
, m_regs{0}
, m_pc(0)
, m_ps(0)
@@ -55,8 +53,8 @@ device_memory_interface::space_config_vector fr_cpu_device::memory_space_config(
void fr_cpu_device::device_start()
{
- m_space = &space(AS_PROGRAM);
- m_cache = m_space->cache<2, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_space);
set_icountptr(m_icount);
@@ -106,7 +104,7 @@ void fr_cpu_device::device_reset()
void fr_cpu_device::execute_run()
{
- m_pc = m_space->read_dword(m_tbr + 0x3fc);
+ m_pc = m_space.read_dword(m_tbr + 0x3fc);
debugger_instruction_hook(m_pc);
diff --git a/src/devices/cpu/fr/fr.h b/src/devices/cpu/fr/fr.h
index 3e931cbff87..60e6eb8469f 100644
--- a/src/devices/cpu/fr/fr.h
+++ b/src/devices/cpu/fr/fr.h
@@ -43,8 +43,8 @@ protected:
private:
// address space
address_space_config m_space_config;
- address_space *m_space;
- memory_access_cache<2, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access<24, 2, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<24, 2, 0, ENDIANNESS_BIG>::specific m_space;
// internal state
u32 m_regs[17]; // includes both SSP and USP
diff --git a/src/devices/cpu/g65816/g65816.cpp b/src/devices/cpu/g65816/g65816.cpp
index 1b5ab166ff8..56883b90e6e 100644
--- a/src/devices/cpu/g65816/g65816.cpp
+++ b/src/devices/cpu/g65816/g65816.cpp
@@ -860,10 +860,9 @@ void g65816_device::device_start()
m_execute = nullptr;
m_debugger_temp = 0;
- address_space &program_space = space(AS_PROGRAM);
- m_data_space = has_space(AS_DATA) ? &space(AS_DATA) : &program_space;
- m_program_cache = program_space.cache<0, 0, ENDIANNESS_LITTLE>();
- m_opcode_cache = (has_space(AS_OPCODES) ? space(AS_OPCODES) : program_space).cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_program);
+ (has_space(AS_OPCODES) ? space(AS_OPCODES) : space(AS_PROGRAM)).cache(m_opcode);
+ (has_space(AS_DATA) ? space(AS_DATA) : space(AS_PROGRAM)).specific(m_data);
m_wdm_w.resolve_safe();
diff --git a/src/devices/cpu/g65816/g65816.h b/src/devices/cpu/g65816/g65816.h
index d37017a5de8..5f0c5183ea7 100644
--- a/src/devices/cpu/g65816/g65816.h
+++ b/src/devices/cpu/g65816/g65816.h
@@ -233,9 +233,10 @@ protected:
unsigned m_fastROM; /* SNES specific */
unsigned m_ir; /* Instruction Register */
unsigned m_irq_delay; /* delay 1 instruction before checking irq */
- address_space *m_data_space;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_program_cache;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_opcode_cache;
+ memory_access<24, 0, 0, ENDIANNESS_LITTLE>::cache m_program;
+ memory_access<24, 0, 0, ENDIANNESS_LITTLE>::cache m_opcode;
+ memory_access<24, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
+
unsigned m_stopped; /* Sets how the CPU is stopped */
const opcode_func* m_opcodes;
get_reg_func m_get_reg;
diff --git a/src/devices/cpu/g65816/g65816cm.h b/src/devices/cpu/g65816/g65816cm.h
index c31b43fb5e6..e8ae404ddf3 100644
--- a/src/devices/cpu/g65816/g65816cm.h
+++ b/src/devices/cpu/g65816/g65816cm.h
@@ -13,10 +13,10 @@
#undef G65816_CALL_DEBUGGER
#define G65816_CALL_DEBUGGER(x) debugger_instruction_hook(x)
-#define g65816_read_8(addr) m_data_space->read_byte(addr)
-#define g65816_write_8(addr,data) m_data_space->write_byte(addr,data)
-#define g65816_read_8_immediate(A) m_program_cache->read_byte(A)
-#define g65816_read_8_opcode(A) m_opcode_cache->read_byte(A)
+#define g65816_read_8(addr) m_data.read_byte(addr)
+#define g65816_write_8(addr,data) m_data.write_byte(addr,data)
+#define g65816_read_8_immediate(A) m_program.read_byte(A)
+#define g65816_read_8_opcode(A) m_opcode.read_byte(A)
#define g65816_jumping(A)
#define g65816_branching(A)
diff --git a/src/devices/cpu/h6280/h6280.cpp b/src/devices/cpu/h6280/h6280.cpp
index 814f906de81..96ecb18534d 100644
--- a/src/devices/cpu/h6280/h6280.cpp
+++ b/src/devices/cpu/h6280/h6280.cpp
@@ -320,9 +320,9 @@ void h6280_device::device_reset()
#endif
m_io_buffer = 0;
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
/* set I and B flags */
P = _fI | _fB;
@@ -1605,7 +1605,7 @@ inline uint8_t h6280_device::smb(int bit, uint8_t tmp)
inline void h6280_device::st0(uint8_t tmp)
{
clear_t();
- m_io->write_byte(0x0000,tmp);
+ m_io.write_byte(0x0000,tmp);
}
/* 6280 ********************************************************
@@ -1614,7 +1614,7 @@ inline void h6280_device::st0(uint8_t tmp)
inline void h6280_device::st1(uint8_t tmp)
{
clear_t();
- m_io->write_byte(0x0002,tmp);
+ m_io.write_byte(0x0002,tmp);
}
/* 6280 ********************************************************
@@ -1623,7 +1623,7 @@ inline void h6280_device::st1(uint8_t tmp)
inline void h6280_device::st2(uint8_t tmp)
{
clear_t();
- m_io->write_byte(0x0003,tmp);
+ m_io.write_byte(0x0003,tmp);
}
/* 6280 ********************************************************
@@ -2329,7 +2329,7 @@ void h6280_device::execute_set_input(int inputnum, int state)
uint8_t h6280_device::program_read8(offs_t addr)
{
check_vdc_vce_penalty(addr);
- return m_program->read_byte(translated(addr));
+ return m_program.read_byte(translated(addr));
}
/***************************************************************
@@ -2338,7 +2338,7 @@ uint8_t h6280_device::program_read8(offs_t addr)
void h6280_device::program_write8(offs_t addr, uint8_t data)
{
check_vdc_vce_penalty(addr);
- m_program->write_byte(translated(addr), data);
+ m_program.write_byte(translated(addr), data);
}
/***************************************************************
@@ -2346,7 +2346,7 @@ void h6280_device::program_write8(offs_t addr, uint8_t data)
***************************************************************/
uint8_t h6280_device::program_read8z(offs_t addr)
{
- return m_program->read_byte((m_mmr[1] << 13) | (addr & 0x1fff));
+ return m_program.read_byte((m_mmr[1] << 13) | (addr & 0x1fff));
}
/***************************************************************
@@ -2354,7 +2354,7 @@ uint8_t h6280_device::program_read8z(offs_t addr)
***************************************************************/
void h6280_device::program_write8z(offs_t addr, uint8_t data)
{
- m_program->write_byte((m_mmr[1] << 13) | (addr & 0x1fff), data);
+ m_program.write_byte((m_mmr[1] << 13) | (addr & 0x1fff), data);
}
/***************************************************************
@@ -2362,8 +2362,8 @@ void h6280_device::program_write8z(offs_t addr, uint8_t data)
***************************************************************/
uint16_t h6280_device::program_read16(offs_t addr)
{
- return m_program->read_byte(translated(addr)) |
- (m_program->read_byte(translated(addr + 1)) << 8);
+ return m_program.read_byte(translated(addr)) |
+ (m_program.read_byte(translated(addr + 1)) << 8);
}
/***************************************************************
@@ -2373,13 +2373,13 @@ uint16_t h6280_device::program_read16z(offs_t addr)
{
if ((addr & 0xff) == 0xff)
{
- return m_program->read_byte((m_mmr[1] << 13) | (addr & 0x1fff)) |
- (m_program->read_byte((m_mmr[1] << 13) | ((addr - 0xff) & 0x1fff)) << 8);
+ return m_program.read_byte((m_mmr[1] << 13) | (addr & 0x1fff)) |
+ (m_program.read_byte((m_mmr[1] << 13) | ((addr - 0xff) & 0x1fff)) << 8);
}
else
{
- return m_program->read_byte((m_mmr[1] << 13) | (addr & 0x1fff)) |
- (m_program->read_byte((m_mmr[1] << 13) | ((addr + 1) & 0x1fff)) << 8);
+ return m_program.read_byte((m_mmr[1] << 13) | (addr & 0x1fff)) |
+ (m_program.read_byte((m_mmr[1] << 13) | ((addr + 1) & 0x1fff)) << 8);
}
}
@@ -2388,7 +2388,7 @@ uint16_t h6280_device::program_read16z(offs_t addr)
***************************************************************/
void h6280_device::push(uint8_t value)
{
- m_program->write_byte((m_mmr[1] << 13) | m_sp.d, value);
+ m_program.write_byte((m_mmr[1] << 13) | m_sp.d, value);
S--;
}
@@ -2398,7 +2398,7 @@ void h6280_device::push(uint8_t value)
void h6280_device::pull(uint8_t &value)
{
S++;
- value = m_program->read_byte((m_mmr[1] << 13) | m_sp.d);
+ value = m_program.read_byte((m_mmr[1] << 13) | m_sp.d);
}
/***************************************************************
@@ -2406,7 +2406,7 @@ void h6280_device::pull(uint8_t &value)
***************************************************************/
uint8_t h6280_device::read_opcode()
{
- return m_cache->read_byte(translated(PCW));
+ return m_cache.read_byte(translated(PCW));
}
/***************************************************************
@@ -2414,7 +2414,7 @@ uint8_t h6280_device::read_opcode()
***************************************************************/
uint8_t h6280_device::read_opcode_arg()
{
- return m_cache->read_byte(translated(PCW));
+ return m_cache.read_byte(translated(PCW));
}
diff --git a/src/devices/cpu/h6280/h6280.h b/src/devices/cpu/h6280/h6280.h
index 923591eec93..22d3ac06ce6 100644
--- a/src/devices/cpu/h6280/h6280.h
+++ b/src/devices/cpu/h6280/h6280.h
@@ -380,9 +380,9 @@ protected:
uint8_t m_timer_scale;
// address spaces
- address_space *m_program;
- address_space *m_io;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<21, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<21, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access< 2, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
typedef void (h6280_device::*ophandler)();
diff --git a/src/devices/cpu/h8/h8.cpp b/src/devices/cpu/h8/h8.cpp
index eaca5b2a8ea..0b4d35ebbd5 100644
--- a/src/devices/cpu/h8/h8.cpp
+++ b/src/devices/cpu/h8/h8.cpp
@@ -19,7 +19,7 @@
h8_device::h8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor map_delegate) :
cpu_device(mconfig, type, tag, owner, clock),
program_config("program", ENDIANNESS_BIG, 16, 16, 0, map_delegate),
- io_config("io", ENDIANNESS_BIG, 16, 16, -1), program(nullptr), io(nullptr), cache(nullptr), PPC(0), NPC(0), PC(0), PIR(0), EXR(0), CCR(0), MAC(0), MACF(0),
+ io_config("io", ENDIANNESS_BIG, 16, 16, -1), PPC(0), NPC(0), PC(0), PIR(0), EXR(0), CCR(0), MAC(0), MACF(0),
TMP1(0), TMP2(0), TMPR(0), inst_state(0), inst_substate(0), icount(0), bcount(0), irq_vector(0), taken_irq_vector(0), irq_level(0), taken_irq_level(0), irq_required(false), irq_nmi(false)
{
supports_advanced = false;
@@ -38,9 +38,9 @@ void h8_device::device_config_complete()
void h8_device::device_start()
{
- program = &space(AS_PROGRAM);
- cache = program->cache<1, 0, ENDIANNESS_BIG>();
- io = &space(AS_IO);
+ space(AS_PROGRAM).cache(cache);
+ space(AS_PROGRAM).specific(program);
+ space(AS_IO).specific(io);
uint32_t pcmask = mode_advanced ? 0xffffff : 0xffff;
state_add<uint32_t>(H8_PC, "PC",
@@ -347,7 +347,7 @@ void h8_device::state_string_export(const device_state_entry &entry, std::string
uint16_t h8_device::read16i(uint32_t adr)
{
icount--;
- return cache->read_word(adr & ~1);
+ return cache.read_word(adr & ~1);
}
uint16_t h8_device::fetch()
@@ -360,25 +360,25 @@ uint16_t h8_device::fetch()
uint8_t h8_device::read8(uint32_t adr)
{
icount--;
- return program->read_byte(adr);
+ return program.read_byte(adr);
}
void h8_device::write8(uint32_t adr, uint8_t data)
{
icount--;
- program->write_byte(adr, data);
+ program.write_byte(adr, data);
}
uint16_t h8_device::read16(uint32_t adr)
{
icount--;
- return program->read_word(adr & ~1);
+ return program.read_word(adr & ~1);
}
void h8_device::write16(uint32_t adr, uint16_t data)
{
icount--;
- program->write_word(adr & ~1, data);
+ program.write_word(adr & ~1, data);
}
bool h8_device::exr_in_stack() const
diff --git a/src/devices/cpu/h8/h8.h b/src/devices/cpu/h8/h8.h
index e343be4fe90..e8e1647288e 100644
--- a/src/devices/cpu/h8/h8.h
+++ b/src/devices/cpu/h8/h8.h
@@ -113,8 +113,9 @@ protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
address_space_config program_config, io_config;
- address_space *program, *io;
- memory_access_cache<1, 0, ENDIANNESS_BIG> *cache;
+ memory_access<32, 1, 0, ENDIANNESS_BIG>::cache cache;
+ memory_access<32, 1, 0, ENDIANNESS_BIG>::specific program;
+ memory_access<16, 1, -1, ENDIANNESS_BIG>::specific io;
h8_dma_device *dma_device;
h8_dtc_device *dtc_device;
h8_dma_state *current_dma;
diff --git a/src/devices/cpu/h8500/h8500.cpp b/src/devices/cpu/h8500/h8500.cpp
index 9a0ebc225b0..c96fed16f7f 100644
--- a/src/devices/cpu/h8500/h8500.cpp
+++ b/src/devices/cpu/h8500/h8500.cpp
@@ -16,8 +16,6 @@ h8500_device::h8500_device(const machine_config &mconfig, device_type type, cons
: cpu_device(mconfig, type, tag, owner, clock)
, m_program_config("program", ENDIANNESS_BIG, buswidth, addrbits, 0, map)
, m_ram_config("internal RAM", ENDIANNESS_BIG, 16, ramsize, 0, address_map_constructor(FUNC(h8500_device::ram_map), this))
- , m_program(nullptr)
- , m_ram_cache(nullptr)
, m_pc(0)
, m_ppc(0)
, m_sr(0)
@@ -68,7 +66,7 @@ void h8500_device::device_start()
{
m_program = &space(AS_PROGRAM);
if (has_space(AS_DATA))
- m_ram_cache = space(AS_DATA).cache<1, 0, ENDIANNESS_BIG>();
+ space(AS_DATA).cache(m_ram_cache);
set_icountptr(m_icount);
diff --git a/src/devices/cpu/h8500/h8500.h b/src/devices/cpu/h8500/h8500.h
index e3cf3e2aeb1..ede393687a9 100644
--- a/src/devices/cpu/h8500/h8500.h
+++ b/src/devices/cpu/h8500/h8500.h
@@ -50,7 +50,7 @@ private:
address_space_config m_program_config;
address_space_config m_ram_config;
address_space *m_program;
- memory_access_cache<1, 0, ENDIANNESS_BIG> *m_ram_cache;
+ memory_access<11, 1, 0, ENDIANNESS_BIG>::cache m_ram_cache;
// internal registers
u16 m_pc;
diff --git a/src/devices/cpu/hphybrid/hphybrid.cpp b/src/devices/cpu/hphybrid/hphybrid.cpp
index 0c03210ea04..fae3b8474c7 100644
--- a/src/devices/cpu/hphybrid/hphybrid.cpp
+++ b/src/devices/cpu/hphybrid/hphybrid.cpp
@@ -219,9 +219,9 @@ void hp_hybrid_cpu_device::device_start()
state_add(HPHYBRID_I, "I", m_reg_I).noshow();
}
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_BIG>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_reg_A));
save_item(NAME(m_reg_B));
@@ -1029,7 +1029,7 @@ uint16_t hp_hybrid_cpu_device::RM(uint32_t addr)
m_stm_func(m_curr_cycle | CYCLE_RD_MASK);
m_curr_cycle = 0;
}
- return m_cache->read_word(addr);
+ return m_cache.read_word(addr);
}
}
@@ -1152,7 +1152,7 @@ void hp_hybrid_cpu_device::WM(uint32_t addr , uint16_t v)
m_stm_func(m_curr_cycle | CYCLE_WR_MASK);
m_curr_cycle = 0;
}
- m_program->write_word(addr , v);
+ m_program.write_word(addr , v);
}
}
@@ -1375,13 +1375,13 @@ void hp_hybrid_cpu_device::enter_isr()
uint16_t hp_hybrid_cpu_device::RIO(uint8_t pa , uint8_t ic)
{
m_icount -= IO_RW_CYCLES;
- return m_io->read_word(HP_MAKE_IOADDR(pa, ic));
+ return m_io.read_word(HP_MAKE_IOADDR(pa, ic));
}
void hp_hybrid_cpu_device::WIO(uint8_t pa , uint8_t ic , uint16_t v)
{
m_icount -= IO_RW_CYCLES;
- m_io->write_word(HP_MAKE_IOADDR(pa, ic) , v);
+ m_io.write_word(HP_MAKE_IOADDR(pa, ic) , v);
}
uint8_t hp_hybrid_cpu_device::do_dec_shift_r(uint8_t d1 , uint64_t& mantissa)
@@ -1625,7 +1625,7 @@ bool hp_5061_3011_cpu_device::execute_no_bpc(uint16_t opcode , uint16_t& next_pc
// Extend address, form byte address
uint16_t mask = BIT(tmp_addr , 0) ? 0x00ff : 0xff00;
tmp_addr = add_mae(AEC_CASE_C , tmp_addr >> 1);
- m_program->write_word(tmp_addr , tmp , mask);
+ m_program.write_word(tmp_addr , tmp , mask);
m_icount -= m_w_cycles;
}
} else {
@@ -1992,7 +1992,7 @@ bool hp_09825_67907_cpu_device::execute_no_bpc(uint16_t opcode , uint16_t& next_
m_curr_cycle = 0;
}
uint16_t mask = BIT(*ptr_reg , 15) ? 0xff00 : 0x00ff;
- m_program->write_word(tmp_addr , tmp , mask);
+ m_program.write_word(tmp_addr , tmp , mask);
m_icount -= m_w_cycles;
}
} else {
diff --git a/src/devices/cpu/hphybrid/hphybrid.h b/src/devices/cpu/hphybrid/hphybrid.h
index e9e4263da05..3d4a7cc7536 100644
--- a/src/devices/cpu/hphybrid/hphybrid.h
+++ b/src/devices/cpu/hphybrid/hphybrid.h
@@ -198,14 +198,14 @@ protected:
uint16_t m_reg_r26; // R26 register
uint16_t m_reg_r27; // R27 register
- address_space *m_program;
+ memory_access<22, 1, -1, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<22, 1, -1, ENDIANNESS_BIG>::specific m_program;
+ memory_access< 6, 1, -1, ENDIANNESS_BIG>::specific m_io;
private:
address_space_config m_program_config;
address_space_config m_io_config;
- memory_access_cache<1, -1, ENDIANNESS_BIG> *m_cache;
- address_space *m_io;
uint32_t get_ea(uint16_t opcode);
void do_add(uint16_t& addend1 , uint16_t addend2);
diff --git a/src/devices/cpu/i386/athlon.cpp b/src/devices/cpu/i386/athlon.cpp
index e47f99a2af6..7da09ef271b 100644
--- a/src/devices/cpu/i386/athlon.cpp
+++ b/src/devices/cpu/i386/athlon.cpp
@@ -28,10 +28,11 @@ void athlonxp_device::device_start()
{
i386_common_init();
register_state_i386_x87_xmm();
- m_data = &space(AS_DATA);
- m_opcodes = &space(AS_OPCODES);
- mmacache32 = m_data->cache<2, 0, ENDIANNESS_LITTLE>();
- m_opcodes->install_read_handler(0, 0xffffffff, read32_delegate(*this, FUNC(athlonxp_device::debug_read_memory)));
+ space(AS_DATA).specific(m_data);
+ space(AS_OPCODES).specific(m_opcodes);
+ space(AS_DATA).cache(mmacache32);
+
+ space(AS_OPCODES).install_read_handler(0, 0xffffffff, read32_delegate(*this, FUNC(athlonxp_device::debug_read_memory)));
build_x87_opcode_table();
build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_PPRO | OP_MMX | OP_SSE);
@@ -192,7 +193,6 @@ READ32_MEMBER(athlonxp_device::debug_read_memory)
offs_t address = offset << 2;
int mode = check_cacheable(address);
bool nocache = false;
- address_space *m = m_program;
u8 *data;
if ((mode & 7) == 0)
@@ -207,8 +207,8 @@ READ32_MEMBER(athlonxp_device::debug_read_memory)
return *(u32 *)(data + offset);
}
if (address_mode<1>(address))
- m = m_data;
- return m->read_dword(address);
+ return m_data.read_dword(address);
+ return m_program->read_dword(address);
}
template <class dt, offs_t xorle>
@@ -216,7 +216,6 @@ dt athlonxp_device::opcode_read_cache(offs_t address)
{
int mode = check_cacheable(address);
bool nocache = false;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m = macache32;
u8 *data;
if ((mode & 7) == 0)
@@ -238,28 +237,35 @@ dt athlonxp_device::opcode_read_cache(offs_t address)
offs_t old_address = cache.old();
for (int w = 0; w < 64; w += 4)
- m->write_dword(old_address + w, *(u32 *)(data + w));
+ macache32.write_dword(old_address + w, *(u32 *)(data + w));
}
for (int r = 0; r < 64; r += 4)
- *(u32 *)(data + r) = m->read_dword(address + r);
+ *(u32 *)(data + r) = macache32.read_dword(address + r);
return *(dt *)(data + offset);
}
}
if (address_mode<1>(address))
- m = mmacache32;
+ {
+ if (sizeof(dt) == 1)
+ return mmacache32.read_byte(address);
+ else if (sizeof(dt) == 2)
+ return mmacache32.read_word(address);
+ else
+ return mmacache32.read_dword(address);
+ }
if (sizeof(dt) == 1)
- return m->read_byte(address);
+ return macache32.read_byte(address);
else if (sizeof(dt) == 2)
- return m->read_word(address);
+ return macache32.read_word(address);
else
- return m->read_dword(address);
+ return macache32.read_dword(address);
+
}
uint32_t athlonxp_device::program_read_cache(offs_t address, uint32_t mask)
{
int mode = check_cacheable(address);
bool nocache = false;
- address_space *m = m_program;
u8 *data;
if ((mode & 7) == 0)
@@ -281,23 +287,22 @@ uint32_t athlonxp_device::program_read_cache(offs_t address, uint32_t mask)
offs_t old_address = cache.old();
for (int w = 0; w < 64; w += 4)
- m->write_dword(old_address + w, *(u32 *)(data + w));
+ m_program->write_dword(old_address + w, *(u32 *)(data + w));
}
for (int r = 0; r < 64; r += 4)
- *(u32 *)(data + r) = m->read_dword(address + r);
+ *(u32 *)(data + r) = m_program->read_dword(address + r);
return *(u32 *)(data + offset) & mask;
}
}
if (address_mode<1>(address))
- m = m_data;
- return m->read_dword(address, mask) & mask;
+ return m_data.read_dword(address, mask) & mask;
+ return m_program->read_dword(address, mask) & mask;
}
void athlonxp_device::program_write_cache(offs_t address, uint32_t data, uint32_t mask)
{
int mode = check_cacheable(address);
bool nocache = false;
- address_space *m = m_program;
u8 *dataw;
if ((mode & 7) == 0)
@@ -322,17 +327,18 @@ void athlonxp_device::program_write_cache(offs_t address, uint32_t data, uint32_
offs_t old_address = cache.old();
for (int w = 0; w < 64; w += 4)
- m->write_dword(old_address + w, *(u32 *)(dataw + w));
+ m_program->write_dword(old_address + w, *(u32 *)(dataw + w));
}
for (int r = 0; r < 64; r += 4)
- *(u32 *)(dataw + r) = m->read_dword(address + r);
+ *(u32 *)(dataw + r) = m_program->read_dword(address + r);
*(u32 *)(dataw + offset) = (*(u32 *)(dataw + offset) & ~mask) | (data & mask);
return;
}
}
if (address_mode<0>(address))
- m = m_data;
- m->write_dword(address, data, mask);
+ m_data.write_dword(address, data, mask);
+ else
+ m_program->write_dword(address, data, mask);
}
void athlonxp_device::cache_writeback()
diff --git a/src/devices/cpu/i386/athlon.h b/src/devices/cpu/i386/athlon.h
index a4559fcb682..f7ee68ce962 100644
--- a/src/devices/cpu/i386/athlon.h
+++ b/src/devices/cpu/i386/athlon.h
@@ -55,10 +55,10 @@ private:
DECLARE_READ32_MEMBER(debug_read_memory);
address_space_config m_data_config;
- address_space *m_data;
address_space_config m_opcodes_config;
- address_space *m_opcodes;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *mmacache32;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache mmacache32;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_opcodes;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_data;
uint8_t m_processor_name_string[48];
offs_t m_msr_top_mem;
uint64_t m_msr_sys_cfg;
diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp
index 0d42c78ac26..e8fdf6a12ea 100644
--- a/src/devices/cpu/i386/i386.cpp
+++ b/src/devices/cpu/i386/i386.cpp
@@ -1937,9 +1937,9 @@ void i386_device::i386_common_init()
m_program = &space(AS_PROGRAM);
if(m_program->data_width() == 16) {
// for the 386sx
- macache16 = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
+ m_program->cache(macache16);
} else {
- macache32 = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
+ m_program->cache(macache32);
}
m_io = &space(AS_IO);
diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h
index a251cab955f..64730816b66 100644
--- a/src/devices/cpu/i386/i386.h
+++ b/src/devices/cpu/i386/i386.h
@@ -89,9 +89,9 @@ protected:
virtual void cache_clean() {}
// routine to access memory
- virtual u8 mem_pr8(offs_t address) { return macache32->read_byte(address); }
- virtual u16 mem_pr16(offs_t address) { return macache32->read_word(address); }
- virtual u32 mem_pr32(offs_t address) { return macache32->read_dword(address); }
+ virtual u8 mem_pr8(offs_t address) { return macache32.read_byte(address); }
+ virtual u16 mem_pr16(offs_t address) { return macache32.read_word(address); }
+ virtual u32 mem_pr32(offs_t address) { return macache32.read_dword(address); }
address_space_config m_program_config;
address_space_config m_io_config;
@@ -307,8 +307,8 @@ protected:
address_space *m_program;
address_space *m_io;
uint32_t m_a20_mask;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *macache16;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *macache32;
+ memory_access<32, 1, 0, ENDIANNESS_LITTLE>::cache macache16;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache macache32;
int m_cpuid_max_input_value_eax; // Highest CPUID standard function available
uint32_t m_cpuid_id0, m_cpuid_id1, m_cpuid_id2;
@@ -1528,9 +1528,9 @@ public:
i386sx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
- virtual u8 mem_pr8(offs_t address) override { return macache16->read_byte(address); };
- virtual u16 mem_pr16(offs_t address) override { return macache16->read_word(address); };
- virtual u32 mem_pr32(offs_t address) override { return macache16->read_dword(address); };
+ virtual u8 mem_pr8(offs_t address) override { return macache16.read_byte(address); };
+ virtual u16 mem_pr16(offs_t address) override { return macache16.read_word(address); };
+ virtual u32 mem_pr32(offs_t address) override { return macache16.read_dword(address); };
virtual uint16_t READ16PL(uint32_t ea, uint8_t privilege) override;
virtual uint32_t READ32PL(uint32_t ea, uint8_t privilege) override;
diff --git a/src/devices/cpu/i8008/i8008.cpp b/src/devices/cpu/i8008/i8008.cpp
index ec404c8902d..0bd6ce04176 100644
--- a/src/devices/cpu/i8008/i8008.cpp
+++ b/src/devices/cpu/i8008/i8008.cpp
@@ -38,8 +38,6 @@ i8008_device::i8008_device(const machine_config &mconfig, const char *tag, devic
: cpu_device(mconfig, I8008, tag, owner, clock)
, m_program_config("program", ENDIANNESS_LITTLE, 8, 14)
, m_io_config("io", ENDIANNESS_LITTLE, 8, 5)
- , m_program(nullptr)
- , m_cache(nullptr)
{
// set our instruction counter
set_icountptr(m_icount);
@@ -52,9 +50,9 @@ i8008_device::i8008_device(const machine_config &mconfig, const char *tag, devic
void i8008_device::device_start()
{
// find address spaces
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
// save state
save_item(NAME(m_PC));
@@ -511,11 +509,11 @@ inline void i8008_device::execute_one(int opcode)
if (((opcode>>4)&3)==0) {
// INP
m_icount -= 8;
- m_A = m_io->read_byte((opcode >> 1) & 0x1f);
+ m_A = m_io.read_byte((opcode >> 1) & 0x1f);
} else {
// OUT
m_icount -= 6;
- m_io->write_byte((opcode >> 1) & 0x1f, m_A);
+ m_io.write_byte((opcode >> 1) & 0x1f, m_A);
}
break;
}
@@ -601,7 +599,7 @@ inline void i8008_device::pop_stack()
inline uint8_t i8008_device::rop()
{
- uint8_t retVal = m_cache->read_byte(GET_PC.w.l);
+ uint8_t retVal = m_cache.read_byte(GET_PC.w.l);
GET_PC.w.l = (GET_PC.w.l + 1) & 0x3fff;
m_PC = GET_PC;
return retVal;
@@ -618,7 +616,7 @@ inline uint8_t i8008_device::get_reg(uint8_t reg)
case 4 : retVal = m_E; break;
case 5 : retVal = m_H; break;
case 6 : retVal = m_L; break;
- default: retVal = m_program->read_byte((m_H << 8) + m_L); break;
+ default: retVal = m_program.read_byte((m_H << 8) + m_L); break;
}
return retVal;
}
@@ -633,13 +631,13 @@ inline void i8008_device::set_reg(uint8_t reg, uint8_t val)
case 4 : m_E = val; break;
case 5 : m_H = val; break;
case 6 : m_L = val; break;
- default: m_program->write_byte((m_H << 8) + m_L, val); break;
+ default: m_program.write_byte((m_H << 8) + m_L, val); break;
}
}
inline uint8_t i8008_device::arg()
{
- uint8_t retVal = m_cache->read_byte(GET_PC.w.l);
+ uint8_t retVal = m_cache.read_byte(GET_PC.w.l);
GET_PC.w.l = (GET_PC.w.l + 1) & 0x3fff;
m_PC = GET_PC;
return retVal;
diff --git a/src/devices/cpu/i8008/i8008.h b/src/devices/cpu/i8008/i8008.h
index c5b00a1033b..b3183a0640c 100644
--- a/src/devices/cpu/i8008/i8008.h
+++ b/src/devices/cpu/i8008/i8008.h
@@ -81,9 +81,9 @@ protected:
uint8_t m_PARITY[256];
- address_space *m_program;
- address_space *m_io;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<14, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<14, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access< 5, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
};
// device type definition
diff --git a/src/devices/cpu/i8085/i8085.cpp b/src/devices/cpu/i8085/i8085.cpp
index ab4c439871b..5460ab653ea 100644
--- a/src/devices/cpu/i8085/i8085.cpp
+++ b/src/devices/cpu/i8085/i8085.cpp
@@ -347,10 +347,10 @@ void i8085a_cpu_device::device_start()
}
}
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_opcode_cache = has_space(AS_OPCODES) ? space(AS_OPCODES).cache<0, 0, ENDIANNESS_LITTLE>() : m_cache;
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cprogram);
+ space(AS_PROGRAM).specific(m_program);
+ space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).cache(m_copcodes);
+ space(AS_IO).specific(m_io);
/* resolve callbacks */
m_in_inta_func.resolve();
@@ -670,7 +670,7 @@ u8 i8085a_cpu_device::read_arg()
if (m_in_acknowledge)
return read_inta();
else
- return m_cache->read_byte(m_PC.w.l++);
+ return m_cprogram.read_byte(m_PC.w.l++);
}
PAIR i8085a_cpu_device::read_arg16()
@@ -684,8 +684,8 @@ PAIR i8085a_cpu_device::read_arg16()
}
else
{
- p.b.l = m_cache->read_byte(m_PC.w.l++);
- p.b.h = m_cache->read_byte(m_PC.w.l++);
+ p.b.l = m_cprogram.read_byte(m_PC.w.l++);
+ p.b.h = m_cprogram.read_byte(m_PC.w.l++);
}
return p;
}
@@ -693,7 +693,7 @@ PAIR i8085a_cpu_device::read_arg16()
u8 i8085a_cpu_device::read_op()
{
set_status(0xa2); // instruction fetch
- return m_opcode_cache->read_byte(m_PC.w.l++);
+ return m_copcodes.read_byte(m_PC.w.l++);
}
u8 i8085a_cpu_device::read_inta()
@@ -707,28 +707,28 @@ u8 i8085a_cpu_device::read_inta()
u8 i8085a_cpu_device::read_mem(u32 a)
{
set_status(0x82); // memory read
- return m_program->read_byte(a);
+ return m_program.read_byte(a);
}
void i8085a_cpu_device::write_mem(u32 a, u8 v)
{
set_status(0x00); // memory write
- m_program->write_byte(a, v);
+ m_program.write_byte(a, v);
}
void i8085a_cpu_device::op_push(PAIR p)
{
set_status(0x04); // stack push
- m_program->write_byte(--m_SP.w.l, p.b.h);
- m_program->write_byte(--m_SP.w.l, p.b.l);
+ m_program.write_byte(--m_SP.w.l, p.b.h);
+ m_program.write_byte(--m_SP.w.l, p.b.l);
}
PAIR i8085a_cpu_device::op_pop()
{
PAIR p;
set_status(0x86); // stack pop
- p.b.l = m_program->read_byte(m_SP.w.l++);
- p.b.h = m_program->read_byte(m_SP.w.l++);
+ p.b.l = m_program.read_byte(m_SP.w.l++);
+ p.b.h = m_program.read_byte(m_SP.w.l++);
return p;
}
@@ -1469,7 +1469,7 @@ void i8085a_cpu_device::execute_one(int opcode)
case 0xd3: // OUT nn
set_status(0x10);
m_WZ.d = read_arg();
- m_io->write_byte(m_WZ.d, m_AF.b.h);
+ m_io.write_byte(m_WZ.d, m_AF.b.h);
break;
case 0xd4: // CNC nnnn
op_call(!(m_AF.b.l & CF));
@@ -1505,7 +1505,7 @@ void i8085a_cpu_device::execute_one(int opcode)
case 0xdb: // IN nn
set_status(0x42);
m_WZ.d = read_arg();
- m_AF.b.h = m_io->read_byte(m_WZ.d);
+ m_AF.b.h = m_io.read_byte(m_WZ.d);
break;
case 0xdc: // CC nnnn
op_call(m_AF.b.l & CF);
diff --git a/src/devices/cpu/i8085/i8085.h b/src/devices/cpu/i8085/i8085.h
index 0c67c3a3c56..5378a712e5e 100644
--- a/src/devices/cpu/i8085/i8085.h
+++ b/src/devices/cpu/i8085/i8085.h
@@ -129,10 +129,9 @@ private:
bool m_ietemp; /* import/export temp space */
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_opcode_cache;
- address_space *m_io;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_cprogram, m_copcodes;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access< 8, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
int m_icount;
/* cycles lookup */
diff --git a/src/devices/cpu/i86/i86.cpp b/src/devices/cpu/i86/i86.cpp
index 8f9697cb97d..50d2039569a 100644
--- a/src/devices/cpu/i86/i86.cpp
+++ b/src/devices/cpu/i86/i86.cpp
@@ -470,11 +470,11 @@ void i8086_common_cpu_device::device_start()
m_opcodes = has_space(AS_OPCODES) ? &space(AS_OPCODES) : m_program;
if(m_opcodes->data_width() == 8) {
- auto cache = m_opcodes->cache<0, 0, ENDIANNESS_LITTLE>();
- m_or8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
+ m_opcodes->cache(m_cache8);
+ m_or8 = [this](offs_t address) -> u8 { return m_cache8.read_byte(address); };
} else {
- auto cache = m_opcodes->cache<1, 0, ENDIANNESS_LITTLE>();
- m_or8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
+ m_opcodes->cache(m_cache16);
+ m_or8 = [this](offs_t address) -> u8 { return m_cache16.read_byte(address); };
}
m_io = &space(AS_IO);
diff --git a/src/devices/cpu/i86/i86.h b/src/devices/cpu/i86/i86.h
index 3ecf3050dda..f08a8e0c2ba 100644
--- a/src/devices/cpu/i86/i86.h
+++ b/src/devices/cpu/i86/i86.h
@@ -295,6 +295,9 @@ protected:
uint8_t m_test_state;
address_space *m_program, *m_opcodes;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_cache8;
+ memory_access<20, 1, 0, ENDIANNESS_LITTLE>::cache m_cache16;
+
std::function<u8 (offs_t)> m_or8;
address_space *m_io;
int m_icount;
diff --git a/src/devices/cpu/i960/i960.cpp b/src/devices/cpu/i960/i960.cpp
index abf2c089cb2..9db9d6ab095 100644
--- a/src/devices/cpu/i960/i960.cpp
+++ b/src/devices/cpu/i960/i960.cpp
@@ -19,7 +19,7 @@ i960_cpu_device::i960_cpu_device(const machine_config &mconfig, const char *tag,
: cpu_device(mconfig, I960, tag, owner, clock)
, m_stalled(false), m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0)
, m_rcache_pos(0), m_SAT(0), m_PRCB(0), m_PC(0), m_AC(0), m_IP(0), m_PIP(0), m_ICR(0), m_bursting(0), m_immediate_irq(0)
- , m_immediate_vector(0), m_immediate_pri(0), m_program(nullptr), m_cache(nullptr), m_icount(0)
+ , m_immediate_vector(0), m_immediate_pri(0), m_icount(0)
{
std::fill(std::begin(m_r), std::end(m_r), 0);
std::fill(std::begin(m_rcache_frame_addr), std::end(m_rcache_frame_addr), 0);
@@ -41,31 +41,31 @@ device_memory_interface::space_config_vector i960_cpu_device::memory_space_confi
uint32_t i960_cpu_device::i960_read_dword_unaligned(uint32_t address)
{
if (!DWORD_ALIGNED(address))
- return m_program->read_byte(address) | m_program->read_byte(address+1)<<8 | m_program->read_byte(address+2)<<16 | m_program->read_byte(address+3)<<24;
+ return m_program.read_byte(address) | m_program.read_byte(address+1)<<8 | m_program.read_byte(address+2)<<16 | m_program.read_byte(address+3)<<24;
else
- return m_program->read_dword(address);
+ return m_program.read_dword(address);
}
uint16_t i960_cpu_device::i960_read_word_unaligned(uint32_t address)
{
if (!WORD_ALIGNED(address))
- return m_program->read_byte(address) | m_program->read_byte(address+1)<<8;
+ return m_program.read_byte(address) | m_program.read_byte(address+1)<<8;
else
- return m_program->read_word(address);
+ return m_program.read_word(address);
}
void i960_cpu_device::i960_write_dword_unaligned(uint32_t address, uint32_t data)
{
if (!DWORD_ALIGNED(address))
{
- m_program->write_byte(address, data & 0xff);
- m_program->write_byte(address+1, (data>>8)&0xff);
- m_program->write_byte(address+2, (data>>16)&0xff);
- m_program->write_byte(address+3, (data>>24)&0xff);
+ m_program.write_byte(address, data & 0xff);
+ m_program.write_byte(address+1, (data>>8)&0xff);
+ m_program.write_byte(address+2, (data>>16)&0xff);
+ m_program.write_byte(address+3, (data>>24)&0xff);
}
else
{
- m_program->write_dword(address, data);
+ m_program.write_dword(address, data);
}
}
@@ -73,22 +73,22 @@ void i960_cpu_device::i960_write_word_unaligned(uint32_t address, uint16_t data)
{
if (!WORD_ALIGNED(address))
{
- m_program->write_byte(address, data & 0xff);
- m_program->write_byte(address+1, (data>>8)&0xff);
+ m_program.write_byte(address, data & 0xff);
+ m_program.write_byte(address+1, (data>>8)&0xff);
}
else
{
- m_program->write_word(address, data);
+ m_program.write_word(address, data);
}
}
void i960_cpu_device::send_iac(uint32_t adr)
{
uint32_t iac[4];
- iac[0] = m_program->read_dword(adr);
- iac[1] = m_program->read_dword(adr+4);
- iac[2] = m_program->read_dword(adr+8);
- iac[3] = m_program->read_dword(adr+12);
+ iac[0] = m_program.read_dword(adr);
+ iac[1] = m_program.read_dword(adr+4);
+ iac[2] = m_program.read_dword(adr+8);
+ iac[3] = m_program.read_dword(adr+12);
switch(iac[0]>>24) {
case 0x40: // generate irq
@@ -99,8 +99,8 @@ void i960_cpu_device::send_iac(uint32_t adr)
check_irqs();
break;
case 0x80: // store SAT & PRCB in memory
- m_program->write_dword(iac[1], m_SAT);
- m_program->write_dword(iac[1]+4, m_PRCB);
+ m_program.write_dword(iac[1], m_SAT);
+ m_program.write_dword(iac[1]+4, m_PRCB);
break;
case 0x89: // invalidate internal instruction cache
// we do not emulate the instruction cache, so this is safe to ignore
@@ -143,7 +143,7 @@ uint32_t i960_cpu_device::get_ea(uint32_t opcode)
case 0x5: // address of this instruction + the offset dword + 8
// which in reality is "address of next instruction + the offset dword"
- ret = m_cache->read_dword(m_IP);
+ ret = m_cache.read_dword(m_IP);
m_IP += 4;
ret += m_IP;
return ret;
@@ -152,22 +152,22 @@ uint32_t i960_cpu_device::get_ea(uint32_t opcode)
return m_r[abase] + (m_r[index] << scale);
case 0xc:
- ret = m_cache->read_dword(m_IP);
+ ret = m_cache.read_dword(m_IP);
m_IP += 4;
return ret;
case 0xd:
- ret = m_cache->read_dword(m_IP) + m_r[abase];
+ ret = m_cache.read_dword(m_IP) + m_r[abase];
m_IP += 4;
return ret;
case 0xe:
- ret = m_cache->read_dword(m_IP) + (m_r[index] << scale);
+ ret = m_cache.read_dword(m_IP) + (m_r[index] << scale);
m_IP += 4;
return ret;
case 0xf:
- ret = m_cache->read_dword(m_IP) + m_r[abase] + (m_r[index] << scale);
+ ret = m_cache.read_dword(m_IP) + m_r[abase] + (m_r[index] << scale);
m_IP += 4;
return ret;
@@ -430,12 +430,12 @@ void i960_cpu_device::test(uint32_t opcode, int mask)
// interrupt dispatch
void i960_cpu_device::take_interrupt(int vector, int lvl)
{
- int int_tab = m_program->read_dword(m_PRCB+20); // interrupt table
- int int_SP = m_program->read_dword(m_PRCB+24); // interrupt stack
+ int int_tab = m_program.read_dword(m_PRCB+20); // interrupt table
+ int int_SP = m_program.read_dword(m_PRCB+24); // interrupt stack
int SP;
uint32_t IRQV;
- IRQV = m_program->read_dword(int_tab + 36 + (vector-8)*4);
+ IRQV = m_program.read_dword(int_tab + 36 + (vector-8)*4);
// start the process
if(!(m_PC & 0x2000)) // if this is a nested interrupt, don't re-get int_SP
@@ -453,10 +453,10 @@ void i960_cpu_device::take_interrupt(int vector, int lvl)
do_call(IRQV, 7, SP);
// save the processor state
- m_program->write_dword(m_r[I960_FP]-16, m_PC);
- m_program->write_dword(m_r[I960_FP]-12, m_AC);
+ m_program.write_dword(m_r[I960_FP]-16, m_PC);
+ m_program.write_dword(m_r[I960_FP]-12, m_AC);
// store the vector
- m_program->write_dword(m_r[I960_FP]-8, vector-8);
+ m_program.write_dword(m_r[I960_FP]-8, vector-8);
m_PC &= ~0x1f00; // clear priority, state, trace-fault pending, and trace enable
m_PC |= (lvl<<16); // set CPU level to current IRQ level
@@ -465,14 +465,14 @@ void i960_cpu_device::take_interrupt(int vector, int lvl)
void i960_cpu_device::check_irqs()
{
- int int_tab = m_program->read_dword(m_PRCB+20); // interrupt table
+ int int_tab = m_program.read_dword(m_PRCB+20); // interrupt table
int cpu_pri = (m_PC>>16)&0x1f;
int pending_pri;
int lvl, irq, take = -1;
int vword;
static const uint32_t lvlmask[4] = { 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 };
- pending_pri = m_program->read_dword(int_tab); // read pending priorities
+ pending_pri = m_program.read_dword(int_tab); // read pending priorities
if ((m_immediate_irq) && ((cpu_pri < m_immediate_pri) || (m_immediate_pri == 31)))
{
@@ -490,14 +490,14 @@ void i960_cpu_device::check_irqs()
wordl = (lvl % 4) * 8;
wordh = (wordl + 8) - 1;
- vword = m_program->read_dword(int_tab + word);
+ vword = m_program.read_dword(int_tab + word);
// take the first vector we find for this level
for (irq = wordh; irq >= wordl; irq--) {
if(vword & (1 << irq)) {
// clear pending bit
vword &= ~(1 << irq);
- m_program->write_dword(int_tab + word, vword);
+ m_program.write_dword(int_tab + word, vword);
take = irq;
break;
}
@@ -509,14 +509,14 @@ void i960_cpu_device::check_irqs()
// try to recover...
pending_pri &= ~(1 << lvl);
- m_program->write_dword(int_tab, pending_pri);
+ m_program.write_dword(int_tab, pending_pri);
return;
}
// if no vectors are waiting for this level, clear the level bit
if(!(vword & lvlmask[lvl % 4])) {
pending_pri &= ~(1 << lvl);
- m_program->write_dword(int_tab, pending_pri);
+ m_program.write_dword(int_tab, pending_pri);
}
take += ((lvl/4) * 32);
@@ -545,7 +545,7 @@ void i960_cpu_device::do_call(uint32_t adr, int type, uint32_t stack)
// flush the current register set to the current frame
FP = m_r[I960_FP] & ~0x3f;
for (i = 0; i < 16; i++) {
- m_program->write_dword(FP + (i*4), m_r[i]);
+ m_program.write_dword(FP + (i*4), m_r[i]);
}
}
else // a cache entry is available, use it
@@ -584,7 +584,7 @@ void i960_cpu_device::do_ret_0()
{
int i;
for(i=0; i<0x10; i++)
- m_r[i] = m_program->read_dword(m_r[I960_FP]+4*i);
+ m_r[i] = m_program.read_dword(m_r[I960_FP]+4*i);
if (m_rcache_pos < 0)
{
@@ -610,8 +610,8 @@ void i960_cpu_device::do_ret()
break;
case 7:
- x = m_program->read_dword(m_r[I960_FP]-16);
- y = m_program->read_dword(m_r[I960_FP]-12);
+ x = m_program.read_dword(m_r[I960_FP]-16);
+ y = m_program.read_dword(m_r[I960_FP]-12);
do_ret_0();
m_AC = y;
// #### test supervisor
@@ -1349,9 +1349,9 @@ void i960_cpu_device::execute_op(uint32_t opcode)
t2 = get_2_ri(opcode);
// interrupt control register
if(t1 == 0xff000004)
- m_ICR = m_program->read_dword(t2);
+ m_ICR = m_program.read_dword(t2);
else
- m_program->write_dword(t1, m_program->read_dword(t2));
+ m_program.write_dword(t1, m_program.read_dword(t2));
m_AC = (m_AC & ~7) | 2;
break;
@@ -1362,10 +1362,10 @@ void i960_cpu_device::execute_op(uint32_t opcode)
if(t1 == 0xff000010)
send_iac(t2);
else {
- m_program->write_dword(t1, m_program->read_dword(t2));
- m_program->write_dword(t1+4, m_program->read_dword(t2+4));
- m_program->write_dword(t1+8, m_program->read_dword(t2+8));
- m_program->write_dword(t1+12, m_program->read_dword(t2+12));
+ m_program.write_dword(t1, m_program.read_dword(t2));
+ m_program.write_dword(t1+4, m_program.read_dword(t2+4));
+ m_program.write_dword(t1+8, m_program.read_dword(t2+8));
+ m_program.write_dword(t1+12, m_program.read_dword(t2+12));
}
m_AC = (m_AC & ~7) | 2;
break;
@@ -1457,8 +1457,8 @@ void i960_cpu_device::execute_op(uint32_t opcode)
switch((opcode >> 7) & 0xf) {
case 0x0: // calls
t1 = get_1_ri(opcode);
- t2 = m_program->read_dword(m_SAT + 152); // get pointer to system procedure table
- t2 = m_program->read_dword(t2 + 48 + (t1 * 4));
+ t2 = m_program.read_dword(m_SAT + 152); // get pointer to system procedure table
+ t2 = m_program.read_dword(t2 + 48 + (t1 * 4));
if ((t2 & 3) != 0)
{
fatalerror("I960: system calls that jump into supervisor mode aren't yet supported\n");
@@ -1477,7 +1477,7 @@ void i960_cpu_device::execute_op(uint32_t opcode)
for (i = 0; i < 0x10; i++)
{
- m_program->write_dword(m_rcache_frame_addr[t1] + (i * sizeof(uint32_t)), m_rcache[t1][i]);
+ m_program.write_dword(m_rcache_frame_addr[t1] + (i * sizeof(uint32_t)), m_rcache[t1][i]);
}
}
m_rcache_pos = 0;
@@ -1935,7 +1935,7 @@ void i960_cpu_device::execute_op(uint32_t opcode)
case 0x80: { // ldob
m_icount -= 4;
- u8 v = m_program->read_byte(get_ea(opcode));
+ u8 v = m_program.read_byte(get_ea(opcode));
if(!m_stalled)
m_r[(opcode>>19)&0x1f] = v;
break;
@@ -1943,7 +1943,7 @@ void i960_cpu_device::execute_op(uint32_t opcode)
case 0x82: // stob
m_icount -= 2;
- m_program->write_byte(get_ea(opcode), m_r[(opcode>>19)&0x1f]);
+ m_program.write_byte(get_ea(opcode), m_r[(opcode>>19)&0x1f]);
break;
case 0x84: // bx
@@ -2113,7 +2113,7 @@ void i960_cpu_device::execute_op(uint32_t opcode)
case 0xc0: { // ldib
m_icount -= 4;
- s8 v = m_program->read_byte(get_ea(opcode));
+ s8 v = m_program.read_byte(get_ea(opcode));
if(!m_stalled)
m_r[(opcode>>19)&0x1f] = v;
break;
@@ -2121,7 +2121,7 @@ void i960_cpu_device::execute_op(uint32_t opcode)
case 0xc2: // stib
m_icount -= 2;
- m_program->write_byte(get_ea(opcode), m_r[(opcode>>19)&0x1f]);
+ m_program.write_byte(get_ea(opcode), m_r[(opcode>>19)&0x1f]);
break;
case 0xc8: { // ldis
@@ -2157,7 +2157,7 @@ void i960_cpu_device::execute_run()
m_bursting = 0;
- opcode = m_cache->read_dword(m_IP);
+ opcode = m_cache.read_dword(m_IP);
m_IP += 4;
m_stalled = false;
@@ -2171,7 +2171,7 @@ void i960_cpu_device::execute_run()
void i960_cpu_device::execute_set_input(int irqline, int state)
{
- int int_tab = m_program->read_dword(m_PRCB+20); // interrupt table
+ int int_tab = m_program.read_dword(m_PRCB+20); // interrupt table
int cpu_pri = (m_PC>>16)&0x1f;
int vector =0;
int priority;
@@ -2220,16 +2220,16 @@ void i960_cpu_device::execute_set_input(int irqline, int state)
else
{
// store the interrupt in the "pending" table
- pend = m_program->read_dword(int_tab);
+ pend = m_program.read_dword(int_tab);
pend |= (1 << priority);
- m_program->write_dword(int_tab, pend);
+ m_program.write_dword(int_tab, pend);
// now bitfield-ize the vector
word = ((vector / 32) * 4) + 4;
wordofs = vector % 32;
- pend = m_program->read_dword(int_tab + word);
+ pend = m_program.read_dword(int_tab + word);
pend |= (1 << wordofs);
- m_program->write_dword(int_tab + word, pend);
+ m_program.write_dword(int_tab + word, pend);
}
// and ack it to the core now that it's queued
@@ -2240,8 +2240,8 @@ void i960_cpu_device::execute_set_input(int irqline, int state)
void i960_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
save_item(NAME(m_IP));
save_item(NAME(m_PIP));
@@ -2336,9 +2336,9 @@ void i960_cpu_device::state_string_export(const device_state_entry &entry, std::
void i960_cpu_device::device_reset()
{
- m_SAT = m_program->read_dword(0);
- m_PRCB = m_program->read_dword(4);
- m_IP = m_program->read_dword(12);
+ m_SAT = m_program.read_dword(0);
+ m_PRCB = m_program.read_dword(4);
+ m_IP = m_program.read_dword(12);
m_PC = 0x001f2002;
m_AC = 0;
m_ICR = 0xff000000;
@@ -2348,7 +2348,7 @@ void i960_cpu_device::device_reset()
memset(m_r, 0, sizeof(m_r));
memset(m_rcache, 0, sizeof(m_rcache));
- m_r[I960_FP] = m_program->read_dword(m_PRCB+24);
+ m_r[I960_FP] = m_program.read_dword(m_PRCB+24);
m_r[I960_SP] = m_r[I960_FP] + 64;
m_rcache_pos = 0;
}
diff --git a/src/devices/cpu/i960/i960.h b/src/devices/cpu/i960/i960.h
index 3cc34b73f1f..8ebe214044c 100644
--- a/src/devices/cpu/i960/i960.h
+++ b/src/devices/cpu/i960/i960.h
@@ -137,8 +137,8 @@ private:
int m_immediate_vector;
int m_immediate_pri;
- address_space *m_program;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_program;
int m_icount;
diff --git a/src/devices/cpu/ie15/ie15.cpp b/src/devices/cpu/ie15/ie15.cpp
index 7d4b8499245..828143e1715 100644
--- a/src/devices/cpu/ie15/ie15.cpp
+++ b/src/devices/cpu/ie15/ie15.cpp
@@ -35,7 +35,6 @@ ie15_cpu_device::ie15_cpu_device(const machine_config &mconfig, const char *tag,
: cpu_device(mconfig, IE15_CPU, tag, owner, clock)
, m_program_config("program", ENDIANNESS_LITTLE, 8, 14)
, m_io_config("io", ENDIANNESS_LITTLE, 8, 8), m_A(0), m_CF(0), m_ZF(0), m_RF(0), m_flags(0)
- , m_program(nullptr), m_io(nullptr), m_cache(nullptr)
{
// set our instruction counter
set_icountptr(m_icount);
@@ -48,9 +47,9 @@ ie15_cpu_device::ie15_cpu_device(const machine_config &mconfig, const char *tag,
void ie15_cpu_device::device_start()
{
// find address spaces
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
// save state
save_item(NAME(m_PC));
@@ -322,7 +321,7 @@ inline void ie15_cpu_device::execute_one(int opcode)
if (opcode == 0x67)
m_A = 255;
else
- m_A = m_io->read_byte(opcode & 15);
+ m_A = m_io.read_byte(opcode & 15);
update_flags(m_A);
break;
case 0xf0: // ota
@@ -332,7 +331,7 @@ inline void ie15_cpu_device::execute_one(int opcode)
else if (opcode == 0xff)
m_RF = 0;
else
- m_io->write_byte(opcode & 15, m_A);
+ m_io.write_byte(opcode & 15, m_A);
// m_CF = 0;
break;
case 0xc0: // cfl, sfl
@@ -344,7 +343,7 @@ inline void ie15_cpu_device::execute_one(int opcode)
m_CF = 0;
break;
default:
- m_io->write_byte(020 | (opcode & 7), BIT(opcode, 3));
+ m_io.write_byte(020 | (opcode & 7), BIT(opcode, 3));
break;
}
break;
@@ -362,7 +361,7 @@ inline void ie15_cpu_device::execute_one(int opcode)
tmp = 0;
break;
default:
- tmp = m_io->read_byte(020 | tmp);
+ tmp = m_io.read_byte(020 | tmp);
break;
}
@@ -406,14 +405,14 @@ inline void ie15_cpu_device::execute_one(int opcode)
inline uint8_t ie15_cpu_device::rop()
{
- uint8_t retVal = m_cache->read_byte(m_PC.w.l);
+ uint8_t retVal = m_cache.read_byte(m_PC.w.l);
m_PC.w.l = (m_PC.w.l + 1) & 0x0fff;
return retVal;
}
inline uint8_t ie15_cpu_device::arg()
{
- uint8_t retVal = m_cache->read_byte(m_PC.w.l);
+ uint8_t retVal = m_cache.read_byte(m_PC.w.l);
return retVal;
}
diff --git a/src/devices/cpu/ie15/ie15.h b/src/devices/cpu/ie15/ie15.h
index 14f4d82357c..a0885ce55f1 100644
--- a/src/devices/cpu/ie15/ie15.h
+++ b/src/devices/cpu/ie15/ie15.h
@@ -72,9 +72,9 @@ protected:
uint8_t m_RF; // Current register page
uint8_t m_flags; // temporary I/O only
- address_space *m_program;
- address_space *m_io;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<14, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<14, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access< 8, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
};
// device type definition
diff --git a/src/devices/cpu/jaguar/jaguar.cpp b/src/devices/cpu/jaguar/jaguar.cpp
index 875efb90b45..7aeddda468a 100644
--- a/src/devices/cpu/jaguar/jaguar.cpp
+++ b/src/devices/cpu/jaguar/jaguar.cpp
@@ -76,13 +76,13 @@ inline u8 jaguar_cpu_device::CONDITION(u8 x)
return condition_table[x + ((m_flags & 7) << 5)];
}
-inline u8 jaguar_cpu_device::READBYTE(offs_t a) { return m_program->read_byte(a); }
-inline u16 jaguar_cpu_device::READWORD(offs_t a) { return m_program->read_word(a); }
-inline u32 jaguar_cpu_device::READLONG(offs_t a) { return m_program->read_dword(a); }
+inline u8 jaguar_cpu_device::READBYTE(offs_t a) { return m_program.read_byte(a); }
+inline u16 jaguar_cpu_device::READWORD(offs_t a) { return m_program.read_word(a); }
+inline u32 jaguar_cpu_device::READLONG(offs_t a) { return m_program.read_dword(a); }
-inline void jaguar_cpu_device::WRITEBYTE(offs_t a, u8 v) { m_program->write_byte(a, v); }
-inline void jaguar_cpu_device::WRITEWORD(offs_t a, u16 v) { m_program->write_word(a, v); }
-inline void jaguar_cpu_device::WRITELONG(offs_t a, u32 v) { m_program->write_dword(a, v); }
+inline void jaguar_cpu_device::WRITEBYTE(offs_t a, u8 v) { m_program.write_byte(a, v); }
+inline void jaguar_cpu_device::WRITEWORD(offs_t a, u16 v) { m_program.write_word(a, v); }
+inline void jaguar_cpu_device::WRITELONG(offs_t a, u32 v) { m_program.write_dword(a, v); }
/***************************************************************************
@@ -142,7 +142,7 @@ const jaguar_cpu_device::op_func jaguar_cpu_device::dsp_op_table[64] =
MEMORY ACCESSORS
***************************************************************************/
-inline u16 jaguar_cpu_device::ROPCODE(offs_t pc) { return m_cache->read_word(pc); }
+inline u16 jaguar_cpu_device::ROPCODE(offs_t pc) { return m_cache.read_word(pc); }
// SC414200AT
DEFINE_DEVICE_TYPE(JAGUARGPU, jaguargpu_cpu_device, "jaguargpu", "Motorola Atari Jaguar GPU \"Tom\"")
@@ -355,9 +355,9 @@ void jaguar_cpu_device::device_start()
{
init_tables();
- m_program = &space(AS_PROGRAM);
- m_io = &space(AS_IO);
- m_cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
m_cpu_interrupt.resolve_safe();
save_item(NAME(m_r));
@@ -1481,12 +1481,12 @@ READ32_MEMBER(jaguardsp_cpu_device::high_accum_r)
u32 jaguar_cpu_device::iobus_r(offs_t offset, u32 mem_mask)
{
- return m_io->read_dword(offset*4, mem_mask);
+ return m_io.read_dword(offset*4, mem_mask);
}
void jaguar_cpu_device::iobus_w(offs_t offset, u32 data, u32 mem_mask)
{
- m_io->write_dword(offset*4, data, mem_mask);
+ m_io.write_dword(offset*4, data, mem_mask);
}
/***************************************************************************
diff --git a/src/devices/cpu/jaguar/jaguar.h b/src/devices/cpu/jaguar/jaguar.h
index 499a3233f7e..f9e8189b739 100644
--- a/src/devices/cpu/jaguar/jaguar.h
+++ b/src/devices/cpu/jaguar/jaguar.h
@@ -138,9 +138,9 @@ protected:
int m_icount;
int m_bankswitch_icount;
devcb_write_line m_cpu_interrupt;
- address_space *m_program;
- address_space *m_io;
- memory_access_cache<2, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access<24, 2, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<24, 2, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access< 8, 2, 0, ENDIANNESS_BIG>::specific m_io;
u32 m_internal_ram_start;
u32 m_internal_ram_end;
diff --git a/src/devices/cpu/ks0164/ks0164.cpp b/src/devices/cpu/ks0164/ks0164.cpp
index d7601831a0d..8bb447993a4 100644
--- a/src/devices/cpu/ks0164/ks0164.cpp
+++ b/src/devices/cpu/ks0164/ks0164.cpp
@@ -23,8 +23,8 @@ ks0164_cpu_device::ks0164_cpu_device(const machine_config &mconfig, const char *
void ks0164_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_program_cache = m_program->cache<1, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_program_cache);
+ space(AS_PROGRAM).specific(m_program);
state_add(STATE_GENPC, "GENPC", m_r[R_PC]).callexport().noshow();
state_add(STATE_GENPCBASE, "CURPC", m_r[R_PC]).callexport().noshow();
@@ -115,15 +115,15 @@ void ks0164_cpu_device::handle_irq()
// Normal irq (not reset), save pc and psw
if(m_r[R_PSW] & F_I)
return;
- m_program->write_word(m_r[R_SP] - 2, m_r[R_PC]);
- m_program->write_word(m_r[R_SP] - 4, m_r[R_PSW]);
+ m_program.write_word(m_r[R_SP] - 2, m_r[R_PC]);
+ m_program.write_word(m_r[R_SP] - 4, m_r[R_PSW]);
m_r[R_SP] -= 4;
m_icount -= 2;
} else
m_irq &= 0xfffe;
m_r[R_PSW] = (m_r[R_PSW] & 0xfff0) | (index ? index - 1 : 0);
- m_r[R_PC] = m_program_cache->read_word(index*2);
+ m_r[R_PC] = m_program_cache.read_word(index*2);
m_icount --;
if(index)
standard_irq_callback(0);
@@ -238,7 +238,7 @@ void ks0164_cpu_device::execute_run()
if(m_irq)
handle_irq();
debugger_instruction_hook(m_r[R_PC]);
- u16 opcode = m_program_cache->read_word(m_r[R_PC]);
+ u16 opcode = m_program_cache.read_word(m_r[R_PC]);
m_r[R_PC] += 2;
// First switch level on bits 15-14 and 2-0
@@ -296,7 +296,7 @@ void ks0164_cpu_device::execute_run()
case 0x15: {
// ALU functions with immediate
// 10ff frrr S... w101
- u16 rv = m_program_cache->read_word(m_r[R_PC]);
+ u16 rv = m_program_cache.read_word(m_r[R_PC]);
m_r[R_PC] += 2;
u16 v = opcode & 0x0008 ? rv : opcode & 0x0080 ? s8(rv) : u8(rv);
@@ -308,7 +308,7 @@ void ks0164_cpu_device::execute_run()
// ALU functions from memory indexed
// 10ff frrr Ssss w110
u16 a = m_r[(opcode >> 4) & 7];
- u16 v = opcode & 0x0008 ? m_program->read_word(a) : opcode & 0x0080 ? s8(m_program->read_byte(a)) : u8(m_program->read_byte(a));
+ u16 v = opcode & 0x0008 ? m_program.read_word(a) : opcode & 0x0080 ? s8(m_program.read_byte(a)) : u8(m_program.read_byte(a));
m_icount -= 2;
do_alu(opcode, v);
@@ -318,9 +318,9 @@ void ks0164_cpu_device::execute_run()
case 0x17: {
// ALU functions from memory indexed and offset
// 10ff frrr Ssss w111
- u16 a = m_r[(opcode >> 4) & 7] + m_program_cache->read_word(m_r[R_PC]);
+ u16 a = m_r[(opcode >> 4) & 7] + m_program_cache.read_word(m_r[R_PC]);
m_r[R_PC] += 2;
- u16 v = opcode & 0x0008 ? m_program->read_word(a) : opcode & 0x0080 ? s8(m_program->read_byte(a)) : u8(m_program->read_byte(a));
+ u16 v = opcode & 0x0008 ? m_program.read_word(a) : opcode & 0x0080 ? s8(m_program.read_byte(a)) : u8(m_program.read_byte(a));
m_icount -= 2;
do_alu(opcode, v);
@@ -336,8 +336,8 @@ void ks0164_cpu_device::execute_run()
int r1 = (opcode >> 8) & 7;
int r2 = (opcode >> 4) & 7;
switch(bitswap<3>(opcode, 11, 7, 3)) {
- case 1: m_program->write_word(m_r[r1], m_r[r2]); m_r[r1] += 2; break;
- case 4: m_r[r1] -= 2; m_program->write_word(m_r[r1], m_r[r2]); break;
+ case 1: m_program.write_word(m_r[r1], m_r[r2]); m_r[r1] += 2; break;
+ case 4: m_r[r1] -= 2; m_program.write_word(m_r[r1], m_r[r2]); break;
default: unk(opcode); break;
}
m_icount --;
@@ -348,7 +348,7 @@ void ks0164_cpu_device::execute_run()
// Min/max with immediate
// 1101 Mrrr Ssss 1000
u16 v1 = m_r[(opcode >> 4) & 7];
- u16 v2 = m_program_cache->read_word(m_r[R_PC]);
+ u16 v2 = m_program_cache.read_word(m_r[R_PC]);
m_r[R_PC] += 2;
u16 res;
switch(bitswap<2>(opcode, 11, 7)) {
@@ -385,10 +385,10 @@ void ks0164_cpu_device::execute_run()
// Push all registers
// 1100 .... .... .001
- m_program->write_word(m_r[R_SP] - 2, m_r[0]);
- m_program->write_word(m_r[R_SP] - 4, m_r[1]);
- m_program->write_word(m_r[R_SP] - 6, m_r[2]);
- m_program->write_word(m_r[R_SP] - 8, m_r[3]);
+ m_program.write_word(m_r[R_SP] - 2, m_r[0]);
+ m_program.write_word(m_r[R_SP] - 4, m_r[1]);
+ m_program.write_word(m_r[R_SP] - 6, m_r[2]);
+ m_program.write_word(m_r[R_SP] - 8, m_r[3]);
m_r[R_SP] -= 8;
break;
}
@@ -396,7 +396,7 @@ void ks0164_cpu_device::execute_run()
case 1: {
// Absolute jump
// 1101 .... .... .001
- m_r[R_PC] = m_program->read_word(m_r[R_PC]);
+ m_r[R_PC] = m_program.read_word(m_r[R_PC]);
break;
}
@@ -429,7 +429,7 @@ void ks0164_cpu_device::execute_run()
int r1 = (opcode >> 8) & 7;
int r2 = (opcode >> 4) & 7;
switch(bitswap<3>(opcode, 11, 7, 3)) {
- case 1: m_r[r1] = m_program->read_word(m_r[r2]); m_r[r2] += 2; break;
+ case 1: m_r[r1] = m_program.read_word(m_r[r2]); m_r[r2] += 2; break;
default: unk(opcode); break;
}
m_icount --;
@@ -440,8 +440,8 @@ void ks0164_cpu_device::execute_run()
// Absolute subroutine call
// 1101 .... .... .010
- u16 a = m_program->read_word(m_r[R_PC]);
- m_program->write_word(m_r[R_SP] - 2, m_r[R_PC] + 2);
+ u16 a = m_program.read_word(m_r[R_PC]);
+ m_program.write_word(m_r[R_SP] - 2, m_r[R_PC] + 2);
m_r[R_SP] -= 2;
m_r[R_PC] = a;
m_icount -= 2;
@@ -453,7 +453,7 @@ void ks0164_cpu_device::execute_run()
// 1110 .rrr bbbb w010
u16 a = m_r[(opcode >> 8) & 7];
- u16 v = opcode & 0x0008 ? m_program->read_word(a) : m_program->read_byte(a);
+ u16 v = opcode & 0x0008 ? m_program.read_word(a) : m_program.read_byte(a);
if(v & (1 << ((opcode >> 4) & 0xf)))
m_r[R_PSW] &= ~F_Z;
else
@@ -476,10 +476,10 @@ void ks0164_cpu_device::execute_run()
// Push all registers
// 1100 .... .... .011
- m_r[0] = m_program->read_word(m_r[R_SP] + 6);
- m_r[1] = m_program->read_word(m_r[R_SP] + 4);
- m_r[2] = m_program->read_word(m_r[R_SP] + 2);
- m_r[3] = m_program->read_word(m_r[R_SP] + 0);
+ m_r[0] = m_program.read_word(m_r[R_SP] + 6);
+ m_r[1] = m_program.read_word(m_r[R_SP] + 4);
+ m_r[2] = m_program.read_word(m_r[R_SP] + 2);
+ m_r[3] = m_program.read_word(m_r[R_SP] + 0);
m_r[R_SP] += 8;
break;
}
@@ -488,7 +488,7 @@ void ks0164_cpu_device::execute_run()
// Return from subroutine
// 1101 .... .... .011
- m_r[R_PC] = m_program->read_word(m_r[R_SP]);
+ m_r[R_PC] = m_program.read_word(m_r[R_SP]);
m_r[R_SP] += 2;
m_icount --;
break;
@@ -498,9 +498,9 @@ void ks0164_cpu_device::execute_run()
// Bit test from memory indexed and offset
// 1110 .rrr bbbb w011
- u16 a = m_r[(opcode >> 8) & 7] + m_program_cache->read_word(m_r[R_PC]);
+ u16 a = m_r[(opcode >> 8) & 7] + m_program_cache.read_word(m_r[R_PC]);
m_r[R_PC] += 2;
- u16 v = opcode & 0x0008 ? m_program->read_word(a) : m_program->read_byte(a);
+ u16 v = opcode & 0x0008 ? m_program.read_word(a) : m_program.read_byte(a);
if(v & (1 << ((opcode >> 4) & 0xf)))
m_r[R_PSW] &= ~F_Z;
else
@@ -552,8 +552,8 @@ void ks0164_cpu_device::execute_run()
// Return from interrupt
// 1101 .... .... .100
- m_r[R_PSW] = m_program->read_word(m_r[R_SP] + 0);
- m_r[R_PC] = m_program->read_word(m_r[R_SP] + 2);
+ m_r[R_PSW] = m_program.read_word(m_r[R_SP] + 0);
+ m_r[R_PC] = m_program.read_word(m_r[R_SP] + 2);
m_r[R_SP] += 4;
m_icount -= 2;
break;
@@ -573,7 +573,7 @@ void ks0164_cpu_device::execute_run()
case 3: {
// Decrement and branch
int r = (opcode >> 8) & 7;
- u16 a = m_program_cache->read_word(m_r[R_PC]);
+ u16 a = m_program_cache.read_word(m_r[R_PC]);
m_r[R_PC] += 2;
m_r[r] --;
@@ -638,8 +638,8 @@ void ks0164_cpu_device::execute_run()
// Compare with immediate and branch if equal
// 1111 .rrr .... .101
- u16 v = m_program_cache->read_word(m_r[R_PC]);
- u16 a = m_program_cache->read_word(m_r[R_PC] + 2);
+ u16 v = m_program_cache.read_word(m_r[R_PC]);
+ u16 a = m_program_cache.read_word(m_r[R_PC] + 2);
m_r[R_PC] += 4;
do_alu((opcode & 0x07ff) | 0x1000, v);
@@ -668,9 +668,9 @@ void ks0164_cpu_device::execute_run()
// 1110 .rrr .sss w110
u16 a = m_r[(opcode >> 8) & 7];
if(opcode & 0x0008)
- m_program->write_word(a, m_r[(opcode >> 4) & 7]);
+ m_program.write_word(a, m_r[(opcode >> 4) & 7]);
else
- m_program->write_byte(a, m_r[(opcode >> 4) & 7]);
+ m_program.write_byte(a, m_r[(opcode >> 4) & 7]);
break;
}
@@ -721,12 +721,12 @@ void ks0164_cpu_device::execute_run()
case 2: {
// Write memory indexed and offset
// 1110 .rrr .sss w111
- u16 a = m_r[(opcode >> 8) & 7] + m_program_cache->read_word(m_r[R_PC]);
+ u16 a = m_r[(opcode >> 8) & 7] + m_program_cache.read_word(m_r[R_PC]);
m_r[R_PC] += 2;
if(opcode & 0x0008)
- m_program->write_word(a, m_r[(opcode >> 4) & 7]);
+ m_program.write_word(a, m_r[(opcode >> 4) & 7]);
else
- m_program->write_byte(a, m_r[(opcode >> 4) & 7]);
+ m_program.write_byte(a, m_r[(opcode >> 4) & 7]);
break;
}
diff --git a/src/devices/cpu/ks0164/ks0164.h b/src/devices/cpu/ks0164/ks0164.h
index cdad1b693d9..1df7e6f5e4b 100644
--- a/src/devices/cpu/ks0164/ks0164.h
+++ b/src/devices/cpu/ks0164/ks0164.h
@@ -50,8 +50,8 @@ protected:
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
const address_space_config m_program_config;
- address_space *m_program;
- memory_access_cache<1, 0, ENDIANNESS_BIG> *m_program_cache;
+ memory_access<16, 1, 0, ENDIANNESS_BIG>::cache m_program_cache;
+ memory_access<16, 1, 0, ENDIANNESS_BIG>::specific m_program;
void handle_irq();
u16 snz(u16 r);
diff --git a/src/devices/cpu/lc8670/lc8670.cpp b/src/devices/cpu/lc8670/lc8670.cpp
index 728e823beb5..4d03d6c5c0e 100644
--- a/src/devices/cpu/lc8670/lc8670.cpp
+++ b/src/devices/cpu/lc8670/lc8670.cpp
@@ -194,10 +194,10 @@ lc8670_cpu_device::lc8670_cpu_device(const machine_config &mconfig, const char *
void lc8670_cpu_device::device_start()
{
// find address spaces
- m_program = &space(AS_PROGRAM);
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
// set our instruction counter
set_icountptr(m_icount);
@@ -973,11 +973,11 @@ uint8_t lc8670_cpu_device::regs_r(offs_t offset)
case 0x1d:
return m_timer1[1];
case 0x44:
- return (REG_P1 & REG_P1DDR) | (m_io->read_byte(LC8670_PORT1) & (REG_P1DDR ^ 0xff));
+ return (REG_P1 & REG_P1DDR) | (m_io.read_byte(LC8670_PORT1) & (REG_P1DDR ^ 0xff));
case 0x4c:
- return (REG_P3 & REG_P3DDR) | (m_io->read_byte(LC8670_PORT3) & (REG_P3DDR ^ 0xff));
+ return (REG_P3 & REG_P3DDR) | (m_io.read_byte(LC8670_PORT3) & (REG_P3DDR ^ 0xff));
case 0x5c:
- return m_io->read_byte(LC8670_PORT7) | 0xf0; // 4-bit read-only port
+ return m_io.read_byte(LC8670_PORT7) | 0xf0; // 4-bit read-only port
case 0x66:
{
uint8_t data = m_vtrbf[((REG_VRMAD2<<8) | REG_VRMAD1) & 0x1ff];
@@ -1041,10 +1041,10 @@ void lc8670_cpu_device::regs_w(offs_t offset, uint8_t data)
m_clock_changed = true;
break;
case 0x44:
- m_io->write_byte(LC8670_PORT1, ((data | (m_p1_data & REG_P1FCR)) & REG_P1DDR) | (m_io->read_byte(LC8670_PORT1) & (REG_P1DDR ^ 0xff)));
+ m_io.write_byte(LC8670_PORT1, ((data | (m_p1_data & REG_P1FCR)) & REG_P1DDR) | (m_io.read_byte(LC8670_PORT1) & (REG_P1DDR ^ 0xff)));
break;
case 0x4c:
- m_io->write_byte(LC8670_PORT3, (data & REG_P3DDR) | (m_io->read_byte(LC8670_PORT3) & (REG_P3DDR ^ 0xff)));
+ m_io.write_byte(LC8670_PORT3, (data & REG_P3DDR) | (m_io.read_byte(LC8670_PORT3) & (REG_P3DDR ^ 0xff)));
break;
case 0x66:
m_vtrbf[((REG_VRMAD2<<8) | REG_VRMAD1) & 0x1ff] = data;
@@ -1076,7 +1076,7 @@ void lc8670_cpu_device::regs_w(offs_t offset, uint8_t data)
inline uint8_t lc8670_cpu_device::fetch()
{
- uint8_t data = m_cache->read_byte(m_pc);
+ uint8_t data = m_cache.read_byte(m_pc);
set_pc(m_pc + 1);
@@ -1085,12 +1085,12 @@ inline uint8_t lc8670_cpu_device::fetch()
inline uint8_t lc8670_cpu_device::read_data(uint16_t offset)
{
- return m_data->read_byte(offset);
+ return m_data.read_byte(offset);
}
inline void lc8670_cpu_device::write_data(uint16_t offset, uint8_t data)
{
- m_data->write_byte(offset, data);
+ m_data.write_byte(offset, data);
}
inline uint8_t lc8670_cpu_device::read_data_latch(uint16_t offset)
@@ -1116,7 +1116,7 @@ inline void lc8670_cpu_device::write_data_latch(uint16_t offset, uint8_t data)
inline void lc8670_cpu_device::update_port1(uint8_t data)
{
m_p1_data = data;
- m_io->write_byte(LC8670_PORT1, ((REG_P1 | (m_p1_data & REG_P1FCR)) & REG_P1DDR) | (m_io->read_byte(LC8670_PORT1) & (REG_P1DDR ^ 0xff)));
+ m_io.write_byte(LC8670_PORT1, ((REG_P1 | (m_p1_data & REG_P1FCR)) & REG_P1DDR) | (m_io.read_byte(LC8670_PORT1) & (REG_P1DDR ^ 0xff)));
}
inline void lc8670_cpu_device::set_pc(uint16_t new_pc)
@@ -1205,7 +1205,7 @@ inline void lc8670_cpu_device::check_p3int()
{
if (REG_P3INT & 0x04)
{
- if ((m_io->read_byte(LC8670_PORT3) ^ 0xff) & (REG_P3DDR ^ 0xff) & REG_P3)
+ if ((m_io.read_byte(LC8670_PORT3) ^ 0xff) & (REG_P3DDR ^ 0xff) & REG_P3)
{
REG_P3INT |= 0x02;
if (REG_P3INT & 0x01)
@@ -1450,7 +1450,7 @@ int lc8670_cpu_device::op_ldf()
uint16_t addr = REG_TRL | (REG_TRH<<8);
m_bankswitch_func(REG_FPR & 0x01 ? 2 : 1);
- REG_A = m_program->read_byte(addr);
+ REG_A = m_program.read_byte(addr);
CHECK_P();
m_bankswitch_func(((REG_EXT & 0x01) ? 1 : (REG_EXT & 0x08) ? 0 : 2));
@@ -1462,7 +1462,7 @@ int lc8670_cpu_device::op_stf()
uint16_t addr = REG_TRL | (REG_TRH<<8);
m_bankswitch_func(REG_FPR & 0x01 ? 2 : 1);
- m_program->write_byte(addr, REG_A);
+ m_program.write_byte(addr, REG_A);
m_bankswitch_func(((REG_EXT & 0x01) ? 1 : (REG_EXT & 0x08) ? 0 : 2));
return 2;
@@ -1687,7 +1687,7 @@ int lc8670_cpu_device::op_ror()
int lc8670_cpu_device::op_ldc()
{
- REG_A = m_program->read_byte(((REG_TRH<<8) | REG_TRL) + REG_A);
+ REG_A = m_program.read_byte(((REG_TRH<<8) | REG_TRL) + REG_A);
CHECK_P();
return 2;
diff --git a/src/devices/cpu/lc8670/lc8670.h b/src/devices/cpu/lc8670/lc8670.h
index 8293ed66f26..890472d689f 100644
--- a/src/devices/cpu/lc8670/lc8670.h
+++ b/src/devices/cpu/lc8670/lc8670.h
@@ -189,10 +189,10 @@ private:
address_space_config m_data_config;
address_space_config m_io_config;
- address_space * m_program; // program space (ROM or flash)
- address_space * m_data; // internal RAM/register
- address_space * m_io; // I/O ports
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_program; // program space (ROM or flash)
+ memory_access< 9, 0, 0, ENDIANNESS_BIG>::specific m_data; // internal RAM/register
+ memory_access< 8, 0, 0, ENDIANNESS_BIG>::specific m_io; // I/O ports
// timers
static const device_timer_id BASE_TIMER = 1;
diff --git a/src/devices/cpu/lh5801/5801tbl.hxx b/src/devices/cpu/lh5801/5801tbl.hxx
index fef1ca8b23a..a15389681ea 100644
--- a/src/devices/cpu/lh5801/5801tbl.hxx
+++ b/src/devices/cpu/lh5801/5801tbl.hxx
@@ -23,8 +23,8 @@ uint8_t lh5801_cpu_device::lh5801_add_generic(int left, int right, int carry)
uint16_t lh5801_cpu_device::lh5801_readop_word()
{
- uint16_t r = m_cache->read_byte(P++) << 8;
- r |= m_cache->read_byte(P++);
+ uint16_t r = m_cache.read_byte(P++) << 8;
+ r |= m_cache.read_byte(P++);
return r;
}
@@ -162,7 +162,7 @@ void lh5801_cpu_device::lh5801_lda(uint8_t data)
void lh5801_cpu_device::lh5801_lde(PAIR *reg)
{
// or z flag depends on reg
- m_a = m_program->read_byte(reg->w.l--);
+ m_a = m_program.read_byte(reg->w.l--);
m_t &= ~Z;
if (!m_a)
{
@@ -172,13 +172,13 @@ void lh5801_cpu_device::lh5801_lde(PAIR *reg)
void lh5801_cpu_device::lh5801_sde(PAIR *reg)
{
- m_program->write_byte(reg->w.l--, m_a);
+ m_program.write_byte(reg->w.l--, m_a);
}
void lh5801_cpu_device::lh5801_lin(PAIR *reg)
{
// or z flag depends on reg
- m_a = m_program->read_byte(reg->w.l++);
+ m_a = m_program.read_byte(reg->w.l++);
m_t &= ~Z;
if (!m_a)
{
@@ -188,7 +188,7 @@ void lh5801_cpu_device::lh5801_lin(PAIR *reg)
void lh5801_cpu_device::lh5801_sin(PAIR *reg)
{
- m_program->write_byte(reg->w.l++, m_a);
+ m_program.write_byte(reg->w.l++, m_a);
}
void lh5801_cpu_device::lh5801_dec(uint8_t *adr)
@@ -204,7 +204,7 @@ void lh5801_cpu_device::lh5801_inc(uint8_t *adr)
void lh5801_cpu_device::lh5801_pop()
{
S++;
- m_a = m_program->read_byte(S);
+ m_a = m_program.read_byte(S);
m_t &= ~Z;
if (!m_a)
{
@@ -214,33 +214,33 @@ void lh5801_cpu_device::lh5801_pop()
void lh5801_cpu_device::lh5801_pop_word(PAIR *reg)
{
- reg->w.l = (m_program->read_byte(S + 1) << 8) | m_program->read_byte(S + 2);
+ reg->w.l = (m_program.read_byte(S + 1) << 8) | m_program.read_byte(S + 2);
S += 2;
// z flag?
}
void lh5801_cpu_device::lh5801_rtn()
{
- P = (m_program->read_byte(S + 1) << 8) | m_program->read_byte(S + 2);
+ P = (m_program.read_byte(S + 1) << 8) | m_program.read_byte(S + 2);
S += 2;
}
void lh5801_cpu_device::lh5801_rti()
{
- P = (m_program->read_byte(S + 1) << 8) | m_program->read_byte(S + 2);
- m_t = m_program->read_byte(S + 3);
+ P = (m_program.read_byte(S + 1) << 8) | m_program.read_byte(S + 2);
+ m_t = m_program.read_byte(S + 3);
S += 3;
}
void lh5801_cpu_device::lh5801_push(uint8_t data)
{
- m_program->write_byte(S--, data);
+ m_program.write_byte(S--, data);
}
void lh5801_cpu_device::lh5801_push_word(uint16_t data)
{
- m_program->write_byte(S--, data & 0xff);
- m_program->write_byte(S--, data >> 8);
+ m_program.write_byte(S--, data & 0xff);
+ m_program.write_byte(S--, data >> 8);
}
void lh5801_cpu_device::lh5801_jmp(uint16_t adr)
@@ -250,7 +250,7 @@ void lh5801_cpu_device::lh5801_jmp(uint16_t adr)
void lh5801_cpu_device::lh5801_branch_plus(int taken)
{
- uint8_t t = m_cache->read_byte(P++);
+ uint8_t t = m_cache.read_byte(P++);
if (taken)
{
m_icount -= 3;
@@ -260,7 +260,7 @@ void lh5801_cpu_device::lh5801_branch_plus(int taken)
void lh5801_cpu_device::lh5801_branch_minus(int taken)
{
- uint8_t t = m_cache->read_byte(P++);
+ uint8_t t = m_cache.read_byte(P++);
if (taken)
{
m_icount -= 3;
@@ -270,7 +270,7 @@ void lh5801_cpu_device::lh5801_branch_minus(int taken)
void lh5801_cpu_device::lh5801_lop()
{
- uint8_t t = m_cache->read_byte(P++);
+ uint8_t t = m_cache.read_byte(P++);
m_icount -= 8;
if (UL--)
{
@@ -291,8 +291,8 @@ void lh5801_cpu_device::lh5801_vector(int taken, int nr)
if (taken)
{
lh5801_push_word(P);
- P = m_program->read_byte(0xff00 + nr) << 8;
- P |= m_program->read_byte(0xff00 + nr + 1);
+ P = m_program.read_byte(0xff00 + nr) << 8;
+ P |= m_program.read_byte(0xff00 + nr + 1);
m_icount -= 13;
}
m_t &= ~Z; // after the jump?
@@ -397,23 +397,23 @@ void lh5801_cpu_device::lh5801_instruction_fd()
{
int adr;
- int oper = m_cache->read_byte(P++);
+ int oper = m_cache.read_byte(P++);
switch (oper)
{
case 0x01:
- lh5801_sbc(m_io->read_byte(X));
+ lh5801_sbc(m_io.read_byte(X));
m_icount -= 11;
break;
case 0x03:
- lh5801_adc(m_io->read_byte(X));
+ lh5801_adc(m_io.read_byte(X));
m_icount -= 11;
break;
case 0x05:
- lh5801_lda(m_io->read_byte(X));
+ lh5801_lda(m_io.read_byte(X));
m_icount -= 10;
break;
case 0x07:
- lh5801_cpa(m_a, m_io->read_byte(X));
+ lh5801_cpa(m_a, m_io.read_byte(X));
m_icount -= 11;
break;
case 0x08: // TODO: What does this opcode actually do?
@@ -421,7 +421,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x09:
- lh5801_and(m_io->read_byte(X));
+ lh5801_and(m_io.read_byte(X));
m_icount -= 11;
break;
case 0x0a:
@@ -429,39 +429,39 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 15;
break;
case 0x0b:
- lh5801_ora(m_io->read_byte(X));
+ lh5801_ora(m_io.read_byte(X));
m_icount -= 11;
break;
case 0x0c:
- lh5801_dcs(m_io->read_byte(X));
+ lh5801_dcs(m_io.read_byte(X));
m_icount -= 17;
break;
case 0x0d:
- lh5801_eor(m_io->read_byte(X));
+ lh5801_eor(m_io.read_byte(X));
m_icount -= 11;
break;
case 0x0e:
- m_io->write_byte(X, m_a);
+ m_io.write_byte(X, m_a);
m_icount -= 10;
break;
case 0x0f:
- lh5801_bit(m_io->read_byte(X), m_a);
+ lh5801_bit(m_io.read_byte(X), m_a);
m_icount -= 11;
break;
case 0x11:
- lh5801_sbc(m_io->read_byte(Y));
+ lh5801_sbc(m_io.read_byte(Y));
m_icount -= 11;
break;
case 0x13:
- lh5801_adc(m_io->read_byte(Y));
+ lh5801_adc(m_io.read_byte(Y));
m_icount -= 11;
break;
case 0x15:
- lh5801_lda(m_io->read_byte(Y));
+ lh5801_lda(m_io.read_byte(Y));
m_icount -= 10;
break;
case 0x17:
- lh5801_cpa(m_a, m_io->read_byte(Y));
+ lh5801_cpa(m_a, m_io.read_byte(Y));
m_icount -= 11;
break;
case 0x18:
@@ -469,7 +469,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x19:
- lh5801_and(m_io->read_byte(Y));
+ lh5801_and(m_io.read_byte(Y));
m_icount -= 11;
break;
case 0x1a:
@@ -477,38 +477,38 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 15;
break;
case 0x1b:
- lh5801_ora(m_io->read_byte(Y));
+ lh5801_ora(m_io.read_byte(Y));
m_icount -= 11;
break;
case 0x1c:
- lh5801_dcs(m_io->read_byte(Y));
+ lh5801_dcs(m_io.read_byte(Y));
m_icount -= 17;
break;
case 0x1d:
- lh5801_eor(m_io->read_byte(Y));
+ lh5801_eor(m_io.read_byte(Y));
m_icount -= 11;
break;
- case 0x1e: m_io->write_byte(Y,m_a);
+ case 0x1e: m_io.write_byte(Y,m_a);
m_icount -= 10;
break;
case 0x1f:
- lh5801_bit(m_io->read_byte(Y),m_a);
+ lh5801_bit(m_io.read_byte(Y),m_a);
m_icount -= 11;
break;
case 0x21:
- lh5801_sbc(m_io->read_byte(U));
+ lh5801_sbc(m_io.read_byte(U));
m_icount -= 11;
break;
case 0x23:
- lh5801_adc(m_io->read_byte(U));
+ lh5801_adc(m_io.read_byte(U));
m_icount -= 11;
break;
case 0x25:
- lh5801_lda(m_io->read_byte(U));
+ lh5801_lda(m_io.read_byte(U));
m_icount -= 10;
break;
case 0x27:
- lh5801_cpa(m_a, m_io->read_byte(U));
+ lh5801_cpa(m_a, m_io.read_byte(U));
m_icount -= 11;
break;
case 0x28:
@@ -516,7 +516,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x29:
- lh5801_and(m_io->read_byte(U));
+ lh5801_and(m_io.read_byte(U));
m_icount -= 11;
break;
case 0x2a:
@@ -524,22 +524,22 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 15;
break;
case 0x2b:
- lh5801_ora(m_io->read_byte(U));
+ lh5801_ora(m_io.read_byte(U));
m_icount -= 11;
break;
case 0x2c:
- lh5801_dcs(m_io->read_byte(U));
+ lh5801_dcs(m_io.read_byte(U));
m_icount -= 17;
break;
case 0x2d:
- lh5801_eor(m_io->read_byte(U));
+ lh5801_eor(m_io.read_byte(U));
m_icount -= 11;
break;
- case 0x2e: m_io->write_byte(U,m_a);
+ case 0x2e: m_io.write_byte(U,m_a);
m_icount -= 10;
break;
case 0x2f:
- lh5801_bit(m_io->read_byte(U),m_a);
+ lh5801_bit(m_io.read_byte(U),m_a);
m_icount -= 11;
break;
case 0x40:
@@ -555,7 +555,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x49:
- lh5801_and_mem(*m_io, X, m_cache->read_byte(P++));
+ lh5801_and_mem(m_io.space(), X, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x4a: // What does this opcode actually do?
@@ -563,7 +563,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x4b:
- lh5801_ora_mem(*m_io, X, m_cache->read_byte(P++));
+ lh5801_ora_mem(m_io.space(), X, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x4c: /*off*/
@@ -571,7 +571,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 8;
break;
case 0x4d:
- lh5801_bit(m_io->read_byte(X), m_cache->read_byte(P++));
+ lh5801_bit(m_io.read_byte(X), m_cache.read_byte(P++));
m_icount -= 14;
break;
case 0x4e:
@@ -579,7 +579,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x4f:
- lh5801_add_mem(*m_io, X, m_cache->read_byte(P++));
+ lh5801_add_mem(m_io.space(), X, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x50:
@@ -595,7 +595,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x59:
- lh5801_and_mem(*m_io, Y, m_cache->read_byte(P++));
+ lh5801_and_mem(m_io.space(), Y, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x5a:
@@ -603,11 +603,11 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x5b:
- lh5801_ora_mem(*m_io, Y, m_cache->read_byte(P++));
+ lh5801_ora_mem(m_io.space(), Y, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x5d:
- lh5801_bit(m_io->read_byte(Y), m_cache->read_byte(P++));
+ lh5801_bit(m_io.read_byte(Y), m_cache.read_byte(P++));
m_icount -= 14;
break;
case 0x5e:
@@ -615,7 +615,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break; // P=X
case 0x5f:
- lh5801_add_mem(*m_io, Y, m_cache->read_byte(P++));
+ lh5801_add_mem(m_io.space(), Y, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x60:
@@ -627,7 +627,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 9;
break;
case 0x69:
- lh5801_and_mem(*m_io, U, m_cache->read_byte(P++));
+ lh5801_and_mem(m_io.space(), U, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x6a:
@@ -635,15 +635,15 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 11;
break;
case 0x6b:
- lh5801_ora_mem(*m_io, U, m_cache->read_byte(P++));
+ lh5801_ora_mem(m_io.space(), U, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x6d:
- lh5801_bit(m_io->read_byte(X), m_cache->read_byte(P++));
+ lh5801_bit(m_io.read_byte(X), m_cache.read_byte(P++));
m_icount -= 14;
break;
case 0x6f:
- lh5801_add_mem(*m_io, U, m_cache->read_byte(P++));
+ lh5801_add_mem(m_io.space(), U, m_cache.read_byte(P++));
m_icount -= 17;
break;
case 0x81: /*sie*/
@@ -659,7 +659,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 12;
break;
case 0x8c:
- lh5801_dca(m_io->read_byte(X));
+ lh5801_dca(m_io.read_byte(X));
m_icount -= 19;
break;
case 0x8e:
@@ -671,23 +671,23 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 14;
break;
case 0x9c:
- lh5801_dca(m_io->read_byte(Y));
+ lh5801_dca(m_io.read_byte(Y));
m_icount -= 19;
break;
case 0xa1:
- lh5801_sbc(m_io->read_byte(lh5801_readop_word()));
+ lh5801_sbc(m_io.read_byte(lh5801_readop_word()));
m_icount -= 17;
break;
case 0xa3:
- lh5801_adc(m_io->read_byte(lh5801_readop_word()));
+ lh5801_adc(m_io.read_byte(lh5801_readop_word()));
m_icount -= 17;
break;
case 0xa5:
- lh5801_lda(m_io->read_byte(lh5801_readop_word()));
+ lh5801_lda(m_io.read_byte(lh5801_readop_word()));
m_icount -= 16;
break;
case 0xa7:
- lh5801_cpa(m_a, m_io->read_byte(lh5801_readop_word()));
+ lh5801_cpa(m_a, m_io.read_byte(lh5801_readop_word()));
m_icount -= 17;
break;
case 0xa8:
@@ -695,7 +695,7 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 14;
break;
case 0xa9:
- lh5801_and(m_io->read_byte(lh5801_readop_word()));
+ lh5801_and(m_io.read_byte(lh5801_readop_word()));
m_icount -= 17;
break;
case 0xaa:
@@ -703,23 +703,23 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 9;
break;
case 0xab:
- lh5801_ora(m_io->read_byte(lh5801_readop_word()));
+ lh5801_ora(m_io.read_byte(lh5801_readop_word()));
m_icount -= 17;
break;
case 0xac:
- lh5801_dca(m_io->read_byte(U));
+ lh5801_dca(m_io.read_byte(U));
m_icount -= 19;
break;
case 0xad:
- lh5801_eor(m_io->read_byte(lh5801_readop_word()));
+ lh5801_eor(m_io.read_byte(lh5801_readop_word()));
m_icount -= 17;
break;
case 0xae:
- m_io->write_byte(lh5801_readop_word(), m_a);
+ m_io.write_byte(lh5801_readop_word(), m_a);
m_icount -= 16;
break;
case 0xaf:
- lh5801_bit(m_io->read_byte(lh5801_readop_word()), m_a);
+ lh5801_bit(m_io.read_byte(lh5801_readop_word()), m_a);
m_icount -= 17;
break;
case 0xb1: /*hlt*/
@@ -758,11 +758,11 @@ void lh5801_cpu_device::lh5801_instruction_fd()
m_icount -= 9;
break;
case 0xd3:
- lh5801_drr(*m_io, X);
+ lh5801_drr(m_io.space(), X);
m_icount -= 16;
break;
case 0xd7:
- lh5801_drl(*m_io, X);
+ lh5801_drl(m_io.space(), X);
m_icount -= 16;
break;
case 0xda:
@@ -779,12 +779,12 @@ void lh5801_cpu_device::lh5801_instruction_fd()
break;
case 0xe9:
adr = lh5801_readop_word();
- lh5801_and_mem(*m_io, adr, m_cache->read_byte(P++));
+ lh5801_and_mem(m_io.space(), adr, m_cache.read_byte(P++));
m_icount -= 23;
break;
case 0xeb:
adr = lh5801_readop_word();
- lh5801_ora_mem(*m_io, adr, m_cache->read_byte(P++));
+ lh5801_ora_mem(m_io.space(), adr, m_cache.read_byte(P++));
m_icount -= 23;
break;
case 0xec:
@@ -793,12 +793,12 @@ void lh5801_cpu_device::lh5801_instruction_fd()
break;
case 0xed:
adr = lh5801_readop_word();
- lh5801_bit(m_io->read_byte(adr), m_cache->read_byte(P++));
+ lh5801_bit(m_io.read_byte(adr), m_cache.read_byte(P++));
m_icount -= 20;
break;
case 0xef:
adr = lh5801_readop_word();
- lh5801_add_mem(*m_io, adr, m_cache->read_byte(P++));
+ lh5801_add_mem(m_io.space(), adr, m_cache.read_byte(P++));
m_icount -= 23;
break;
@@ -811,14 +811,14 @@ void lh5801_cpu_device::lh5801_instruction()
{
int adr;
- int oper = m_cache->read_byte(P++);
+ int oper = m_cache.read_byte(P++);
switch (oper) {
case 0x00:
lh5801_sbc(XL);
m_icount -= 6;
break;
case 0x01:
- lh5801_sbc(m_program->read_byte(X));
+ lh5801_sbc(m_program.read_byte(X));
m_icount -= 7;
break;
case 0x02:
@@ -826,7 +826,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0x03:
- lh5801_adc(m_program->read_byte(X));
+ lh5801_adc(m_program.read_byte(X));
m_icount -= 7;
break;
case 0x04:
@@ -834,7 +834,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x05:
- lh5801_lda(m_program->read_byte(X));
+ lh5801_lda(m_program.read_byte(X));
m_icount -= 6;
break;
case 0x06:
@@ -842,7 +842,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0x07:
- lh5801_cpa(m_a, m_program->read_byte(X));
+ lh5801_cpa(m_a, m_program.read_byte(X));
m_icount -= 7;
break;
case 0x08:
@@ -850,7 +850,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x09:
- lh5801_and(m_program->read_byte(X));
+ lh5801_and(m_program.read_byte(X));
m_icount -= 7;
break;
case 0x0a:
@@ -858,23 +858,23 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x0b:
- lh5801_ora(m_program->read_byte(X));
+ lh5801_ora(m_program.read_byte(X));
m_icount -= 7;
break;
case 0x0c:
- lh5801_dcs(m_program->read_byte(X));
+ lh5801_dcs(m_program.read_byte(X));
m_icount -= 13;
break;
case 0x0d:
- lh5801_eor(m_program->read_byte(X));
+ lh5801_eor(m_program.read_byte(X));
m_icount -= 7;
break;
case 0x0e:
- m_program->write_byte(X,m_a);
+ m_program.write_byte(X,m_a);
m_icount -= 6;
break;
case 0x0f:
- lh5801_bit(m_program->read_byte(X),m_a);
+ lh5801_bit(m_program.read_byte(X),m_a);
m_icount -= 7;
break;
case 0x10:
@@ -882,7 +882,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0x11:
- lh5801_sbc(m_program->read_byte(Y));
+ lh5801_sbc(m_program.read_byte(Y));
m_icount -= 7;
break;
case 0x12:
@@ -890,7 +890,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0x13:
- lh5801_adc(m_program->read_byte(Y));
+ lh5801_adc(m_program.read_byte(Y));
m_icount -= 7;
break;
case 0x14:
@@ -898,7 +898,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x15:
- lh5801_lda(m_program->read_byte(Y));
+ lh5801_lda(m_program.read_byte(Y));
m_icount -= 6;
break;
case 0x16:
@@ -906,7 +906,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0x17:
- lh5801_cpa(m_a, m_program->read_byte(Y));
+ lh5801_cpa(m_a, m_program.read_byte(Y));
m_icount -= 7;
break;
case 0x18:
@@ -914,7 +914,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x19:
- lh5801_and(m_program->read_byte(Y));
+ lh5801_and(m_program.read_byte(Y));
m_icount -= 7;
break;
case 0x1a:
@@ -922,22 +922,22 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x1b:
- lh5801_ora(m_program->read_byte(Y));
+ lh5801_ora(m_program.read_byte(Y));
m_icount -= 7;
break;
case 0x1c:
- lh5801_dcs(m_program->read_byte(Y));
+ lh5801_dcs(m_program.read_byte(Y));
m_icount -= 13;
break;
case 0x1d:
- lh5801_eor(m_program->read_byte(Y));
+ lh5801_eor(m_program.read_byte(Y));
m_icount -= 7;
break;
- case 0x1e: m_program->write_byte(Y,m_a);
+ case 0x1e: m_program.write_byte(Y,m_a);
m_icount -= 6;
break;
case 0x1f:
- lh5801_bit(m_program->read_byte(Y),m_a);
+ lh5801_bit(m_program.read_byte(Y),m_a);
m_icount -= 7;
break;
case 0x20:
@@ -945,7 +945,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0x21:
- lh5801_sbc(m_program->read_byte(U));
+ lh5801_sbc(m_program.read_byte(U));
m_icount -= 7;
break;
case 0x22:
@@ -953,7 +953,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0x23:
- lh5801_adc(m_program->read_byte(U));
+ lh5801_adc(m_program.read_byte(U));
m_icount -= 7;
break;
case 0x24:
@@ -961,7 +961,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x25:
- lh5801_lda(m_program->read_byte(U));
+ lh5801_lda(m_program.read_byte(U));
m_icount -= 6;
break;
case 0x26:
@@ -969,7 +969,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0x27:
- lh5801_cpa(m_a, m_program->read_byte(U));
+ lh5801_cpa(m_a, m_program.read_byte(U));
m_icount -= 7;
break;
case 0x28:
@@ -977,7 +977,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x29:
- lh5801_and(m_program->read_byte(U));
+ lh5801_and(m_program.read_byte(U));
m_icount -= 7;
break;
case 0x2a:
@@ -985,23 +985,23 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0x2b:
- lh5801_ora(m_program->read_byte(U));
+ lh5801_ora(m_program.read_byte(U));
m_icount -= 7;
break;
case 0x2c:
- lh5801_dcs(m_program->read_byte(U));
+ lh5801_dcs(m_program.read_byte(U));
m_icount -= 13;
break;
case 0x2d:
- lh5801_eor(m_program->read_byte(U));
+ lh5801_eor(m_program.read_byte(U));
m_icount -= 7;
break;
case 0x2e:
- m_program->write_byte(U, m_a);
+ m_program.write_byte(U, m_a);
m_icount -= 6;
break;
case 0x2f:
- lh5801_bit(m_program->read_byte(U), m_a);
+ lh5801_bit(m_program.read_byte(U), m_a);
m_icount -= 7;
break;
case 0x38: /*nop*/
@@ -1037,34 +1037,34 @@ void lh5801_cpu_device::lh5801_instruction()
lh5801_lde(&m_x);
m_icount -= 6;
break;
- case 0x48: XH=m_cache->read_byte(P++);
+ case 0x48: XH=m_cache.read_byte(P++);
m_icount -= 6;
break;
case 0x49:
- lh5801_and_mem(*m_program, X, m_cache->read_byte(P++));
+ lh5801_and_mem(m_program.space(), X, m_cache.read_byte(P++));
m_icount -= 13;
break;
- case 0x4a: XL=m_cache->read_byte(P++);
+ case 0x4a: XL=m_cache.read_byte(P++);
m_icount -= 6;
break;
case 0x4b:
- lh5801_ora_mem(*m_program, X, m_cache->read_byte(P++));
+ lh5801_ora_mem(m_program.space(), X, m_cache.read_byte(P++));
m_icount -= 13;
break;
case 0x4c:
- lh5801_cpa(XH, m_cache->read_byte(P++));
+ lh5801_cpa(XH, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0x4d:
- lh5801_bit(m_program->read_byte(X), m_cache->read_byte(P++));
+ lh5801_bit(m_program.read_byte(X), m_cache.read_byte(P++));
m_icount -= 10;
break;
case 0x4e:
- lh5801_cpa(XL, m_cache->read_byte(P++));
+ lh5801_cpa(XL, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0x4f:
- lh5801_add_mem(*m_program, X, m_cache->read_byte(P++));
+ lh5801_add_mem(m_program.space(), X, m_cache.read_byte(P++));
m_icount -= 13;
break;
case 0x50:
@@ -1097,34 +1097,34 @@ void lh5801_cpu_device::lh5801_instruction()
lh5801_lde(&m_y);
m_icount -= 6;
break;
- case 0x58: YH=m_cache->read_byte(P++);
+ case 0x58: YH=m_cache.read_byte(P++);
m_icount -= 6;
break;
case 0x59:
- lh5801_and_mem(*m_program, Y, m_cache->read_byte(P++));
+ lh5801_and_mem(m_program.space(), Y, m_cache.read_byte(P++));
m_icount -= 13;
break;
- case 0x5a: YL=m_cache->read_byte(P++);
+ case 0x5a: YL=m_cache.read_byte(P++);
m_icount -= 6;
break;
case 0x5b:
- lh5801_ora_mem(*m_program, Y, m_cache->read_byte(P++));
+ lh5801_ora_mem(m_program.space(), Y, m_cache.read_byte(P++));
m_icount -= 13;
break;
case 0x5c:
- lh5801_cpa(YH, m_cache->read_byte(P++));
+ lh5801_cpa(YH, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0x5d:
- lh5801_bit(m_program->read_byte(Y), m_cache->read_byte(P++));
+ lh5801_bit(m_program.read_byte(Y), m_cache.read_byte(P++));
m_icount -= 10;
break;
case 0x5e:
- lh5801_cpa(YL, m_cache->read_byte(P++));
+ lh5801_cpa(YL, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0x5f:
- lh5801_add_mem(*m_program, Y, m_cache->read_byte(P++));
+ lh5801_add_mem(m_program.space(), Y, m_cache.read_byte(P++));
m_icount -= 13;
break;
case 0x60:
@@ -1157,34 +1157,34 @@ void lh5801_cpu_device::lh5801_instruction()
lh5801_lde(&m_u);
m_icount -= 6;
break;
- case 0x68: UH=m_cache->read_byte(P++);
+ case 0x68: UH=m_cache.read_byte(P++);
m_icount -= 6;
break;
case 0x69:
- lh5801_and_mem(*m_program, U, m_cache->read_byte(P++));
+ lh5801_and_mem(m_program.space(), U, m_cache.read_byte(P++));
m_icount -= 13;
break;
- case 0x6a: UL=m_cache->read_byte(P++);
+ case 0x6a: UL=m_cache.read_byte(P++);
m_icount -= 6;
break;
case 0x6b:
- lh5801_ora_mem(*m_program, U, m_cache->read_byte(P++));
+ lh5801_ora_mem(m_program.space(), U, m_cache.read_byte(P++));
m_icount -= 13;
break;
case 0x6c:
- lh5801_cpa(UH, m_cache->read_byte(P++));
+ lh5801_cpa(UH, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0x6d:
- lh5801_bit(m_program->read_byte(U), m_cache->read_byte(P++));
+ lh5801_bit(m_program.read_byte(U), m_cache.read_byte(P++));
m_icount -= 10;
break;
case 0x6e:
- lh5801_cpa(UL, m_cache->read_byte(P++));
+ lh5801_cpa(UL, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0x6f:
- lh5801_add_mem(*m_program, U, m_cache->read_byte(P++));
+ lh5801_add_mem(m_program.space(), U, m_cache.read_byte(P++));
m_icount -= 13;
break;
case 0x80:
@@ -1235,7 +1235,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 8;
break;
case 0x8c:
- lh5801_dca(m_program->read_byte(X));
+ lh5801_dca(m_program.read_byte(X));
m_icount -= 15;
break;
case 0x8d:
@@ -1295,7 +1295,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 8;
break;
case 0x9c:
- lh5801_dca(m_program->read_byte(Y));
+ lh5801_dca(m_program.read_byte(Y));
m_icount -= 15;
break;
case 0x9d:
@@ -1319,11 +1319,11 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0xa1:
- lh5801_sbc(m_program->read_byte(lh5801_readop_word()));
+ lh5801_sbc(m_program.read_byte(lh5801_readop_word()));
m_icount -= 13;
break;
case 0xa3:
- lh5801_adc(m_program->read_byte(lh5801_readop_word()));
+ lh5801_adc(m_program.read_byte(lh5801_readop_word()));
m_icount -= 13;
break;
case 0xa4:
@@ -1331,7 +1331,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 5;
break;
case 0xa5:
- lh5801_lda(m_program->read_byte(lh5801_readop_word()));
+ lh5801_lda(m_program.read_byte(lh5801_readop_word()));
m_icount -= 12;
break;
case 0xa6:
@@ -1339,7 +1339,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0xa7:
- lh5801_cpa(m_a, m_program->read_byte(lh5801_readop_word()));
+ lh5801_cpa(m_a, m_program.read_byte(lh5801_readop_word()));
m_icount -= 13;
break;
case 0xa8: /*spv*/
@@ -1347,7 +1347,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 4;
break;
case 0xa9:
- lh5801_and(m_program->read_byte(lh5801_readop_word()));
+ lh5801_and(m_program.read_byte(lh5801_readop_word()));
m_icount -= 13;
break;
case 0xaa:
@@ -1355,39 +1355,39 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0xab:
- lh5801_ora(m_program->read_byte(lh5801_readop_word()));
+ lh5801_ora(m_program.read_byte(lh5801_readop_word()));
m_icount -= 13;
break;
case 0xac:
- lh5801_dca(m_program->read_byte(U));
+ lh5801_dca(m_program.read_byte(U));
m_icount -= 15;
break;
case 0xad:
- lh5801_eor(m_program->read_byte(lh5801_readop_word()));
+ lh5801_eor(m_program.read_byte(lh5801_readop_word()));
m_icount -= 13;
break;
case 0xae:
- m_program->write_byte(lh5801_readop_word(), m_a);
+ m_program.write_byte(lh5801_readop_word(), m_a);
m_icount -= 12;
break;
case 0xaf:
- lh5801_bit(m_program->read_byte(lh5801_readop_word()), m_a);
+ lh5801_bit(m_program.read_byte(lh5801_readop_word()), m_a);
m_icount -= 13;
break;
case 0xb1:
- lh5801_sbc(m_cache->read_byte(P++));
+ lh5801_sbc(m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0xb3:
- lh5801_adc(m_cache->read_byte(P++));
+ lh5801_adc(m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0xb5:
- lh5801_lda(m_cache->read_byte(P++));
+ lh5801_lda(m_cache.read_byte(P++));
m_icount -= 6;
break;
case 0xb7:
- lh5801_cpa(m_a, m_cache->read_byte(P++));
+ lh5801_cpa(m_a, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0xb8: /*rpv*/
@@ -1395,7 +1395,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 4;
break;
case 0xb9:
- lh5801_and(m_cache->read_byte(P++));
+ lh5801_and(m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0xba:
@@ -1403,11 +1403,11 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 12;
break;
case 0xbb:
- lh5801_ora(m_cache->read_byte(P++));
+ lh5801_ora(m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0xbd:
- lh5801_eor(m_cache->read_byte(P++));
+ lh5801_eor(m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0xbe:
@@ -1415,39 +1415,39 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 19;
break;
case 0xbf:
- lh5801_bit(m_a, m_cache->read_byte(P++));
+ lh5801_bit(m_a, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0xc1:
- lh5801_vector(!(m_t&C), m_cache->read_byte(P++));
+ lh5801_vector(!(m_t&C), m_cache.read_byte(P++));
m_icount -= 8;
break;
case 0xc3:
- lh5801_vector(m_t&C, m_cache->read_byte(P++));
+ lh5801_vector(m_t&C, m_cache.read_byte(P++));
m_icount -= 8;
break;
case 0xc5:
- lh5801_vector(!(m_t&H), m_cache->read_byte(P++));
+ lh5801_vector(!(m_t&H), m_cache.read_byte(P++));
m_icount -= 8;
break;
case 0xc7:
- lh5801_vector(m_t&H, m_cache->read_byte(P++));
+ lh5801_vector(m_t&H, m_cache.read_byte(P++));
m_icount -= 8;
break;
case 0xc9:
- lh5801_vector(!(m_t&Z), m_cache->read_byte(P++));
+ lh5801_vector(!(m_t&Z), m_cache.read_byte(P++));
m_icount -= 8;
break;
case 0xcb:
- lh5801_vector(m_t & Z, m_cache->read_byte(P++));
+ lh5801_vector(m_t & Z, m_cache.read_byte(P++));
m_icount -= 8;
break;
case 0xcd:
- lh5801_vector(1, m_cache->read_byte(P++));
+ lh5801_vector(1, m_cache.read_byte(P++));
m_icount -= 7;
break;
case 0xcf:
- lh5801_vector(m_t & V, m_cache->read_byte(P++));
+ lh5801_vector(m_t & V, m_cache.read_byte(P++));
m_icount -= 8;
break;
case 0xd1:
@@ -1455,7 +1455,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0xd3:
- lh5801_drr(*m_program, X);
+ lh5801_drr(m_program.space(), X);
m_icount -= 12;
break;
case 0xd5:
@@ -1463,7 +1463,7 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0xd7:
- lh5801_drl(*m_program, X);
+ lh5801_drl(m_program.space(), X);
m_icount -= 12;
break;
case 0xd9:
@@ -1492,22 +1492,22 @@ void lh5801_cpu_device::lh5801_instruction()
break;
case 0xe9:
adr = lh5801_readop_word();
- lh5801_and_mem(*m_program, adr, m_cache->read_byte(P++));
+ lh5801_and_mem(m_program.space(), adr, m_cache.read_byte(P++));
m_icount -= 19;
break;
case 0xeb:
adr = lh5801_readop_word();
- lh5801_ora_mem(*m_program, adr, m_cache->read_byte(P++));
+ lh5801_ora_mem(m_program.space(), adr, m_cache.read_byte(P++));
m_icount -= 19;
break;
case 0xed:
adr = lh5801_readop_word();
- lh5801_bit(m_program->read_byte(adr), m_cache->read_byte(P++));
+ lh5801_bit(m_program.read_byte(adr), m_cache.read_byte(P++));
m_icount -= 16;
break;
case 0xef:
adr = lh5801_readop_word();
- lh5801_add_mem(*m_program, adr, m_cache->read_byte(P++));
+ lh5801_add_mem(m_program.space(), adr, m_cache.read_byte(P++));
m_icount -= 19;
break;
case 0xf1:
@@ -1515,11 +1515,11 @@ void lh5801_cpu_device::lh5801_instruction()
m_icount -= 6;
break;
case 0xf5: /*tin*/
- m_program->write_byte(Y++, m_program->read_byte(X++));
+ m_program.write_byte(Y++, m_program.read_byte(X++));
m_icount -= 7;
break;
case 0xf7: /*cin*/
- lh5801_cpa(m_a, m_program->read_byte(X++));
+ lh5801_cpa(m_a, m_program.read_byte(X++));
m_icount -= 7;
break;
case 0xf9:
diff --git a/src/devices/cpu/lh5801/lh5801.cpp b/src/devices/cpu/lh5801/lh5801.cpp
index f650b0887fa..da156333eb0 100644
--- a/src/devices/cpu/lh5801/lh5801.cpp
+++ b/src/devices/cpu/lh5801/lh5801.cpp
@@ -90,9 +90,9 @@ device_memory_interface::space_config_vector lh5801_cpu_device::memory_space_con
void lh5801_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_io = &space(AS_IO);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
m_in_func.resolve_safe(0);
@@ -172,7 +172,7 @@ void lh5801_cpu_device::state_string_export(const device_state_entry &entry, std
void lh5801_cpu_device::device_reset()
{
- P = (m_program->read_byte(0xfffe) << 8) | m_program->read_byte(0xffff);
+ P = (m_program.read_byte(0xfffe) << 8) | m_program.read_byte(0xffff);
m_idle = 0;
@@ -190,7 +190,7 @@ void lh5801_cpu_device::check_irq()
lh5801_push(m_t);
m_t &= ~IE;
lh5801_push_word(P);
- P = (m_program->read_byte(0xfffc) << 8) | m_program->read_byte(0xfffd);
+ P = (m_program.read_byte(0xfffc) << 8) | m_program.read_byte(0xfffd);
}
else if (m_ir_flipflop[1] && (m_t & IE))
{
@@ -199,7 +199,7 @@ void lh5801_cpu_device::check_irq()
lh5801_push(m_t);
m_t &= ~IE;
lh5801_push_word(P);
- P = (m_program->read_byte(0xfffa) << 8) | m_program->read_byte(0xfffb);
+ P = (m_program.read_byte(0xfffa) << 8) | m_program.read_byte(0xfffb);
}
else if (m_ir_flipflop[2] && (m_t & IE))
{
@@ -208,7 +208,7 @@ void lh5801_cpu_device::check_irq()
lh5801_push(m_t);
m_t &= ~IE;
lh5801_push_word(P);
- P = (m_program->read_byte(0xfff8) << 8) | m_program->read_byte(0xfff9);
+ P = (m_program.read_byte(0xfff8) << 8) | m_program.read_byte(0xfff9);
}
}
diff --git a/src/devices/cpu/lh5801/lh5801.h b/src/devices/cpu/lh5801/lh5801.h
index 85ca6598f4d..68c028289af 100644
--- a/src/devices/cpu/lh5801/lh5801.h
+++ b/src/devices/cpu/lh5801/lh5801.h
@@ -2,7 +2,7 @@
// copyright-holders:Peter Trauner
/*****************************************************************************
*
- * cpustate->h
+ * lh6801.h
* portable lh5801 emulator interface
*
*
@@ -99,9 +99,9 @@ private:
devcb_read8 m_in_func;
- address_space *m_program; //ME0
- address_space *m_io; //ME1
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program; // ME0
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_io; // ME1
PAIR m_s;
PAIR m_p;
diff --git a/src/devices/cpu/m37710/m37710.cpp b/src/devices/cpu/m37710/m37710.cpp
index 5b199497ddd..ccbb60b1da4 100644
--- a/src/devices/cpu/m37710/m37710.cpp
+++ b/src/devices/cpu/m37710/m37710.cpp
@@ -1307,8 +1307,8 @@ void m37710_cpu_device::device_start()
m_watchdog_freq = 0;
std::fill(std::begin(m_int_control), std::end(m_int_control), 0);
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
m_port_in_cb.resolve_all_safe(0xff);
m_port_out_cb.resolve_all_safe();
diff --git a/src/devices/cpu/m37710/m37710.h b/src/devices/cpu/m37710/m37710.h
index 5ddac905305..1ff34d91336 100644
--- a/src/devices/cpu/m37710/m37710.h
+++ b/src/devices/cpu/m37710/m37710.h
@@ -270,8 +270,8 @@ private:
int m_ICount; /* cycle count */
uint32_t m_source; /* temp register */
uint32_t m_destination; /* temp register */
- address_space *m_program;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<24, 1, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<24, 1, 0, ENDIANNESS_LITTLE>::specific m_program;
uint32_t m_stopped; /* Sets how the CPU is stopped */
// ports
diff --git a/src/devices/cpu/m37710/m37710cm.h b/src/devices/cpu/m37710/m37710cm.h
index 1fa3c45f14f..c29ab52bef5 100644
--- a/src/devices/cpu/m37710/m37710cm.h
+++ b/src/devices/cpu/m37710/m37710cm.h
@@ -21,12 +21,12 @@
#undef M37710_CALL_DEBUGGER
#define M37710_CALL_DEBUGGER(x) debugger_instruction_hook(x)
-#define m37710_read_8(addr) m_program->read_byte(addr)
-#define m37710_write_8(addr,data) m_program->write_byte(addr,data)
-#define m37710_read_8_immediate(A) m_cache->read_byte(A)
-#define m37710_read_16(addr) m_program->read_word_unaligned(addr)
-#define m37710_write_16(addr,data) m_program->write_word_unaligned(addr,data)
-#define m37710_read_16_immediate(A) m_cache->read_word(A)
+#define m37710_read_8(addr) m_program.read_byte(addr)
+#define m37710_write_8(addr,data) m_program.write_byte(addr,data)
+#define m37710_read_8_immediate(A) m_cache.read_byte(A)
+#define m37710_read_16(addr) m_program.read_word_unaligned(addr)
+#define m37710_write_16(addr,data) m_program.write_word_unaligned(addr,data)
+#define m37710_read_16_immediate(A) m_cache.read_word(A)
/* ======================================================================== */
diff --git a/src/devices/cpu/m6502/m4510.cpp b/src/devices/cpu/m6502/m4510.cpp
index 69dcd2a8f74..aa29a820dcd 100644
--- a/src/devices/cpu/m6502/m4510.cpp
+++ b/src/devices/cpu/m6502/m4510.cpp
@@ -74,22 +74,22 @@ m4510_device::mi_4510::mi_4510(m4510_device *_base)
uint8_t m4510_device::mi_4510::read(uint16_t adr)
{
- return program->read_byte(base->map(adr));
+ return program.read_byte(base->map(adr));
}
uint8_t m4510_device::mi_4510::read_sync(uint16_t adr)
{
- return scache->read_byte(base->map(adr));
+ return csprogram.read_byte(base->map(adr));
}
uint8_t m4510_device::mi_4510::read_arg(uint16_t adr)
{
- return cache->read_byte(base->map(adr));
+ return cprogram.read_byte(base->map(adr));
}
void m4510_device::mi_4510::write(uint16_t adr, uint8_t val)
{
- program->write_byte(base->map(adr), val);
+ program.write_byte(base->map(adr), val);
}
#include "cpu/m6502/m4510.hxx"
diff --git a/src/devices/cpu/m6502/m6502.cpp b/src/devices/cpu/m6502/m6502.cpp
index 2781d689dc1..f3b09d4de78 100644
--- a/src/devices/cpu/m6502/m6502.cpp
+++ b/src/devices/cpu/m6502/m6502.cpp
@@ -44,11 +44,9 @@ void m6502_device::device_start()
void m6502_device::init()
{
- mintf->program = &space(AS_PROGRAM);
- mintf->sprogram = has_space(AS_OPCODES) ? &space(AS_OPCODES) : mintf->program;
-
- mintf->cache = mintf->program->cache<0, 0, ENDIANNESS_LITTLE>();
- mintf->scache = mintf->sprogram->cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(mintf->cprogram);
+ space(AS_PROGRAM).specific(mintf->program);
+ space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).cache(mintf->csprogram);
sync_w.resolve_safe();
@@ -528,22 +526,22 @@ void m6502_device::memory_interface::write_9(uint16_t adr, uint8_t val)
uint8_t m6502_device::mi_default::read(uint16_t adr)
{
- return program->read_byte(adr);
+ return program.read_byte(adr);
}
uint8_t m6502_device::mi_default::read_sync(uint16_t adr)
{
- return scache->read_byte(adr);
+ return csprogram.read_byte(adr);
}
uint8_t m6502_device::mi_default::read_arg(uint16_t adr)
{
- return cache->read_byte(adr);
+ return cprogram.read_byte(adr);
}
void m6502_device::mi_default::write(uint16_t adr, uint8_t val)
{
- program->write_byte(adr, val);
+ program.write_byte(adr, val);
}
diff --git a/src/devices/cpu/m6502/m6502.h b/src/devices/cpu/m6502/m6502.h
index 3637b088eea..c7a0390971a 100644
--- a/src/devices/cpu/m6502/m6502.h
+++ b/src/devices/cpu/m6502/m6502.h
@@ -33,8 +33,8 @@ protected:
class memory_interface {
public:
- address_space *program, *sprogram;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *cache, *scache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache cprogram, csprogram;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific program;
virtual ~memory_interface() {}
virtual uint8_t read(uint16_t adr) = 0;
diff --git a/src/devices/cpu/m6502/m6504.cpp b/src/devices/cpu/m6502/m6504.cpp
index 4e342fdbd3a..98fba662e60 100644
--- a/src/devices/cpu/m6502/m6504.cpp
+++ b/src/devices/cpu/m6502/m6504.cpp
@@ -29,20 +29,20 @@ void m6504_device::device_start()
uint8_t m6504_device::mi_6504::read(uint16_t adr)
{
- return program->read_byte(adr & 0x1fff);
+ return program.read_byte(adr & 0x1fff);
}
uint8_t m6504_device::mi_6504::read_sync(uint16_t adr)
{
- return scache->read_byte(adr & 0x1fff);
+ return csprogram.read_byte(adr & 0x1fff);
}
uint8_t m6504_device::mi_6504::read_arg(uint16_t adr)
{
- return cache->read_byte(adr & 0x1fff);
+ return cprogram.read_byte(adr & 0x1fff);
}
void m6504_device::mi_6504::write(uint16_t adr, uint8_t val)
{
- program->write_byte(adr & 0x1fff, val);
+ program.write_byte(adr & 0x1fff, val);
}
diff --git a/src/devices/cpu/m6502/m6507.cpp b/src/devices/cpu/m6502/m6507.cpp
index aa4a0726aa8..a42aff44c2f 100644
--- a/src/devices/cpu/m6502/m6507.cpp
+++ b/src/devices/cpu/m6502/m6507.cpp
@@ -29,20 +29,20 @@ void m6507_device::device_start()
uint8_t m6507_device::mi_6507::read(uint16_t adr)
{
- return program->read_byte(adr & 0x1fff);
+ return program.read_byte(adr & 0x1fff);
}
uint8_t m6507_device::mi_6507::read_sync(uint16_t adr)
{
- return scache->read_byte(adr & 0x1fff);
+ return csprogram.read_byte(adr & 0x1fff);
}
uint8_t m6507_device::mi_6507::read_arg(uint16_t adr)
{
- return cache->read_byte(adr & 0x1fff);
+ return cprogram.read_byte(adr & 0x1fff);
}
void m6507_device::mi_6507::write(uint16_t adr, uint8_t val)
{
- program->write_byte(adr & 0x1fff, val);
+ program.write_byte(adr & 0x1fff, val);
}
diff --git a/src/devices/cpu/m6502/m6509.cpp b/src/devices/cpu/m6502/m6509.cpp
index 2f3d7ca0695..3ffbeda05fc 100644
--- a/src/devices/cpu/m6502/m6509.cpp
+++ b/src/devices/cpu/m6502/m6509.cpp
@@ -59,7 +59,7 @@ m6509_device::mi_6509::mi_6509(m6509_device *_base)
uint8_t m6509_device::mi_6509::read(uint16_t adr)
{
- uint8_t res = program->read_byte(base->adr_in_bank_i(adr));
+ uint8_t res = program.read_byte(base->adr_in_bank_i(adr));
if(adr == 0x0000)
res = base->bank_i_r();
else if(adr == 0x0001)
@@ -69,7 +69,7 @@ uint8_t m6509_device::mi_6509::read(uint16_t adr)
uint8_t m6509_device::mi_6509::read_sync(uint16_t adr)
{
- uint8_t res = scache->read_byte(base->adr_in_bank_i(adr));
+ uint8_t res = csprogram.read_byte(base->adr_in_bank_i(adr));
if(adr == 0x0000)
res = base->bank_i_r();
else if(adr == 0x0001)
@@ -79,7 +79,7 @@ uint8_t m6509_device::mi_6509::read_sync(uint16_t adr)
uint8_t m6509_device::mi_6509::read_arg(uint16_t adr)
{
- uint8_t res = cache->read_byte(base->adr_in_bank_i(adr));
+ uint8_t res = cprogram.read_byte(base->adr_in_bank_i(adr));
if(adr == 0x0000)
res = base->bank_i_r();
else if(adr == 0x0001)
@@ -89,7 +89,7 @@ uint8_t m6509_device::mi_6509::read_arg(uint16_t adr)
uint8_t m6509_device::mi_6509::read_9(uint16_t adr)
{
- uint8_t res = program->read_byte(base->adr_in_bank_y(adr));
+ uint8_t res = program.read_byte(base->adr_in_bank_y(adr));
if(adr == 0x0000)
res = base->bank_i_r();
else if(adr == 0x0001)
@@ -99,7 +99,7 @@ uint8_t m6509_device::mi_6509::read_9(uint16_t adr)
void m6509_device::mi_6509::write(uint16_t adr, uint8_t val)
{
- program->write_byte(base->adr_in_bank_i(adr), val);
+ program.write_byte(base->adr_in_bank_i(adr), val);
if(adr == 0x0000)
base->bank_i_w(val);
else if(adr == 0x0001)
@@ -108,7 +108,7 @@ void m6509_device::mi_6509::write(uint16_t adr, uint8_t val)
void m6509_device::mi_6509::write_9(uint16_t adr, uint8_t val)
{
- program->write_byte(base->adr_in_bank_y(adr), val);
+ program.write_byte(base->adr_in_bank_y(adr), val);
if(adr == 0x0000)
base->bank_i_w(val);
else if(adr == 0x0001)
diff --git a/src/devices/cpu/m6502/m6510.cpp b/src/devices/cpu/m6502/m6510.cpp
index 0bfa5a18395..706c1407fcb 100644
--- a/src/devices/cpu/m6502/m6510.cpp
+++ b/src/devices/cpu/m6502/m6510.cpp
@@ -113,7 +113,7 @@ m6510_device::mi_6510::mi_6510(m6510_device *_base)
uint8_t m6510_device::mi_6510::read(uint16_t adr)
{
- uint8_t res = program->read_byte(adr);
+ uint8_t res = program.read_byte(adr);
if(adr == 0x0000)
res = base->dir_r();
else if(adr == 0x0001)
@@ -123,7 +123,7 @@ uint8_t m6510_device::mi_6510::read(uint16_t adr)
uint8_t m6510_device::mi_6510::read_sync(uint16_t adr)
{
- uint8_t res = scache->read_byte(adr);
+ uint8_t res = csprogram.read_byte(adr);
if(adr == 0x0000)
res = base->dir_r();
else if(adr == 0x0001)
@@ -133,7 +133,7 @@ uint8_t m6510_device::mi_6510::read_sync(uint16_t adr)
uint8_t m6510_device::mi_6510::read_arg(uint16_t adr)
{
- uint8_t res = cache->read_byte(adr);
+ uint8_t res = cprogram.read_byte(adr);
if(adr == 0x0000)
res = base->dir_r();
else if(adr == 0x0001)
@@ -143,7 +143,7 @@ uint8_t m6510_device::mi_6510::read_arg(uint16_t adr)
void m6510_device::mi_6510::write(uint16_t adr, uint8_t val)
{
- program->write_byte(adr, val);
+ program.write_byte(adr, val);
if(adr == 0x0000)
base->dir_w(val);
else if(adr == 0x0001)
@@ -175,7 +175,7 @@ m6508_device::mi_6508::mi_6508(m6508_device *_base)
uint8_t m6508_device::mi_6508::read(uint16_t adr)
{
- uint8_t res = program->read_byte(adr);
+ uint8_t res = program.read_byte(adr);
if(adr == 0x0000)
res = base->dir_r();
else if(adr == 0x0001)
@@ -187,7 +187,7 @@ uint8_t m6508_device::mi_6508::read(uint16_t adr)
uint8_t m6508_device::mi_6508::read_sync(uint16_t adr)
{
- uint8_t res = scache->read_byte(adr);
+ uint8_t res = csprogram.read_byte(adr);
if(adr == 0x0000)
res = base->dir_r();
else if(adr == 0x0001)
@@ -199,7 +199,7 @@ uint8_t m6508_device::mi_6508::read_sync(uint16_t adr)
uint8_t m6508_device::mi_6508::read_arg(uint16_t adr)
{
- uint8_t res = cache->read_byte(adr);
+ uint8_t res = cprogram.read_byte(adr);
if(adr == 0x0000)
res = base->dir_r();
else if(adr == 0x0001)
@@ -211,7 +211,7 @@ uint8_t m6508_device::mi_6508::read_arg(uint16_t adr)
void m6508_device::mi_6508::write(uint16_t adr, uint8_t val)
{
- program->write_byte(adr, val);
+ program.write_byte(adr, val);
if(adr == 0x0000)
base->dir_w(val);
else if(adr == 0x0001)
diff --git a/src/devices/cpu/m6502/n2a03.cpp b/src/devices/cpu/m6502/n2a03.cpp
index b7aa0778ed7..b4c05185441 100644
--- a/src/devices/cpu/m6502/n2a03.cpp
+++ b/src/devices/cpu/m6502/n2a03.cpp
@@ -72,7 +72,7 @@ WRITE_LINE_MEMBER(n2a03_device::apu_irq)
uint8_t n2a03_device::apu_read_mem(offs_t offset)
{
- return mintf->program->read_byte(offset);
+ return mintf->program.read_byte(offset);
}
void n2a03_device::device_add_mconfig(machine_config &config)
diff --git a/src/devices/cpu/m6502/r65c19.cpp b/src/devices/cpu/m6502/r65c19.cpp
index 4da7a547c79..0616a432504 100644
--- a/src/devices/cpu/m6502/r65c19.cpp
+++ b/src/devices/cpu/m6502/r65c19.cpp
@@ -108,9 +108,9 @@ device_memory_interface::space_config_vector c39_device::memory_space_config() c
void c39_device::device_start()
{
std::unique_ptr<mi_banked> intf = std::make_unique<mi_banked>();
- intf->exp = &space(AS_DATA);
- intf->escache = space(AS_DATA).cache<0, 0, ENDIANNESS_LITTLE>();
- intf->es4 = &space(AS_IO);
+ space(AS_DATA).cache(intf->escache);
+ space(AS_DATA).specific(intf->exp);
+ space(AS_IO).specific(intf->es4);
save_item(NAME(intf->bsr));
save_item(NAME(intf->pbs));
@@ -186,38 +186,38 @@ void r65c19_device::cir_w(u8 data)
u8 c39_device::mi_banked::exp_read(u16 adr)
{
- return exp->read_byte(u32(bsr[(adr & 0xe000) >> 13]) << 13 | (adr & 0x1fff));
+ return exp.read_byte(u32(bsr[(adr & 0xe000) >> 13]) << 13 | (adr & 0x1fff));
}
u8 c39_device::mi_banked::exp_read_cached(u16 adr)
{
- return escache->read_byte(u32(bsr[(adr & 0xe000) >> 13]) << 13 | (adr & 0x1fff));
+ return escache.read_byte(u32(bsr[(adr & 0xe000) >> 13]) << 13 | (adr & 0x1fff));
}
void c39_device::mi_banked::exp_write(u16 adr, u8 val)
{
- exp->write_byte(u32(bsr[(adr & 0xe000) >> 13]) << 13 | (adr & 0x1fff), val);
+ exp.write_byte(u32(bsr[(adr & 0xe000) >> 13]) << 13 | (adr & 0x1fff), val);
}
u8 c39_device::mi_banked::es4_read(u16 adr)
{
- return es4->read_byte(adr & 0x1ff);
+ return es4.read_byte(adr & 0x1ff);
}
void c39_device::mi_banked::es4_write(u16 adr, u8 val)
{
- es4->write_byte(adr & 0x1ff, val);
+ es4.write_byte(adr & 0x1ff, val);
}
u8 c39_device::mi_banked::read(u16 adr)
{
- return program->read_byte(adr);
+ return program.read_byte(adr);
}
u8 c39_device::mi_banked::read_sync(u16 adr)
{
if (adr < 0x0600)
- return cache->read_byte(adr);
+ return cprogram.read_byte(adr);
else if (adr >= 0x0800 || BIT(pbs, 1))
return exp_read_cached(adr);
else
@@ -227,7 +227,7 @@ u8 c39_device::mi_banked::read_sync(u16 adr)
u8 c39_device::mi_banked::read_arg(u16 adr)
{
if (adr < 0x0600)
- return cache->read_byte(adr);
+ return cprogram.read_byte(adr);
else if (adr >= 0x0800 || BIT(pbs, 1))
return exp_read_cached(adr);
else
@@ -236,7 +236,7 @@ u8 c39_device::mi_banked::read_arg(u16 adr)
void c39_device::mi_banked::write(u16 adr, u8 val)
{
- program->write_byte(adr, val);
+ program.write_byte(adr, val);
}
u8 c39_device::pbs_r()
diff --git a/src/devices/cpu/m6502/r65c19.h b/src/devices/cpu/m6502/r65c19.h
index 6449b1833e2..6f018fb661b 100644
--- a/src/devices/cpu/m6502/r65c19.h
+++ b/src/devices/cpu/m6502/r65c19.h
@@ -138,9 +138,9 @@ private:
u8 es4_read(u16 adr);
void es4_write(u16 adr, u8 val);
- address_space *exp;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *escache;
- address_space *es4;
+ memory_access<21, 0, 0, ENDIANNESS_LITTLE>::cache escache;
+ memory_access<21, 0, 0, ENDIANNESS_LITTLE>::specific exp;
+ memory_access< 9, 0, 0, ENDIANNESS_LITTLE>::specific es4;
u8 bsr[8];
u8 pbs;
diff --git a/src/devices/cpu/m6502/st2204.cpp b/src/devices/cpu/m6502/st2204.cpp
index 829ff74ac08..467e60465a5 100644
--- a/src/devices/cpu/m6502/st2204.cpp
+++ b/src/devices/cpu/m6502/st2204.cpp
@@ -67,8 +67,9 @@ st2202_device::st2202_device(const machine_config &mconfig, const char *tag, dev
void st2204_device::device_start()
{
std::unique_ptr<mi_st2204> intf = std::make_unique<mi_st2204>();
- intf->data = &space(AS_DATA);
- intf->dcache = space(AS_DATA).cache<0, 0, ENDIANNESS_LITTLE>();
+
+ space(AS_DATA).cache(intf->dcache);
+ space(AS_DATA).specific(intf->data);
intf->irr_enable = false;
intf->irr = 0;
intf->prr = 0;
@@ -178,55 +179,55 @@ const char *st2204_device::st2xxx_irq_name(int i) const
u8 st2204_device::mi_st2204::pread(u16 adr)
{
u16 bank = irq_service && irr_enable ? irr : prr;
- return data->read_byte(u32(bank ^ 1) << 14 | (adr & 0x3fff));
+ return data.read_byte(u32(bank ^ 1) << 14 | (adr & 0x3fff));
}
u8 st2204_device::mi_st2204::preadc(u16 adr)
{
u16 bank = irq_service && irr_enable ? irr : prr;
- return dcache->read_byte(u32(bank ^ 1) << 14 | (adr & 0x3fff));
+ return dcache.read_byte(u32(bank ^ 1) << 14 | (adr & 0x3fff));
}
void st2204_device::mi_st2204::pwrite(u16 adr, u8 val)
{
u16 bank = irq_service && irr_enable ? irr : prr;
- data->write_byte(u32(bank ^ 1) << 14 | (adr & 0x3fff), val);
+ data.write_byte(u32(bank ^ 1) << 14 | (adr & 0x3fff), val);
}
u8 st2204_device::mi_st2204::dread(u16 adr)
{
- return data->read_byte(u32(drr) << 15 | (adr & 0x7fff));
+ return data.read_byte(u32(drr) << 15 | (adr & 0x7fff));
}
u8 st2204_device::mi_st2204::dreadc(u16 adr)
{
- return dcache->read_byte(u32(drr) << 15 | (adr & 0x7fff));
+ return dcache.read_byte(u32(drr) << 15 | (adr & 0x7fff));
}
void st2204_device::mi_st2204::dwrite(u16 adr, u8 val)
{
- data->write_byte(u32(drr) << 15 | (adr & 0x7fff), val);
+ data.write_byte(u32(drr) << 15 | (adr & 0x7fff), val);
}
u8 st2204_device::mi_st2204::read(u16 adr)
{
- return program->read_byte(adr);
+ return program.read_byte(adr);
}
u8 st2204_device::mi_st2204::read_sync(u16 adr)
{
- return BIT(adr, 15) ? dreadc(adr) : BIT(adr, 14) ? preadc(adr) : cache->read_byte(adr);
+ return BIT(adr, 15) ? dreadc(adr) : BIT(adr, 14) ? preadc(adr) : cprogram.read_byte(adr);
}
u8 st2204_device::mi_st2204::read_arg(u16 adr)
{
- return BIT(adr, 15) ? dreadc(adr) : BIT(adr, 14) ? preadc(adr) : cache->read_byte(adr);
+ return BIT(adr, 15) ? dreadc(adr) : BIT(adr, 14) ? preadc(adr) : cprogram.read_byte(adr);
}
u8 st2204_device::mi_st2204::read_dma(u16 adr)
{
if (BIT(adr, 15))
- return dcache->read_byte(u32(dmr) << 15 | (adr & 0x7fff));
+ return dcache.read_byte(u32(dmr) << 15 | (adr & 0x7fff));
else
return read(adr);
}
@@ -238,7 +239,7 @@ u8 st2204_device::mi_st2204::read_vector(u16 adr)
void st2204_device::mi_st2204::write(u16 adr, u8 val)
{
- program->write_byte(adr, val);
+ program.write_byte(adr, val);
}
unsigned st2204_device::st2xxx_bt_divider(int n) const
diff --git a/src/devices/cpu/m6502/st2205u.cpp b/src/devices/cpu/m6502/st2205u.cpp
index c6036fbe21d..20436151600 100644
--- a/src/devices/cpu/m6502/st2205u.cpp
+++ b/src/devices/cpu/m6502/st2205u.cpp
@@ -51,8 +51,8 @@ st2205u_device::st2205u_device(const machine_config &mconfig, const char *tag, d
void st2205u_device::device_start()
{
std::unique_ptr<mi_st2205u> intf = std::make_unique<mi_st2205u>();
- intf->data = &space(AS_DATA);
- intf->dcache = space(AS_DATA).cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_DATA).specific(intf->data);
+ space(AS_DATA).cache(intf->dcache);
intf->irr_enable = false;
intf->irr = 0;
intf->prr = 0;
@@ -164,7 +164,7 @@ u8 st2205u_device::mi_st2205u::pread(u16 adr)
if (BIT(bank, 15))
return ram[0x4000 | (adr & 0x3fff)];
else
- return data->read_byte(u32(bank) << 14 | (adr & 0x3fff));
+ return data.read_byte(u32(bank) << 14 | (adr & 0x3fff));
}
u8 st2205u_device::mi_st2205u::preadc(u16 adr)
@@ -173,7 +173,7 @@ u8 st2205u_device::mi_st2205u::preadc(u16 adr)
if (BIT(bank, 15))
return ram[0x4000 | (adr & 0x3fff)];
else
- return dcache->read_byte(u32(bank) << 14 | (adr & 0x3fff));
+ return dcache.read_byte(u32(bank) << 14 | (adr & 0x3fff));
}
void st2205u_device::mi_st2205u::pwrite(u16 adr, u8 val)
@@ -182,7 +182,7 @@ void st2205u_device::mi_st2205u::pwrite(u16 adr, u8 val)
if (BIT(bank, 15))
ram[0x4000 | (adr & 0x3fff)] = val;
else
- data->write_byte(u32(bank) << 14 | (adr & 0x3fff), val);
+ data.write_byte(u32(bank) << 14 | (adr & 0x3fff), val);
}
u8 st2205u_device::mi_st2205u::dread(u16 adr)
@@ -190,7 +190,7 @@ u8 st2205u_device::mi_st2205u::dread(u16 adr)
if (BIT(drr, 15))
return ram[adr & 0x7fff];
else
- return data->read_byte(u32(drr) << 15 | (adr & 0x7fff));
+ return data.read_byte(u32(drr) << 15 | (adr & 0x7fff));
}
u8 st2205u_device::mi_st2205u::dreadc(u16 adr)
@@ -198,7 +198,7 @@ u8 st2205u_device::mi_st2205u::dreadc(u16 adr)
if (BIT(drr, 15))
return ram[adr & 0x7fff];
else
- return dcache->read_byte(u32(drr) << 15 | (adr & 0x7fff));
+ return dcache.read_byte(u32(drr) << 15 | (adr & 0x7fff));
}
void st2205u_device::mi_st2205u::dwrite(u16 adr, u8 val)
@@ -206,7 +206,7 @@ void st2205u_device::mi_st2205u::dwrite(u16 adr, u8 val)
if (BIT(drr, 15))
ram[adr & 0x7fff] = val;
else
- data->write_byte(u32(drr) << 15 | (adr & 0x7fff), val);
+ data.write_byte(u32(drr) << 15 | (adr & 0x7fff), val);
}
u8 st2205u_device::mi_st2205u::bread(u16 adr)
@@ -214,7 +214,7 @@ u8 st2205u_device::mi_st2205u::bread(u16 adr)
if (BIT(brr, 15))
return ram[0x2000 | (adr & 0x1fff)];
else
- return data->read_byte(u32(brr) << 13 | (adr & 0x1fff));
+ return data.read_byte(u32(brr) << 13 | (adr & 0x1fff));
}
u8 st2205u_device::mi_st2205u::breadc(u16 adr)
@@ -222,7 +222,7 @@ u8 st2205u_device::mi_st2205u::breadc(u16 adr)
if (BIT(brr, 15))
return ram[0x2000 | (adr & 0x1fff)];
else
- return dcache->read_byte(u32(brr) << 13 | (adr & 0x1fff));
+ return dcache.read_byte(u32(brr) << 13 | (adr & 0x1fff));
}
void st2205u_device::mi_st2205u::bwrite(u16 adr, u8 val)
@@ -230,22 +230,22 @@ void st2205u_device::mi_st2205u::bwrite(u16 adr, u8 val)
if (BIT(brr, 15))
ram[0x2000 | (adr & 0x1fff)] = val;
else
- data->write_byte(u32(brr) << 13 | (adr & 0x1fff), val);
+ data.write_byte(u32(brr) << 13 | (adr & 0x1fff), val);
}
u8 st2205u_device::mi_st2205u::read(u16 adr)
{
- return program->read_byte(adr);
+ return program.read_byte(adr);
}
u8 st2205u_device::mi_st2205u::read_sync(u16 adr)
{
- return BIT(adr, 15) ? dreadc(adr) : BIT(adr, 14) ? preadc(adr) : BIT(adr, 13) ? breadc(adr) : cache->read_byte(adr);
+ return BIT(adr, 15) ? dreadc(adr) : BIT(adr, 14) ? preadc(adr) : BIT(adr, 13) ? breadc(adr) : cprogram.read_byte(adr);
}
u8 st2205u_device::mi_st2205u::read_arg(u16 adr)
{
- return BIT(adr, 15) ? dreadc(adr) : BIT(adr, 14) ? preadc(adr) : BIT(adr, 13) ? breadc(adr) : cache->read_byte(adr);
+ return BIT(adr, 15) ? dreadc(adr) : BIT(adr, 14) ? preadc(adr) : BIT(adr, 13) ? breadc(adr) : cprogram.read_byte(adr);
}
u8 st2205u_device::mi_st2205u::read_vector(u16 adr)
@@ -255,7 +255,7 @@ u8 st2205u_device::mi_st2205u::read_vector(u16 adr)
void st2205u_device::mi_st2205u::write(u16 adr, u8 val)
{
- program->write_byte(adr, val);
+ program.write_byte(adr, val);
}
u8 st2205u_device::brrl_r()
diff --git a/src/devices/cpu/m6502/st2xxx.h b/src/devices/cpu/m6502/st2xxx.h
index 3b188ba5dda..a895a95f24a 100644
--- a/src/devices/cpu/m6502/st2xxx.h
+++ b/src/devices/cpu/m6502/st2xxx.h
@@ -109,8 +109,8 @@ protected:
public:
virtual u8 read_vector(u16 adr) = 0;
- address_space *data;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *dcache;
+ memory_access<26, 0, 0, ENDIANNESS_LITTLE>::cache dcache;
+ memory_access<26, 0, 0, ENDIANNESS_LITTLE>::specific data;
bool irq_service;
bool irr_enable;
diff --git a/src/devices/cpu/m6502/xavix.cpp b/src/devices/cpu/m6502/xavix.cpp
index 841aa866e45..c8f98a0e8f7 100644
--- a/src/devices/cpu/m6502/xavix.cpp
+++ b/src/devices/cpu/m6502/xavix.cpp
@@ -171,13 +171,13 @@ inline uint8_t xavix_device::mi_xavix::read(uint16_t adr)
// opcode reads
uint8_t xavix_device::mi_xavix::read_sync(uint16_t adr)
{
- return scache->read_byte(base->adr_with_codebank(adr));
+ return csprogram.read_byte(base->adr_with_codebank(adr));
}
// oprand reads
uint8_t xavix_device::mi_xavix::read_arg(uint16_t adr)
{
- return cache->read_byte(base->adr_with_codebank(adr));
+ return cprogram.read_byte(base->adr_with_codebank(adr));
}
// data writes
diff --git a/src/devices/cpu/m6800/m6800.cpp b/src/devices/cpu/m6800/m6800.cpp
index e6549dd8d27..7eab9292599 100644
--- a/src/devices/cpu/m6800/m6800.cpp
+++ b/src/devices/cpu/m6800/m6800.cpp
@@ -122,26 +122,26 @@ TODO:
/****************************************************************************/
/* Read a byte from given memory location */
/****************************************************************************/
-#define RM(Addr) ((unsigned)m_program->read_byte(Addr))
+#define RM(Addr) (m_program.read_byte(Addr))
/****************************************************************************/
/* Write a byte to given memory location */
/****************************************************************************/
-#define WM(Addr,Value) (m_program->write_byte(Addr,Value))
+#define WM(Addr,Value) (m_program.write_byte(Addr,Value))
/****************************************************************************/
/* M6800_RDOP() is identical to M6800_RDMEM() except it is used for reading */
/* opcodes. In case of system with memory mapped I/O, this function can be */
/* used to greatly speed up emulation */
/****************************************************************************/
-#define M_RDOP(Addr) ((unsigned)m_opcodes_cache->read_byte(Addr))
+#define M_RDOP(Addr) (m_copcodes.read_byte(Addr))
/****************************************************************************/
/* M6800_RDOP_ARG() is identical to M6800_RDOP() but it's used for reading */
/* opcode arguments. This difference can be used to support systems that */
/* use different encoding mechanisms for opcodes and opcode arguments */
/****************************************************************************/
-#define M_RDOP_ARG(Addr) ((unsigned)m_cache->read_byte(Addr))
+#define M_RDOP_ARG(Addr) (m_cprogram.read_byte(Addr))
/* macros to access memory */
#define IMMBYTE(b) b = M_RDOP_ARG(PCD); PC++
@@ -546,10 +546,9 @@ void m6800_cpu_device::EAT_CYCLES()
void m6800_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
- m_opcodes = has_space(AS_OPCODES) ? &space(AS_OPCODES) : m_program;
- m_opcodes_cache = m_opcodes->cache<0, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cprogram);
+ space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).cache(m_copcodes);
+ space(AS_PROGRAM).specific(m_program);
m_pc.d = 0;
m_s.d = 0;
diff --git a/src/devices/cpu/m6800/m6800.h b/src/devices/cpu/m6800/m6800.h
index 272b436a5f7..1601a62b798 100644
--- a/src/devices/cpu/m6800/m6800.h
+++ b/src/devices/cpu/m6800/m6800.h
@@ -82,8 +82,8 @@ protected:
uint8_t m_irq_state[3]; /* IRQ line state [IRQ1,TIN,SC1] */
/* Memory spaces */
- address_space *m_program, *m_opcodes;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache, *m_opcodes_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_cprogram, m_copcodes;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_program;
const op_func *m_insn;
const uint8_t *m_cycles; /* clock cycle of instruction table */
diff --git a/src/devices/cpu/m68000/m68000.h b/src/devices/cpu/m68000/m68000.h
index 58d6683d599..f9e5d2c2d26 100644
--- a/src/devices/cpu/m68000/m68000.h
+++ b/src/devices/cpu/m68000/m68000.h
@@ -260,6 +260,13 @@ protected:
or other side effects to be implemented */
address_space *m_program, *m_oprogram, *m_cpu_space;
+
+ memory_access<24, 0, 0, ENDIANNESS_BIG>::cache m_oprogram8;
+ memory_access<24, 1, 0, ENDIANNESS_BIG>::cache m_oprogram16;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_oprogram32;
+ memory_access<24, 0, 0, ENDIANNESS_BIG>::specific m_program8;
+ memory_access<24, 1, 0, ENDIANNESS_BIG>::specific m_program16;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_program32;
/* Redirect memory calls */
diff --git a/src/devices/cpu/m68000/m68kcpu.cpp b/src/devices/cpu/m68000/m68kcpu.cpp
index a95025507ca..5088f184e43 100644
--- a/src/devices/cpu/m68000/m68kcpu.cpp
+++ b/src/devices/cpu/m68000/m68kcpu.cpp
@@ -1305,16 +1305,16 @@ void m68000_base_device::init8(address_space &space, address_space &ospace)
{
m_space = &space;
m_ospace = &ospace;
- auto ocache = ospace.cache<0, 0, ENDIANNESS_BIG>();
- auto pspec = space.specific<0, 0, ENDIANNESS_BIG>();
+ ospace.cache(m_oprogram8);
+ space.specific(m_program8);
- m_readimm16 = [ocache](offs_t address) -> u16 { return ocache->read_word(address); };
- m_read8 = [pspec](offs_t address) -> u8 { return pspec->read_byte(address); };
- m_read16 = [pspec](offs_t address) -> u16 { return pspec->read_word(address); };
- m_read32 = [pspec](offs_t address) -> u32 { return pspec->read_dword(address); };
- m_write8 = [pspec](offs_t address, u8 data) { pspec->write_byte(address, data); };
- m_write16 = [pspec](offs_t address, u16 data) { pspec->write_word(address, data); };
- m_write32 = [pspec](offs_t address, u32 data) { pspec->write_dword(address, data); };
+ m_readimm16 = [this](offs_t address) -> u16 { return m_oprogram8.read_word(address); };
+ m_read8 = [this](offs_t address) -> u8 { return m_program8.read_byte(address); };
+ m_read16 = [this](offs_t address) -> u16 { return m_program8.read_word(address); };
+ m_read32 = [this](offs_t address) -> u32 { return m_program8.read_dword(address); };
+ m_write8 = [this](offs_t address, u8 data) { m_program8.write_byte(address, data); };
+ m_write16 = [this](offs_t address, u16 data) { m_program8.write_word(address, data); };
+ m_write32 = [this](offs_t address, u32 data) { m_program8.write_dword(address, data); };
}
/****************************************************************************
@@ -1325,16 +1325,16 @@ void m68000_base_device::init16(address_space &space, address_space &ospace)
{
m_space = &space;
m_ospace = &ospace;
- auto ocache = ospace.cache<1, 0, ENDIANNESS_BIG>();
- auto pspec = space.specific<1, 0, ENDIANNESS_BIG>();
+ ospace.cache(m_oprogram16);
+ space.specific(m_program16);
- m_readimm16 = [ocache](offs_t address) -> u16 { return ocache->read_word(address); };
- m_read8 = [pspec](offs_t address) -> u8 { return pspec->read_byte(address); };
- m_read16 = [pspec](offs_t address) -> u16 { return pspec->read_word(address); };
- m_read32 = [pspec](offs_t address) -> u32 { return pspec->read_dword(address); };
- m_write8 = [pspec](offs_t address, u8 data) { pspec->write_word(address & ~1, data | (data << 8), address & 1 ? 0x00ff : 0xff00); };
- m_write16 = [pspec](offs_t address, u16 data) { pspec->write_word(address, data); };
- m_write32 = [pspec](offs_t address, u32 data) { pspec->write_dword(address, data); };
+ m_readimm16 = [this](offs_t address) -> u16 { return m_oprogram16.read_word(address); };
+ m_read8 = [this](offs_t address) -> u8 { return m_program16.read_byte(address); };
+ m_read16 = [this](offs_t address) -> u16 { return m_program16.read_word(address); };
+ m_read32 = [this](offs_t address) -> u32 { return m_program16.read_dword(address); };
+ m_write8 = [this](offs_t address, u8 data) { m_program16.write_word(address & ~1, data | (data << 8), address & 1 ? 0x00ff : 0xff00); };
+ m_write16 = [this](offs_t address, u16 data) { m_program16.write_word(address, data); };
+ m_write32 = [this](offs_t address, u32 data) { m_program16.write_dword(address, data); };
}
/****************************************************************************
@@ -1350,55 +1350,55 @@ void m68000_base_device::init32(address_space &space, address_space &ospace)
{
m_space = &space;
m_ospace = &ospace;
- auto ocache = ospace.cache<2, 0, ENDIANNESS_BIG>();
- auto pspec = space.specific<2, 0, ENDIANNESS_BIG>();
-
- m_readimm16 = [ocache](offs_t address) -> u16 { return ocache->read_word(address); };
- m_read8 = [pspec](offs_t address) -> u8 { return pspec->read_byte(address); };
- m_read16 = [pspec](offs_t address) -> u16 { return pspec->read_word_unaligned(address); };
- m_read32 = [pspec](offs_t address) -> u32 { return pspec->read_dword_unaligned(address); };
- m_write8 = [pspec](offs_t address, u8 data) {
- pspec->write_dword(address & 0xfffffffcU, dword_from_byte(data), 0xff000000U >> 8 * (address & 3));
+ ospace.cache(m_oprogram32);
+ space.specific(m_program32);
+
+ m_readimm16 = [this](offs_t address) -> u16 { return m_oprogram32.read_word(address); };
+ m_read8 = [this](offs_t address) -> u8 { return m_program32.read_byte(address); };
+ m_read16 = [this](offs_t address) -> u16 { return m_program32.read_word_unaligned(address); };
+ m_read32 = [this](offs_t address) -> u32 { return m_program32.read_dword_unaligned(address); };
+ m_write8 = [this](offs_t address, u8 data) {
+ m_program32.write_dword(address & 0xfffffffcU, dword_from_byte(data), 0xff000000U >> 8 * (address & 3));
};
- m_write16 = [pspec](offs_t address, u16 data) {
+ m_write16 = [this](offs_t address, u16 data) {
switch (address & 3) {
case 0:
- pspec->write_dword(address, dword_from_word(data), 0xffff0000U);
+ m_program32.write_dword(address, dword_from_word(data), 0xffff0000U);
break;
case 1:
- pspec->write_dword(address - 1, dword_from_unaligned_word(data), 0x00ffff00);
+ m_program32.write_dword(address - 1, dword_from_unaligned_word(data), 0x00ffff00);
break;
case 2:
- pspec->write_dword(address - 2, dword_from_word(data), 0x0000ffff);
+ m_program32.write_dword(address - 2, dword_from_word(data), 0x0000ffff);
break;
case 3:
- pspec->write_dword(address - 3, dword_from_unaligned_word(data), 0x000000ff);
- pspec->write_dword(address + 1, dword_from_byte(data & 0x00ff), 0xff000000U);
+ m_program32.write_dword(address - 3, dword_from_unaligned_word(data), 0x000000ff);
+ m_program32.write_dword(address + 1, dword_from_byte(data & 0x00ff), 0xff000000U);
break;
}
};
- m_write32 = [pspec](offs_t address, u32 data) {
+ m_write32 = [this](offs_t address, u32 data) {
switch (address & 3) {
case 0:
- pspec->write_dword(address, data, 0xffffffffU);
+ m_program32.write_dword(address, data, 0xffffffffU);
break;
case 1:
- pspec->write_dword(address - 1, (data & 0xff000000U) | (data & 0xffffff00U) >> 8, 0x00ffffff);
- pspec->write_dword(address + 3, dword_from_byte(data & 0x000000ff), 0xff000000U);
+ m_program32.write_dword(address - 1, (data & 0xff000000U) | (data & 0xffffff00U) >> 8, 0x00ffffff);
+ m_program32.write_dword(address + 3, dword_from_byte(data & 0x000000ff), 0xff000000U);
break;
case 2:
- pspec->write_dword(address - 2, dword_from_word((data & 0xffff0000U) >> 16), 0x0000ffff);
- pspec->write_dword(address + 2, dword_from_word(data & 0x0000ffff), 0xffff0000U);
+ m_program32.write_dword(address - 2, dword_from_word((data & 0xffff0000U) >> 16), 0x0000ffff);
+ m_program32.write_dword(address + 2, dword_from_word(data & 0x0000ffff), 0xffff0000U);
break;
case 3:
- pspec->write_dword(address - 3, dword_from_unaligned_word((data & 0xffff0000U) >> 16), 0x000000ff);
- pspec->write_dword(address + 1, (data & 0x00ffffff) << 8 | (data & 0xff000000U) >> 24, 0xffffff00U);
+ m_program32.write_dword(address - 3, dword_from_unaligned_word((data & 0xffff0000U) >> 16), 0x000000ff);
+ m_program32.write_dword(address + 1, (data & 0x00ffffff) << 8 | (data & 0xff000000U) >> 24, 0xffffff00U);
break;
}
};
@@ -1409,45 +1409,45 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace)
{
m_space = &space;
m_ospace = &ospace;
- auto ocache = ospace.cache<2, 0, ENDIANNESS_BIG>();
- auto pspec = space.specific<2, 0, ENDIANNESS_BIG>();
+ ospace.cache(m_oprogram32);
+ space.specific(m_program32);
- m_readimm16 = [this, ocache](offs_t address) -> u16 {
+ m_readimm16 = [this](offs_t address) -> u16 {
if (m_pmmu_enabled) {
address = pmmu_translate_addr(address, 1);
if (m_mmu_tmp_buserror_occurred)
return ~0;
}
- return ocache->read_word(address);
+ return m_oprogram32.read_word(address);
};
- m_read8 = [this, pspec](offs_t address) -> u8 {
+ m_read8 = [this](offs_t address) -> u8 {
if (m_pmmu_enabled) {
address = pmmu_translate_addr(address, 1);
if (m_mmu_tmp_buserror_occurred)
return ~0;
}
- return pspec->read_byte(address);
+ return m_program32.read_byte(address);
};
- m_read16 = [this, pspec](offs_t address) -> u16 {
+ m_read16 = [this](offs_t address) -> u16 {
if (m_pmmu_enabled) {
u32 address0 = pmmu_translate_addr(address, 1);
if (m_mmu_tmp_buserror_occurred)
return ~0;
if (WORD_ALIGNED(address))
- return pspec->read_word(address0);
+ return m_program32.read_word(address0);
u32 address1 = pmmu_translate_addr(address + 1, 1);
if (m_mmu_tmp_buserror_occurred)
return ~0;
- u16 result = pspec->read_byte(address0) << 8;
- return result | pspec->read_byte(address1);
+ u16 result = m_program32.read_byte(address0) << 8;
+ return result | m_program32.read_byte(address1);
}
- return pspec->read_word_unaligned(address);
+ return m_program32.read_word_unaligned(address);
};
- m_read32 = [this, pspec](offs_t address) -> u32 {
+ m_read32 = [this](offs_t address) -> u32 {
if (m_pmmu_enabled) {
u32 address0 = pmmu_translate_addr(address, 1);
if (m_mmu_tmp_buserror_occurred)
@@ -1456,37 +1456,37 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace)
// not at page boundary; use default code
address = address0;
else if (DWORD_ALIGNED(address)) // 0
- return pspec->read_dword(address0);
+ return m_program32.read_dword(address0);
else {
u32 address2 = pmmu_translate_addr(address+2, 1);
if (m_mmu_tmp_buserror_occurred)
return ~0;
if (WORD_ALIGNED(address)) { // 2
- u32 result = pspec->read_word(address0) << 16;
- return result | pspec->read_word(address2);
+ u32 result = m_program32.read_word(address0) << 16;
+ return result | m_program32.read_word(address2);
}
u32 address1 = pmmu_translate_addr(address+1, 1);
u32 address3 = pmmu_translate_addr(address+3, 1);
if (m_mmu_tmp_buserror_occurred)
return ~0;
- u32 result = pspec->read_byte(address0) << 24;
- result |= pspec->read_word(address1) << 8;
- return result | pspec->read_byte(address3);
+ u32 result = m_program32.read_byte(address0) << 24;
+ result |= m_program32.read_word(address1) << 8;
+ return result | m_program32.read_byte(address3);
}
}
- return pspec->read_dword_unaligned(address);
+ return m_program32.read_dword_unaligned(address);
};
- m_write8 = [this, pspec](offs_t address, u8 data) {
+ m_write8 = [this](offs_t address, u8 data) {
if (m_pmmu_enabled) {
address = pmmu_translate_addr(address, 0);
if (m_mmu_tmp_buserror_occurred)
return;
}
- pspec->write_dword(address & 0xfffffffcU, dword_from_byte(data), 0xff000000U >> 8 * (address & 3));
+ m_program32.write_dword(address & 0xfffffffcU, dword_from_byte(data), 0xff000000U >> 8 * (address & 3));
};
- m_write16 = [this, pspec](offs_t address, u16 data) {
+ m_write16 = [this](offs_t address, u16 data) {
u32 address0 = address;
if (m_pmmu_enabled) {
address0 = pmmu_translate_addr(address0, 0);
@@ -1495,15 +1495,15 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace)
}
switch (address & 3) {
case 0:
- pspec->write_dword(address0, dword_from_word(data), 0xffff0000U);
+ m_program32.write_dword(address0, dword_from_word(data), 0xffff0000U);
break;
case 1:
- pspec->write_dword(address0 - 1, dword_from_unaligned_word(data), 0x00ffff00);
+ m_program32.write_dword(address0 - 1, dword_from_unaligned_word(data), 0x00ffff00);
break;
case 2:
- pspec->write_dword(address0 - 2, dword_from_word(data), 0x0000ffff);
+ m_program32.write_dword(address0 - 2, dword_from_word(data), 0x0000ffff);
break;
case 3:
@@ -1514,14 +1514,14 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace)
if (m_mmu_tmp_buserror_occurred)
return;
}
- pspec->write_dword(address0 - 3, dword_from_unaligned_word(data), 0x000000ff);
- pspec->write_dword(address1, dword_from_byte(data & 0x00ff), 0xff000000U);
+ m_program32.write_dword(address0 - 3, dword_from_unaligned_word(data), 0x000000ff);
+ m_program32.write_dword(address1, dword_from_byte(data & 0x00ff), 0xff000000U);
break;
}
}
};
- m_write32 = [this, pspec](offs_t address, u32 data) {
+ m_write32 = [this](offs_t address, u32 data) {
u32 address0 = address;
if (m_pmmu_enabled) {
address0 = pmmu_translate_addr(address0, 0);
@@ -1530,7 +1530,7 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace)
}
switch (address & 3) {
case 0:
- pspec->write_dword(address0, data, 0xffffffffU);
+ m_program32.write_dword(address0, data, 0xffffffffU);
break;
case 1:
@@ -1541,8 +1541,8 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace)
if (m_mmu_tmp_buserror_occurred)
return;
}
- pspec->write_dword(address0 - 1, (data & 0xff000000U) | (data & 0xffffff00U) >> 8, 0x00ffffff);
- pspec->write_dword(address3, dword_from_byte(data & 0x000000ff), 0xff000000U);
+ m_program32.write_dword(address0 - 1, (data & 0xff000000U) | (data & 0xffffff00U) >> 8, 0x00ffffff);
+ m_program32.write_dword(address3, dword_from_byte(data & 0x000000ff), 0xff000000U);
break;
}
@@ -1554,8 +1554,8 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace)
if (m_mmu_tmp_buserror_occurred)
return;
}
- pspec->write_dword(address0 - 2, dword_from_word((data & 0xffff0000U) >> 16), 0x0000ffff);
- pspec->write_dword(address2, dword_from_word(data & 0x0000ffff), 0xffff0000U);
+ m_program32.write_dword(address0 - 2, dword_from_word((data & 0xffff0000U) >> 16), 0x0000ffff);
+ m_program32.write_dword(address2, dword_from_word(data & 0x0000ffff), 0xffff0000U);
break;
}
@@ -1567,8 +1567,8 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace)
if (m_mmu_tmp_buserror_occurred)
return;
}
- pspec->write_dword(address0 - 3, dword_from_unaligned_word((data & 0xffff0000U) >> 16), 0x000000ff);
- pspec->write_dword(address1, (data & 0x00ffffff) << 8 | (data & 0xff000000U) >> 24, 0xffffff00U);
+ m_program32.write_dword(address0 - 3, dword_from_unaligned_word((data & 0xffff0000U) >> 16), 0x000000ff);
+ m_program32.write_dword(address1, (data & 0x00ffffff) << 8 | (data & 0xff000000U) >> 24, 0xffffff00U);
break;
}
}
@@ -1579,78 +1579,78 @@ void m68000_base_device::init32hmmu(address_space &space, address_space &ospace)
{
m_space = &space;
m_ospace = &ospace;
- auto ocache = ospace.cache<2, 0, ENDIANNESS_BIG>();
- auto pspec = space.specific<2, 0, ENDIANNESS_BIG>();
+ ospace.cache(m_oprogram32);
+ space.specific(m_program32);
- m_readimm16 = [this, ocache](offs_t address) -> u16 {
+ m_readimm16 = [this](offs_t address) -> u16 {
if (m_hmmu_enabled)
address = hmmu_translate_addr(address);
- return ocache->read_word(address);
+ return m_oprogram32.read_word(address);
};
- m_read8 = [this, pspec](offs_t address) -> u8 {
+ m_read8 = [this](offs_t address) -> u8 {
if (m_hmmu_enabled)
address = hmmu_translate_addr(address);
- return pspec->read_byte(address);
+ return m_program32.read_byte(address);
};
- m_read16 = [this, pspec](offs_t address) -> u16 {
+ m_read16 = [this](offs_t address) -> u16 {
if (m_hmmu_enabled)
address = hmmu_translate_addr(address);
if (WORD_ALIGNED(address))
- return pspec->read_word(address);
- u16 result = pspec->read_byte(address) << 8;
- return result | pspec->read_byte(address + 1);
+ return m_program32.read_word(address);
+ u16 result = m_program32.read_byte(address) << 8;
+ return result | m_program32.read_byte(address + 1);
};
- m_read32 = [this, pspec](offs_t address) -> u32 {
+ m_read32 = [this](offs_t address) -> u32 {
if (m_hmmu_enabled)
address = hmmu_translate_addr(address);
if (DWORD_ALIGNED(address))
- return pspec->read_dword(address);
+ return m_program32.read_dword(address);
if (WORD_ALIGNED(address)) {
- u32 result = pspec->read_word(address) << 16;
- return result | pspec->read_word(address + 2);
+ u32 result = m_program32.read_word(address) << 16;
+ return result | m_program32.read_word(address + 2);
}
- u32 result = pspec->read_byte(address) << 24;
- result |= pspec->read_word(address + 1) << 8;
- return result | pspec->read_byte(address + 3);
+ u32 result = m_program32.read_byte(address) << 24;
+ result |= m_program32.read_word(address + 1) << 8;
+ return result | m_program32.read_byte(address + 3);
};
- m_write8 = [this, pspec](offs_t address, u8 data) {
+ m_write8 = [this](offs_t address, u8 data) {
if (m_hmmu_enabled)
address = hmmu_translate_addr(address);
- pspec->write_byte(address, data);
+ m_program32.write_byte(address, data);
};
- m_write16 = [this, pspec](offs_t address, u16 data) {
+ m_write16 = [this](offs_t address, u16 data) {
if (m_hmmu_enabled)
address = hmmu_translate_addr(address);
if (WORD_ALIGNED(address)) {
- pspec->write_word(address, data);
+ m_program32.write_word(address, data);
return;
}
- pspec->write_byte(address, data >> 8);
- pspec->write_byte(address + 1, data);
+ m_program32.write_byte(address, data >> 8);
+ m_program32.write_byte(address + 1, data);
};
- m_write32 = [this, pspec](offs_t address, u32 data) {
+ m_write32 = [this](offs_t address, u32 data) {
if (m_hmmu_enabled)
address = hmmu_translate_addr(address);
if (DWORD_ALIGNED(address)) {
- pspec->write_dword(address, data);
+ m_program32.write_dword(address, data);
return;
}
if (WORD_ALIGNED(address)) {
- pspec->write_word(address, data >> 16);
- pspec->write_word(address + 2, data);
+ m_program32.write_word(address, data >> 16);
+ m_program32.write_word(address + 2, data);
return;
}
- pspec->write_byte(address, data >> 24);
- pspec->write_word(address + 1, data >> 8);
- pspec->write_byte(address + 3, data);
+ m_program32.write_byte(address, data >> 24);
+ m_program32.write_word(address + 1, data >> 8);
+ m_program32.write_byte(address + 3, data);
};
}
diff --git a/src/devices/cpu/m6805/6805ops.hxx b/src/devices/cpu/m6805/6805ops.hxx
index c0ff90eb32d..969be4e51e6 100644
--- a/src/devices/cpu/m6805/6805ops.hxx
+++ b/src/devices/cpu/m6805/6805ops.hxx
@@ -14,10 +14,10 @@ HNZC
*/
-#define OP_HANDLER(name) void m6805_base_device::name()
-#define OP_HANDLER_BIT(name) template <unsigned B> void m6805_base_device::name()
-#define OP_HANDLER_BRA(name) template <bool C> void m6805_base_device::name()
-#define OP_HANDLER_MODE(name) template <m6805_base_device::addr_mode M> void m6805_base_device::name()
+#define OP_HANDLER(name) template<bool big> void m6805_base_device::name()
+#define OP_HANDLER_BIT(name) template <bool big, unsigned B> void m6805_base_device::name()
+#define OP_HANDLER_BRA(name) template <bool big, bool C> void m6805_base_device::name()
+#define OP_HANDLER_MODE(name) template <bool big, m6805_base_device::addr_mode M> void m6805_base_device::name()
OP_HANDLER( illegal )
@@ -30,7 +30,7 @@ OP_HANDLER_BIT( brset )
{
u8 t, r;
DIRBYTE(r);
- immbyte(t);
+ immbyte<big>(t);
CLC;
if (BIT(r, B)) { SEC; PC += SIGNED(t); }
}
@@ -40,7 +40,7 @@ OP_HANDLER_BIT( brclr )
{
u8 t, r;
DIRBYTE(r);
- immbyte(t);
+ immbyte<big>(t);
SEC;
if (!BIT(r, B)) { CLC; PC += SIGNED(t); }
}
@@ -50,7 +50,7 @@ OP_HANDLER_BIT( bset )
{
u8 t;
DIRBYTE(t);
- wm(EAD, t | (u8(1) << B));
+ wm<big>(EAD, t | (u8(1) << B));
}
// $11/$13/$15/$17/$19/$1B/$1D/$1F BCLR direct ----
@@ -58,7 +58,7 @@ OP_HANDLER_BIT( bclr )
{
u8 t;
DIRBYTE(t);
- wm(EAD, t & ~(u8(1) << B));
+ wm<big>(EAD, t & ~(u8(1) << B));
}
// $20 BRA relative ----
@@ -103,7 +103,7 @@ OP_HANDLER_MODE( neg )
u16 const r = -t;
clr_nzc();
set_nzc8(r);
- wm(EAD, r);
+ wm<big>(EAD, r);
}
// $31 ILLEGAL
@@ -125,7 +125,7 @@ OP_HANDLER_MODE( com )
clr_nz();
set_nz8(t);
SEC;
- wm(EAD, t);
+ wm<big>(EAD, t);
}
// $34 LSR direct -0**
@@ -139,7 +139,7 @@ OP_HANDLER_MODE( lsr )
CC |= BIT(t, 0);
t >>= 1;
set_z8(t);
- wm(EAD, t);
+ wm<big>(EAD, t);
}
// $35 ILLEGAL
@@ -158,7 +158,7 @@ OP_HANDLER_MODE( ror )
CC |= BIT(t, 0);
r |= t >> 1;
set_nz8(r);
- wm(EAD, r);
+ wm<big>(EAD, r);
}
// $37 ASR direct -***
@@ -172,7 +172,7 @@ OP_HANDLER_MODE( asr )
CC |= BIT(t, 0);
t = (t >> 1) | (t & 0x80);
set_nz8(t);
- wm(EAD, t);
+ wm<big>(EAD, t);
}
// $38 LSL direct -***
@@ -185,7 +185,7 @@ OP_HANDLER_MODE( lsl )
u16 const r = u16(t) << 1;
clr_nzc();
set_nzc8(r);
- wm(EAD, r);
+ wm<big>(EAD, r);
}
// $39 ROL direct -***
@@ -198,7 +198,7 @@ OP_HANDLER_MODE( rol )
u16 const r = BIT(CC, 0) | (t << 1);
clr_nzc();
set_nzc8(r);
- wm(EAD, r);
+ wm<big>(EAD, r);
}
// $3a DEC direct -**-
@@ -210,7 +210,7 @@ OP_HANDLER_MODE( dec )
--t;
clr_nz();
set_nz8(t);
- wm(EAD, t);
+ wm<big>(EAD, t);
}
// $3b ILLEGAL
@@ -227,7 +227,7 @@ OP_HANDLER_MODE( inc )
++t;
clr_nz();
set_nz8(t);
- wm(EAD, t);
+ wm<big>(EAD, t);
}
// $3d TST direct -**-
@@ -253,7 +253,7 @@ OP_HANDLER_MODE( clr )
ARGADDR;
clr_nz();
SEZ;
- wm(EAD, 0);
+ wm<big>(EAD, 0);
}
// $40 NEGA inherent -***
@@ -480,16 +480,16 @@ OP_HANDLER( clrx )
// $80 RTI inherent ####
OP_HANDLER( rti )
{
- pullbyte(CC);
- pullbyte(A);
- pullbyte(X);
- pullword(m_pc);
+ pullbyte<big>(CC);
+ pullbyte<big>(A);
+ pullbyte<big>(X);
+ pullword<big>(m_pc);
}
// $81 RTS inherent ----
OP_HANDLER( rts )
{
- pullword(m_pc);
+ pullword<big>(m_pc);
}
// $82 ILLEGAL
@@ -497,12 +497,12 @@ OP_HANDLER( rts )
// $83 SWI absolute indirect ----
OP_HANDLER( swi )
{
- pushword(m_pc);
- pushbyte(m_x);
- pushbyte(m_a);
- pushbyte(m_cc);
+ pushword<big>(m_pc);
+ pushbyte<big>(m_x);
+ pushbyte<big>(m_a);
+ pushbyte<big>(m_cc);
SEI;
- rm16(m_params.m_swi_vector & m_params.m_vector_mask, m_pc);
+ rm16<big>(m_params.m_swi_vector & m_params.m_vector_mask, m_pc);
}
// $84 ILLEGAL
@@ -697,7 +697,7 @@ OP_HANDLER_MODE( sta )
clr_nz();
set_nz8(A);
ARGADDR;
- wm(EAD, A);
+ wm<big>(EAD, A);
}
// $a8 EORA immediate -**-
@@ -778,8 +778,8 @@ OP_HANDLER_MODE( jmp )
OP_HANDLER( bsr )
{
u8 t;
- immbyte(t);
- pushword(m_pc);
+ immbyte<big>(t);
+ pushword<big>(m_pc);
PC += SIGNED(t);
}
@@ -791,7 +791,7 @@ OP_HANDLER( bsr )
OP_HANDLER_MODE( jsr )
{
ARGADDR;
- pushword(m_pc);
+ pushword<big>(m_pc);
PC = EA;
}
@@ -819,5 +819,5 @@ OP_HANDLER_MODE( stx )
clr_nz();
set_nz8(X);
ARGADDR;
- wm(EAD, X);
+ wm<big>(EAD, X);
}
diff --git a/src/devices/cpu/m6805/m6805.cpp b/src/devices/cpu/m6805/m6805.cpp
index e0933a1af54..4e52a5631ec 100644
--- a/src/devices/cpu/m6805/m6805.cpp
+++ b/src/devices/cpu/m6805/m6805.cpp
@@ -41,23 +41,26 @@
#include <algorithm>
-#define OP(name) (&m6805_base_device::name)
-#define OP_T(name) (&m6805_base_device::name<true>)
-#define OP_F(name) (&m6805_base_device::name<false>)
-#define OP_IM(name) (&m6805_base_device::name<addr_mode::IM>)
-#define OP_DI(name) (&m6805_base_device::name<addr_mode::DI>)
-#define OP_EX(name) (&m6805_base_device::name<addr_mode::EX>)
-#define OP_IX(name) (&m6805_base_device::name<addr_mode::IX>)
-#define OP_IX1(name) (&m6805_base_device::name<addr_mode::IX1>)
-#define OP_IX2(name) (&m6805_base_device::name<addr_mode::IX2>)
-
-const m6805_base_device::op_handler_table m6805_base_device::s_hmos_ops =
+#define OP(name) (&m6805_base_device::name<big>)
+#define OPN(name,n) (&m6805_base_device::name<big, n>)
+#define OP_T(name) (&m6805_base_device::name<big, true>)
+#define OP_F(name) (&m6805_base_device::name<big, false>)
+#define OP_IM(name) (&m6805_base_device::name<big, addr_mode::IM>)
+#define OP_DI(name) (&m6805_base_device::name<big, addr_mode::DI>)
+#define OP_EX(name) (&m6805_base_device::name<big, addr_mode::EX>)
+#define OP_IX(name) (&m6805_base_device::name<big, addr_mode::IX>)
+#define OP_IX1(name) (&m6805_base_device::name<big, addr_mode::IX1>)
+#define OP_IX2(name) (&m6805_base_device::name<big, addr_mode::IX2>)
+
+#define big false
+
+const m6805_base_device::op_handler_table m6805_base_device::s_hmos_s_ops =
{
/* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
- /* 0 */ OP(brset<0>),OP(brclr<0>),OP(brset<1>),OP(brclr<1>),OP(brset<2>),OP(brclr<2>),OP(brset<3>),OP(brclr<3>),
- OP(brset<4>),OP(brclr<4>),OP(brset<5>),OP(brclr<5>),OP(brset<6>),OP(brclr<6>),OP(brset<7>),OP(brclr<7>),
- /* 1 */ OP(bset<0>), OP(bclr<0>), OP(bset<1>), OP(bclr<1>), OP(bset<2>), OP(bclr<2>), OP(bset<3>), OP(bclr<3>),
- OP(bset<4>), OP(bclr<4>), OP(bset<5>), OP(bclr<5>), OP(bset<6>), OP(bclr<6>), OP(bset<7>), OP(bclr<7>),
+ /* 0 */ OPN(brset,0),OPN(brclr,0),OPN(brset,1),OPN(brclr,1),OPN(brset,2),OPN(brclr,2),OPN(brset,3),OPN(brclr,3),
+ OPN(brset,4),OPN(brclr,4),OPN(brset,5),OPN(brclr,5),OPN(brset,6),OPN(brclr,6),OPN(brset,7),OPN(brclr,7),
+ /* 1 */ OPN(bset,0), OPN(bclr,0), OPN(bset,1), OPN(bclr,1), OPN(bset,2), OPN(bclr,2), OPN(bset,3), OPN(bclr,3),
+ OPN(bset,4), OPN(bclr,4), OPN(bset,5), OPN(bclr,5), OPN(bset,6), OPN(bclr,6), OPN(bset,7), OPN(bclr,7),
/* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP_T(bil), OP_F(bil),
/* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
@@ -88,13 +91,90 @@ const m6805_base_device::op_handler_table m6805_base_device::s_hmos_ops =
OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
};
-const m6805_base_device::op_handler_table m6805_base_device::s_cmos_ops =
+const m6805_base_device::op_handler_table m6805_base_device::s_hc_s_ops =
{
/* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
- /* 0 */ OP(brset<0>),OP(brclr<0>),OP(brset<1>),OP(brclr<1>),OP(brset<2>),OP(brclr<2>),OP(brset<3>),OP(brclr<3>),
- OP(brset<4>),OP(brclr<4>),OP(brset<5>),OP(brclr<5>),OP(brset<6>),OP(brclr<6>),OP(brset<7>),OP(brclr<7>),
- /* 1 */ OP(bset<0>), OP(bclr<0>), OP(bset<1>), OP(bclr<1>), OP(bset<2>), OP(bclr<2>), OP(bset<3>), OP(bclr<3>),
- OP(bset<4>), OP(bclr<4>), OP(bset<5>), OP(bclr<5>), OP(bset<6>), OP(bclr<6>), OP(bset<7>), OP(bclr<7>),
+ /* 0 */ OPN(brset,0),OPN(brclr,0),OPN(brset,1),OPN(brclr,1),OPN(brset,2),OPN(brclr,2),OPN(brset,3),OPN(brclr,3),
+ OPN(brset,4),OPN(brclr,4),OPN(brset,5),OPN(brclr,5),OPN(brset,6),OPN(brclr,6),OPN(brset,7),OPN(brclr,7),
+ /* 1 */ OPN(bset,0), OPN(bclr,0), OPN(bset,1), OPN(bclr,1), OPN(bset,2), OPN(bclr,2), OPN(bset,3), OPN(bclr,3),
+ OPN(bset,4), OPN(bclr,4), OPN(bset,5), OPN(bclr,5), OPN(bset,6), OPN(bclr,6), OPN(bset,7), OPN(bclr,7),
+ /* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
+ OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP_T(bil), OP_F(bil),
+ /* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
+ OP_DI(lsl), OP_DI(rol), OP_DI(dec), OP(illegal), OP_DI(inc), OP_DI(tst), OP(illegal), OP_DI(clr),
+ /* 4 */ OP(nega), OP(illegal), OP(mul), OP(coma), OP(lsra), OP(illegal), OP(rora), OP(asra),
+ OP(lsla), OP(rola), OP(deca), OP(illegal), OP(inca), OP(tsta), OP(illegal), OP(clra),
+ /* 5 */ OP(negx), OP(illegal), OP(illegal), OP(comx), OP(lsrx), OP(illegal), OP(rorx), OP(asrx),
+ OP(lslx), OP(rolx), OP(decx), OP(illegal), OP(incx), OP(tstx), OP(illegal), OP(clrx),
+ /* 6 */ OP_IX1(neg), OP(illegal), OP(illegal), OP_IX1(com), OP_IX1(lsr), OP(illegal), OP_IX1(ror), OP_IX1(asr),
+ OP_IX1(lsl), OP_IX1(rol), OP_IX1(dec), OP(illegal), OP_IX1(inc), OP_IX1(tst), OP(illegal), OP_IX1(clr),
+ /* 7 */ OP_IX(neg), OP(illegal), OP(illegal), OP_IX(com), OP_IX(lsr), OP(illegal), OP_IX(ror), OP_IX(asr),
+ OP_IX(lsl), OP_IX(rol), OP_IX(dec), OP(illegal), OP_IX(inc), OP_IX(tst), OP(illegal), OP_IX(clr),
+ /* 8 */ OP(rti), OP(rts), OP(illegal), OP(swi), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(stop), OP(wait),
+ /* 9 */ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(tax),
+ OP(clc), OP(sec), OP(cli), OP(sei), OP(rsp), OP(nop), OP(illegal), OP(txa),
+ /* A */ OP_IM(suba), OP_IM(cmpa), OP_IM(sbca), OP_IM(cpx), OP_IM(anda), OP_IM(bita), OP_IM(lda), OP(illegal),
+ OP_IM(eora), OP_IM(adca), OP_IM(ora), OP_IM(adda), OP(illegal), OP(bsr), OP_IM(ldx), OP(illegal),
+ /* B */ OP_DI(suba), OP_DI(cmpa), OP_DI(sbca), OP_DI(cpx), OP_DI(anda), OP_DI(bita), OP_DI(lda), OP_DI(sta),
+ OP_DI(eora), OP_DI(adca), OP_DI(ora), OP_DI(adda), OP_DI(jmp), OP_DI(jsr), OP_DI(ldx), OP_DI(stx),
+ /* C */ OP_EX(suba), OP_EX(cmpa), OP_EX(sbca), OP_EX(cpx), OP_EX(anda), OP_EX(bita), OP_EX(lda), OP_EX(sta),
+ OP_EX(eora), OP_EX(adca), OP_EX(ora), OP_EX(adda), OP_EX(jmp), OP_EX(jsr), OP_EX(ldx), OP_EX(stx),
+ /* D */ OP_IX2(suba),OP_IX2(cmpa),OP_IX2(sbca),OP_IX2(cpx), OP_IX2(anda),OP_IX2(bita),OP_IX2(lda), OP_IX2(sta),
+ OP_IX2(eora),OP_IX2(adca),OP_IX2(ora), OP_IX2(adda),OP_IX2(jmp), OP_IX2(jsr), OP_IX2(ldx), OP_IX2(stx),
+ /* E */ OP_IX1(suba),OP_IX1(cmpa),OP_IX1(sbca),OP_IX1(cpx), OP_IX1(anda),OP_IX1(bita),OP_IX1(lda), OP_IX1(sta),
+ OP_IX1(eora),OP_IX1(adca),OP_IX1(ora), OP_IX1(adda),OP_IX1(jmp), OP_IX1(jsr), OP_IX1(ldx), OP_IX1(stx),
+ /* F */ OP_IX(suba), OP_IX(cmpa), OP_IX(sbca), OP_IX(cpx), OP_IX(anda), OP_IX(bita), OP_IX(lda), OP_IX(sta),
+ OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
+};
+
+#undef big
+#define big true
+
+const m6805_base_device::op_handler_table m6805_base_device::s_hmos_b_ops =
+{
+ /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
+ /* 0 */ OPN(brset,0),OPN(brclr,0),OPN(brset,1),OPN(brclr,1),OPN(brset,2),OPN(brclr,2),OPN(brset,3),OPN(brclr,3),
+ OPN(brset,4),OPN(brclr,4),OPN(brset,5),OPN(brclr,5),OPN(brset,6),OPN(brclr,6),OPN(brset,7),OPN(brclr,7),
+ /* 1 */ OPN(bset,0), OPN(bclr,0), OPN(bset,1), OPN(bclr,1), OPN(bset,2), OPN(bclr,2), OPN(bset,3), OPN(bclr,3),
+ OPN(bset,4), OPN(bclr,4), OPN(bset,5), OPN(bclr,5), OPN(bset,6), OPN(bclr,6), OPN(bset,7), OPN(bclr,7),
+ /* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
+ OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP_T(bil), OP_F(bil),
+ /* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
+ OP_DI(lsl), OP_DI(rol), OP_DI(dec), OP(illegal), OP_DI(inc), OP_DI(tst), OP(illegal), OP_DI(clr),
+ /* 4 */ OP(nega), OP(illegal), OP(illegal), OP(coma), OP(lsra), OP(illegal), OP(rora), OP(asra),
+ OP(lsla), OP(rola), OP(deca), OP(illegal), OP(inca), OP(tsta), OP(illegal), OP(clra),
+ /* 5 */ OP(negx), OP(illegal), OP(illegal), OP(comx), OP(lsrx), OP(illegal), OP(rorx), OP(asrx),
+ OP(lslx), OP(rolx), OP(decx), OP(illegal), OP(incx), OP(tstx), OP(illegal), OP(clrx),
+ /* 6 */ OP_IX1(neg), OP(illegal), OP(illegal), OP_IX1(com), OP_IX1(lsr), OP(illegal), OP_IX1(ror), OP_IX1(asr),
+ OP_IX1(lsl), OP_IX1(rol), OP_IX1(dec), OP(illegal), OP_IX1(inc), OP_IX1(tst), OP(illegal), OP_IX1(clr),
+ /* 7 */ OP_IX(neg), OP(illegal), OP(illegal), OP_IX(com), OP_IX(lsr), OP(illegal), OP_IX(ror), OP_IX(asr),
+ OP_IX(lsl), OP_IX(rol), OP_IX(dec), OP(illegal), OP_IX(inc), OP_IX(tst), OP(illegal), OP_IX(clr),
+ /* 8 */ OP(rti), OP(rts), OP(illegal), OP(swi), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ /* 9 */ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(tax),
+ OP(clc), OP(sec), OP(cli), OP(sei), OP(rsp), OP(nop), OP(illegal), OP(txa),
+ /* A */ OP_IM(suba), OP_IM(cmpa), OP_IM(sbca), OP_IM(cpx), OP_IM(anda), OP_IM(bita), OP_IM(lda), OP(illegal),
+ OP_IM(eora), OP_IM(adca), OP_IM(ora), OP_IM(adda), OP(illegal), OP(bsr), OP_IM(ldx), OP(illegal),
+ /* B */ OP_DI(suba), OP_DI(cmpa), OP_DI(sbca), OP_DI(cpx), OP_DI(anda), OP_DI(bita), OP_DI(lda), OP_DI(sta),
+ OP_DI(eora), OP_DI(adca), OP_DI(ora), OP_DI(adda), OP_DI(jmp), OP_DI(jsr), OP_DI(ldx), OP_DI(stx),
+ /* C */ OP_EX(suba), OP_EX(cmpa), OP_EX(sbca), OP_EX(cpx), OP_EX(anda), OP_EX(bita), OP_EX(lda), OP_EX(sta),
+ OP_EX(eora), OP_EX(adca), OP_EX(ora), OP_EX(adda), OP_EX(jmp), OP_EX(jsr), OP_EX(ldx), OP_EX(stx),
+ /* D */ OP_IX2(suba),OP_IX2(cmpa),OP_IX2(sbca),OP_IX2(cpx), OP_IX2(anda),OP_IX2(bita),OP_IX2(lda), OP_IX2(sta),
+ OP_IX2(eora),OP_IX2(adca),OP_IX2(ora), OP_IX2(adda),OP_IX2(jmp), OP_IX2(jsr), OP_IX2(ldx), OP_IX2(stx),
+ /* E */ OP_IX1(suba),OP_IX1(cmpa),OP_IX1(sbca),OP_IX1(cpx), OP_IX1(anda),OP_IX1(bita),OP_IX1(lda), OP_IX1(sta),
+ OP_IX1(eora),OP_IX1(adca),OP_IX1(ora), OP_IX1(adda),OP_IX1(jmp), OP_IX1(jsr), OP_IX1(ldx), OP_IX1(stx),
+ /* F */ OP_IX(suba), OP_IX(cmpa), OP_IX(sbca), OP_IX(cpx), OP_IX(anda), OP_IX(bita), OP_IX(lda), OP_IX(sta),
+ OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
+};
+
+const m6805_base_device::op_handler_table m6805_base_device::s_cmos_b_ops =
+{
+ /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
+ /* 0 */ OPN(brset,0),OPN(brclr,0),OPN(brset,1),OPN(brclr,1),OPN(brset,2),OPN(brclr,2),OPN(brset,3),OPN(brclr,3),
+ OPN(brset,4),OPN(brclr,4),OPN(brset,5),OPN(brclr,5),OPN(brset,6),OPN(brclr,6),OPN(brset,7),OPN(brclr,7),
+ /* 1 */ OPN(bset,0), OPN(bclr,0), OPN(bset,1), OPN(bclr,1), OPN(bset,2), OPN(bclr,2), OPN(bset,3), OPN(bclr,3),
+ OPN(bset,4), OPN(bclr,4), OPN(bset,5), OPN(bclr,5), OPN(bset,6), OPN(bclr,6), OPN(bset,7), OPN(bclr,7),
/* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP_T(bil), OP_F(bil),
/* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
@@ -125,13 +205,13 @@ const m6805_base_device::op_handler_table m6805_base_device::s_cmos_ops =
OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
};
-const m6805_base_device::op_handler_table m6805_base_device::s_hc_ops =
+const m6805_base_device::op_handler_table m6805_base_device::s_hc_b_ops =
{
/* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
- /* 0 */ OP(brset<0>),OP(brclr<0>),OP(brset<1>),OP(brclr<1>),OP(brset<2>),OP(brclr<2>),OP(brset<3>),OP(brclr<3>),
- OP(brset<4>),OP(brclr<4>),OP(brset<5>),OP(brclr<5>),OP(brset<6>),OP(brclr<6>),OP(brset<7>),OP(brclr<7>),
- /* 1 */ OP(bset<0>), OP(bclr<0>), OP(bset<1>), OP(bclr<1>), OP(bset<2>), OP(bclr<2>), OP(bset<3>), OP(bclr<3>),
- OP(bset<4>), OP(bclr<4>), OP(bset<5>), OP(bclr<5>), OP(bset<6>), OP(bclr<6>), OP(bset<7>), OP(bclr<7>),
+ /* 0 */ OPN(brset,0),OPN(brclr,0),OPN(brset,1),OPN(brclr,1),OPN(brset,2),OPN(brclr,2),OPN(brset,3),OPN(brclr,3),
+ OPN(brset,4),OPN(brclr,4),OPN(brset,5),OPN(brclr,5),OPN(brset,6),OPN(brclr,6),OPN(brset,7),OPN(brclr,7),
+ /* 1 */ OPN(bset,0), OPN(bclr,0), OPN(bset,1), OPN(bclr,1), OPN(bset,2), OPN(bclr,2), OPN(bset,3), OPN(bclr,3),
+ OPN(bset,4), OPN(bclr,4), OPN(bset,5), OPN(bclr,5), OPN(bset,6), OPN(bclr,6), OPN(bset,7), OPN(bclr,7),
/* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP_T(bil), OP_F(bil),
/* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
@@ -162,6 +242,7 @@ const m6805_base_device::op_handler_table m6805_base_device::s_hc_ops =
OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
};
+#undef big
const m6805_base_device::cycle_count_table m6805_base_device::s_hmos_cycles =
{
@@ -262,8 +343,13 @@ m6805_base_device::m6805_base_device(
void m6805_base_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
+ if (m_params.m_addr_width > 13) {
+ space(AS_PROGRAM).cache(m_cprogram16);
+ space(AS_PROGRAM).specific(m_program16);
+ } else {
+ space(AS_PROGRAM).cache(m_cprogram13);
+ space(AS_PROGRAM).specific(m_program13);
+ }
// get the minimum not including the zero placeholders for illegal instructions
m_min_cycles = *std::min_element(
@@ -314,7 +400,10 @@ void m6805_base_device::device_reset()
/* IRQ disabled */
SEI;
- rm16(0xfffe & m_params.m_vector_mask, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(0xfffe & m_params.m_vector_mask, m_pc);
+ else
+ rm16<false>(0xfffe & m_params.m_vector_mask, m_pc);
}
@@ -363,7 +452,10 @@ bool m6805_base_device::test_il()
void m6805_base_device::interrupt_vector()
{
- rm16(0xfffa & m_params.m_vector_mask, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(0xfffa & m_params.m_vector_mask, m_pc);
+ else
+ rm16<false>(0xfffa & m_params.m_vector_mask, m_pc);
}
/* Generate interrupts */
@@ -375,15 +467,27 @@ void m6805_base_device::interrupt()
if (BIT(m_pending_interrupts, HD63705_INT_NMI))
{
- pushword(m_pc);
- pushbyte(m_x);
- pushbyte(m_a);
- pushbyte(m_cc);
+ if (m_params.m_addr_width > 13) {
+ pushword<true>(m_pc);
+ pushbyte<true>(m_x);
+ pushbyte<true>(m_a);
+ pushbyte<true>(m_cc);
+ }
+ else
+ {
+ pushword<false>(m_pc);
+ pushbyte<false>(m_x);
+ pushbyte<false>(m_a);
+ pushbyte<false>(m_cc);
+ }
SEI;
/* no vectors supported, just do the callback to clear irq_state if needed */
standard_irq_callback(0);
- rm16(0x1ffc, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(0x1ffc, m_pc);
+ else
+ rm16<false>(0x1ffc, m_pc);
m_pending_interrupts &= ~(1 << HD63705_INT_NMI);
m_icount -= 11;
@@ -394,10 +498,19 @@ void m6805_base_device::interrupt()
if ((CC & IFLAG) == 0)
{
/* standard IRQ */
- pushword(m_pc);
- pushbyte(m_x);
- pushbyte(m_a);
- pushbyte(m_cc);
+ if (m_params.m_addr_width > 13) {
+ pushword<true>(m_pc);
+ pushbyte<true>(m_x);
+ pushbyte<true>(m_a);
+ pushbyte<true>(m_cc);
+ }
+ else
+ {
+ pushword<false>(m_pc);
+ pushbyte<false>(m_x);
+ pushbyte<false>(m_a);
+ pushbyte<false>(m_cc);
+ }
SEI;
/* no vectors supported, just do the callback to clear irq_state if needed */
standard_irq_callback(0);
@@ -495,7 +608,7 @@ void m6805_base_device::execute_run()
debugger_instruction_hook(PC);
- u8 const ireg = rdop(PC++);
+ u8 const ireg = m_params.m_addr_width > 13 ? rdop<true>(PC++) : rdop<false>(PC++);
(this->*m_params.m_ops[ireg])();
m_icount -= m_params.m_cycles[ireg];
@@ -528,7 +641,7 @@ m68hc05eg_device::m68hc05eg_device(const machine_config &mconfig, const char *ta
owner,
clock,
M68HC05EG,
- { s_hmos_ops, s_hmos_cycles, 13, 0x00ff, 0x00c0, 0xfffc }) // completely wrong, but it preserves existing behaviour
+ { s_hmos_s_ops, s_hmos_cycles, 13, 0x00ff, 0x00c0, 0xfffc }) // completely wrong, but it preserves existing behaviour
{
}
@@ -536,7 +649,7 @@ void m68hc05eg_device::device_reset()
{
m6805_base_device::device_reset();
- rm16(0x1ffe, m_pc);
+ rm16<false>(0x1ffe, m_pc);
}
void m68hc05eg_device::interrupt_vector()
@@ -544,17 +657,17 @@ void m68hc05eg_device::interrupt_vector()
if (BIT(m_pending_interrupts, M68HC05EG_INT_IRQ))
{
m_pending_interrupts &= ~(1 << M68HC05EG_INT_IRQ);
- rm16(0x1ffa, m_pc);
+ rm16<false>(0x1ffa, m_pc);
}
else if (BIT(m_pending_interrupts, M68HC05EG_INT_TIMER))
{
m_pending_interrupts &= ~(1 << M68HC05EG_INT_TIMER);
- rm16(0x1ff8, m_pc);
+ rm16<false>(0x1ff8, m_pc);
}
else if (BIT(m_pending_interrupts, M68HC05EG_INT_CPI))
{
m_pending_interrupts &= ~(1 << M68HC05EG_INT_CPI);
- rm16(0x1ff6, m_pc);
+ rm16<false>(0x1ff6, m_pc);
}
}
@@ -568,7 +681,7 @@ hd63705_device::hd63705_device(const machine_config &mconfig, const char *tag, d
owner,
clock,
HD63705,
- { s_hmos_ops, s_hmos_cycles, 16, 0x017f, 0x0100, 0x1ffa })
+ { s_hmos_b_ops, s_hmos_cycles, 16, 0x017f, 0x0100, 0x1ffa })
{
}
@@ -578,7 +691,7 @@ void hd63705_device::device_reset()
m_s.w.l = SP_MASK;
- rm16(0x1ffe, m_pc);
+ rm16<true>(0x1ffe, m_pc);
}
void hd63705_device::execute_set_input(int inputnum, int state)
@@ -617,42 +730,42 @@ void hd63705_device::interrupt_vector()
if ((m_pending_interrupts & (1 << HD63705_INT_IRQ1)) != 0)
{
m_pending_interrupts &= ~(1 << HD63705_INT_IRQ1);
- rm16(0x1ff8, m_pc);
+ rm16<true>(0x1ff8, m_pc);
}
else if ((m_pending_interrupts & (1 << HD63705_INT_IRQ2)) != 0)
{
m_pending_interrupts &= ~(1 << HD63705_INT_IRQ2);
- rm16(0x1fec, m_pc);
+ rm16<true>(0x1fec, m_pc);
}
else if ((m_pending_interrupts & (1 << HD63705_INT_ADCONV)) != 0)
{
m_pending_interrupts &= ~(1 << HD63705_INT_ADCONV);
- rm16(0x1fea, m_pc);
+ rm16<true>(0x1fea, m_pc);
}
else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER1)) != 0)
{
m_pending_interrupts &= ~(1 << HD63705_INT_TIMER1);
- rm16(0x1ff6, m_pc);
+ rm16<true>(0x1ff6, m_pc);
}
else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER2)) != 0)
{
m_pending_interrupts &= ~(1 << HD63705_INT_TIMER2);
- rm16(0x1ff4, m_pc);
+ rm16<true>(0x1ff4, m_pc);
}
else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER3)) != 0)
{
m_pending_interrupts &= ~(1<<HD63705_INT_TIMER3);
- rm16(0x1ff2, m_pc);
+ rm16<true>(0x1ff2, m_pc);
}
else if ((m_pending_interrupts & (1 << HD63705_INT_PCI)) != 0)
{
m_pending_interrupts &= ~(1 << HD63705_INT_PCI);
- rm16(0x1ff0, m_pc);
+ rm16<true>(0x1ff0, m_pc);
}
else if ((m_pending_interrupts & (1 << HD63705_INT_SCI)) != 0)
{
m_pending_interrupts &= ~(1 << HD63705_INT_SCI);
- rm16(0x1fee, m_pc);
+ rm16<true>(0x1fee, m_pc);
}
}
diff --git a/src/devices/cpu/m6805/m6805.h b/src/devices/cpu/m6805/m6805.h
index 1d08e0e8eaf..8aaf1a2a1f0 100644
--- a/src/devices/cpu/m6805/m6805.h
+++ b/src/devices/cpu/m6805/m6805.h
@@ -97,9 +97,11 @@ protected:
};
// opcode tables
- static op_handler_table s_hmos_ops;
- static op_handler_table s_cmos_ops;
- static op_handler_table s_hc_ops;
+ static op_handler_table s_hmos_s_ops;
+ static op_handler_table s_hmos_b_ops;
+ static op_handler_table s_cmos_b_ops;
+ static op_handler_table s_hc_s_ops;
+ static op_handler_table s_hc_b_ops;
static cycle_count_table s_hmos_cycles;
static cycle_count_table s_cmos_cycles;
static cycle_count_table s_hc_cycles;
@@ -163,111 +165,111 @@ protected:
void set_nzc8(u16 a) { set_nz8(a); set_c8(a); }
void set_hnzc8(u8 a, u8 b, u16 r) { set_h(a, b, r); set_nzc8(r); }
- unsigned rdmem(u32 addr) { return unsigned(m_program->read_byte(addr)); }
- void wrmem(u32 addr, u8 value) { m_program->write_byte(addr, value); }
- unsigned rdop(u32 addr) { return unsigned(m_cache->read_byte(addr)); }
- unsigned rdop_arg(u32 addr) { return unsigned(m_cache->read_byte(addr)); }
-
- unsigned rm(u32 addr) { return rdmem(addr); }
- void rm16(u32 addr, PAIR &p);
- void wm(u32 addr, u8 value) { wrmem(addr, value); }
-
- void pushbyte(u8 b);
- void pushword(PAIR const &p);
- void pullbyte(u8 &b);
- void pullword(PAIR &p);
-
- template <typename T> void immbyte(T &b);
- void immword(PAIR &w);
- void skipbyte();
-
- template <unsigned B> void brset();
- template <unsigned B> void brclr();
- template <unsigned B> void bset();
- template <unsigned B> void bclr();
-
- template <bool C> void bra();
- template <bool C> void bhi();
- template <bool C> void bcc();
- template <bool C> void bne();
- template <bool C> void bhcc();
- template <bool C> void bpl();
- template <bool C> void bmc();
- template <bool C> void bil();
- void bsr();
-
- template <addr_mode M> void neg();
- template <addr_mode M> void com();
- template <addr_mode M> void lsr();
- template <addr_mode M> void ror();
- template <addr_mode M> void asr();
- template <addr_mode M> void lsl();
- template <addr_mode M> void rol();
- template <addr_mode M> void dec();
- template <addr_mode M> void inc();
- template <addr_mode M> void tst();
- template <addr_mode M> void clr();
-
- void nega();
- void mul();
- void coma();
- void lsra();
- void rora();
- void asra();
- void lsla();
- void rola();
- void deca();
- void inca();
- void tsta();
- void clra();
-
- void negx();
- void comx();
- void lsrx();
- void rorx();
- void asrx();
- void lslx();
- void rolx();
- void decx();
- void incx();
- void tstx();
- void clrx();
-
- void rti();
- void rts();
- void swi();
- void stop();
- void wait();
-
- void tax();
- void txa();
-
- void clc();
- void sec();
- void cli();
- void sei();
-
- void rsp();
- void nop();
-
- template <addr_mode M> void suba();
- template <addr_mode M> void cmpa();
- template <addr_mode M> void sbca();
- template <addr_mode M> void cpx();
- template <addr_mode M> void anda();
- template <addr_mode M> void bita();
- template <addr_mode M> void lda();
- template <addr_mode M> void sta();
- template <addr_mode M> void eora();
- template <addr_mode M> void adca();
- template <addr_mode M> void ora();
- template <addr_mode M> void adda();
- template <addr_mode M> void jmp();
- template <addr_mode M> void jsr();
- template <addr_mode M> void ldx();
- template <addr_mode M> void stx();
-
- void illegal();
+ template <bool big> unsigned rdmem(u32 addr) { return big ? m_program16.read_byte(addr) : m_program13.read_byte(addr); }
+ template <bool big> void wrmem(u32 addr, u8 value) { if(big) m_program16.write_byte(addr, value); else m_program13.write_byte(addr, value); }
+ template <bool big> unsigned rdop(u32 addr) { return big ? m_cprogram16.read_byte(addr) : m_cprogram13.read_byte(addr); }
+ template <bool big> unsigned rdop_arg(u32 addr) { return big ? m_cprogram16.read_byte(addr) : m_cprogram13.read_byte(addr); }
+
+ template <bool big> unsigned rm(u32 addr) { return rdmem<big>(addr); }
+ template <bool big> void rm16(u32 addr, PAIR &p);
+ template <bool big> void wm(u32 addr, u8 value) { wrmem<big>(addr, value); }
+
+ template <bool big> void pushbyte(u8 b);
+ template <bool big> void pushword(PAIR const &p);
+ template <bool big> void pullbyte(u8 &b);
+ template <bool big> void pullword(PAIR &p);
+
+ template <bool big, typename T> void immbyte(T &b);
+ template <bool big> void immword(PAIR &w);
+ template <bool big> void skipbyte();
+
+ template <bool big, unsigned B> void brset();
+ template <bool big, unsigned B> void brclr();
+ template <bool big, unsigned B> void bset();
+ template <bool big, unsigned B> void bclr();
+
+ template <bool big, bool C> void bra();
+ template <bool big, bool C> void bhi();
+ template <bool big, bool C> void bcc();
+ template <bool big, bool C> void bne();
+ template <bool big, bool C> void bhcc();
+ template <bool big, bool C> void bpl();
+ template <bool big, bool C> void bmc();
+ template <bool big, bool C> void bil();
+ template <bool big> void bsr();
+
+ template <bool big, addr_mode M> void neg();
+ template <bool big, addr_mode M> void com();
+ template <bool big, addr_mode M> void lsr();
+ template <bool big, addr_mode M> void ror();
+ template <bool big, addr_mode M> void asr();
+ template <bool big, addr_mode M> void lsl();
+ template <bool big, addr_mode M> void rol();
+ template <bool big, addr_mode M> void dec();
+ template <bool big, addr_mode M> void inc();
+ template <bool big, addr_mode M> void tst();
+ template <bool big, addr_mode M> void clr();
+
+ template <bool big> void nega();
+ template <bool big> void mul();
+ template <bool big> void coma();
+ template <bool big> void lsra();
+ template <bool big> void rora();
+ template <bool big> void asra();
+ template <bool big> void lsla();
+ template <bool big> void rola();
+ template <bool big> void deca();
+ template <bool big> void inca();
+ template <bool big> void tsta();
+ template <bool big> void clra();
+
+ template <bool big> void negx();
+ template <bool big> void comx();
+ template <bool big> void lsrx();
+ template <bool big> void rorx();
+ template <bool big> void asrx();
+ template <bool big> void lslx();
+ template <bool big> void rolx();
+ template <bool big> void decx();
+ template <bool big> void incx();
+ template <bool big> void tstx();
+ template <bool big> void clrx();
+
+ template <bool big> void rti();
+ template <bool big> void rts();
+ template <bool big> void swi();
+ template <bool big> void stop();
+ template <bool big> void wait();
+
+ template <bool big> void tax();
+ template <bool big> void txa();
+
+ template <bool big> void clc();
+ template <bool big> void sec();
+ template <bool big> void cli();
+ template <bool big> void sei();
+
+ template <bool big> void rsp();
+ template <bool big> void nop();
+
+ template <bool big, addr_mode M> void suba();
+ template <bool big, addr_mode M> void cmpa();
+ template <bool big, addr_mode M> void sbca();
+ template <bool big, addr_mode M> void cpx();
+ template <bool big, addr_mode M> void anda();
+ template <bool big, addr_mode M> void bita();
+ template <bool big, addr_mode M> void lda();
+ template <bool big, addr_mode M> void sta();
+ template <bool big, addr_mode M> void eora();
+ template <bool big, addr_mode M> void adca();
+ template <bool big, addr_mode M> void ora();
+ template <bool big, addr_mode M> void adda();
+ template <bool big, addr_mode M> void jmp();
+ template <bool big, addr_mode M> void jsr();
+ template <bool big, addr_mode M> void ldx();
+ template <bool big, addr_mode M> void stx();
+
+ template <bool big> void illegal();
virtual void interrupt();
virtual void interrupt_vector();
@@ -298,8 +300,10 @@ protected:
int m_icount;
// address spaces
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_cprogram16;
+ memory_access<13, 0, 0, ENDIANNESS_BIG>::cache m_cprogram13;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_program16;
+ memory_access<13, 0, 0, ENDIANNESS_BIG>::specific m_program13;
};
diff --git a/src/devices/cpu/m6805/m6805defs.h b/src/devices/cpu/m6805/m6805defs.h
index 1e5d8c6e7fb..084fee004f4 100644
--- a/src/devices/cpu/m6805/m6805defs.h
+++ b/src/devices/cpu/m6805/m6805defs.h
@@ -24,53 +24,53 @@ inline void clear_pair(PAIR &p) { p.d = 0; }
#define SP_DEC if (--S < SP_LOW) S = SP_MASK
#define SP_ADJUST(s) (((s) & SP_MASK) | SP_LOW)
-inline void m6805_base_device::rm16(u32 addr, PAIR &p)
+template<bool big> inline void m6805_base_device::rm16(u32 addr, PAIR &p)
{
clear_pair(p);
- p.b.h = rm(addr);
- p.b.l = rm(addr + 1);
+ p.b.h = rm<big>(addr);
+ p.b.l = rm<big>(addr + 1);
}
-inline void m6805_base_device::pushbyte(u8 b)
+template<bool big> inline void m6805_base_device::pushbyte(u8 b)
{
- wm(S, b);
+ wm<big>(S, b);
SP_DEC;
}
-inline void m6805_base_device::pushword(PAIR const &p)
+template<bool big> inline void m6805_base_device::pushword(PAIR const &p)
{
- pushbyte(p.b.l);
- pushbyte(p.b.h);
+ pushbyte<big>(p.b.l);
+ pushbyte<big>(p.b.h);
}
-inline void m6805_base_device::pullbyte(u8 &b)
+template<bool big> inline void m6805_base_device::pullbyte(u8 &b)
{
SP_INC;
- b = rm(S);
+ b = rm<big>(S);
}
-inline void m6805_base_device::pullword(PAIR &p)
+template<bool big> inline void m6805_base_device::pullword(PAIR &p)
{
clear_pair(p);
- pullbyte(p.b.h);
- pullbyte(p.b.l);
+ pullbyte<big>(p.b.h);
+ pullbyte<big>(p.b.l);
}
/* macros to access memory */
-template <typename T> inline void m6805_base_device::immbyte(T &b) { b = rdop_arg(PC++); }
-inline void m6805_base_device::immword(PAIR &w) { w.d = 0; immbyte(w.b.h); immbyte(w.b.l); }
-inline void m6805_base_device::skipbyte() { rdop_arg(PC++); }
+template <bool big, typename T> inline void m6805_base_device::immbyte(T &b) { b = rdop_arg<big>(PC++); }
+template<bool big> inline void m6805_base_device::immword(PAIR &w) { w.d = 0; immbyte<big>(w.b.h); immbyte<big>(w.b.l); }
+template<bool big> inline void m6805_base_device::skipbyte() { rdop_arg<big>(PC++); }
/* for treating an unsigned uint8_t as a signed int16_t */
#define SIGNED(b) (int16_t(b & 0x80 ? b | 0xff00 : b))
/* Macros for addressing modes */
-#define DIRECT do { EAD=0; immbyte(m_ea.b.l); } while (false)
+#define DIRECT do { EAD=0; immbyte<big>(m_ea.b.l); } while (false)
#define IMM8 do { EA = PC++; } while (false)
-#define EXTENDED immword(m_ea)
+#define EXTENDED immword<big>(m_ea)
#define INDEXED do { EA = X; } while (false)
-#define INDEXED1 do { EAD = 0; immbyte(m_ea.b.l); EA += X; } while (false)
-#define INDEXED2 do { immword(m_ea); EA += X;} while (false)
+#define INDEXED1 do { EAD = 0; immbyte<big>(m_ea.b.l); EA += X; } while (false)
+#define INDEXED2 do { immword<big>(m_ea); EA += X;} while (false)
/* macros to set status flags */
#if defined(SEC)
@@ -97,14 +97,14 @@ inline void m6805_base_device::skipbyte() { rdop_arg(PC++); }
case addr_mode::IX1: INDEXED1; break; \
case addr_mode::IX2: INDEXED2; break; \
} } while (false)
-#define DIRBYTE(b) do { DIRECT; b = rm(EAD); } while (false)
-#define EXTBYTE(b) do { EXTENDED; b = rm(EAD); } while (false)
-#define IDXBYTE(b) do { INDEXED; b = rm(EAD); } while (false)
-#define IDX1BYTE(b) do { INDEXED1; b = rm(EAD); } while (false)
-#define IDX2BYTE(b) do { INDEXED2; b = rm(EAD); } while (false)
+#define DIRBYTE(b) do { DIRECT; b = rm<big>(EAD); } while (false)
+#define EXTBYTE(b) do { EXTENDED; b = rm<big>(EAD); } while (false)
+#define IDXBYTE(b) do { INDEXED; b = rm<big>(EAD); } while (false)
+#define IDX1BYTE(b) do { INDEXED1; b = rm<big>(EAD); } while (false)
+#define IDX2BYTE(b) do { INDEXED2; b = rm<big>(EAD); } while (false)
#define ARGBYTE(b) \
do { switch (M) { \
- case addr_mode::IM: immbyte(b); break; \
+ case addr_mode::IM: immbyte<big>(b); break; \
case addr_mode::DI: DIRBYTE(b); break; \
case addr_mode::EX: EXTBYTE(b); break; \
case addr_mode::IX: IDXBYTE(b); break; \
@@ -114,6 +114,6 @@ inline void m6805_base_device::skipbyte() { rdop_arg(PC++); }
} } while (false)
/* Macros for branch instructions */
-#define BRANCH(f) do { u8 t; immbyte(t); if (bool(f) == bool(C)) PC += SIGNED(t); } while (false)
+#define BRANCH(f) do { u8 t; immbyte<big>(t); if (bool(f) == bool(C)) PC += SIGNED(t); } while (false)
#endif // MAME_CPU_M6805_M6805DEFS_H
diff --git a/src/devices/cpu/m6805/m68705.cpp b/src/devices/cpu/m6805/m68705.cpp
index d121201d6d8..12e3b8d1384 100644
--- a/src/devices/cpu/m6805/m68705.cpp
+++ b/src/devices/cpu/m6805/m68705.cpp
@@ -215,7 +215,7 @@ Ux Parts:
*/
m6805_hmos_device::m6805_hmos_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, device_type type, u32 addr_width, unsigned ram_size)
- : m6805_base_device(mconfig, tag, owner, clock, type, { s_hmos_ops, s_hmos_cycles, addr_width, 0x007f, 0x0060, M6805_VECTOR_SWI }, address_map_constructor(FUNC(m6805_hmos_device::map), this))
+ : m6805_base_device(mconfig, tag, owner, clock, type, { addr_width > 13 ? s_hmos_b_ops : s_hmos_s_ops, s_hmos_cycles, addr_width, 0x007f, 0x0060, M6805_VECTOR_SWI }, address_map_constructor(FUNC(m6805_hmos_device::map), this))
, m_timer(*this)
, m_port_open_drain{ false, false, false, false }
, m_port_mask{ 0x00, 0x00, 0x00, 0x00 }
@@ -471,7 +471,10 @@ void m6805_hmos_device::device_reset()
// reset timer/counter
m_timer.reset();
- rm16(M6805_VECTOR_RESET, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(M6805_VECTOR_RESET, m_pc);
+ else
+ rm16<false>(M6805_VECTOR_RESET, m_pc);
}
void m68705_device::device_reset()
@@ -484,12 +487,18 @@ void m68705_device::device_reset()
if (CLEAR_LINE != m_vihtp)
{
LOG("loading bootstrap vector\n");
- rm16(M68705_VECTOR_BOOTSTRAP, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(M68705_VECTOR_BOOTSTRAP, m_pc);
+ else
+ rm16<false>(M68705_VECTOR_BOOTSTRAP, m_pc);
}
else
{
LOG("loading reset vector\n");
- rm16(M6805_VECTOR_RESET, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(M6805_VECTOR_RESET, m_pc);
+ else
+ rm16<false>(M6805_VECTOR_RESET, m_pc);
}
}
@@ -543,10 +552,19 @@ void m6805_hmos_device::interrupt()
{
if ((CC & IFLAG) == 0)
{
- pushword(m_pc);
- pushbyte(m_x);
- pushbyte(m_a);
- pushbyte(m_cc);
+ if (m_params.m_addr_width > 13) {
+ pushword<true>(m_pc);
+ pushbyte<true>(m_x);
+ pushbyte<true>(m_a);
+ pushbyte<true>(m_cc);
+ }
+ else
+ {
+ pushword<false>(m_pc);
+ pushbyte<false>(m_x);
+ pushbyte<false>(m_a);
+ pushbyte<false>(m_cc);
+ }
SEI;
standard_irq_callback(0);
@@ -554,12 +572,18 @@ void m6805_hmos_device::interrupt()
{
LOGINT("servicing /INT interrupt\n");
m_pending_interrupts &= ~(1 << M6805_IRQ_LINE);
- rm16(M6805_VECTOR_INT, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(M6805_VECTOR_INT, m_pc);
+ else
+ rm16<false>(M6805_VECTOR_INT, m_pc);
}
else if (BIT(m_pending_interrupts, M6805_INT_TIMER))
{
LOGINT("servicing timer/counter interrupt\n");
- rm16(M6805_VECTOR_TIMER, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(M6805_VECTOR_TIMER, m_pc);
+ else
+ rm16<false>(M6805_VECTOR_TIMER, m_pc);
}
else
{
diff --git a/src/devices/cpu/m6805/m68hc05.cpp b/src/devices/cpu/m6805/m68hc05.cpp
index d3843cbca56..ee76081e422 100644
--- a/src/devices/cpu/m6805/m68hc05.cpp
+++ b/src/devices/cpu/m6805/m68hc05.cpp
@@ -143,7 +143,7 @@ m68hc05_device::m68hc05_device(
owner,
clock,
type,
- { s_hc_ops, s_hc_cycles, addr_width, 0x00ff, 0x00c0, vector_mask, M68HC05_VECTOR_SWI },
+ { addr_width > 13 ? s_hc_b_ops : s_hc_s_ops, s_hc_cycles, addr_width, 0x00ff, 0x00c0, vector_mask, M68HC05_VECTOR_SWI },
internal_map)
, m_port_cb_r(*this)
, m_port_cb_w(*this)
@@ -582,10 +582,19 @@ void m68hc05_device::interrupt()
{
if ((m_pending_interrupts & M68HC05_INT_MASK) && !(CC & IFLAG))
{
- pushword(m_pc);
- pushbyte(m_x);
- pushbyte(m_a);
- pushbyte(m_cc);
+ if (m_params.m_addr_width > 13) {
+ pushword<true>(m_pc);
+ pushbyte<true>(m_x);
+ pushbyte<true>(m_a);
+ pushbyte<true>(m_cc);
+ }
+ else
+ {
+ pushword<false>(m_pc);
+ pushbyte<false>(m_x);
+ pushbyte<false>(m_a);
+ pushbyte<false>(m_cc);
+ }
SEI;
standard_irq_callback(0);
@@ -594,12 +603,18 @@ void m68hc05_device::interrupt()
LOGINT("servicing external interrupt\n");
m_irq_latch = 0;
m_pending_interrupts &= ~M68HC05_INT_IRQ;
- rm16(M68HC05_VECTOR_IRQ & m_params.m_vector_mask, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(M68HC05_VECTOR_IRQ & m_params.m_vector_mask, m_pc);
+ else
+ rm16<false>(M68HC05_VECTOR_IRQ & m_params.m_vector_mask, m_pc);
}
else if (m_pending_interrupts & M68HC05_INT_TIMER)
{
LOGINT("servicing timer interrupt\n");
- rm16(M68HC05_VECTOR_TIMER & m_params.m_vector_mask, m_pc);
+ if (m_params.m_addr_width > 13)
+ rm16<true>(M68HC05_VECTOR_TIMER & m_params.m_vector_mask, m_pc);
+ else
+ rm16<false>(M68HC05_VECTOR_TIMER & m_params.m_vector_mask, m_pc);
}
else
{
@@ -965,8 +980,8 @@ void m68hc705c8a_device::device_reset()
m68hc705_device::device_reset();
// latch MOR registers on reset
- set_port_interrupt(std::array<u8, PORT_COUNT>{{ 0x00, u8(rdmem(0xfff0)), 0x00, 0x00 }});
- set_ncope(BIT(rdmem(0xfff1), 0));
+ set_port_interrupt(std::array<u8, PORT_COUNT>{{ 0x00, u8(rdmem<false>(0xfff0)), 0x00, 0x00 }});
+ set_ncope(BIT(rdmem<false>(0xfff1), 0));
// RAM disabled, IRQ negative edge and level sensitive
m_option = 0x02;
@@ -1064,7 +1079,7 @@ void m68hc705j1a_device::device_reset()
m68hc705_device::device_reset();
// latch MOR register on reset
- set_ncope(BIT(rdmem(0x07f1), 0)); // FIXME: this is more like C8A's PCOP
+ set_ncope(BIT(rdmem<false>(0x07f1), 0)); // FIXME: this is more like C8A's PCOP
}
diff --git a/src/devices/cpu/m6809/m6809.cpp b/src/devices/cpu/m6809/m6809.cpp
index 5143676fa05..e2a83a17e00 100644
--- a/src/devices/cpu/m6809/m6809.cpp
+++ b/src/devices/cpu/m6809/m6809.cpp
@@ -156,11 +156,9 @@ void m6809_base_device::device_start()
if (!m_mintf)
m_mintf = std::make_unique<mi_default>();
- m_mintf->m_program = &space(AS_PROGRAM);
- m_mintf->m_sprogram = has_space(AS_OPCODES) ? &space(AS_OPCODES) : m_mintf->m_program;
-
- m_mintf->m_cache = m_mintf->m_program->cache<0, 0, ENDIANNESS_BIG>();
- m_mintf->m_scache = m_mintf->m_sprogram->cache<0, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_mintf->cprogram);
+ space(AS_PROGRAM).specific(m_mintf->program);
+ space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).cache(m_mintf->csprogram);
m_lic_func.resolve_safe();
@@ -581,23 +579,23 @@ void m6809_base_device::execute_run()
uint8_t m6809_base_device::mi_default::read(uint16_t adr)
{
- return m_program->read_byte(adr);
+ return program.read_byte(adr);
}
uint8_t m6809_base_device::mi_default::read_opcode(uint16_t adr)
{
- return m_scache->read_byte(adr);
+ return csprogram.read_byte(adr);
}
uint8_t m6809_base_device::mi_default::read_opcode_arg(uint16_t adr)
{
- return m_cache->read_byte(adr);
+ return cprogram.read_byte(adr);
}
void m6809_base_device::mi_default::write(uint16_t adr, uint8_t val)
{
- m_program->write_byte(adr, val);
+ program.write_byte(adr, val);
}
diff --git a/src/devices/cpu/m6809/m6809.h b/src/devices/cpu/m6809/m6809.h
index daa1b82913a..0af03cfd47b 100644
--- a/src/devices/cpu/m6809/m6809.h
+++ b/src/devices/cpu/m6809/m6809.h
@@ -34,8 +34,8 @@ protected:
class memory_interface {
public:
- address_space *m_program, *m_sprogram;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache, *m_scache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache cprogram, csprogram;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific program;
virtual ~memory_interface() {}
virtual uint8_t read(uint16_t adr) = 0;
diff --git a/src/devices/cpu/m88000/m88000.cpp b/src/devices/cpu/m88000/m88000.cpp
index cb25ff35a38..7498d02591d 100644
--- a/src/devices/cpu/m88000/m88000.cpp
+++ b/src/devices/cpu/m88000/m88000.cpp
@@ -19,8 +19,6 @@ mc88100_device::mc88100_device(const machine_config &mconfig, const char *tag, d
: cpu_device(mconfig, MC88100, tag, owner, clock)
, m_code_config("code", ENDIANNESS_BIG, 32, 32, 0)
, m_data_config("data", ENDIANNESS_BIG, 32, 32, 0)
- , m_inst_cache(nullptr)
- , m_data_space(nullptr)
, m_pc(0)
, m_r{0}
, m_cr{0}
@@ -45,8 +43,8 @@ device_memory_interface::space_config_vector mc88100_device::memory_space_config
void mc88100_device::device_start()
{
- m_inst_cache = space(AS_PROGRAM).cache<2, 0, ENDIANNESS_BIG>();
- m_data_space = &space(AS_DATA);
+ space(AS_PROGRAM).cache(m_inst_cache);
+ space(AS_DATA).specific(m_data_space);
set_icountptr(m_icount);
diff --git a/src/devices/cpu/m88000/m88000.h b/src/devices/cpu/m88000/m88000.h
index 1e277099718..c4e0c888475 100644
--- a/src/devices/cpu/m88000/m88000.h
+++ b/src/devices/cpu/m88000/m88000.h
@@ -49,8 +49,8 @@ private:
// address spaces
address_space_config m_code_config;
address_space_config m_data_config;
- memory_access_cache<2, 0, ENDIANNESS_BIG> *m_inst_cache;
- address_space *m_data_space;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_inst_cache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_data_space;
// register storage
u32 m_pc;
diff --git a/src/devices/cpu/mb86233/mb86233.cpp b/src/devices/cpu/mb86233/mb86233.cpp
index 7a67599408a..b69cad9639c 100644
--- a/src/devices/cpu/mb86233/mb86233.cpp
+++ b/src/devices/cpu/mb86233/mb86233.cpp
@@ -88,12 +88,11 @@ std::unique_ptr<util::disasm_interface> mb86233_device::create_disassembler()
void mb86233_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, -2, ENDIANNESS_LITTLE>();
-
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
- m_rf = &space(AS_RF);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
+ space(AS_RF).specific(m_rf);
state_add(STATE_GENPC, "GENPC", m_pc);
state_add(STATE_GENPCBASE, "PC", m_ppc).noshow();
@@ -606,7 +605,7 @@ u32 mb86233_device::read_reg(u32 r)
{
r &= 0x3f;
if(r >= 0x20 && r < 0x30)
- return m_rf->read_dword(r & 0x1f);
+ return m_rf.read_dword(r & 0x1f);
switch(r) {
case 0x00: return m_b0;
case 0x01: return m_b1;
@@ -643,7 +642,7 @@ void mb86233_device::write_reg(u32 r, u32 v)
{
r &= 0x3f;
if(r >= 0x20 && r < 0x30) {
- m_rf->write_dword(r & 0x1f, v);
+ m_rf.write_dword(r & 0x1f, v);
return;
}
switch(r) {
@@ -706,14 +705,14 @@ void mb86233_device::write_mem_internal_1(u32 r, u32 v, bool bank)
u16 ea = ea_pre_1(r);
if(bank)
ea += 0x200;
- m_data->write_dword(ea, v);
+ m_data.write_dword(ea, v);
ea_post_1(r);
}
void mb86233_device::write_mem_io_1(u32 r, u32 v)
{
u16 ea = ea_pre_1(r);
- m_io->write_dword(ea, v);
+ m_io.write_dword(ea, v);
ea_post_1(r);
}
@@ -722,7 +721,7 @@ void mb86233_device::execute_run()
while(m_icount > 0) {
m_ppc = m_pc;
debugger_instruction_hook(m_ppc);
- u32 opcode = m_cache->read_dword(m_pc++);
+ u32 opcode = m_cache.read_dword(m_pc++);
switch((opcode >> 26) & 0x3f) {
case 0x00: {
@@ -739,11 +738,11 @@ void mb86233_device::execute_run()
// lab mem, mem (e)
u32 ea1 = ea_pre_0(r1);
- u32 v1 = m_data->read_dword(ea1);
+ u32 v1 = m_data.read_dword(ea1);
if(m_stall) goto do_stall;
u32 ea2 = ea_pre_1(r2);
- u32 v2 = m_io->read_dword(ea2);
+ u32 v2 = m_io.read_dword(ea2);
if(m_stall) goto do_stall;
ea_post_0(r1);
@@ -758,11 +757,11 @@ void mb86233_device::execute_run()
// lab mem, mem + 0x200
u32 ea1 = ea_pre_0(r1);
- u32 v1 = m_data->read_dword(ea1);
+ u32 v1 = m_data.read_dword(ea1);
if(m_stall) goto do_stall;
u32 ea2 = ea_pre_1(r2) + 0x200;
- u32 v2 = m_data->read_dword(ea2);
+ u32 v2 = m_data.read_dword(ea2);
if(m_stall) goto do_stall;
ea_post_0(r1);
@@ -777,11 +776,11 @@ void mb86233_device::execute_run()
// lab mem + 0x200, mem
u32 ea1 = ea_pre_0(r1) + 0x200;
- u32 v1 = m_data->read_dword(ea1);
+ u32 v1 = m_data.read_dword(ea1);
if(m_stall) goto do_stall;
u32 ea2 = ea_pre_1(r2);
- u32 v2 = m_data->read_dword(ea2);
+ u32 v2 = m_data.read_dword(ea2);
if(m_stall) goto do_stall;
ea_post_0(r1);
@@ -817,7 +816,7 @@ void mb86233_device::execute_run()
case 0: {
// mov mem, mem (e)
u32 ea = ea_pre_0(r1);
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(r1);
write_mem_io_1(r2, v);
@@ -827,7 +826,7 @@ void mb86233_device::execute_run()
case 1: {
// mov mem, mem (e)
u32 ea = ea_pre_0(r1);
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(r1);
write_mem_io_1(r2, v);
@@ -837,7 +836,7 @@ void mb86233_device::execute_run()
case 2: {
// mov mem (e), mem
u32 ea = ea_pre_0(r1);
- u32 v = m_io->read_dword(ea);
+ u32 v = m_io.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(r1);
write_mem_internal_1(r2, v, false);
@@ -847,7 +846,7 @@ void mb86233_device::execute_run()
case 3: {
// mov mem, mem + 0x200
u32 ea = ea_pre_0(r1);
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(r1);
write_mem_internal_1(r2, v, true);
@@ -857,7 +856,7 @@ void mb86233_device::execute_run()
case 4: {
// mov mem + 0x200, mem
u32 ea = ea_pre_0(r1) + 0x200;
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(r1);
write_mem_internal_1(r2, v, false);
@@ -867,7 +866,7 @@ void mb86233_device::execute_run()
case 5: {
// mov mem (o), mem
u32 ea = ea_pre_0(r1);
- u32 v = m_program->read_dword(ea);
+ u32 v = m_program.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(r1);
write_mem_internal_1(r2, v, false);
@@ -895,7 +894,7 @@ void mb86233_device::execute_run()
case 2: {
// mov mem + 0x200, reg
u32 ea = ea_pre_1(r1) + 0x200;
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_1(r1);
write_reg(r2, v);
@@ -905,7 +904,7 @@ void mb86233_device::execute_run()
case 3: {
// mov mem, reg
u32 ea = ea_pre_1(r1);
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_1(r1);
write_reg(r2, v);
@@ -915,7 +914,7 @@ void mb86233_device::execute_run()
case 4: {
// mov mem (e), reg
u32 ea = ea_pre_1(r1);
- u32 v = m_io->read_dword(ea);
+ u32 v = m_io.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_1(r1);
write_reg(r2, v);
@@ -925,7 +924,7 @@ void mb86233_device::execute_run()
case 5: {
// mov mem (o), reg
u32 ea = ea_pre_0(r1);
- u32 v = m_program->read_dword(ea);
+ u32 v = m_program.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(r1);
write_reg(r2, v);
@@ -1117,7 +1116,7 @@ void mb86233_device::execute_run()
} else {
// brul adr
u32 ea = ea_pre_0(opcode);
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(opcode);
m_pc = v;
@@ -1139,7 +1138,7 @@ void mb86233_device::execute_run()
} else {
// bsul adr
u32 ea = ea_pre_0(opcode);
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(opcode);
pcs_push();
@@ -1153,7 +1152,7 @@ void mb86233_device::execute_run()
case 6: { // ldif adr, rn
u32 ea = ea_pre_0(opcode);
- u32 v = m_data->read_dword(ea);
+ u32 v = m_data.read_dword(ea);
if(m_stall) goto do_stall;
ea_post_0(opcode);
write_reg(opcode >> 9, v);
diff --git a/src/devices/cpu/mb86233/mb86233.h b/src/devices/cpu/mb86233/mb86233.h
index 2f02a4c0d46..611eb1e5b33 100644
--- a/src/devices/cpu/mb86233/mb86233.h
+++ b/src/devices/cpu/mb86233/mb86233.h
@@ -88,8 +88,12 @@ private:
address_space_config m_io_config;
address_space_config m_rf_config;
- address_space *m_program, *m_data, *m_io, *m_rf;
- memory_access_cache<2, -2, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 2, -2, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 2, -2, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<16, 2, -2, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access<16, 2, -2, ENDIANNESS_LITTLE>::specific m_io;
+ memory_access< 4, 2, -2, ENDIANNESS_LITTLE>::specific m_rf;
+
int m_icount;
u32 m_st, m_a, m_b, m_d, m_p;
diff --git a/src/devices/cpu/mb86235/mb86235.cpp b/src/devices/cpu/mb86235/mb86235.cpp
index fc56ce12390..45eb318704c 100644
--- a/src/devices/cpu/mb86235/mb86235.cpp
+++ b/src/devices/cpu/mb86235/mb86235.cpp
@@ -68,7 +68,7 @@ void mb86235_device::execute_run()
curpc = check_previous_op_stall() ? m_core->cur_fifo_state.pc : m_core->pc;
debugger_instruction_hook(curpc);
- opcode = m_pcache->read_qword(curpc);
+ opcode = m_pcache.read_qword(curpc);
m_core->ppc = curpc;
@@ -91,10 +91,10 @@ void mb86235_device::execute_run()
void mb86235_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_pcache = m_program->cache<3, -3, ENDIANNESS_LITTLE>();
- m_dataa = &space(AS_DATA);
- m_datab = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_pcache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_dataa);
+ space(AS_IO).specific(m_datab);
m_core = (mb86235_internal_state *)m_cache.alloc_near(sizeof(mb86235_internal_state));
memset(m_core, 0, sizeof(mb86235_internal_state));
diff --git a/src/devices/cpu/mb86235/mb86235.h b/src/devices/cpu/mb86235/mb86235.h
index 9edfd828749..c859807bf56 100644
--- a/src/devices/cpu/mb86235/mb86235.h
+++ b/src/devices/cpu/mb86235/mb86235.h
@@ -74,8 +74,6 @@ protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
- memory_access_cache<3, -3, ENDIANNESS_LITTLE> *m_pcache;
-
private:
struct mb86235_flags
@@ -174,9 +172,10 @@ private:
std::unique_ptr<drcuml_state> m_drcuml;
std::unique_ptr<mb86235_frontend> m_drcfe;
- address_space *m_program;
- address_space *m_dataa;
- address_space *m_datab;
+ memory_access<32, 3, -3, ENDIANNESS_LITTLE>::cache m_pcache;
+ memory_access<32, 3, -3, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<24, 2, -2, ENDIANNESS_LITTLE>::specific m_dataa;
+ memory_access<10, 2, -2, ENDIANNESS_LITTLE>::specific m_datab;
/* internal compiler state */
struct compiler_state
diff --git a/src/devices/cpu/mb86235/mb86235fe.cpp b/src/devices/cpu/mb86235/mb86235fe.cpp
index 41ad97ebb87..94a8d986869 100644
--- a/src/devices/cpu/mb86235/mb86235fe.cpp
+++ b/src/devices/cpu/mb86235/mb86235fe.cpp
@@ -63,7 +63,7 @@ mb86235_frontend::mb86235_frontend(mb86235_device *core, uint32_t window_start,
bool mb86235_frontend::describe(opcode_desc &desc, const opcode_desc *prev)
{
- uint64_t opcode = desc.opptr.q[0] = m_core->m_pcache->read_qword(desc.pc, 0);
+ uint64_t opcode = desc.opptr.q[0] = m_core->m_pcache.read_qword(desc.pc, 0);
desc.length = 1;
desc.cycles = 1;
diff --git a/src/devices/cpu/mb86235/mb86235ops.cpp b/src/devices/cpu/mb86235/mb86235ops.cpp
index c21b6c8836f..e79b9240cce 100644
--- a/src/devices/cpu/mb86235/mb86235ops.cpp
+++ b/src/devices/cpu/mb86235/mb86235ops.cpp
@@ -144,15 +144,15 @@ inline uint32_t mb86235_device::decode_ea(uint8_t mode, uint8_t rx, uint8_t ry,
inline uint32_t mb86235_device::read_bus(bool isbbus, uint32_t addr)
{
- return isbbus == true ? m_datab->read_dword(addr & 0x3ff) : m_dataa->read_dword(addr & 0x3ff);
+ return isbbus == true ? m_datab.read_dword(addr & 0x3ff) : m_dataa.read_dword(addr & 0x3ff);
}
inline void mb86235_device::write_bus(bool isbbus, uint32_t addr, uint32_t data)
{
if(isbbus == true)
- m_datab->write_dword(addr & 0x3ff,data);
+ m_datab.write_dword(addr & 0x3ff,data);
else
- m_dataa->write_dword(addr & 0x3ff,data);
+ m_dataa.write_dword(addr & 0x3ff,data);
}
@@ -885,7 +885,7 @@ void mb86235_device::do_trans1_1(uint32_t h, uint32_t l)
uint32_t addr = m_core->eb+m_core->eo;
uint8_t disp_offs = (l >> 19) & 0x3f;
- res = m_dataa->read_dword(addr);
+ res = m_dataa.read_dword(addr);
if(dr & 0x40)
{
bool isbbus = (dr & 0x20) == 0x20;
@@ -998,7 +998,7 @@ void mb86235_device::do_trans1_2(uint32_t h, uint32_t l)
if(l&0x80000000)
disp_offs |= 1;
- res = m_dataa->read_dword(addr);
+ res = m_dataa.read_dword(addr);
if(dr & 0x40)
{
bool isbbus = (dr & 0x20) == 0x20;
@@ -1035,7 +1035,7 @@ void mb86235_device::do_trans1_2(uint32_t h, uint32_t l)
else
res = get_transfer_reg(sr);
- m_dataa->write_dword(addr,res);
+ m_dataa.write_dword(addr,res);
if(disp_offs & 0x20)
m_core->eo -= disp_offs & 0x1f;
else
@@ -1206,10 +1206,10 @@ void mb86235_device::do_control(uint32_t h, uint32_t l)
case 0x04: // PUSH
m_core->sp --;
m_core->sp &= 0x3ff;
- m_datab->write_dword(m_core->sp,get_transfer_reg((ef2>>6) & 0x3f));
+ m_datab.write_dword(m_core->sp,get_transfer_reg((ef2>>6) & 0x3f));
break;
case 0x05: // POP
- set_transfer_reg((ef2>>6) & 0x3f, m_datab->read_dword(m_core->sp));
+ set_transfer_reg((ef2>>6) & 0x3f, m_datab.read_dword(m_core->sp));
m_core->sp ++;
m_core->sp &= 0x3ff;
break;
diff --git a/src/devices/cpu/mb88xx/mb88xx.cpp b/src/devices/cpu/mb88xx/mb88xx.cpp
index b02d8b50304..56f990cd599 100644
--- a/src/devices/cpu/mb88xx/mb88xx.cpp
+++ b/src/devices/cpu/mb88xx/mb88xx.cpp
@@ -47,10 +47,10 @@ DEFINE_DEVICE_TYPE(MB8844, mb8844_cpu_device, "mb8844", "Fujitsu MB8844")
MACROS
***************************************************************************/
-#define READOP(a) (m_cache->read_byte(a))
+#define READOP(a) (m_cache.read_byte(a))
-#define RDMEM(a) (m_data->read_byte(a))
-#define WRMEM(a,v) (m_data->write_byte((a), (v)))
+#define RDMEM(a) (m_data.read_byte(a))
+#define WRMEM(a,v) (m_data.write_byte((a), (v)))
#define TEST_ST() (m_st & 1)
#define TEST_ZF() (m_zf & 1)
@@ -182,9 +182,9 @@ std::unique_ptr<util::disasm_interface> mb88_cpu_device::create_disassembler()
void mb88_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
- m_data = &space(AS_DATA);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
m_read_k.resolve_safe(0);
m_write_o.resolve_safe();
diff --git a/src/devices/cpu/mb88xx/mb88xx.h b/src/devices/cpu/mb88xx/mb88xx.h
index 2dbd4b63f86..df9c3dc283c 100644
--- a/src/devices/cpu/mb88xx/mb88xx.h
+++ b/src/devices/cpu/mb88xx/mb88xx.h
@@ -177,9 +177,10 @@ private:
/* IRQ handling */
uint8_t m_pending_interrupt;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
- address_space *m_data;
+ memory_access<11, 0, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<11, 0, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access< 7, 0, 0, ENDIANNESS_BIG>::specific m_data;
+
int m_icount;
// For the debugger
diff --git a/src/devices/cpu/mc68hc11/mc68hc11.cpp b/src/devices/cpu/mc68hc11/mc68hc11.cpp
index 453c048231f..3aa83784ca7 100644
--- a/src/devices/cpu/mc68hc11/mc68hc11.cpp
+++ b/src/devices/cpu/mc68hc11/mc68hc11.cpp
@@ -552,13 +552,13 @@ void mc68hc11m0_device::io_map(address_map &map)
uint8_t mc68hc11_cpu_device::FETCH()
{
- return m_cache->read_byte(m_pc++);
+ return m_cache.read_byte(m_pc++);
}
uint16_t mc68hc11_cpu_device::FETCH16()
{
uint16_t w;
- w = m_cache->read_word(m_pc);
+ w = m_cache.read_word(m_pc);
m_pc += 2;
return w;
}
@@ -567,28 +567,28 @@ uint8_t mc68hc11_cpu_device::READ8(uint32_t address)
{
if(address >= m_reg_position && (address - m_reg_position) < m_reg_block_size)
{
- return m_io->read_byte(address-m_reg_position);
+ return m_io.read_byte(address-m_reg_position);
}
else if(address >= m_ram_position && address < m_ram_position+m_internal_ram_size)
{
- return m_data->read_byte(address-m_ram_position);
+ return m_data.read_byte(address-m_ram_position);
}
- return m_program->read_byte(address);
+ return m_program.read_byte(address);
}
void mc68hc11_cpu_device::WRITE8(uint32_t address, uint8_t value)
{
if(address >= m_reg_position && (address - m_reg_position) < m_reg_block_size)
{
- m_io->write_byte(address-m_reg_position, value);
+ m_io.write_byte(address-m_reg_position, value);
return;
}
else if(address >= m_ram_position && address < m_ram_position+m_internal_ram_size)
{
- m_data->write_byte(address-m_ram_position, value);
+ m_data.write_byte(address-m_ram_position, value);
return;
}
- m_program->write_byte(address, value);
+ m_program.write_byte(address, value);
}
uint16_t mc68hc11_cpu_device::READ16(uint32_t address)
@@ -639,10 +639,10 @@ void mc68hc11_cpu_device::device_start()
}
}
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_pc));
save_item(NAME(m_ix));
diff --git a/src/devices/cpu/mc68hc11/mc68hc11.h b/src/devices/cpu/mc68hc11/mc68hc11.h
index c6b55d88279..33b6ab4be33 100644
--- a/src/devices/cpu/mc68hc11/mc68hc11.h
+++ b/src/devices/cpu/mc68hc11/mc68hc11.h
@@ -141,10 +141,10 @@ private:
int m_ad_channel;
uint8_t m_irq_state[2];
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
- address_space *m_program;
- address_space *m_data;
- address_space *m_io;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access<11, 0, 0, ENDIANNESS_BIG>::specific m_data;
+ memory_access< 8, 0, 0, ENDIANNESS_BIG>::specific m_io;
devcb_read8::array<8> m_port_input_cb;
devcb_write8::array<8> m_port_output_cb;
devcb_read8::array<8> m_analog_cb;
diff --git a/src/devices/cpu/mcs40/mcs40.cpp b/src/devices/cpu/mcs40/mcs40.cpp
index e973d1ab549..969f08c4197 100644
--- a/src/devices/cpu/mcs40/mcs40.cpp
+++ b/src/devices/cpu/mcs40/mcs40.cpp
@@ -102,7 +102,6 @@ mcs40_cpu_device_base::mcs40_cpu_device_base(
{ "ramport", ENDIANNESS_LITTLE, 8, u8(5), 0 },
{ "program", ENDIANNESS_LITTLE, 8, u8(rom_width - 3), 0 }, }
, m_spaces{ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }
- , m_cache(nullptr)
, m_bus_cycle_cb(*this)
, m_sync_cb(*this)
, m_cm_rom_cb(*this)
@@ -142,7 +141,7 @@ void mcs40_cpu_device_base::device_start()
m_spaces[AS_RAM_STATUS] = &space(AS_RAM_STATUS);
m_spaces[AS_RAM_PORTS] = &space(AS_RAM_PORTS);
m_spaces[AS_PROGRAM_MEMORY] = &space(AS_PROGRAM_MEMORY);
- m_cache = m_spaces[AS_ROM]->cache<0, 0, ENDIANNESS_LITTLE>();
+ m_spaces[AS_ROM]->cache(m_cache);
m_bus_cycle_cb.resolve();
m_sync_cb.resolve_safe();
@@ -633,7 +632,7 @@ inline void mcs40_cpu_device_base::do_m1()
update_cm_rom(0x0fU);
}
// TODO: just read the high nybble here - MAME doesn't support this
- u8 const read = m_cache->read_byte(rom_bank() | m_rom_addr);
+ u8 const read = m_cache.read_byte(rom_bank() | m_rom_addr);
if (cycle::OP == m_cycle)
{
m_opr = (m_stop_ff) ? 0x0U : (read >> 4);
@@ -651,7 +650,7 @@ inline void mcs40_cpu_device_base::do_m1()
inline void mcs40_cpu_device_base::do_m2()
{
// TODO: just read the low nybble here - MAME doesn't support this
- u8 const read = m_cache->read_byte(rom_bank() | m_rom_addr);
+ u8 const read = m_cache.read_byte(rom_bank() | m_rom_addr);
if (cycle::OP == m_cycle)
m_opa = (m_stop_ff) ? 0x0U : (read & 0x0fU);
else
diff --git a/src/devices/cpu/mcs40/mcs40.h b/src/devices/cpu/mcs40/mcs40.h
index 7bd595dba34..68a8dca161f 100644
--- a/src/devices/cpu/mcs40/mcs40.h
+++ b/src/devices/cpu/mcs40/mcs40.h
@@ -182,7 +182,7 @@ private:
// address spaces
address_space_config const m_space_config[7];
address_space *m_spaces[7];
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<12, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
// bus snooping callback
bus_cycle_delegate m_bus_cycle_cb;
diff --git a/src/devices/cpu/mcs48/mcs48.cpp b/src/devices/cpu/mcs48/mcs48.cpp
index a2a3fbf0bb1..c85a3a2e79b 100644
--- a/src/devices/cpu/mcs48/mcs48.cpp
+++ b/src/devices/cpu/mcs48/mcs48.cpp
@@ -391,7 +391,7 @@ uint8_t mcs48_cpu_device::opcode_fetch()
{
uint16_t address = m_pc;
m_pc = ((m_pc + 1) & 0x7ff) | (m_pc & 0x800);
- return m_cache->read_byte(address);
+ return m_program.read_byte(address);
}
@@ -404,7 +404,7 @@ uint8_t mcs48_cpu_device::argument_fetch()
{
uint16_t address = m_pc;
m_pc = ((m_pc + 1) & 0x7ff) | (m_pc & 0x800);
- return m_cache->read_byte(address);
+ return m_program.read_byte(address);
}
@@ -1114,10 +1114,10 @@ void mcs48_cpu_device::device_start()
/* FIXME: Current implementation suboptimal */
m_ea = (m_int_rom_size ? 0 : 1);
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
- m_io = (m_feature_mask & EXT_BUS_FEATURE) != 0 ? &space(AS_IO) : nullptr;
+ space(AS_PROGRAM).cache(m_program);
+ space(AS_DATA).specific(m_data);
+ if(m_feature_mask & EXT_BUS_FEATURE)
+ space(AS_IO).specific(m_io);
// resolve callbacks
m_port_in_cb.resolve_all_safe(0xff);
@@ -1243,7 +1243,7 @@ int mcs48_cpu_device::check_irqs()
// force JNI to be taken (hack)
if (m_irq_polled)
- m_pc = ((m_pc - 1) & 0xf00) | m_cache->read_byte(m_pc - 1);
+ m_pc = ((m_pc - 1) & 0xf00) | m_program.read_byte(m_pc - 1);
/* transfer to location 0x03 */
push_pc_psw();
diff --git a/src/devices/cpu/mcs48/mcs48.h b/src/devices/cpu/mcs48/mcs48.h
index 8041d11a89d..572c09b6bec 100644
--- a/src/devices/cpu/mcs48/mcs48.h
+++ b/src/devices/cpu/mcs48/mcs48.h
@@ -216,10 +216,9 @@ protected:
int m_icount;
/* Memory spaces */
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<12, 0, 0, ENDIANNESS_LITTLE>::cache m_program;
+ memory_access<8, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access<8, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
required_shared_ptr<uint8_t> m_dataptr;
@@ -235,15 +234,15 @@ protected:
const mcs48_ophandler *const m_opcode_table;
/* ROM is mapped to AS_PROGRAM */
- uint8_t program_r(offs_t a) { return m_program->read_byte(a); }
+ uint8_t program_r(offs_t a) { return m_program.read_byte(a); }
/* RAM is mapped to AS_DATA */
- uint8_t ram_r(offs_t a) { return m_data->read_byte(a); }
- void ram_w(offs_t a, uint8_t v) { m_data->write_byte(a, v); }
+ uint8_t ram_r(offs_t a) { return m_data.read_byte(a); }
+ void ram_w(offs_t a, uint8_t v) { m_data.write_byte(a, v); }
/* ports are mapped to AS_IO and callbacks */
- uint8_t ext_r(offs_t a) { return m_io->read_byte(a); }
- void ext_w(offs_t a, uint8_t v) { m_io->write_byte(a, v); }
+ uint8_t ext_r(offs_t a) { return m_io.read_byte(a); }
+ void ext_w(offs_t a, uint8_t v) { m_io.write_byte(a, v); }
uint8_t port_r(offs_t a) { return m_port_in_cb[a - 1](); }
void port_w(offs_t a, uint8_t v) { m_port_out_cb[a - 1](v); }
int test_r(offs_t a) { return m_test_in_cb[a](); }
diff --git a/src/devices/cpu/mcs51/mcs51.cpp b/src/devices/cpu/mcs51/mcs51.cpp
index a76e2bb5ea4..66eb3f50316 100644
--- a/src/devices/cpu/mcs51/mcs51.cpp
+++ b/src/devices/cpu/mcs51/mcs51.cpp
@@ -418,15 +418,15 @@ device_memory_interface::space_config_vector mcs51_cpu_device::memory_space_conf
***************************************************************************/
/* Read Opcode/Opcode Arguments from Program Code */
-#define ROP(pc) m_cache->read_byte(pc)
-#define ROP_ARG(pc) m_cache->read_byte(pc)
+#define ROP(pc) m_program.read_byte(pc)
+#define ROP_ARG(pc) m_program.read_byte(pc)
/* Read a byte from External Code Memory (Usually Program Rom(s) Space) */
-#define CODEMEM_R(a) (uint8_t)m_program->read_byte(a)
+#define CODEMEM_R(a) (uint8_t)m_program.read_byte(a)
/* Read/Write a byte from/to External Data Memory (Usually RAM or other I/O) */
-#define DATAMEM_R(a) (uint8_t)m_io->read_byte(a)
-#define DATAMEM_W(a,v) m_io->write_byte(a, v)
+#define DATAMEM_R(a) (uint8_t)m_io.read_byte(a)
+#define DATAMEM_W(a,v) m_io.write_byte(a, v)
/* Read/Write a byte from/to the Internal RAM */
@@ -435,8 +435,8 @@ device_memory_interface::space_config_vector mcs51_cpu_device::memory_space_conf
/* Read/Write a byte from/to the Internal RAM indirectly */
/* (called from indirect addressing) */
-uint8_t mcs51_cpu_device::iram_iread(offs_t a) { return (a <= m_ram_mask) ? m_data->read_byte(a) : 0xff; }
-void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m_data->write_byte(a, d); }
+uint8_t mcs51_cpu_device::iram_iread(offs_t a) { return (a <= m_ram_mask) ? m_data.read_byte(a) : 0xff; }
+void mcs51_cpu_device::iram_iwrite(offs_t a, uint8_t d) { if (a <= m_ram_mask) m_data.write_byte(a, d); }
#define IRAM_IR(a) iram_iread(a)
#define IRAM_IW(a, d) iram_iwrite(a, d)
@@ -829,13 +829,13 @@ offs_t mcs51_cpu_device::external_ram_iaddr(offs_t offset, offs_t mem_mask)
uint8_t mcs51_cpu_device::iram_read(size_t offset)
{
- return (((offset) < 0x80) ? m_data->read_byte(offset) : sfr_read(offset));
+ return (((offset) < 0x80) ? m_data.read_byte(offset) : sfr_read(offset));
}
void mcs51_cpu_device::iram_write(size_t offset, uint8_t data)
{
if ((offset) < 0x80)
- m_data->write_byte(offset, data);
+ m_data.write_byte(offset, data);
else
sfr_write(offset, data);
}
@@ -2012,7 +2012,7 @@ void mcs51_cpu_device::execute_run()
/* Read next opcode */
PPC = PC;
debugger_instruction_hook(PC);
- op = m_cache->read_byte(PC++);
+ op = m_program.read_byte(PC++);
/* process opcode and count cycles */
m_inst_cycles = mcs51_cycles[op];
@@ -2079,7 +2079,7 @@ void mcs51_cpu_device::sfr_write(size_t offset, uint8_t data)
/* no write in this case according to manual */
return;
}
- m_data->write_byte((size_t)offset | 0x100, data);
+ m_data.write_byte((size_t)offset | 0x100, data);
}
uint8_t mcs51_cpu_device::sfr_read(size_t offset)
@@ -2114,7 +2114,7 @@ uint8_t mcs51_cpu_device::sfr_read(size_t offset)
case ADDR_SBUF:
case ADDR_IE:
case ADDR_IP:
- return m_data->read_byte((size_t) offset | 0x100);
+ return m_data.read_byte((size_t) offset | 0x100);
/* Illegal or non-implemented sfr */
default:
LOG(("mcs51 '%s': attemping to read an invalid/non-implemented SFR address: %x at 0x%04x\n", tag(), (uint32_t)offset,PC));
@@ -2126,10 +2126,9 @@ uint8_t mcs51_cpu_device::sfr_read(size_t offset)
void mcs51_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
m_port_in_cb.resolve_all_safe(0xff);
m_port_out_cb.resolve_all_safe();
@@ -2321,7 +2320,7 @@ void i8052_device::sfr_write(size_t offset, uint8_t data)
case ADDR_RCAP2H:
case ADDR_TL2:
case ADDR_TH2:
- m_data->write_byte((size_t) offset | 0x100, data);
+ m_data.write_byte((size_t) offset | 0x100, data);
break;
default:
@@ -2339,7 +2338,7 @@ uint8_t i8052_device::sfr_read(size_t offset)
case ADDR_RCAP2H:
case ADDR_TL2:
case ADDR_TH2:
- return m_data->read_byte((size_t) offset | 0x100);
+ return m_data.read_byte((size_t) offset | 0x100);
default:
return mcs51_cpu_device::sfr_read(offset);
}
@@ -2369,7 +2368,7 @@ void i80c52_device::sfr_write(size_t offset, uint8_t data)
i8052_device::sfr_write(offset, data);
return;
}
- m_data->write_byte((size_t) offset | 0x100, data);
+ m_data.write_byte((size_t) offset | 0x100, data);
}
uint8_t i80c52_device::sfr_read(size_t offset)
@@ -2380,7 +2379,7 @@ uint8_t i80c52_device::sfr_read(size_t offset)
case ADDR_IPH:
case ADDR_SADDR:
case ADDR_SADEN:
- return m_data->read_byte((size_t) offset | 0x100);
+ return m_data.read_byte((size_t) offset | 0x100);
default:
return i8052_device::sfr_read(offset);
}
@@ -2434,7 +2433,7 @@ void ds5002fp_device::sfr_write(size_t offset, uint8_t data)
mcs51_cpu_device::sfr_write(offset, data);
return;
}
- m_data->write_byte((size_t) offset | 0x100, data);
+ m_data.write_byte((size_t) offset | 0x100, data);
}
uint8_t ds5002fp_device::sfr_read(size_t offset)
@@ -2455,7 +2454,7 @@ uint8_t ds5002fp_device::sfr_read(size_t offset)
default:
return mcs51_cpu_device::sfr_read(offset);
}
- return m_data->read_byte((size_t) offset | 0x100);
+ return m_data.read_byte((size_t) offset | 0x100);
}
/*
diff --git a/src/devices/cpu/mcs51/mcs51.h b/src/devices/cpu/mcs51/mcs51.h
index 169cf77c11a..b273903bf00 100644
--- a/src/devices/cpu/mcs51/mcs51.h
+++ b/src/devices/cpu/mcs51/mcs51.h
@@ -148,10 +148,9 @@ protected:
virtual uint8_t sfr_read(size_t offset);
/* Memory spaces */
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_program;
+ memory_access< 9, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access<17, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
devcb_read8::array<4> m_port_in_cb;
devcb_write8::array<4> m_port_out_cb;
diff --git a/src/devices/cpu/mcs96/mcs96.cpp b/src/devices/cpu/mcs96/mcs96.cpp
index 7070645bb52..e1524462f13 100644
--- a/src/devices/cpu/mcs96/mcs96.cpp
+++ b/src/devices/cpu/mcs96/mcs96.cpp
@@ -26,11 +26,11 @@ void mcs96_device::device_start()
{
program = &space(AS_PROGRAM);
if(program->data_width() == 8) {
- auto cache = program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_pr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
+ program->cache(m_cache8);
+ m_pr8 = [this](offs_t address) -> u8 { return m_cache8.read_byte(address); };
} else {
- auto cache = program->cache<1, 0, ENDIANNESS_LITTLE>();
- m_pr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
+ program->cache(m_cache16);
+ m_pr8 = [this](offs_t address) -> u8 { return m_cache16.read_byte(address); };
}
regs = &space(AS_DATA);
diff --git a/src/devices/cpu/mcs96/mcs96.h b/src/devices/cpu/mcs96/mcs96.h
index f24ad31a53b..b27d13044c7 100644
--- a/src/devices/cpu/mcs96/mcs96.h
+++ b/src/devices/cpu/mcs96/mcs96.h
@@ -65,6 +65,8 @@ protected:
address_space_config program_config, regs_config;
address_space *program, *regs;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_cache8;
+ memory_access<16, 1, 0, ENDIANNESS_LITTLE>::cache m_cache16;
std::function<u8 (offs_t address)> m_pr8;
required_shared_ptr<u16> register_file;
diff --git a/src/devices/cpu/mips/mips3.cpp b/src/devices/cpu/mips/mips3.cpp
index 62fa0c4b77f..56d25c5f73a 100644
--- a/src/devices/cpu/mips/mips3.cpp
+++ b/src/devices/cpu/mips/mips3.cpp
@@ -401,30 +401,30 @@ void mips3_device::device_start()
{
if (m_data_bits == 32)
{
- auto cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ m_program->cache(m_cache32le);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cache32le.read_dword(address); };
+ m_prptr = [this](offs_t address) -> const void * { return m_cache32le.read_ptr(address); };
}
else
{
- auto cache = m_program->cache<3, 0, ENDIANNESS_LITTLE>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ m_program->cache(m_cache64le);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cache64le.read_dword(address); };
+ m_prptr = [this](offs_t address) -> const void * { return m_cache64le.read_ptr(address); };
}
}
else
{
if (m_data_bits == 32)
{
- auto cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ m_program->cache(m_cache32be);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cache32be.read_dword(address); };
+ m_prptr = [this](offs_t address) -> const void * { return m_cache32be.read_ptr(address); };
}
else
{
- auto cache = m_program->cache<3, 0, ENDIANNESS_BIG>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ m_program->cache(m_cache64be);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cache64be.read_dword(address); };
+ m_prptr = [this](offs_t address) -> const void * { return m_cache64be.read_ptr(address); };
}
}
diff --git a/src/devices/cpu/mips/mips3.h b/src/devices/cpu/mips/mips3.h
index 6f4081bcb61..9a6be2c98f6 100644
--- a/src/devices/cpu/mips/mips3.h
+++ b/src/devices/cpu/mips/mips3.h
@@ -401,6 +401,11 @@ protected:
uint8_t *m_icache;
address_space_config m_program_config;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache32le;
+ memory_access<32, 3, 0, ENDIANNESS_LITTLE>::cache m_cache64le;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cache32be;
+ memory_access<32, 3, 0, ENDIANNESS_BIG>::cache m_cache64be;
+
mips3_flavor m_flavor;
/* internal stuff */
diff --git a/src/devices/cpu/nanoprocessor/nanoprocessor.cpp b/src/devices/cpu/nanoprocessor/nanoprocessor.cpp
index 8152f8f97c7..198ce26b619 100644
--- a/src/devices/cpu/nanoprocessor/nanoprocessor.cpp
+++ b/src/devices/cpu/nanoprocessor/nanoprocessor.cpp
@@ -80,9 +80,9 @@ void hp_nanoprocessor_device::device_start()
state_add(NANO_REG_ISR, "ISR", m_reg_ISR).formatstr("%03X");
state_add(STATE_GENFLAGS, "GENFLAGS", m_flags).noshow().formatstr("%10s");
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_reg_A));
save_item(NAME(m_reg_R));
@@ -457,12 +457,12 @@ void hp_nanoprocessor_device::execute_one(uint8_t opcode)
switch (opcode & 0xf0) {
case 0x40:
// INA
- m_reg_A = m_io->read_byte(opcode & 0xf);
+ m_reg_A = m_io.read_byte(opcode & 0xf);
break;
case 0x50:
// OTA
- m_io->write_byte(opcode & 0xf, m_reg_A);
+ m_io.write_byte(opcode & 0xf, m_reg_A);
break;
case 0x60:
@@ -477,7 +477,7 @@ void hp_nanoprocessor_device::execute_one(uint8_t opcode)
case 0xc0:
// OTR
- m_io->write_byte(opcode & 0xf, fetch());
+ m_io.write_byte(opcode & 0xf, fetch());
break;
case 0xd0:
@@ -510,7 +510,7 @@ uint16_t hp_nanoprocessor_device::pa_offset(unsigned off) const
uint8_t hp_nanoprocessor_device::fetch(void)
{
- uint8_t res = m_cache->read_byte(m_reg_PA);
+ uint8_t res = m_cache.read_byte(m_reg_PA);
m_reg_PA = pa_offset(1);
return res;
}
diff --git a/src/devices/cpu/nanoprocessor/nanoprocessor.h b/src/devices/cpu/nanoprocessor/nanoprocessor.h
index b172d3e1b6d..e5260a950e6 100644
--- a/src/devices/cpu/nanoprocessor/nanoprocessor.h
+++ b/src/devices/cpu/nanoprocessor/nanoprocessor.h
@@ -113,9 +113,9 @@ private:
address_space_config m_program_config;
address_space_config m_io_config;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
- address_space *m_io;
+ memory_access<11, 0, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<11, 0, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access< 4, 0, 0, ENDIANNESS_BIG>::specific m_io;
// device_t overrides
virtual void device_start() override;
diff --git a/src/devices/cpu/nec/nec.cpp b/src/devices/cpu/nec/nec.cpp
index 09469dcad16..2a9546977c2 100644
--- a/src/devices/cpu/nec/nec.cpp
+++ b/src/devices/cpu/nec/nec.cpp
@@ -497,19 +497,19 @@ void nec_common_device::device_start()
m_program = &space(AS_PROGRAM);
if (m_program->data_width() == 8)
{
- auto cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_dr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
+ m_program->cache(m_cache8);
+ m_dr8 = [this](offs_t address) -> u8 { return m_cache8.read_byte(address); };
}
else if (m_chip_type == V33_TYPE)
{
save_item(NAME(m_xa));
- auto cache = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
- m_dr8 = [cache, this](offs_t address) -> u8 { return cache->read_byte(v33_translate(address)); };
+ m_program->cache(m_cache16);
+ m_dr8 = [this](offs_t address) -> u8 { return m_cache16.read_byte(v33_translate(address)); };
}
else
{
- auto cache = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
- m_dr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
+ m_program->cache(m_cache16);
+ m_dr8 = [this](offs_t address) -> u8 { return m_cache16.read_byte(address); };
}
m_io = &space(AS_IO);
diff --git a/src/devices/cpu/nec/nec.h b/src/devices/cpu/nec/nec.h
index 7734c1dd40c..025aecc17fc 100644
--- a/src/devices/cpu/nec/nec.h
+++ b/src/devices/cpu/nec/nec.h
@@ -102,6 +102,9 @@ private:
uint8_t m_halted;
address_space *m_program;
+ memory_access<24, 0, 0, ENDIANNESS_LITTLE>::cache m_cache8;
+ memory_access<24, 1, 0, ENDIANNESS_LITTLE>::cache m_cache16;
+
std::function<u8 (offs_t address)> m_dr8;
address_space *m_io;
int m_icount;
diff --git a/src/devices/cpu/nec/v25.cpp b/src/devices/cpu/nec/v25.cpp
index 9d57b0f2733..f4785ba9af0 100644
--- a/src/devices/cpu/nec/v25.cpp
+++ b/src/devices/cpu/nec/v25.cpp
@@ -621,11 +621,11 @@ void v25_common_device::device_start()
m_program = &space(AS_PROGRAM);
if(m_program->data_width() == 8) {
- auto cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_dr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
+ m_program->cache(m_cache8);
+ m_dr8 = [this](offs_t address) -> u8 { return m_cache8.read_byte(address); };
} else {
- auto cache = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
- m_dr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
+ m_program->cache(m_cache16);
+ m_dr8 = [this](offs_t address) -> u8 { return m_cache16.read_byte(address); };
}
m_data = &space(AS_DATA);
m_io = &space(AS_IO);
diff --git a/src/devices/cpu/nec/v25.h b/src/devices/cpu/nec/v25.h
index 8d37752c85d..e3cf7e9a80b 100644
--- a/src/devices/cpu/nec/v25.h
+++ b/src/devices/cpu/nec/v25.h
@@ -78,6 +78,9 @@ private:
address_space_config m_data_config;
address_space_config m_io_config;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_cache8;
+ memory_access<20, 1, 0, ENDIANNESS_LITTLE>::cache m_cache16;
+
/* internal RAM and register banks */
required_shared_ptr<uint16_t> m_internal_ram;
diff --git a/src/devices/cpu/pace/pace.cpp b/src/devices/cpu/pace/pace.cpp
index b971edc41fa..2bfba2cc338 100644
--- a/src/devices/cpu/pace/pace.cpp
+++ b/src/devices/cpu/pace/pace.cpp
@@ -65,8 +65,6 @@ ALLOW_SAVE_TYPE(pace_device::cycle);
pace_device::pace_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: cpu_device(mconfig, type, tag, owner, clock)
, m_space_config("program", ENDIANNESS_LITTLE, 16, 16, -1)
- , m_space(nullptr)
- , m_cache(nullptr)
, m_bps_callback(*this)
, m_jc_callback(*this)
, m_flag_callback(*this)
@@ -132,8 +130,8 @@ void pace_device::device_resolve_objects()
void pace_device::device_start()
{
// get memory spaces
- m_space = &space(AS_PROGRAM);
- m_cache = m_space->cache<1, -1, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_space);
set_icountptr(m_icount);
@@ -542,7 +540,7 @@ void pace_device::read_instruction()
// TODO: interrupt check
m_ppc = m_pc;
debugger_instruction_hook(m_pc);
- m_mdr = m_cache->read_word(m_pc++);
+ m_mdr = m_cache.read_word(m_pc++);
m_cir = m_mdr >> 6;
sign_extend(m_mdr);
}
@@ -583,12 +581,7 @@ void pace_device::read_effective_address()
{
// All opcodes with bit 15 set read from an EA except RTS and non-indirect ST
if (m_cir > 0x200 && (m_cir & 0x3c0) != 0x340)
- {
- if ((m_cir & 0x00c) == 0x004)
- m_mdr = m_cache->read_word(m_mar);
- else
- m_mdr = m_space->read_word(m_mar);
- }
+ m_mdr = m_space.read_word(m_mar);
}
@@ -599,10 +592,7 @@ void pace_device::read_effective_address()
void pace_device::write_effective_address(u16 r)
{
- if ((m_cir & 0x00c) == 0x004)
- m_cache->write_word(m_mar, r);
- else
- m_space->write_word(m_mar, r);
+ m_space.write_word(m_mar, r);
}
@@ -733,7 +723,7 @@ pace_device::cycle pace_device::execute_one()
return cycle::IFETCH_M1;
case cycle::LD_IND_M4:
- m_mdr = m_space->read_word(m_mdr);
+ m_mdr = m_space.read_word(m_mdr);
return cycle::LD_IND_M5;
case cycle::LD_IND_M5:
@@ -745,11 +735,11 @@ pace_device::cycle pace_device::execute_one()
return cycle::IFETCH_M1;
case cycle::ST_IND_M4:
- m_space->write_word(m_mdr, m_ac[0]);
+ m_space.write_word(m_mdr, m_ac[0]);
return cycle::IFETCH_M1;
case cycle::LSEX_M4:
- m_mdr = m_space->read_word(m_mdr);
+ m_mdr = m_space.read_word(m_mdr);
sign_extend(m_mdr);
return cycle::IFETCH_M1;
diff --git a/src/devices/cpu/pace/pace.h b/src/devices/cpu/pace/pace.h
index 5af18e3dbe8..c96c38e5c02 100644
--- a/src/devices/cpu/pace/pace.h
+++ b/src/devices/cpu/pace/pace.h
@@ -182,8 +182,8 @@ private:
// address space and cache
address_space_config m_space_config;
- address_space *m_space;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_space;
// callback objects
devcb_read_line m_bps_callback;
diff --git a/src/devices/cpu/pic16c5x/pic16c5x.cpp b/src/devices/cpu/pic16c5x/pic16c5x.cpp
index 21907b7d369..715cf574ee1 100644
--- a/src/devices/cpu/pic16c5x/pic16c5x.cpp
+++ b/src/devices/cpu/pic16c5x/pic16c5x.cpp
@@ -197,14 +197,14 @@ std::unique_ptr<util::disasm_interface> pic16c5x_device::create_disassembler()
void pic16c5x_device::update_internalram_ptr()
{
- m_internalram = (uint8_t *)m_data->get_write_ptr(0x00);
+ m_internalram = (uint8_t *)space(AS_DATA).get_write_ptr(0x00);
}
-#define PIC16C5x_RDOP(A) (m_cache->read_word(A))
-#define PIC16C5x_RAM_RDMEM(A) ((uint8_t)m_data->read_byte(A))
-#define PIC16C5x_RAM_WRMEM(A,V) (m_data->write_byte(A,V))
+#define PIC16C5x_RDOP(A) (m_program.read_word(A))
+#define PIC16C5x_RAM_RDMEM(A) ((uint8_t)m_data.read_byte(A))
+#define PIC16C5x_RAM_WRMEM(A,V) (m_data.write_byte(A,V))
#define M_RDRAM(A) (((A) < 9) ? m_internalram[A] : PIC16C5x_RAM_RDMEM(A))
#define M_WRTRAM(A,V) do { if ((A) < 9) m_internalram[A] = (V); else PIC16C5x_RAM_WRMEM(A,V); } while (0)
@@ -887,9 +887,8 @@ enum
void pic16c5x_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
+ space(AS_PROGRAM).cache(m_program);
+ space(AS_DATA).specific(m_data);
m_read_a.resolve_safe(0);
m_read_b.resolve_safe(0);
diff --git a/src/devices/cpu/pic16c5x/pic16c5x.h b/src/devices/cpu/pic16c5x/pic16c5x.h
index e9e11b85778..8936a22d3a3 100644
--- a/src/devices/cpu/pic16c5x/pic16c5x.h
+++ b/src/devices/cpu/pic16c5x/pic16c5x.h
@@ -143,9 +143,8 @@ private:
uint8_t m_picRAMmask;
int m_inst_cycles;
- address_space *m_program;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_data;
+ memory_access<11, 1, -1, ENDIANNESS_LITTLE>::cache m_program;
+ memory_access< 7, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
// i/o handlers
devcb_read8 m_read_a;
diff --git a/src/devices/cpu/pic16c62x/pic16c62x.cpp b/src/devices/cpu/pic16c62x/pic16c62x.cpp
index 6263fd04f42..166b26b731e 100644
--- a/src/devices/cpu/pic16c62x/pic16c62x.cpp
+++ b/src/devices/cpu/pic16c62x/pic16c62x.cpp
@@ -187,16 +187,16 @@ std::unique_ptr<util::disasm_interface> pic16c62x_device::create_disassembler()
void pic16c62x_device::update_internalram_ptr()
{
- m_internalram = (uint8_t *)m_data->get_write_ptr(0x00);
+ m_internalram = (uint8_t *)m_data.space().get_write_ptr(0x00);
}
-#define PIC16C62x_RDOP(A) (m_cache->read_word(A))
-#define PIC16C62x_RAM_RDMEM(A) ((uint8_t)m_data->read_byte(A))
-#define PIC16C62x_RAM_WRMEM(A,V) (m_data->write_byte(A,V))
-#define PIC16C62x_In(Port) ((uint8_t)m_io->read_byte((Port)))
-#define PIC16C62x_Out(Port,Value) (m_io->write_byte((Port),Value))
+#define PIC16C62x_RDOP(A) (m_cache.read_word(A))
+#define PIC16C62x_RAM_RDMEM(A) ((uint8_t)m_data.read_byte(A))
+#define PIC16C62x_RAM_WRMEM(A,V) (m_data.write_byte(A,V))
+#define PIC16C62x_In(Port) ((uint8_t)m_io.read_byte((Port)))
+#define PIC16C62x_Out(Port,Value) (m_io.write_byte((Port),Value))
/************ Read the state of the T0 Clock input signal ************/
-#define PIC16C62x_T0_In (m_io->read_byte(PIC16C62x_T0) >> 4)
+#define PIC16C62x_T0_In (m_io.read_byte(PIC16C62x_T0) >> 4)
#define M_RDRAM(A) (((A) == 0) ? m_internalram[0] : PIC16C62x_RAM_RDMEM(A))
#define M_WRTRAM(A,V) do { if ((A) == 0) m_internalram[0] = (V); else PIC16C62x_RAM_WRMEM(A,V); } while (0)
@@ -887,10 +887,10 @@ void pic16c62x_device::build_opcode_table(void)
void pic16c62x_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
/* ensure the internal ram pointers are set before get_info is called */
update_internalram_ptr();
diff --git a/src/devices/cpu/pic16c62x/pic16c62x.h b/src/devices/cpu/pic16c62x/pic16c62x.h
index 517191f7f37..d0b9390078f 100644
--- a/src/devices/cpu/pic16c62x/pic16c62x.h
+++ b/src/devices/cpu/pic16c62x/pic16c62x.h
@@ -114,10 +114,10 @@ private:
uint8_t m_picRAMmask;
int m_inst_cycles;
- address_space *m_program;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<11, 1, -1, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<11, 1, -1, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access< 8, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access< 5, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
// For debugger
int m_debugger_temp;
diff --git a/src/devices/cpu/powerpc/ppc.h b/src/devices/cpu/powerpc/ppc.h
index 8714fb570aa..8b935f4e58f 100644
--- a/src/devices/cpu/powerpc/ppc.h
+++ b/src/devices/cpu/powerpc/ppc.h
@@ -292,6 +292,8 @@ protected:
address_space_config m_program_config;
address_space *m_program;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cache32;
+ memory_access<32, 3, 0, ENDIANNESS_BIG>::cache m_cache64;
uint32_t c_bus_frequency;
struct internal_ppc_state
diff --git a/src/devices/cpu/powerpc/ppccom.cpp b/src/devices/cpu/powerpc/ppccom.cpp
index aaf40f8acac..9624afe4c23 100644
--- a/src/devices/cpu/powerpc/ppccom.cpp
+++ b/src/devices/cpu/powerpc/ppccom.cpp
@@ -722,24 +722,24 @@ void ppc_device::device_start()
m_program = &space(AS_PROGRAM);
if(m_cap & PPCCAP_4XX)
{
- auto cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ m_program->cache(m_cache32);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cache32.read_dword(address); };
+ m_prptr = [this](offs_t address) -> const void * { return m_cache32.read_ptr(address); };
}
else
{
- auto cache = m_program->cache<3, 0, ENDIANNESS_BIG>();
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword(address); };
+ m_program->cache(m_cache64);
+ m_pr32 = [this](offs_t address) -> u32 { return m_cache64.read_dword(address); };
if(space_config()->m_endianness != ENDIANNESS_NATIVE)
- m_prptr = [cache](offs_t address) -> const void * {
- const u32 *ptr = static_cast<u32 *>(cache->read_ptr(address & ~7));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u32 *ptr = static_cast<u32 *>(m_cache64.read_ptr(address & ~7));
if(!(address & 4))
ptr++;
return ptr;
};
else
- m_prptr = [cache](offs_t address) -> const void * {
- const u32 *ptr = static_cast<u32 *>(cache->read_ptr(address & ~7));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u32 *ptr = static_cast<u32 *>(m_cache64.read_ptr(address & ~7));
if(address & 4)
ptr++;
return ptr;
diff --git a/src/devices/cpu/pps4/pps4.cpp b/src/devices/cpu/pps4/pps4.cpp
index f17b420a004..7f0b9ba70dd 100644
--- a/src/devices/cpu/pps4/pps4.cpp
+++ b/src/devices/cpu/pps4/pps4.cpp
@@ -123,7 +123,7 @@ device_memory_interface::space_config_vector pps4_device::memory_space_config()
*/
u8 pps4_device::M()
{
- u8 ret = m_data->read_byte(m_B & ~m_SAG);
+ u8 ret = m_data.read_byte(m_B & ~m_SAG);
m_SAG = 0;
return ret;
}
@@ -135,7 +135,7 @@ u8 pps4_device::M()
*/
void pps4_device::W(u8 data)
{
- m_data->write_byte(m_B & ~m_SAG, data);
+ m_data.write_byte(m_B & ~m_SAG, data);
m_SAG = 0;
}
@@ -153,7 +153,7 @@ std::unique_ptr<util::disasm_interface> pps4_device::create_disassembler()
*/
inline u8 pps4_device::ROP()
{
- const u8 op = m_cache->read_byte(m_P & 0xFFF);
+ const u8 op = m_cache.read_byte(m_P & 0xFFF);
m_Ip = m_I1; // save previous opcode
m_P = (m_P + 1) & 0xFFF;
m_icount -= 1;
@@ -169,7 +169,7 @@ inline u8 pps4_device::ROP()
*/
inline u8 pps4_device::ARG()
{
- const u8 arg = m_cache->read_byte(m_P & 0xFFF);
+ const u8 arg = m_cache.read_byte(m_P & 0xFFF);
m_P = (m_P + 1) & 0xFFF;
m_icount -= 1;
return arg;
@@ -1237,9 +1237,9 @@ void pps4_device::iIOL()
{
u8 ac = (~m_A & 15);
m_I2 = ARG();
- m_io->write_byte(m_I2, ac);
+ m_io.write_byte(m_I2, ac);
LOG("%s: port:%02x <- %x\n", __FUNCTION__, m_I2, ac);
- ac = m_io->read_byte(m_I2) & 15;
+ ac = m_io.read_byte(m_I2) & 15;
LOG("%s: port:%02x -> %x\n", __FUNCTION__, m_I2, ac);
m_A = ~ac & 15;
}
@@ -1568,10 +1568,10 @@ void pps4_device::execute_run()
void pps4_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_A));
save_item(NAME(m_X));
@@ -1658,9 +1658,10 @@ void pps4_2_device::device_reset()
READ16_MEMBER(pps4_device::address_bus_r)
{
- if (&space == m_io || &space == m_data)
+ int id = space.spacenum();
+ if (id == AS_IO || id == AS_DATA)
return m_B;
- else if (&space == m_program)
+ else if (id == AS_PROGRAM)
return m_P;
else
return 0;
diff --git a/src/devices/cpu/pps4/pps4.h b/src/devices/cpu/pps4/pps4.h
index e3ca3b012bb..f4047e68e99 100644
--- a/src/devices/cpu/pps4/pps4.h
+++ b/src/devices/cpu/pps4/pps4.h
@@ -79,10 +79,10 @@ protected:
devcb_read8 m_dib_cb;
devcb_write8 m_do_cb;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<12, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<12, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<12, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access< 8, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
int m_icount;
u8 m_A; //!< Accumulator A(4:1)
diff --git a/src/devices/cpu/psx/psx.cpp b/src/devices/cpu/psx/psx.cpp
index 58e8997f99b..36f390df5d4 100644
--- a/src/devices/cpu/psx/psx.cpp
+++ b/src/devices/cpu/psx/psx.cpp
@@ -386,7 +386,7 @@ uint8_t psxcpu_device::readbyte( uint32_t address )
{
if( m_bus_attached )
{
- return m_data->read_byte( address );
+ return m_data.read_byte( address );
}
return cache_readword( address ) >> ( ( address & 3 ) * 8 );
@@ -396,7 +396,7 @@ uint16_t psxcpu_device::readhalf( uint32_t address )
{
if( m_bus_attached )
{
- return m_data->read_word( address );
+ return m_data.read_word( address );
}
return cache_readword( address ) >> ( ( address & 2 ) * 8 );
@@ -406,7 +406,7 @@ uint32_t psxcpu_device::readword( uint32_t address )
{
if( m_bus_attached )
{
- return m_data->read_dword( address );
+ return m_data.read_dword( address );
}
return cache_readword( address );
@@ -416,7 +416,7 @@ uint32_t psxcpu_device::readword_masked( uint32_t address, uint32_t mask )
{
if( m_bus_attached )
{
- return m_data->read_dword( address, mask );
+ return m_data.read_dword( address, mask );
}
return cache_readword( address );
@@ -426,7 +426,7 @@ void psxcpu_device::writeword( uint32_t address, uint32_t data )
{
if( m_bus_attached )
{
- m_data->write_dword( address, data );
+ m_data.write_dword( address, data );
}
else
{
@@ -438,7 +438,7 @@ void psxcpu_device::writeword_masked( uint32_t address, uint32_t data, uint32_t
{
if( m_bus_attached )
{
- m_data->write_dword( address, data, mask );
+ m_data.write_dword( address, data, mask );
}
else
{
@@ -1462,7 +1462,7 @@ void psxcpu_device::update_cop0(int reg)
//if (ip & CAUSE_IP5) debugger_interrupt_hook(PSXCPU_IRQ3);
//if (ip & CAUSE_IP6) debugger_interrupt_hook(PSXCPU_IRQ4);
//if (ip & CAUSE_IP7) debugger_interrupt_hook(PSXCPU_IRQ5);
- m_op = m_instruction->read_dword(m_pc);
+ m_op = m_instruction.read_dword(m_pc);
execute_unstoppable_instructions(1);
exception(EXC_INT);
}
@@ -1490,11 +1490,11 @@ void psxcpu_device::fetch_next_op()
{
uint32_t safepc = m_delayv & ~m_bad_word_address_mask;
- m_op = m_instruction->read_dword( safepc );
+ m_op = m_instruction.read_dword( safepc );
}
else
{
- m_op = m_instruction->read_dword( m_pc + 4 );
+ m_op = m_instruction.read_dword( m_pc + 4 );
}
}
@@ -1837,8 +1837,8 @@ void psxcpu_device::device_start()
{
// get our address spaces
m_program = &space( AS_PROGRAM );
- m_instruction = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
- m_data = m_program->specific<2, 0, ENDIANNESS_LITTLE>();
+ m_program->cache(m_instruction);
+ m_program->specific(m_data);
save_item( NAME( m_op ) );
save_item( NAME( m_pc ) );
@@ -2350,7 +2350,7 @@ void psxcpu_device::execute_run()
}
else
{
- m_op = m_instruction->read_dword(m_pc);
+ m_op = m_instruction.read_dword(m_pc);
if( m_berr )
{
diff --git a/src/devices/cpu/psx/psx.h b/src/devices/cpu/psx/psx.h
index 5b57acc4859..57be9a19de9 100644
--- a/src/devices/cpu/psx/psx.h
+++ b/src/devices/cpu/psx/psx.h
@@ -208,8 +208,8 @@ protected:
// address spaces
const address_space_config m_program_config;
address_space *m_program;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE>* m_instruction;
- memory_access_specific<2, 0, ENDIANNESS_LITTLE> *m_data;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_instruction;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_data;
// other internal states
int m_icount;
diff --git a/src/devices/cpu/rii/riscii.cpp b/src/devices/cpu/rii/riscii.cpp
index 7e05eb18055..6351cd60073 100644
--- a/src/devices/cpu/rii/riscii.cpp
+++ b/src/devices/cpu/rii/riscii.cpp
@@ -64,9 +64,6 @@ riscii_series_device::riscii_series_device(const machine_config &mconfig, device
: cpu_device(mconfig, type, tag, owner, clock)
, m_program_config("program", ENDIANNESS_LITTLE, 16, addrbits, -1)
, m_regs_config("register", ENDIANNESS_LITTLE, 8, 8 + bankbits, 0, regs)
- , m_program(nullptr)
- , m_regs(nullptr)
- , m_cache(nullptr)
, m_porta_in_cb(*this)
, m_port_in_cb(*this)
, m_port_out_cb(*this)
@@ -199,9 +196,9 @@ void riscii_series_device::device_resolve_objects()
void riscii_series_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_regs = &space(AS_DATA);
- m_cache = m_program->cache<1, -1, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_regs);
if (m_pcmask > 0xffff)
m_pchstack = make_unique_clear<u8[]>(128);
@@ -1022,7 +1019,7 @@ void riscii_series_device::vocon_w(u8 data)
u16 riscii_series_device::fetch_program_word()
{
- return m_cache->read_word(std::exchange(m_pc, (m_pc + 1) & m_pcmask));
+ return m_cache.read_word(std::exchange(m_pc, (m_pc + 1) & m_pcmask));
}
u16 riscii_series_device::get_banked_address(u8 reg)
@@ -1135,14 +1132,14 @@ void riscii_series_device::multi_byte_borrow(u16 addr, bool cy)
void riscii_series_device::execute_move(u8 dstreg, u8 srcreg)
{
- u8 tmp = m_regs->read_byte(get_banked_address(srcreg));
- m_regs->write_byte(get_banked_address(dstreg), tmp);
+ u8 tmp = m_regs.read_byte(get_banked_address(srcreg));
+ m_regs.write_byte(get_banked_address(dstreg), tmp);
}
void riscii_series_device::execute_add(u8 reg, bool a, bool c)
{
u16 addr = get_banked_address(reg);
- u8 data = m_regs->read_byte(addr);
+ u8 data = m_regs.read_byte(addr);
s16 tmp = s16(s8(data)) + s8(m_acc) + (c ? m_status & 0x01 : 0);
bool cy = u16(data) + m_acc + (c ? m_status & 0x01 : 0) >= 0x100;
bool dc = (data & 0x0f) + (m_acc & 0x0f) + (c ? m_status & 0x01 : 0) >= 0x10;
@@ -1150,7 +1147,7 @@ void riscii_series_device::execute_add(u8 reg, bool a, bool c)
acc_w(tmp & 0xff);
else
{
- m_regs->write_byte(addr, tmp & 0xff);
+ m_regs.write_byte(addr, tmp & 0xff);
multi_byte_carry(addr, cy);
}
m_status = (m_status & 0xc0)
@@ -1165,7 +1162,7 @@ void riscii_series_device::execute_add(u8 reg, bool a, bool c)
void riscii_series_device::execute_sub(u8 reg, bool a, bool c)
{
u16 addr = get_banked_address(reg);
- u8 data = m_regs->read_byte(addr);
+ u8 data = m_regs.read_byte(addr);
s16 tmp = s16(s8(data)) - s8(m_acc) - (c ? ~m_status & 0x01 : 0);
bool cy = u16(data) >= m_acc + (c ? m_status & 0x01 : 0); // borrow is inverted
bool dc = (data & 0x0f) >= (m_acc & 0x0f) + (c ? ~m_status & 0x01 : 0);
@@ -1173,7 +1170,7 @@ void riscii_series_device::execute_sub(u8 reg, bool a, bool c)
acc_w(tmp & 0xff);
else
{
- m_regs->write_byte(addr, tmp & 0xff);
+ m_regs.write_byte(addr, tmp & 0xff);
multi_byte_borrow(addr, cy);
}
m_status = (m_status & 0xc0)
@@ -1218,7 +1215,7 @@ void riscii_series_device::execute_sub_imm(u8 data, bool c)
void riscii_series_device::execute_adddc(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 data = m_regs->read_byte(addr);
+ u8 data = m_regs.read_byte(addr);
u16 tmp = u16(data) + m_acc + (m_status & 0x01);
bool dc = (data & 0x0f) + (m_acc & 0x0f) + (m_status & 0x01) >= 0x0a;
if (dc)
@@ -1228,7 +1225,7 @@ void riscii_series_device::execute_adddc(u8 reg, bool a)
if (a)
acc_w(tmp & 0xff);
else
- m_regs->write_byte(addr, tmp & 0xff);
+ m_regs.write_byte(addr, tmp & 0xff);
m_status = (m_status & 0xf8)
| (BIT(tmp, 8) ? 0x01 : 0x00)
| (dc ? 0x02 : 0x00)
@@ -1238,7 +1235,7 @@ void riscii_series_device::execute_adddc(u8 reg, bool a)
void riscii_series_device::execute_subdb(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 data = m_regs->read_byte(addr);
+ u8 data = m_regs.read_byte(addr);
u16 tmp = u16(data) - m_acc - (~m_status & 0x01);
bool dc = (data & 0x0f) + (~m_acc & 0x0f) + (m_status & 0x01) >= 0x0a;
if (dc)
@@ -1248,7 +1245,7 @@ void riscii_series_device::execute_subdb(u8 reg, bool a)
if (a)
acc_w(tmp & 0xff);
else
- m_regs->write_byte(addr, tmp & 0xff);
+ m_regs.write_byte(addr, tmp & 0xff);
m_status = (m_status & 0xf8)
| (BIT(tmp, 8) ? 0x00 : 0x01) // borrow is inverted
| (dc ? 0x02 : 0x00)
@@ -1257,7 +1254,7 @@ void riscii_series_device::execute_subdb(u8 reg, bool a)
void riscii_series_device::execute_mul(u8 reg)
{
- execute_mul_imm(m_regs->read_byte(get_banked_address(reg)));
+ execute_mul_imm(m_regs.read_byte(get_banked_address(reg)));
}
void riscii_series_device::execute_mul_imm(u8 data)
@@ -1270,11 +1267,11 @@ void riscii_series_device::execute_mul_imm(u8 data)
void riscii_series_device::execute_or(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_acc | m_regs->read_byte(addr);
+ u8 tmp = m_acc | m_regs.read_byte(addr);
if (a)
acc_w(tmp);
else
- m_regs->write_byte(addr, tmp);
+ m_regs.write_byte(addr, tmp);
if (tmp == 0)
m_status |= 0x04;
else
@@ -1284,11 +1281,11 @@ void riscii_series_device::execute_or(u8 reg, bool a)
void riscii_series_device::execute_and(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_acc & m_regs->read_byte(addr);
+ u8 tmp = m_acc & m_regs.read_byte(addr);
if (a)
acc_w(tmp);
else
- m_regs->write_byte(addr, tmp);
+ m_regs.write_byte(addr, tmp);
if (tmp == 0)
m_status |= 0x04;
else
@@ -1298,11 +1295,11 @@ void riscii_series_device::execute_and(u8 reg, bool a)
void riscii_series_device::execute_xor(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_acc ^ m_regs->read_byte(addr);
+ u8 tmp = m_acc ^ m_regs.read_byte(addr);
if (a)
acc_w(tmp);
else
- m_regs->write_byte(addr, tmp);
+ m_regs.write_byte(addr, tmp);
if (tmp == 0)
m_status |= 0x04;
else
@@ -1312,11 +1309,11 @@ void riscii_series_device::execute_xor(u8 reg, bool a)
void riscii_series_device::execute_com(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 tmp = ~m_regs->read_byte(addr);
+ u8 tmp = ~m_regs.read_byte(addr);
if (a)
acc_w(tmp);
else
- m_regs->write_byte(addr, tmp);
+ m_regs.write_byte(addr, tmp);
if (tmp == 0)
m_status |= 0x04;
else
@@ -1325,41 +1322,41 @@ void riscii_series_device::execute_com(u8 reg, bool a)
void riscii_series_device::execute_clr(u8 reg)
{
- m_regs->write_byte(get_banked_address(reg), 0);
+ m_regs.write_byte(get_banked_address(reg), 0);
m_status |= 0x04;
}
void riscii_series_device::execute_rrc(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u16 tmp = m_regs->read_byte(addr) | u16(m_status & 0x01) << 8;
+ u16 tmp = m_regs.read_byte(addr) | u16(m_status & 0x01) << 8;
if (a)
acc_w(tmp >> 1);
else
- m_regs->write_byte(addr, tmp >> 1);
+ m_regs.write_byte(addr, tmp >> 1);
m_status = (m_status & 0xfe) | (tmp & 0x01);
}
void riscii_series_device::execute_rlc(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u16 tmp = u16(m_regs->read_byte(addr)) << 1 | (m_status & 0x01);
+ u16 tmp = u16(m_regs.read_byte(addr)) << 1 | (m_status & 0x01);
if (a)
acc_w(tmp & 0xff);
else
- m_regs->write_byte(addr, tmp & 0xff);
+ m_regs.write_byte(addr, tmp & 0xff);
m_status = (m_status & 0xfe) | (tmp >> 8);
}
void riscii_series_device::execute_shra(u8 reg)
{
- u8 tmp = m_regs->read_byte(get_banked_address(reg));
+ u8 tmp = m_regs.read_byte(get_banked_address(reg));
acc_w((tmp >> 1) | (m_status & 0x01) << 7);
}
void riscii_series_device::execute_shla(u8 reg)
{
- u8 tmp = m_regs->read_byte(get_banked_address(reg));
+ u8 tmp = m_regs.read_byte(get_banked_address(reg));
acc_w((tmp << 1) | (m_status & 0x01));
}
@@ -1373,7 +1370,7 @@ void riscii_series_device::execute_call(u32 addr)
// Push PC to the stack region at the end of banked RAM
m_stkptr -= 2;
u16 stkaddr = u16(m_maxbank - (BIT(m_stkptr, 7) ? 0 : 1)) << 8 | 0x80 | (m_stkptr & 0x7e);
- m_regs->write_word(stkaddr, swapendian_int16(m_pc & 0xffff));
+ m_regs.write_word(stkaddr, swapendian_int16(m_pc & 0xffff));
// PCH (on relevant models) must be saved somewhere. This implementation assumes a private buffer is used.
if (m_pcmask > 0xffff)
@@ -1393,12 +1390,12 @@ void riscii_series_device::execute_jcc(bool condition)
void riscii_series_device::execute_jdnz(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_regs->read_byte(addr) - 1;
+ u8 tmp = m_regs.read_byte(addr) - 1;
if (a)
acc_w(tmp);
else
{
- m_regs->write_byte(addr, tmp);
+ m_regs.write_byte(addr, tmp);
multi_byte_borrow(addr, tmp != 0xff);
}
execute_jcc(tmp != 0);
@@ -1407,12 +1404,12 @@ void riscii_series_device::execute_jdnz(u8 reg, bool a)
void riscii_series_device::execute_jinz(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_regs->read_byte(addr) + 1;
+ u8 tmp = m_regs.read_byte(addr) + 1;
if (a)
acc_w(tmp);
else
{
- m_regs->write_byte(addr, tmp);
+ m_regs.write_byte(addr, tmp);
multi_byte_carry(addr, tmp == 0);
}
execute_jcc(tmp != 0);
@@ -1429,17 +1426,17 @@ void riscii_series_device::set_z_acc(u8 tmp)
void riscii_series_device::execute_load(u8 reg)
{
- set_z_acc(m_regs->read_byte(get_banked_address(reg)));
+ set_z_acc(m_regs.read_byte(get_banked_address(reg)));
}
void riscii_series_device::execute_store(u8 reg)
{
- m_regs->write_byte(get_banked_address(reg), m_acc);
+ m_regs.write_byte(get_banked_address(reg), m_acc);
}
void riscii_series_device::execute_test(u8 reg)
{
- u8 tmp = m_regs->read_byte(get_banked_address(reg));
+ u8 tmp = m_regs.read_byte(get_banked_address(reg));
if (tmp == 0)
m_status |= 0x04;
else
@@ -1449,53 +1446,53 @@ void riscii_series_device::execute_test(u8 reg)
void riscii_series_device::execute_swap(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_regs->read_byte(addr);
+ u8 tmp = m_regs.read_byte(addr);
if (a)
acc_w((tmp >> 4) | (tmp << 4));
else
- m_regs->write_byte(addr, (tmp >> 4) | (tmp << 4));
+ m_regs.write_byte(addr, (tmp >> 4) | (tmp << 4));
}
void riscii_series_device::execute_jbc(u8 reg, int b)
{
- execute_jcc(!BIT(m_regs->read_byte(get_banked_address(reg)), b));
+ execute_jcc(!BIT(m_regs.read_byte(get_banked_address(reg)), b));
}
void riscii_series_device::execute_jbs(u8 reg, int b)
{
- execute_jcc(BIT(m_regs->read_byte(get_banked_address(reg)), b));
+ execute_jcc(BIT(m_regs.read_byte(get_banked_address(reg)), b));
}
void riscii_series_device::execute_bc(u8 reg, int b)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_regs->read_byte(addr) & ~(1 << b);
- m_regs->write_byte(addr, tmp);
+ u8 tmp = m_regs.read_byte(addr) & ~(1 << b);
+ m_regs.write_byte(addr, tmp);
}
void riscii_series_device::execute_bs(u8 reg, int b)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_regs->read_byte(addr) | (1 << b);
- m_regs->write_byte(addr, tmp);
+ u8 tmp = m_regs.read_byte(addr) | (1 << b);
+ m_regs.write_byte(addr, tmp);
}
void riscii_series_device::execute_btg(u8 reg, int b)
{
u16 addr = get_banked_address(reg);
- u8 tmp = m_regs->read_byte(addr) ^ (1 << b);
- m_regs->write_byte(addr, tmp);
+ u8 tmp = m_regs.read_byte(addr) ^ (1 << b);
+ m_regs.write_byte(addr, tmp);
}
void riscii_series_device::execute_inc(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u16 tmp = u16(m_regs->read_byte(addr)) + 1;
+ u16 tmp = u16(m_regs.read_byte(addr)) + 1;
if (a)
acc_w(tmp & 0xff);
else
{
- m_regs->write_byte(addr, tmp & 0xff);
+ m_regs.write_byte(addr, tmp & 0xff);
multi_byte_carry(addr, (tmp >> 8) != 0);
}
m_status = (m_status & 0xfa) | ((tmp & 0xff) == 0 ? 0x04 : 0x00) | (tmp >> 8);
@@ -1504,12 +1501,12 @@ void riscii_series_device::execute_inc(u8 reg, bool a)
void riscii_series_device::execute_dec(u8 reg, bool a)
{
u16 addr = get_banked_address(reg);
- u16 tmp = u16(m_regs->read_byte(addr)) + 0xff;
+ u16 tmp = u16(m_regs.read_byte(addr)) + 0xff;
if (a)
acc_w(tmp & 0xff);
else
{
- m_regs->write_byte(addr, tmp & 0xff);
+ m_regs.write_byte(addr, tmp & 0xff);
multi_byte_borrow(addr, (tmp >> 8) != 0);
}
m_status = (m_status & 0xfa) | ((tmp & 0xff) == 0 ? 0x04 : 0x00) | (tmp >> 8);
@@ -1517,14 +1514,14 @@ void riscii_series_device::execute_dec(u8 reg, bool a)
void riscii_series_device::execute_rpt(u8 reg)
{
- m_repeat = m_regs->read_byte(get_banked_address(reg)) - 1;
+ m_repeat = m_regs.read_byte(get_banked_address(reg)) - 1;
}
void riscii_series_device::execute_ret(bool inte)
{
// Pop PC from the stack region at the end of banked RAM
u16 stkaddr = u16(m_maxbank - (BIT(m_stkptr, 7) ? 0 : 1)) << 8 | 0x80 | (m_stkptr & 0x7e);
- u32 dest = swapendian_int16(m_regs->read_word(stkaddr));
+ u32 dest = swapendian_int16(m_regs.read_word(stkaddr));
if (m_pcmask > 0xffff)
dest |= u32(m_pchstack[m_stkptr >> 1]) << 16;
execute_jump(dest);
@@ -1789,15 +1786,15 @@ void riscii_series_device::execute_cycle1(u16 opcode)
break;
case 0x5500:
- execute_jcc(m_acc >= m_regs->read_byte(get_banked_address(opcode & 0x00ff)));
+ execute_jcc(m_acc >= m_regs.read_byte(get_banked_address(opcode & 0x00ff)));
break;
case 0x5600:
- execute_jcc(m_acc <= m_regs->read_byte(get_banked_address(opcode & 0x00ff)));
+ execute_jcc(m_acc <= m_regs.read_byte(get_banked_address(opcode & 0x00ff)));
break;
case 0x5700:
- execute_jcc(m_acc == m_regs->read_byte(get_banked_address(opcode & 0x00ff)));
+ execute_jcc(m_acc == m_regs.read_byte(get_banked_address(opcode & 0x00ff)));
break;
case 0x5800: case 0x5900: case 0x5a00: case 0x5b00:
@@ -1837,13 +1834,13 @@ void riscii_series_device::execute_tbrd(u32 ptr)
u32 memaddr = (ptr & 0x7ffffe) >> 1;
if (!BIT(ptr, 23))
memaddr &= m_pcmask;
- u16 data = m_program->read_word(memaddr);
+ u16 data = m_program.read_word(memaddr);
if (BIT(ptr, 0))
data >>= 8;
else
data &= 0x00ff;
LOGMASKED(LOG_TBRD, "%05X: TBRD(%06Xh) = %02Xh -> %02X:%02Xh\n", m_ppc, ptr, data, addr >> 8, addr & 0x00ff);
- m_regs->write_byte(addr, data);
+ m_regs.write_byte(addr, data);
if (m_repeat != 0)
--m_repeat;
diff --git a/src/devices/cpu/rii/riscii.h b/src/devices/cpu/rii/riscii.h
index 48725211e94..1acc09e4862 100644
--- a/src/devices/cpu/rii/riscii.h
+++ b/src/devices/cpu/rii/riscii.h
@@ -287,9 +287,9 @@ private:
// address spaces
address_space_config m_program_config;
address_space_config m_regs_config;
- address_space *m_program;
- address_space *m_regs;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<22, 1, -1, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<22, 1, -1, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<13, 0, 0, ENDIANNESS_LITTLE>::specific m_regs;
// device callbacks
devcb_read8 m_porta_in_cb;
diff --git a/src/devices/cpu/rsp/rsp.cpp b/src/devices/cpu/rsp/rsp.cpp
index 17b1682b8bd..07deffc6e10 100644
--- a/src/devices/cpu/rsp/rsp.cpp
+++ b/src/devices/cpu/rsp/rsp.cpp
@@ -78,7 +78,7 @@ DEFINE_DEVICE_TYPE(RSP, rsp_device, "rsp", "Nintendo & SGI Reality Signal Proces
#define CLEAR_ZERO_FLAG(x) { m_vflag[ZERO][x & 7] = 0; }
#define CLEAR_CLIP2_FLAG(x) { m_vflag[CLIP2][x & 7] = 0; }
-#define ROPCODE(pc) m_program->read_dword(pc)
+#define ROPCODE(pc) m_pcache.read_dword(pc)
/***************************************************************************
@@ -232,7 +232,7 @@ uint8_t rsp_device::READ8(uint32_t address)
{
uint8_t ret;
address &= 0xfff;
- ret = m_program->read_byte(address);
+ ret = m_program.read_byte(address);
//printf("R8:%08x=%02x\n", address, ret);
return ret;
}
@@ -242,7 +242,7 @@ uint16_t rsp_device::READ16(uint32_t address)
uint16_t ret;
address &= 0xfff;
- ret = (m_program->read_byte(address) << 8) | (m_program->read_byte(address + 1) & 0xff);
+ ret = (m_program.read_byte(address) << 8) | (m_program.read_byte(address + 1) & 0xff);
//printf("R16:%08x=%04x\n", address, ret);
return ret;
@@ -253,10 +253,10 @@ uint32_t rsp_device::READ32(uint32_t address)
uint32_t ret;
address &= 0xfff;
- ret = (m_program->read_byte(address) << 24) |
- (m_program->read_byte(address + 1) << 16) |
- (m_program->read_byte(address + 2) << 8) |
- (m_program->read_byte(address + 3) << 0);
+ ret = (m_program.read_byte(address) << 24) |
+ (m_program.read_byte(address + 1) << 16) |
+ (m_program.read_byte(address + 2) << 8) |
+ (m_program.read_byte(address + 3) << 0);
//printf("R32:%08x=%08x\n", address, ret);
return ret;
@@ -265,7 +265,7 @@ uint32_t rsp_device::READ32(uint32_t address)
void rsp_device::WRITE8(uint32_t address, uint8_t data)
{
address &= 0xfff;
- m_program->write_byte(address, data);
+ m_program.write_byte(address, data);
//printf("W8:%08x=%02x\n", address, data);
}
@@ -273,8 +273,8 @@ void rsp_device::WRITE16(uint32_t address, uint16_t data)
{
address &= 0xfff;
- m_program->write_byte(address, data >> 8);
- m_program->write_byte(address + 1, data & 0xff);
+ m_program.write_byte(address, data >> 8);
+ m_program.write_byte(address + 1, data & 0xff);
//printf("W16:%08x=%04x\n", address, data);
}
@@ -282,10 +282,10 @@ void rsp_device::WRITE32(uint32_t address, uint32_t data)
{
address &= 0xfff;
- m_program->write_byte(address, data >> 24);
- m_program->write_byte(address + 1, (data >> 16) & 0xff);
- m_program->write_byte(address + 2, (data >> 8) & 0xff);
- m_program->write_byte(address + 3, data & 0xff);
+ m_program.write_byte(address, data >> 24);
+ m_program.write_byte(address + 1, (data >> 16) & 0xff);
+ m_program.write_byte(address + 2, (data >> 8) & 0xff);
+ m_program.write_byte(address + 3, data & 0xff);
//printf("W32:%08x=%08x\n", address, data);
}
@@ -381,8 +381,8 @@ void rsp_device::device_start()
if (LOG_INSTRUCTION_EXECUTION)
m_exec_output = fopen("rsp_execute.txt", "wt");
- m_program = &space(AS_PROGRAM);
- m_pcache = m_program->cache<2, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_pcache);
+ space(AS_PROGRAM).specific(m_program);
resolve_cb();
if (m_isdrc)
diff --git a/src/devices/cpu/rsp/rsp.h b/src/devices/cpu/rsp/rsp.h
index 10fa70801ce..5383889cdd3 100644
--- a/src/devices/cpu/rsp/rsp.h
+++ b/src/devices/cpu/rsp/rsp.h
@@ -218,9 +218,9 @@ private:
uint32_t m_ppc;
uint32_t m_nextpc;
- address_space *m_program;
protected:
- memory_access_cache<2, 0, ENDIANNESS_BIG> *m_pcache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_pcache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_program;
private:
std::unique_ptr<cop2> m_cop2;
diff --git a/src/devices/cpu/rsp/rspdrc.cpp b/src/devices/cpu/rsp/rspdrc.cpp
index a91db94ceeb..c9ec2bcb4b3 100644
--- a/src/devices/cpu/rsp/rspdrc.cpp
+++ b/src/devices/cpu/rsp/rspdrc.cpp
@@ -405,7 +405,7 @@ void rsp_device::code_compile_block(offs_t pc)
}
/* validate this code block if we're not pointing into ROM */
- if (m_program->get_write_ptr(seqhead->physpc) != nullptr)
+ if (m_program.space().get_write_ptr(seqhead->physpc) != nullptr)
generate_checksum_block(block, compiler, seqhead, seqlast);
/* label this instruction, if it may be jumped to locally */
@@ -654,12 +654,12 @@ void rsp_device::generate_checksum_block(drcuml_block &block, compiler_state &co
if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP))
{
uint32_t sum = seqhead->opptr.l[0];
- void *base = m_pcache->read_ptr(seqhead->physpc | 0x1000);
+ void *base = m_pcache.read_ptr(seqhead->physpc | 0x1000);
UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword
if (seqhead->delay.first() != nullptr && seqhead->physpc != seqhead->delay.first()->physpc)
{
- base = m_pcache->read_ptr((seqhead->delay.first()->physpc & 0x00000fff) | 0x1000);
+ base = m_pcache.read_ptr((seqhead->delay.first()->physpc & 0x00000fff) | 0x1000);
assert(base != nullptr);
UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword
UML_ADD(block, I0, I0, I1); // add i0,i0,i1
@@ -676,13 +676,13 @@ void rsp_device::generate_checksum_block(drcuml_block &block, compiler_state &co
else
{
uint32_t sum = 0;
- void *base = m_pcache->read_ptr(seqhead->physpc | 0x1000);
+ void *base = m_pcache.read_ptr(seqhead->physpc | 0x1000);
UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); // load i0,base,0,dword
sum += seqhead->opptr.l[0];
for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next())
if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP))
{
- base = m_pcache->read_ptr(curdesc->physpc | 0x1000);
+ base = m_pcache.read_ptr(curdesc->physpc | 0x1000);
assert(base != nullptr);
UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword
UML_ADD(block, I0, I0, I1); // add i0,i0,i1
@@ -690,7 +690,7 @@ void rsp_device::generate_checksum_block(drcuml_block &block, compiler_state &co
if (curdesc->delay.first() != nullptr && (curdesc == seqlast || (curdesc->next() != nullptr && curdesc->next()->physpc != curdesc->delay.first()->physpc)))
{
- base = m_pcache->read_ptr((curdesc->delay.first()->physpc & 0x00000fff) | 0x1000);
+ base = m_pcache.read_ptr((curdesc->delay.first()->physpc & 0x00000fff) | 0x1000);
assert(base != nullptr);
UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); // load i1,base,dword
UML_ADD(block, I0, I0, I1); // add i0,i0,i1
diff --git a/src/devices/cpu/rsp/rspfe.cpp b/src/devices/cpu/rsp/rspfe.cpp
index bb7fbfebd47..83778386a0e 100644
--- a/src/devices/cpu/rsp/rspfe.cpp
+++ b/src/devices/cpu/rsp/rspfe.cpp
@@ -38,7 +38,7 @@ bool rsp_device::frontend::describe(opcode_desc &desc, const opcode_desc *prev)
uint32_t op, opswitch;
// fetch the opcode
- op = desc.opptr.l[0] = m_rsp.m_pcache->read_dword((desc.physpc & 0x00000fff) | 0x1000);
+ op = desc.opptr.l[0] = m_rsp.m_pcache.read_dword((desc.physpc & 0x00000fff) | 0x1000);
// all instructions are 4 bytes and default to a single cycle each
desc.length = 4;
diff --git a/src/devices/cpu/rx01/rx01.cpp b/src/devices/cpu/rx01/rx01.cpp
index 18053c7069a..58f90dba842 100644
--- a/src/devices/cpu/rx01/rx01.cpp
+++ b/src/devices/cpu/rx01/rx01.cpp
@@ -39,8 +39,6 @@ rx01_cpu_device::rx01_cpu_device(const machine_config &mconfig, const char *tag,
: cpu_device(mconfig, RX01_CPU, tag, owner, clock)
, m_inst_config("program", ENDIANNESS_LITTLE, 8, 12, 0)
, m_data_config("sector data", ENDIANNESS_LITTLE, 8, 10, 0) // actually 1 bit wide
- , m_inst_cache(nullptr)
- , m_data_cache(nullptr)
, m_pc(0)
, m_ppc(0)
, m_mb(0)
@@ -77,8 +75,8 @@ device_memory_interface::space_config_vector rx01_cpu_device::memory_space_confi
void rx01_cpu_device::device_start()
{
- m_inst_cache = space(AS_PROGRAM).cache<0, 0, ENDIANNESS_LITTLE>();
- m_data_cache = space(AS_DATA).cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_inst_cache);
+ space(AS_DATA).cache(m_data_cache);
set_icountptr(m_icount);
@@ -137,7 +135,7 @@ u8 rx01_cpu_device::mux_out()
if (BIT(m_mb, 0))
return m_sp[m_spar];
else
- return m_inst_cache->read_byte(m_pc);
+ return m_inst_cache.read_byte(m_pc);
}
bool rx01_cpu_device::data_in()
@@ -243,7 +241,7 @@ bool rx01_cpu_device::test_condition()
if (m_flags & FF_WRTBUF)
return sec_buf_in();
else
- return m_data_cache->read_byte(m_bar) & 1;
+ return m_data_cache.read_byte(m_bar) & 1;
case 074:
// Flag state equals one
@@ -259,7 +257,7 @@ bool rx01_cpu_device::test_condition()
void rx01_cpu_device::set_bar(u16 bar)
{
if (m_bar != bar && (m_flags & FF_WRTBUF))
- m_data_cache->write_byte(m_bar, sec_buf_in());
+ m_data_cache.write_byte(m_bar, sec_buf_in());
m_bar = bar;
}
@@ -303,7 +301,7 @@ void rx01_cpu_device::execute_run()
m_ppc = m_pc;
debugger_instruction_hook(m_pc);
- m_mb = m_inst_cache->read_byte(m_pc);
+ m_mb = m_inst_cache.read_byte(m_pc);
m_pc = (m_pc + 1) & 03777;
}
@@ -398,7 +396,7 @@ void rx01_cpu_device::execute_run()
m_flags |= FF_WRTBUF;
else if (m_flags & FF_WRTBUF)
{
- m_data_cache->write_byte(m_bar, sec_buf_in());
+ m_data_cache.write_byte(m_bar, sec_buf_in());
m_flags &= ~FF_WRTBUF;
}
break;
diff --git a/src/devices/cpu/rx01/rx01.h b/src/devices/cpu/rx01/rx01.h
index 1b138472b04..2b990e96867 100644
--- a/src/devices/cpu/rx01/rx01.h
+++ b/src/devices/cpu/rx01/rx01.h
@@ -70,8 +70,8 @@ private:
// address spaces
address_space_config m_inst_config;
address_space_config m_data_config;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_inst_cache;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_data_cache;
+ memory_access<12, 0, 0, ENDIANNESS_LITTLE>::cache m_inst_cache;
+ memory_access<10, 0, 0, ENDIANNESS_LITTLE>::cache m_data_cache;
// internal state
u16 m_pc;
diff --git a/src/devices/cpu/s2650/s2650.cpp b/src/devices/cpu/s2650/s2650.cpp
index 9e36a1c8ae1..ccdc5694cd2 100644
--- a/src/devices/cpu/s2650/s2650.cpp
+++ b/src/devices/cpu/s2650/s2650.cpp
@@ -36,7 +36,7 @@ s2650_device::s2650_device(const machine_config &mconfig, const char *tag, devic
, m_sense_handler(*this)
, m_flag_handler(*this), m_intack_handler(*this)
, m_ppc(0), m_page(0), m_iar(0), m_ea(0), m_psl(0), m_psu(0), m_r(0)
- , m_halt(0), m_ir(0), m_irq_state(0), m_icount(0), m_cache(nullptr)
+ , m_halt(0), m_ir(0), m_irq_state(0), m_icount(0)
, m_debugger_temp(0)
{
memset(m_reg, 0x00, sizeof(m_reg));
@@ -167,7 +167,7 @@ static const int S2650_relative[0x100] =
* RDMEM
* read memory byte from addr
***************************************************************/
-#define RDMEM(addr) space(AS_PROGRAM).read_byte(addr)
+#define RDMEM(addr) m_program.read_byte(addr)
inline void s2650_device::set_psu(uint8_t new_val)
{
@@ -264,7 +264,7 @@ inline int s2650_device::check_irq_line()
***************************************************************/
inline uint8_t s2650_device::ROP()
{
- uint8_t result = m_cache->read_byte(m_page + m_iar);
+ uint8_t result = m_cprogram.read_byte(m_page + m_iar);
m_iar = (m_iar + 1) & PMSK;
return result;
}
@@ -275,7 +275,7 @@ inline uint8_t s2650_device::ROP()
***************************************************************/
inline uint8_t s2650_device::ARG()
{
- uint8_t result = m_cache->read_byte(m_page + m_iar);
+ uint8_t result = m_cprogram.read_byte(m_page + m_iar);
m_iar = (m_iar + 1) & PMSK;
return result;
}
@@ -561,7 +561,7 @@ inline uint8_t s2650_device::ARG()
* Store source register to memory addr (CC unchanged)
***************************************************************/
#define M_STR(address,source) \
- space(AS_PROGRAM).write_byte(address, source)
+ m_program.write_byte(address, source)
/***************************************************************
* M_AND
@@ -824,7 +824,10 @@ void s2650_device::device_start()
m_flag_handler.resolve_safe();
m_intack_handler.resolve_safe(0x00);
- m_cache = space(AS_PROGRAM).cache<0, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cprogram);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_ppc));
save_item(NAME(m_page));
@@ -1124,7 +1127,7 @@ void s2650_device::execute_run()
case 0x32: /* REDC,2 */
case 0x33: /* REDC,3 */
m_icount -= 6;
- m_reg[m_r] = space(AS_DATA).read_byte(S2650_CTRL_PORT);
+ m_reg[m_r] = m_data.read_byte(S2650_CTRL_PORT);
SET_CC( m_reg[m_r] );
break;
@@ -1214,7 +1217,7 @@ void s2650_device::execute_run()
case 0x56: /* REDE,2 v */
case 0x57: /* REDE,3 v */
m_icount -= 9;
- m_reg[m_r] = space(AS_IO).read_byte(ARG());
+ m_reg[m_r] = m_io.read_byte(ARG());
SET_CC(m_reg[m_r]);
break;
@@ -1273,7 +1276,7 @@ void s2650_device::execute_run()
case 0x72: /* REDD,2 */
case 0x73: /* REDD,3 */
m_icount -= 6;
- m_reg[m_r] = space(AS_DATA).read_byte(S2650_DATA_PORT);
+ m_reg[m_r] = m_data.read_byte(S2650_DATA_PORT);
SET_CC(m_reg[m_r]);
break;
@@ -1429,7 +1432,7 @@ void s2650_device::execute_run()
case 0xb2: /* WRTC,2 */
case 0xb3: /* WRTC,3 */
m_icount -= 6;
- space(AS_DATA).write_byte(S2650_CTRL_PORT,m_reg[m_r]);
+ m_data.write_byte(S2650_CTRL_PORT,m_reg[m_r]);
break;
case 0xb4: /* TPSU */
@@ -1515,7 +1518,7 @@ void s2650_device::execute_run()
case 0xd6: /* WRTE,2 v */
case 0xd7: /* WRTE,3 v */
m_icount -= 9;
- space(AS_IO).write_byte( ARG(), m_reg[m_r] );
+ m_io.write_byte( ARG(), m_reg[m_r] );
break;
case 0xd8: /* BIRR,0 (*)a */
@@ -1573,7 +1576,7 @@ void s2650_device::execute_run()
case 0xf2: /* WRTD,2 */
case 0xf3: /* WRTD,3 */
m_icount -= 6;
- space(AS_DATA).write_byte(S2650_DATA_PORT, m_reg[m_r]);
+ m_data.write_byte(S2650_DATA_PORT, m_reg[m_r]);
break;
case 0xf4: /* TMI,0 v */
diff --git a/src/devices/cpu/s2650/s2650.h b/src/devices/cpu/s2650/s2650.h
index 1bd42fa535c..008ea0bb31f 100644
--- a/src/devices/cpu/s2650/s2650.h
+++ b/src/devices/cpu/s2650/s2650.h
@@ -84,7 +84,10 @@ private:
uint8_t m_irq_state;
int m_icount;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access<15, 0, 0, ENDIANNESS_BIG>::cache m_cprogram;
+ memory_access<15, 0, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access< 1, 0, 0, ENDIANNESS_BIG>::specific m_data;
+ memory_access< 8, 0, 0, ENDIANNESS_BIG>::specific m_io;
// For debugger
uint16_t m_debugger_temp;
diff --git a/src/devices/cpu/saturn/satops.ipp b/src/devices/cpu/saturn/satops.ipp
index 87632ca859b..0232f84a9c7 100644
--- a/src/devices/cpu/saturn/satops.ipp
+++ b/src/devices/cpu/saturn/satops.ipp
@@ -14,7 +14,7 @@
inline int saturn_device::READ_OP()
{
m_icount-=3;
- const uint8_t data=m_cache->read_byte(m_pc);
+ const uint8_t data=m_cache.read_byte(m_pc);
saturn_assert(data<0x10);
m_pc=(m_pc+1)&0xfffff;
return data;
@@ -23,7 +23,7 @@ inline int saturn_device::READ_OP()
inline int saturn_device::READ_OP_ARG()
{
m_icount-=3;
- const uint8_t data=m_cache->read_byte(m_pc);
+ const uint8_t data=m_cache.read_byte(m_pc);
saturn_assert(data<0x10);
m_pc=(m_pc+1)&0xfffff;
return data;
@@ -83,7 +83,7 @@ inline int saturn_device::READ_OP_ARG20()
inline int saturn_device::READ_NIBBLE(uint32_t adr)
{
m_icount-=3;
- const uint8_t data=m_program->read_byte(adr&0xfffff);
+ const uint8_t data=m_program.read_byte(adr&0xfffff);
saturn_assert(data<0x10);
m_crc_func(adr&0xfffff, data, 0xffffffff);
return data;
@@ -127,7 +127,7 @@ inline void saturn_device::WRITE_NIBBLE(uint32_t adr, uint8_t nib)
{
m_icount-=3;
saturn_assert(nib<0x10);
- m_program->write_byte(adr&0xfffff,nib);
+ m_program.write_byte(adr&0xfffff,nib);
}
inline int saturn_device::S64_READ_X(int r)
diff --git a/src/devices/cpu/saturn/saturn.cpp b/src/devices/cpu/saturn/saturn.cpp
index 004c0c09994..c7baae6770f 100644
--- a/src/devices/cpu/saturn/saturn.cpp
+++ b/src/devices/cpu/saturn/saturn.cpp
@@ -56,7 +56,6 @@ saturn_device::saturn_device(const machine_config &mconfig, const char *tag, dev
, m_pc(0), m_oldpc(0), m_p(0), m_out(0), m_carry(0), m_decimal(0), m_st(0), m_hst(0)
, m_nmi_state(0), m_irq_state(0), m_irq_enable(0), m_in_irq(0), m_pending_irq(0)
, m_sleeping(0), m_monitor_id(0), m_monitor_in(0)
- , m_program(nullptr), m_cache(nullptr)
, m_icount(0)
, m_debugger_temp(0)
{
@@ -95,8 +94,8 @@ std::unique_ptr<util::disasm_interface> saturn_device::create_disassembler()
void saturn_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
m_out_func.resolve_safe();
m_in_func.resolve_safe(0);
diff --git a/src/devices/cpu/saturn/saturn.h b/src/devices/cpu/saturn/saturn.h
index a50742f7508..5111de6d7ed 100644
--- a/src/devices/cpu/saturn/saturn.h
+++ b/src/devices/cpu/saturn/saturn.h
@@ -137,8 +137,8 @@ private:
uint8_t m_sleeping; /* low-consumption state */
int m_monitor_id;
int m_monitor_in;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
int m_icount;
int64_t m_debugger_temp;
diff --git a/src/devices/cpu/sc61860/sc61860.cpp b/src/devices/cpu/sc61860/sc61860.cpp
index bfb39ee305a..bd99080a9b5 100644
--- a/src/devices/cpu/sc61860/sc61860.cpp
+++ b/src/devices/cpu/sc61860/sc61860.cpp
@@ -109,8 +109,8 @@ void sc61860_device::device_start()
m_2ms_tick_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sc61860_device::sc61860_2ms_tick), this));
m_2ms_tick_timer->adjust(attotime::from_hz(500), 0, attotime::from_hz(500));
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
m_reset.resolve();
m_brk.resolve();
m_x.resolve();
diff --git a/src/devices/cpu/sc61860/sc61860.h b/src/devices/cpu/sc61860/sc61860.h
index 081f9230be0..df019b6b845 100644
--- a/src/devices/cpu/sc61860/sc61860.h
+++ b/src/devices/cpu/sc61860/sc61860.h
@@ -111,8 +111,9 @@ private:
struct { int t2ms, t512ms; int count; } m_timer;
emu_timer *m_2ms_tick_timer;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_program;
+
int m_icount;
uint8_t m_ram[0x100]; // internal special ram, should be 0x60, 0x100 to avoid memory corruption for now
diff --git a/src/devices/cpu/sc61860/scops.hxx b/src/devices/cpu/sc61860/scops.hxx
index 4ceec0df223..23c122ac55f 100644
--- a/src/devices/cpu/sc61860/scops.hxx
+++ b/src/devices/cpu/sc61860/scops.hxx
@@ -18,29 +18,29 @@
uint8_t sc61860_device::READ_OP()
{
- return m_cache->read_byte(m_pc++);
+ return m_cache.read_byte(m_pc++);
}
uint8_t sc61860_device::READ_OP_ARG()
{
- return m_cache->read_byte(m_pc++);
+ return m_cache.read_byte(m_pc++);
}
uint16_t sc61860_device::READ_OP_ARG_WORD()
{
- uint16_t t=m_cache->read_byte(m_pc++)<<8;
- t|=m_cache->read_byte(m_pc++);
+ uint16_t t=m_cache.read_byte(m_pc++)<<8;
+ t|=m_cache.read_byte(m_pc++);
return t;
}
uint8_t sc61860_device::READ_BYTE(uint16_t adr)
{
- return m_program->read_byte(adr);
+ return m_program.read_byte(adr);
}
void sc61860_device::WRITE_BYTE(uint16_t a, uint8_t v)
{
- m_program->write_byte(a, v);
+ m_program.write_byte(a, v);
}
uint8_t sc61860_device::READ_RAM(int r)
diff --git a/src/devices/cpu/scmp/scmp.cpp b/src/devices/cpu/scmp/scmp.cpp
index fdcd8dd75fd..a9021737300 100644
--- a/src/devices/cpu/scmp/scmp.cpp
+++ b/src/devices/cpu/scmp/scmp.cpp
@@ -31,7 +31,7 @@ scmp_device::scmp_device(const machine_config &mconfig, const char *tag, device_
scmp_device::scmp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: cpu_device(mconfig, type, tag, owner, clock)
, m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0)
- , m_AC(0), m_ER(0), m_SR(0), m_program(nullptr), m_cache(nullptr), m_icount(0)
+ , m_AC(0), m_ER(0), m_SR(0), m_icount(0)
, m_flag_out_func(*this)
, m_sout_func(*this)
, m_sin_func(*this)
@@ -70,24 +70,24 @@ uint8_t scmp_device::ROP()
{
uint16_t pc = m_PC.w.l;
m_PC.w.l = ADD12(m_PC.w.l,1);
- return m_cache->read_byte( pc);
+ return m_cache.read_byte( pc);
}
uint8_t scmp_device::ARG()
{
uint16_t pc = m_PC.w.l;
m_PC.w.l = ADD12(m_PC.w.l,1);
- return m_cache->read_byte(pc);
+ return m_cache.read_byte(pc);
}
uint8_t scmp_device::RM(uint32_t a)
{
- return m_program->read_byte(a);
+ return m_program.read_byte(a);
}
void scmp_device::WM(uint32_t a, uint8_t v)
{
- m_program->write_byte(a, v);
+ m_program.write_byte(a, v);
}
void scmp_device::illegal(uint8_t opcode)
@@ -502,8 +502,8 @@ void scmp_device::device_start()
state_add(SCMP_SR, "SR", m_SR);
}
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
/* resolve callbacks */
m_flag_out_func.resolve_safe();
diff --git a/src/devices/cpu/scmp/scmp.h b/src/devices/cpu/scmp/scmp.h
index 5d9167d65fd..7145973bdb1 100644
--- a/src/devices/cpu/scmp/scmp.h
+++ b/src/devices/cpu/scmp/scmp.h
@@ -58,8 +58,8 @@ private:
uint8_t m_ER;
uint8_t m_SR;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
int m_icount;
devcb_write8 m_flag_out_func;
diff --git a/src/devices/cpu/score/score.cpp b/src/devices/cpu/score/score.cpp
index bf5b434cb06..a8666ac5828 100644
--- a/src/devices/cpu/score/score.cpp
+++ b/src/devices/cpu/score/score.cpp
@@ -72,8 +72,8 @@ score7_cpu_device::score7_cpu_device(const machine_config &mconfig, const char *
void score7_cpu_device::device_start()
{
// find address spaces
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
// set our instruction counter
set_icountptr(m_icount);
@@ -283,37 +283,37 @@ int32_t score7_cpu_device::sign_extend(uint32_t data, uint8_t len)
uint32_t score7_cpu_device::fetch()
{
- return m_cache->read_dword(m_pc & ~3);
+ return m_cache.read_dword(m_pc & ~3);
}
uint8_t score7_cpu_device::read_byte(offs_t offset)
{
- return m_program->read_byte(offset);
+ return m_program.read_byte(offset);
}
uint16_t score7_cpu_device::read_word(offs_t offset)
{
- return m_program->read_word(offset & ~1);
+ return m_program.read_word(offset & ~1);
}
uint32_t score7_cpu_device::read_dword(offs_t offset)
{
- return m_program->read_dword(offset & ~3);
+ return m_program.read_dword(offset & ~3);
}
void score7_cpu_device::write_byte(offs_t offset, uint8_t data)
{
- m_program->write_byte(offset, data);
+ m_program.write_byte(offset, data);
}
void score7_cpu_device::write_word(offs_t offset, uint16_t data)
{
- m_program->write_word(offset & ~1, data);
+ m_program.write_word(offset & ~1, data);
}
void score7_cpu_device::write_dword(offs_t offset, uint32_t data)
{
- m_program->write_dword(offset & ~3, data);
+ m_program.write_dword(offset & ~3, data);
}
void score7_cpu_device::check_irq()
diff --git a/src/devices/cpu/score/score.h b/src/devices/cpu/score/score.h
index b8f8c1680cd..0760b3779a8 100644
--- a/src/devices/cpu/score/score.h
+++ b/src/devices/cpu/score/score.h
@@ -107,8 +107,8 @@ private:
void op_iform1b();
address_space_config m_program_config;
- address_space * m_program;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_program;
// internal state
int m_icount;
diff --git a/src/devices/cpu/se3208/se3208.cpp b/src/devices/cpu/se3208/se3208.cpp
index a8d2381c0da..6e5a15bef2c 100644
--- a/src/devices/cpu/se3208/se3208.cpp
+++ b/src/devices/cpu/se3208/se3208.cpp
@@ -53,7 +53,7 @@ se3208_device::se3208_device(const machine_config &mconfig, const char *tag, dev
, m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0)
, m_machinex_cb(*this)
, m_iackx_cb(*this)
- , m_PC(0), m_SR(0), m_SP(0), m_ER(0), m_PPC(0), m_program(nullptr), m_cache(nullptr), m_IRQ(0), m_NMI(0), m_icount(0)
+ , m_PC(0), m_SR(0), m_SP(0), m_ER(0), m_PPC(0), m_IRQ(0), m_NMI(0), m_icount(0)
{
}
@@ -72,88 +72,66 @@ void se3208_device::device_resolve_objects()
}
-uint32_t se3208_device::read_dword_unaligned(address_space &space, uint32_t address)
+uint8_t se3208_device::SE3208_Read8(uint32_t address)
{
- if (DWORD_ALIGNED(address))
- return space.read_dword(address);
- else
- {
- osd_printf_debug("%08x: dword READ unaligned %08x\n", m_PC, address);
-#if ALLOW_UNALIGNED_DWORD_ACCESS
- return space.read_byte(address) | space.read_byte(address + 1) << 8 | space.read_byte(address + 2) << 16 | space.read_byte(address + 3) << 24;
-#else
- return 0;
-#endif
- }
+ return m_program.read_byte(address);
}
-uint16_t se3208_device::read_word_unaligned(address_space &space, uint32_t address)
+uint16_t se3208_device::SE3208_Read16(uint32_t address)
{
if (!WORD_ALIGNED(address))
- return space.read_byte(address) | space.read_byte(address+1)<<8;
+ return m_program.read_byte(address) | m_program.read_byte(address+1)<<8;
else
- return space.read_word(address);
+ return m_program.read_word(address);
}
-void se3208_device::write_dword_unaligned(address_space &space, uint32_t address, uint32_t data)
+uint32_t se3208_device::SE3208_Read32(uint32_t address)
{
if (DWORD_ALIGNED(address))
- space.write_dword(address, data);
+ return m_program.read_dword(address);
else
{
+ osd_printf_debug("%08x: dword READ unaligned %08x\n", m_PC, address);
#if ALLOW_UNALIGNED_DWORD_ACCESS
- space.write_byte(address, data & 0xff);
- space.write_byte(address + 1, (data >> 8) & 0xff);
- space.write_byte(address + 2, (data >> 16) & 0xff);
- space.write_byte(address + 3, (data >> 24) & 0xff);
+ return m_program.read_byte(address) | m_program.read_byte(address + 1) << 8 | m_program.read_byte(address + 2) << 16 | m_program.read_byte(address + 3) << 24;
+#else
+ return 0;
#endif
- osd_printf_debug("%08x: dword WRITE unaligned %08x\n", m_PC, address);
}
+}
+void se3208_device::SE3208_Write8(uint32_t address,uint8_t data)
+{
+ m_program.write_byte(address,data);
}
-void se3208_device::write_word_unaligned(address_space &space, uint32_t address, uint16_t data)
+void se3208_device::SE3208_Write16(uint32_t address,uint16_t data)
{
if (!WORD_ALIGNED(address))
{
- space.write_byte(address, data & 0xff);
- space.write_byte(address+1, (data>>8)&0xff);
+ m_program.write_byte(address, data & 0xff);
+ m_program.write_byte(address+1, (data>>8)&0xff);
}
else
{
- space.write_word(address, data);
+ m_program.write_word(address, data);
}
}
-
-uint8_t se3208_device::SE3208_Read8(uint32_t addr)
-{
- return m_program->read_byte(addr);
-}
-
-uint16_t se3208_device::SE3208_Read16(uint32_t addr)
+void se3208_device::SE3208_Write32(uint32_t address, uint32_t data)
{
- return read_word_unaligned(*m_program,addr);
-}
-
-uint32_t se3208_device::SE3208_Read32(uint32_t addr)
-{
- return read_dword_unaligned(*m_program,addr);
-}
-
-void se3208_device::SE3208_Write8(uint32_t addr,uint8_t val)
-{
- m_program->write_byte(addr,val);
-}
-
-void se3208_device::SE3208_Write16(uint32_t addr,uint16_t val)
-{
- write_word_unaligned(*m_program,addr,val);
-}
-
-void se3208_device::SE3208_Write32(uint32_t addr,uint32_t val)
-{
- write_dword_unaligned(*m_program,addr,val);
+ if (DWORD_ALIGNED(address))
+ m_program.write_dword(address, data);
+ else
+ {
+#if ALLOW_UNALIGNED_DWORD_ACCESS
+ m_program.write_byte(address, data & 0xff);
+ m_program.write_byte(address + 1, (data >> 8) & 0xff);
+ m_program.write_byte(address + 2, (data >> 16) & 0xff);
+ m_program.write_byte(address + 3, (data >> 24) & 0xff);
+#endif
+ osd_printf_debug("%08x: dword WRITE unaligned %08x\n", m_PC, address);
+ }
}
@@ -1732,8 +1710,8 @@ void se3208_device::device_reset()
m_SP = 0;
m_ER = 0;
m_PPC = 0;
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
m_PC=SE3208_Read32(0);
m_SR=0;
m_IRQ=CLEAR_LINE;
@@ -1777,7 +1755,7 @@ void se3208_device::execute_run()
{
do
{
- uint16_t Opcode=m_cache->read_word(m_PC, WORD_XOR_LE(0));
+ uint16_t Opcode=m_cache.read_word(m_PC, WORD_XOR_LE(0));
m_PPC = m_PC;
debugger_instruction_hook(m_PC);
@@ -1802,8 +1780,8 @@ void se3208_device::device_start()
{
BuildTable();
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
save_item(NAME(m_R));
save_item(NAME(m_PC));
diff --git a/src/devices/cpu/se3208/se3208.h b/src/devices/cpu/se3208/se3208.h
index 3a8f4182b42..d006a071bb4 100644
--- a/src/devices/cpu/se3208/se3208.h
+++ b/src/devices/cpu/se3208/se3208.h
@@ -62,17 +62,13 @@ private:
uint32_t m_ER;
uint32_t m_PPC;
- address_space *m_program;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_program;
uint8_t m_IRQ;
uint8_t m_NMI;
int m_icount;
- inline uint32_t read_dword_unaligned(address_space &space, uint32_t address);
- inline uint16_t read_word_unaligned(address_space &space, uint32_t address);
- inline void write_dword_unaligned(address_space &space, uint32_t address, uint32_t data);
- inline void write_word_unaligned(address_space &space, uint32_t address, uint16_t data);
inline uint8_t SE3208_Read8(uint32_t addr);
inline uint16_t SE3208_Read16(uint32_t addr);
inline uint32_t SE3208_Read32(uint32_t addr);
diff --git a/src/devices/cpu/sh/sh.h b/src/devices/cpu/sh/sh.h
index 7c84bdffb8a..6920d85fd3b 100644
--- a/src/devices/cpu/sh/sh.h
+++ b/src/devices/cpu/sh/sh.h
@@ -385,6 +385,9 @@ public:
std::function<u16 (offs_t)> m_pr16;
std::function<const void * (offs_t)> m_prptr;
address_space *m_program;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cache32;
+ memory_access<32, 3, 0, ENDIANNESS_BIG>::cache m_cache64be;
+ memory_access<32, 3, 0, ENDIANNESS_LITTLE>::cache m_cache64le;
std::unique_ptr<drcuml_state> m_drcuml; /* DRC UML generator state */
uint32_t m_drcoptions; /* configurable DRC options */
diff --git a/src/devices/cpu/sh/sh2.cpp b/src/devices/cpu/sh/sh2.cpp
index bdc6e8ef164..9d1014f1648 100644
--- a/src/devices/cpu/sh/sh2.cpp
+++ b/src/devices/cpu/sh/sh2.cpp
@@ -532,18 +532,18 @@ void sh2_device::device_start()
m_ftcsr_read_cb.resolve();
m_decrypted_program = has_space(AS_OPCODES) ? &space(AS_OPCODES) : &space(AS_PROGRAM);
- auto cache = m_decrypted_program->cache<2, 0, ENDIANNESS_BIG>();
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
+ m_decrypted_program->cache(m_cache32);
+ m_pr16 = [this](offs_t address) -> u16 { return m_cache32.read_word(address); };
if (m_decrypted_program->endianness() != ENDIANNESS_NATIVE)
- m_prptr = [cache](offs_t address) -> const void * {
- const u16 *ptr = static_cast<u16 *>(cache->read_ptr(address & ~3));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u16 *ptr = static_cast<u16 *>(m_cache32.read_ptr(address & ~3));
if(!(address & 2))
ptr++;
return ptr;
};
else
- m_prptr = [cache](offs_t address) -> const void * {
- const u16 *ptr = static_cast<u16 *>(cache->read_ptr(address & ~3));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u16 *ptr = static_cast<u16 *>(m_cache32.read_ptr(address & ~3));
if(address & 2)
ptr++;
return ptr;
diff --git a/src/devices/cpu/sh/sh2.h b/src/devices/cpu/sh/sh2.h
index 7a64f87b973..8eaad7ad6c4 100644
--- a/src/devices/cpu/sh/sh2.h
+++ b/src/devices/cpu/sh/sh2.h
@@ -244,6 +244,8 @@ private:
int8_t m_irq_line_state[17];
address_space *m_internal;
+
+
// SCI
uint8_t m_smr = 0, m_brr = 0, m_scr = 0, m_tdr = 0, m_ssr = 0;
// FRT / FRC
diff --git a/src/devices/cpu/sh/sh4.cpp b/src/devices/cpu/sh/sh4.cpp
index b646882e0dc..0d212e7ffe2 100644
--- a/src/devices/cpu/sh/sh4.cpp
+++ b/src/devices/cpu/sh/sh4.cpp
@@ -2062,34 +2062,34 @@ void sh34_base_device::device_start()
m_io = &space(AS_IO);
if (m_program->endianness() == ENDIANNESS_LITTLE)
{
- auto cache = m_program->cache<3, 0, ENDIANNESS_LITTLE>();
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
+ m_program->cache(m_cache64le);
+ m_pr16 = [this](offs_t address) -> u16 { return m_cache64le.read_word(address); };
if (ENDIANNESS_NATIVE != ENDIANNESS_LITTLE)
- m_prptr = [cache](offs_t address) -> const void * {
- const u16 *ptr = static_cast<u16 *>(cache->read_ptr(address & ~7));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u16 *ptr = static_cast<u16 *>(m_cache64le.read_ptr(address & ~7));
ptr += (~address >> 1) & 3;
return ptr;
};
else
- m_prptr = [cache](offs_t address) -> const void * {
- const u16 *ptr = static_cast<u16 *>(cache->read_ptr(address & ~7));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u16 *ptr = static_cast<u16 *>(m_cache64le.read_ptr(address & ~7));
ptr += (address >> 1) & 3;
return ptr;
};
}
else
{
- auto cache = m_program->cache<3, 0, ENDIANNESS_BIG>();
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
+ m_program->cache(m_cache64be);
+ m_pr16 = [this](offs_t address) -> u16 { return m_cache64be.read_word(address); };
if (ENDIANNESS_NATIVE != ENDIANNESS_BIG)
- m_prptr = [cache](offs_t address) -> const void * {
- const u16 *ptr = static_cast<u16 *>(cache->read_ptr(address & ~7));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u16 *ptr = static_cast<u16 *>(m_cache64be.read_ptr(address & ~7));
ptr += (~address >> 1) & 3;
return ptr;
};
else
- m_prptr = [cache](offs_t address) -> const void * {
- const u16 *ptr = static_cast<u16 *>(cache->read_ptr(address & ~7));
+ m_prptr = [this](offs_t address) -> const void * {
+ const u16 *ptr = static_cast<u16 *>(m_cache64be.read_ptr(address & ~7));
ptr += (address >> 1) & 3;
return ptr;
};
diff --git a/src/devices/cpu/sparc/sparc.cpp b/src/devices/cpu/sparc/sparc.cpp
index 38a47934f1b..6dec789ca93 100644
--- a/src/devices/cpu/sparc/sparc.cpp
+++ b/src/devices/cpu/sparc/sparc.cpp
@@ -174,7 +174,7 @@ void sparc_base_device::device_start()
{
continue;
}
- m_asi[i] = space(i).specific<2, 0, ENDIANNESS_BIG>();
+ space(i).specific(m_asi[i]);
}
memset(m_dbgregs, 0, 24 * sizeof(uint32_t));
@@ -548,13 +548,13 @@ device_memory_interface::space_config_vector sparc_base_device::memory_space_con
inline uint32_t sparc_base_device::read_word(const uint8_t asi, const uint32_t address, const uint32_t mem_mask)
{
assert(asi < 0x10); // We do not currently support ASIs outside the range used by actual Sun machines.
- return m_asi[asi | 0x10]->read_dword(address, mem_mask);
+ return m_asi[asi | 0x10].read_dword(address, mem_mask);
}
inline void sparc_base_device::write_word(const uint8_t asi, const uint32_t address, const uint32_t data, const uint32_t mem_mask)
{
assert(asi < 0x10); // We do not currently support ASIs outside the range used by actual Sun machines.
- return m_asi[asi | 0x10]->write_dword(address, data, mem_mask);
+ return m_asi[asi | 0x10].write_dword(address, data, mem_mask);
}
diff --git a/src/devices/cpu/sparc/sparc.h b/src/devices/cpu/sparc/sparc.h
index e65e406ce1d..132fd6feabf 100644
--- a/src/devices/cpu/sparc/sparc.h
+++ b/src/devices/cpu/sparc/sparc.h
@@ -157,7 +157,7 @@ protected:
// address spaces
address_space_config m_debugger_config;
address_space_config m_asi_config[0x10];
- memory_access_specific<2, 0, ENDIANNESS_BIG> *m_asi[0x20];
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_asi[0x20];
// memory access
inline uint32_t read_word(const uint8_t asi, const uint32_t address, const uint32_t mem_mask = 0xffffffff);
diff --git a/src/devices/cpu/ssp1601/ssp1601.cpp b/src/devices/cpu/ssp1601/ssp1601.cpp
index 8f449d6d6a9..79119b6a97a 100644
--- a/src/devices/cpu/ssp1601/ssp1601.cpp
+++ b/src/devices/cpu/ssp1601/ssp1601.cpp
@@ -45,8 +45,8 @@
#define PPC m_ppc.w.h
-#define FETCH() m_cache->read_word(rPC++)
-#define PROGRAM_WORD(a) m_program->read_word(a)
+#define FETCH() m_cache.read_word(rPC++)
+#define PROGRAM_WORD(a) m_program.read_word(a)
#define GET_PPC_OFFS() PPC
#define REG_READ(r) (((r) <= 4) ? m_gr[r].w.h : (this->*reg_read_handlers[r])(r))
@@ -241,13 +241,13 @@ void ssp1601_device::write_unknown(int reg, uint32_t d)
uint32_t ssp1601_device::read_ext(int reg)
{
reg &= 7;
- return m_io->read_word((reg << 1));
+ return m_io.read_word((reg << 1));
}
void ssp1601_device::write_ext(int reg, uint32_t d)
{
reg &= 7;
- m_io->write_word((reg << 1), d);
+ m_io.write_word((reg << 1), d);
}
// 4
@@ -521,9 +521,9 @@ void ssp1601_device::device_start()
m_g_cycles = 0;
m_gr[0].w.h = 0xffff; // constant reg
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_BIG>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
state_add( SSP_R0, "REG0", m_gr[0].w.h).formatstr("%04X");
state_add( SSP_X, "X", rX).formatstr("%04X");
diff --git a/src/devices/cpu/ssp1601/ssp1601.h b/src/devices/cpu/ssp1601/ssp1601.h
index db86dddb875..e912ff9891b 100644
--- a/src/devices/cpu/ssp1601/ssp1601.h
+++ b/src/devices/cpu/ssp1601/ssp1601.h
@@ -71,9 +71,9 @@ private:
int m_g_cycles;
- address_space *m_program;
- memory_access_cache<1, -1, ENDIANNESS_BIG> *m_cache;
- address_space *m_io;
+ memory_access<16, 1, -1, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<16, 1, -1, ENDIANNESS_BIG>::specific m_program;
+ memory_access< 4, 1, 0, ENDIANNESS_BIG>::specific m_io;
void update_P();
uint32_t read_unknown(int reg);
diff --git a/src/devices/cpu/t11/t11.cpp b/src/devices/cpu/t11/t11.cpp
index 4ab5a587193..667d38de2ee 100644
--- a/src/devices/cpu/t11/t11.cpp
+++ b/src/devices/cpu/t11/t11.cpp
@@ -85,7 +85,7 @@ device_memory_interface::space_config_vector t11_device::memory_space_config() c
int t11_device::ROPCODE()
{
PC &= 0xfffe;
- int val = m_cache->read_word(PC);
+ int val = m_cache.read_word(PC);
PC += 2;
return val;
}
@@ -93,25 +93,25 @@ int t11_device::ROPCODE()
int t11_device::RBYTE(int addr)
{
- return m_program->read_byte(addr);
+ return m_program.read_byte(addr);
}
void t11_device::WBYTE(int addr, int data)
{
- m_program->write_byte(addr, data);
+ m_program.write_byte(addr, data);
}
int t11_device::RWORD(int addr)
{
- return m_program->read_word(addr & 0xfffe);
+ return m_program.read_word(addr & 0xfffe);
}
void t11_device::WWORD(int addr, int data)
{
- m_program->write_word(addr & 0xfffe, data);
+ m_program.write_word(addr & 0xfffe, data);
}
@@ -303,8 +303,8 @@ void t11_device::device_start()
};
m_initial_pc = initial_pc[c_initial_mode >> 13];
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
m_out_reset_func.resolve_safe();
m_in_iack_func.resolve_safe(0377);
diff --git a/src/devices/cpu/t11/t11.h b/src/devices/cpu/t11/t11.h
index 2b54933ba94..ff63ef311fe 100644
--- a/src/devices/cpu/t11/t11.h
+++ b/src/devices/cpu/t11/t11.h
@@ -93,8 +93,8 @@ protected:
bool m_power_fail;
bool m_ext_halt;
int m_icount;
- address_space *m_program;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 1, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 1, 0, ENDIANNESS_LITTLE>::specific m_program;
devcb_write_line m_out_reset_func;
devcb_read8 m_in_iack_func;
diff --git a/src/devices/cpu/tms32010/tms32010.cpp b/src/devices/cpu/tms32010/tms32010.cpp
index 4ac26dd3185..01c18fb4471 100644
--- a/src/devices/cpu/tms32010/tms32010.cpp
+++ b/src/devices/cpu/tms32010/tms32010.cpp
@@ -167,14 +167,14 @@ std::unique_ptr<util::disasm_interface> tms32010_device::create_disassembler()
* Input a word from given I/O port
*/
-#define TMS32010_In(Port) (m_io->read_word(Port))
+#define TMS32010_In(Port) (m_io.read_word(Port))
/****************************************************************************
* Output a word to given I/O port
*/
-#define TMS32010_Out(Port,Value) (m_io->write_word(Port,Value))
+#define TMS32010_Out(Port,Value) (m_io.write_word(Port,Value))
@@ -182,14 +182,14 @@ std::unique_ptr<util::disasm_interface> tms32010_device::create_disassembler()
* Read a word from given ROM memory location
*/
-#define TMS32010_ROM_RDMEM(A) (m_program->read_word(A))
+#define TMS32010_ROM_RDMEM(A) (m_program.read_word(A))
/****************************************************************************
* Write a word to given ROM memory location
*/
-#define TMS32010_ROM_WRMEM(A,V) (m_program->write_word(A,V))
+#define TMS32010_ROM_WRMEM(A,V) (m_program.write_word(A,V))
@@ -197,14 +197,14 @@ std::unique_ptr<util::disasm_interface> tms32010_device::create_disassembler()
* Read a word from given RAM memory location
*/
-#define TMS32010_RAM_RDMEM(A) (m_data->read_word(A))
+#define TMS32010_RAM_RDMEM(A) (m_data.read_word(A))
/****************************************************************************
* Write a word to given RAM memory location
*/
-#define TMS32010_RAM_WRMEM(A,V) (m_data->write_word(A,V))
+#define TMS32010_RAM_WRMEM(A,V) (m_data.write_word(A,V))
@@ -214,7 +214,7 @@ std::unique_ptr<util::disasm_interface> tms32010_device::create_disassembler()
* used to greatly speed up emulation
*/
-#define TMS32010_RDOP(A) (m_cache->read_word(A))
+#define TMS32010_RDOP(A) (m_cache.read_word(A))
/****************************************************************************
@@ -223,7 +223,7 @@ std::unique_ptr<util::disasm_interface> tms32010_device::create_disassembler()
* that use different encoding mechanisms for opcodes and opcode arguments
*/
-#define TMS32010_RDOP_ARG(A) (m_cache->read_word(A))
+#define TMS32010_RDOP_ARG(A) (m_cache.read_word(A))
/************************************************************************
@@ -835,10 +835,10 @@ void tms32010_device::device_start()
save_item(NAME(m_memaccess));
save_item(NAME(m_addr_mask));
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_BIG>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
m_bio_in.resolve_safe(0);
diff --git a/src/devices/cpu/tms32010/tms32010.h b/src/devices/cpu/tms32010/tms32010.h
index 247c9546a47..beebee1b0b0 100644
--- a/src/devices/cpu/tms32010/tms32010.h
+++ b/src/devices/cpu/tms32010/tms32010.h
@@ -101,10 +101,10 @@ private:
uint16_t m_memaccess;
int m_addr_mask;
- address_space *m_program;
- memory_access_cache<1, -1, ENDIANNESS_BIG> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<12, 1, -1, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<12, 1, -1, ENDIANNESS_BIG>::specific m_program;
+ memory_access< 8, 1, -1, ENDIANNESS_BIG>::specific m_data;
+ memory_access< 4, 1, -1, ENDIANNESS_BIG>::specific m_io;
inline void CLR(uint16_t flag);
inline void SET_FLAG(uint16_t flag);
diff --git a/src/devices/cpu/tms32025/tms32025.cpp b/src/devices/cpu/tms32025/tms32025.cpp
index a3f8c588869..7d07c2f43df 100644
--- a/src/devices/cpu/tms32025/tms32025.cpp
+++ b/src/devices/cpu/tms32025/tms32025.cpp
@@ -546,7 +546,7 @@ void tms32025_device::GETDATA(int shift,int signext)
m_external_mem_access = 0;
}
- m_ALU.d = (uint16_t)m_data->read_word(m_memaccess);
+ m_ALU.d = (uint16_t)m_data.read_word(m_memaccess);
if (signext) m_ALU.d = (int16_t)m_ALU.d;
m_ALU.d <<= shift;
@@ -560,14 +560,14 @@ void tms32025_device::PUTDATA(uint16_t data)
if (m_memaccess >= 0x800) m_external_mem_access = 1; /* Pause if hold pin is active */
else m_external_mem_access = 0;
- m_data->write_word(IND, data);
+ m_data.write_word(IND, data);
MODIFY_AR_ARP();
}
else {
if (m_memaccess >= 0x800) m_external_mem_access = 1; /* Pause if hold pin is active */
else m_external_mem_access = 0;
- m_data->write_word(DMA, data);
+ m_data.write_word(DMA, data);
}
}
void tms32025_device::PUTDATA_SST(uint16_t data)
@@ -582,7 +582,7 @@ void tms32025_device::PUTDATA_SST(uint16_t data)
m_opcode.b.l &= 0xf7; /* Stop ARP changes */
MODIFY_AR_ARP();
}
- m_data->write_word(m_memaccess, data);
+ m_data.write_word(m_memaccess, data);
}
@@ -670,8 +670,8 @@ void tms32025_device::addt()
void tms32025_device::adlk()
{
m_oldacc.d = m_ACC.d;
- if (SXM) m_ALU.d = (int16_t)m_cache->read_word(m_PC);
- else m_ALU.d = (uint16_t)m_cache->read_word(m_PC);
+ if (SXM) m_ALU.d = (int16_t)m_cache.read_word(m_PC);
+ else m_ALU.d = (uint16_t)m_cache.read_word(m_PC);
m_PC++;
m_ALU.d <<= (m_opcode.b.h & 0xf);
m_ACC.d += m_ALU.d;
@@ -690,7 +690,7 @@ void tms32025_device::and_()
void tms32025_device::andk()
{
m_oldacc.d = m_ACC.d;
- m_ALU.d = (uint16_t)m_cache->read_word(m_PC);
+ m_ALU.d = (uint16_t)m_cache.read_word(m_PC);
m_PC++;
m_ALU.d <<= (m_opcode.b.h & 0xf);
m_ACC.d &= m_ALU.d;
@@ -705,7 +705,7 @@ void tms32025_device::apac()
}
void tms32025_device::br()
{
- m_PC = m_cache->read_word(m_PC);
+ m_PC = m_cache.read_word(m_PC);
MODIFY_AR_ARP();
}
void tms32025_device::bacc()
@@ -714,43 +714,43 @@ void tms32025_device::bacc()
}
void tms32025_device::banz()
{
- if (m_AR[ARP]) m_PC = m_cache->read_word(m_PC);
+ if (m_AR[ARP]) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bbnz()
{
- if (TC) m_PC = m_cache->read_word(m_PC);
+ if (TC) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bbz()
{
- if (TC == 0) m_PC = m_cache->read_word(m_PC);
+ if (TC == 0) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bc()
{
- if (CARRY) m_PC = m_cache->read_word(m_PC);
+ if (CARRY) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bgez()
{
- if ( (int32_t)(m_ACC.d) >= 0 ) m_PC = m_cache->read_word(m_PC);
+ if ( (int32_t)(m_ACC.d) >= 0 ) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bgz()
{
- if ( (int32_t)(m_ACC.d) > 0 ) m_PC = m_cache->read_word(m_PC);
+ if ( (int32_t)(m_ACC.d) > 0 ) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bioz()
{
- if (m_bio_in() != CLEAR_LINE) m_PC = m_cache->read_word(m_PC);
+ if (m_bio_in() != CLEAR_LINE) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
@@ -768,17 +768,17 @@ void tms32025_device::bitt()
}
void tms32025_device::blez()
{
- if ( (int32_t)(m_ACC.d) <= 0 ) m_PC = m_cache->read_word(m_PC);
+ if ( (int32_t)(m_ACC.d) <= 0 ) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::blkd()
{ /** Fix cycle timing **/
if (m_init_load_addr) {
- m_PFC = m_cache->read_word(m_PC);
+ m_PFC = m_cache.read_word(m_PC);
m_PC++;
}
- m_ALU.d = m_data->read_word(m_PFC);
+ m_ALU.d = m_data.read_word(m_PFC);
PUTDATA(m_ALU.d);
m_PFC++;
m_tms32025_dec_cycles += (1*CLK);
@@ -786,29 +786,29 @@ void tms32025_device::blkd()
void tms32025_device::blkp()
{ /** Fix cycle timing **/
if (m_init_load_addr) {
- m_PFC = m_cache->read_word(m_PC);
+ m_PFC = m_cache.read_word(m_PC);
m_PC++;
}
- m_ALU.d = m_cache->read_word(m_PFC);
+ m_ALU.d = m_cache.read_word(m_PFC);
PUTDATA(m_ALU.d);
m_PFC++;
m_tms32025_dec_cycles += (2*CLK);
}
void tms32025_device::blz()
{
- if ( (int32_t)(m_ACC.d) < 0 ) m_PC = m_cache->read_word(m_PC);
+ if ( (int32_t)(m_ACC.d) < 0 ) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bnc()
{
- if (CARRY == 0) m_PC = m_cache->read_word(m_PC);
+ if (CARRY == 0) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bnv()
{
- if (OV == 0) m_PC = m_cache->read_word(m_PC);
+ if (OV == 0) m_PC = m_cache.read_word(m_PC);
else {
m_PC++ ;
CLR0(OV_FLAG);
@@ -817,14 +817,14 @@ void tms32025_device::bnv()
}
void tms32025_device::bnz()
{
- if (m_ACC.d != 0) m_PC = m_cache->read_word(m_PC);
+ if (m_ACC.d != 0) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
void tms32025_device::bv()
{
if (OV) {
- m_PC = m_cache->read_word(m_PC);
+ m_PC = m_cache.read_word(m_PC);
CLR0(OV_FLAG);
}
else m_PC++ ;
@@ -832,7 +832,7 @@ void tms32025_device::bv()
}
void tms32025_device::bz()
{
- if (m_ACC.d == 0) m_PC = m_cache->read_word(m_PC);
+ if (m_ACC.d == 0) m_PC = m_cache.read_word(m_PC);
else m_PC++ ;
MODIFY_AR_ARP();
}
@@ -845,7 +845,7 @@ void tms32025_device::call()
{
m_PC++ ;
PUSH_STACK(m_PC);
- m_PC = m_cache->read_word(m_PC - 1);
+ m_PC = m_cache.read_word(m_PC - 1);
MODIFY_AR_ARP();
}
void tms32025_device::cmpl()
@@ -873,16 +873,16 @@ void tms32025_device::cmpr()
void tms32025_device::cnfd() /** next two fetches need to use previous CNF value ! **/
{
if(m_STR1 & CNF0_REG) {
- m_program->unmap_readwrite(0xff00, 0xffff);
- m_data->install_ram(0x0200, 0x02ff, m_b0);
+ space(AS_PROGRAM).unmap_readwrite(0xff00, 0xffff);
+ space(AS_DATA).install_ram(0x0200, 0x02ff, m_b0);
CLR1(CNF0_REG);
}
}
void tms32025_device::cnfp() /** next two fetches need to use previous CNF value ! **/
{
if(!(m_STR1 & CNF0_REG)) {
- m_program->install_ram(0xff00, 0xffff, m_b0);
- m_data->unmap_readwrite(0x0200, 0x02ff);
+ space(AS_PROGRAM).install_ram(0xff00, 0xffff, m_b0);
+ space(AS_DATA).unmap_readwrite(0x0200, 0x02ff);
SET1(CNF0_REG);
}
}
@@ -918,27 +918,27 @@ void tms32026_device::conf() /** Need to reconfigure the memory blocks */
CLR1(CNF1_REG);
if(next < 1 && prev >= 1) {
- m_program->unmap_readwrite(0xfa00, 0xfbff);
- m_data->install_ram(0x0200, 0x03ff, m_b0);
+ space(AS_PROGRAM).unmap_readwrite(0xfa00, 0xfbff);
+ space(AS_DATA).install_ram(0x0200, 0x03ff, m_b0);
} else if(next >= 1 && prev < 1) {
- m_program->install_ram(0xfa00, 0xfbff, m_b0);
- m_data->unmap_readwrite(0x0200, 0x03ff);
+ space(AS_PROGRAM).install_ram(0xfa00, 0xfbff, m_b0);
+ space(AS_DATA).unmap_readwrite(0x0200, 0x03ff);
}
if(next < 2 && prev >= 2) {
- m_program->unmap_readwrite(0xfc00, 0xfdff);
- m_data->install_ram(0x0400, 0x05ff, m_b1);
+ space(AS_PROGRAM).unmap_readwrite(0xfc00, 0xfdff);
+ space(AS_DATA).install_ram(0x0400, 0x05ff, m_b1);
} else if(next >= 2 && prev < 2) {
- m_program->install_ram(0xfc00, 0xfdff, m_b1);
- m_data->unmap_readwrite(0x0400, 0x05ff);
+ space(AS_PROGRAM).install_ram(0xfc00, 0xfdff, m_b1);
+ space(AS_DATA).unmap_readwrite(0x0400, 0x05ff);
}
if(next < 3 && prev >= 3) {
- m_program->unmap_readwrite(0xfe00, 0xffff);
- m_data->install_ram(0x0600, 0x07ff, m_b3);
+ space(AS_PROGRAM).unmap_readwrite(0xfe00, 0xffff);
+ space(AS_DATA).install_ram(0x0600, 0x07ff, m_b3);
} else if(next >= 3 && prev < 3) {
- m_program->install_ram(0xfe00, 0xffff, m_b3);
- m_data->unmap_readwrite(0x0600, 0x07ff);
+ space(AS_PROGRAM).install_ram(0xfe00, 0xffff, m_b3);
+ space(AS_DATA).unmap_readwrite(0x0600, 0x07ff);
}
}
void tms32025_device::dint()
@@ -948,7 +948,7 @@ void tms32025_device::dint()
void tms32025_device::dmov() /** Careful with how memory is configured !! */
{
GETDATA(0, 0);
- m_data->write_word(m_memaccess + 1, m_ALU.w.l);
+ m_data.write_word(m_memaccess + 1, m_ALU.w.l);
}
void tms32025_device::eint()
{
@@ -966,7 +966,7 @@ void tms32025_device::idle()
}
void tms32025_device::in()
{
- m_ALU.w.l = m_io->read_word(m_opcode.b.h & 0xf);
+ m_ALU.w.l = m_io.read_word(m_opcode.b.h & 0xf);
PUTDATA(m_ALU.w.l);
}
void tms32025_device::lac()
@@ -985,8 +985,8 @@ void tms32025_device::lact()
}
void tms32025_device::lalk()
{
- if (SXM) m_ALU.d = (int16_t)m_cache->read_word(m_PC);
- else m_ALU.d = (uint16_t)m_cache->read_word(m_PC);
+ if (SXM) m_ALU.d = (int16_t)m_cache.read_word(m_PC);
+ else m_ALU.d = (uint16_t)m_cache.read_word(m_PC);
m_PC++;
m_ALU.d <<= (m_opcode.b.h & 0xf);
m_ACC.d = m_ALU.d;
@@ -1023,7 +1023,7 @@ void tms32025_device::lph()
}
void tms32025_device::lrlk()
{
- m_ALU.d = (uint16_t)m_cache->read_word(m_PC);
+ m_ALU.d = (uint16_t)m_cache.read_word(m_PC);
m_PC++;
m_AR[m_opcode.b.h & 7] = m_ALU.w.l;
}
@@ -1068,7 +1068,7 @@ void tms32025_device::ltd() /** Careful with how memory is configured !! */
m_oldacc.d = m_ACC.d;
GETDATA(0, 0);
m_Treg = m_ALU.w.l;
- m_data->write_word(m_memaccess+1, m_ALU.w.l);
+ m_data.write_word(m_memaccess+1, m_ALU.w.l);
SHIFT_Preg_TO_ALU();
m_ACC.d += m_ALU.d;
CALCULATE_ADD_OVERFLOW(m_ALU.d);
@@ -1096,7 +1096,7 @@ void tms32025_device::mac() /** RAM blocks B0,B1,B2 may be important !
{ /** Fix cycle timing **/
m_oldacc.d = m_ACC.d;
if (m_init_load_addr) {
- m_PFC = m_cache->read_word(m_PC);
+ m_PFC = m_cache.read_word(m_PC);
m_PC++;
}
SHIFT_Preg_TO_ALU();
@@ -1105,7 +1105,7 @@ void tms32025_device::mac() /** RAM blocks B0,B1,B2 may be important !
CALCULATE_ADD_CARRY();
GETDATA(0, 0);
m_Treg = m_ALU.w.l;
- m_Preg.d = ( (int16_t)m_ALU.w.l * (int16_t)m_cache->read_word(m_PFC) );
+ m_Preg.d = ( (int16_t)m_ALU.w.l * (int16_t)m_cache.read_word(m_PFC) );
m_PFC++;
m_tms32025_dec_cycles += (2*CLK);
}
@@ -1113,7 +1113,7 @@ void tms32025_device::macd() /** RAM blocks B0,B1,B2 may be important !
{ /** Fix cycle timing **/
m_oldacc.d = m_ACC.d;
if (m_init_load_addr) {
- m_PFC = m_cache->read_word(m_PC);
+ m_PFC = m_cache.read_word(m_PC);
m_PC++;
}
SHIFT_Preg_TO_ALU();
@@ -1122,10 +1122,10 @@ void tms32025_device::macd() /** RAM blocks B0,B1,B2 may be important !
CALCULATE_ADD_CARRY();
GETDATA(0, 0);
if ( (m_opcode.b.l & 0x80) || m_init_load_addr ) { /* No writing during repetition, or DMA mode */
- m_data->write_word(m_memaccess+1, m_ALU.w.l);
+ m_data.write_word(m_memaccess+1, m_ALU.w.l);
}
m_Treg = m_ALU.w.l;
- m_Preg.d = ( (int16_t)m_ALU.w.l * (int16_t)m_cache->read_word(m_PFC) );
+ m_Preg.d = ( (int16_t)m_ALU.w.l * (int16_t)m_cache.read_word(m_PFC) );
m_PFC++;
m_tms32025_dec_cycles += (2*CLK);
}
@@ -1198,7 +1198,7 @@ void tms32025_device::or_()
}
void tms32025_device::ork()
{
- m_ALU.d = (uint16_t)m_cache->read_word(m_PC);
+ m_ALU.d = (uint16_t)m_cache.read_word(m_PC);
m_PC++;
m_ALU.d <<= (m_opcode.b.h & 0xf);
m_ACC.d |= (m_ALU.d);
@@ -1206,7 +1206,7 @@ void tms32025_device::ork()
void tms32025_device::out()
{
GETDATA(0, 0);
- m_io->write_word(m_opcode.b.h & 0xf, m_ALU.w.l );
+ m_io.write_word(m_opcode.b.h & 0xf, m_ALU.w.l );
}
void tms32025_device::pac()
{
@@ -1317,8 +1317,8 @@ void tms32025_device::sar_ar7() { PUTDATA(m_AR[7]); }
void tms32025_device::sblk()
{
m_oldacc.d = m_ACC.d;
- if (SXM) m_ALU.d = (int16_t)m_cache->read_word(m_PC);
- else m_ALU.d = (uint16_t)m_cache->read_word(m_PC);
+ if (SXM) m_ALU.d = (int16_t)m_cache.read_word(m_PC);
+ else m_ALU.d = (uint16_t)m_cache.read_word(m_PC);
m_PC++;
m_ALU.d <<= (m_opcode.b.h & 0xf);
m_ACC.d -= m_ALU.d;
@@ -1509,7 +1509,7 @@ void tms32025_device::tblr()
if (m_init_load_addr) {
m_PFC = m_ACC.w.l;
}
- m_ALU.w.l = m_cache->read_word(m_PFC);
+ m_ALU.w.l = m_cache.read_word(m_PFC);
if ( (CNF0) && ( (uint16_t)(m_PFC) >= 0xff00 ) ) {} /** TMS32025 only */
else m_tms32025_dec_cycles += (1*CLK);
PUTDATA(m_ALU.w.l);
@@ -1523,7 +1523,7 @@ void tms32025_device::tblw()
m_tms32025_dec_cycles += (1*CLK);
GETDATA(0, 0);
if (m_external_mem_access) m_tms32025_dec_cycles += (1*CLK);
- m_program->write_word(m_PFC, m_ALU.w.l);
+ m_program.write_word(m_PFC, m_ALU.w.l);
m_PFC++;
}
void tms32025_device::trap()
@@ -1538,7 +1538,7 @@ void tms32025_device::xor_()
}
void tms32025_device::xork()
{
- m_ALU.d = m_cache->read_word(m_PC);
+ m_ALU.d = m_cache.read_word(m_PC);
m_PC++;
m_ALU.d <<= (m_opcode.b.h & 0xf);
m_ACC.d ^= m_ALU.d;
@@ -1651,14 +1651,14 @@ const tms32025_device::tms32025_opcode tms32025_device::s_opcode_Dx_subset[8]=
****************************************************************************/
void tms32025_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_BIG>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
if (!m_mp_mc) // if pin 1 is 0 then we're using internal ROM
{
- m_program->install_rom(0x0000, 0x0fff, memregion("internal")->base());
+ m_program.space().install_rom(0x0000, 0x0fff, memregion("internal")->base());
}
m_bio_in.resolve_safe(0xffff);
@@ -1823,8 +1823,8 @@ void tms32025_device::common_reset()
void tms32025_device::device_reset()
{
if(m_STR1 & CNF0_REG) {
- m_program->unmap_readwrite(0xff00, 0xffff);
- m_data->install_ram(0x0200, 0x02ff, m_b0);
+ m_program.space().unmap_readwrite(0xff00, 0xffff);
+ m_data.space().install_ram(0x0200, 0x02ff, m_b0);
}
common_reset();
@@ -2000,7 +2000,7 @@ void tms32025_device::execute_run()
debugger_instruction_hook(m_PC);
- m_opcode.d = m_cache->read_word(m_PC);
+ m_opcode.d = m_cache.read_word(m_PC);
m_PC++;
if (m_opcode.b.h == 0xCE) /* Opcode 0xCExx has many sub-opcodes in its minor byte */
@@ -2034,7 +2034,7 @@ void tms32025_device::execute_run()
debugger_instruction_hook(m_PC);
- m_opcode.d = m_cache->read_word(m_PC);
+ m_opcode.d = m_cache.read_word(m_PC);
m_PC++;
m_tms32025_dec_cycles += (1*CLK);
diff --git a/src/devices/cpu/tms32025/tms32025.h b/src/devices/cpu/tms32025/tms32025.h
index 677da427715..e2e2c799897 100644
--- a/src/devices/cpu/tms32025/tms32025.h
+++ b/src/devices/cpu/tms32025/tms32025.h
@@ -127,10 +127,10 @@ protected:
required_shared_ptr<uint16_t> m_b2;
optional_shared_ptr<uint16_t> m_b3;
- address_space *m_program;
- memory_access_cache<1, -1, ENDIANNESS_BIG> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<16, 1, -1, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<16, 1, -1, ENDIANNESS_BIG>::specific m_program;
+ memory_access<16, 1, -1, ENDIANNESS_BIG>::specific m_data;
+ memory_access<16, 1, -1, ENDIANNESS_BIG>::specific m_io;
typedef void ( tms32025_device::*opcode_func ) ();
struct tms32025_opcode
diff --git a/src/devices/cpu/tms32031/tms32031.cpp b/src/devices/cpu/tms32031/tms32031.cpp
index d7ace7fdb08..a90455c8bd4 100644
--- a/src/devices/cpu/tms32031/tms32031.cpp
+++ b/src/devices/cpu/tms32031/tms32031.cpp
@@ -392,8 +392,6 @@ tms3203x_device::tms3203x_device(const machine_config &mconfig, device_type type
m_irq_pending(false),
m_is_idling(false),
m_icount(0),
- m_program(nullptr),
- m_cache(nullptr),
m_internal_rom(*this, "internal_rom"),
m_mcbl_mode(false),
m_xf0_cb(*this),
@@ -463,7 +461,7 @@ const tiny_rom_entry *tms3203x_device::device_rom_region() const
inline uint32_t tms3203x_device::ROPCODE(offs_t pc)
{
- return m_cache->read_dword(pc);
+ return m_cache.read_dword(pc);
}
@@ -473,7 +471,7 @@ inline uint32_t tms3203x_device::ROPCODE(offs_t pc)
inline uint32_t tms3203x_device::RMEM(offs_t addr)
{
- return m_program->read_dword(addr);
+ return m_program.read_dword(addr);
}
@@ -483,7 +481,7 @@ inline uint32_t tms3203x_device::RMEM(offs_t addr)
inline void tms3203x_device::WMEM(offs_t addr, uint32_t data)
{
- m_program->write_dword(addr, data);
+ m_program.write_dword(addr, data);
}
@@ -494,8 +492,8 @@ inline void tms3203x_device::WMEM(offs_t addr, uint32_t data)
void tms3203x_device::device_start()
{
// find address spaces
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, -2, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
// resolve devcb handlers
m_xf0_cb.resolve_safe();
@@ -507,9 +505,9 @@ void tms3203x_device::device_start()
if (m_mcbl_mode)
{
if (m_internal_rom->base() != nullptr)
- m_program->install_rom(0x000000, 0x000fff, m_internal_rom->base());
+ m_program.space().install_rom(0x000000, 0x000fff, m_internal_rom->base());
else
- m_program->unmap_read(0x000000, 0x000fff);
+ m_program.space().unmap_read(0x000000, 0x000fff);
}
// save state
@@ -853,9 +851,9 @@ void tms3203x_device::execute_set_input(int inputnum, int state)
if (m_mcbl_mode != old_mode)
{
if (m_mcbl_mode && (m_internal_rom->base() != nullptr))
- m_program->install_rom(0x000000, 0x000fff, m_internal_rom->base());
+ m_program.space().install_rom(0x000000, 0x000fff, m_internal_rom->base());
else
- m_program->unmap_read(0x000000, 0x000fff);
+ m_program.space().unmap_read(0x000000, 0x000fff);
}
return;
}
diff --git a/src/devices/cpu/tms32031/tms32031.h b/src/devices/cpu/tms32031/tms32031.h
index 90ed93c8c89..5f998920089 100644
--- a/src/devices/cpu/tms32031/tms32031.h
+++ b/src/devices/cpu/tms32031/tms32031.h
@@ -768,8 +768,8 @@ protected:
int m_icount;
uint32_t m_iotemp;
- address_space * m_program;
- memory_access_cache<2, -2, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<24, 2, -2, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<24, 2, -2, ENDIANNESS_LITTLE>::specific m_program;
optional_memory_region m_internal_rom;
diff --git a/src/devices/cpu/tms32051/32051ops.hxx b/src/devices/cpu/tms32051/32051ops.hxx
index e74fa06f1be..38d125a9de5 100644
--- a/src/devices/cpu/tms32051/32051ops.hxx
+++ b/src/devices/cpu/tms32051/32051ops.hxx
@@ -1378,7 +1378,7 @@ void tms32051_device::op_out()
uint16_t ea = GET_ADDRESS();
uint16_t data = DM_READ16(ea);
- m_io->write_word(port << 1, data);
+ m_io.write_word(port << 1, data);
// TODO: handle repeat
CYCLES(3);
diff --git a/src/devices/cpu/tms32051/tms32051.cpp b/src/devices/cpu/tms32051/tms32051.cpp
index ebcc1d216e5..1691c66b2e2 100644
--- a/src/devices/cpu/tms32051/tms32051.cpp
+++ b/src/devices/cpu/tms32051/tms32051.cpp
@@ -130,7 +130,7 @@ std::unique_ptr<util::disasm_interface> tms32051_device::create_disassembler()
#define CYCLES(x) (m_icount -= x)
-#define ROPCODE() m_cache->read_word(m_pc++)
+#define ROPCODE() m_cache.read_word(m_pc++)
void tms32051_device::CHANGE_PC(uint16_t new_pc)
{
@@ -139,22 +139,22 @@ void tms32051_device::CHANGE_PC(uint16_t new_pc)
uint16_t tms32051_device::PM_READ16(uint16_t address)
{
- return m_program->read_word(address);
+ return m_program.read_word(address);
}
void tms32051_device::PM_WRITE16(uint16_t address, uint16_t data)
{
- m_program->write_word(address, data);
+ m_program.write_word(address, data);
}
uint16_t tms32051_device::DM_READ16(uint16_t address)
{
- return m_data->read_word(address);
+ return m_data.read_word(address);
}
void tms32051_device::DM_WRITE16(uint16_t address, uint16_t data)
{
- m_data->write_word(address, data);
+ m_data.write_word(address, data);
}
#include "32051ops.hxx"
@@ -186,10 +186,10 @@ void tms32051_device::delay_slot(uint16_t startpc)
void tms32051_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, -1, ENDIANNESS_LITTLE>();
- m_data = &space(AS_DATA);
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_io);
m_pcstack_ptr = 0;
m_op = 0;
@@ -519,7 +519,7 @@ READ16_MEMBER( tms32051_device::cpuregs_r )
case 0x5d:
case 0x5e:
case 0x5f:
- return m_io->read_word(offset);
+ return m_io.read_word(offset);
default:
if (!machine().side_effects_disabled())
@@ -630,7 +630,7 @@ WRITE16_MEMBER( tms32051_device::cpuregs_w )
case 0x5d:
case 0x5e:
case 0x5f:
- m_io->write_word(offset, data);
+ m_io.write_word(offset, data);
break;
default:
diff --git a/src/devices/cpu/tms32051/tms32051.h b/src/devices/cpu/tms32051/tms32051.h
index a4d404fc78d..06f69489032 100644
--- a/src/devices/cpu/tms32051/tms32051.h
+++ b/src/devices/cpu/tms32051/tms32051.h
@@ -160,10 +160,10 @@ protected:
int32_t treg2;
} m_shadow;
- address_space *m_program;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_data;
- address_space *m_io;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_io;
int m_icount;
bool m_idle;
diff --git a/src/devices/cpu/tms32082/mp_ops.cpp b/src/devices/cpu/tms32082/mp_ops.cpp
index 0411e6996b6..cbae99b9d81 100644
--- a/src/devices/cpu/tms32082/mp_ops.cpp
+++ b/src/devices/cpu/tms32082/mp_ops.cpp
@@ -142,38 +142,38 @@ void tms32082_mp_device::vector_loadstore()
{
case 0x01: // vst.s
{
- m_program->write_dword(m_outp, m_reg[rd]);
+ m_program.write_dword(m_outp, m_reg[rd]);
m_outp += 4;
break;
}
case 0x03: // vst.d
{
uint64_t data = m_fpair[rd >> 1];
- m_program->write_qword(m_outp, data);
+ m_program.write_qword(m_outp, data);
m_outp += 8;
break;
}
case 0x04: // vld0.s
{
- m_reg[rd] = m_program->read_dword(m_in0p);
+ m_reg[rd] = m_program.read_dword(m_in0p);
m_in0p += 4;
break;
}
case 0x05: // vld1.s
{
- m_reg[rd] = m_program->read_dword(m_in1p);
+ m_reg[rd] = m_program.read_dword(m_in1p);
m_in1p += 4;
break;
}
case 0x06: // vld0.d
{
- m_fpair[rd >> 1] = m_program->read_qword(m_in0p);
+ m_fpair[rd >> 1] = m_program.read_qword(m_in0p);
m_in0p += 8;
break;
}
case 0x07: // vld1.d
{
- m_fpair[rd >> 1] = m_program->read_qword(m_in1p);
+ m_fpair[rd >> 1] = m_program.read_qword(m_in1p);
m_in1p += 8;
break;
}
@@ -518,7 +518,7 @@ void tms32082_mp_device::execute_short_imm()
int32_t offset = OP_SIMM15();
uint32_t address = m_reg[base] + offset;
- uint32_t data = (uint8_t)m_program->read_byte(address);
+ uint32_t data = (uint8_t)m_program.read_byte(address);
if (data & 0x80) data |= 0xffffff00;
if (rd)
m_reg[rd] = data;
@@ -537,7 +537,7 @@ void tms32082_mp_device::execute_short_imm()
int32_t offset = OP_SIMM15();
uint32_t address = m_reg[base] + offset;
- uint32_t data = (uint16_t)m_program->read_word(address);
+ uint32_t data = (uint16_t)m_program.read_word(address);
if (data & 0x8000) data |= 0xffff0000;
if (rd)
m_reg[rd] = data;
@@ -556,7 +556,7 @@ void tms32082_mp_device::execute_short_imm()
int32_t offset = OP_SIMM15();
uint32_t address = m_reg[base] + offset;
- uint32_t data = m_program->read_dword(address);
+ uint32_t data = m_program.read_dword(address);
if (rd)
m_reg[rd] = data;
@@ -574,8 +574,8 @@ void tms32082_mp_device::execute_short_imm()
int32_t offset = OP_SIMM15();
uint32_t address = m_reg[base] + offset;
- uint32_t data1 = m_program->read_dword(address);
- uint32_t data2 = m_program->read_dword(address+4);
+ uint32_t data1 = m_program.read_dword(address);
+ uint32_t data2 = m_program.read_dword(address+4);
if (rd)
{
m_reg[(rd & ~1)+1] = data1;
@@ -596,7 +596,7 @@ void tms32082_mp_device::execute_short_imm()
int32_t offset = OP_SIMM15();
uint32_t address = m_reg[base] + offset;
- uint32_t data = (uint8_t)(m_program->read_byte(address));
+ uint32_t data = (uint8_t)(m_program.read_byte(address));
if (rd)
m_reg[rd] = data;
@@ -614,7 +614,7 @@ void tms32082_mp_device::execute_short_imm()
int32_t offset = OP_SIMM15();
uint32_t address = m_reg[base] + offset;
- uint32_t data = (uint16_t)(m_program->read_word(address));
+ uint32_t data = (uint16_t)(m_program.read_word(address));
if (rd)
m_reg[rd] = data;
@@ -633,7 +633,7 @@ void tms32082_mp_device::execute_short_imm()
uint32_t address = m_reg[base] + offset;
- m_program->write_byte(address, (uint8_t)(m_reg[rd]));
+ m_program.write_byte(address, (uint8_t)(m_reg[rd]));
if (m && base)
m_reg[base] = address;
@@ -650,7 +650,7 @@ void tms32082_mp_device::execute_short_imm()
uint32_t address = m_reg[base] + offset;
- m_program->write_word(address, (uint16_t)(m_reg[rd]));
+ m_program.write_word(address, (uint16_t)(m_reg[rd]));
if (m && base)
m_reg[base] = address;
@@ -667,7 +667,7 @@ void tms32082_mp_device::execute_short_imm()
uint32_t address = m_reg[base] + offset;
- m_program->write_dword(address, m_reg[rd]);
+ m_program.write_dword(address, m_reg[rd]);
if (m && base)
m_reg[base] = address;
@@ -684,8 +684,8 @@ void tms32082_mp_device::execute_short_imm()
uint32_t address = m_reg[base] + offset;
- m_program->write_dword(address+0, m_reg[(rd & ~1) + 1]);
- m_program->write_dword(address+4, m_reg[rd & ~1]);
+ m_program.write_dword(address+0, m_reg[(rd & ~1) + 1]);
+ m_program.write_dword(address+4, m_reg[rd & ~1]);
if (m && base)
m_reg[base] = address;
@@ -1043,7 +1043,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int rd = OP_RD();
uint32_t address = m_reg[base] + (has_imm ? imm32 : m_reg[OP_SRC1()]);
- uint32_t r = m_program->read_byte(address);
+ uint32_t r = m_program.read_byte(address);
if (r & 0x80) r |= 0xffffff00;
if (rd)
@@ -1066,7 +1066,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int rd = OP_RD();
uint32_t address = m_reg[base] + ((has_imm ? imm32 : m_reg[OP_SRC1()]) << shift);
- uint32_t r = m_program->read_word(address);
+ uint32_t r = m_program.read_word(address);
if (r & 0x8000) r |= 0xffff0000;
if (rd)
@@ -1088,7 +1088,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int rd = OP_RD();
uint32_t address = m_reg[base] + ((has_imm ? imm32 : m_reg[OP_SRC1()]) << shift);
- uint32_t r = m_program->read_dword(address);
+ uint32_t r = m_program.read_dword(address);
if (rd)
m_reg[rd] = r;
@@ -1109,7 +1109,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int rd = OP_RD();
uint32_t address = m_reg[base] + ((has_imm ? imm32 : m_reg[OP_SRC1()]) << shift);
- uint64_t r = m_program->read_qword(address);
+ uint64_t r = m_program.read_qword(address);
if (rd)
m_fpair[rd >> 1] = r;
@@ -1129,7 +1129,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int rd = OP_RD();
uint32_t address = m_reg[base] + (has_imm ? imm32 : m_reg[OP_SRC1()]);
- uint32_t r = (uint8_t)(m_program->read_byte(address));
+ uint32_t r = (uint8_t)(m_program.read_byte(address));
if (rd)
m_reg[rd] = r;
@@ -1150,7 +1150,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int rd = OP_RD();
uint32_t address = m_reg[base] + ((has_imm ? imm32 : m_reg[OP_SRC1()]) << shift);
- uint32_t r = (uint16_t)(m_program->read_word(address));
+ uint32_t r = (uint16_t)(m_program.read_word(address));
if (rd)
m_reg[rd] = r;
@@ -1170,7 +1170,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int base = OP_BASE();
uint32_t address = m_reg[base] + (has_imm ? imm32 : m_reg[OP_SRC1()]);
- m_program->write_byte(address, (uint8_t)(m_reg[OP_RD()]));
+ m_program.write_byte(address, (uint8_t)(m_reg[OP_RD()]));
if (m && base)
m_reg[base] = address;
@@ -1188,7 +1188,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int base = OP_BASE();
uint32_t address = m_reg[base] + ((has_imm ? imm32 : m_reg[OP_SRC1()]) << shift);
- m_program->write_word(address, (uint16_t)(m_reg[OP_RD()]));
+ m_program.write_word(address, (uint16_t)(m_reg[OP_RD()]));
if (m && base)
m_reg[base] = address;
@@ -1206,7 +1206,7 @@ void tms32082_mp_device::execute_reg_long_imm()
int base = OP_BASE();
uint32_t address = m_reg[base] + ((has_imm ? imm32 : m_reg[OP_SRC1()]) << shift);
- m_program->write_dword(address, m_reg[OP_RD()]);
+ m_program.write_dword(address, m_reg[OP_RD()]);
if (m && base)
m_reg[base] = address;
diff --git a/src/devices/cpu/tms32082/tms32082.cpp b/src/devices/cpu/tms32082/tms32082.cpp
index a14bf89c346..9df37455e99 100644
--- a/src/devices/cpu/tms32082/tms32082.cpp
+++ b/src/devices/cpu/tms32082/tms32082.cpp
@@ -90,20 +90,20 @@ WRITE32_MEMBER(tms32082_mp_device::mp_param_w)
// TODO: move TC functionality to separate device
uint32_t address = data;
- uint32_t next_entry = m_program->read_dword(address + 0);
- uint32_t pt_options = m_program->read_dword(address + 4);
- uint32_t src_addr = m_program->read_dword(address + 8);
- uint32_t dst_addr = m_program->read_dword(address + 12);
- uint32_t src_b_count = m_program->read_word(address + 16);
- uint32_t src_a_count = m_program->read_word(address + 18);
- uint32_t dst_b_count = m_program->read_word(address + 20);
- uint32_t dst_a_count = m_program->read_word(address + 22);
- uint32_t src_c_count = m_program->read_dword(address + 24);
- uint32_t dst_c_count = m_program->read_dword(address + 28);
- uint32_t src_b_pitch = m_program->read_dword(address + 32);
- uint32_t dst_b_pitch = m_program->read_dword(address + 36);
- uint32_t src_c_pitch = m_program->read_dword(address + 40);
- uint32_t dst_c_pitch = m_program->read_dword(address + 44);
+ uint32_t next_entry = m_program.read_dword(address + 0);
+ uint32_t pt_options = m_program.read_dword(address + 4);
+ uint32_t src_addr = m_program.read_dword(address + 8);
+ uint32_t dst_addr = m_program.read_dword(address + 12);
+ uint32_t src_b_count = m_program.read_word(address + 16);
+ uint32_t src_a_count = m_program.read_word(address + 18);
+ uint32_t dst_b_count = m_program.read_word(address + 20);
+ uint32_t dst_a_count = m_program.read_word(address + 22);
+ uint32_t src_c_count = m_program.read_dword(address + 24);
+ uint32_t dst_c_count = m_program.read_dword(address + 28);
+ uint32_t src_b_pitch = m_program.read_dword(address + 32);
+ uint32_t dst_b_pitch = m_program.read_dword(address + 36);
+ uint32_t src_c_pitch = m_program.read_dword(address + 40);
+ uint32_t dst_c_pitch = m_program.read_dword(address + 44);
printf("TC operation:\n");
printf(" Next entry: %08X\n", next_entry);
@@ -137,8 +137,8 @@ WRITE32_MEMBER(tms32082_mp_device::mp_param_w)
uint32_t src = src_addr + c_src_offset + b_src_offset + ia;
uint32_t dst = dst_addr + c_dst_offset + b_dst_offset + ia;
- uint32_t data = m_program->read_byte(src);
- m_program->write_byte(dst, data);
+ uint32_t data = m_program.read_byte(src);
+ m_program.write_byte(dst, data);
//printf("%08X: %02X -> %08X\n", src, data, dst);
}
@@ -151,7 +151,7 @@ WRITE32_MEMBER(tms32082_mp_device::mp_param_w)
void tms32082_mp_device::device_start()
{
- m_program = &space(AS_PROGRAM);
+ space(AS_PROGRAM).specific(m_program);
m_cmd_callback.resolve();
save_item(NAME(m_pc));
@@ -218,8 +218,8 @@ void tms32082_mp_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
set_icountptr(m_icount);
}
@@ -294,7 +294,7 @@ void tms32082_mp_device::processor_command(uint32_t command)
printf("PP0 ");
if (!m_cmd_callback.isnull())
- m_cmd_callback(*m_program, 0, command, 0xffffffff);
+ m_cmd_callback(space(AS_PROGRAM), 0, command, 0xffffffff);
printf("\n");
}
@@ -403,7 +403,7 @@ void tms32082_mp_device::check_interrupts()
m_ie &= ~1; // clear global interrupt mask
// get new pc from vector table
- m_fetchpc = m_pc = m_program->read_dword(0x01010180 + (i * 4));
+ m_fetchpc = m_pc = m_program.read_dword(0x01010180 + (i * 4));
return;
}
}
@@ -436,7 +436,7 @@ void tms32082_mp_device::execute_set_input(int inputnum, int state)
uint32_t tms32082_mp_device::fetch()
{
- uint32_t w = m_cache->read_dword(m_fetchpc);
+ uint32_t w = m_cache.read_dword(m_fetchpc);
m_fetchpc += 4;
return w;
}
@@ -506,7 +506,7 @@ std::unique_ptr<util::disasm_interface> tms32082_pp_device::create_disassembler(
void tms32082_pp_device::device_start()
{
- m_program = &space(AS_PROGRAM);
+ space(AS_PROGRAM).specific(m_program);
save_item(NAME(m_pc));
save_item(NAME(m_fetchpc));
@@ -517,8 +517,8 @@ void tms32082_pp_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
set_icountptr(m_icount);
}
diff --git a/src/devices/cpu/tms32082/tms32082.h b/src/devices/cpu/tms32082/tms32082.h
index e571255192d..ae68967fba4 100644
--- a/src/devices/cpu/tms32082/tms32082.h
+++ b/src/devices/cpu/tms32082/tms32082.h
@@ -129,8 +129,8 @@ protected:
int m_icount;
- address_space *m_program;
- memory_access_cache<2, 0, ENDIANNESS_BIG> * m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_program;
write32_delegate m_cmd_callback;
@@ -189,8 +189,8 @@ protected:
int m_icount;
- address_space *m_program;
- memory_access_cache<2, 0, ENDIANNESS_BIG> * m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_program;
};
diff --git a/src/devices/cpu/tms34010/34010gfx.hxx b/src/devices/cpu/tms34010/34010gfx.hxx
index 80d9aa0669f..9e810704184 100644
--- a/src/devices/cpu/tms34010/34010gfx.hxx
+++ b/src/devices/cpu/tms34010/34010gfx.hxx
@@ -205,7 +205,7 @@ int tms340x0_device::compute_pixblt_b_cycles(int left_partials, int right_partia
/* Shift register handling */
-void tms340x0_device::memory_w(address_space &space, offs_t offset,uint16_t data)
+void tms340x0_device::memory_w(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset,uint16_t data)
{
//logerror("memory_w %08x %04x\n", offset << 3, data);
if((offset << 3) == 0x02005010 && data == 0x0000) {
@@ -215,12 +215,12 @@ void tms340x0_device::memory_w(address_space &space, offs_t offset,uint16_t data
space.write_word(offset, data);
}
-uint16_t tms340x0_device::memory_r(address_space &space, offs_t offset)
+uint16_t tms340x0_device::memory_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset)
{
return space.read_word(offset);
}
-void tms340x0_device::shiftreg_w(address_space &space, offs_t offset,uint16_t data)
+void tms340x0_device::shiftreg_w(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset,uint16_t data)
{
//logerror("shiftreg_w %08x %04x\n", offset << 3, data);
if (!m_from_shiftreg_cb.isnull())
@@ -229,7 +229,7 @@ void tms340x0_device::shiftreg_w(address_space &space, offs_t offset,uint16_t da
logerror("From ShiftReg function not set. PC = %08X\n", m_pc);
}
-uint16_t tms340x0_device::shiftreg_r(address_space &space, offs_t offset)
+uint16_t tms340x0_device::shiftreg_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset)
{
if (!m_to_shiftreg_cb.isnull())
m_to_shiftreg_cb(space, offset, &m_shiftreg[0]);
@@ -238,7 +238,7 @@ uint16_t tms340x0_device::shiftreg_r(address_space &space, offs_t offset)
return m_shiftreg[0];
}
-uint16_t tms340x0_device::dummy_shiftreg_r(address_space &space, offs_t offset)
+uint16_t tms340x0_device::dummy_shiftreg_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset)
{
return m_shiftreg[0];
}
@@ -1034,13 +1034,13 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
uint32_t srcword, dstword = 0;
/* fetch the initial source word */
- srcword = (this->*word_read)(*m_program, srcwordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, srcwordaddr++ << 4);
readwrites++;
/* fetch the initial dest word */
if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY || (daddr & 0x0f) != 0)
{
- dstword = (this->*word_read)(*m_program, dstwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dstwordaddr << 4);
readwrites++;
}
@@ -1053,7 +1053,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
/* fetch more words if necessary */
if (srcbit + BITS_PER_PIXEL > 16)
{
- srcword |= (this->*word_read)(*m_program, srcwordaddr++ << 4) << 16;
+ srcword |= (this->*word_read)(m_program, srcwordaddr++ << 4) << 16;
readwrites++;
}
@@ -1070,7 +1070,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY)
if (dstbit + BITS_PER_PIXEL > 16)
{
- dstword |= (this->*word_read)(*m_program, (dstwordaddr + 1) << 4) << 16;
+ dstword |= (this->*word_read)(m_program, (dstwordaddr + 1) << 4) << 16;
readwrites++;
}
@@ -1085,7 +1085,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
dstbit += BITS_PER_PIXEL;
if (dstbit > 16)
{
- (this->*word_write)(*m_program, dstwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dstwordaddr++ << 4, dstword);
readwrites++;
dstbit -= 16;
dstword >>= 16;
@@ -1098,13 +1098,13 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
/* if we're right-partial, read and mask the remaining bits */
if (dstbit != 16)
{
- uint16_t origdst = (this->*word_read)(*m_program, dstwordaddr << 4);
+ uint16_t origdst = (this->*word_read)(m_program, dstwordaddr << 4);
uint16_t mask = 0xffff << dstbit;
dstword = (dstword & ~mask) | (origdst & mask);
readwrites++;
}
- (this->*word_write)(*m_program, dstwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dstwordaddr++ << 4, dstword);
readwrites++;
}
@@ -1136,14 +1136,14 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
dwordaddr = daddr >> 4;
/* fetch the initial source word */
- srcword = (this->*word_read)(*m_program, swordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, swordaddr++ << 4);
srcmask = PIXEL_MASK << (saddr & 15);
/* handle the left partial word */
if (left_partials != 0)
{
/* fetch the destination word */
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
dstmask = PIXEL_MASK << (daddr & 15);
/* loop over partials */
@@ -1152,7 +1152,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
/* fetch another word if necessary */
if (srcmask == 0)
{
- srcword = (this->*word_read)(*m_program, swordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, swordaddr++ << 4);
srcmask = PIXEL_MASK;
}
@@ -1174,7 +1174,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
/* loop over full words */
@@ -1182,7 +1182,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
{
/* fetch the destination word (if necessary) */
if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY)
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
else
dstword = 0;
dstmask = PIXEL_MASK;
@@ -1193,7 +1193,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
/* fetch another word if necessary */
if (srcmask == 0)
{
- srcword = (this->*word_read)(*m_program, swordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, swordaddr++ << 4);
srcmask = PIXEL_MASK;
}
@@ -1215,14 +1215,14 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
/* handle the right partial word */
if (right_partials != 0)
{
/* fetch the destination word */
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
dstmask = PIXEL_MASK;
/* loop over partials */
@@ -1232,7 +1232,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
if (srcmask == 0)
{
LOGGFX((" right fetch @ %08x\n", swordaddr));
- srcword = (this->*word_read)(*m_program, swordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, swordaddr++ << 4);
srcmask = PIXEL_MASK;
}
@@ -1254,7 +1254,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt)(int src_is_linear, int dst_is_linear
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
#endif
@@ -1405,14 +1405,14 @@ if ((daddr & (BITS_PER_PIXEL - 1)) != 0) osd_printf_debug("PIXBLT_R%d with odd d
dwordaddr = (daddr + 15) >> 4;
/* fetch the initial source word */
- srcword = (this->*word_read)(*m_program, --swordaddr << 4);
+ srcword = (this->*word_read)(m_program, --swordaddr << 4);
srcmask = PIXEL_MASK << ((saddr - BITS_PER_PIXEL) & 15);
/* handle the right partial word */
if (right_partials != 0)
{
/* fetch the destination word */
- dstword = (this->*word_read)(*m_program, --dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, --dwordaddr << 4);
dstmask = PIXEL_MASK << ((daddr - BITS_PER_PIXEL) & 15);
/* loop over partials */
@@ -1421,7 +1421,7 @@ if ((daddr & (BITS_PER_PIXEL - 1)) != 0) osd_printf_debug("PIXBLT_R%d with odd d
/* fetch source pixel if necessary */
if (srcmask == 0)
{
- srcword = (this->*word_read)(*m_program, --swordaddr << 4);
+ srcword = (this->*word_read)(m_program, --swordaddr << 4);
srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL);
}
@@ -1448,7 +1448,7 @@ if ((daddr & (BITS_PER_PIXEL - 1)) != 0) osd_printf_debug("PIXBLT_R%d with odd d
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr << 4, dstword);
}
/* loop over full words */
@@ -1457,7 +1457,7 @@ if ((daddr & (BITS_PER_PIXEL - 1)) != 0) osd_printf_debug("PIXBLT_R%d with odd d
/* fetch the destination word (if necessary) */
dwordaddr--;
if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY)
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
else
dstword = 0;
dstmask = PIXEL_MASK << (16 - BITS_PER_PIXEL);
@@ -1468,7 +1468,7 @@ if ((daddr & (BITS_PER_PIXEL - 1)) != 0) osd_printf_debug("PIXBLT_R%d with odd d
/* fetch source pixel if necessary */
if (srcmask == 0)
{
- srcword = (this->*word_read)(*m_program, --swordaddr << 4);
+ srcword = (this->*word_read)(m_program, --swordaddr << 4);
srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL);
}
@@ -1495,14 +1495,14 @@ if ((daddr & (BITS_PER_PIXEL - 1)) != 0) osd_printf_debug("PIXBLT_R%d with odd d
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr << 4, dstword);
}
/* handle the left partial word */
if (left_partials != 0)
{
/* fetch the destination word */
- dstword = (this->*word_read)(*m_program, --dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, --dwordaddr << 4);
dstmask = PIXEL_MASK << (16 - BITS_PER_PIXEL);
/* loop over partials */
@@ -1511,7 +1511,7 @@ if ((daddr & (BITS_PER_PIXEL - 1)) != 0) osd_printf_debug("PIXBLT_R%d with odd d
/* fetch the source pixel if necessary */
if (srcmask == 0)
{
- srcword = (this->*word_read)(*m_program, --swordaddr << 4);
+ srcword = (this->*word_read)(m_program, --swordaddr << 4);
srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL);
}
@@ -1538,7 +1538,7 @@ if ((daddr & (BITS_PER_PIXEL - 1)) != 0) osd_printf_debug("PIXBLT_R%d with odd d
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr << 4, dstword);
}
/* update for next row */
@@ -1663,14 +1663,14 @@ void FUNCTION_NAME(tms340x0_device::pixblt_b)(int dst_is_linear)
dwordaddr = daddr >> 4;
/* fetch the initial source word */
- srcword = (this->*word_read)(*m_program, swordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, swordaddr++ << 4);
srcmask = 1 << (saddr & 15);
/* handle the left partial word */
if (left_partials != 0)
{
/* fetch the destination word */
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
dstmask = PIXEL_MASK << (daddr & 15);
/* loop over partials */
@@ -1687,7 +1687,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt_b)(int dst_is_linear)
srcmask <<= 1;
if (srcmask == 0)
{
- srcword = (this->*word_read)(*m_program, swordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, swordaddr++ << 4);
srcmask = 0x0001;
}
@@ -1696,7 +1696,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt_b)(int dst_is_linear)
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
/* loop over full words */
@@ -1704,7 +1704,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt_b)(int dst_is_linear)
{
/* fetch the destination word (if necessary) */
if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY)
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
else
dstword = 0;
dstmask = PIXEL_MASK;
@@ -1723,7 +1723,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt_b)(int dst_is_linear)
srcmask <<= 1;
if (srcmask == 0)
{
- srcword = (this->*word_read)(*m_program, swordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, swordaddr++ << 4);
srcmask = 0x0001;
}
@@ -1732,14 +1732,14 @@ void FUNCTION_NAME(tms340x0_device::pixblt_b)(int dst_is_linear)
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
/* handle the right partial word */
if (right_partials != 0)
{
/* fetch the destination word */
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
dstmask = PIXEL_MASK;
/* loop over partials */
@@ -1756,7 +1756,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt_b)(int dst_is_linear)
srcmask <<= 1;
if (srcmask == 0)
{
- srcword = (this->*word_read)(*m_program, swordaddr++ << 4);
+ srcword = (this->*word_read)(m_program, swordaddr++ << 4);
srcmask = 0x0001;
}
@@ -1765,7 +1765,7 @@ void FUNCTION_NAME(tms340x0_device::pixblt_b)(int dst_is_linear)
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
/* update for next row */
@@ -1879,7 +1879,7 @@ void FUNCTION_NAME(tms340x0_device::fill)(int dst_is_linear)
if (left_partials != 0)
{
/* fetch the destination word */
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
dstmask = PIXEL_MASK << (daddr & 15);
/* loop over partials */
@@ -1896,7 +1896,7 @@ void FUNCTION_NAME(tms340x0_device::fill)(int dst_is_linear)
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
/* loop over full words */
@@ -1904,7 +1904,7 @@ void FUNCTION_NAME(tms340x0_device::fill)(int dst_is_linear)
{
/* fetch the destination word (if necessary) */
if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY)
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
else
dstword = 0;
dstmask = PIXEL_MASK;
@@ -1923,14 +1923,14 @@ void FUNCTION_NAME(tms340x0_device::fill)(int dst_is_linear)
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
/* handle the right partial word */
if (right_partials != 0)
{
/* fetch the destination word */
- dstword = (this->*word_read)(*m_program, dwordaddr << 4);
+ dstword = (this->*word_read)(m_program, dwordaddr << 4);
dstmask = PIXEL_MASK;
/* loop over partials */
@@ -1947,7 +1947,7 @@ void FUNCTION_NAME(tms340x0_device::fill)(int dst_is_linear)
}
/* write the result */
- (this->*word_write)(*m_program, dwordaddr++ << 4, dstword);
+ (this->*word_write)(m_program, dwordaddr++ << 4, dstword);
}
/* update for next row */
diff --git a/src/devices/cpu/tms34010/34010ops.h b/src/devices/cpu/tms34010/34010ops.h
index ca936202eb8..ae4aa8f6e06 100644
--- a/src/devices/cpu/tms34010/34010ops.h
+++ b/src/devices/cpu/tms34010/34010ops.h
@@ -21,20 +21,20 @@
MEMORY I/O MACROS
***************************************************************************/
-#define TMS34010_RDMEM(A) ((unsigned)m_program->read_byte (A))
-#define TMS34010_RDMEM_WORD(A) ((unsigned)m_program->read_word (A))
+#define TMS34010_RDMEM(A) ((unsigned)m_program.read_byte (A))
+#define TMS34010_RDMEM_WORD(A) ((unsigned)m_program.read_word (A))
inline uint32_t tms340x0_device::TMS34010_RDMEM_DWORD(offs_t A)
{
- uint32_t result = m_program->read_word(A);
- return result | (m_program->read_word(A+16)<<16);
+ uint32_t result = m_program.read_word(A);
+ return result | (m_program.read_word(A+16)<<16);
}
-#define TMS34010_WRMEM(A,V) (m_program->write_byte(A,V))
-#define TMS34010_WRMEM_WORD(A,V) (m_program->write_word(A,V))
+#define TMS34010_WRMEM(A,V) (m_program.write_byte(A,V))
+#define TMS34010_WRMEM_WORD(A,V) (m_program.write_word(A,V))
inline void tms340x0_device::TMS34010_WRMEM_DWORD(offs_t A, uint32_t V)
{
- m_program->write_word(A,V);
- m_program->write_word(A+16,V>>16);
+ m_program.write_word(A,V);
+ m_program.write_word(A+16,V>>16);
}
diff --git a/src/devices/cpu/tms34010/34010ops.hxx b/src/devices/cpu/tms34010/34010ops.hxx
index 2c4639db628..96c6f3e17f4 100644
--- a/src/devices/cpu/tms34010/34010ops.hxx
+++ b/src/devices/cpu/tms34010/34010ops.hxx
@@ -80,13 +80,13 @@ void tms340x0_device::unimpl(uint16_t op)
{
/* kludge for Super High Impact -- this doesn't seem to cause */
/* an illegal opcode exception */
- if (m_cache->read_word(m_pc - 0x10) == 0x0007)
+ if (m_cache.read_word(m_pc - 0x10) == 0x0007)
return;
/* 9 Ball Shootout calls to FFDF7468, expecting it */
/* to execute the next instruction from FFDF7470 */
/* but the instruction at FFDF7460 is an 0x0001 */
- if (m_cache->read_word(m_pc - 0x10) == 0x0001)
+ if (m_cache.read_word(m_pc - 0x10) == 0x0001)
return;
PUSH(m_pc);
@@ -96,7 +96,7 @@ void tms340x0_device::unimpl(uint16_t op)
COUNT_UNKNOWN_CYCLES(16);
/* extra check to prevent bad things */
- if (m_pc == 0 || s_opcode_table[m_cache->read_word(m_pc) >> 4] == &tms34010_device::unimpl)
+ if (m_pc == 0 || s_opcode_table[m_cache.read_word(m_pc) >> 4] == &tms34010_device::unimpl)
{
set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
machine().debug_break();
diff --git a/src/devices/cpu/tms34010/tms34010.cpp b/src/devices/cpu/tms34010/tms34010.cpp
index bd039d7e706..cda86ced222 100644
--- a/src/devices/cpu/tms34010/tms34010.cpp
+++ b/src/devices/cpu/tms34010/tms34010.cpp
@@ -82,8 +82,6 @@ tms340x0_device::tms340x0_device(const machine_config &mconfig, device_type type
, m_hblank_stable(0)
, m_external_host_access(0)
, m_executing(0)
- , m_program(nullptr)
- , m_cache(nullptr)
, m_pixclock(0)
, m_pixperclock(0)
, m_scantimer(nullptr)
@@ -236,32 +234,32 @@ inline uint32_t tms340x0_device::ROPCODE()
{
uint32_t pc = m_pc;
m_pc += 2 << 3;
- return m_cache->read_word(pc);
+ return m_cache.read_word(pc);
}
inline int16_t tms340x0_device::PARAM_WORD()
{
uint32_t pc = m_pc;
m_pc += 2 << 3;
- return m_cache->read_word(pc);
+ return m_cache.read_word(pc);
}
inline int32_t tms340x0_device::PARAM_LONG()
{
uint32_t pc = m_pc;
m_pc += 4 << 3;
- return (uint16_t)m_cache->read_word(pc) | (m_cache->read_word(pc + 16) << 16);
+ return (uint16_t)m_cache.read_word(pc) | (m_cache.read_word(pc + 16) << 16);
}
inline int16_t tms340x0_device::PARAM_WORD_NO_INC()
{
- return m_cache->read_word(m_pc);
+ return m_cache.read_word(m_pc);
}
inline int32_t tms340x0_device::PARAM_LONG_NO_INC()
{
uint32_t pc = m_pc;
- return (uint16_t)m_cache->read_word(pc) | (m_cache->read_word(pc + 16) << 16);
+ return (uint16_t)m_cache.read_word(pc) | (m_cache.read_word(pc + 16) << 16);
}
/* read memory byte */
@@ -333,7 +331,7 @@ uint32_t tms340x0_device::read_pixel_32(offs_t offset)
uint32_t tms340x0_device::read_pixel_shiftreg(offs_t offset)
{
if (!m_to_shiftreg_cb.isnull())
- m_to_shiftreg_cb(*m_program, offset, &m_shiftreg[0]);
+ m_to_shiftreg_cb(m_program, offset, &m_shiftreg[0]);
else
fatalerror("To ShiftReg function not set. PC = %08X\n", m_pc);
return m_shiftreg[0];
@@ -475,7 +473,7 @@ void tms340x0_device::write_pixel_r_t_32(offs_t offset, uint32_t data)
void tms340x0_device::write_pixel_shiftreg(offs_t offset, uint32_t data)
{
if (!m_from_shiftreg_cb.isnull())
- m_from_shiftreg_cb(*m_program, offset, &m_shiftreg[0]);
+ m_from_shiftreg_cb(m_program, offset, &m_shiftreg[0]);
else
fatalerror("From ShiftReg function not set. PC = %08X\n", m_pc);
}
@@ -642,8 +640,8 @@ void tms340x0_device::device_start()
m_external_host_access = false;
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, 3, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
/* set up the state table */
{
diff --git a/src/devices/cpu/tms34010/tms34010.h b/src/devices/cpu/tms34010/tms34010.h
index e79337f36ea..961036b3439 100644
--- a/src/devices/cpu/tms34010/tms34010.h
+++ b/src/devices/cpu/tms34010/tms34010.h
@@ -105,8 +105,8 @@ enum
#define TMS340X0_SCANLINE_IND16_CB_MEMBER(_name) void _name(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms340x0_device::display_params *params)
#define TMS340X0_SCANLINE_RGB32_CB_MEMBER(_name) void _name(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms340x0_device::display_params *params)
-#define TMS340X0_TO_SHIFTREG_CB_MEMBER(_name) void _name(address_space &space, offs_t address, uint16_t *shiftreg)
-#define TMS340X0_FROM_SHIFTREG_CB_MEMBER(_name) void _name(address_space &space, offs_t address, uint16_t *shiftreg)
+#define TMS340X0_TO_SHIFTREG_CB_MEMBER(_name) void _name(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t address, uint16_t *shiftreg)
+#define TMS340X0_FROM_SHIFTREG_CB_MEMBER(_name) void _name(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t address, uint16_t *shiftreg)
class tms340x0_device : public cpu_device,
@@ -126,8 +126,8 @@ public:
typedef device_delegate<void (screen_device &screen, bitmap_ind16 &bitmap, int scanline, const display_params *params)> scanline_ind16_cb_delegate;
typedef device_delegate<void (screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const display_params *params)> scanline_rgb32_cb_delegate;
- typedef device_delegate<void (address_space &space, offs_t address, uint16_t *shiftreg)> shiftreg_in_cb_delegate;
- typedef device_delegate<void (address_space &space, offs_t address, uint16_t *shiftreg)> shiftreg_out_cb_delegate;
+ typedef device_delegate<void (memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t address, uint16_t *shiftreg)> shiftreg_in_cb_delegate;
+ typedef device_delegate<void (memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t address, uint16_t *shiftreg)> shiftreg_out_cb_delegate;
void set_halt_on_reset(bool halt_on_reset) { m_halt_on_reset = halt_on_reset; }
void set_pixel_clock(uint32_t pixclock) { m_pixclock = pixclock; }
@@ -281,8 +281,8 @@ protected:
typedef uint32_t (tms340x0_device::*pixel_op_func)(uint32_t, uint32_t, uint32_t);
typedef void (tms340x0_device::*pixblt_op_func)(int, int);
typedef void (tms340x0_device::*pixblt_b_op_func)(int);
- typedef void (tms340x0_device::*word_write_func)(address_space &space, offs_t offset,uint16_t data);
- typedef uint16_t (tms340x0_device::*word_read_func)(address_space &space, offs_t offset);
+ typedef void (tms340x0_device::*word_write_func)(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset,uint16_t data);
+ typedef uint16_t (tms340x0_device::*word_read_func)(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset);
static const wfield_func s_wfield_functions[32];
static const rfield_func s_rfield_functions[64];
@@ -318,8 +318,8 @@ protected:
uint8_t m_hblank_stable;
uint8_t m_external_host_access;
uint8_t m_executing;
- address_space *m_program;
- memory_access_cache<1, 3, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<32, 1, 3, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific m_program;
uint32_t m_pixclock; /* the pixel clock (0 means don't adjust screen size) */
int m_pixperclock; /* pixels per clock */
emu_timer *m_scantimer;
@@ -892,11 +892,11 @@ protected:
int compute_fill_cycles(int left_partials, int right_partials, int full_words, int op_timing);
int compute_pixblt_cycles(int left_partials, int right_partials, int full_words, int op_timing);
int compute_pixblt_b_cycles(int left_partials, int right_partials, int full_words, int rows, int op_timing, int bpp);
- void memory_w(address_space &space, offs_t offset,uint16_t data);
- uint16_t memory_r(address_space &space, offs_t offset);
- void shiftreg_w(address_space &space, offs_t offset, uint16_t data);
- uint16_t shiftreg_r(address_space &space, offs_t offset);
- uint16_t dummy_shiftreg_r(address_space &space, offs_t offset);
+ void memory_w(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset,uint16_t data);
+ uint16_t memory_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset);
+ void shiftreg_w(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset, uint16_t data);
+ uint16_t shiftreg_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset);
+ uint16_t dummy_shiftreg_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset);
uint32_t pixel_op00(uint32_t dstpix, uint32_t mask, uint32_t srcpix);
uint32_t pixel_op01(uint32_t dstpix, uint32_t mask, uint32_t srcpix);
uint32_t pixel_op02(uint32_t dstpix, uint32_t mask, uint32_t srcpix);
diff --git a/src/devices/cpu/tms7000/tms7000.cpp b/src/devices/cpu/tms7000/tms7000.cpp
index 23667e31820..cc3c0a1ff88 100644
--- a/src/devices/cpu/tms7000/tms7000.cpp
+++ b/src/devices/cpu/tms7000/tms7000.cpp
@@ -196,8 +196,8 @@ device_memory_interface::space_config_vector tms7000_device::memory_space_config
void tms7000_device::device_start()
{
// init/zerofill
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
set_icountptr(m_icount);
@@ -635,7 +635,7 @@ void tms7000_device::execute_run()
{
debugger_instruction_hook(m_pc);
- m_op = m_cache->read_byte(m_pc++);
+ m_op = m_cache.read_byte(m_pc++);
execute_one(m_op);
} while (m_icount > 0);
}
diff --git a/src/devices/cpu/tms7000/tms7000.h b/src/devices/cpu/tms7000/tms7000.h
index cf1ced0e9b0..a35656422ff 100644
--- a/src/devices/cpu/tms7000/tms7000.h
+++ b/src/devices/cpu/tms7000/tms7000.h
@@ -113,8 +113,8 @@ protected:
const uint32_t m_info_flags;
unsigned m_divider;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_program;
int m_icount;
bool m_irq_state[2];
@@ -148,26 +148,26 @@ protected:
void timer_tick_low(int tmr);
// internal read/write
- inline uint8_t read_r8(uint8_t address) { return m_program->read_byte(address); }
- inline void write_r8(uint8_t address, uint8_t data) { m_program->write_byte(address, data); }
- inline uint16_t read_r16(uint8_t address) { return m_program->read_byte((address - 1) & 0xff) << 8 | m_program->read_byte(address); }
- inline void write_r16(uint8_t address, uint16_t data) { m_program->write_byte((address - 1) & 0xff, data >> 8 & 0xff); m_program->write_byte(address, data & 0xff); }
-
- inline uint8_t read_p(uint8_t address) { return m_program->read_byte(0x100 + address); }
- inline void write_p(uint8_t address, uint8_t data) { m_program->write_byte(0x100 + address, data); }
-
- inline uint8_t read_mem8(uint16_t address) { return m_program->read_byte(address); }
- inline void write_mem8(uint16_t address, uint8_t data) { m_program->write_byte(address, data); }
- inline uint16_t read_mem16(uint16_t address) { return m_program->read_byte(address) << 8 | m_program->read_byte((address + 1) & 0xffff); }
- inline void write_mem16(uint16_t address, uint16_t data) { m_program->write_byte(address, data >> 8 & 0xff); m_program->write_byte((address + 1) & 0xffff, data & 0xff); }
-
- inline uint8_t imm8() { return m_cache->read_byte(m_pc++); }
- inline uint16_t imm16() { uint16_t ret = m_cache->read_byte(m_pc++) << 8; return ret | m_cache->read_byte(m_pc++); }
-
- inline uint8_t pull8() { return m_program->read_byte(m_sp--); }
- inline void push8(uint8_t data) { m_program->write_byte(++m_sp, data); }
- inline uint16_t pull16() { uint16_t ret = m_program->read_byte(m_sp--); return ret | m_program->read_byte(m_sp--) << 8; }
- inline void push16(uint16_t data) { m_program->write_byte(++m_sp, data >> 8 & 0xff); m_program->write_byte(++m_sp, data & 0xff); }
+ inline uint8_t read_r8(uint8_t address) { return m_program.read_byte(address); }
+ inline void write_r8(uint8_t address, uint8_t data) { m_program.write_byte(address, data); }
+ inline uint16_t read_r16(uint8_t address) { return m_program.read_byte((address - 1) & 0xff) << 8 | m_program.read_byte(address); }
+ inline void write_r16(uint8_t address, uint16_t data) { m_program.write_byte((address - 1) & 0xff, data >> 8 & 0xff); m_program.write_byte(address, data & 0xff); }
+
+ inline uint8_t read_p(uint8_t address) { return m_program.read_byte(0x100 + address); }
+ inline void write_p(uint8_t address, uint8_t data) { m_program.write_byte(0x100 + address, data); }
+
+ inline uint8_t read_mem8(uint16_t address) { return m_program.read_byte(address); }
+ inline void write_mem8(uint16_t address, uint8_t data) { m_program.write_byte(address, data); }
+ inline uint16_t read_mem16(uint16_t address) { return m_program.read_byte(address) << 8 | m_program.read_byte((address + 1) & 0xffff); }
+ inline void write_mem16(uint16_t address, uint16_t data) { m_program.write_byte(address, data >> 8 & 0xff); m_program.write_byte((address + 1) & 0xffff, data & 0xff); }
+
+ inline uint8_t imm8() { return m_cache.read_byte(m_pc++); }
+ inline uint16_t imm16() { uint16_t ret = m_cache.read_byte(m_pc++) << 8; return ret | m_cache.read_byte(m_pc++); }
+
+ inline uint8_t pull8() { return m_program.read_byte(m_sp--); }
+ inline void push8(uint8_t data) { m_program.write_byte(++m_sp, data); }
+ inline uint16_t pull16() { uint16_t ret = m_program.read_byte(m_sp--); return ret | m_program.read_byte(m_sp--) << 8; }
+ inline void push16(uint16_t data) { m_program.write_byte(++m_sp, data >> 8 & 0xff); m_program.write_byte(++m_sp, data & 0xff); }
// statusreg flags
enum
diff --git a/src/devices/cpu/unsp/unsp.cpp b/src/devices/cpu/unsp/unsp.cpp
index 40adc713f01..ea416cbe05c 100644
--- a/src/devices/cpu/unsp/unsp.cpp
+++ b/src/devices/cpu/unsp/unsp.cpp
@@ -41,12 +41,11 @@ unsp_device::unsp_device(const machine_config &mconfig, device_type type, const
: cpu_device(mconfig, type, tag, owner, clock)
, m_core(nullptr)
, m_program_config("program", ENDIANNESS_BIG, 16, 23, -1, internal)
- , m_program(nullptr)
, m_debugger_temp(0)
#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
, m_log_ops(0)
#endif
- , m_cache(CACHE_SIZE + sizeof(unsp_device))
+ , m_drccache(CACHE_SIZE + sizeof(unsp_device))
, m_drcuml(nullptr)
, m_drcfe(nullptr)
, m_drcoptions(0)
@@ -193,7 +192,7 @@ void unsp_device::unimplemented_opcode(uint16_t op, uint16_t ximm, uint16_t ximm
void unsp_device::device_start()
{
- m_core = (internal_unsp_state *)m_cache.alloc_near(sizeof(internal_unsp_state));
+ m_core = (internal_unsp_state *)m_drccache.alloc_near(sizeof(internal_unsp_state));
memset(m_core, 0, sizeof(internal_unsp_state));
#if ENABLE_UNSP_DRC
@@ -211,13 +210,11 @@ void unsp_device::device_start()
m_debugger_temp = 0;
- m_program = &space(AS_PROGRAM);
- auto cache = m_program->cache<1, -1, ENDIANNESS_BIG>();
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); };
- m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); };
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
uint32_t umlflags = 0;
- m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, umlflags, 1, 23, 0);
+ m_drcuml = std::make_unique<drcuml_state>(*this, m_drccache, umlflags, 1, 23, 0);
// add UML symbols-
m_drcuml->symbol_add(&m_core->m_r[REG_SP], sizeof(uint32_t), "SP");
diff --git a/src/devices/cpu/unsp/unsp.h b/src/devices/cpu/unsp/unsp.h
index b5f77d239db..c55daf885c7 100644
--- a/src/devices/cpu/unsp/unsp.h
+++ b/src/devices/cpu/unsp/unsp.h
@@ -209,14 +209,14 @@ protected:
internal_unsp_state* m_core;
protected:
- uint16_t read16(uint32_t address) { return m_program->read_word(address); }
+ uint16_t read16(uint32_t address) { return m_program.read_word(address); }
void write16(uint32_t address, uint16_t data)
{
#if UNSP_LOG_REGS
log_write(address, data);
#endif
- m_program->write_word(address, data);
+ m_program.write_word(address, data);
}
void add_lpc(const int32_t offset)
@@ -287,9 +287,8 @@ private:
address_space_config m_program_config;
- address_space *m_program;
- std::function<u16 (offs_t)> m_pr16;
- std::function<const void * (offs_t)> m_prptr;
+ memory_access<23, 2, -1, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<23, 2, -1, ENDIANNESS_BIG>::specific m_program;
uint32_t m_debugger_temp;
#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
@@ -300,7 +299,7 @@ private:
inline void trigger_irq(int line);
void check_irqs();
- drc_cache m_cache;
+ drc_cache m_drccache;
std::unique_ptr<drcuml_state> m_drcuml;
std::unique_ptr<unsp_frontend> m_drcfe;
uint32_t m_drcoptions;
diff --git a/src/devices/cpu/unsp/unspdrc.cpp b/src/devices/cpu/unsp/unspdrc.cpp
index 32011522c2e..8db11bc19e1 100644
--- a/src/devices/cpu/unsp/unspdrc.cpp
+++ b/src/devices/cpu/unsp/unspdrc.cpp
@@ -204,7 +204,7 @@ void unsp_device::code_compile_block(offs_t pc)
}
/* validate this code block if we're not pointing into ROM */
- if (m_program->get_write_ptr(seqhead->physpc) != nullptr)
+ if (m_program.space().get_write_ptr(seqhead->physpc) != nullptr)
generate_checksum_block(block, compiler, seqhead, seqlast);
/* label this instruction, if it may be jumped to locally */
@@ -526,7 +526,7 @@ void unsp_device::generate_checksum_block(drcuml_block &block, compiler_state &c
}
/* full verification; sum up everything */
- void *memptr = m_program->get_write_ptr(seqhead->physpc);
+ void *memptr = m_program.space().get_write_ptr(seqhead->physpc);
UML_LOAD(block, I0, memptr, 0, SIZE_WORD, SCALE_x2);
uint32_t sum = seqhead->opptr.w[0];
for (int i = 1; i < seqhead->length; i++)
@@ -539,7 +539,7 @@ void unsp_device::generate_checksum_block(drcuml_block &block, compiler_state &c
{
if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP))
{
- memptr = m_program->get_write_ptr(curdesc->physpc);
+ memptr = m_program.space().get_write_ptr(curdesc->physpc);
UML_LOAD(block, I1, memptr, 0, SIZE_WORD, SCALE_x2);
UML_ADD(block, I0, I0, I1);
sum += curdesc->opptr.w[0];
@@ -1158,7 +1158,7 @@ bool unsp_device::generate_opcode(drcuml_block &block, compiler_state &compiler,
case 0x01: // imm16
{
UML_MOV(block, I2, mem(&m_core->m_r[opb]));
- const uint16_t r1 = m_pr16(desc->pc + 1);
+ const uint16_t r1 = m_cache.read_word(desc->pc + 1);
generate_add_lpc(block, 1);
UML_MOV(block, I1, r1);
break;
@@ -1167,7 +1167,7 @@ bool unsp_device::generate_opcode(drcuml_block &block, compiler_state &compiler,
case 0x02: // [imm16]
{
UML_MOV(block, I2, mem(&m_core->m_r[opb]));
- const uint16_t r1 = m_pr16(desc->pc + 1);
+ const uint16_t r1 = m_cache.read_word(desc->pc + 1);
generate_add_lpc(block, 1);
UML_MOV(block, I0, r1);
if (op0 != 0x0d)
@@ -1179,7 +1179,7 @@ bool unsp_device::generate_opcode(drcuml_block &block, compiler_state &compiler,
{
UML_MOV(block, I1, I2);
UML_MOV(block, I2, mem(&m_core->m_r[opb]));
- const uint16_t r2 = m_pr16(desc->pc + 1);
+ const uint16_t r2 = m_cache.read_word(desc->pc + 1);
generate_add_lpc(block, 1);
UML_MOV(block, I0, r2);
break;
diff --git a/src/devices/cpu/unsp/unspfe.cpp b/src/devices/cpu/unsp/unspfe.cpp
index 5da9b6febdc..f93423379a1 100644
--- a/src/devices/cpu/unsp/unspfe.cpp
+++ b/src/devices/cpu/unsp/unspfe.cpp
@@ -24,7 +24,7 @@ unsp_frontend::unsp_frontend(unsp_device *unsp, uint32_t window_start, uint32_t
inline uint16_t unsp_frontend::read_op_word(opcode_desc &desc, int offset)
{
- return m_cpu->m_pr16(desc.physpc + offset);
+ return m_cpu->m_cache.read_word(desc.physpc + offset);
}
/*-------------------------------------------------
diff --git a/src/devices/cpu/upd7725/upd7725.cpp b/src/devices/cpu/upd7725/upd7725.cpp
index e1564ccffa1..d2d52a31959 100644
--- a/src/devices/cpu/upd7725/upd7725.cpp
+++ b/src/devices/cpu/upd7725/upd7725.cpp
@@ -31,9 +31,6 @@ necdsp_device::necdsp_device(const machine_config &mconfig, device_type type, co
m_data_config("data", ENDIANNESS_BIG, 16, dbits, -1), m_icount(0), // -1 for WORD-addressable
m_irq(0),
m_irq_firing(0),
- m_program(nullptr),
- m_data(nullptr),
- m_cache(nullptr),
m_in_int_cb(*this),
//m_in_si_cb(*this),
//m_in_sck_cb(*this),
@@ -66,9 +63,9 @@ upd96050_device::upd96050_device(const machine_config &mconfig, const char *tag,
void necdsp_device::device_start()
{
// get our address spaces
- m_program = &space(AS_PROGRAM);
- m_data = &space(AS_DATA);
- m_cache = m_program->cache<2, -2, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_DATA).specific(m_data);
// register our state for the debugger
state_add(STATE_GENPC, "GENPC", regs.pc).noshow();
@@ -340,7 +337,7 @@ void necdsp_device::execute_run()
if (m_irq_firing == 0) // normal opcode
{
- opcode = m_cache->read_dword(regs.pc) >> 8;
+ opcode = m_cache.read_dword(regs.pc) >> 8;
regs.pc++;
}
else if (m_irq_firing == 1) // if we're in an interrupt cycle, execute a op 'nop' first...
@@ -392,7 +389,7 @@ void necdsp_device::exec_op(uint32_t opcode) {
case 3: regs.idb = regs.tr; break;
case 4: regs.idb = regs.dp; break;
case 5: regs.idb = regs.rp; break;
- case 6: regs.idb = m_data->read_word(regs.rp); break;
+ case 6: regs.idb = m_data.read_word(regs.rp); break;
case 7: regs.idb = 0x8000 - regs.flaga.s1; break; //SGN
case 8: regs.idb = regs.dr; regs.sr.rqm = 1; break;
case 9: regs.idb = regs.dr; break;
@@ -589,7 +586,7 @@ void necdsp_device::exec_ld(uint32_t opcode) {
case 8: regs.so = bitswap<16>(id, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); break; //LSB first output, output tapped at bit 15 shifting left
case 9: regs.so = id; break; //MSB first output, output tapped at bit 15 shifting left
case 10: regs.k = id; break;
- case 11: regs.k = id; regs.l = m_data->read_word(regs.rp); break;
+ case 11: regs.k = id; regs.l = m_data.read_word(regs.rp); break;
case 12: regs.l = id; regs.k = dataRAM[regs.dp | 0x40]; break;
case 13: regs.l = id; break;
case 14: regs.trb = id; break;
diff --git a/src/devices/cpu/upd7725/upd7725.h b/src/devices/cpu/upd7725/upd7725.h
index a4fc0ea1ce8..ed17af002eb 100644
--- a/src/devices/cpu/upd7725/upd7725.h
+++ b/src/devices/cpu/upd7725/upd7725.h
@@ -144,8 +144,9 @@ private:
// 1 = next opcode is the first half of int firing 'NOP'
// 2 = next opcode is the second half of int firing 'CALL 0100'
int m_irq_firing;
- address_space *m_program, *m_data;
- memory_access_cache<2, -2, ENDIANNESS_BIG> *m_cache;
+ memory_access<14, 2, -2, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<14, 2, -2, ENDIANNESS_BIG>::specific m_program;
+ memory_access<12, 1, -1, ENDIANNESS_BIG>::specific m_data;
protected:
devcb_read_line m_in_int_cb;
diff --git a/src/devices/cpu/upd7810/upd7810.cpp b/src/devices/cpu/upd7810/upd7810.cpp
index f836d1074a1..bd459b2f141 100644
--- a/src/devices/cpu/upd7810/upd7810.cpp
+++ b/src/devices/cpu/upd7810/upd7810.cpp
@@ -1602,8 +1602,8 @@ void upd78c05_device::handle_timers(int cycles)
void upd7810_device::base_device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_PROGRAM).cache(m_opcodes);
m_to_func.resolve_safe();
m_co0_func.resolve_safe();
diff --git a/src/devices/cpu/upd7810/upd7810.h b/src/devices/cpu/upd7810/upd7810.h
index 1eb39a2b975..84b86bb3e99 100644
--- a/src/devices/cpu/upd7810/upd7810.h
+++ b/src/devices/cpu/upd7810/upd7810.h
@@ -343,8 +343,8 @@ protected:
const struct opcode_s *m_op64;
const struct opcode_s *m_op70;
const struct opcode_s *m_op74;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_opcodes;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
int m_icount;
uint8_t RP(offs_t port);
diff --git a/src/devices/cpu/upd7810/upd7810_macros.h b/src/devices/cpu/upd7810/upd7810_macros.h
index 82c0f3f2138..0ae44c63243 100644
--- a/src/devices/cpu/upd7810/upd7810_macros.h
+++ b/src/devices/cpu/upd7810/upd7810_macros.h
@@ -105,10 +105,10 @@
// MEMORY/OPCODE READ/WRITE
//**************************************************************************
-#define RDOP(O) O = m_cache->read_byte(PCD); PC++
-#define RDOPARG(A) A = m_cache->read_byte(PCD); PC++
-#define RM(A) m_program->read_byte(A)
-#define WM(A,V) m_program->write_byte(A,V)
+#define RDOP(O) O = m_opcodes.read_byte(PCD); PC++
+#define RDOPARG(A) A = m_opcodes.read_byte(PCD); PC++
+#define RM(A) m_program.read_byte(A)
+#define WM(A,V) m_program.write_byte(A,V)
//**************************************************************************
diff --git a/src/devices/cpu/upd78k/upd78k0.cpp b/src/devices/cpu/upd78k/upd78k0.cpp
index ff87be3553c..6af06e02685 100644
--- a/src/devices/cpu/upd78k/upd78k0.cpp
+++ b/src/devices/cpu/upd78k/upd78k0.cpp
@@ -30,10 +30,6 @@ upd78k0_device::upd78k0_device(const machine_config &mconfig, device_type type,
address_map_constructor(FUNC(upd78k0_device::iram_map), this))
, m_sfr_config("SFR", ENDIANNESS_LITTLE, 16, 8, 0, sfr_map)
, m_iram_size(iram_size)
- , m_program_space(nullptr)
- , m_program_cache(nullptr)
- , m_iram_cache(nullptr)
- , m_sfr_space(nullptr)
, m_subclock(0)
, m_pc(0)
, m_ppc(0)
@@ -103,10 +99,10 @@ inline u16 upd78k0_device::debug_register_base() const noexcept
void upd78k0_device::device_start()
{
// get address spaces and access caches
- m_program_space = &space(AS_PROGRAM);
- m_program_cache = m_program_space->cache<0, 0, ENDIANNESS_LITTLE>();
- m_iram_cache = space(AS_DATA).cache<1, 0, ENDIANNESS_LITTLE>();
- m_sfr_space = &space(AS_IO);
+ space(AS_PROGRAM).specific(m_program_space);
+ space(AS_PROGRAM).cache(m_program_cache);
+ space(AS_DATA).cache(m_iram_cache);
+ space(AS_IO).specific(m_sfr_space);
set_icountptr(m_icount);
@@ -158,7 +154,7 @@ void upd78k0_device::device_reset()
void upd78k0_device::execute_run()
{
- m_pc = m_program_cache->read_word(0);
+ m_pc = m_program_cache.read_word(0);
m_ppc = m_pc;
debugger_instruction_hook(m_pc);
diff --git a/src/devices/cpu/upd78k/upd78k0.h b/src/devices/cpu/upd78k/upd78k0.h
index 84c7fca788a..566dfab340f 100644
--- a/src/devices/cpu/upd78k/upd78k0.h
+++ b/src/devices/cpu/upd78k/upd78k0.h
@@ -61,10 +61,10 @@ private:
address_space_config m_iram_config;
address_space_config m_sfr_config;
const u16 m_iram_size;
- address_space *m_program_space;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_program_cache;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_iram_cache;
- address_space *m_sfr_space;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_program_cache;
+ memory_access<10, 1, 0, ENDIANNESS_LITTLE>::cache m_iram_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program_space;
+ memory_access< 8, 1, 0, ENDIANNESS_LITTLE>::specific m_sfr_space;
// miscellaneous configuration
u32 m_subclock;
diff --git a/src/devices/cpu/upd78k/upd78k2.cpp b/src/devices/cpu/upd78k/upd78k2.cpp
index 823bc438883..91f25b29618 100644
--- a/src/devices/cpu/upd78k/upd78k2.cpp
+++ b/src/devices/cpu/upd78k/upd78k2.cpp
@@ -30,10 +30,6 @@ upd78k2_device::upd78k2_device(const machine_config &mconfig, device_type type,
, m_iram_config("IRAM", ENDIANNESS_LITTLE, 16, iram_bits, 0, address_map_constructor(FUNC(upd78k2_device::iram_map), this))
, m_sfr_config("SFR", ENDIANNESS_LITTLE, 16, 8, 0, sfr_map)
, m_iram_addrmask((offs_t(1) << iram_bits) - 1)
- , m_program_space(nullptr)
- , m_program_cache(nullptr)
- , m_iram_cache(nullptr)
- , m_sfr_space(nullptr)
, m_pc(0)
, m_ppc(0)
, m_psw(0)
@@ -86,10 +82,10 @@ inline u8 upd78k2_device::register_base() const noexcept
void upd78k2_device::device_start()
{
// get address spaces and access caches
- m_program_space = &space(AS_PROGRAM);
- m_program_cache = m_program_space->cache<0, 0, ENDIANNESS_LITTLE>();
- m_iram_cache = space(AS_DATA).cache<1, 0, ENDIANNESS_LITTLE>();
- m_sfr_space = &space(AS_IO);
+ space(AS_PROGRAM).specific(m_program_space);
+ space(AS_PROGRAM).cache(m_program_cache);
+ space(AS_DATA).cache(m_iram_cache);
+ space(AS_IO).specific(m_sfr_space);
set_icountptr(m_icount);
@@ -141,7 +137,7 @@ void upd78k2_device::device_reset()
void upd78k2_device::execute_run()
{
- m_pc = m_program_cache->read_word(0);
+ m_pc = m_program_cache.read_word(0);
m_ppc = m_pc;
debugger_instruction_hook(m_pc);
diff --git a/src/devices/cpu/upd78k/upd78k2.h b/src/devices/cpu/upd78k/upd78k2.h
index a18ceefb396..c0a8e07b825 100644
--- a/src/devices/cpu/upd78k/upd78k2.h
+++ b/src/devices/cpu/upd78k/upd78k2.h
@@ -61,10 +61,10 @@ private:
address_space_config m_iram_config;
address_space_config m_sfr_config;
const offs_t m_iram_addrmask;
- address_space *m_program_space;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_program_cache;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_iram_cache;
- address_space *m_sfr_space;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_program_cache;
+ memory_access< 8, 1, 0, ENDIANNESS_LITTLE>::cache m_iram_cache;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::specific m_program_space;
+ memory_access< 8, 1, 0, ENDIANNESS_LITTLE>::specific m_sfr_space;
// core registers and execution state
u16 m_pc;
diff --git a/src/devices/cpu/upd78k/upd78k3.cpp b/src/devices/cpu/upd78k/upd78k3.cpp
index f2831c543b2..ef7ee4008e9 100644
--- a/src/devices/cpu/upd78k/upd78k3.cpp
+++ b/src/devices/cpu/upd78k/upd78k3.cpp
@@ -29,11 +29,7 @@ upd78k3_device::upd78k3_device(const machine_config &mconfig, device_type type,
, m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0, mem_map)
, m_iram_config("IRAM", ENDIANNESS_LITTLE, 16, 8, 0, address_map_constructor(FUNC(upd78k3_device::iram_map), this))
, m_sfr_config("SFR", ENDIANNESS_LITTLE, 16, 8, 0, sfr_map)
- , m_program_space(nullptr)
- , m_program_cache(nullptr)
, m_iram(*this, "iram")
- , m_iram_cache(nullptr)
- , m_sfr_space(nullptr)
, m_pc(0)
, m_ppc(0)
, m_psw(0)
@@ -132,10 +128,10 @@ void upd78k3_device::state_add_psw()
void upd78k3_device::device_start()
{
// get address spaces and access caches
- m_program_space = &space(AS_PROGRAM);
- m_program_cache = m_program_space->cache<0, 0, ENDIANNESS_LITTLE>();
- m_iram_cache = space(AS_DATA).cache<1, 0, ENDIANNESS_LITTLE>();
- m_sfr_space = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_program_cache);
+ space(AS_PROGRAM).specific(m_program_space);
+ space(AS_DATA).cache(m_iram_cache);
+ space(AS_IO).specific(m_sfr_space);
set_icountptr(m_icount);
@@ -211,7 +207,7 @@ void upd78k3_device::device_reset()
void upd78k3_device::execute_run()
{
- m_pc = m_program_cache->read_word(0);
+ m_pc = m_program_cache.read_word(0);
m_ppc = m_pc;
debugger_instruction_hook(m_pc);
diff --git a/src/devices/cpu/upd78k/upd78k3.h b/src/devices/cpu/upd78k/upd78k3.h
index 07fcb49534a..22867376847 100644
--- a/src/devices/cpu/upd78k/upd78k3.h
+++ b/src/devices/cpu/upd78k/upd78k3.h
@@ -73,11 +73,12 @@ private:
address_space_config m_program_config;
address_space_config m_iram_config;
address_space_config m_sfr_config;
- address_space *m_program_space;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_program_cache;
required_shared_ptr<u16> m_iram;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_iram_cache;
- address_space *m_sfr_space;
+
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_program_cache;
+ memory_access< 8, 1, 0, ENDIANNESS_LITTLE>::cache m_iram_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program_space;
+ memory_access< 8, 1, 0, ENDIANNESS_LITTLE>::specific m_sfr_space;
// core registers and execution state
u16 m_pc;
diff --git a/src/devices/cpu/v30mz/v30mz.cpp b/src/devices/cpu/v30mz/v30mz.cpp
index c556f3f01f3..db96c6b92e5 100644
--- a/src/devices/cpu/v30mz/v30mz.cpp
+++ b/src/devices/cpu/v30mz/v30mz.cpp
@@ -146,9 +146,9 @@ device_memory_interface::space_config_vector v30mz_cpu_device::memory_space_conf
void v30mz_cpu_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_IO).specific(m_io);
save_item(NAME(m_regs.w));
save_item(NAME(m_sregs));
@@ -282,44 +282,44 @@ inline uint32_t v30mz_cpu_device::pc()
inline uint8_t v30mz_cpu_device::read_byte(uint32_t addr)
{
- return m_program->read_byte(addr);
+ return m_program.read_byte(addr);
}
inline uint16_t v30mz_cpu_device::read_word(uint32_t addr)
{
- return m_program->read_byte(addr) | ( m_program->read_byte(addr+1) << 8 );
+ return m_program.read_byte(addr) | ( m_program.read_byte(addr+1) << 8 );
}
inline void v30mz_cpu_device::write_byte(uint32_t addr, uint8_t data)
{
- m_program->write_byte(addr, data);
+ m_program.write_byte(addr, data);
}
inline void v30mz_cpu_device::write_word(uint32_t addr, uint16_t data)
{
- m_program->write_byte( addr, data & 0xff );
- m_program->write_byte( addr + 1, data >> 8 );
+ m_program.write_byte( addr, data & 0xff );
+ m_program.write_byte( addr + 1, data >> 8 );
}
inline uint8_t v30mz_cpu_device::read_port(uint16_t port)
{
- return m_io->read_byte(port);
+ return m_io.read_byte(port);
}
inline void v30mz_cpu_device::write_port(uint16_t port, uint8_t data)
{
- m_io->write_byte(port, data);
+ m_io.write_byte(port, data);
}
inline uint8_t v30mz_cpu_device::fetch_op()
{
- uint8_t data = m_cache->read_byte( pc() );
+ uint8_t data = m_cache.read_byte( pc() );
m_ip++;
return data;
}
@@ -327,7 +327,7 @@ inline uint8_t v30mz_cpu_device::fetch_op()
inline uint8_t v30mz_cpu_device::fetch()
{
- uint8_t data = m_cache->read_byte( pc() );
+ uint8_t data = m_cache.read_byte( pc() );
m_ip++;
return data;
}
diff --git a/src/devices/cpu/v30mz/v30mz.h b/src/devices/cpu/v30mz/v30mz.h
index 5e575ba8dc2..7d8d06c7b68 100644
--- a/src/devices/cpu/v30mz/v30mz.h
+++ b/src/devices/cpu/v30mz/v30mz.h
@@ -189,9 +189,9 @@ protected:
uint8_t m_no_interrupt;
uint8_t m_fire_trap;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_io;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
int m_icount;
uint32_t m_prefix_base; /* base address of the latest prefix segment */
diff --git a/src/devices/cpu/v60/v60.cpp b/src/devices/cpu/v60/v60.cpp
index 989e509ef2e..0a9030ad313 100644
--- a/src/devices/cpu/v60/v60.cpp
+++ b/src/devices/cpu/v60/v60.cpp
@@ -412,17 +412,17 @@ void v60_device::device_start()
m_program = &space(AS_PROGRAM);
if (m_program->data_width() == 16)
{
- auto cache = m_program->cache<1, 0, ENDIANNESS_LITTLE>();
- m_pr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word_unaligned(address); };
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword_unaligned(address); };
+ m_program->cache(m_cache16);
+ m_pr8 = [this](offs_t address) -> u8 { return m_cache16.read_byte(address); };
+ m_pr16 = [this](offs_t address) -> u16 { return m_cache16.read_word_unaligned(address); };
+ m_pr32 = [this](offs_t address) -> u32 { return m_cache16.read_dword_unaligned(address); };
}
else
{
- auto cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
- m_pr8 = [cache](offs_t address) -> u8 { return cache->read_byte(address); };
- m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word_unaligned(address); };
- m_pr32 = [cache](offs_t address) -> u32 { return cache->read_dword_unaligned(address); };
+ m_program->cache(m_cache32);
+ m_pr8 = [this](offs_t address) -> u8 { return m_cache32.read_byte(address); };
+ m_pr16 = [this](offs_t address) -> u16 { return m_cache32.read_word_unaligned(address); };
+ m_pr32 = [this](offs_t address) -> u32 { return m_cache32.read_dword_unaligned(address); };
}
m_io = &space(AS_IO);
diff --git a/src/devices/cpu/v60/v60.h b/src/devices/cpu/v60/v60.h
index 35c5843c487..0cb41bd18a8 100644
--- a/src/devices/cpu/v60/v60.h
+++ b/src/devices/cpu/v60/v60.h
@@ -163,6 +163,9 @@ private:
uint8_t m_irq_line;
uint8_t m_nmi_line;
address_space *m_program;
+ memory_access<32, 1, 0, ENDIANNESS_LITTLE>::cache m_cache16;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache32;
+
std::function<u8 (offs_t)> m_pr8;
std::function<u16 (offs_t)> m_pr16;
std::function<u32 (offs_t)> m_pr32;
diff --git a/src/devices/cpu/v810/v810.cpp b/src/devices/cpu/v810/v810.cpp
index 11656b22c9f..a5a7e8dfc52 100644
--- a/src/devices/cpu/v810/v810.cpp
+++ b/src/devices/cpu/v810/v810.cpp
@@ -126,26 +126,26 @@ std::unique_ptr<util::disasm_interface> v810_device::create_disassembler()
#define SET_EP(val) (PSW = (PSW & ~0x00004000) | ((val) << 14))
#define SET_NP(val) (PSW = (PSW & ~0x00008000) | ((val) << 15))
-#define R_B(addr) (m_program->read_byte(addr))
-#define R_H(addr) (m_program->read_word(addr))
-#define R_W(addr) (m_program->read_dword(addr))
+#define R_B(addr) (m_program.read_byte(addr))
+#define R_H(addr) (m_program.read_word(addr))
+#define R_W(addr) (m_program.read_dword(addr))
-#define W_B(addr, val) (m_program->write_byte(addr,val))
-#define W_H(addr, val) (m_program->write_word(addr,val))
-#define W_W(addr, val) (m_program->write_dword(addr,val))
+#define W_B(addr, val) (m_program.write_byte(addr,val))
+#define W_H(addr, val) (m_program.write_word(addr,val))
+#define W_W(addr, val) (m_program.write_dword(addr,val))
-#define RIO_B(addr) (m_io->read_byte(addr))
-#define RIO_H(addr) (m_io->read_word(addr))
-#define RIO_W(addr) (m_io->read_dword(addr))
+#define RIO_B(addr) (m_io.read_byte(addr))
+#define RIO_H(addr) (m_io.read_word(addr))
+#define RIO_W(addr) (m_io.read_dword(addr))
-#define WIO_B(addr, val) (m_io->write_byte(addr,val))
-#define WIO_H(addr, val) (m_io->write_word(addr,val))
-#define WIO_W(addr, val) (m_io->write_dword(addr,val))
+#define WIO_B(addr, val) (m_io.write_byte(addr,val))
+#define WIO_H(addr, val) (m_io.write_word(addr,val))
+#define WIO_W(addr, val) (m_io.write_dword(addr,val))
-#define R_OP(addr) (m_cache->read_word(addr))
+#define R_OP(addr) (m_cache.read_word(addr))
#define GET1 (op&0x1f)
#define GET2 ((op>>5)&0x1f)
@@ -1255,9 +1255,9 @@ const v810_device::opcode_func v810_device::s_OpCodeTable[64] =
void v810_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
- m_io = has_space(AS_IO) ? &space(AS_IO) : m_program;
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(has_space(AS_IO) ? AS_IO : AS_PROGRAM).specific(m_io);
m_irq_line = 0;
m_irq_state = CLEAR_LINE;
diff --git a/src/devices/cpu/v810/v810.h b/src/devices/cpu/v810/v810.h
index 4adb04e071e..a24abe48751 100644
--- a/src/devices/cpu/v810/v810.h
+++ b/src/devices/cpu/v810/v810.h
@@ -117,9 +117,9 @@ private:
uint8_t m_irq_line;
uint8_t m_irq_state;
uint8_t m_nmi_line;
- address_space *m_program;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_io;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_io;
uint32_t m_PPC;
int m_icount;
diff --git a/src/devices/cpu/vt50/vt50.cpp b/src/devices/cpu/vt50/vt50.cpp
index b12b75e79da..961dca5aa2c 100644
--- a/src/devices/cpu/vt50/vt50.cpp
+++ b/src/devices/cpu/vt50/vt50.cpp
@@ -75,8 +75,6 @@ vt5x_cpu_device::vt5x_cpu_device(const machine_config &mconfig, device_type type
, device_video_interface(mconfig, *this)
, m_rom_config("program", ENDIANNESS_LITTLE, 8, 10, 0)
, m_ram_config("data", ENDIANNESS_LITTLE, 8, 6 + ybits, 0) // actually 7 bits wide
- , m_rom_cache(nullptr)
- , m_ram_cache(nullptr)
, m_baud_9600_callback(*this)
, m_vert_count_callback(*this)
, m_uart_rd_callback(*this)
@@ -195,8 +193,8 @@ void vt52_cpu_device::device_resolve_objects()
void vt5x_cpu_device::device_start()
{
// acquire address spaces
- m_rom_cache = space(AS_PROGRAM).cache<0, 0, ENDIANNESS_LITTLE>();
- m_ram_cache = space(AS_DATA).cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_rom_cache);
+ space(AS_DATA).cache(m_ram_cache);
screen().register_screen_bitmap(m_bitmap);
set_icountptr(m_icount);
@@ -531,7 +529,7 @@ void vt50_cpu_device::execute_tg(u8 inst)
break;
}
- m_ram_cache->write_byte(translate_xy(), m_ram_do);
+ m_ram_cache.write_byte(translate_xy(), m_ram_do);
m_write_ff = false;
}
@@ -560,7 +558,7 @@ void vt52_cpu_device::execute_tg(u8 inst)
break;
}
- m_ram_cache->write_byte(translate_xy(), m_ram_do);
+ m_ram_cache.write_byte(translate_xy(), m_ram_do);
m_write_ff = false;
}
@@ -757,15 +755,15 @@ void vt5x_cpu_device::execute_run()
case 1:
if (!en_cycle)
- execute_te(m_rom_cache->read_byte(m_pc));
+ execute_te(m_rom_cache.read_byte(m_pc));
m_t = 2;
break;
case 2:
if (!en_cycle)
- execute_tf(m_rom_cache->read_byte(m_pc));
+ execute_tf(m_rom_cache.read_byte(m_pc));
if (!m_write_ff)
- m_ram_do = m_ram_cache->read_byte(translate_xy()) & 0177;
+ m_ram_do = m_ram_cache.read_byte(translate_xy()) & 0177;
m_cursor_active = m_ac == (m_x ^ (m_x8 ? 8 : 0));
if (u8(m_horiz_count - 2) >= 2 * 16)
{
@@ -784,13 +782,13 @@ void vt5x_cpu_device::execute_run()
case 3:
if (en_cycle && m_write_ff)
- execute_tg(m_rom_cache->read_byte(m_pc));
+ execute_tg(m_rom_cache.read_byte(m_pc));
m_t = 4;
break;
case 4:
if (en_cycle)
- execute_th(m_rom_cache->read_byte(m_pc));
+ execute_th(m_rom_cache.read_byte(m_pc));
m_t = 5;
break;
@@ -800,13 +798,13 @@ void vt5x_cpu_device::execute_run()
case 6:
if (en_cycle && m_flag_test_ff)
- execute_tj(m_rom_cache->read_byte(m_pc));
+ execute_tj(m_rom_cache.read_byte(m_pc));
m_t = 7;
break;
case 7:
if (!en_cycle)
- execute_tw(m_rom_cache->read_byte(m_pc));
+ execute_tw(m_rom_cache.read_byte(m_pc));
m_t = 8;
break;
diff --git a/src/devices/cpu/vt50/vt50.h b/src/devices/cpu/vt50/vt50.h
index fd73d1fd83e..e9d0b39b1bc 100644
--- a/src/devices/cpu/vt50/vt50.h
+++ b/src/devices/cpu/vt50/vt50.h
@@ -73,8 +73,8 @@ protected:
// address spaces
address_space_config m_rom_config;
address_space_config m_ram_config;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_rom_cache;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_ram_cache;
+ memory_access<10, 0, 0, ENDIANNESS_LITTLE>::cache m_rom_cache;
+ memory_access<11, 0, 0, ENDIANNESS_LITTLE>::cache m_ram_cache;
// device callbacks
devcb_write_line m_baud_9600_callback;
diff --git a/src/devices/cpu/vt61/vt61.cpp b/src/devices/cpu/vt61/vt61.cpp
index 96fba64faf5..377d9e58244 100644
--- a/src/devices/cpu/vt61/vt61.cpp
+++ b/src/devices/cpu/vt61/vt61.cpp
@@ -20,9 +20,6 @@ vt61_cpu_device::vt61_cpu_device(const machine_config &mconfig, const char *tag,
, m_program_config("microprogram", ENDIANNESS_LITTLE, 16, 10, -1)
, m_memory_config("memory", ENDIANNESS_LITTLE, 8, 16, 0)
, m_idr_config("IDR", ENDIANNESS_LITTLE, 8, 6, 0)
- , m_program_cache(nullptr)
- , m_memory_cache(nullptr)
- , m_idr_cache(nullptr)
, m_pc(0)
, m_ac(0)
, m_mar(0)
@@ -55,9 +52,9 @@ device_memory_interface::space_config_vector vt61_cpu_device::memory_space_confi
void vt61_cpu_device::device_start()
{
- m_program_cache = space(AS_PROGRAM).cache<1, -1, ENDIANNESS_LITTLE>();
- m_memory_cache = space(AS_DATA).cache<0, 0, ENDIANNESS_LITTLE>();
- m_idr_cache = space(AS_IDR).cache<0, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_program_cache);
+ space(AS_DATA).cache(m_memory_cache);
+ space(AS_IDR).cache(m_idr_cache);
set_icountptr(m_icount);
diff --git a/src/devices/cpu/vt61/vt61.h b/src/devices/cpu/vt61/vt61.h
index c5c3013641f..c2aa2d39f6b 100644
--- a/src/devices/cpu/vt61/vt61.h
+++ b/src/devices/cpu/vt61/vt61.h
@@ -51,9 +51,9 @@ private:
address_space_config m_program_config;
address_space_config m_memory_config;
address_space_config m_idr_config;
- memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_program_cache;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_memory_cache;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_idr_cache;
+ memory_access<10, 1, -1, ENDIANNESS_LITTLE>::cache m_program_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_memory_cache;
+ memory_access< 6, 0, 0, ENDIANNESS_LITTLE>::cache m_idr_cache;
// processor state
u16 m_pc;
diff --git a/src/devices/cpu/we32000/we32100.cpp b/src/devices/cpu/we32000/we32100.cpp
index 1d4b5fbcd04..b7f166e5287 100644
--- a/src/devices/cpu/we32000/we32100.cpp
+++ b/src/devices/cpu/we32000/we32100.cpp
@@ -18,8 +18,6 @@ DEFINE_DEVICE_TYPE(WE32100, we32100_device, "we32100", "AT&T WE32100")
we32100_device::we32100_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: cpu_device(mconfig, WE32100, tag, owner, clock)
, m_space_config("program", ENDIANNESS_BIG, 32, 32, 0)
- , m_space(nullptr)
- , m_cache(nullptr)
, m_r{0}
, m_icount(0)
{
@@ -39,8 +37,8 @@ device_memory_interface::space_config_vector we32100_device::memory_space_config
void we32100_device::device_start()
{
- m_space = &space(AS_PROGRAM);
- m_cache = m_space->cache<2, 0, ENDIANNESS_BIG>();
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_space);
set_icountptr(m_icount);
@@ -70,10 +68,10 @@ void we32100_device::device_reset()
void we32100_device::execute_run()
{
// On-reset sequence: load PCBP, then load PSW, PC and SP from there
- m_r[13] = m_space->read_dword(0x00000080);
- m_r[11] = m_space->read_dword(m_r[13]);
- m_r[15] = m_space->read_dword(m_r[13] + 4);
- m_r[12] = m_space->read_dword(m_r[13] + 8);
+ m_r[13] = m_space.read_dword(0x00000080);
+ m_r[11] = m_space.read_dword(m_r[13]);
+ m_r[15] = m_space.read_dword(m_r[13] + 4);
+ m_r[12] = m_space.read_dword(m_r[13] + 8);
debugger_instruction_hook(m_r[15]);
diff --git a/src/devices/cpu/we32000/we32100.h b/src/devices/cpu/we32000/we32100.h
index 54e1edc4a3e..c34afc4279e 100644
--- a/src/devices/cpu/we32000/we32100.h
+++ b/src/devices/cpu/we32000/we32100.h
@@ -45,8 +45,8 @@ protected:
private:
// address space
address_space_config m_space_config;
- address_space *m_space;
- memory_access_cache<2, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_space;
// internal state
u32 m_r[16];
diff --git a/src/devices/cpu/xavix2/xavix2.cpp b/src/devices/cpu/xavix2/xavix2.cpp
index 4c1d150564a..84a6da150ce 100644
--- a/src/devices/cpu/xavix2/xavix2.cpp
+++ b/src/devices/cpu/xavix2/xavix2.cpp
@@ -18,8 +18,8 @@ xavix2_device::xavix2_device(const machine_config &mconfig, const char *tag, dev
void xavix2_device::device_start()
{
- m_program = &space(AS_PROGRAM);
- m_program_cache = m_program->cache<2, 0, ENDIANNESS_LITTLE>();
+ space(AS_PROGRAM).cache(m_program_cache);
+ space(AS_PROGRAM).specific(m_program);
state_add(STATE_GENPC, "GENPC", m_pc).callexport().noshow();
state_add(STATE_GENPCBASE, "CURPC", m_pc).callexport().noshow();
@@ -201,13 +201,13 @@ void xavix2_device::execute_run()
if(machine().debug_flags & DEBUG_FLAG_ENABLED)
debugger_instruction_hook(m_pc);
- u32 opcode = m_program_cache->read_byte(m_pc) << 24;
+ u32 opcode = m_program_cache.read_byte(m_pc) << 24;
m_icount --;
u8 nb = bpo[opcode >> 29];
u32 npc = m_pc + nb;
for(u8 i=1; i != nb; i++) {
- opcode |= m_program_cache->read_byte(m_pc + i) << (24 - 8*i);
+ opcode |= m_program_cache.read_byte(m_pc + i) << (24 - 8*i);
m_icount --;
}
@@ -222,14 +222,14 @@ void xavix2_device::execute_run()
case 0x0c: case 0x0d: m_r[r1(opcode)] = snz(m_r[r2(opcode)] | val19u(opcode)); break;
case 0x0e: case 0x0f: m_r[r1(opcode)] = snz(m_r[r2(opcode)] ^ val19u(opcode)); break;
- case 0x10: case 0x11: m_r[r1(opcode)] = (s8)m_program->read_byte(m_r[r2(opcode)] + val19s(opcode)); break;
- case 0x12: case 0x13: m_r[r1(opcode)] = m_program->read_byte(m_r[r2(opcode)] + val19s(opcode)); break;
- case 0x14: case 0x15: m_r[r1(opcode)] = (s16)m_program->read_word(m_r[r2(opcode)] + val19s(opcode)); break;
- case 0x16: case 0x17: m_r[r1(opcode)] = m_program->read_word(m_r[r2(opcode)] + val19s(opcode)); break;
- case 0x18: case 0x19: m_r[r1(opcode)] = m_program->read_dword(m_r[r2(opcode)] + val19s(opcode)); break;
- case 0x1a: case 0x1b: m_program->write_byte(m_r[r2(opcode)] + val19s(opcode), m_r[r1(opcode)]); break;
- case 0x1c: case 0x1d: m_program->write_word(m_r[r2(opcode)] + val19s(opcode), m_r[r1(opcode)]); break;
- case 0x1e: case 0x1f: m_program->write_dword(m_r[r2(opcode)] + val19s(opcode), m_r[r1(opcode)]); break;
+ case 0x10: case 0x11: m_r[r1(opcode)] = (s8)m_program.read_byte(m_r[r2(opcode)] + val19s(opcode)); break;
+ case 0x12: case 0x13: m_r[r1(opcode)] = m_program.read_byte(m_r[r2(opcode)] + val19s(opcode)); break;
+ case 0x14: case 0x15: m_r[r1(opcode)] = (s16)m_program.read_word(m_r[r2(opcode)] + val19s(opcode)); break;
+ case 0x16: case 0x17: m_r[r1(opcode)] = m_program.read_word(m_r[r2(opcode)] + val19s(opcode)); break;
+ case 0x18: case 0x19: m_r[r1(opcode)] = m_program.read_dword(m_r[r2(opcode)] + val19s(opcode)); break;
+ case 0x1a: case 0x1b: m_program.write_byte(m_r[r2(opcode)] + val19s(opcode), m_r[r1(opcode)]); break;
+ case 0x1c: case 0x1d: m_program.write_word(m_r[r2(opcode)] + val19s(opcode), m_r[r1(opcode)]); break;
+ case 0x1e: case 0x1f: m_program.write_dword(m_r[r2(opcode)] + val19s(opcode), m_r[r1(opcode)]); break;
case 0x20: case 0x21: m_r[r1(opcode)] = do_add(m_r[r2(opcode)], val11s(opcode)); break;
case 0x22: case 0x23: m_r[r1(opcode)] = val14h(opcode); break;
@@ -241,32 +241,32 @@ void xavix2_device::execute_run()
case 0x2c: case 0x2d: m_r[r1(opcode)] = snz(m_r[r2(opcode)] | val11u(opcode)); break;
case 0x2e: case 0x2f: m_r[r1(opcode)] = snz(m_r[r2(opcode)] ^ val11u(opcode)); break;
- case 0x30: case 0x31: m_r[r1(opcode)] = (s8)m_program->read_byte(m_r[6] + val14s(opcode)); break;
- case 0x32: case 0x33: m_r[r1(opcode)] = m_program->read_byte(m_r[6] + val14s(opcode)); break;
- case 0x34: case 0x35: m_r[r1(opcode)] = (s16)m_program->read_word(m_r[6] + val14s(opcode)); break;
- case 0x36: case 0x37: m_r[r1(opcode)] = m_program->read_word(m_r[6] + val14s(opcode)); break;
- case 0x38: case 0x39: m_r[r1(opcode)] = m_program->read_dword(m_r[6] + val14s(opcode)); break;
- case 0x3a: case 0x3b: m_program->write_byte(m_r[6] + val14s(opcode), m_r[r1(opcode)]); break;
- case 0x3c: case 0x3d: m_program->write_word(m_r[6] + val14s(opcode), m_r[r1(opcode)]); break;
- case 0x3e: case 0x3f: m_program->write_dword(m_r[6] + val14s(opcode), m_r[r1(opcode)]); break;
-
- case 0x40: case 0x41: m_r[r1(opcode)] = (s8)m_program->read_byte(m_r[r2(opcode)] + val11s(opcode)); break;
- case 0x42: case 0x43: m_r[r1(opcode)] = m_program->read_byte(m_r[r2(opcode)] + val11s(opcode)); break;
- case 0x44: case 0x45: m_r[r1(opcode)] = (s16)m_program->read_word(m_r[r2(opcode)] + val11s(opcode)); break;
- case 0x46: case 0x47: m_r[r1(opcode)] = m_program->read_word(m_r[r2(opcode)] + val11s(opcode)); break;
- case 0x48: case 0x49: m_r[r1(opcode)] = m_program->read_dword(m_r[r2(opcode)] + val11s(opcode)); break;
- case 0x4a: case 0x4b: m_program->write_byte(m_r[r2(opcode)] + val11s(opcode), m_r[r1(opcode)]); break;
- case 0x4c: case 0x4d: m_program->write_word(m_r[r2(opcode)] + val11s(opcode), m_r[r1(opcode)]); break;
- case 0x4e: case 0x4f: m_program->write_dword(m_r[r2(opcode)] + val11s(opcode), m_r[r1(opcode)]); break;
-
- case 0x50: case 0x51: m_r[r1(opcode)] = (s8)m_program->read_byte(val14s(opcode)); break;
- case 0x52: case 0x53: m_r[r1(opcode)] = m_program->read_byte(val14s(opcode)); break;
- case 0x54: case 0x55: m_r[r1(opcode)] = (s16)m_program->read_word(val14s(opcode)); break;
- case 0x56: case 0x57: m_r[r1(opcode)] = m_program->read_word(val14s(opcode)); break;
- case 0x58: case 0x59: m_r[r1(opcode)] = m_program->read_dword(val14s(opcode)); break;
- case 0x5a: case 0x5b: m_program->write_byte(val14s(opcode), m_r[r1(opcode)]); break;
- case 0x5c: case 0x5d: m_program->write_word(val14s(opcode), m_r[r1(opcode)]); break;
- case 0x5e: case 0x5f: m_program->write_dword(val14s(opcode), m_r[r1(opcode)]); break;
+ case 0x30: case 0x31: m_r[r1(opcode)] = (s8)m_program.read_byte(m_r[6] + val14s(opcode)); break;
+ case 0x32: case 0x33: m_r[r1(opcode)] = m_program.read_byte(m_r[6] + val14s(opcode)); break;
+ case 0x34: case 0x35: m_r[r1(opcode)] = (s16)m_program.read_word(m_r[6] + val14s(opcode)); break;
+ case 0x36: case 0x37: m_r[r1(opcode)] = m_program.read_word(m_r[6] + val14s(opcode)); break;
+ case 0x38: case 0x39: m_r[r1(opcode)] = m_program.read_dword(m_r[6] + val14s(opcode)); break;
+ case 0x3a: case 0x3b: m_program.write_byte(m_r[6] + val14s(opcode), m_r[r1(opcode)]); break;
+ case 0x3c: case 0x3d: m_program.write_word(m_r[6] + val14s(opcode), m_r[r1(opcode)]); break;
+ case 0x3e: case 0x3f: m_program.write_dword(m_r[6] + val14s(opcode), m_r[r1(opcode)]); break;
+
+ case 0x40: case 0x41: m_r[r1(opcode)] = (s8)m_program.read_byte(m_r[r2(opcode)] + val11s(opcode)); break;
+ case 0x42: case 0x43: m_r[r1(opcode)] = m_program.read_byte(m_r[r2(opcode)] + val11s(opcode)); break;
+ case 0x44: case 0x45: m_r[r1(opcode)] = (s16)m_program.read_word(m_r[r2(opcode)] + val11s(opcode)); break;
+ case 0x46: case 0x47: m_r[r1(opcode)] = m_program.read_word(m_r[r2(opcode)] + val11s(opcode)); break;
+ case 0x48: case 0x49: m_r[r1(opcode)] = m_program.read_dword(m_r[r2(opcode)] + val11s(opcode)); break;
+ case 0x4a: case 0x4b: m_program.write_byte(m_r[r2(opcode)] + val11s(opcode), m_r[r1(opcode)]); break;
+ case 0x4c: case 0x4d: m_program.write_word(m_r[r2(opcode)] + val11s(opcode), m_r[r1(opcode)]); break;
+ case 0x4e: case 0x4f: m_program.write_dword(m_r[r2(opcode)] + val11s(opcode), m_r[r1(opcode)]); break;
+
+ case 0x50: case 0x51: m_r[r1(opcode)] = (s8)m_program.read_byte(val14s(opcode)); break;
+ case 0x52: case 0x53: m_r[r1(opcode)] = m_program.read_byte(val14s(opcode)); break;
+ case 0x54: case 0x55: m_r[r1(opcode)] = (s16)m_program.read_word(val14s(opcode)); break;
+ case 0x56: case 0x57: m_r[r1(opcode)] = m_program.read_word(val14s(opcode)); break;
+ case 0x58: case 0x59: m_r[r1(opcode)] = m_program.read_dword(val14s(opcode)); break;
+ case 0x5a: case 0x5b: m_program.write_byte(val14s(opcode), m_r[r1(opcode)]); break;
+ case 0x5c: case 0x5d: m_program.write_word(val14s(opcode), m_r[r1(opcode)]); break;
+ case 0x5e: case 0x5f: m_program.write_dword(val14s(opcode), m_r[r1(opcode)]); break;
case 0x60: case 0x61: m_r[r1(opcode)] = do_add(m_r[r1(opcode)], val6s(opcode)); break;
case 0x62: case 0x63: m_r[r1(opcode)] = val6s(opcode); break;
@@ -277,14 +277,14 @@ void xavix2_device::execute_run()
case 0x6c: case 0x6d: m_r[r1(opcode)] = do_lsr(m_r[r2(opcode)], val3u(opcode)); break;
case 0x6e: case 0x6f: m_r[r1(opcode)] = do_lsl(m_r[r2(opcode)], val3u(opcode)); break;
- case 0x70: case 0x71: m_r[r1(opcode)] = (s8)m_program->read_byte(m_r[6] + val6s(opcode)); break;
- case 0x72: case 0x73: m_r[r1(opcode)] = m_program->read_byte(m_r[6] + val6s(opcode)); break;
- case 0x74: case 0x75: m_r[r1(opcode)] = (s16)m_program->read_word(m_r[6] + val6s(opcode)); break;
- case 0x76: case 0x77: m_r[r1(opcode)] = m_program->read_word(m_r[6] + val6s(opcode)); break;
- case 0x78: case 0x79: m_r[r1(opcode)] = m_program->read_dword(m_r[6] + val6s(opcode)); break;
- case 0x7a: case 0x7b: m_program->write_byte(m_r[6] + val6s(opcode), m_r[r1(opcode)]); break;
- case 0x7c: case 0x7d: m_program->write_word(m_r[6] + val6s(opcode), m_r[r1(opcode)]); break;
- case 0x7e: case 0x7f: m_program->write_dword(m_r[6] + val6s(opcode), m_r[r1(opcode)]); break;
+ case 0x70: case 0x71: m_r[r1(opcode)] = (s8)m_program.read_byte(m_r[6] + val6s(opcode)); break;
+ case 0x72: case 0x73: m_r[r1(opcode)] = m_program.read_byte(m_r[6] + val6s(opcode)); break;
+ case 0x74: case 0x75: m_r[r1(opcode)] = (s16)m_program.read_word(m_r[6] + val6s(opcode)); break;
+ case 0x76: case 0x77: m_r[r1(opcode)] = m_program.read_word(m_r[6] + val6s(opcode)); break;
+ case 0x78: case 0x79: m_r[r1(opcode)] = m_program.read_dword(m_r[6] + val6s(opcode)); break;
+ case 0x7a: case 0x7b: m_program.write_byte(m_r[6] + val6s(opcode), m_r[r1(opcode)]); break;
+ case 0x7c: case 0x7d: m_program.write_word(m_r[6] + val6s(opcode), m_r[r1(opcode)]); break;
+ case 0x7e: case 0x7f: m_program.write_dword(m_r[6] + val6s(opcode), m_r[r1(opcode)]); break;
case 0x80: case 0x81: m_r[r1(opcode)] = do_add(m_r[r2(opcode)], m_r[r3(opcode)]); break;
// 82-83
@@ -296,14 +296,14 @@ void xavix2_device::execute_run()
case 0x8c: case 0x8d: m_r[r1(opcode)] = snz(m_r[r2(opcode)] | m_r[r3(opcode)]); break;
case 0x8e: case 0x8f: m_r[r1(opcode)] = snz(m_r[r2(opcode)] ^ m_r[r3(opcode)]); break;
- case 0x90: case 0x91: m_r[r1(opcode)] = (s8)m_program->read_byte(m_r[r2(opcode)] + val3s(opcode)); break;
- case 0x92: case 0x93: m_r[r1(opcode)] = m_program->read_byte(m_r[r2(opcode)] + val3s(opcode)); break;
- case 0x94: case 0x95: m_r[r1(opcode)] = (s16)m_program->read_word(m_r[r2(opcode)] + val3s(opcode)); break;
- case 0x96: case 0x97: m_r[r1(opcode)] = m_program->read_word(m_r[r2(opcode)] + val3s(opcode)); break;
- case 0x98: case 0x99: m_r[r1(opcode)] = m_program->read_dword(m_r[r2(opcode)] + val3s(opcode)); break;
- case 0x9a: case 0x9b: m_program->write_byte(m_r[r2(opcode)] + val3s(opcode), m_r[r1(opcode)]); break;
- case 0x9c: case 0x9d: m_program->write_word(m_r[r2(opcode)] + val3s(opcode), m_r[r1(opcode)]); break;
- case 0x9e: case 0x9f: m_program->write_dword(m_r[r2(opcode)] + val3s(opcode), m_r[r1(opcode)]); break;
+ case 0x90: case 0x91: m_r[r1(opcode)] = (s8)m_program.read_byte(m_r[r2(opcode)] + val3s(opcode)); break;
+ case 0x92: case 0x93: m_r[r1(opcode)] = m_program.read_byte(m_r[r2(opcode)] + val3s(opcode)); break;
+ case 0x94: case 0x95: m_r[r1(opcode)] = (s16)m_program.read_word(m_r[r2(opcode)] + val3s(opcode)); break;
+ case 0x96: case 0x97: m_r[r1(opcode)] = m_program.read_word(m_r[r2(opcode)] + val3s(opcode)); break;
+ case 0x98: case 0x99: m_r[r1(opcode)] = m_program.read_dword(m_r[r2(opcode)] + val3s(opcode)); break;
+ case 0x9a: case 0x9b: m_program.write_byte(m_r[r2(opcode)] + val3s(opcode), m_r[r1(opcode)]); break;
+ case 0x9c: case 0x9d: m_program.write_word(m_r[r2(opcode)] + val3s(opcode), m_r[r1(opcode)]); break;
+ case 0x9e: case 0x9f: m_program.write_dword(m_r[r2(opcode)] + val3s(opcode), m_r[r1(opcode)]); break;
case 0xa0: case 0xa1: m_r[r1(opcode)] = ~m_r[r2(opcode)]; break;
case 0xa2: case 0xa3: m_r[r1(opcode)] = m_r[r2(opcode)]; break;
diff --git a/src/devices/cpu/xavix2/xavix2.h b/src/devices/cpu/xavix2/xavix2.h
index de4d62e38bc..30e9ec5faea 100644
--- a/src/devices/cpu/xavix2/xavix2.h
+++ b/src/devices/cpu/xavix2/xavix2.h
@@ -39,8 +39,8 @@ protected:
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
const address_space_config m_program_config;
- address_space *m_program;
- memory_access_cache<2, 0, ENDIANNESS_LITTLE> *m_program_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_program_cache;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_program;
int m_icount, m_ei_count;
u32 m_pc;
diff --git a/src/devices/cpu/z180/z180.cpp b/src/devices/cpu/z180/z180.cpp
index 48956d8f283..b95edbb20ca 100644
--- a/src/devices/cpu/z180/z180.cpp
+++ b/src/devices/cpu/z180/z180.cpp
@@ -484,18 +484,18 @@ device_memory_interface::space_config_vector z180_device::memory_space_config()
uint8_t z180_device::z180_read_memory(offs_t addr)
{
- return m_program->read_byte(addr);
+ return m_program.read_byte(addr);
}
void z180_device::z180_write_memory(offs_t addr, uint8_t data)
{
- m_program->write_byte(addr, data);
+ m_program.write_byte(addr, data);
}
uint8_t z180_device::z180_readcontrol(offs_t port)
{
// normal external readport (ignore the data)
- (void)m_iospace->read_byte(port);
+ (void)m_io.read_byte(port);
// read the internal register
return z180_internal_port_read(port & (m_extended_io ? 0x7f : 0x3f));
@@ -861,7 +861,7 @@ uint8_t z180_device::z180_internal_port_read(uint8_t port)
void z180_device::z180_writecontrol(offs_t port, uint8_t data)
{
// normal external write port
- m_iospace->write_byte(port, data);
+ m_io.write_byte(port, data);
// store the data in the internal register
z180_internal_port_write(port & (m_extended_io ? 0x7f : 0x3f), data);
@@ -1442,16 +1442,16 @@ int z180_device::z180_dma1()
switch (m_dcntl & (Z180_DCNTL_DIM1 | Z180_DCNTL_DIM0))
{
case 0x00: /* memory MAR1+1 to I/O IAR1 fixed */
- m_iospace->write_byte(iar1, z180_read_memory(mar1++));
+ m_io.write_byte(iar1, z180_read_memory(mar1++));
break;
case 0x01: /* memory MAR1-1 to I/O IAR1 fixed */
- m_iospace->write_byte(iar1, z180_read_memory(mar1--));
+ m_io.write_byte(iar1, z180_read_memory(mar1--));
break;
case 0x02: /* I/O IAR1 fixed to memory MAR1+1 */
- z180_write_memory(mar1++, m_iospace->read_byte(iar1));
+ z180_write_memory(mar1++, m_io.read_byte(iar1));
break;
case 0x03: /* I/O IAR1 fixed to memory MAR1-1 */
- z180_write_memory(mar1--, m_iospace->read_byte(iar1));
+ z180_write_memory(mar1--, m_io.read_byte(iar1));
break;
}
@@ -1682,11 +1682,10 @@ void z180_device::device_start()
if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF;
}
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_oprogram = has_space(AS_OPCODES) ? &space(AS_OPCODES) : m_program;
- m_ocache = m_oprogram->cache<0, 0, ENDIANNESS_LITTLE>();
- m_iospace = &space(AS_IO);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_PROGRAM).cache(m_cprogram);
+ space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).cache(m_copcodes);
+ space(AS_IO).specific(m_io);
/* set up the state table */
{
diff --git a/src/devices/cpu/z180/z180.h b/src/devices/cpu/z180/z180.h
index 69663c73814..5153c5e1f89 100644
--- a/src/devices/cpu/z180/z180.h
+++ b/src/devices/cpu/z180/z180.h
@@ -203,11 +203,9 @@ private:
uint8_t m_timer_cnt; // timer counter / divide by 20
uint8_t m_dma0_cnt; // DMA0 counter / divide by 20
uint8_t m_dma1_cnt; // DMA1 counter / divide by 20
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
- address_space *m_oprogram;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_ocache;
- address_space *m_iospace;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_cprogram, m_copcodes;
+ memory_access<20, 0, 0, ENDIANNESS_LITTLE>::specific m_program;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
uint8_t m_rtemp;
uint32_t m_ioltemp;
int m_icount;
diff --git a/src/devices/cpu/z180/z180dd.hxx b/src/devices/cpu/z180/z180dd.hxx
index 0676af905ae..48c9cc497f2 100644
--- a/src/devices/cpu/z180/z180dd.hxx
+++ b/src/devices/cpu/z180/z180dd.hxx
@@ -2,7 +2,7 @@
// copyright-holders:Juergen Buchmueller
OP(illegal,1) {
logerror("Z180 '%s' ill. opcode $%02x $%02x\n",
- tag(), m_ocache->read_byte((_PCD-1)&0xffff), m_ocache->read_byte(_PCD));
+ tag(), m_copcodes.read_byte((_PCD-1)&0xffff), m_copcodes.read_byte(_PCD));
}
/**********************************************************
diff --git a/src/devices/cpu/z180/z180ed.hxx b/src/devices/cpu/z180/z180ed.hxx
index 68925107c1d..949ede4b268 100644
--- a/src/devices/cpu/z180/z180ed.hxx
+++ b/src/devices/cpu/z180/z180ed.hxx
@@ -3,7 +3,7 @@
OP(illegal,2)
{
logerror("Z180 '%s' ill. opcode $ed $%02x\n",
- tag(), m_ocache->read_byte((_PCD-1)&0xffff));
+ tag(), m_copcodes.read_byte((_PCD-1)&0xffff));
}
/**********************************************************
diff --git a/src/devices/cpu/z180/z180ops.h b/src/devices/cpu/z180/z180ops.h
index 7b4d0f159f2..0e57ff64532 100644
--- a/src/devices/cpu/z180/z180ops.h
+++ b/src/devices/cpu/z180/z180ops.h
@@ -27,7 +27,7 @@ inline u8 z180_device::IN(u16 port)
if (is_internal_io_address(port))
return z180_readcontrol(port);
m_extra_cycles += io_wait_states();
- return m_iospace->read_byte(port);
+ return m_io.read_byte(port);
}
/***************************************************************
@@ -40,7 +40,7 @@ inline void z180_device::OUT(u16 port, u8 value)
else
{
m_extra_cycles += io_wait_states();
- m_iospace->write_byte(port, value);
+ m_io.write_byte(port, value);
}
}
@@ -117,7 +117,7 @@ uint8_t z180_device::ROP()
offs_t addr = _PCD;
_PC++;
m_extra_cycles += memory_wait_states();
- return m_ocache->read_byte(MMU_REMAP_ADDR(addr));
+ return m_copcodes.read_byte(MMU_REMAP_ADDR(addr));
}
/****************************************************************
@@ -131,7 +131,7 @@ uint8_t z180_device::ARG()
offs_t addr = _PCD;
_PC++;
m_extra_cycles += memory_wait_states();
- return m_cache->read_byte(MMU_REMAP_ADDR(addr));
+ return m_cprogram.read_byte(MMU_REMAP_ADDR(addr));
}
uint32_t z180_device::ARG16()
@@ -139,7 +139,7 @@ uint32_t z180_device::ARG16()
offs_t addr = _PCD;
_PC += 2;
m_extra_cycles += memory_wait_states() * 2;
- return m_cache->read_byte(MMU_REMAP_ADDR(addr)) | (m_cache->read_byte(MMU_REMAP_ADDR(addr+1)) << 8);
+ return m_cprogram.read_byte(MMU_REMAP_ADDR(addr)) | (m_cprogram.read_byte(MMU_REMAP_ADDR(addr+1)) << 8);
}
/***************************************************************
diff --git a/src/devices/cpu/z8/z8.cpp b/src/devices/cpu/z8/z8.cpp
index f958754537c..cad09b4e7b9 100644
--- a/src/devices/cpu/z8/z8.cpp
+++ b/src/devices/cpu/z8/z8.cpp
@@ -286,7 +286,7 @@ uint16_t z8_device::mask_external_address(uint16_t addr)
uint8_t z8_device::fetch()
{
uint16_t real_pc = (m_pc < m_rom_size) ? m_pc : mask_external_address(m_pc);
- uint8_t data = m_cache->read_byte(real_pc);
+ uint8_t data = m_cache.read_byte(real_pc);
m_pc++;
@@ -299,7 +299,7 @@ uint8_t z8_device::fetch_opcode()
m_ppc = (m_pc < m_rom_size) ? m_pc : mask_external_address(m_pc);
debugger_instruction_hook(m_ppc);
- uint8_t data = m_cache->read_byte(m_ppc);
+ uint8_t data = m_cache.read_byte(m_ppc);
m_pc++;
@@ -912,12 +912,12 @@ void z8_device::spl_write(uint8_t data)
uint16_t z8_device::register_pair_read(uint8_t offset)
{
- return m_regs->read_word_unaligned(offset);
+ return m_regs.read_word_unaligned(offset);
}
void z8_device::register_pair_write(uint8_t offset, uint16_t data)
{
- m_regs->write_word_unaligned(offset, data);
+ m_regs.write_word_unaligned(offset, data);
}
uint8_t z8_device::get_working_register(int offset) const
@@ -956,7 +956,7 @@ void z8_device::stack_push_byte(uint8_t src)
m_sp.w = sp;
// @SP <- src
- m_data->write_byte(mask_external_address(sp), src);
+ m_data.write_byte(mask_external_address(sp), src);
}
}
@@ -978,7 +978,7 @@ void z8_device::stack_push_word(uint16_t src)
m_sp.w = sp;
// @SP <- src
- m_data->write_word_unaligned(mask_external_address(sp), src);
+ m_data.write_word_unaligned(mask_external_address(sp), src);
}
}
@@ -999,7 +999,7 @@ uint8_t z8_device::stack_pop_byte()
{
// @SP <- src
uint16_t sp = m_sp.w;
- uint8_t byte = m_data->read_byte(mask_external_address(sp));
+ uint8_t byte = m_data.read_byte(mask_external_address(sp));
// SP <- SP + 1 (postincrement)
m_sp.w = sp + 1;
@@ -1025,7 +1025,7 @@ uint16_t z8_device::stack_pop_word()
{
// @SP <- src
uint16_t sp = m_sp.w;
- uint16_t word = m_data->read_word_unaligned(mask_external_address(sp));
+ uint16_t word = m_data.read_word_unaligned(mask_external_address(sp));
// SP <- SP + 2 (postincrement)
m_sp.w = sp + 2;
@@ -1219,10 +1219,10 @@ void z8_device::device_start()
}
/* find address spaces */
- m_program = &space(AS_PROGRAM);
- m_cache = m_program->cache<0, 0, ENDIANNESS_BIG>();
- m_data = has_space(AS_DATA) ? &space(AS_DATA) : m_program;
- m_regs = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+ space(AS_DATA).specific(m_data);
+ space(AS_IO).specific(m_regs);
/* allocate timers */
m_internal_timer[0] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(z8_device::timeout<0>), this));
@@ -1324,8 +1324,8 @@ void z8_device::take_interrupt(int irq)
stack_push_byte(m_flags);
// branch to the vector
- m_pc = m_cache->read_byte(vector) << 8;
- m_pc |= m_cache->read_byte(vector + 1);
+ m_pc = m_cache.read_byte(vector) << 8;
+ m_pc |= m_cache.read_byte(vector + 1);
}
void z8_device::process_interrupts()
diff --git a/src/devices/cpu/z8/z8.h b/src/devices/cpu/z8/z8.h
index c21c9189359..22ad98513b5 100644
--- a/src/devices/cpu/z8/z8.h
+++ b/src/devices/cpu/z8/z8.h
@@ -74,10 +74,10 @@ private:
address_space_config m_data_config;
address_space_config m_register_config;
- address_space *m_program;
- memory_access_cache<0, 0, ENDIANNESS_BIG> *m_cache;
- address_space *m_data;
- address_space *m_regs;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access<16, 0, 0, ENDIANNESS_BIG>::specific m_data;
+ memory_access< 8, 0, 0, ENDIANNESS_BIG>::specific m_regs;
// callbacks
devcb_read8::array<4> m_input_cb;
@@ -191,9 +191,9 @@ private:
inline uint8_t fetch();
inline uint8_t fetch_opcode();
inline uint16_t fetch_word();
- inline uint8_t register_read(uint8_t offset) { return m_regs->read_byte(offset); }
+ inline uint8_t register_read(uint8_t offset) { return m_regs.read_byte(offset); }
inline uint16_t register_pair_read(uint8_t offset);
- inline void register_write(uint8_t offset, uint8_t data) { m_regs->write_byte(offset, data); }
+ inline void register_write(uint8_t offset, uint8_t data) { m_regs.write_byte(offset, data); }
inline void register_pair_write(uint8_t offset, uint16_t data);
inline uint8_t get_working_register(int offset) const;
inline uint8_t get_register(uint8_t offset) const;
@@ -205,10 +205,10 @@ private:
inline void set_flag(uint8_t flag, int state);
inline void clear(uint8_t dst);
inline void load(uint8_t dst, uint8_t src);
- inline void load_from_memory(address_space &space);
- inline void load_to_memory(address_space &space);
- inline void load_from_memory_autoinc(address_space &space);
- inline void load_to_memory_autoinc(address_space &space);
+ inline void load_from_memory(memory_access<16, 0, 0, ENDIANNESS_BIG>::specific &space);
+ inline void load_to_memory(memory_access<16, 0, 0, ENDIANNESS_BIG>::specific &space);
+ inline void load_from_memory_autoinc(memory_access<16, 0, 0, ENDIANNESS_BIG>::specific &space);
+ inline void load_to_memory_autoinc(memory_access<16, 0, 0, ENDIANNESS_BIG>::specific &space);
inline void pop(uint8_t dst);
inline void push(uint8_t src);
inline void add_carry(uint8_t dst, uint8_t src);
diff --git a/src/devices/cpu/z8/z8ops.hxx b/src/devices/cpu/z8/z8ops.hxx
index b1cfae93970..51172f2d142 100644
--- a/src/devices/cpu/z8/z8ops.hxx
+++ b/src/devices/cpu/z8/z8ops.hxx
@@ -139,7 +139,7 @@ INSTRUCTION( ld_IR2_R1 ) { mode_IR2_R1(load) }
INSTRUCTION( ld_R1_IM ) { mode_R1_IM(load) }
INSTRUCTION( ld_IR1_IM ) { mode_IR1_IM(load) }
-void z8_device::load_from_memory(address_space &space)
+void z8_device::load_from_memory(memory_access<16, 0, 0, ENDIANNESS_BIG>::specific &space)
{
uint8_t operands = fetch();
uint8_t dst = get_working_register(operands >> 4);
@@ -148,29 +148,29 @@ void z8_device::load_from_memory(address_space &space)
uint16_t address = register_pair_read(src);
uint8_t data;
- if (&space == m_program && address < m_rom_size)
- data = m_cache->read_byte(address);
+ if (space.space().spacenum() == AS_PROGRAM && address < m_rom_size)
+ data = m_cache.read_byte(address);
else
data = space.read_byte(mask_external_address(address));
register_write(dst, data);
}
-void z8_device::load_to_memory(address_space &space)
+void z8_device::load_to_memory(memory_access<16, 0, 0, ENDIANNESS_BIG>::specific &space)
{
uint8_t operands = fetch();
uint8_t src = get_working_register(operands >> 4);
uint8_t dst = get_working_register(operands & 0x0f);
uint16_t address = register_pair_read(dst);
- if (&space != m_program || address >= m_rom_size)
+ if (space.space().spacenum() != AS_PROGRAM || address >= m_rom_size)
address = mask_external_address(address);
uint8_t data = register_read(src);
space.write_byte(address, data);
}
-void z8_device::load_from_memory_autoinc(address_space &space)
+void z8_device::load_from_memory_autoinc(memory_access<16, 0, 0, ENDIANNESS_BIG>::specific &space)
{
uint8_t operands = fetch();
uint8_t dst = get_working_register(operands >> 4);
@@ -180,8 +180,8 @@ void z8_device::load_from_memory_autoinc(address_space &space)
uint16_t address = register_pair_read(src);
uint8_t data;
- if (&space == m_program && address < m_rom_size)
- data = m_cache->read_byte(address);
+ if (space.space().spacenum() == AS_PROGRAM && address < m_rom_size)
+ data = m_cache.read_byte(address);
else
data = space.read_byte(mask_external_address(address));
register_write(real_dst, data);
@@ -190,7 +190,7 @@ void z8_device::load_from_memory_autoinc(address_space &space)
register_pair_write(src, address + 1);
}
-void z8_device::load_to_memory_autoinc(address_space &space)
+void z8_device::load_to_memory_autoinc(memory_access<16, 0, 0, ENDIANNESS_BIG>::specific &space)
{
uint8_t operands = fetch();
uint8_t src = get_working_register(operands >> 4);
@@ -200,7 +200,7 @@ void z8_device::load_to_memory_autoinc(address_space &space)
uint16_t address = register_pair_read(dst);
uint8_t data = register_read(real_src);
- if (&space != m_program || address >= m_rom_size)
+ if (space.space().spacenum() == AS_PROGRAM || address >= m_rom_size)
address = mask_external_address(address);
space.write_byte(address, data);
@@ -208,14 +208,14 @@ void z8_device::load_to_memory_autoinc(address_space &space)
register_write(src, real_src + 1);
}
-INSTRUCTION( ldc_r1_Irr2 ) { load_from_memory(*m_program); }
-INSTRUCTION( ldc_r2_Irr1 ) { load_to_memory(*m_program); }
-INSTRUCTION( ldci_Ir1_Irr2 ) { load_from_memory_autoinc(*m_program); }
-INSTRUCTION( ldci_Ir2_Irr1 ) { load_to_memory_autoinc(*m_program); }
-INSTRUCTION( lde_r1_Irr2 ) { load_from_memory(*m_data); }
-INSTRUCTION( lde_r2_Irr1 ) { load_to_memory(*m_data); }
-INSTRUCTION( ldei_Ir1_Irr2 ) { load_from_memory_autoinc(*m_data); }
-INSTRUCTION( ldei_Ir2_Irr1 ) { load_to_memory_autoinc(*m_data); }
+INSTRUCTION( ldc_r1_Irr2 ) { load_from_memory(m_program); }
+INSTRUCTION( ldc_r2_Irr1 ) { load_to_memory(m_program); }
+INSTRUCTION( ldci_Ir1_Irr2 ) { load_from_memory_autoinc(m_program); }
+INSTRUCTION( ldci_Ir2_Irr1 ) { load_to_memory_autoinc(m_program); }
+INSTRUCTION( lde_r1_Irr2 ) { load_from_memory(m_data); }
+INSTRUCTION( lde_r2_Irr1 ) { load_to_memory(m_data); }
+INSTRUCTION( ldei_Ir1_Irr2 ) { load_from_memory_autoinc(m_data); }
+INSTRUCTION( ldei_Ir2_Irr1 ) { load_to_memory_autoinc(m_data); }
void z8_device::pop(uint8_t dst)
{
diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp
index 8e1e29a8a1f..7df7eaff074 100644
--- a/src/devices/cpu/z80/z80.cpp
+++ b/src/devices/cpu/z80/z80.cpp
@@ -426,7 +426,7 @@ inline void z80_device::leave_halt()
***************************************************************/
inline uint8_t z80_device::in(uint16_t port)
{
- return m_io->read_byte(port);
+ return m_io.read_byte(port);
}
/***************************************************************
@@ -434,7 +434,7 @@ inline uint8_t z80_device::in(uint16_t port)
***************************************************************/
inline void z80_device::out(uint16_t port, uint8_t value)
{
- m_io->write_byte(port, value);
+ m_io.write_byte(port, value);
}
/***************************************************************
@@ -442,7 +442,7 @@ inline void z80_device::out(uint16_t port, uint8_t value)
***************************************************************/
inline uint8_t z80_device::rm(uint16_t addr)
{
- return m_program->read_byte(addr);
+ return m_data.read_byte(addr);
}
/***************************************************************
@@ -459,7 +459,7 @@ inline void z80_device::rm16(uint16_t addr, PAIR &r)
***************************************************************/
inline void z80_device::wm(uint16_t addr, uint8_t value)
{
- m_program->write_byte(addr, value);
+ m_data.write_byte(addr, value);
}
/***************************************************************
@@ -480,7 +480,7 @@ inline uint8_t z80_device::rop()
{
unsigned pc = PCD;
PC++;
- uint8_t res = m_opcodes_cache->read_byte(pc);
+ uint8_t res = m_opcodes.read_byte(pc);
m_icount -= 2;
m_refresh_cb((m_i << 8) | (m_r2 & 0x80) | ((m_r-1) & 0x7f), 0x00, 0xff);
m_icount += 2;
@@ -497,14 +497,14 @@ inline uint8_t z80_device::arg()
{
unsigned pc = PCD;
PC++;
- return m_cache->read_byte(pc);
+ return m_args.read_byte(pc);
}
inline uint16_t z80_device::arg16()
{
unsigned pc = PCD;
PC += 2;
- return m_cache->read_byte(pc) | (m_cache->read_byte((pc+1)&0xffff) << 8);
+ return m_args.read_word(pc);
}
/***************************************************************
@@ -1956,7 +1956,7 @@ OP(xycb,ff) { A = set(7, rm(m_ea)); wm(m_ea, A); } /* SET 7,A=(XY+o) */
OP(illegal,1) {
logerror("Z80 ill. opcode $%02x $%02x ($%04x)\n",
- m_opcodes_cache->read_byte((PCD-1)&0xffff), m_opcodes_cache->read_byte(PCD), PCD-1);
+ m_opcodes.read_byte((PCD-1)&0xffff), m_opcodes.read_byte(PCD), PCD-1);
}
/**********************************************************
@@ -2544,7 +2544,7 @@ OP(fd,ff) { illegal_1(); op_ff(); } /* DB FD
OP(illegal,2)
{
logerror("Z80 ill. opcode $ed $%02x\n",
- m_opcodes_cache->read_byte((PCD-1)&0xffff));
+ m_opcodes.read_byte((PCD-1)&0xffff));
}
/**********************************************************
@@ -3406,11 +3406,10 @@ void z80_device::device_start()
m_after_ldair = 0;
m_ea = 0;
- m_program = &space(AS_PROGRAM);
- m_opcodes = has_space(AS_OPCODES) ? &space(AS_OPCODES) : m_program;
- m_cache = m_program->cache<0, 0, ENDIANNESS_LITTLE>();
- m_opcodes_cache = m_opcodes->cache<0, 0, ENDIANNESS_LITTLE>();
- m_io = &space(AS_IO);
+ space(AS_PROGRAM).cache(m_args);
+ space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).cache(m_opcodes);
+ space(AS_PROGRAM).specific(m_data);
+ space(AS_IO).specific(m_io);
IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */
F = ZF; /* Zero flag is set */
diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h
index bbf278f591d..11f4756deff 100644
--- a/src/devices/cpu/z80/z80.h
+++ b/src/devices/cpu/z80/z80.h
@@ -236,11 +236,11 @@ protected:
const address_space_config m_program_config;
const address_space_config m_opcodes_config;
const address_space_config m_io_config;
- address_space *m_program;
- address_space *m_opcodes;
- address_space *m_io;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache;
- memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_opcodes_cache;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_args;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_opcodes;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_data;
+ memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
+
devcb_write_line m_irqack_cb;
devcb_write8 m_refresh_cb;
devcb_write_line m_halt_cb;
diff --git a/src/devices/cpu/z8000/z8000.cpp b/src/devices/cpu/z8000/z8000.cpp
index 4684054ccc1..4ce857cecb5 100644
--- a/src/devices/cpu/z8000/z8000.cpp
+++ b/src/devices/cpu/z8000/z8000.cpp
@@ -42,7 +42,7 @@ z8002_device::z8002_device(const machine_config &mconfig, device_type type, cons
, m_sio_config("special I/O", ENDIANNESS_BIG, 16, 16, 0)
, m_iack_in(*this)
, m_mo_out(*this)
- , m_ppc(0), m_pc(0), m_psapseg(0), m_psapoff(0), m_fcw(0), m_refresh(0), m_nspseg(0), m_nspoff(0), m_irq_req(0), m_irq_vec(0), m_op_valid(0), m_nmi_state(0), m_mi(0), m_halt(false), m_program(nullptr), m_data(nullptr), m_cache(nullptr), m_io(nullptr), m_icount(0)
+ , m_ppc(0), m_pc(0), m_psapseg(0), m_psapoff(0), m_fcw(0), m_refresh(0), m_nspseg(0), m_nspoff(0), m_irq_req(0), m_irq_vec(0), m_op_valid(0), m_nmi_state(0), m_mi(0), m_halt(false), m_icount(0)
, m_vector_mult(vecmult)
{
}
@@ -96,7 +96,7 @@ uint32_t z8002_device::addr_sub(uint32_t addr, uint32_t subtrahend)
uint16_t z8002_device::RDOP()
{
- uint16_t res = m_opcache->read_word(m_pc);
+ uint16_t res = m_opcache.read_word(m_pc);
m_pc += 2;
return res;
}
@@ -112,7 +112,7 @@ uint32_t z8002_device::get_operand(int opnum)
if (! (m_op_valid & (1 << opnum)))
{
- m_op[opnum] = m_cache->read_word(m_pc);
+ m_op[opnum] = m_cache.read_word(m_pc);
m_pc += 2;
m_op_valid |= (1 << opnum);
}
@@ -130,13 +130,13 @@ uint32_t z8002_device::get_addr_operand(int opnum)
if (! (m_op_valid & (1 << opnum)))
{
- uint32_t seg = m_cache->read_word(m_pc);
+ uint32_t seg = m_cache.read_word(m_pc);
m_pc += 2;
if (get_segmented_mode())
{
if (seg & 0x8000)
{
- m_op[opnum] = ((seg & 0x7f00) << 8) | m_cache->read_word(m_pc);
+ m_op[opnum] = ((seg & 0x7f00) << 8) | m_cache.read_word(m_pc);
m_pc += 2;
}
else
@@ -160,13 +160,13 @@ uint32_t z8002_device::get_raw_addr_operand(int opnum)
if (! (m_op_valid & (1 << opnum)))
{
- uint32_t seg = m_cache->read_word(m_pc);
+ uint32_t seg = m_cache.read_word(m_pc);
m_pc += 2;
if (get_segmented_mode())
{
if (seg & 0x8000)
{
- m_op[opnum] = (seg << 16) | m_cache->read_word(m_pc);
+ m_op[opnum] = (seg << 16) | m_cache.read_word(m_pc);
m_pc += 2;
}
else
@@ -196,13 +196,13 @@ uint32_t z8001_device::adjust_addr_for_nonseg_mode(uint32_t addr)
}
}
-uint8_t z8002_device::RDMEM_B(address_space &space, uint32_t addr)
+uint8_t z8002_device::RDMEM_B(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr)
{
addr = adjust_addr_for_nonseg_mode(addr);
return space.read_byte(addr);
}
-uint16_t z8002_device::RDMEM_W(address_space &space, uint32_t addr)
+uint16_t z8002_device::RDMEM_W(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr)
{
addr = adjust_addr_for_nonseg_mode(addr);
addr &= ~1;
@@ -214,7 +214,7 @@ uint16_t z8002_device::RDMEM_W(address_space &space, uint32_t addr)
return space.read_word(addr);
}
-uint32_t z8002_device::RDMEM_L(address_space &space, uint32_t addr)
+uint32_t z8002_device::RDMEM_L(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr)
{
uint32_t result;
addr = adjust_addr_for_nonseg_mode(addr);
@@ -223,21 +223,21 @@ uint32_t z8002_device::RDMEM_L(address_space &space, uint32_t addr)
return result + space.read_word(addr_add(addr, 2));
}
-void z8002_device::WRMEM_B(address_space &space, uint32_t addr, uint8_t value)
+void z8002_device::WRMEM_B(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr, uint8_t value)
{
addr = adjust_addr_for_nonseg_mode(addr);
uint16_t value16 = value | (value << 8);
space.write_word(addr & ~1, value16, BIT(addr, 0) ? 0x00ff : 0xff00);
}
-void z8002_device::WRMEM_W(address_space &space, uint32_t addr, uint16_t value)
+void z8002_device::WRMEM_W(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr, uint16_t value)
{
addr = adjust_addr_for_nonseg_mode(addr);
addr &= ~1;
space.write_word(addr, value);
}
-void z8002_device::WRMEM_L(address_space &space, uint32_t addr, uint32_t value)
+void z8002_device::WRMEM_L(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr, uint32_t value)
{
addr = adjust_addr_for_nonseg_mode(addr);
addr &= ~1;
@@ -247,13 +247,13 @@ void z8002_device::WRMEM_L(address_space &space, uint32_t addr, uint32_t value)
uint8_t z8002_device::RDPORT_B(int mode, uint16_t addr)
{
- address_space &space = (mode == 0) ? *m_io : *m_sio;
+ memory_access<16, 1, 0, ENDIANNESS_BIG>::specific &space = (mode == 0) ? m_io : m_sio;
return space.read_byte(addr);
}
uint16_t z8002_device::RDPORT_W(int mode, uint16_t addr)
{
- address_space &space = (mode == 0) ? *m_io : *m_sio;
+ memory_access<16, 1, 0, ENDIANNESS_BIG>::specific &space = (mode == 0) ? m_io : m_sio;
if (BIT(addr, 0))
return swapendian_int16(space.read_word(addr & ~1, 0x00ff));
else
@@ -262,14 +262,14 @@ uint16_t z8002_device::RDPORT_W(int mode, uint16_t addr)
void z8002_device::WRPORT_B(int mode, uint16_t addr, uint8_t value)
{
- address_space &space = (mode == 0) ? *m_io : *m_sio;
+ memory_access<16, 1, 0, ENDIANNESS_BIG>::specific &space = (mode == 0) ? m_io : m_sio;
uint16_t value16 = value | (value << 8);
space.write_word(addr & ~1, value16, BIT(addr, 0) ? 0x00ff : 0xff00);
}
void z8002_device::WRPORT_W(int mode, uint16_t addr, uint16_t value)
{
- address_space &space = (mode == 0) ? *m_io : *m_sio;
+ memory_access<16, 1, 0, ENDIANNESS_BIG>::specific &space = (mode == 0) ? m_io : m_sio;
if (BIT(addr, 0))
space.write_word(addr & ~1, swapendian_int16(value), 0x00ff);
else
@@ -297,32 +297,32 @@ void z8001_device::PUSH_PC()
uint32_t z8002_device::GET_PC(uint32_t VEC)
{
- return RDMEM_W(*m_program, VEC + 2);
+ return RDMEM_W(m_program, VEC + 2);
}
uint32_t z8001_device::GET_PC(uint32_t VEC)
{
- return segmented_addr(RDMEM_L(*m_program, VEC + 4));
+ return segmented_addr(RDMEM_L(m_program, VEC + 4));
}
uint32_t z8002_device::get_reset_pc()
{
- return RDMEM_W(*m_program, 4);
+ return RDMEM_W(m_program, 4);
}
uint32_t z8001_device::get_reset_pc()
{
- return segmented_addr(RDMEM_L(*m_program, 4));
+ return segmented_addr(RDMEM_L(m_program, 4));
}
uint16_t z8002_device::GET_FCW(uint32_t VEC)
{
- return RDMEM_W(*m_program, VEC);
+ return RDMEM_W(m_program, VEC);
}
uint16_t z8001_device::GET_FCW(uint32_t VEC)
{
- return RDMEM_W(*m_program, VEC + 2);
+ return RDMEM_W(m_program, VEC + 2);
}
uint32_t z8002_device::F_SEG_Z8001()
@@ -353,7 +353,7 @@ void z8002_device::Interrupt()
if (m_irq_req & Z8000_RESET)
{
m_irq_req &= Z8000_NVI | Z8000_VI;
- CHANGE_FCW(RDMEM_W(*m_program, 2)); /* get reset m_fcw */
+ CHANGE_FCW(RDMEM_W(m_program, 2)); /* get reset m_fcw */
m_pc = get_reset_pc(); /* get reset m_pc */
}
else
@@ -419,7 +419,7 @@ void z8002_device::Interrupt()
PUSH_PC();
PUSHW(SP, fcw); /* save current m_fcw */
PUSHW(SP, m_irq_vec); /* save interrupt/trap type tag */
- m_pc = RDMEM_W(*m_program, NMI);
+ m_pc = RDMEM_W(m_program, NMI);
m_irq_req &= ~Z8000_NMI;
CHANGE_FCW(GET_FCW(NMI));
m_pc = GET_PC(NMI);
@@ -461,13 +461,13 @@ void z8002_device::Interrupt()
uint32_t z8002_device::read_irq_vector()
{
- return RDMEM_W(*m_program, VEC00 + 2 * (m_irq_vec & 0xff));
+ return RDMEM_W(m_program, VEC00 + 2 * (m_irq_vec & 0xff));
}
uint32_t z8001_device::read_irq_vector()
{
- return segmented_addr(RDMEM_L(*m_program, VEC00 + 2 * (m_irq_vec & 0xff)));
+ return segmented_addr(RDMEM_L(m_program, VEC00 + 2 * (m_irq_vec & 0xff)));
}
@@ -492,7 +492,7 @@ void z8002_device::clear_internal_state()
void z8002_device::register_debug_state()
{
- state_add( Z8000_PC, "PC", m_pc ).mask(m_program->addrmask());
+ state_add( Z8000_PC, "PC", m_pc ).mask(m_program.space().addrmask());
state_add( Z8000_NSPOFF, "NSPOFF", m_nspoff ).formatstr("%04X");
state_add( Z8000_NSPSEG, "NSPSEG", m_nspseg ).formatstr("%04X");
state_add( Z8000_FCW, "FCW", m_fcw ).formatstr("%04X");
@@ -573,27 +573,16 @@ void z8002_device::register_save_state()
void z8002_device::init_spaces()
{
- m_program = &space(AS_PROGRAM);
+ space(AS_PROGRAM).cache(m_cache);
+ space(AS_PROGRAM).specific(m_program);
+
/* If the system decodes STn lines to distinguish between data and program memory fetches,
install the data space. If it doesn't, install the program memory into data memory space. */
- if (has_space(AS_DATA))
- m_data = &space(AS_DATA);
- else
- m_data = m_program;
- if (has_space(AS_STACK))
- m_stack = &space(AS_STACK);
- else
- m_stack = m_data;
- m_cache = m_program->cache<1, 0, ENDIANNESS_BIG>();
- if (has_space(AS_OPCODES))
- m_opcache = space(AS_OPCODES).cache<1, 0, ENDIANNESS_BIG>();
- else
- m_opcache = m_cache;
- m_io = &space(AS_IO);
- if (has_space(AS_SIO))
- m_sio = &space(AS_SIO);
- else
- m_sio = m_io;
+ space(has_space(AS_DATA) ? AS_DATA : AS_PROGRAM).specific(m_data);
+ space(has_space(AS_STACK) ? AS_STACK : has_space(AS_DATA) ? AS_DATA : AS_PROGRAM).specific(m_stack);
+ space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).cache(m_opcache);
+ space(AS_IO).specific(m_io);
+ space(has_space(AS_SIO) ? AS_SIO : AS_IO).specific(m_sio);
}
void z8002_device::init_tables()
diff --git a/src/devices/cpu/z8000/z8000.h b/src/devices/cpu/z8000/z8000.h
index 907aedd1d01..921f8f4eb0f 100644
--- a/src/devices/cpu/z8000/z8000.h
+++ b/src/devices/cpu/z8000/z8000.h
@@ -146,13 +146,13 @@ protected:
int m_irq_state[2]; /* IRQ line states (NVI, VI) */
int m_mi;
bool m_halt;
- address_space *m_program;
- address_space *m_data;
- address_space *m_stack;
- memory_access_cache<1, 0, ENDIANNESS_BIG> *m_cache;
- memory_access_cache<1, 0, ENDIANNESS_BIG> *m_opcache;
- address_space *m_io;
- address_space *m_sio;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::cache m_cache;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::cache m_opcache;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific m_program;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific m_stack;
+ memory_access<16, 1, 0, ENDIANNESS_BIG>::specific m_io;
+ memory_access<16, 1, 0, ENDIANNESS_BIG>::specific m_sio;
int m_icount;
const int m_vector_mult;
@@ -167,12 +167,12 @@ protected:
inline uint32_t get_addr_operand(int opnum);
inline uint32_t get_raw_addr_operand(int opnum);
virtual uint32_t adjust_addr_for_nonseg_mode(uint32_t addr);
- inline uint8_t RDMEM_B(address_space &space, uint32_t addr);
- inline uint16_t RDMEM_W(address_space &space, uint32_t addr);
- inline uint32_t RDMEM_L(address_space &space, uint32_t addr);
- inline void WRMEM_B(address_space &space, uint32_t addr, uint8_t value);
- inline void WRMEM_W(address_space &space, uint32_t addr, uint16_t value);
- inline void WRMEM_L(address_space &space, uint32_t addr, uint32_t value);
+ inline uint8_t RDMEM_B(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr);
+ inline uint16_t RDMEM_W(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr);
+ inline uint32_t RDMEM_L(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr);
+ inline void WRMEM_B(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr, uint8_t value);
+ inline void WRMEM_W(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr, uint16_t value);
+ inline void WRMEM_L(memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space, uint32_t addr, uint32_t value);
inline uint8_t RDPORT_B(int mode, uint16_t addr);
inline uint16_t RDPORT_W(int mode, uint16_t addr);
inline void WRPORT_B(int mode, uint16_t addr, uint8_t value);
diff --git a/src/devices/cpu/z8000/z8000ops.hxx b/src/devices/cpu/z8000/z8000ops.hxx
index 82b9bd86442..1e3b2834a2d 100644
--- a/src/devices/cpu/z8000/z8000ops.hxx
+++ b/src/devices/cpu/z8000/z8000ops.hxx
@@ -137,62 +137,62 @@ void z8002_device::set_pc(uint32_t addr)
uint8_t z8002_device::RDIR_B(uint8_t reg)
{
- return RDMEM_B(reg == SP ? *m_stack : *m_data, addr_from_reg(reg));
+ return RDMEM_B(reg == SP ? m_stack : m_data, addr_from_reg(reg));
}
uint16_t z8002_device::RDIR_W(uint8_t reg)
{
- return RDMEM_W(reg == SP ? *m_stack : *m_data, addr_from_reg(reg));
+ return RDMEM_W(reg == SP ? m_stack : m_data, addr_from_reg(reg));
}
uint32_t z8002_device::RDIR_L(uint8_t reg)
{
- return RDMEM_L(reg == SP ? *m_stack : *m_data, addr_from_reg(reg));
+ return RDMEM_L(reg == SP ? m_stack : m_data, addr_from_reg(reg));
}
void z8002_device::WRIR_B(uint8_t reg, uint8_t value)
{
- WRMEM_B(reg == SP ? *m_stack : *m_data, addr_from_reg(reg), value);
+ WRMEM_B(reg == SP ? m_stack : m_data, addr_from_reg(reg), value);
}
void z8002_device::WRIR_W(uint8_t reg, uint16_t value)
{
- WRMEM_W(reg == SP ? *m_stack : *m_data, addr_from_reg(reg), value);
+ WRMEM_W(reg == SP ? m_stack : m_data, addr_from_reg(reg), value);
}
void z8002_device::WRIR_L(uint8_t reg, uint32_t value)
{
- WRMEM_L(reg == SP ? *m_stack : *m_data, addr_from_reg(reg), value);
+ WRMEM_L(reg == SP ? m_stack : m_data, addr_from_reg(reg), value);
}
uint8_t z8002_device::RDBX_B(uint8_t reg, uint16_t idx)
{
- return RDMEM_B(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx));
+ return RDMEM_B(reg == SP ? m_stack : m_data, addr_add(addr_from_reg(reg), idx));
}
uint16_t z8002_device::RDBX_W(uint8_t reg, uint16_t idx)
{
- return RDMEM_W(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx));
+ return RDMEM_W(reg == SP ? m_stack : m_data, addr_add(addr_from_reg(reg), idx));
}
uint32_t z8002_device::RDBX_L(uint8_t reg, uint16_t idx)
{
- return RDMEM_L(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx));
+ return RDMEM_L(reg == SP ? m_stack : m_data, addr_add(addr_from_reg(reg), idx));
}
void z8002_device::WRBX_B(uint8_t reg, uint16_t idx, uint8_t value)
{
- WRMEM_B(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx), value);
+ WRMEM_B(reg == SP ? m_stack : m_data, addr_add(addr_from_reg(reg), idx), value);
}
void z8002_device::WRBX_W(uint8_t reg, uint16_t idx, uint16_t value)
{
- WRMEM_W(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx), value);
+ WRMEM_W(reg == SP ? m_stack : m_data, addr_add(addr_from_reg(reg), idx), value);
}
void z8002_device::WRBX_L(uint8_t reg, uint16_t idx, uint32_t value)
{
- WRMEM_L(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx), value);
+ WRMEM_L(reg == SP ? m_stack : m_data, addr_add(addr_from_reg(reg), idx), value);
}
void z8002_device::PUSHW(uint8_t dst, uint16_t value)
@@ -1535,7 +1535,7 @@ void z8002_device::Z0B_ssN0_dddd()
void z8002_device::Z0C_ddN0_0000()
{
GET_DST(OP0,NIB3);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_B(space, addr, COMB(RDMEM_B(space, addr)));
}
@@ -1558,7 +1558,7 @@ void z8002_device::Z0C_ddN0_0001_imm8()
void z8002_device::Z0C_ddN0_0010()
{
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_B(space, addr, NEGB(RDMEM_B(space, addr)));
}
@@ -1591,7 +1591,7 @@ void z8002_device::Z0C_ddN0_0101_imm8()
void z8002_device::Z0C_ddN0_0110()
{
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
if (RDMEM_B(space, addr) & S08) SET_S; else CLR_S;
WRMEM_B(space, addr, 0xff);
@@ -1614,7 +1614,7 @@ void z8002_device::Z0C_ddN0_1000()
void z8002_device::Z0D_ddN0_0000()
{
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_W(space, addr, COMW(RDMEM_W(space, addr)));
}
@@ -1637,7 +1637,7 @@ void z8002_device::Z0D_ddN0_0001_imm16()
void z8002_device::Z0D_ddN0_0010()
{
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_W(space, addr, NEGW(RDMEM_W(space, addr)));
}
@@ -1670,7 +1670,7 @@ void z8002_device::Z0D_ddN0_0101_imm16()
void z8002_device::Z0D_ddN0_0110()
{
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
if (RDMEM_W(space, addr) & S16) SET_S; else CLR_S;
WRMEM_W(space, addr, 0xffff);
@@ -1966,7 +1966,7 @@ void z8002_device::Z1C_ddN0_1001_0000_ssss_0000_nmin1()
GET_DST(OP0,NIB2);
GET_CNT(OP1,NIB3);
GET_SRC(OP1,NIB1);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
while (cnt-- >= 0) {
WRMEM_W(space, addr, RW(src));
@@ -1984,7 +1984,7 @@ void z8002_device::Z1C_ssN0_0001_0000_dddd_0000_nmin1()
GET_SRC(OP0,NIB2);
GET_CNT(OP1,NIB3);
GET_DST(OP1,NIB1);
- address_space &space = src == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = src == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(src);
while (cnt-- >= 0) {
RW(dst) = RDMEM_W(space, addr);
@@ -2098,7 +2098,7 @@ void z8002_device::Z22_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_B(space, addr, RDMEM_B(space, addr) & ~bit);
}
@@ -2122,7 +2122,7 @@ void z8002_device::Z23_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_W(space, addr, RDMEM_W(space, addr) & ~bit);
}
@@ -2146,7 +2146,7 @@ void z8002_device::Z24_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_B(space, addr, RDMEM_B(space, addr) | bit);
}
@@ -2170,7 +2170,7 @@ void z8002_device::Z25_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_W(space, addr, RDMEM_W(space, addr) | bit);
}
@@ -2227,7 +2227,7 @@ void z8002_device::Z28_ddN0_imm4m1()
{
GET_I4M1(OP0,NIB3);
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_B(space, addr, INCB(RDMEM_B(space, addr), i4p1));
}
@@ -2240,7 +2240,7 @@ void z8002_device::Z29_ddN0_imm4m1()
{
GET_I4M1(OP0,NIB3);
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_W(space, addr, INCW(RDMEM_W(space, addr), i4p1));
}
@@ -2253,7 +2253,7 @@ void z8002_device::Z2A_ddN0_imm4m1()
{
GET_I4M1(OP0,NIB3);
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_B(space, addr, DECB(RDMEM_B(space, addr), i4p1));
}
@@ -2266,7 +2266,7 @@ void z8002_device::Z2B_ddN0_imm4m1()
{
GET_I4M1(OP0,NIB3);
GET_DST(OP0,NIB2);
- address_space &space = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = dst == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(dst);
WRMEM_W(space, addr, DECW(RDMEM_W(space, addr), i4p1));
}
@@ -2279,7 +2279,7 @@ void z8002_device::Z2C_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- address_space &space = src == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = src == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(src);
uint8_t tmp = RDMEM_B(space, addr);
WRMEM_B(space, addr, RB(dst));
@@ -2294,7 +2294,7 @@ void z8002_device::Z2D_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- address_space &space = src == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = src == SP ? m_stack : m_data;
uint32_t addr = addr_from_reg(src);
uint16_t tmp = RDMEM_W(space, addr);
WRMEM_W(space, addr, RW(dst));
@@ -2331,7 +2331,7 @@ void z8002_device::Z30_0000_dddd_dsp16()
{
GET_DST(OP0,NIB3);
GET_DSP16;
- RB(dst) = RDMEM_B(*m_program, dsp16);
+ RB(dst) = RDMEM_B(m_program, dsp16);
}
/******************************************
@@ -2354,7 +2354,7 @@ void z8002_device::Z31_0000_dddd_dsp16()
{
GET_DST(OP0,NIB3);
GET_DSP16;
- RW(dst) = RDMEM_W(*m_program, dsp16);
+ RW(dst) = RDMEM_W(m_program, dsp16);
}
/******************************************
@@ -2377,7 +2377,7 @@ void z8002_device::Z32_0000_ssss_dsp16()
{
GET_SRC(OP0,NIB3);
GET_DSP16;
- WRMEM_B(*m_program, dsp16, RB(src));
+ WRMEM_B(m_program, dsp16, RB(src));
}
/******************************************
@@ -2400,7 +2400,7 @@ void z8002_device::Z33_0000_ssss_dsp16()
{
GET_SRC(OP0,NIB3);
GET_DSP16;
- WRMEM_W(*m_program, dsp16, RW(src));
+ WRMEM_W(m_program, dsp16, RW(src));
}
/******************************************
@@ -2452,7 +2452,7 @@ void z8002_device::Z35_0000_dddd_dsp16()
{
GET_DST(OP0,NIB3);
GET_DSP16;
- RL(dst) = RDMEM_L(*m_program, dsp16);
+ RL(dst) = RDMEM_L(m_program, dsp16);
}
/******************************************
@@ -2499,7 +2499,7 @@ void z8002_device::Z37_0000_ssss_dsp16()
{
GET_SRC(OP0,NIB3);
GET_DSP16;
- WRMEM_L(*m_program, dsp16, RL(src));
+ WRMEM_L(m_program, dsp16, RL(src));
}
/******************************************
@@ -2537,7 +2537,7 @@ void z8002_device::Z39_ssN0_0000()
CHECK_PRIVILEGED_INSTR();
GET_SRC(OP0,NIB2);
uint16_t fcw;
- address_space &space = src == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &space = src == SP ? m_stack : m_data;
if (get_segmented_mode()) {
uint32_t addr = addr_from_reg(src);
fcw = RDMEM_W(space, addr + 2);
@@ -2988,7 +2988,7 @@ void z8002_device::Z40_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = ADDB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = ADDB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3001,7 +3001,7 @@ void z8002_device::Z40_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = ADDB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = ADDB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3012,7 +3012,7 @@ void z8002_device::Z41_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = ADDW(RW(dst), RDMEM_W(*m_data, addr)); /* EHC */
+ RW(dst) = ADDW(RW(dst), RDMEM_W(m_data, addr)); /* EHC */
}
/******************************************
@@ -3025,7 +3025,7 @@ void z8002_device::Z41_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = ADDW(RW(dst), RDMEM_W(*m_data, addr)); /* ASG */
+ RW(dst) = ADDW(RW(dst), RDMEM_W(m_data, addr)); /* ASG */
}
/******************************************
@@ -3036,7 +3036,7 @@ void z8002_device::Z42_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = SUBB(RB(dst), RDMEM_B(*m_data, addr)); /* EHC */
+ RB(dst) = SUBB(RB(dst), RDMEM_B(m_data, addr)); /* EHC */
}
/******************************************
@@ -3049,7 +3049,7 @@ void z8002_device::Z42_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = SUBB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = SUBB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3060,7 +3060,7 @@ void z8002_device::Z43_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = SUBW(RW(dst), RDMEM_W(*m_data, addr));
+ RW(dst) = SUBW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3073,7 +3073,7 @@ void z8002_device::Z43_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = SUBW(RW(dst), RDMEM_W(*m_data, addr));
+ RW(dst) = SUBW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3084,7 +3084,7 @@ void z8002_device::Z44_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = ORB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = ORB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3097,7 +3097,7 @@ void z8002_device::Z44_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = ORB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = ORB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3108,7 +3108,7 @@ void z8002_device::Z45_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = ORW(RW(dst), RDMEM_W(*m_data, addr));
+ RW(dst) = ORW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3121,7 +3121,7 @@ void z8002_device::Z45_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = ORW(RW(dst), RDMEM_W(*m_data, addr));
+ RW(dst) = ORW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3132,7 +3132,7 @@ void z8002_device::Z46_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = ANDB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = ANDB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3145,7 +3145,7 @@ void z8002_device::Z46_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = ANDB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = ANDB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3156,7 +3156,7 @@ void z8002_device::Z47_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = ANDW(RW(dst), RDMEM_W(*m_data, addr));
+ RW(dst) = ANDW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3169,7 +3169,7 @@ void z8002_device::Z47_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = ANDW(RW(dst), RDMEM_W(*m_data, addr));
+ RW(dst) = ANDW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3180,7 +3180,7 @@ void z8002_device::Z48_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = XORB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = XORB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3193,7 +3193,7 @@ void z8002_device::Z48_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = XORB(RB(dst), RDMEM_B(*m_data, addr));
+ RB(dst) = XORB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3204,7 +3204,7 @@ void z8002_device::Z49_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = XORW(RW(dst), RDMEM_W(*m_data, addr));
+ RW(dst) = XORW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3217,7 +3217,7 @@ void z8002_device::Z49_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = XORW(RW(dst), RDMEM_W(*m_data, addr));
+ RW(dst) = XORW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3228,7 +3228,7 @@ void z8002_device::Z4A_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- CPB(RB(dst), RDMEM_B(*m_data, addr));
+ CPB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3241,7 +3241,7 @@ void z8002_device::Z4A_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- CPB(RB(dst), RDMEM_B(*m_data, addr));
+ CPB(RB(dst), RDMEM_B(m_data, addr));
}
/******************************************
@@ -3252,7 +3252,7 @@ void z8002_device::Z4B_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- CPW(RW(dst), RDMEM_W(*m_data, addr));
+ CPW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3265,7 +3265,7 @@ void z8002_device::Z4B_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- CPW(RW(dst), RDMEM_W(*m_data, addr));
+ CPW(RW(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3275,7 +3275,7 @@ void z8002_device::Z4B_ssN0_dddd_addr()
void z8002_device::Z4C_0000_0000_addr()
{
GET_ADDR(OP1);
- WRMEM_B(*m_data, addr, COMB(RDMEM_W(*m_data, addr)));
+ WRMEM_B(m_data, addr, COMB(RDMEM_W(m_data, addr)));
}
/******************************************
@@ -3286,7 +3286,7 @@ void z8002_device::Z4C_0000_0001_addr_imm8()
{
GET_ADDR(OP1);
GET_IMM8(OP2);
- CPB(RDMEM_B(*m_data, addr), imm8);
+ CPB(RDMEM_B(m_data, addr), imm8);
}
/******************************************
@@ -3296,7 +3296,7 @@ void z8002_device::Z4C_0000_0001_addr_imm8()
void z8002_device::Z4C_0000_0010_addr()
{
GET_ADDR(OP1);
- WRMEM_B(*m_data, addr, NEGB(RDMEM_B(*m_data, addr)));
+ WRMEM_B(m_data, addr, NEGB(RDMEM_B(m_data, addr)));
}
/******************************************
@@ -3306,7 +3306,7 @@ void z8002_device::Z4C_0000_0010_addr()
void z8002_device::Z4C_0000_0100_addr()
{
GET_ADDR(OP1);
- TESTB(RDMEM_B(*m_data, addr));
+ TESTB(RDMEM_B(m_data, addr));
}
/******************************************
@@ -3317,7 +3317,7 @@ void z8002_device::Z4C_0000_0101_addr_imm8()
{
GET_ADDR(OP1);
GET_IMM8(OP2);
- WRMEM_B(*m_data, addr, imm8);
+ WRMEM_B(m_data, addr, imm8);
}
/******************************************
@@ -3327,8 +3327,8 @@ void z8002_device::Z4C_0000_0101_addr_imm8()
void z8002_device::Z4C_0000_0110_addr()
{
GET_ADDR(OP1);
- if (RDMEM_B(*m_data, addr) & S08) SET_S; else CLR_S;
- WRMEM_B(*m_data, addr, 0xff);
+ if (RDMEM_B(m_data, addr) & S08) SET_S; else CLR_S;
+ WRMEM_B(m_data, addr, 0xff);
}
/******************************************
@@ -3338,7 +3338,7 @@ void z8002_device::Z4C_0000_0110_addr()
void z8002_device::Z4C_0000_1000_addr()
{
GET_ADDR(OP1);
- WRMEM_B(*m_data, addr, 0);
+ WRMEM_B(m_data, addr, 0);
}
/******************************************
@@ -3350,7 +3350,7 @@ void z8002_device::Z4C_ddN0_0000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, COMB(RDMEM_B(*m_data, addr)));
+ WRMEM_B(m_data, addr, COMB(RDMEM_B(m_data, addr)));
}
/******************************************
@@ -3363,7 +3363,7 @@ void z8002_device::Z4C_ddN0_0001_addr_imm8()
GET_ADDR(OP1);
GET_IMM8(OP2);
addr = addr_add(addr, RW(dst));
- CPB(RDMEM_B(*m_data, addr), imm8);
+ CPB(RDMEM_B(m_data, addr), imm8);
}
/******************************************
@@ -3375,7 +3375,7 @@ void z8002_device::Z4C_ddN0_0010_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, NEGB(RDMEM_B(*m_data, addr)));
+ WRMEM_B(m_data, addr, NEGB(RDMEM_B(m_data, addr)));
}
/******************************************
@@ -3387,7 +3387,7 @@ void z8002_device::Z4C_ddN0_0100_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- TESTB(RDMEM_B(*m_data, addr));
+ TESTB(RDMEM_B(m_data, addr));
}
/******************************************
@@ -3400,7 +3400,7 @@ void z8002_device::Z4C_ddN0_0101_addr_imm8()
GET_ADDR(OP1);
GET_IMM8(OP2);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, imm8);
+ WRMEM_B(m_data, addr, imm8);
}
/******************************************
@@ -3412,8 +3412,8 @@ void z8002_device::Z4C_ddN0_0110_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- if (RDMEM_B(*m_data, addr) & S08) SET_S; else CLR_S;
- WRMEM_B(*m_data, addr, 0xff);
+ if (RDMEM_B(m_data, addr) & S08) SET_S; else CLR_S;
+ WRMEM_B(m_data, addr, 0xff);
}
/******************************************
@@ -3425,7 +3425,7 @@ void z8002_device::Z4C_ddN0_1000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, 0);
+ WRMEM_B(m_data, addr, 0);
}
/******************************************
@@ -3435,7 +3435,7 @@ void z8002_device::Z4C_ddN0_1000_addr()
void z8002_device::Z4D_0000_0000_addr()
{
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, COMW(RDMEM_W(*m_data, addr)));
+ WRMEM_W(m_data, addr, COMW(RDMEM_W(m_data, addr)));
}
/******************************************
@@ -3446,7 +3446,7 @@ void z8002_device::Z4D_0000_0001_addr_imm16()
{
GET_ADDR(OP1);
GET_IMM16(OP2);
- CPW(RDMEM_W(*m_data, addr), imm16);
+ CPW(RDMEM_W(m_data, addr), imm16);
}
/******************************************
@@ -3456,7 +3456,7 @@ void z8002_device::Z4D_0000_0001_addr_imm16()
void z8002_device::Z4D_0000_0010_addr()
{
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, NEGW(RDMEM_W(*m_data, addr)));
+ WRMEM_W(m_data, addr, NEGW(RDMEM_W(m_data, addr)));
}
/******************************************
@@ -3466,7 +3466,7 @@ void z8002_device::Z4D_0000_0010_addr()
void z8002_device::Z4D_0000_0100_addr()
{
GET_ADDR(OP1);
- TESTW(RDMEM_W(*m_data, addr));
+ TESTW(RDMEM_W(m_data, addr));
}
/******************************************
@@ -3477,7 +3477,7 @@ void z8002_device::Z4D_0000_0101_addr_imm16()
{
GET_ADDR(OP1);
GET_IMM16(OP2);
- WRMEM_W(*m_data, addr, imm16);
+ WRMEM_W(m_data, addr, imm16);
}
/******************************************
@@ -3487,8 +3487,8 @@ void z8002_device::Z4D_0000_0101_addr_imm16()
void z8002_device::Z4D_0000_0110_addr()
{
GET_ADDR(OP1);
- if (RDMEM_W(*m_data, addr) & S16) SET_S; else CLR_S;
- WRMEM_W(*m_data, addr, 0xffff);
+ if (RDMEM_W(m_data, addr) & S16) SET_S; else CLR_S;
+ WRMEM_W(m_data, addr, 0xffff);
}
/******************************************
@@ -3498,7 +3498,7 @@ void z8002_device::Z4D_0000_0110_addr()
void z8002_device::Z4D_0000_1000_addr()
{
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, 0);
+ WRMEM_W(m_data, addr, 0);
}
/******************************************
@@ -3510,7 +3510,7 @@ void z8002_device::Z4D_ddN0_0000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, COMW(RDMEM_W(*m_data, addr)));
+ WRMEM_W(m_data, addr, COMW(RDMEM_W(m_data, addr)));
}
/******************************************
@@ -3523,7 +3523,7 @@ void z8002_device::Z4D_ddN0_0001_addr_imm16()
GET_ADDR(OP1);
GET_IMM16(OP2);
addr = addr_add(addr, RW(dst));
- CPW(RDMEM_W(*m_data, addr), imm16);
+ CPW(RDMEM_W(m_data, addr), imm16);
}
/******************************************
@@ -3535,7 +3535,7 @@ void z8002_device::Z4D_ddN0_0010_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, NEGW(RDMEM_W(*m_data, addr)));
+ WRMEM_W(m_data, addr, NEGW(RDMEM_W(m_data, addr)));
}
/******************************************
@@ -3547,7 +3547,7 @@ void z8002_device::Z4D_ddN0_0100_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- TESTW(RDMEM_W(*m_data, addr));
+ TESTW(RDMEM_W(m_data, addr));
}
/******************************************
@@ -3560,7 +3560,7 @@ void z8002_device::Z4D_ddN0_0101_addr_imm16()
GET_ADDR(OP1);
GET_IMM16(OP2);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, imm16);
+ WRMEM_W(m_data, addr, imm16);
}
/******************************************
@@ -3572,8 +3572,8 @@ void z8002_device::Z4D_ddN0_0110_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- if (RDMEM_W(*m_data, addr) & S16) SET_S; else CLR_S;
- WRMEM_W(*m_data, addr, 0xffff);
+ if (RDMEM_W(m_data, addr) & S16) SET_S; else CLR_S;
+ WRMEM_W(m_data, addr, 0xffff);
}
/******************************************
@@ -3585,7 +3585,7 @@ void z8002_device::Z4D_ddN0_1000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, 0);
+ WRMEM_W(m_data, addr, 0);
}
/******************************************
@@ -3598,7 +3598,7 @@ void z8002_device::Z4E_ddN0_ssN0_addr()
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, RB(src));
+ WRMEM_B(m_data, addr, RB(src));
}
/******************************************
@@ -3609,7 +3609,7 @@ void z8002_device::Z50_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- CPL(RL(dst), RDMEM_L(*m_data, addr));
+ CPL(RL(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3622,7 +3622,7 @@ void z8002_device::Z50_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- CPL(RL(dst), RDMEM_L(*m_data, addr));
+ CPL(RL(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3633,7 +3633,7 @@ void z8002_device::Z51_ddN0_0000_addr()
{
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
- PUSHL(dst, RDMEM_L(*m_data, addr));
+ PUSHL(dst, RDMEM_L(m_data, addr));
}
/******************************************
@@ -3646,7 +3646,7 @@ void z8002_device::Z51_ddN0_ssN0_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- PUSHL(dst, RDMEM_L(*m_data, addr));
+ PUSHL(dst, RDMEM_L(m_data, addr));
}
/******************************************
@@ -3657,7 +3657,7 @@ void z8002_device::Z52_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = SUBL(RL(dst), RDMEM_L(*m_data, addr));
+ RL(dst) = SUBL(RL(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3670,7 +3670,7 @@ void z8002_device::Z52_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = SUBL(RL(dst), RDMEM_L(*m_data, addr));
+ RL(dst) = SUBL(RL(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3681,7 +3681,7 @@ void z8002_device::Z53_ddN0_0000_addr()
{
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
- PUSHW(dst, RDMEM_W(*m_data, addr));
+ PUSHW(dst, RDMEM_W(m_data, addr));
}
/******************************************
@@ -3694,7 +3694,7 @@ void z8002_device::Z53_ddN0_ssN0_addr()
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- PUSHW(dst, RDMEM_W(*m_data, addr));
+ PUSHW(dst, RDMEM_W(m_data, addr));
}
/******************************************
@@ -3705,7 +3705,7 @@ void z8002_device::Z54_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = RDMEM_L(*m_data, addr);
+ RL(dst) = RDMEM_L(m_data, addr);
}
/******************************************
@@ -3718,7 +3718,7 @@ void z8002_device::Z54_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = RDMEM_L(*m_data, addr);
+ RL(dst) = RDMEM_L(m_data, addr);
}
/******************************************
@@ -3729,7 +3729,7 @@ void z8002_device::Z55_ssN0_0000_addr()
{
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
- WRMEM_L(*m_data, addr, POPL(src));
+ WRMEM_L(m_data, addr, POPL(src));
}
/******************************************
@@ -3742,7 +3742,7 @@ void z8002_device::Z55_ssN0_ddN0_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_L(*m_data, addr, POPL(src));
+ WRMEM_L(m_data, addr, POPL(src));
}
/******************************************
@@ -3753,7 +3753,7 @@ void z8002_device::Z56_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = ADDL(RL(dst), RDMEM_L(*m_data, addr));
+ RL(dst) = ADDL(RL(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3766,7 +3766,7 @@ void z8002_device::Z56_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = ADDL(RL(dst), RDMEM_L(*m_data, addr));
+ RL(dst) = ADDL(RL(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3777,7 +3777,7 @@ void z8002_device::Z57_ssN0_0000_addr()
{
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, POPW(src));
+ WRMEM_W(m_data, addr, POPW(src));
}
/******************************************
@@ -3790,7 +3790,7 @@ void z8002_device::Z57_ssN0_ddN0_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, POPW(src));
+ WRMEM_W(m_data, addr, POPW(src));
}
/******************************************
@@ -3801,7 +3801,7 @@ void z8002_device::Z58_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RQ(dst) = MULTL(RQ(dst), RDMEM_L(*m_data, addr));
+ RQ(dst) = MULTL(RQ(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3814,7 +3814,7 @@ void z8002_device::Z58_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RQ(dst) = MULTL(RQ(dst), RDMEM_L(*m_data, addr));
+ RQ(dst) = MULTL(RQ(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3825,7 +3825,7 @@ void z8002_device::Z59_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = MULTW(RL(dst), RDMEM_W(*m_data, addr));
+ RL(dst) = MULTW(RL(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3838,7 +3838,7 @@ void z8002_device::Z59_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = MULTW(RL(dst), RDMEM_W(*m_data, addr));
+ RL(dst) = MULTW(RL(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3849,7 +3849,7 @@ void z8002_device::Z5A_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RQ(dst) = DIVL(RQ(dst), RDMEM_L(*m_data, addr));
+ RQ(dst) = DIVL(RQ(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3862,7 +3862,7 @@ void z8002_device::Z5A_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RQ(dst) = DIVL(RQ(dst), RDMEM_L(*m_data, addr));
+ RQ(dst) = DIVL(RQ(dst), RDMEM_L(m_data, addr));
}
/******************************************
@@ -3873,7 +3873,7 @@ void z8002_device::Z5B_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = DIVW(RL(dst), RDMEM_W(*m_data, addr));
+ RL(dst) = DIVW(RL(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3886,7 +3886,7 @@ void z8002_device::Z5B_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = DIVW(RL(dst), RDMEM_W(*m_data, addr));
+ RL(dst) = DIVW(RL(dst), RDMEM_W(m_data, addr));
}
/******************************************
@@ -3899,7 +3899,7 @@ void z8002_device::Z5C_0000_0001_0000_dddd_0000_nmin1_addr()
GET_CNT(OP1,NIB3);
GET_ADDR(OP2);
while (cnt-- >= 0) {
- RW(dst) = RDMEM_W(*m_data, addr);
+ RW(dst) = RDMEM_W(m_data, addr);
dst = (dst+1) & 15;
addr = addr_add (addr, 2);
}
@@ -3912,7 +3912,7 @@ void z8002_device::Z5C_0000_0001_0000_dddd_0000_nmin1_addr()
void z8002_device::Z5C_0000_1000_addr()
{
GET_ADDR(OP1);
- TESTL(RDMEM_L(*m_data, addr));
+ TESTL(RDMEM_L(m_data, addr));
}
/******************************************
@@ -3925,7 +3925,7 @@ void z8002_device::Z5C_0000_1001_0000_ssss_0000_nmin1_addr()
GET_CNT(OP1,NIB3);
GET_ADDR(OP2);
while (cnt-- >= 0) {
- WRMEM_W(*m_data, addr, RW(src));
+ WRMEM_W(m_data, addr, RW(src));
src = (src+1) & 15;
addr = addr_add (addr, 2);
}
@@ -3940,7 +3940,7 @@ void z8002_device::Z5C_ddN0_1000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- TESTL(RDMEM_L(*m_data, addr));
+ TESTL(RDMEM_L(m_data, addr));
}
/******************************************
@@ -3955,7 +3955,7 @@ void z8002_device::Z5C_ddN0_1001_0000_ssN0_0000_nmin1_addr()
GET_ADDR(OP2);
addr = addr_add(addr, RW(dst));
while (cnt-- >= 0) {
- WRMEM_W(*m_data, addr, RW(src));
+ WRMEM_W(m_data, addr, RW(src));
src = (src+1) & 15;
addr = addr_add(addr, 2);
}
@@ -3973,7 +3973,7 @@ void z8002_device::Z5C_ssN0_0001_0000_dddd_0000_nmin1_addr()
GET_ADDR(OP2);
addr = addr_add(addr, RW(src));
while (cnt-- >= 0) {
- RW(dst) = RDMEM_W(*m_data, addr);
+ RW(dst) = RDMEM_W(m_data, addr);
dst = (dst+1) & 15;
addr = addr_add(addr, 2);
}
@@ -3987,7 +3987,7 @@ void z8002_device::Z5D_0000_ssss_addr()
{
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_L(*m_data, addr, RL(src));
+ WRMEM_L(m_data, addr, RL(src));
}
/******************************************
@@ -4000,7 +4000,7 @@ void z8002_device::Z5D_ddN0_ssss_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_L(*m_data, addr, RL(src));
+ WRMEM_L(m_data, addr, RL(src));
}
/******************************************
@@ -4099,7 +4099,7 @@ void z8002_device::Z60_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = RDMEM_B(*m_data, addr);
+ RB(dst) = RDMEM_B(m_data, addr);
}
/******************************************
@@ -4112,7 +4112,7 @@ void z8002_device::Z60_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = RDMEM_B(*m_data, addr);
+ RB(dst) = RDMEM_B(m_data, addr);
}
/******************************************
@@ -4123,7 +4123,7 @@ void z8002_device::Z61_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = RDMEM_W(*m_data, addr);
+ RW(dst) = RDMEM_W(m_data, addr);
}
/******************************************
@@ -4136,7 +4136,7 @@ void z8002_device::Z61_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = RDMEM_W(*m_data, addr);
+ RW(dst) = RDMEM_W(m_data, addr);
}
/******************************************
@@ -4147,7 +4147,7 @@ void z8002_device::Z62_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- WRMEM_B(*m_data, addr, RDMEM_B(*m_data, addr) & ~bit);
+ WRMEM_B(m_data, addr, RDMEM_B(m_data, addr) & ~bit);
}
/******************************************
@@ -4160,7 +4160,7 @@ void z8002_device::Z62_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, RDMEM_B(*m_data, addr) & ~bit);
+ WRMEM_B(m_data, addr, RDMEM_B(m_data, addr) & ~bit);
}
/******************************************
@@ -4171,7 +4171,7 @@ void z8002_device::Z63_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, RDMEM_W(*m_data, addr) & ~bit);
+ WRMEM_W(m_data, addr, RDMEM_W(m_data, addr) & ~bit);
}
/******************************************
@@ -4184,7 +4184,7 @@ void z8002_device::Z63_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, RDMEM_W(*m_data, addr) & ~bit);
+ WRMEM_W(m_data, addr, RDMEM_W(m_data, addr) & ~bit);
}
/******************************************
@@ -4195,7 +4195,7 @@ void z8002_device::Z64_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- WRMEM_B(*m_data, addr, RDMEM_B(*m_data, addr) | bit);
+ WRMEM_B(m_data, addr, RDMEM_B(m_data, addr) | bit);
}
/******************************************
@@ -4208,7 +4208,7 @@ void z8002_device::Z64_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, RDMEM_B(*m_data, addr) | bit);
+ WRMEM_B(m_data, addr, RDMEM_B(m_data, addr) | bit);
}
/******************************************
@@ -4219,7 +4219,7 @@ void z8002_device::Z65_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, RDMEM_W(*m_data, addr) | bit);
+ WRMEM_W(m_data, addr, RDMEM_W(m_data, addr) | bit);
}
/******************************************
@@ -4232,7 +4232,7 @@ void z8002_device::Z65_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, RDMEM_W(*m_data, addr) | bit);
+ WRMEM_W(m_data, addr, RDMEM_W(m_data, addr) | bit);
}
/******************************************
@@ -4243,7 +4243,7 @@ void z8002_device::Z66_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- if (RDMEM_B(*m_data, addr) & bit) CLR_Z; else SET_Z;
+ if (RDMEM_B(m_data, addr) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -4256,7 +4256,7 @@ void z8002_device::Z66_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- if (RDMEM_B(*m_data, addr) & bit) CLR_Z; else SET_Z;
+ if (RDMEM_B(m_data, addr) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -4267,7 +4267,7 @@ void z8002_device::Z67_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- if (RDMEM_W(*m_data, addr) & bit) CLR_Z; else SET_Z;
+ if (RDMEM_W(m_data, addr) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -4280,7 +4280,7 @@ void z8002_device::Z67_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- if (RDMEM_W(*m_data, addr) & bit) CLR_Z; else SET_Z;
+ if (RDMEM_W(m_data, addr) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -4291,7 +4291,7 @@ void z8002_device::Z68_0000_imm4m1_addr()
{
GET_I4M1(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_B(*m_data, addr, INCB(RDMEM_B(*m_data, addr), i4p1));
+ WRMEM_B(m_data, addr, INCB(RDMEM_B(m_data, addr), i4p1));
}
/******************************************
@@ -4304,7 +4304,7 @@ void z8002_device::Z68_ddN0_imm4m1_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, INCB(RDMEM_B(*m_data, addr), i4p1));
+ WRMEM_B(m_data, addr, INCB(RDMEM_B(m_data, addr), i4p1));
}
/******************************************
@@ -4315,7 +4315,7 @@ void z8002_device::Z69_0000_imm4m1_addr()
{
GET_I4M1(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, INCW(RDMEM_W(*m_data, addr), i4p1));
+ WRMEM_W(m_data, addr, INCW(RDMEM_W(m_data, addr), i4p1));
}
/******************************************
@@ -4328,7 +4328,7 @@ void z8002_device::Z69_ddN0_imm4m1_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, INCW(RDMEM_W(*m_data, addr), i4p1));
+ WRMEM_W(m_data, addr, INCW(RDMEM_W(m_data, addr), i4p1));
}
/******************************************
@@ -4339,7 +4339,7 @@ void z8002_device::Z6A_0000_imm4m1_addr()
{
GET_I4M1(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_B(*m_data, addr, DECB(RDMEM_B(*m_data, addr), i4p1));
+ WRMEM_B(m_data, addr, DECB(RDMEM_B(m_data, addr), i4p1));
}
/******************************************
@@ -4352,7 +4352,7 @@ void z8002_device::Z6A_ddN0_imm4m1_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, DECB(RDMEM_B(*m_data, addr), i4p1));
+ WRMEM_B(m_data, addr, DECB(RDMEM_B(m_data, addr), i4p1));
}
/******************************************
@@ -4363,7 +4363,7 @@ void z8002_device::Z6B_0000_imm4m1_addr()
{
GET_I4M1(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, DECW(RDMEM_W(*m_data, addr), i4p1));
+ WRMEM_W(m_data, addr, DECW(RDMEM_W(m_data, addr), i4p1));
}
/******************************************
@@ -4376,7 +4376,7 @@ void z8002_device::Z6B_ddN0_imm4m1_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, DECW(RDMEM_W(*m_data, addr), i4p1));
+ WRMEM_W(m_data, addr, DECW(RDMEM_W(m_data, addr), i4p1));
}
/******************************************
@@ -4387,8 +4387,8 @@ void z8002_device::Z6C_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- uint8_t tmp = RDMEM_B(*m_data, addr);
- WRMEM_B(*m_data, addr, RB(dst));
+ uint8_t tmp = RDMEM_B(m_data, addr);
+ WRMEM_B(m_data, addr, RB(dst));
RB(dst) = tmp;
}
@@ -4403,8 +4403,8 @@ void z8002_device::Z6C_ssN0_dddd_addr()
GET_ADDR(OP1);
uint8_t tmp;
addr = addr_add(addr, RW(src));
- tmp = RDMEM_B(*m_data, addr);
- WRMEM_B(*m_data, addr, RB(dst));
+ tmp = RDMEM_B(m_data, addr);
+ WRMEM_B(m_data, addr, RB(dst));
RB(dst) = tmp;
}
@@ -4416,8 +4416,8 @@ void z8002_device::Z6D_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- uint16_t tmp = RDMEM_W(*m_data, addr);
- WRMEM_W(*m_data, addr, RW(dst));
+ uint16_t tmp = RDMEM_W(m_data, addr);
+ WRMEM_W(m_data, addr, RW(dst));
RW(dst) = tmp;
}
@@ -4432,8 +4432,8 @@ void z8002_device::Z6D_ssN0_dddd_addr()
GET_ADDR(OP1);
uint16_t tmp;
addr = addr_add(addr, RW(src));
- tmp = RDMEM_W(*m_data, addr);
- WRMEM_W(*m_data, addr, RW(dst));
+ tmp = RDMEM_W(m_data, addr);
+ WRMEM_W(m_data, addr, RW(dst));
RW(dst) = tmp;
}
@@ -4445,7 +4445,7 @@ void z8002_device::Z6E_0000_ssss_addr()
{
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_B(*m_data, addr, RB(src));
+ WRMEM_B(m_data, addr, RB(src));
}
/******************************************
@@ -4458,7 +4458,7 @@ void z8002_device::Z6E_ddN0_ssss_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(*m_data, addr, RB(src));
+ WRMEM_B(m_data, addr, RB(src));
}
/******************************************
@@ -4469,7 +4469,7 @@ void z8002_device::Z6F_0000_ssss_addr()
{
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_W(*m_data, addr, RW(src));
+ WRMEM_W(m_data, addr, RW(src));
}
/******************************************
@@ -4482,7 +4482,7 @@ void z8002_device::Z6F_ddN0_ssss_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(*m_data, addr, RW(src));
+ WRMEM_W(m_data, addr, RW(src));
}
/******************************************
@@ -4634,12 +4634,12 @@ void z8002_device::Z79_0000_0000_addr()
GET_ADDR(OP1);
uint16_t fcw;
if (get_segmented_mode()) {
- fcw = RDMEM_W(*m_data, addr + 2);
- set_pc(segmented_addr(RDMEM_L(*m_data, addr + 4)));
+ fcw = RDMEM_W(m_data, addr + 2);
+ set_pc(segmented_addr(RDMEM_L(m_data, addr + 4)));
}
else {
- fcw = RDMEM_W(*m_data, addr);
- set_pc(RDMEM_W(*m_data, (uint16_t)(addr + 2)));
+ fcw = RDMEM_W(m_data, addr);
+ set_pc(RDMEM_W(m_data, (uint16_t)(addr + 2)));
}
CHANGE_FCW(fcw); /* check for user/system mode change */
}
@@ -4656,12 +4656,12 @@ void z8002_device::Z79_ssN0_0000_addr()
uint16_t fcw;
addr = addr_add(addr, RW(src));
if (get_segmented_mode()) {
- fcw = RDMEM_W(*m_data, addr + 2);
- set_pc(segmented_addr(RDMEM_L(*m_data, addr + 4)));
+ fcw = RDMEM_W(m_data, addr + 2);
+ set_pc(segmented_addr(RDMEM_L(m_data, addr + 4)));
}
else {
- fcw = RDMEM_W(*m_data, addr);
- m_pc = RDMEM_W(*m_data, (uint16_t)(addr + 2));
+ fcw = RDMEM_W(m_data, addr);
+ m_pc = RDMEM_W(m_data, (uint16_t)(addr + 2));
}
if ((fcw ^ m_fcw) & F_SEG) printf("ldps 3 (0x%05x): changing from %ssegmented mode to %ssegmented mode\n", m_pc, (fcw & F_SEG) ? "non-" : "", (fcw & F_SEG) ? "" : "non-");
CHANGE_FCW(fcw); /* check for user/system mode change */
@@ -6064,7 +6064,7 @@ void z8002_device::ZB8_ddN0_0000_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- address_space &dstspace = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &dstspace = dst == SP ? m_stack : m_data;
uint32_t dstaddr = addr_from_reg(dst);
uint8_t xlt = RDBX_B(src, RDMEM_B(dstspace, dstaddr));
WRMEM_B(dstspace, dstaddr, xlt);
@@ -6082,7 +6082,7 @@ void z8002_device::ZB8_ddN0_0100_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- address_space &dstspace = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &dstspace = dst == SP ? m_stack : m_data;
uint32_t dstaddr = addr_from_reg(dst);
uint8_t xlt = RDBX_B(src, RDMEM_B(dstspace, dstaddr));
WRMEM_B(dstspace, dstaddr, xlt);
@@ -6100,7 +6100,7 @@ void z8002_device::ZB8_ddN0_1000_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- address_space &dstspace = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &dstspace = dst == SP ? m_stack : m_data;
uint32_t dstaddr = addr_from_reg(dst);
uint8_t xlt = RDBX_B(src, RDMEM_B(dstspace, dstaddr));
WRMEM_B(dstspace, dstaddr, xlt);
@@ -6118,7 +6118,7 @@ void z8002_device::ZB8_ddN0_1100_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- address_space &dstspace = dst == SP ? *m_stack : *m_data;
+ memory_access<23, 1, 0, ENDIANNESS_BIG>::specific &dstspace = dst == SP ? m_stack : m_data;
uint32_t dstaddr = addr_from_reg(dst);
uint8_t xlt = RDBX_B(src, RDMEM_B(dstspace, dstaddr));
WRMEM_B(dstspace, dstaddr, xlt);