summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu
diff options
context:
space:
mode:
author Nathan Woods <npwoods@mess.org>2013-03-05 13:48:02 +0000
committer Nathan Woods <npwoods@mess.org>2013-03-05 13:48:02 +0000
commit86416c03e1398dadd990f5cb8ab602adecab0ec1 (patch)
tree16544de2a6a96fa8cd05a2804298475c8ac5d347 /src/emu/cpu
parent2b4177249efc6e42c756bf150be5ef5d7ed8089b (diff)
Konami CPU fixes; simpsons gets further now (nw)
Diffstat (limited to 'src/emu/cpu')
-rw-r--r--src/emu/cpu/m6809/base6x09.ops20
-rw-r--r--src/emu/cpu/m6809/hd6309.ops20
-rw-r--r--src/emu/cpu/m6809/konami.c94
-rw-r--r--src/emu/cpu/m6809/konami.h8
-rw-r--r--src/emu/cpu/m6809/konami.ops28
-rw-r--r--src/emu/cpu/m6809/m6809.h2
-rw-r--r--src/emu/cpu/m6809/m6809.ops20
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 &regop8() { assert(m_reg8 != NULL); return *m_reg8; }
PAIR16 &regop16() { 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;