summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mb86233/mb86233.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mb86233/mb86233.cpp')
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp213
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;
}