diff options
author | 2010-08-19 14:04:49 +0000 | |
---|---|---|
committer | 2010-08-19 14:04:49 +0000 | |
commit | a86a4c3684fbd6cd04f7da3b536c578955bfc749 (patch) | |
tree | 86a9856ce4ab9aa3b4f07fbb4ebe4e492ca88613 /src/emu/cpu/m68000/m68kcpu.h | |
parent | 98630a96d7635523fab56db077911384a024931c (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.h | 104 |
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; } |