#include namespace n64 { Registers::Registers() : cop0(*this), cop1(*this) { Reset(); } void Registers::Reset() { hi = 0; lo = 0; delaySlot = false; prevDelaySlot = false; memset(gpr, 0, 32*sizeof(s64)); cop0.Reset(); cop1.Reset(); steps = 0; extraCycles = 0; } void Registers::SetPC64(s64 val) { oldPC = pc; pc = val; nextPC = pc + 4; } void Registers::SetPC32(s32 val) { oldPC = pc; pc = s64(val); nextPC = pc + 4; } template <> u64 Registers::Read(size_t idx) { return idx == 0 ? 0 : gpr[idx]; } template <> s64 Registers::Read(size_t idx) { return s64(Read(idx)); } template <> u32 Registers::Read(size_t idx) { return idx == 0 ? 0 : gpr[idx]; } template <> s32 Registers::Read(size_t idx) { return s32(Read(idx)); } template <> u16 Registers::Read(size_t idx) { return idx == 0 ? 0 : gpr[idx]; } template <> s16 Registers::Read(size_t idx) { return s16(Read(idx)); } template <> u8 Registers::Read(size_t idx) { return idx == 0 ? 0 : gpr[idx]; } template <> s8 Registers::Read(size_t idx) { return s8(Read(idx)); } template <> void Registers::Write(size_t idx, bool v) { if(idx == 0) return; gpr[idx] = v; } template <> void Registers::Write(size_t idx, u64 v) { if(idx == 0) return; gpr[idx] = v; } template <> void Registers::Write(size_t idx, s64 v) { Write(idx, v); } template <> void Registers::Write(size_t idx, u32 v) { if(idx == 0) return; gpr[idx] = (u32)v; } template <> void Registers::Write(size_t idx, s32 v) { if(idx == 0) return; gpr[idx] = v; } template <> void Registers::Write(size_t idx, u16 v) { if(idx == 0) return; gpr[idx] = (u16)v; } template <> void Registers::Write(size_t idx, s16 v) { if(idx == 0) return; gpr[idx] = v; } template <> void Registers::Write(size_t idx, u8 v) { if(idx == 0) return; gpr[idx] = (u8)v; } template <> void Registers::Write(size_t idx, s8 v) { if(idx == 0) return; gpr[idx] = v; } }