diff --git a/src/emu/cpu/m6809/hd6309.c b/src/emu/cpu/m6809/hd6309.c index 004432ae5bc..480b7e90062 100644 --- a/src/emu/cpu/m6809/hd6309.c +++ b/src/emu/cpu/m6809/hd6309.c @@ -174,6 +174,101 @@ void hd6309_device::device_reset() } +//------------------------------------------------- +// device_pre_save - device-specific pre-save +//------------------------------------------------- + +void hd6309_device::device_pre_save() +{ + if (m_reg8 == &m_d.b.h) m_reg = HD6309_A; + else if (m_reg8 == &m_d.b.l) m_reg = HD6309_B; + else if (m_reg8 == &m_w.b.h) m_reg = HD6309_E; + else if (m_reg8 == &m_w.b.l) m_reg = HD6309_F; + else if (m_reg8 == &m_cc) m_reg = HD6309_CC; + else if (m_reg8 == &m_dp) m_reg = HD6309_DP; + else if (m_reg8 == &m_md) m_reg = HD6309_MD; + else if (m_reg8 == &m_temp.b.l) m_reg = HD6309_ZERO_BYTE; + + else if (m_reg16 == &m_d) m_reg = HD6309_D; + else if (m_reg16 == &m_x) m_reg = HD6309_X; + else if (m_reg16 == &m_y) m_reg = HD6309_Y; + else if (m_reg16 == &m_u) m_reg = HD6309_U; + else if (m_reg16 == &m_s) m_reg = HD6309_S; + else if (m_reg16 == &m_pc) m_reg = HD6309_PC; + else if (m_reg16 == &m_w) m_reg = HD6309_W; + else if (m_reg16 == &m_v) m_reg = HD6309_V; + else if (m_reg16 == &m_temp) m_reg = HD6309_ZERO_WORD; + else + m_reg = 0; +} + + +//------------------------------------------------- +// device_post_load - device-specific post-load +//------------------------------------------------- + +void hd6309_device::device_post_load() +{ + m_reg8 = NULL; + m_reg16 = NULL; + + switch(m_reg) + { + case HD6309_A: + set_regop8(m_d.b.h); + break; + case HD6309_B: + set_regop8(m_d.b.l); + break; + case HD6309_E: + set_regop8(m_w.b.h); + break; + case HD6309_F: + set_regop8(m_w.b.l); + break; + case HD6309_CC: + set_regop8(m_cc); + break; + case HD6309_DP: + set_regop8(m_dp); + break; + case HD6309_MD: + set_regop8(m_md); + break; + case HD6309_ZERO_BYTE: + set_regop8(m_temp.b.l); + break; + + case HD6309_D: + set_regop16(m_d); + break; + case HD6309_X: + set_regop16(m_x); + break; + case HD6309_Y: + set_regop16(m_y); + break; + case HD6309_U: + set_regop16(m_u); + break; + case HD6309_S: + set_regop16(m_s); + break; + case HD6309_PC: + set_regop16(m_pc); + break; + case HD6309_W: + set_regop16(m_w); + break; + case HD6309_V: + set_regop16(m_v); + break; + case HD6309_ZERO_WORD: + set_regop16(m_temp); + break; + } +} + //------------------------------------------------- // disasm_min_opcode_bytes - return the length diff --git a/src/emu/cpu/m6809/hd6309.h b/src/emu/cpu/m6809/hd6309.h index 121f1209275..fd63ee3b00e 100644 --- a/src/emu/cpu/m6809/hd6309.h +++ b/src/emu/cpu/m6809/hd6309.h @@ -33,6 +33,8 @@ protected: // device-level overrides virtual void device_start(); virtual void device_reset(); + virtual void device_pre_save(); + virtual void device_post_load(); // device_execute_interface overrides virtual void execute_run(); @@ -133,7 +135,9 @@ enum HD6309_F, HD6309_W, HD6309_V, - HD6309_MD + HD6309_MD, + HD6309_ZERO_BYTE, + HD6309_ZERO_WORD }; #define HD6309_IRQ_LINE 0 /* IRQ line number */ diff --git a/src/emu/cpu/m6809/m6809.c b/src/emu/cpu/m6809/m6809.c index 0f335ee1f9a..a3dcb880beb 100644 --- a/src/emu/cpu/m6809/m6809.c +++ b/src/emu/cpu/m6809/m6809.c @@ -122,8 +122,7 @@ m6809_base_device::m6809_base_device(const machine_config &mconfig, const char * void m6809_base_device::device_start() { - m_program = &space(AS_PROGRAM); - m_direct = &m_program->direct(); + m_direct = &m_addrspace[AS_PROGRAM]->direct(); m_lic_func.resolve_safe(); @@ -202,8 +201,8 @@ void m6809_base_device::device_reset() m_cc |= CC_I; // IRQ disabled m_cc |= CC_F; // FIRQ disabled - m_pc.b.h = m_program->read_byte(VECTOR_RESET_FFFE + 0); - m_pc.b.l = m_program->read_byte(VECTOR_RESET_FFFE + 1); + m_pc.b.h = m_addrspace[AS_PROGRAM]->read_byte(VECTOR_RESET_FFFE + 0); + m_pc.b.l = m_addrspace[AS_PROGRAM]->read_byte(VECTOR_RESET_FFFE + 1); // reset sub-instruction state reset_state(); diff --git a/src/emu/cpu/m6809/m6809.h b/src/emu/cpu/m6809/m6809.h index b98430b5f46..8b8dd2b5f5c 100644 --- a/src/emu/cpu/m6809/m6809.h +++ b/src/emu/cpu/m6809/m6809.h @@ -129,6 +129,9 @@ protected: UINT8 m_opcode; // other internal state + UINT8 * m_reg8; + PAIR16 * m_reg16; + int m_reg; bool m_nmi_line; bool m_nmi_asserted; bool m_firq_line; @@ -146,10 +149,10 @@ protected: void eat_remaining(); // read a byte from given memory location - ATTR_FORCE_INLINE UINT8 read_memory(UINT16 address) { eat(1); return m_program->read_byte(address); } + ATTR_FORCE_INLINE UINT8 read_memory(UINT16 address) { eat(1); return m_addrspace[AS_PROGRAM]->read_byte(address); } // write a byte to given memory location - ATTR_FORCE_INLINE void write_memory(UINT16 address, UINT8 data) { eat(1); m_program->write_byte(address, data); } + ATTR_FORCE_INLINE void write_memory(UINT16 address, UINT8 data) { eat(1); m_addrspace[AS_PROGRAM]->write_byte(address, data); } // read_opcode() is like read_memory() except it is used for reading opcodes. In the case of a system // with memory mapped I/O, this function can be used to greatly speed up emulation. @@ -241,14 +244,10 @@ protected: private: // address spaces const address_space_config m_program_config; - address_space * m_program; direct_read_data * m_direct; // other state UINT32 m_state; - int m_reg; - UINT8 * m_reg8; - PAIR16 * m_reg16; bool m_cond; // incidentals