diff options
Diffstat (limited to 'src/devices/cpu/unsp/unsp.cpp')
-rw-r--r-- | src/devices/cpu/unsp/unsp.cpp | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/src/devices/cpu/unsp/unsp.cpp b/src/devices/cpu/unsp/unsp.cpp index 6a47bf61dd2..6a815b7f441 100644 --- a/src/devices/cpu/unsp/unsp.cpp +++ b/src/devices/cpu/unsp/unsp.cpp @@ -20,10 +20,10 @@ #include "unsp.h" #include "unspfe.h" -#include "debugger.h" - #include "unspdasm.h" +#include <climits> + DEFINE_DEVICE_TYPE(UNSP, unsp_device, "unsp", "SunPlus u'nSP (ISA 1.0)") // 1.1 is just 1.0 with better CPI? DEFINE_DEVICE_TYPE(UNSP_11, unsp_11_device, "unsp_11", "SunPlus u'nSP (ISA 1.1)") @@ -39,12 +39,11 @@ unsp_device::unsp_device(const machine_config &mconfig, device_type type, const : cpu_device(mconfig, type, tag, owner, clock) , m_core(nullptr) , m_program_config("program", ENDIANNESS_BIG, 16, 23, -1, internal) - , m_program(nullptr) , m_debugger_temp(0) #if UNSP_LOG_OPCODES || UNSP_LOG_REGS , m_log_ops(0) #endif - , m_cache(CACHE_SIZE + sizeof(unsp_device)) + , m_drccache(CACHE_SIZE + sizeof(unsp_device)) , m_drcuml(nullptr) , m_drcfe(nullptr) , m_drcoptions(0) @@ -58,6 +57,7 @@ unsp_device::unsp_device(const machine_config &mconfig, device_type type, const , m_mem_read(nullptr) , m_mem_write(nullptr) , m_enable_drc(false) + , m_vectorbase(0xfff0) { m_iso = 10; m_numregs = 8; @@ -191,7 +191,7 @@ void unsp_device::unimplemented_opcode(uint16_t op, uint16_t ximm, uint16_t ximm void unsp_device::device_start() { - m_core = (internal_unsp_state *)m_cache.alloc_near(sizeof(internal_unsp_state)); + m_core = (internal_unsp_state *)m_drccache.alloc_near(sizeof(internal_unsp_state)); memset(m_core, 0, sizeof(internal_unsp_state)); #if ENABLE_UNSP_DRC @@ -209,13 +209,11 @@ void unsp_device::device_start() m_debugger_temp = 0; - m_program = &space(AS_PROGRAM); - auto cache = m_program->cache<1, -1, ENDIANNESS_BIG>(); - m_pr16 = [cache](offs_t address) -> u16 { return cache->read_word(address); }; - m_prptr = [cache](offs_t address) -> const void * { return cache->read_ptr(address); }; + space(AS_PROGRAM).cache(m_cache); + space(AS_PROGRAM).specific(m_program); uint32_t umlflags = 0; - m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, umlflags, 1, 23, 0); + m_drcuml = std::make_unique<drcuml_state>(*this, m_drccache, umlflags, 1, 23, 0); // add UML symbols- m_drcuml->symbol_add(&m_core->m_r[REG_SP], sizeof(uint32_t), "SP"); @@ -257,11 +255,11 @@ void unsp_device::device_start() state_add(UNSP_FIQ_EN, "FIQE", m_core->m_enable_fiq).formatstr("%1u"); state_add(UNSP_FIR_MOV_EN, "FIR_MOV", m_core->m_fir_move).formatstr("%1u"); state_add(UNSP_SB, "SB", m_core->m_sb).formatstr("%1X"); - state_add(UNSP_AQ, "AQ", m_core->m_sb).formatstr("%1u"); - state_add(UNSP_FRA, "FRA", m_core->m_sb).formatstr("%1u"); - state_add(UNSP_BNK, "BNK", m_core->m_sb).formatstr("%1u"); - state_add(UNSP_INE, "INE", m_core->m_sb).formatstr("%1u"); - state_add(UNSP_PRI, "PRI", m_core->m_sb).formatstr("%1u"); + state_add(UNSP_AQ, "AQ", m_core->m_aq).formatstr("%1u"); + state_add(UNSP_FRA, "FRA", m_core->m_fra).formatstr("%1u"); + state_add(UNSP_BNK, "BNK", m_core->m_bnk).formatstr("%1u"); + state_add(UNSP_INE, "INE", m_core->m_ine).formatstr("%1u"); + state_add(UNSP_PRI, "PRI", m_core->m_pri).formatstr("%1u"); #if UNSP_LOG_OPCODES || UNSP_LOG_REGS state_add(UNSP_LOG_OPS,"LOG", m_log_ops).formatstr("%1u"); #endif @@ -281,6 +279,9 @@ void unsp_device::device_start() save_item(NAME(m_core->m_bnk)); save_item(NAME(m_core->m_ine)); save_item(NAME(m_core->m_pri)); + save_item(NAME(m_core->m_divq_bit)); + save_item(NAME(m_core->m_divq_dividend)); + save_item(NAME(m_core->m_divq_divisor)); set_icountptr(m_core->m_icount); } @@ -307,7 +308,7 @@ void unsp_20_device::device_start() void unsp_device::device_reset() { - for (int i = 0; i < ARRAY_LENGTH(m_core->m_r); i++) + for (int i = 0; i < std::size(m_core->m_r); i++) { if (i < m_numregs) m_core->m_r[i] = 0; @@ -315,7 +316,7 @@ void unsp_device::device_reset() m_core->m_r[i] = 0xdeadbeef; } - m_core->m_r[REG_PC] = read16(0xfff7); + m_core->m_r[REG_PC] = read16(m_vectorbase + 0x7); m_core->m_enable_irq = 0; m_core->m_enable_fiq = 0; m_core->m_fir_move = 1; @@ -328,6 +329,7 @@ void unsp_device::device_reset() m_core->m_fiq = 0; m_core->m_irq = 0; m_core->m_sirq = 0; + m_core->m_divq_bit = UINT_MAX; } void unsp_20_device::device_reset() @@ -447,13 +449,13 @@ inline void unsp_device::trigger_fiq() if (!m_core->m_enable_fiq || m_core->m_fiq) return; + standard_irq_callback(UNSP_FIQ_LINE, m_core->m_r[REG_PC]); m_core->m_fiq = 1; push(m_core->m_r[REG_PC], &m_core->m_r[REG_SP]); push(m_core->m_r[REG_SR], &m_core->m_r[REG_SP]); - m_core->m_r[REG_PC] = read16(0xfff6); + m_core->m_r[REG_PC] = read16(m_vectorbase + 0x06); m_core->m_r[REG_SR] = 0; - standard_irq_callback(UNSP_FIQ_LINE); } inline void unsp_device::trigger_irq(int line) @@ -461,6 +463,7 @@ inline void unsp_device::trigger_irq(int line) if ((m_core->m_ine == 0 && m_core->m_irq == 1) || m_core->m_pri <= line || !m_core->m_enable_irq) return; + standard_irq_callback(UNSP_IRQ0_LINE+line, m_core->m_r[REG_PC]); m_core->m_irq = 1; push(m_core->m_r[REG_PC], &m_core->m_r[REG_SP]); @@ -473,9 +476,8 @@ inline void unsp_device::trigger_irq(int line) if (m_core->m_ine) m_core->m_pri = line; - m_core->m_r[REG_PC] = read16(0xfff8 + line); + m_core->m_r[REG_PC] = read16(m_vectorbase + 0x08 + line); m_core->m_r[REG_SR] = 0; - standard_irq_callback(UNSP_IRQ0_LINE+line); } void unsp_device::check_irqs() |