From faba26a0d7d3334165bf28e826b1528ac5ca8c93 Mon Sep 17 00:00:00 2001 From: Rain <111782432+FenrirBots@users.noreply.github.com> Date: Mon, 30 Mar 2026 22:53:38 +0900 Subject: [PATCH 1/4] minor fix to check git --- patterns/msscmp.hexpat | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/patterns/msscmp.hexpat b/patterns/msscmp.hexpat index 1ecca9db..4169848c 100644 --- a/patterns/msscmp.hexpat +++ b/patterns/msscmp.hexpat @@ -64,22 +64,23 @@ using OldGenHeader = Header; using NewGenHeader = Header; struct MSSCMP { - char magic[4]; - if (magic == "BANK") - std::core::set_endian(std::mem::Endian::Big); - else if (magic == "KNAB") - std::core::set_endian(std::mem::Endian::Little); - else - std::error("Magic does not match BANK or KNAB"); + u32 check1 @ 0x18 [[hidden]]; + u32 check2 @ 0x1C [[hidden]]; + char magic[4]; - u32 check1 @ 0x1c [[hidden]]; // use this to check if old gen or new gen - u32 check2 @ 0x20 [[hidden]]; + if (magic == "BANK") + std::core::set_endian(std::mem::Endian::Big); + else if (magic == "KNAB") + std::core::set_endian(std::mem::Endian::Little); + else + std::error("Magic does not match BANK or KNAB"); - if (check1 == check2) - OldGenHeader header; - else - NewGenHeader header; - MsscmpEntry entry; + if (check1 == check2) + OldGenHeader header; + else + NewGenHeader header; + + MsscmpEntry entry; }; MSSCMP msscmp @ 0x00; From d6039ea593c82e9ae413eba0e0c749f947a0aabb Mon Sep 17 00:00:00 2001 From: Rain <111782432+FenrirBots@users.noreply.github.com> Date: Mon, 30 Mar 2026 22:59:25 +0900 Subject: [PATCH 2/4] Split the header into seperate structure to avoid amibuity --- patterns/msscmp.hexpat | 50 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/patterns/msscmp.hexpat b/patterns/msscmp.hexpat index 4169848c..168d14fe 100644 --- a/patterns/msscmp.hexpat +++ b/patterns/msscmp.hexpat @@ -37,31 +37,31 @@ struct MsscmpEntry { Index2Entry entries[parent.header.index2EntryCount] @ parent.header.index1LastEntryOffset + 4; }; - -struct Header { - padding[4]; // unk - T fileDataOffset; - padding[8]; // unk - T index1Offset; - T index1LastEntryOffset; - if (sizeof(T) == 4) - padding[8]; - else - padding[16]; - - T unkOffset; - T index1EntryCount; - - if (sizeof(T) == 4) - padding[8]; - else - padding[4]; - - u32 index2EntryCount; +struct msscmp_header32 { + padding[4]; // unk + u32 fileDataOffset; + padding[8]; // unk + u32 index1Offset; + u32 index1LastEntryOffset; + padding[8]; + u32 unkOffset; + u32 index1EntryCount; + padding[8]; + u32 index2EntryCount; }; -using OldGenHeader = Header; -using NewGenHeader = Header; +struct msscmp_header64 { + padding[4]; // unk + u64 fileDataOffset; + padding[8]; // unk + u64 index1Offset; + u64 index1LastEntryOffset; + padding[16]; + u64 unkOffset; + u64 index1EntryCount; + padding[4]; + u32 index2EntryCount; +}; struct MSSCMP { u32 check1 @ 0x18 [[hidden]]; @@ -76,9 +76,9 @@ struct MSSCMP { std::error("Magic does not match BANK or KNAB"); if (check1 == check2) - OldGenHeader header; + msscmp_header32 header; else - NewGenHeader header; + msscmp_header64 header; MsscmpEntry entry; }; From 9f96b8d8555f76978160364a0ec555669f9354c1 Mon Sep 17 00:00:00 2001 From: Rain <111782432+FenrirBots@users.noreply.github.com> Date: Mon, 30 Mar 2026 23:10:25 +0900 Subject: [PATCH 3/4] Manually inlined an unneeded structure and fixed some offsets --- patterns/msscmp.hexpat | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/patterns/msscmp.hexpat b/patterns/msscmp.hexpat index 168d14fe..7621c462 100644 --- a/patterns/msscmp.hexpat +++ b/patterns/msscmp.hexpat @@ -12,29 +12,27 @@ import std.core; #endif struct FileDataEntry { - u32 nameOffset; - char name[] @ nameOffset; - u32 folderOffset; - char folder[] @ folderOffset; - le u32 fileDataOffset; - padding[8]; - u32 sampleRate; - u32 fileSize; - u8 data[fileSize] @ fileDataOffset; - #ifdef __IMHEX__ - hex::core::add_virtual_file(std::string::to_string(name) + ".binka", data); - #endif + u32 folderOffset; + char folder[] @ folderOffset + parent.entryOffset; + u32 nameOffset; + char name[] @ nameOffset; + le u32 fileDataOffset; + padding[8]; + u32 sampleRate; + u32 fileSize; + u8 data[fileSize] @ fileDataOffset; + #ifdef __IMHEX__ + hex::core::add_virtual_file(std::string::to_string(name) + ".binka", data); + #endif }; struct Index2Entry { - u32 entryOffset; u32 fStructureOffset; + u32 entryOffset; FileDataEntry fileDataEntry @ entryOffset; }; struct MsscmpEntry { - char name[12]; - Index2Entry entries[parent.header.index2EntryCount] @ parent.header.index1LastEntryOffset + 4; }; struct msscmp_header32 { @@ -61,6 +59,7 @@ struct msscmp_header64 { u64 index1EntryCount; padding[4]; u32 index2EntryCount; + char name[12]; }; struct MSSCMP { @@ -80,7 +79,7 @@ struct MSSCMP { else msscmp_header64 header; - MsscmpEntry entry; + Index2Entry entries[header.index2EntryCount] @header.index1LastEntryOffset; }; MSSCMP msscmp @ 0x00; From 1e5401daaf8a06aaa8319c1b35d607c06d175102 Mon Sep 17 00:00:00 2001 From: Rain <111782432+FenrirBots@users.noreply.github.com> Date: Tue, 31 Mar 2026 00:25:28 +0900 Subject: [PATCH 4/4] Normalized some of the names and fixed some offsets --- patterns/msscmp.hexpat | 85 ++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/patterns/msscmp.hexpat b/patterns/msscmp.hexpat index 7621c462..ec8f0949 100644 --- a/patterns/msscmp.hexpat +++ b/patterns/msscmp.hexpat @@ -11,58 +11,62 @@ import std.core; import hex.core; #endif -struct FileDataEntry { - u32 folderOffset; - char folder[] @ folderOffset + parent.entryOffset; - u32 nameOffset; - char name[] @ nameOffset; - le u32 fileDataOffset; +struct msscmp_file_header { + u32 pathaddr; + char path[] @ pathaddr; + u32 nameaddr; + char name[] @ nameaddr + parent.headeraddr; + + le u32 fileaddr; padding[8]; - u32 sampleRate; - u32 fileSize; - u8 data[fileSize] @ fileDataOffset; + u32 samplerate; + u32 filesize; +}; + +struct msscmp_file { + padding [4]; + u32 headeraddr; + msscmp_file_header header @ headeraddr; + u8 data[header.filesize] @ header.fileaddr; + #ifdef __IMHEX__ - hex::core::add_virtual_file(std::string::to_string(name) + ".binka", data); + hex::core::add_virtual_file(std::string::to_string(header.name) + ".binka", data); #endif }; -struct Index2Entry { - u32 fStructureOffset; - u32 entryOffset; - FileDataEntry fileDataEntry @ entryOffset; -}; +struct msscmp_fileinfo +{ + u32 pathaddr; + char path[] @ pathaddr; -struct MsscmpEntry { + u32 infoaddr; + char info[] @ infoaddr; }; struct msscmp_header32 { - padding[4]; // unk - u32 fileDataOffset; - padding[8]; // unk - u32 index1Offset; - u32 index1LastEntryOffset; - padding[8]; - u32 unkOffset; - u32 index1EntryCount; - padding[8]; - u32 index2EntryCount; + padding [16]; + u32 infoaddr; + padding [8]; + u32 entryaddr; + padding [4]; + u32 infocount; + padding [8]; + u32 entrycount; + char name[]; }; struct msscmp_header64 { - padding[4]; // unk - u64 fileDataOffset; - padding[8]; // unk - u64 index1Offset; - u64 index1LastEntryOffset; - padding[16]; - u64 unkOffset; - u64 index1EntryCount; - padding[4]; - u32 index2EntryCount; - char name[12]; + padding[20]; + u64 infoaddr; + u64 infocount; + padding[8]; + u64 entryaddr; + padding[20]; + u64 entrycount; + char name[]; }; -struct MSSCMP { +struct msscmp { u32 check1 @ 0x18 [[hidden]]; u32 check2 @ 0x1C [[hidden]]; char magic[4]; @@ -79,7 +83,8 @@ struct MSSCMP { else msscmp_header64 header; - Index2Entry entries[header.index2EntryCount] @header.index1LastEntryOffset; + msscmp_file entries[header.entrycount] @ header.entryaddr; + msscmp_fileinfo info[header.infocount] @ header.infoaddr; }; -MSSCMP msscmp @ 0x00; +msscmp file @ 0x00; \ No newline at end of file