patterns: Improvements to NES & IPS, add SNES, NSF, NSFe (#455)

* Add credit to ne.hexpat

* Add many changes to nes.hexpat

* Fixing dependance on variables declared in if statement

* Added mappers and inline to NES 2.0 header, removed needless parenthesises

* Add files via upload

* Add files via upload

* Create nsf.hexpat

* Used full name of the SNES on description

* Add SNES, NSF & NSFe, new description for NES

* Removing erroneous condition in ips.hexpat's truncatedSize

* Removing unnecessary std.string import in ips.hexpat

* Added both locations for sections in PE, clearer variable names, reorganized DOS stub

* Delete patterns/nsfe.hexpat

* Delete patterns/nsfmetadata.hexpat

* Added chunks from NSFe to NSF

* Added NSFe

* Fix size of truncatedSize in ips.hexpat

---------

Co-authored-by: Nik <werwolv98@gmail.com>
This commit is contained in:
gmestanley
2025-12-05 17:15:50 -03:00
committed by GitHub
parent a525160243
commit 0d8bd76c2c
7 changed files with 1357 additions and 942 deletions

48
patterns/nsfe.hexpat Normal file
View File

@@ -0,0 +1,48 @@
#pragma author gmestanley
#pragma description NSFe file format
import std.string;
struct ChunkMetadata {
u32 length;
char ID[4];
} [[inline]];
struct TimeChunkData {
u32 trackLengths[while($<addressof(parent.metadata)+6+parent.metadata.length)];
} [[inline]];
fn formatMetadataName(str string) {
return "\"" + std::string::substr(string, 0, sizeof(string)-1) + "\"";
};
struct Name {
char trackName[] [[format("formatMetadataName")]];
};
struct TlblChunkData {
Name trackNames[while($<addressof(parent.metadata)+6+parent.metadata.length)];
} [[inline]];
struct AuthChunkData {
char gameTitle[] [[format("formatMetadataName")]];
char songwriting[] [[format("formatMetadataName")]];
char copyright[] [[format("formatMetadataName")]];
char ripper[] [[format("formatMetadataName")]];
} [[inline]];
struct TextChunkData {
char text[parent.metadata.length];
} [[inline]];
struct Chunk {
ChunkMetadata metadata;
if (metadata.ID == "time") TimeChunkData timeChunkData;
else if (metadata.ID == "text") TextChunkData textChunkData;
else if (metadata.ID == "tlbl") TlblChunkData tlblChunkData;
else if (metadata.ID == "auth") AuthChunkData authChunkData;
else u8 data[metadata.length];
};
char signature[4] @ 0x00;
Chunk chunks[while($<std::mem::size())] @ 0x04;