trunk/src/emu/cpu/m6809/m6809.c
| r21710 | r21711 | |
| 471 | 471 | |
| 472 | 472 | |
| 473 | 473 | //------------------------------------------------- |
| 474 | // read_exgtfr_register |
| 475 | //------------------------------------------------- |
| 476 | |
| 477 | ATTR_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 | |
| 504 | ATTR_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 | //------------------------------------------------- |
| 474 | 523 | // log_illegal - used to log hits to illegal |
| 475 | 524 | // instructions (except for HD6309 which traps) |
| 476 | 525 | //------------------------------------------------- |
trunk/src/emu/cpu/m6809/m6809inl.h
| r21710 | r21711 | |
| 146 | 146 | |
| 147 | 147 | |
| 148 | 148 | //------------------------------------------------- |
| 149 | | // read_exgtfr_register |
| 150 | | //------------------------------------------------- |
| 151 | | |
| 152 | | inline 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 | | |
| 179 | | inline 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 | | //------------------------------------------------- |
| 198 | 149 | // daa - decimal arithmetic adjustment instruction |
| 199 | 150 | //------------------------------------------------- |
| 200 | 151 | |
trunk/src/emu/cpu/m6809/konami.ops
| r21710 | r21711 | |
| 429 | 429 | |
| 430 | 430 | EXG: |
| 431 | 431 | { |
| 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 |
| 433 | 433 | UINT8 param = read_opcode_arg(); |
| 434 | 434 | exgtfr_register reg1 = read_exgtfr_register(param >> 0); |
| 435 | 435 | 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); |
| 438 | 438 | } |
| 439 | 439 | eat(hd6309_native_mode() ? 3 : 6); |
| 440 | 440 | return; |