diff options
author | 2013-03-05 13:48:02 +0000 | |
---|---|---|
committer | 2013-03-05 13:48:02 +0000 | |
commit | 86416c03e1398dadd990f5cb8ab602adecab0ec1 (patch) | |
tree | 16544de2a6a96fa8cd05a2804298475c8ac5d347 /src/emu/cpu | |
parent | 2b4177249efc6e42c756bf150be5ef5d7ed8089b (diff) |
Konami CPU fixes; simpsons gets further now (nw)
Diffstat (limited to 'src/emu/cpu')
-rw-r--r-- | src/emu/cpu/m6809/base6x09.ops | 20 | ||||
-rw-r--r-- | src/emu/cpu/m6809/hd6309.ops | 20 | ||||
-rw-r--r-- | src/emu/cpu/m6809/konami.c | 94 | ||||
-rw-r--r-- | src/emu/cpu/m6809/konami.h | 8 | ||||
-rw-r--r-- | src/emu/cpu/m6809/konami.ops | 28 | ||||
-rw-r--r-- | src/emu/cpu/m6809/m6809.h | 2 | ||||
-rw-r--r-- | src/emu/cpu/m6809/m6809.ops | 20 |
7 files changed, 170 insertions, 22 deletions
diff --git a/src/emu/cpu/m6809/base6x09.ops b/src/emu/cpu/m6809/base6x09.ops index f75bc8c5b84..95c9513327a 100644 --- a/src/emu/cpu/m6809/base6x09.ops +++ b/src/emu/cpu/m6809/base6x09.ops @@ -355,26 +355,6 @@ SEX: eat(hd6309_native_mode() ? 0 : 1); return; -EXG: - { - UINT8 param = read_opcode_arg(); - exgtfr_register reg1 = read_exgtfr_register(param >> 4); - exgtfr_register reg2 = read_exgtfr_register(param >> 0); - write_exgtfr_register(param >> 4, reg2); - write_exgtfr_register(param >> 0, reg1); - } - eat(hd6309_native_mode() ? 3 : 6); - return; - -TFR: - { - UINT8 param = read_opcode_arg(); - exgtfr_register reg = read_exgtfr_register(param >> 4); - write_exgtfr_register(param >> 0, reg); - } - eat(hd6309_native_mode() ? 2 : 4); - return; - BRANCH: @m_temp.b.l = read_opcode_arg(); eat(1); diff --git a/src/emu/cpu/m6809/hd6309.ops b/src/emu/cpu/m6809/hd6309.ops index f7ee1f50a4a..1bd47956220 100644 --- a/src/emu/cpu/m6809/hd6309.ops +++ b/src/emu/cpu/m6809/hd6309.ops @@ -796,6 +796,26 @@ INDEXED: @set_ea(m_temp.w); return; +EXG: + { + UINT8 param = read_opcode_arg(); + exgtfr_register reg1 = read_exgtfr_register(param >> 4); + exgtfr_register reg2 = read_exgtfr_register(param >> 0); + write_exgtfr_register(param >> 4, reg2); + write_exgtfr_register(param >> 0, reg1); + } + eat(hd6309_native_mode() ? 3 : 6); + return; + +TFR: + { + UINT8 param = read_opcode_arg(); + exgtfr_register reg = read_exgtfr_register(param >> 4); + write_exgtfr_register(param >> 0, reg); + } + eat(hd6309_native_mode() ? 2 : 4); + return; + ILLEGAL: m_md |= 0x40; // illegal op flag set_ea(VECTOR_ILLEGAL); diff --git a/src/emu/cpu/m6809/konami.c b/src/emu/cpu/m6809/konami.c index bcaa82673a3..ed09268f4c5 100644 --- a/src/emu/cpu/m6809/konami.c +++ b/src/emu/cpu/m6809/konami.c @@ -116,6 +116,59 @@ offs_t konami_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT //------------------------------------------------- +// read_operand +//------------------------------------------------- + +inline ATTR_FORCE_INLINE UINT8 konami_cpu_device::read_operand() +{ + return super::read_operand(); +} + + +//------------------------------------------------- +// read_operand +//------------------------------------------------- + +inline ATTR_FORCE_INLINE UINT8 konami_cpu_device::read_operand(int ordinal) +{ + switch(m_addressing_mode) + { + case ADDRESSING_MODE_EA: return read_memory(m_ea.w + ordinal); + case ADDRESSING_MODE_IMMEDIATE: return read_opcode_arg(); + case ADDRESSING_MODE_REGISTER_D: return (ordinal & 1) ? m_d.b.l : m_d.b.h; + default: fatalerror("Unexpected"); return 0x00; + } +} + + +//------------------------------------------------- +// write_operand +//------------------------------------------------- + +ATTR_FORCE_INLINE void konami_cpu_device::write_operand(UINT8 data) +{ + super::write_operand(data); +} + + + +//------------------------------------------------- +// write_operand +//------------------------------------------------- + +ATTR_FORCE_INLINE void konami_cpu_device::write_operand(int ordinal, UINT8 data) +{ + switch(m_addressing_mode) + { + case ADDRESSING_MODE_IMMEDIATE: /* do nothing */ break; + case ADDRESSING_MODE_EA: write_memory(m_ea.w + ordinal, data); break; + case ADDRESSING_MODE_REGISTER_D: *((ordinal & 1) ? &m_d.b.l : &m_d.b.h) = data; break; + default: fatalerror("Unexpected"); break; + } +} + + +//------------------------------------------------- // ireg //------------------------------------------------- @@ -136,6 +189,47 @@ ATTR_FORCE_INLINE UINT16 &konami_cpu_device::ireg() //------------------------------------------------- +// read_exgtfr_register +//------------------------------------------------- + +ATTR_FORCE_INLINE m6809_base_device::exgtfr_register konami_cpu_device::read_exgtfr_register(UINT8 reg) +{ + exgtfr_register result; + result.word_value = 0x00FF; + + switch(reg & 0x0F) + { + case 0: result.word_value = m_d.b.h; break; // A + case 1: result.word_value = m_d.b.l; break; // B + case 2: result.word_value = m_x.w; break; // X + case 3: result.word_value = m_y.w; break; // Y + case 4: result.word_value = m_s.w; break; // S + case 5: result.word_value = m_u.w; break; // U + } + result.byte_value = (UINT8) result.word_value; + return result; +} + + +//------------------------------------------------- +// write_exgtfr_register +//------------------------------------------------- + +ATTR_FORCE_INLINE void konami_cpu_device::write_exgtfr_register(UINT8 reg, m6809_base_device::exgtfr_register value) +{ + switch(reg & 0x0F) + { + case 0: m_d.b.h = value.byte_value; break; // A + case 1: m_d.b.l = value.byte_value; break; // B + case 2: m_x.w = value.word_value; break; // X + case 3: m_y.w = value.word_value; break; // Y + case 4: m_s.w = value.word_value; break; // S + case 5: m_u.w = value.word_value; break; // U + } +} + + +//------------------------------------------------- // safe_shift_right //------------------------------------------------- diff --git a/src/emu/cpu/m6809/konami.h b/src/emu/cpu/m6809/konami.h index c756f333b8f..3b8abf0d8f0 100644 --- a/src/emu/cpu/m6809/konami.h +++ b/src/emu/cpu/m6809/konami.h @@ -52,8 +52,14 @@ private: // incidentals konami_set_lines_func m_set_lines; - // index reg + // konami-specific addressing modes UINT16 &ireg(); + UINT8 read_operand(); + UINT8 read_operand(int ordinal); + void write_operand(UINT8 data); + void write_operand(int ordinal, UINT8 data); + exgtfr_register read_exgtfr_register(UINT8 reg); + void write_exgtfr_register(UINT8 reg, exgtfr_register value); // instructions void lmul(); diff --git a/src/emu/cpu/m6809/konami.ops b/src/emu/cpu/m6809/konami.ops index a4d2b30dd7c..fae445cf115 100644 --- a/src/emu/cpu/m6809/konami.ops +++ b/src/emu/cpu/m6809/konami.ops @@ -210,11 +210,17 @@ MAIN: case 0xBF: %INDEXED; %ASLD; return; case 0xC0: %ROLD; return; + case 0xC1: %INDEXED; %ROL16; return; case 0xC2: set_d(); %CLR16; return; + case 0xC3: %INDEXED; %CLR16; return; case 0xC4: set_d(); %NEG16; return; + case 0xC5: %INDEXED; %NEG16; return; case 0xC6: set_d(); %INC16; return; + case 0xC7: %INDEXED; %INC16; return; case 0xC8: set_d(); %DEC16; return; + case 0xC9: %INDEXED; %DEC16; return; case 0xCA: set_d(); %TST16; return; + case 0xCB: %INDEXED; %TST16; return; case 0xCC: set_a(); %ABS8; return; case 0xCD: set_b(); %ABS8; return; case 0xCE: set_d(); %ABS16; return; @@ -421,6 +427,28 @@ INDEXED: set_ea(m_temp.w); return; +EXG: + { + // konami's TFR instruction differs enough from 6809 to fork the code + UINT8 param = read_opcode_arg(); + exgtfr_register reg1 = read_exgtfr_register(param >> 0); + exgtfr_register reg2 = read_exgtfr_register(param >> 4); + write_exgtfr_register(param >> 4, reg2); + write_exgtfr_register(param >> 0, reg1); + } + eat(hd6309_native_mode() ? 3 : 6); + return; + +TFR: + { + // konami's TFR instruction differs enough from 6809 to fork the code + UINT8 param = read_opcode_arg(); + exgtfr_register reg = read_exgtfr_register(param >> 0); + write_exgtfr_register((param >> 4) & 0x07, reg); + } + eat(hd6309_native_mode() ? 2 : 4); + return; + SETLINE: @set_lines(read_operand()); return; diff --git a/src/emu/cpu/m6809/m6809.h b/src/emu/cpu/m6809/m6809.h index 902ace71366..655b854ae83 100644 --- a/src/emu/cpu/m6809/m6809.h +++ b/src/emu/cpu/m6809/m6809.h @@ -202,7 +202,7 @@ protected: UINT8 ®op8() { assert(m_reg8 != NULL); return *m_reg8; } PAIR16 ®op16() { assert(m_reg16 != NULL); return *m_reg16; } bool is_register_register_op_16_bit() { return m_reg16 != NULL; } - bool add8_sets_h() { return false; } + bool add8_sets_h() { return true; } bool hd6309_native_mode() { return false; } // index reg diff --git a/src/emu/cpu/m6809/m6809.ops b/src/emu/cpu/m6809/m6809.ops index 9cbabe41ef1..a8026459554 100644 --- a/src/emu/cpu/m6809/m6809.ops +++ b/src/emu/cpu/m6809/m6809.ops @@ -554,6 +554,26 @@ INDEXED: @set_ea(m_temp.w); return; +EXG: + { + UINT8 param = read_opcode_arg(); + exgtfr_register reg1 = read_exgtfr_register(param >> 4); + exgtfr_register reg2 = read_exgtfr_register(param >> 0); + write_exgtfr_register(param >> 4, reg2); + write_exgtfr_register(param >> 0, reg1); + } + eat(hd6309_native_mode() ? 3 : 6); + return; + +TFR: + { + UINT8 param = read_opcode_arg(); + exgtfr_register reg = read_exgtfr_register(param >> 4); + write_exgtfr_register(param >> 0, reg); + } + eat(hd6309_native_mode() ? 2 : 4); + return; + ILLEGAL: log_illegal(); return; |