m6809: add proper pre_save and post_load for hd6309 (nw)

This commit is contained in:
Alex W. Jackson 2014-07-21 14:41:10 +00:00
parent 502891f98f
commit cd2a2c6473
4 changed files with 108 additions and 11 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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();

View File

@ -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