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.cpp160
1 files changed, 76 insertions, 84 deletions
diff --git a/src/devices/cpu/mb86233/mb86233.cpp b/src/devices/cpu/mb86233/mb86233.cpp
index 7a67599408a..6a5451c0095 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);
@@ -278,6 +268,16 @@ void mb86233_device::testdz()
m_st &= ~F_SGD;
}
+void mb86233_device::stset_set_sz_int(u32 val)
+{
+ 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)
{
switch(alu) {
@@ -287,7 +287,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 +295,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 +303,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 +311,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,7 +319,7 @@ 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;
}
@@ -327,7 +327,7 @@ void mb86233_device::alu_pre(u32 alu)
// fmad
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 +335,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 +352,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 +361,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 +369,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 +377,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 +386,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 +394,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 +407,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 +415,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 +423,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 +431,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 +439,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 +447,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 +455,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 +463,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 +471,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 +479,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 +487,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 +563,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 +590,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;
@@ -643,7 +635,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) {
@@ -706,14 +698,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 +714,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 +731,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 +750,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 +769,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,7 +809,7 @@ 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);
write_mem_io_1(r2, v);
@@ -827,7 +819,7 @@ void mb86233_device::execute_run()
case 1: {
// 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);
write_mem_io_1(r2, v);
@@ -837,7 +829,7 @@ 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);
write_mem_internal_1(r2, v, false);
@@ -847,7 +839,7 @@ 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);
write_mem_internal_1(r2, v, true);
@@ -857,7 +849,7 @@ 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);
write_mem_internal_1(r2, v, false);
@@ -867,7 +859,7 @@ 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);
write_mem_internal_1(r2, v, false);
@@ -895,7 +887,7 @@ 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);
write_reg(r2, v);
@@ -905,7 +897,7 @@ 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);
write_reg(r2, v);
@@ -915,7 +907,7 @@ 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);
write_reg(r2, v);
@@ -925,7 +917,7 @@ 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);
write_reg(r2, v);
@@ -984,13 +976,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);
+ m_d = util::sext(opcode, 24);
testdz();
break;
}
@@ -1041,7 +1033,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;
}
@@ -1117,7 +1109,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 +1131,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 +1145,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);