diff options
Diffstat (limited to 'src/devices/cpu/mb86233/mb86233.cpp')
-rw-r--r-- | src/devices/cpu/mb86233/mb86233.cpp | 160 |
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); |