mirror of
https://github.com/holub/mame
synced 2025-05-16 10:52:43 +03:00
Konami CPU fixes; simpsons gets further now (nw)
This commit is contained in:
parent
2b4177249e
commit
86416c03e1
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -202,7 +202,7 @@ protected:
|
|||||||
UINT8 ®op8() { assert(m_reg8 != NULL); return *m_reg8; }
|
UINT8 ®op8() { assert(m_reg8 != NULL); return *m_reg8; }
|
||||||
PAIR16 ®op16() { assert(m_reg16 != NULL); return *m_reg16; }
|
PAIR16 ®op16() { 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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user