diff options
Diffstat (limited to 'src/devices/cpu/mb86233/mb86233.cpp')
-rw-r--r-- | src/devices/cpu/mb86233/mb86233.cpp | 213 |
1 files changed, 103 insertions, 110 deletions
diff --git a/src/devices/cpu/mb86233/mb86233.cpp b/src/devices/cpu/mb86233/mb86233.cpp index 0b0ebba380e..28fba63498e 100644 --- a/src/devices/cpu/mb86233/mb86233.cpp +++ b/src/devices/cpu/mb86233/mb86233.cpp @@ -2,7 +2,6 @@ // copyright-holders:Olivier Galibert #include "emu.h" -#include "debugger.h" #include "mb86233.h" #include "mb86233d.h" @@ -88,16 +87,15 @@ std::unique_ptr<util::disasm_interface> mb86233_device::create_disassembler() void mb86233_device::device_start() { - m_program = &space(AS_PROGRAM); - m_cache = m_program->cache<2, -2, ENDIANNESS_LITTLE>(); - - m_data = &space(AS_DATA); - m_io = &space(AS_IO); - m_rf = &space(AS_RF); + space(AS_PROGRAM).cache(m_cache); + space(AS_PROGRAM).specific(m_program); + space(AS_DATA).specific(m_data); + space(AS_IO).specific(m_io); + space(AS_RF).specific(m_rf); state_add(STATE_GENPC, "GENPC", m_pc); state_add(STATE_GENPCBASE, "PC", m_ppc).noshow(); - state_add(STATE_GENSP, "SP", m_sp); + state_add(REG_SP, "SP", m_sp); state_add(STATE_GENFLAGS, "ST", m_st); state_add(REG_A, "A", m_a); @@ -167,22 +165,22 @@ void mb86233_device::state_string_export(const device_state_entry &entry, std::s { } -WRITE_LINE_MEMBER(mb86233_device::gpio0_w) +void mb86233_device::gpio0_w(int state) { m_gpio0 = state; } -WRITE_LINE_MEMBER(mb86233_device::gpio1_w) +void mb86233_device::gpio1_w(int state) { m_gpio1 = state; } -WRITE_LINE_MEMBER(mb86233_device::gpio2_w) +void mb86233_device::gpio2_w(int state) { m_gpio2 = state; } -WRITE_LINE_MEMBER(mb86233_device::gpio3_w) +void mb86233_device::gpio3_w(int state) { m_gpio3 = state; } @@ -224,14 +222,6 @@ void mb86233_device::device_reset() m_stall = false; } -s32 mb86233_device::s24_32(u32 val) -{ - if(val & 0x00800000) - return val | 0xff000000; - else - return val & 0x00ffffff; -} - u32 mb86233_device::set_exp(u32 val, u32 exp) { return (val & 0x807fffff) | ((exp & 0xff) << 23); @@ -266,16 +256,14 @@ void mb86233_device::pcs_pop() m_pcs[i] = m_pcs[i+1]; } -void mb86233_device::testdz() +void mb86233_device::stset_set_sz_int(u32 val) { - if(m_d) - m_st &= ~F_ZRD; - else - m_st |= F_ZRD; - if(m_d & 0x80000000) - m_st |= F_SGD; - else - m_st &= ~F_SGD; + m_alu_stset = val ? (val & 0x80000000 ? F_SGD : 0) : F_ZRD; +} + +void mb86233_device::stset_set_sz_fp(u32 val) +{ + m_alu_stset = (val & 0x7fffffff) ? (val & 0x80000000 ? F_SGD : 0) : F_ZRD; } void mb86233_device::alu_pre(u32 alu) @@ -287,7 +275,7 @@ void mb86233_device::alu_pre(u32 alu) // andd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d & m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -295,7 +283,7 @@ void mb86233_device::alu_pre(u32 alu) // orad m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d | m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -303,7 +291,7 @@ void mb86233_device::alu_pre(u32 alu) // eord m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d ^ m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -311,7 +299,7 @@ void mb86233_device::alu_pre(u32 alu) // notd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = ~m_d; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -319,15 +307,15 @@ void mb86233_device::alu_pre(u32 alu) // fcpd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; u32 r = f2u(u2f(m_d) - u2f(m_a)); - m_alu_stset = r ? r & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(r); break; } case 0x06: { - // fmad + // fadd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) + u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -335,7 +323,7 @@ void mb86233_device::alu_pre(u32 alu) // fsbd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) - u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -352,7 +340,7 @@ void mb86233_device::alu_pre(u32 alu) m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) + u2f(m_p)); m_alu_r2 = f2u(u2f(m_a) * u2f(m_b)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -361,7 +349,7 @@ void mb86233_device::alu_pre(u32 alu) m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) - u2f(m_p)); m_alu_r2 = f2u(u2f(m_a) * u2f(m_b)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -369,7 +357,7 @@ void mb86233_device::alu_pre(u32 alu) // fabd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d & 0x7fffffff; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -377,7 +365,7 @@ void mb86233_device::alu_pre(u32 alu) // fsmd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) + u2f(m_p)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -386,7 +374,7 @@ void mb86233_device::alu_pre(u32 alu) m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_p; m_alu_r2 = f2u(u2f(m_a) * u2f(m_b)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -394,7 +382,7 @@ void mb86233_device::alu_pre(u32 alu) // cxfd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(s32(m_d)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -407,7 +395,7 @@ void mb86233_device::alu_pre(u32 alu) case 2: m_alu_r1 = s32(floorf(u2f(m_d))); break; case 3: m_alu_r1 = s32(u2f(m_d)); break; } - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -415,7 +403,7 @@ void mb86233_device::alu_pre(u32 alu) // fdvd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) / u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -423,7 +411,7 @@ void mb86233_device::alu_pre(u32 alu) // fned m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d ? m_d ^ 0x80000000 : 0; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -431,7 +419,7 @@ void mb86233_device::alu_pre(u32 alu) // d = b + a m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_b) + u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -439,7 +427,7 @@ void mb86233_device::alu_pre(u32 alu) // d = b - a m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_b) - u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_fp(m_alu_r1); break; } @@ -447,7 +435,7 @@ void mb86233_device::alu_pre(u32 alu) // lsrd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d >> m_sft; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -455,7 +443,7 @@ void mb86233_device::alu_pre(u32 alu) // lsld m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d << m_sft; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -463,7 +451,7 @@ void mb86233_device::alu_pre(u32 alu) // asrd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = s32(m_d) >> m_sft; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -471,7 +459,7 @@ void mb86233_device::alu_pre(u32 alu) // asld m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = s32(m_d) << m_sft; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -479,7 +467,7 @@ void mb86233_device::alu_pre(u32 alu) // addd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d + m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -487,7 +475,7 @@ void mb86233_device::alu_pre(u32 alu) // subd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d - m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz_int(m_alu_r1); break; } @@ -563,12 +551,8 @@ void mb86233_device::ea_post_0(u32 r) return; if(!(r & 0x080)) m_x0 += m_i0; - else { - if(r & 0x10) - m_x0 += (r & 0xf) - 0x10; - else - m_x0 += r & 0xf; - } + else + m_x0 += util::sext(r, 5); } u16 mb86233_device::ea_pre_1(u32 r) @@ -594,19 +578,15 @@ void mb86233_device::ea_post_1(u32 r) return; if(!(r & 0x080)) m_x1 += m_i1; - else { - if(r & 0x10) - m_x1 += (r & 0xf) - 0x10; - else - m_x1 += r & 0xf; - } + else + m_x1 += util::sext(r, 5); } u32 mb86233_device::read_reg(u32 r) { r &= 0x3f; if(r >= 0x20 && r < 0x30) - return m_rf->read_dword(r & 0x1f); + return m_rf.read_dword(r & 0x1f); switch(r) { case 0x00: return m_b0; case 0x01: return m_b1; @@ -634,7 +614,7 @@ u32 mb86233_device::read_reg(u32 r) case 0x34: return m_rpc; default: - logerror("unimplemented read_reg(%02x)\n", r); + logerror("unimplemented read_reg(%02x) (%x)\n", r, m_ppc); return 0; } } @@ -643,7 +623,7 @@ void mb86233_device::write_reg(u32 r, u32 v) { r &= 0x3f; if(r >= 0x20 && r < 0x30) { - m_rf->write_dword(r & 0x1f, v); + m_rf.write_dword(r & 0x1f, v); return; } switch(r) { @@ -684,9 +664,9 @@ void mb86233_device::write_reg(u32 r, u32 v) case 0x14: m_b = set_exp(m_b, v); break; case 0x15: m_b = set_mant(m_b, v); break; /* c */ - case 0x19: m_d = v; testdz(); break; - case 0x1a: m_d = set_exp(m_d, v); testdz(); break; - case 0x1b: m_d = set_mant(m_d, v); testdz(); break; + case 0x19: m_d = v; break; + case 0x1a: m_d = set_exp(m_d, v); break; + case 0x1b: m_d = set_mant(m_d, v); break; case 0x1c: m_p = v; break; case 0x1d: m_p = set_exp(m_p, v); break; case 0x1e: m_p = set_mant(m_p, v); break; @@ -696,7 +676,7 @@ void mb86233_device::write_reg(u32 r, u32 v) case 0x3c: m_mask = v; break; default: - logerror("unimplemented write_reg(%02x, %08x)\n", r, v); + logerror("unimplemented write_reg(%02x, %08x) (%x)\n", r, v, m_ppc); break; } } @@ -706,14 +686,14 @@ void mb86233_device::write_mem_internal_1(u32 r, u32 v, bool bank) u16 ea = ea_pre_1(r); if(bank) ea += 0x200; - m_data->write_dword(ea, v); + m_data.write_dword(ea, v); ea_post_1(r); } void mb86233_device::write_mem_io_1(u32 r, u32 v) { u16 ea = ea_pre_1(r); - m_io->write_dword(ea, v); + m_io.write_dword(ea, v); ea_post_1(r); } @@ -722,7 +702,7 @@ void mb86233_device::execute_run() while(m_icount > 0) { m_ppc = m_pc; debugger_instruction_hook(m_ppc); - u32 opcode = m_cache->read_dword(m_pc++); + u32 opcode = m_cache.read_dword(m_pc++); switch((opcode >> 26) & 0x3f) { case 0x00: { @@ -739,11 +719,11 @@ void mb86233_device::execute_run() // lab mem, mem (e) u32 ea1 = ea_pre_0(r1); - u32 v1 = m_data->read_dword(ea1); + u32 v1 = m_data.read_dword(ea1); if(m_stall) goto do_stall; u32 ea2 = ea_pre_1(r2); - u32 v2 = m_io->read_dword(ea2); + u32 v2 = m_io.read_dword(ea2); if(m_stall) goto do_stall; ea_post_0(r1); @@ -758,11 +738,11 @@ void mb86233_device::execute_run() // lab mem, mem + 0x200 u32 ea1 = ea_pre_0(r1); - u32 v1 = m_data->read_dword(ea1); + u32 v1 = m_data.read_dword(ea1); if(m_stall) goto do_stall; u32 ea2 = ea_pre_1(r2) + 0x200; - u32 v2 = m_data->read_dword(ea2); + u32 v2 = m_data.read_dword(ea2); if(m_stall) goto do_stall; ea_post_0(r1); @@ -777,11 +757,11 @@ void mb86233_device::execute_run() // lab mem + 0x200, mem u32 ea1 = ea_pre_0(r1) + 0x200; - u32 v1 = m_data->read_dword(ea1); + u32 v1 = m_data.read_dword(ea1); if(m_stall) goto do_stall; u32 ea2 = ea_pre_1(r2); - u32 v2 = m_data->read_dword(ea2); + u32 v2 = m_data.read_dword(ea2); if(m_stall) goto do_stall; ea_post_0(r1); @@ -817,19 +797,21 @@ void mb86233_device::execute_run() case 0: { // mov mem, mem (e) u32 ea = ea_pre_0(r1); - u32 v = m_data->read_dword(ea); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(r1); + alu_post(alu); write_mem_io_1(r2, v); break; } case 1: { - // mov mem + 0x200, mem (e) - u32 ea = ea_pre_0(r1) + 0x200*0; - u32 v = m_data->read_dword(ea); + // mov mem, mem (e) + u32 ea = ea_pre_0(r1); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(r1); + alu_post(alu); write_mem_io_1(r2, v); break; } @@ -837,9 +819,10 @@ void mb86233_device::execute_run() case 2: { // mov mem (e), mem u32 ea = ea_pre_0(r1); - u32 v = m_io->read_dword(ea); + u32 v = m_io.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(r1); + alu_post(alu); write_mem_internal_1(r2, v, false); break; } @@ -847,9 +830,10 @@ void mb86233_device::execute_run() case 3: { // mov mem, mem + 0x200 u32 ea = ea_pre_0(r1); - u32 v = m_data->read_dword(ea); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(r1); + alu_post(alu); write_mem_internal_1(r2, v, true); break; } @@ -857,9 +841,10 @@ void mb86233_device::execute_run() case 4: { // mov mem + 0x200, mem u32 ea = ea_pre_0(r1) + 0x200; - u32 v = m_data->read_dword(ea); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(r1); + alu_post(alu); write_mem_internal_1(r2, v, false); break; } @@ -867,9 +852,10 @@ void mb86233_device::execute_run() case 5: { // mov mem (o), mem u32 ea = ea_pre_0(r1); - u32 v = m_program->read_dword(ea); + u32 v = m_program.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(r1); + alu_post(alu); write_mem_internal_1(r2, v, false); break; } @@ -880,6 +866,7 @@ void mb86233_device::execute_run() // mov reg, mem u32 v = read_reg(r2); if(m_stall) goto do_stall; + alu_post(alu); write_mem_internal_1(r1, v, false); break; } @@ -888,6 +875,7 @@ void mb86233_device::execute_run() // mov reg, mem (e) u32 v = read_reg(r2); if(m_stall) goto do_stall; + alu_post(alu); write_mem_io_1(r1, v); break; } @@ -895,9 +883,10 @@ void mb86233_device::execute_run() case 2: { // mov mem + 0x200, reg u32 ea = ea_pre_1(r1) + 0x200; - u32 v = m_data->read_dword(ea); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_1(r1); + alu_post(alu); write_reg(r2, v); break; } @@ -905,9 +894,10 @@ void mb86233_device::execute_run() case 3: { // mov mem, reg u32 ea = ea_pre_1(r1); - u32 v = m_data->read_dword(ea); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_1(r1); + alu_post(alu); write_reg(r2, v); break; } @@ -915,9 +905,10 @@ void mb86233_device::execute_run() case 4: { // mov mem (e), reg u32 ea = ea_pre_1(r1); - u32 v = m_io->read_dword(ea); + u32 v = m_io.read_dword(ea); if(m_stall) goto do_stall; ea_post_1(r1); + alu_post(alu); write_reg(r2, v); break; } @@ -925,9 +916,10 @@ void mb86233_device::execute_run() case 5: { // mov mem (o), reg u32 ea = ea_pre_0(r1); - u32 v = m_program->read_dword(ea); + u32 v = m_program.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(r1); + alu_post(alu); write_reg(r2, v); break; } @@ -936,23 +928,25 @@ void mb86233_device::execute_run() // mov reg, reg u32 v = read_reg(r1); if(m_stall) goto do_stall; + alu_post(alu); write_reg(r2, v); break; } default: - logerror("unhandler ld/mov subop 7/%x\n", r2 >> 6); + alu_post(alu); + logerror("unhandled ld/mov subop 7/%x (%x)\n", r2 >> 6, m_ppc); break; } break; } default: - logerror("unhandler ld/mov subop %x\n", op); + alu_post(alu); + logerror("unhandled ld/mov subop %x (%x)\n", op, m_ppc); break; } - alu_post(alu); break; } @@ -971,7 +965,7 @@ void mb86233_device::execute_run() break; default: - logerror("unimplemented opcode 0d/%x\n", sub2); + logerror("unimplemented opcode 0d/%x (%x)\n", sub2, m_ppc); break; } break; @@ -984,14 +978,13 @@ void mb86233_device::execute_run() m_p = (m_p & 0xffffff000000) | (opcode & 0xffffff); break; case 1: - m_a = s24_32(opcode); + m_a = util::sext(opcode, 24); break; case 2: - m_b = s24_32(opcode); + m_b = util::sext(opcode, 24); break; case 3: - m_d = s24_32(opcode); - testdz(); + m_d = util::sext(opcode, 24); break; } break; @@ -1030,7 +1023,7 @@ void mb86233_device::execute_run() break; default: - logerror("unimplemented opcode 0f/%x\n", sub2); + logerror("unimplemented opcode 0f/%x (%x)\n", sub2, m_ppc); break; } @@ -1041,7 +1034,7 @@ void mb86233_device::execute_run() case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: { // ldi - write_reg(opcode >> 24, s24_32(opcode)); + write_reg(opcode >> 24, util::sext(opcode, 24)); break; } @@ -1096,7 +1089,7 @@ void mb86233_device::execute_run() break; default: - logerror("unimplemented condition %x\n", cond); + logerror("unimplemented condition %x (%x)\n", cond, m_ppc); break; } if(invert) @@ -1117,7 +1110,7 @@ void mb86233_device::execute_run() } else { // brul adr u32 ea = ea_pre_0(opcode); - u32 v = m_data->read_dword(ea); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(opcode); m_pc = v; @@ -1139,7 +1132,7 @@ void mb86233_device::execute_run() } else { // bsul adr u32 ea = ea_pre_0(opcode); - u32 v = m_data->read_dword(ea); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(opcode); pcs_push(); @@ -1153,7 +1146,7 @@ void mb86233_device::execute_run() case 6: { // ldif adr, rn u32 ea = ea_pre_0(opcode); - u32 v = m_data->read_dword(ea); + u32 v = m_data.read_dword(ea); if(m_stall) goto do_stall; ea_post_0(opcode); write_reg(opcode >> 9, v); @@ -1161,7 +1154,7 @@ void mb86233_device::execute_run() } default: - logerror("unimplemented branch subtype %x\n", subtype); + logerror("unimplemented branch subtype %x (%x)\n", subtype, m_ppc); break; } } @@ -1189,7 +1182,7 @@ void mb86233_device::execute_run() } default: - logerror("unimplemented opcode type %02x\n", (opcode >> 26) & 0x3f); + logerror("unimplemented opcode type %02x (%x)\n", (opcode >> 26) & 0x3f, m_ppc); break; } |