Previous 199869 Revisions Next

r21596 Tuesday 5th March, 2013 at 13:48:02 UTC by Nathan Woods
Konami CPU fixes; simpsons gets further now (nw)
[src/emu/cpu/m6809]base6x09.ops hd6309.ops konami.c konami.h konami.ops m6809.h m6809.ops

trunk/src/emu/cpu/m6809/hd6309.ops
r21595r21596
796796   @set_ea(m_temp.w);
797797   return;
798798
799EXG:
800   {
801      UINT8 param = read_opcode_arg();
802      exgtfr_register reg1 = read_exgtfr_register(param >> 4);
803      exgtfr_register reg2 = read_exgtfr_register(param >> 0);
804      write_exgtfr_register(param >> 4, reg2);
805      write_exgtfr_register(param >> 0, reg1);
806   }
807   eat(hd6309_native_mode() ? 3 : 6);
808   return;
809
810TFR:
811   {
812      UINT8 param = read_opcode_arg();
813      exgtfr_register reg = read_exgtfr_register(param >> 4);
814      write_exgtfr_register(param >> 0, reg);
815   }
816   eat(hd6309_native_mode() ? 2 : 4);
817   return;
818
799819ILLEGAL:
800820   m_md |= 0x40;      // illegal op flag
801821   set_ea(VECTOR_ILLEGAL);
trunk/src/emu/cpu/m6809/konami.ops
r21595r21596
210210      case 0xBF:                              %INDEXED;   %ASLD;      return;
211211
212212      case 0xC0:                                       %ROLD;      return;
213      case 0xC1:                              %INDEXED;   %ROL16;      return;
213214      case 0xC2:                              set_d();   %CLR16;      return;
215      case 0xC3:                              %INDEXED;   %CLR16;      return;
214216      case 0xC4:                              set_d();   %NEG16;      return;
217      case 0xC5:                              %INDEXED;   %NEG16;      return;
215218      case 0xC6:                              set_d();   %INC16;      return;
219      case 0xC7:                              %INDEXED;   %INC16;      return;
216220      case 0xC8:                              set_d();   %DEC16;      return;
221      case 0xC9:                              %INDEXED;   %DEC16;      return;
217222      case 0xCA:                              set_d();   %TST16;      return;
223      case 0xCB:                              %INDEXED;   %TST16;      return;
218224      case 0xCC:                              set_a();   %ABS8;      return;
219225      case 0xCD:                              set_b();   %ABS8;      return;
220226      case 0xCE:                              set_d();   %ABS16;      return;
r21595r21596
421427   set_ea(m_temp.w);
422428   return;
423429
430EXG:
431   {
432      // konami's TFR instruction differs enough from 6809 to fork the code
433      UINT8 param = read_opcode_arg();
434      exgtfr_register reg1 = read_exgtfr_register(param >> 0);
435      exgtfr_register reg2 = read_exgtfr_register(param >> 4);
436      write_exgtfr_register(param >> 4, reg2);
437      write_exgtfr_register(param >> 0, reg1);
438   }
439   eat(hd6309_native_mode() ? 3 : 6);
440   return;
441
442TFR:
443   {
444      // konami's TFR instruction differs enough from 6809 to fork the code
445      UINT8 param = read_opcode_arg();
446      exgtfr_register reg = read_exgtfr_register(param >> 0);
447      write_exgtfr_register((param >> 4) & 0x07, reg);
448   }
449   eat(hd6309_native_mode() ? 2 : 4);
450   return;
451
424452SETLINE:
425453   @set_lines(read_operand());
426454   return;
trunk/src/emu/cpu/m6809/konami.c
r21595r21596
116116
117117
118118//-------------------------------------------------
119//  read_operand
120//-------------------------------------------------
121
122inline ATTR_FORCE_INLINE UINT8 konami_cpu_device::read_operand()
123{
124   return super::read_operand();
125}
126
127
128//-------------------------------------------------
129//  read_operand
130//-------------------------------------------------
131
132inline ATTR_FORCE_INLINE UINT8 konami_cpu_device::read_operand(int ordinal)
133{
134   switch(m_addressing_mode)
135   {
136      case ADDRESSING_MODE_EA:         return read_memory(m_ea.w + ordinal);
137      case ADDRESSING_MODE_IMMEDIATE:      return read_opcode_arg();
138      case ADDRESSING_MODE_REGISTER_D:   return (ordinal & 1) ? m_d.b.l : m_d.b.h;
139      default:                     fatalerror("Unexpected");   return 0x00;
140   }
141}
142
143
144//-------------------------------------------------
145//  write_operand
146//-------------------------------------------------
147
148ATTR_FORCE_INLINE void konami_cpu_device::write_operand(UINT8 data)
149{
150   super::write_operand(data);
151}
152
153
154
155//-------------------------------------------------
156//  write_operand
157//-------------------------------------------------
158
159ATTR_FORCE_INLINE void konami_cpu_device::write_operand(int ordinal, UINT8 data)
160{
161   switch(m_addressing_mode)
162   {
163      case ADDRESSING_MODE_IMMEDIATE:      /* do nothing */                        break;
164      case ADDRESSING_MODE_EA:         write_memory(m_ea.w + ordinal, data);         break;
165      case ADDRESSING_MODE_REGISTER_D:   *((ordinal & 1) ? &m_d.b.l : &m_d.b.h) = data;   break;
166      default:                     fatalerror("Unexpected");                  break;
167   }
168}
169
170
171//-------------------------------------------------
119172//  ireg
120173//-------------------------------------------------
121174
r21595r21596
136189
137190
138191//-------------------------------------------------
192//  read_exgtfr_register
193//-------------------------------------------------
194
195ATTR_FORCE_INLINE m6809_base_device::exgtfr_register konami_cpu_device::read_exgtfr_register(UINT8 reg)
196{
197   exgtfr_register result;
198   result.word_value = 0x00FF;
199
200   switch(reg & 0x0F)
201   {
202      case  0: result.word_value = m_d.b.h;   break;   // A
203      case  1: result.word_value = m_d.b.l;   break;   // B
204      case  2: result.word_value = m_x.w;      break;   // X
205      case  3: result.word_value = m_y.w;      break;   // Y
206      case  4: result.word_value = m_s.w;      break;   // S
207      case  5: result.word_value = m_u.w;      break;   // U
208   }
209   result.byte_value = (UINT8) result.word_value;
210   return result;
211}
212
213
214//-------------------------------------------------
215//  write_exgtfr_register
216//-------------------------------------------------
217
218ATTR_FORCE_INLINE void konami_cpu_device::write_exgtfr_register(UINT8 reg, m6809_base_device::exgtfr_register value)
219{
220   switch(reg & 0x0F)
221   {
222      case  0: m_d.b.h = value.byte_value;   break;   // A
223      case  1: m_d.b.l = value.byte_value;   break;   // B
224      case  2: m_x.w   = value.word_value;   break;   // X
225      case  3: m_y.w   = value.word_value;   break;   // Y
226      case  4: m_s.w   = value.word_value;   break;   // S
227      case  5: m_u.w   = value.word_value;   break;   // U
228   }
229}
230
231
232//-------------------------------------------------
139233//  safe_shift_right
140234//-------------------------------------------------
141235
trunk/src/emu/cpu/m6809/base6x09.ops
r21595r21596
355355   eat(hd6309_native_mode() ? 0 : 1);
356356   return;
357357
358EXG:
359   {
360      UINT8 param = read_opcode_arg();
361      exgtfr_register reg1 = read_exgtfr_register(param >> 4);
362      exgtfr_register reg2 = read_exgtfr_register(param >> 0);
363      write_exgtfr_register(param >> 4, reg2);
364      write_exgtfr_register(param >> 0, reg1);
365   }
366   eat(hd6309_native_mode() ? 3 : 6);
367   return;
368
369TFR:
370   {
371      UINT8 param = read_opcode_arg();
372      exgtfr_register reg = read_exgtfr_register(param >> 4);
373      write_exgtfr_register(param >> 0, reg);
374   }
375   eat(hd6309_native_mode() ? 2 : 4);
376   return;
377
378358BRANCH:
379359   @m_temp.b.l = read_opcode_arg();
380360   eat(1);
trunk/src/emu/cpu/m6809/m6809.ops
r21595r21596
554554   @set_ea(m_temp.w);
555555   return;
556556
557EXG:
558   {
559      UINT8 param = read_opcode_arg();
560      exgtfr_register reg1 = read_exgtfr_register(param >> 4);
561      exgtfr_register reg2 = read_exgtfr_register(param >> 0);
562      write_exgtfr_register(param >> 4, reg2);
563      write_exgtfr_register(param >> 0, reg1);
564   }
565   eat(hd6309_native_mode() ? 3 : 6);
566   return;
567
568TFR:
569   {
570      UINT8 param = read_opcode_arg();
571      exgtfr_register reg = read_exgtfr_register(param >> 4);
572      write_exgtfr_register(param >> 0, reg);
573   }
574   eat(hd6309_native_mode() ? 2 : 4);
575   return;
576
557577ILLEGAL:
558578   log_illegal();
559579   return;
trunk/src/emu/cpu/m6809/konami.h
r21595r21596
5252   // incidentals
5353   konami_set_lines_func m_set_lines;
5454
55   // index reg
55   // konami-specific addressing modes
5656   UINT16 &ireg();
57   UINT8 read_operand();
58   UINT8 read_operand(int ordinal);
59   void write_operand(UINT8 data);
60   void write_operand(int ordinal, UINT8 data);
61   exgtfr_register read_exgtfr_register(UINT8 reg);
62   void write_exgtfr_register(UINT8 reg, exgtfr_register value);
5763
5864   // instructions
5965   void lmul();
trunk/src/emu/cpu/m6809/m6809.h
r21595r21596
202202   UINT8 &regop8()                           { assert(m_reg8 != NULL); return *m_reg8; }
203203   PAIR16 &regop16()                        { assert(m_reg16 != NULL); return *m_reg16; }
204204   bool is_register_register_op_16_bit()         { return m_reg16 != NULL; }
205   bool add8_sets_h()                        { return false; }
205   bool add8_sets_h()                        { return true; }
206206   bool hd6309_native_mode()                  { return false; }
207207
208208   // index reg

Previous 199869 Revisions Next


© 1997-2024 The MAME Team