summaryrefslogtreecommitdiff
path: root/ZAPD/ZRom.cpp
diff options
context:
space:
mode:
authorbriaguya <70942617+briaguya-ai@users.noreply.github.com>2023-10-17 22:04:12 -0400
committerbriaguya <70942617+briaguya-ai@users.noreply.github.com>2023-10-17 22:04:12 -0400
commite9f4fc638ed904cc0dcdac24ea7708c9a220a702 (patch)
tree114c3d432697e04831741e623ae2340f6239bbe9 /ZAPD/ZRom.cpp
parentdcf56d93ecbd4db3bfd8a4832d7f991467964b98 (diff)
update to latest version used by SoH
Diffstat (limited to 'ZAPD/ZRom.cpp')
-rw-r--r--ZAPD/ZRom.cpp234
1 files changed, 234 insertions, 0 deletions
diff --git a/ZAPD/ZRom.cpp b/ZAPD/ZRom.cpp
new file mode 100644
index 0000000..e9b583b
--- /dev/null
+++ b/ZAPD/ZRom.cpp
@@ -0,0 +1,234 @@
+#include "ZRom.h"
+#include "Utils/BitConverter.h"
+#include <Utils/DiskFile.h>
+#include "Utils/Directory.h"
+#include "yaz0/yaz0.h"
+
+#ifdef __linux__
+#include <byteswap.h>
+#endif
+#include <Globals.h>
+
+namespace fs = std::filesystem;
+
+#define DMA_ENTRY_SIZE 16
+
+#if defined(_MSC_VER)
+#define __bswap_32 _byteswap_ulong
+#define bswap_32 _byteswap_ulong
+#endif
+#if defined __APPLE__
+#define __bswap32 __builtin_bswap32
+#define bswap32 __builtin_bswap32
+#endif
+
+// ROM DMA Table Start
+#define OOT_OFF_NTSC_10_RC 0x7430
+#define OOT_OFF_NTSC_10 0x7430
+#define OOT_OFF_NTSC_11 0x7430
+#define OOT_OFF_PAL_10 0x7950
+#define OOT_OFF_NTSC_12 0x7960
+#define OOT_OFF_PAL_11 0x7950
+#define OOT_OFF_JP_GC 0x7170
+#define OOT_OFF_JP_MQ 0x7170
+#define OOT_OFF_US_GC 0x7170
+#define OOT_OFF_US_MQ 0x7170
+#define OOT_OFF_PAL_GC_DBG1 0x12F70
+#define OOT_OFF_PAL_MQ_DBG 0x12F70
+#define OOT_OFF_PAL_GC_DBG2 0x12F70
+#define OOT_OFF_PAL_GC 0x7170
+#define OOT_OFF_PAL_MQ 0x7170
+#define OOT_OFF_JP_GC_CE 007170
+#define OOT_OFF_CN_IQUE 0xB7A0
+#define OOT_OFF_TW_IQUE 0xB240
+
+#define MM_OFF_US_10 0x1A500
+#define MM_OFF_JP_10 0x1C110
+#define MM_OFF_JP_11 0x1C050
+#define MM_OFF_DBG 0x24F60
+
+#define OOT_NTSC_10 0xEC7011B7
+#define OOT_NTSC_11 0xD43DA81F
+#define OOT_NTSC_12 0x693BA2AE
+#define OOT_PAL_10 0xB044B569
+#define OOT_PAL_11 0xB2055FBD
+#define OOT_NTSC_JP_GC_CE 0xF7F52DB8
+#define OOT_NTSC_JP_GC 0xF611F4BA
+#define OOT_NTSC_US_GC 0xF3DD35BA
+#define OOT_PAL_GC 0x09465AC3
+#define OOT_NTSC_JP_MQ 0xF43B45BA
+#define OOT_NTSC_US_MQ 0xF034001A
+#define OOT_PAL_MQ 0x1D4136F3
+#define OOT_PAL_GC_DBG1 0x871E1C92 // 03-21-2002 build
+#define OOT_PAL_GC_DBG2 0x87121EFE // 03-13-2002 build
+#define OOT_PAL_GC_MQ_DBG 0x917D18F6
+#define OOT_IQUE_TW 0x3D81FB3E
+#define OOT_IQUE_CN 0xB1E1E07B
+#define UNKNOWN 0xFFFFFFFF
+
+bool ZRom::IsMQ() {
+ int crc = BitConverter::ToInt32BE(romData, 0x10);
+ switch (crc) {
+ case OOT_NTSC_10:
+ case OOT_NTSC_11:
+ case OOT_NTSC_12:
+ case OOT_PAL_10:
+ case OOT_PAL_11:
+ case OOT_NTSC_JP_GC:
+ case OOT_NTSC_JP_GC_CE:
+ case OOT_NTSC_US_GC:
+ case OOT_PAL_GC:
+ case OOT_PAL_GC_DBG1:
+ case OOT_PAL_GC_DBG2:
+ case OOT_IQUE_CN:
+ case OOT_IQUE_TW:
+ default:
+ return false;
+ case OOT_NTSC_JP_MQ:
+ case OOT_NTSC_US_MQ:
+ case OOT_PAL_MQ:
+ case OOT_PAL_GC_MQ_DBG:
+ return true;
+ }
+}
+
+ZRom::ZRom(std::string romPath)
+{
+ RomVersion version;
+ romData = DiskFile::ReadAllBytes(romPath);
+
+ BitConverter::RomToBigEndian(romData.data(), romData.size());
+
+ version.crc = BitConverter::ToInt32BE(romData, 0x10);
+
+ switch (version.crc)
+ {
+ case OOT_NTSC_10:
+ version.version = "N64 NTSC 1.0";
+ version.listPath = "ntsc_oot.txt";
+ version.offset = OOT_OFF_NTSC_10;
+ break;
+ case OOT_NTSC_11:
+ version.version = "N64 NTSC 1.1";
+ version.listPath = "ntsc_oot.txt";
+ version.offset = OOT_OFF_NTSC_11;
+ break;
+ case OOT_NTSC_12:
+ version.version = "N64 NTSC 1.2";
+ version.listPath = "ntsc_oot.txt";
+ version.offset = OOT_OFF_NTSC_12;
+ break;
+ case OOT_PAL_10:
+ version.version = "N64 PAL 1.0";
+ version.listPath = "pal_oot.txt";
+ version.offset = OOT_OFF_PAL_10;
+ break;
+ case OOT_PAL_11:
+ version.version = "N64 PAL 1.1";
+ version.listPath = "pal_oot.txt";
+ version.offset = OOT_OFF_PAL_11;
+ break;
+ case OOT_NTSC_JP_GC:
+ version.version = "JP GameCube (MQ Disk)";
+ version.listPath = "gamecube.txt";
+ version.offset = OOT_OFF_JP_GC;
+ break;
+ case OOT_NTSC_JP_GC_CE:
+ version.version = "GameCube (Collectors Edition Disk)";
+ version.listPath = "gamecube.txt";
+ version.offset = OOT_OFF_JP_GC_CE;
+ break;
+ case OOT_NTSC_JP_MQ:
+ version.version = "JP Master Quest";
+ version.listPath = "gamecube.txt";
+ version.offset = OOT_OFF_JP_MQ;
+ break;
+ case OOT_NTSC_US_MQ:
+ version.version = "NTSC Master Quest";
+ version.listPath = "gamecube.txt";
+ version.offset = OOT_OFF_JP_MQ;
+ break;
+ case OOT_NTSC_US_GC:
+ version.version = "NTSC GameCube";
+ version.listPath = "gamecube.txt";
+ version.offset = OOT_OFF_US_MQ;
+ break;
+ case OOT_PAL_GC:
+ version.version = "PAL GameCube";
+ version.listPath = "gamecube_pal.txt";
+ version.offset = OOT_OFF_PAL_GC;
+ break;
+ case OOT_PAL_MQ:
+ version.version = "PAL Master Quest";
+ version.listPath = "gamecube_pal.txt";
+ version.offset = OOT_OFF_PAL_MQ;
+ break;
+ case OOT_PAL_GC_DBG1:
+ version.version = "GameCube Debug 1.0";
+ version.listPath = "dbg.txt";
+ version.offset = OOT_OFF_PAL_GC_DBG1;
+ break;
+ case OOT_PAL_GC_DBG2:
+ version.version = "GameCube Debug 2.0";
+ version.listPath = "dbg.txt";
+ version.offset = OOT_OFF_PAL_GC_DBG2;
+ break;
+ case OOT_PAL_GC_MQ_DBG:
+ version.version = "GameCube MQ-Debug";
+ version.listPath = "dbg.txt";
+ version.offset = OOT_OFF_PAL_MQ_DBG;
+ break;
+ case OOT_IQUE_CN:
+ version.version = "OoT IQue";
+ version.listPath = "ique.txt";
+ version.offset = OOT_OFF_CN_IQUE;
+ break;
+ case OOT_IQUE_TW:
+ version.version = "TW IQue";
+ version.listPath = "ique.txt";
+ version.offset = OOT_OFF_TW_IQUE;
+ break;
+ }
+
+ auto path = StringHelper::Sprintf("%s/%s", Globals::Instance->fileListPath.string().c_str(), version.listPath.c_str());
+ auto txt = DiskFile::ReadAllText(path);
+ std::vector<std::string> lines = StringHelper::Split(txt, "\n");
+
+ std::vector<uint8_t> decompressedData(1);
+
+ for (int i = 0; i < lines.size(); i++)
+ {
+ lines[i] = StringHelper::Strip(lines[i], "\r");
+ const int romOffset = version.offset + (DMA_ENTRY_SIZE * i);
+
+ const int virtStart = BitConverter::ToInt32BE(romData, romOffset + 0);
+ const int virtEnd = BitConverter::ToInt32BE(romData, romOffset + 4);
+ const int physStart = BitConverter::ToInt32BE(romData, romOffset + 8);
+ const int physEnd = BitConverter::ToInt32BE(romData, romOffset + 12);
+
+ const bool compressed = physEnd != 0;
+ int size = compressed ? physEnd - physStart : virtEnd - virtStart;
+
+ auto outData = std::vector<uint8_t>();
+ outData.resize(size);
+ memcpy(outData.data(), romData.data() + physStart, size);
+
+ if (compressed)
+ {
+ int decSize = virtEnd - virtStart;
+ decompressedData = std::vector<uint8_t>();
+ decompressedData.resize(decSize);
+ yaz0_decode(outData.data(), decompressedData.data(), decSize);
+ files[lines[i]] = decompressedData;
+ }
+ else
+ files[lines[i]] = outData;
+
+ //DiskFile::WriteAllBytes(StringHelper::Sprintf("baserom/%s", lines[i].c_str()), files[lines[i]]);
+ }
+}
+
+std::vector<uint8_t> ZRom::GetFile(std::string fileName)
+{
+ return files[fileName];
+}