From 6c77efba69ef4dedc77226fc8c050241a56cb571 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Tue, 17 Jan 2017 17:39:12 +0800 Subject: [PATCH] fix instruction fetch alignment --- src/devices/cpu/clipper/clipper.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/devices/cpu/clipper/clipper.cpp b/src/devices/cpu/clipper/clipper.cpp index c06f2e42a40..ad33237e194 100644 --- a/src/devices/cpu/clipper/clipper.cpp +++ b/src/devices/cpu/clipper/clipper.cpp @@ -211,7 +211,10 @@ void clipper_device::decode_instruction (uint16_t insn) else { // fetch 32 bit immediate and sign extend - m_info.op.imm = (int32_t)m_program->read_dword(m_pc + 2); + if ((m_pc & 0x2) == 0) + m_info.op.imm = (int32_t)(m_program->read_word(m_pc + 2) | (m_program->read_word(m_pc + 4) << 16)); + else + m_info.op.imm = (int32_t)m_program->read_dword(m_pc + 2); m_info.size = 6; } } @@ -225,19 +228,28 @@ void clipper_device::decode_instruction (uint16_t insn) { case ADDR_MODE_PC32: m_info.op.r2 = R2; - m_info.address = m_pc + (int32_t)m_program->read_dword(m_pc + 2); + if ((m_pc & 0x2) == 0) + m_info.address = m_pc + (int32_t)(m_program->read_word(m_pc + 2) | (m_program->read_word(m_pc + 4) << 16)); + else + m_info.address = m_pc + (int32_t)m_program->read_dword(m_pc + 2); m_info.size = 6; break; case ADDR_MODE_ABS32: m_info.op.r2 = R2; - m_info.address = m_program->read_dword(m_pc + 2); + if ((m_pc & 0x2) == 0) + m_info.address = (m_program->read_word(m_pc + 2) | (m_program->read_word(m_pc + 4) << 16)); + else + m_info.address = m_program->read_dword(m_pc + 2); m_info.size = 6; break; case ADDR_MODE_REL32: m_info.op.r2 = m_program->read_word(m_pc + 2) & 0xf; - m_info.address = m_r[R2] + (int32_t)m_program->read_dword(m_pc + 4); + if ((m_pc & 0x2) == 0) + m_info.address = m_r[R2] + (int32_t)m_program->read_dword(m_pc + 4); + else + m_info.address = m_r[R2] + (int32_t)(m_program->read_word(m_pc + 4) | (m_program->read_word(m_pc + 6) << 16)); m_info.size = 8; break;