Skip to content

Commit 0933dcd

Browse files
authored
Merge pull request #1828 from nicolasnoble/lwc2-swc2
Accounting for GTE's LWC2/SWC2 in debugger.
2 parents 596f9dd + d00ab7e commit 0933dcd

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

src/core/debug.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ void PCSX::Debug::process(uint32_t oldPC, uint32_t newPC, uint32_t oldCode, uint
111111
const bool isSWL = basic == 0x2a;
112112
const bool isSW = (basic == 0x2b) || (basic == 0x3a);
113113
const bool isSWR = basic == 0x2e;
114+
const bool isLWC2 = basic == 0x32;
115+
const bool isSWC2 = basic == 0x3a;
114116
uint32_t offset = regs.GPR.r[(newCode >> 21) & 0x1f] + int16_t(newCode);
115117
if (isLWL || isLWR || isSWR || isSWL) offset &= ~3;
116118
if (isLB || isLBU) {
@@ -127,7 +129,7 @@ void PCSX::Debug::process(uint32_t oldPC, uint32_t newPC, uint32_t oldCode, uint
127129
}
128130
if (m_mapping_r16) markMap(offset, MAP_R16);
129131
}
130-
if (isLW || isLWR || isLWL) {
132+
if (isLW || isLWR || isLWL || isLWC2) {
131133
checkBP(offset, BreakpointType::Read, 4);
132134
if (m_breakmp_r32 && !isMapMarked(offset, MAP_R32)) {
133135
triggerBP(nullptr, offset, 4, _("Read 32 map"));
@@ -148,7 +150,7 @@ void PCSX::Debug::process(uint32_t oldPC, uint32_t newPC, uint32_t oldCode, uint
148150
}
149151
if (m_mapping_w16) markMap(offset, MAP_W16);
150152
}
151-
if (isSW || isSWR || isSWL) {
153+
if (isSW || isSWR || isSWL || isSWC2) {
152154
checkBP(offset, BreakpointType::Write, 4);
153155
if (m_breakmp_w32 && !isMapMarked(offset, MAP_W32)) {
154156
triggerBP(nullptr, offset, 4, _("Write 32 map"));

src/core/gte.h

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,30 @@ class GTE {
5151

5252
void MTC2(uint32_t code) { MTC2_internal(PCSX::g_emulator->m_cpu->m_regs.GPR.r[_Rt_], _Rd_); }
5353
void CTC2(uint32_t code) { CTC2_internal(PCSX::g_emulator->m_cpu->m_regs.GPR.r[_Rt_], _Rd_); }
54-
void LWC2(uint32_t code) { MTC2_internal(PCSX::g_emulator->m_mem->read32(gteoB), _Rt_); }
55-
void SWC2(uint32_t code) { PCSX::g_emulator->m_mem->write32(gteoB, MFC2_internal(_Rt_)); }
54+
void LWC2(uint32_t code) {
55+
if (gteoB & 3) {
56+
PCSX::g_emulator->m_cpu->m_regs.pc -= 4;
57+
PCSX::g_system->log(PCSX::LogClass::CPU, _("Unaligned address 0x%08x in LWC2 from 0x%08x\n"), gteoB,
58+
PCSX::g_emulator->m_cpu->m_regs.pc);
59+
PCSX::g_emulator->m_cpu->m_regs.CP0.n.BadVAddr = gteoB;
60+
PCSX::g_emulator->m_cpu->exception(PCSX::R3000Acpu::Exception::LoadAddressError,
61+
PCSX::g_emulator->m_cpu->m_inDelaySlot);
62+
return;
63+
}
64+
MTC2_internal(PCSX::g_emulator->m_mem->read32(gteoB), _Rt_);
65+
}
66+
void SWC2(uint32_t code) {
67+
if (gteoB & 3) {
68+
PCSX::g_emulator->m_cpu->m_regs.pc -= 4;
69+
PCSX::g_system->log(PCSX::LogClass::CPU, _("Unaligned address 0x%08x in SWC2 from 0x%08x\n"), gteoB,
70+
PCSX::g_emulator->m_cpu->m_regs.pc);
71+
PCSX::g_emulator->m_cpu->m_regs.CP0.n.BadVAddr = gteoB;
72+
PCSX::g_emulator->m_cpu->exception(PCSX::R3000Acpu::Exception::StoreAddressError,
73+
PCSX::g_emulator->m_cpu->m_inDelaySlot);
74+
return;
75+
}
76+
PCSX::g_emulator->m_mem->write32(gteoB, MFC2_internal(_Rt_));
77+
}
5678

5779
void RTPS(uint32_t code);
5880
void NCLIP(uint32_t code);

0 commit comments

Comments
 (0)