Previous 199869 Revisions Next

r31357 Monday 21st July, 2014 at 14:41:10 UTC by Alex Jackson
m6809: add proper pre_save and post_load for hd6309 (nw)
[src/emu/cpu/m6809]hd6309.c hd6309.h m6809.c m6809.h

trunk/src/emu/cpu/m6809/hd6309.c
r31356r31357
174174}
175175
176176
177//-------------------------------------------------
178//  device_pre_save - device-specific pre-save
179//-------------------------------------------------
177180
181void hd6309_device::device_pre_save()
182{
183   if      (m_reg8 == &m_d.b.h)   m_reg = HD6309_A;
184   else if (m_reg8 == &m_d.b.l)   m_reg = HD6309_B;
185   else if (m_reg8 == &m_w.b.h)   m_reg = HD6309_E;
186   else if (m_reg8 == &m_w.b.l)   m_reg = HD6309_F;
187   else if (m_reg8 == &m_cc)      m_reg = HD6309_CC;
188   else if (m_reg8 == &m_dp)      m_reg = HD6309_DP;
189   else if (m_reg8 == &m_md)      m_reg = HD6309_MD;
190   else if (m_reg8 == &m_temp.b.l)   m_reg = HD6309_ZERO_BYTE;
191
192   else if (m_reg16 == &m_d)      m_reg = HD6309_D;
193   else if (m_reg16 == &m_x)      m_reg = HD6309_X;
194   else if (m_reg16 == &m_y)      m_reg = HD6309_Y;
195   else if (m_reg16 == &m_u)      m_reg = HD6309_U;
196   else if (m_reg16 == &m_s)      m_reg = HD6309_S;
197   else if (m_reg16 == &m_pc)      m_reg = HD6309_PC;
198   else if (m_reg16 == &m_w)      m_reg = HD6309_W;
199   else if (m_reg16 == &m_v)      m_reg = HD6309_V;
200   else if (m_reg16 == &m_temp)   m_reg = HD6309_ZERO_WORD;
201   else
202      m_reg = 0;
203}
204
205
178206//-------------------------------------------------
207//  device_post_load - device-specific post-load
208//-------------------------------------------------
209
210void hd6309_device::device_post_load()
211{
212   m_reg8 = NULL;
213   m_reg16 = NULL;
214
215   switch(m_reg)
216   {
217      case HD6309_A:
218         set_regop8(m_d.b.h);
219         break;
220      case HD6309_B:
221         set_regop8(m_d.b.l);
222         break;
223      case HD6309_E:
224         set_regop8(m_w.b.h);
225         break;
226      case HD6309_F:
227         set_regop8(m_w.b.l);
228         break;
229      case HD6309_CC:
230         set_regop8(m_cc);
231         break;
232      case HD6309_DP:
233         set_regop8(m_dp);
234         break;
235      case HD6309_MD:
236         set_regop8(m_md);
237         break;
238      case HD6309_ZERO_BYTE:
239         set_regop8(m_temp.b.l);
240         break;
241
242      case HD6309_D:
243         set_regop16(m_d);
244         break;
245      case HD6309_X:
246         set_regop16(m_x);
247         break;
248      case HD6309_Y:
249         set_regop16(m_y);
250         break;
251      case HD6309_U:
252         set_regop16(m_u);
253         break;
254      case HD6309_S:
255         set_regop16(m_s);
256         break;
257      case HD6309_PC:
258         set_regop16(m_pc);
259         break;
260      case HD6309_W:
261         set_regop16(m_w);
262         break;
263      case HD6309_V:
264         set_regop16(m_v);
265         break;
266      case HD6309_ZERO_WORD:
267         set_regop16(m_temp);
268         break;
269   }
270}
271
272
273//-------------------------------------------------
179274//  disasm_min_opcode_bytes - return the length
180275//  of the shortest instruction, in bytes
181276//-------------------------------------------------
trunk/src/emu/cpu/m6809/hd6309.h
r31356r31357
3333   // device-level overrides
3434   virtual void device_start();
3535   virtual void device_reset();
36   virtual void device_pre_save();
37   virtual void device_post_load();
3638
3739   // device_execute_interface overrides
3840   virtual void execute_run();
r31356r31357
133135   HD6309_F,
134136   HD6309_W,
135137   HD6309_V,
136   HD6309_MD
138   HD6309_MD,
139   HD6309_ZERO_BYTE,
140   HD6309_ZERO_WORD
137141};
138142
139143#define HD6309_IRQ_LINE  0   /* IRQ line number */
trunk/src/emu/cpu/m6809/m6809.c
r31356r31357
122122
123123void m6809_base_device::device_start()
124124{
125   m_program = &space(AS_PROGRAM);
126   m_direct = &m_program->direct();
125   m_direct = &m_addrspace[AS_PROGRAM]->direct();
127126
128127   m_lic_func.resolve_safe();
129128
r31356r31357
202201   m_cc |= CC_I;       // IRQ disabled
203202   m_cc |= CC_F;       // FIRQ disabled
204203
205   m_pc.b.h = m_program->read_byte(VECTOR_RESET_FFFE + 0);
206   m_pc.b.l = m_program->read_byte(VECTOR_RESET_FFFE + 1);
204   m_pc.b.h = m_addrspace[AS_PROGRAM]->read_byte(VECTOR_RESET_FFFE + 0);
205   m_pc.b.l = m_addrspace[AS_PROGRAM]->read_byte(VECTOR_RESET_FFFE + 1);
207206
208207   // reset sub-instruction state
209208   reset_state();
trunk/src/emu/cpu/m6809/m6809.h
r31356r31357
129129   UINT8                       m_opcode;
130130
131131   // other internal state
132   UINT8 *                     m_reg8;
133   PAIR16 *                    m_reg16;
134   int                         m_reg;
132135   bool                        m_nmi_line;
133136   bool                        m_nmi_asserted;
134137   bool                        m_firq_line;
r31356r31357
146149   void eat_remaining();
147150
148151   // read a byte from given memory location
149   ATTR_FORCE_INLINE UINT8 read_memory(UINT16 address)             { eat(1); return m_program->read_byte(address); }
152   ATTR_FORCE_INLINE UINT8 read_memory(UINT16 address)             { eat(1); return m_addrspace[AS_PROGRAM]->read_byte(address); }
150153
151154   // write a byte to given memory location
152   ATTR_FORCE_INLINE void write_memory(UINT16 address, UINT8 data) { eat(1); m_program->write_byte(address, data); }
155   ATTR_FORCE_INLINE void write_memory(UINT16 address, UINT8 data) { eat(1); m_addrspace[AS_PROGRAM]->write_byte(address, data); }
153156
154157   // read_opcode() is like read_memory() except it is used for reading opcodes. In  the case of a system
155158   // with memory mapped I/O, this function can be used  to greatly speed up emulation.
r31356r31357
241244private:
242245   // address spaces
243246   const address_space_config  m_program_config;
244   address_space *             m_program;
245247   direct_read_data *          m_direct;
246248
247249   // other state
248250   UINT32                      m_state;
249   int                         m_reg;
250   UINT8 *                     m_reg8;
251   PAIR16 *                    m_reg16;
252251   bool                        m_cond;
253252
254253   // incidentals

Previous 199869 Revisions Next


© 1997-2024 The MAME Team