summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2019-12-18 18:44:36 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2019-12-18 18:44:36 +0700
commitaa9440c8bcbf2da8610e7298cbfa33cbfe95c91a (patch)
treec1e014b3b2eec7ae9a9d2c28134ea1ddf11e40ef /src/devices/cpu
parent2e1ba819b62ed3a1158baded689920981cc1ffc4 (diff)
mips1: cop0 initialization for r3041 (nw)
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/mips/mips1.cpp17
-rw-r--r--src/devices/cpu/mips/mips1.h3
2 files changed, 18 insertions, 2 deletions
diff --git a/src/devices/cpu/mips/mips1.cpp b/src/devices/cpu/mips/mips1.cpp
index c2a34e47e73..7efb3082f0f 100644
--- a/src/devices/cpu/mips/mips1.cpp
+++ b/src/devices/cpu/mips/mips1.cpp
@@ -54,7 +54,7 @@ DEFINE_DEVICE_TYPE(R3071, r3071_device, "r3071", "IDT R3071")
DEFINE_DEVICE_TYPE(R3081, r3081_device, "r3081", "IDT R3081")
DEFINE_DEVICE_TYPE(SONYPS2_IOP, iop_device, "sonyiop", "Sony Playstation 2 IOP")
-ALLOW_SAVE_TYPE(mips1core_device_base::branch_state_t);
+ALLOW_SAVE_TYPE(mips1core_device_base::branch_state);
mips1core_device_base::mips1core_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 cpurev, size_t icache_size, size_t dcache_size)
: cpu_device(mconfig, type, tag, owner, clock)
@@ -184,6 +184,8 @@ void mips1core_device_base::device_start()
// initialise cpu id register
m_cop0[COP0_PRId] = m_cpurev;
+ m_cop0[COP0_Cause] = 0;
+
m_r[0] = 0;
}
@@ -197,6 +199,10 @@ void r3041_device::device_start()
state_add(MIPS1_COP0 + COP0_Count, "Count", m_cop0[COP0_Count]);
state_add(MIPS1_COP0 + COP0_PortSize, "PortSize", m_cop0[COP0_PortSize]);
state_add(MIPS1_COP0 + COP0_Compare, "Compare", m_cop0[COP0_Compare]);
+
+ m_cop0[COP0_BusCtrl] = 0x20130b00U;
+ m_cop0[COP0_Config] = 0x40000000U;
+ m_cop0[COP0_PortSize] = 0;
}
void mips1core_device_base::device_reset()
@@ -212,6 +218,14 @@ void mips1core_device_base::device_reset()
m_bus_error = false;
}
+void r3041_device::device_reset()
+{
+ mips1core_device_base::device_reset();
+
+ m_cop0[COP0_Count] = 0;
+ m_cop0[COP0_Compare] = 0x00ffffffU;
+}
+
void mips1core_device_base::execute_run()
{
// core execution loop
@@ -914,6 +928,7 @@ void mips1core_device_base::handle_cop0(u32 const op)
u32 mips1core_device_base::get_cop0_reg(unsigned const reg)
{
+ machine().debug_break();
return m_cop0[reg];
}
diff --git a/src/devices/cpu/mips/mips1.h b/src/devices/cpu/mips/mips1.h
index b3cdeedcdf3..2e9243c18a2 100644
--- a/src/devices/cpu/mips/mips1.h
+++ b/src/devices/cpu/mips/mips1.h
@@ -223,7 +223,7 @@ protected:
// internal stuff
int m_icount;
- enum branch_state_t : unsigned
+ enum branch_state : unsigned
{
NONE = 0,
DELAY = 1, // delay slot instruction active
@@ -351,6 +351,7 @@ public:
protected:
virtual void device_start() override;
+ virtual void device_reset() override;
};
class r3051_device : public mips1core_device_base