summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/m68000/m68kcpu.h
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2010-08-19 14:04:49 +0000
committer Aaron Giles <aaron@aarongiles.com>2010-08-19 14:04:49 +0000
commita86a4c3684fbd6cd04f7da3b536c578955bfc749 (patch)
tree86a9856ce4ab9aa3b4f07fbb4ebe4e492ca88613 /src/emu/cpu/m68000/m68kcpu.h
parent98630a96d7635523fab56db077911384a024931c (diff)
Remove a level of indirection when calling m68000 memory handlers.
Diffstat (limited to 'src/emu/cpu/m68000/m68kcpu.h')
-rw-r--r--src/emu/cpu/m68000/m68kcpu.h104
1 files changed, 73 insertions, 31 deletions
diff --git a/src/emu/cpu/m68000/m68kcpu.h b/src/emu/cpu/m68000/m68kcpu.h
index e9fb13b7ad1..352be141839 100644
--- a/src/emu/cpu/m68000/m68kcpu.h
+++ b/src/emu/cpu/m68000/m68kcpu.h
@@ -535,17 +535,59 @@ union _fp_reg
/* Redirect memory calls */
-typedef struct _m68k_memory_interface m68k_memory_interface;
-struct _m68k_memory_interface
+typedef proto_delegate_1param<UINT8, offs_t> m68k_read8_proto_delegate;
+typedef proto_delegate_1param<UINT16, offs_t> m68k_readimm16_proto_delegate;
+typedef proto_delegate_2param<UINT16, offs_t, UINT16> m68k_read16_proto_delegate;
+typedef proto_delegate_2param<UINT32, offs_t, UINT32> m68k_read32_proto_delegate;
+typedef proto_delegate_2param<void, offs_t, UINT8> m68k_write8_proto_delegate;
+typedef proto_delegate_3param<void, offs_t, UINT16, UINT16> m68k_write16_proto_delegate;
+typedef proto_delegate_3param<void, offs_t, UINT32, UINT32> m68k_write32_proto_delegate;
+
+typedef delegate_1param<UINT8, offs_t> m68k_read8_delegate;
+typedef delegate_1param<UINT16, offs_t> m68k_readimm16_delegate;
+typedef delegate_2param<UINT16, offs_t, UINT16> m68k_read16_delegate;
+typedef delegate_2param<UINT32, offs_t, UINT32> m68k_read32_delegate;
+typedef delegate_2param<void, offs_t, UINT8> m68k_write8_delegate;
+typedef delegate_3param<void, offs_t, UINT16, UINT16> m68k_write16_delegate;
+typedef delegate_3param<void, offs_t, UINT32, UINT32> m68k_write32_delegate;
+
+class m68k_memory_interface : public bindable_object
{
+public:
+ void init8(address_space &space);
+ void init16(address_space &space);
+ void init32(address_space &space);
+ void init32mmu(address_space &space);
+
offs_t opcode_xor; // Address Calculation
- UINT16 (*readimm16)(address_space *, offs_t); // Immediate read 16 bit
- UINT8 (*read8)(address_space *, offs_t); // Normal read 8 bit
- UINT16 (*read16)(address_space *, offs_t); // Normal read 16 bit
- UINT32 (*read32)(address_space *, offs_t); // Normal read 32 bit
- void (*write8)(address_space *, offs_t, UINT8); // Write 8 bit
- void (*write16)(address_space *, offs_t, UINT16); // Write 16 bit
- void (*write32)(address_space *, offs_t, UINT32); // Write 32 bit
+ m68k_readimm16_delegate readimm16; // Immediate read 16 bit
+ m68k_read8_delegate read8;
+ m68k_read16_delegate read16;
+ m68k_read32_delegate read32;
+ m68k_write8_delegate write8;
+ m68k_write16_delegate write16;
+ m68k_write32_delegate write32;
+
+private:
+ UINT16 m68008_read_immediate_16(offs_t address);
+ UINT16 read_immediate_16(offs_t address);
+ UINT16 simple_read_immediate_16(offs_t address);
+ UINT16 readword_d32(offs_t address, UINT16 mask);
+ void writeword_d32(offs_t address, UINT16 data, UINT16 mask);
+ UINT32 readlong_d32(offs_t address, UINT32 mask);
+ void writelong_d32(offs_t address, UINT32 data, UINT32 mask);
+
+ UINT8 read_byte_32_mmu(offs_t address);
+ void write_byte_32_mmu(offs_t address, UINT8 data);
+ UINT16 read_immediate_16_mmu(offs_t address);
+ UINT16 readword_d32_mmu(offs_t address, UINT16 mask);
+ void writeword_d32_mmu(offs_t address, UINT16 data, UINT16 mask);
+ UINT32 readlong_d32_mmu(offs_t address, UINT32 mask);
+ void writelong_d32_mmu(offs_t address, UINT32 data, UINT32 mask);
+
+ address_space *m_space;
+ direct_read_data *m_direct;
+ m68ki_cpu_core *m_cpustate;
};
struct _m68ki_cpu_core
@@ -779,23 +821,23 @@ char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type);
INLINE unsigned int m68k_read_immediate_32(m68ki_cpu_core *m68k, unsigned int address)
{
- return ((*m68k->memory.readimm16)(m68k->program, address) << 16) | (*m68k->memory.readimm16)(m68k->program, address + 2);
+ return (m68k->memory.readimm16(address) << 16) | m68k->memory.readimm16(address + 2);
}
INLINE unsigned int m68k_read_pcrelative_8(m68ki_cpu_core *m68k, unsigned int address)
{
if (address >= m68k->encrypted_start && address < m68k->encrypted_end)
- return (((*m68k->memory.readimm16)(m68k->program, address&~1)>>(8*(1-(address & 1))))&0xff);
+ return ((m68k->memory.readimm16(address&~1)>>(8*(1-(address & 1))))&0xff);
- return (*m68k->memory.read8)(m68k->program, address);
+ return m68k->memory.read8(address);
}
INLINE unsigned int m68k_read_pcrelative_16(m68ki_cpu_core *m68k, unsigned int address)
{
if (address >= m68k->encrypted_start && address < m68k->encrypted_end)
- return (*m68k->memory.readimm16)(m68k->program, address);
+ return m68k->memory.readimm16(address);
- return (*m68k->memory.read16)(m68k->program, address);
+ return m68k->memory.read16(address, 0xffff);
}
INLINE unsigned int m68k_read_pcrelative_32(m68ki_cpu_core *m68k, unsigned int address)
@@ -803,7 +845,7 @@ INLINE unsigned int m68k_read_pcrelative_32(m68ki_cpu_core *m68k, unsigned int a
if (address >= m68k->encrypted_start && address < m68k->encrypted_end)
return m68k_read_immediate_32(m68k, address);
- return (*m68k->memory.read32)(m68k->program, address);
+ return m68k->memory.read32(address, 0xffffffff);
}
@@ -814,8 +856,8 @@ INLINE unsigned int m68k_read_pcrelative_32(m68ki_cpu_core *m68k, unsigned int a
*/
INLINE void m68kx_write_memory_32_pd(m68ki_cpu_core *m68k, unsigned int address, unsigned int value)
{
- (m68k->memory.write16)(m68k->program, address+2, value>>16);
- (m68k->memory.write16)(m68k->program, address, value&0xffff);
+ m68k->memory.write16(address+2, value>>16, 0xffff);
+ m68k->memory.write16(address, value&0xffff, 0xffff);
}
@@ -833,12 +875,12 @@ INLINE UINT32 m68ki_read_imm_16(m68ki_cpu_core *m68k)
if(REG_PC != m68k->pref_addr)
{
m68k->pref_addr = REG_PC;
- m68k->pref_data = (*m68k->memory.readimm16)(m68k->program, m68k->pref_addr);
+ m68k->pref_data = m68k->memory.readimm16(m68k->pref_addr);
}
result = MASK_OUT_ABOVE_16(m68k->pref_data);
REG_PC += 2;
m68k->pref_addr = REG_PC;
- m68k->pref_data = (*m68k->memory.readimm16)(m68k->program, m68k->pref_addr);
+ m68k->pref_data = m68k->memory.readimm16(m68k->pref_addr);
return result;
}
@@ -851,17 +893,17 @@ INLINE UINT32 m68ki_read_imm_32(m68ki_cpu_core *m68k)
if(REG_PC != m68k->pref_addr)
{
m68k->pref_addr = REG_PC;
- m68k->pref_data = (*m68k->memory.readimm16)(m68k->program, m68k->pref_addr);
+ m68k->pref_data = m68k->memory.readimm16(m68k->pref_addr);
}
temp_val = MASK_OUT_ABOVE_16(m68k->pref_data);
REG_PC += 2;
m68k->pref_addr = REG_PC;
- m68k->pref_data = (*m68k->memory.readimm16)(m68k->program, m68k->pref_addr);
+ m68k->pref_data = m68k->memory.readimm16(m68k->pref_addr);
temp_val = MASK_OUT_ABOVE_32((temp_val << 16) | MASK_OUT_ABOVE_16(m68k->pref_data));
REG_PC += 2;
m68k->pref_addr = REG_PC;
- m68k->pref_data = (*m68k->memory.readimm16)(m68k->program, m68k->pref_addr);
+ m68k->pref_data = m68k->memory.readimm16(m68k->pref_addr);
return temp_val;
}
@@ -878,7 +920,7 @@ INLINE UINT32 m68ki_read_imm_32(m68ki_cpu_core *m68k)
*/
INLINE UINT32 m68ki_read_8_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
{
- return (*m68k->memory.read8)(m68k->program, address);
+ return m68k->memory.read8(address);
}
INLINE UINT32 m68ki_read_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
{
@@ -886,7 +928,7 @@ INLINE UINT32 m68ki_read_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
{
m68ki_check_address_error(m68k, address, MODE_READ, fc);
}
- return (*m68k->memory.read16)(m68k->program, address);
+ return m68k->memory.read16(address, 0xffff);
}
INLINE UINT32 m68ki_read_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
{
@@ -894,12 +936,12 @@ INLINE UINT32 m68ki_read_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc)
{
m68ki_check_address_error(m68k, address, MODE_READ, fc);
}
- return (*m68k->memory.read32)(m68k->program, address);
+ return m68k->memory.read32(address, 0xffffffff);
}
INLINE void m68ki_write_8_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value)
{
- (*m68k->memory.write8)(m68k->program, address, value);
+ m68k->memory.write8(address, value);
}
INLINE void m68ki_write_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value)
{
@@ -907,7 +949,7 @@ INLINE void m68ki_write_16_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, U
{
m68ki_check_address_error(m68k, address, MODE_WRITE, fc);
}
- (*m68k->memory.write16)(m68k->program, address, value);
+ m68k->memory.write16(address, value, 0xffff);
}
INLINE void m68ki_write_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, UINT32 value)
{
@@ -915,7 +957,7 @@ INLINE void m68ki_write_32_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc, U
{
m68ki_check_address_error(m68k, address, MODE_WRITE, fc);
}
- (*m68k->memory.write32)(m68k->program, address, value);
+ m68k->memory.write32(address, value, 0xffffffff);
}
/* Special call to simulate undocumented 68k behavior when move.l with a
@@ -929,8 +971,8 @@ INLINE void m68ki_write_32_pd_fc(m68ki_cpu_core *m68k, UINT32 address, UINT32 fc
{
m68ki_check_address_error(m68k, address, MODE_WRITE, fc);
}
- (*m68k->memory.write16)(m68k->program, address+2, value>>16);
- (*m68k->memory.write16)(m68k->program, address, value&0xffff);
+ m68k->memory.write16(address+2, value>>16, 0xffff);
+ m68k->memory.write16(address, value&0xffff, 0xffff);
}
@@ -1682,7 +1724,7 @@ INLINE void m68ki_exception_address_error(m68ki_cpu_core *m68k)
*/
if(m68k->run_mode == RUN_MODE_BERR_AERR_RESET)
{
- (*m68k->memory.read8)(m68k->program, 0x00ffff01);
+ m68k->memory.read8(0x00ffff01);
m68k->stopped = STOP_LEVEL_HALT;
return;
}