-
-
Notifications
You must be signed in to change notification settings - Fork 185
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
patterns: Added RGBDS object file format (#287)
- Loading branch information
Showing
3 changed files
with
133 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
#pragma author ISSOtm <imhex@eldred.fr> | ||
#pragma description Object files for the RGBDS Game Boy assembly toolchain | ||
// Documentation: https://rgbds.gbdev.io/docs/rgbds.5 | ||
|
||
#pragma magic [ 52 47 42 39 ] @ 0x00 | ||
#pragma endian little | ||
|
||
#include <std/string> | ||
|
||
using LONG = u32; | ||
using BYTE = u8; | ||
using STRING = std::string::NullString; | ||
|
||
char magic[4] @ 0; | ||
LONG revNum @ $; | ||
LONG nbSym @ $; | ||
LONG nbSect @ $; | ||
|
||
namespace fstack { | ||
enum Type : BYTE { | ||
REPT, | ||
File, | ||
Macro, | ||
}; | ||
struct Node { | ||
LONG parentID; | ||
LONG parentLineNo; | ||
Type type; | ||
if (type != Type::REPT) { | ||
STRING name; | ||
} else { | ||
LONG depth; | ||
LONG iters[depth]; | ||
} | ||
}; | ||
|
||
LONG nbNodes @ $; | ||
Node nodes[nbNodes] @ $; | ||
} | ||
|
||
namespace sym { | ||
enum Type : BYTE { | ||
Local, | ||
Import, | ||
Exported, | ||
}; | ||
struct Symbol { | ||
STRING name; | ||
Type type; | ||
if (type != Type::Import) { | ||
LONG nodeID; | ||
LONG lineNo; | ||
LONG sectionID; | ||
LONG value; | ||
} | ||
}; | ||
|
||
Symbol symbols[nbSym] @ $; | ||
} | ||
|
||
namespace sect { | ||
enum PatchType : BYTE { | ||
DB, | ||
DW, | ||
DL, | ||
JR, | ||
}; | ||
struct Patch { | ||
LONG nodeID; | ||
LONG lineNo; | ||
LONG ofs; | ||
LONG pcSectID; | ||
LONG pcOfs; | ||
PatchType type; | ||
LONG rpnSize; | ||
BYTE rpn[rpnSize]; | ||
}; | ||
|
||
enum Type : BYTE { | ||
WRAM0, | ||
VRAM, | ||
ROMX, | ||
ROM0, | ||
HRAM, | ||
WRAMX, | ||
SRAM, | ||
OAM, | ||
}; | ||
bitfield Attrs { | ||
Type type : 6; | ||
bool isFragment : 1; | ||
bool isUnion : 1; | ||
}; | ||
struct Section { | ||
STRING name; | ||
LONG size; | ||
Attrs attrs; | ||
LONG address; | ||
LONG bank; | ||
BYTE alignment; | ||
LONG alignOfs; | ||
if (attrs.type == Type::ROMX || attrs.type == Type::ROM0) { | ||
BYTE data[size]; | ||
LONG nbPatches; | ||
Patch patches[nbPatches]; | ||
} | ||
}; | ||
|
||
Section sections[nbSect] @ $; | ||
} | ||
|
||
namespace assert { | ||
enum Type : BYTE { | ||
Warn, | ||
Err, | ||
Fatal, | ||
}; | ||
struct Assertion { | ||
LONG nodeID; | ||
LONG lineNo; | ||
LONG ofs; | ||
LONG pcSectID; | ||
LONG pcOfs; | ||
Type type; | ||
LONG rpnSize; | ||
BYTE rpn[rpnSize]; | ||
STRING msg; | ||
}; | ||
|
||
LONG nbAsserts @ $; | ||
Assertion assertions[nbAsserts] @ $; | ||
} |
Binary file not shown.