mirror of
https://github.com/holub/mame
synced 2025-04-24 17:30:55 +03:00
m6809: add proper pre_save and post_load for hd6309 (nw)
This commit is contained in:
parent
502891f98f
commit
cd2a2c6473
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user