Konami CPU fixes; simpsons gets further now (nw)

This commit is contained in:
Nathan Woods 2013-03-05 13:48:02 +00:00
parent 2b4177249e
commit 86416c03e1
7 changed files with 170 additions and 22 deletions

View File

@ -355,26 +355,6 @@ SEX:
eat(hd6309_native_mode() ? 0 : 1); eat(hd6309_native_mode() ? 0 : 1);
return; 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: BRANCH:
@m_temp.b.l = read_opcode_arg(); @m_temp.b.l = read_opcode_arg();
eat(1); eat(1);

View File

@ -796,6 +796,26 @@ INDEXED:
@set_ea(m_temp.w); @set_ea(m_temp.w);
return; 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: ILLEGAL:
m_md |= 0x40; // illegal op flag m_md |= 0x40; // illegal op flag
set_ea(VECTOR_ILLEGAL); set_ea(VECTOR_ILLEGAL);

View File

@ -115,6 +115,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 // ireg
//------------------------------------------------- //-------------------------------------------------
@ -135,6 +188,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 // safe_shift_right
//------------------------------------------------- //-------------------------------------------------

View File

@ -52,8 +52,14 @@ private:
// incidentals // incidentals
konami_set_lines_func m_set_lines; konami_set_lines_func m_set_lines;
// index reg // konami-specific addressing modes
UINT16 &ireg(); 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 // instructions
void lmul(); void lmul();

View File

@ -210,11 +210,17 @@ MAIN:
case 0xBF: %INDEXED; %ASLD; return; case 0xBF: %INDEXED; %ASLD; return;
case 0xC0: %ROLD; return; case 0xC0: %ROLD; return;
case 0xC1: %INDEXED; %ROL16; return;
case 0xC2: set_d(); %CLR16; return; case 0xC2: set_d(); %CLR16; return;
case 0xC3: %INDEXED; %CLR16; return;
case 0xC4: set_d(); %NEG16; return; case 0xC4: set_d(); %NEG16; return;
case 0xC5: %INDEXED; %NEG16; return;
case 0xC6: set_d(); %INC16; return; case 0xC6: set_d(); %INC16; return;
case 0xC7: %INDEXED; %INC16; return;
case 0xC8: set_d(); %DEC16; return; case 0xC8: set_d(); %DEC16; return;
case 0xC9: %INDEXED; %DEC16; return;
case 0xCA: set_d(); %TST16; return; case 0xCA: set_d(); %TST16; return;
case 0xCB: %INDEXED; %TST16; return;
case 0xCC: set_a(); %ABS8; return; case 0xCC: set_a(); %ABS8; return;
case 0xCD: set_b(); %ABS8; return; case 0xCD: set_b(); %ABS8; return;
case 0xCE: set_d(); %ABS16; return; case 0xCE: set_d(); %ABS16; return;
@ -421,6 +427,28 @@ INDEXED:
set_ea(m_temp.w); set_ea(m_temp.w);
return; 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: SETLINE:
@set_lines(read_operand()); @set_lines(read_operand());
return; return;

View File

@ -202,7 +202,7 @@ protected:
UINT8 &regop8() { assert(m_reg8 != NULL); return *m_reg8; } UINT8 &regop8() { assert(m_reg8 != NULL); return *m_reg8; }
PAIR16 &regop16() { assert(m_reg16 != NULL); return *m_reg16; } PAIR16 &regop16() { assert(m_reg16 != NULL); return *m_reg16; }
bool is_register_register_op_16_bit() { return m_reg16 != NULL; } 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; } bool hd6309_native_mode() { return false; }
// index reg // index reg

View File

@ -554,6 +554,26 @@ INDEXED:
@set_ea(m_temp.w); @set_ea(m_temp.w);
return; 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: ILLEGAL:
log_illegal(); log_illegal();
return; return;