summaryrefslogtreecommitdiff
path: root/src/m_Do/m_Do_ext2.cpp
diff options
context:
space:
mode:
authorJcw87 <Jcw87@users.noreply.github.com>2026-01-18 17:59:57 -0800
committerGitHub <noreply@github.com>2026-01-18 17:59:57 -0800
commit87a3705039533b309a04baaaa0f99010b5d71c00 (patch)
tree2dc2beb45a2b7b6a1738126a0c11c966c66a535c /src/m_Do/m_Do_ext2.cpp
parent52a1e1363a4b91bc49f7994a553d16b90d969619 (diff)
m_Do debug (#3052)
* m_Do debug * m_Do wii data
Diffstat (limited to 'src/m_Do/m_Do_ext2.cpp')
-rw-r--r--src/m_Do/m_Do_ext2.cpp138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/m_Do/m_Do_ext2.cpp b/src/m_Do/m_Do_ext2.cpp
new file mode 100644
index 0000000000..9d4c18228f
--- /dev/null
+++ b/src/m_Do/m_Do_ext2.cpp
@@ -0,0 +1,138 @@
+
+#include "d/dolzel.h" // IWYU pragma: keep
+
+#include "m_Do/m_Do_ext2.h"
+
+FixedMemoryCheck* FixedMemoryCheck::sFirst;
+
+FixedMemoryCheck::FixedMemoryCheck(u32* param_1, u32 size, JKRHeap* heap) {
+ mNowCode = param_1;
+ mSize = size;
+ mSaveCode = NULL;
+ mpHeap = heap;
+ field_0x10 = 0;
+ field_0x14 = false;
+ mNext = NULL;
+ if (sFirst) {
+ mNext = sFirst;
+ }
+ sFirst = this;
+}
+
+FixedMemoryCheck* FixedMemoryCheck::easyCreate(void* param_1, u32 size) {
+ JKRHeap* heap = JKRGetRootHeap2();
+ FixedMemoryCheck* memCheck = new (heap, 0) FixedMemoryCheck((u32*)param_1, size, heap);
+ if (!memCheck) {
+ memCheck = new (JKRGetSystemHeap(), 0) FixedMemoryCheck((u32*)param_1, size, NULL);
+ }
+ if (memCheck) {
+ memCheck->alloc();
+ memCheck->save();
+ memCheck->check();
+ }
+ return memCheck;
+}
+
+BOOL FixedMemoryCheck::checkAll() {
+ BOOL result = true;
+ for (FixedMemoryCheck* memCheck = sFirst; memCheck; memCheck = memCheck->mNext) {
+ if (!memCheck->check()) {
+ result = false;
+ }
+ }
+ return result;
+}
+
+BOOL FixedMemoryCheck::diffAll() {
+ BOOL result = true;
+ for (FixedMemoryCheck* memCheck = sFirst; memCheck; memCheck = memCheck->mNext) {
+ if (!memCheck->diff()) {
+ result = false;
+ }
+ }
+ return result;
+}
+
+BOOL FixedMemoryCheck::saveAll() {
+ BOOL result = true;
+ for (FixedMemoryCheck* memCheck = sFirst; memCheck; memCheck = memCheck->mNext) {
+ if (!memCheck->save()) {
+ result = false;
+ }
+ }
+ return result;
+}
+
+BOOL FixedMemoryCheck::alloc() {
+ if (!mpHeap) {
+ OSReport_Error("FixedMemoryCheck::alloc ヒープ未設定\n");
+ return false;
+ }
+
+ if (mSaveCode) {
+ OSReport_Error("FixedMemoryCheck::alloc セーブ確保済み\n");
+ return false;
+ }
+
+ mSaveCode = (u32*)JKRAllocFromHeap(mpHeap, mSize, 4);
+ OSReport("FixedMemoryCheck::alloc: %dKB確保\n", mSize >> 10);
+ return mSaveCode != NULL;
+}
+
+BOOL FixedMemoryCheck::save() {
+ if (!mNowCode) {
+ OSReport_Error("FixedMemoryCheck::save 設定ミス\n");
+ return false;
+ }
+ if (mSaveCode) {
+ memcpy(mSaveCode, mNowCode, mSize);
+ }
+ u32 r28 = 0;
+ for (int i = 0; i < mSize / 4; i++) {
+ r28 += mNowCode[i];
+ }
+ field_0x10 = r28;
+ OSReport("FixedMemoryCheck::save: チェックサム=%08x\n", field_0x10);
+ field_0x14 = false;
+ return true;
+}
+
+BOOL FixedMemoryCheck::check() {
+ BOOL result = true;
+ if (!mSaveCode || !mNowCode) {
+ OSReport_Error("FixedMemoryCheck::check 設定ミス\n");
+ return false;
+ }
+ u32 r29 = 0;
+ for (int i = 0; i < mSize / 4; i++) {
+ r29 += mNowCode[i];
+ }
+ if (r29 != field_0x10) {
+ OSReport_Error("FixedMemoryCheck::check: チェックサム不一致 %08x : %08x\n", field_0x10, r29);
+ result = false;
+ }
+ if (mSaveCode) {
+ int cmp = memcmp(mSaveCode, mNowCode, mSize);
+ if(cmp) {
+ OSReport_Error("FixedMemoryCheck::check メモリ破壊発見 %08x %08x\n", mNowCode, mSize);
+ result = false;
+ if (!field_0x14) {
+ diff();
+ field_0x14 = true;
+ }
+ }
+ }
+ return result;
+}
+
+BOOL FixedMemoryCheck::diff() {
+ BOOL result = true;
+ OSReport("Address SaveCode NowCode\n");
+ for (int i = 0; i < mSize / 4; i++) {
+ if (mSaveCode[i] != mNowCode[i]) {
+ result = false;
+ OSReport("%08x %08x %08x\n", mNowCode + i, mSaveCode[i], mNowCode[i]);
+ }
+ }
+ return result;
+}