Previous 199869 Revisions Next

r21711 Friday 8th March, 2013 at 17:35:36 UTC by Nathan Woods
Konami CPU EXG bug fix; m6809 CPU EXG/TFR cleanups (nw)
[src/emu/cpu/m6809]konami.ops m6809.c m6809inl.h

trunk/src/emu/cpu/m6809/m6809.c
r21710r21711
471471
472472
473473//-------------------------------------------------
474//  read_exgtfr_register
475//-------------------------------------------------
476
477ATTR_FORCE_INLINE m6809_base_device::exgtfr_register m6809_base_device::read_exgtfr_register(UINT8 reg)
478{
479   exgtfr_register result;
480   result.byte_value = 0xFF;
481   result.word_value = 0x00FF;
482
483   switch(reg & 0x0F)
484   {
485      case  0: result.word_value = m_d.w;      break;   // D
486      case  1: result.word_value = m_x.w;      break;   // X
487      case  2: result.word_value = m_y.w;      break;   // Y
488      case  3: result.word_value = m_u.w;      break;   // U
489      case  4: result.word_value = m_s.w;      break;   // S
490      case  5: result.word_value = m_pc.w;   break;   // PC
491      case  8: result.byte_value = m_d.b.h;   break;   // A
492      case  9: result.byte_value = m_d.b.l;   break;   // B
493      case 10: result.byte_value = m_cc;      break;   // CC
494      case 11: result.byte_value = m_dp;      break;   // DP
495   }
496   return result;
497}
498
499
500//-------------------------------------------------
501//  write_exgtfr_register
502//-------------------------------------------------
503
504ATTR_FORCE_INLINE void m6809_base_device::write_exgtfr_register(UINT8 reg, m6809_base_device::exgtfr_register value)
505{
506   switch(reg & 0x0F)
507   {
508      case  0: m_d.w   = value.word_value;   break;   // D
509      case  1: m_x.w   = value.word_value;   break;   // X
510      case  2: m_y.w   = value.word_value;   break;   // Y
511      case  3: m_u.w   = value.word_value;   break;   // U
512      case  4: m_s.w   = value.word_value;   break;   // S
513      case  5: m_pc.w  = value.word_value;   break;   // PC
514      case  8: m_d.b.h = value.byte_value;   break;   // A
515      case  9: m_d.b.l = value.byte_value;   break;   // B
516      case 10: m_cc    = value.byte_value;   break;   // CC
517      case 11: m_dp    = value.byte_value;   break;   // DP
518   }
519}
520
521
522//-------------------------------------------------
474523//  log_illegal - used to log hits to illegal
475524//   instructions (except for HD6309 which traps)
476525//-------------------------------------------------
trunk/src/emu/cpu/m6809/m6809inl.h
r21710r21711
146146
147147
148148//-------------------------------------------------
149//  read_exgtfr_register
150//-------------------------------------------------
151
152inline ATTR_FORCE_INLINE m6809_base_device::exgtfr_register m6809_base_device::read_exgtfr_register(UINT8 reg)
153{
154   exgtfr_register result;
155   result.byte_value = 0xFF;
156   result.word_value = 0x00FF;
157
158   switch(reg & 0x0F)
159   {
160      case  0: result.word_value = m_d.w;      break;   // D
161      case  1: result.word_value = m_x.w;      break;   // X
162      case  2: result.word_value = m_y.w;      break;   // Y
163      case  3: result.word_value = m_u.w;      break;   // U
164      case  4: result.word_value = m_s.w;      break;   // S
165      case  5: result.word_value = m_pc.w;   break;   // PC
166      case  8: result.byte_value = m_d.b.h;   break;   // A
167      case  9: result.byte_value = m_d.b.l;   break;   // B
168      case 10: result.byte_value = m_cc;      break;   // CC
169      case 11: result.byte_value = m_dp;      break;   // DP
170   }
171   return result;
172}
173
174
175//-------------------------------------------------
176//  write_exgtfr_register
177//-------------------------------------------------
178
179inline ATTR_FORCE_INLINE void m6809_base_device::write_exgtfr_register(UINT8 reg, m6809_base_device::exgtfr_register value)
180{
181   switch(reg & 0x0F)
182   {
183      case  0: m_d.w   = value.word_value;   break;   // D
184      case  1: m_x.w   = value.word_value;   break;   // X
185      case  2: m_y.w   = value.word_value;   break;   // Y
186      case  3: m_u.w   = value.word_value;   break;   // U
187      case  4: m_s.w   = value.word_value;   break;   // S
188      case  5: m_pc.w  = value.word_value;   break;   // PC
189      case  8: m_d.b.h = value.byte_value;   break;   // A
190      case  9: m_d.b.l = value.byte_value;   break;   // B
191      case 10: m_cc    = value.byte_value;   break;   // CC
192      case 11: m_dp    = value.byte_value;   break;   // DP
193   }
194}
195
196
197//-------------------------------------------------
198149//  daa - decimal arithmetic adjustment instruction
199150//-------------------------------------------------
200151
trunk/src/emu/cpu/m6809/konami.ops
r21710r21711
429429
430430EXG:
431431   {
432      // konami's TFR instruction differs enough from 6809 to fork the code
432      // konami's EXG instruction differs enough from 6809 to fork the code
433433      UINT8 param = read_opcode_arg();
434434      exgtfr_register reg1 = read_exgtfr_register(param >> 0);
435435      exgtfr_register reg2 = read_exgtfr_register(param >> 4);
436      write_exgtfr_register(param >> 4, reg2);
437      write_exgtfr_register(param >> 0, reg1);
436      write_exgtfr_register(param >> 0, reg2);
437      write_exgtfr_register(param >> 4, reg1);
438438   }
439439   eat(hd6309_native_mode() ? 3 : 6);
440440   return;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team