From 1d7cc537ed5629f136272bf577bbfec0960371df Mon Sep 17 00:00:00 2001 From: Eldred Habert Date: Wed, 7 Aug 2024 22:11:29 +0200 Subject: [PATCH] patterns: Added RGBDS object file format (#287) --- README.md | 1 + patterns/rgbds.hexpat | 132 ++++++++++++++++++++++++ tests/patterns/test_data/rgbds.hexpat.o | Bin 0 -> 25009 bytes 3 files changed, 133 insertions(+) create mode 100644 patterns/rgbds.hexpat create mode 100644 tests/patterns/test_data/rgbds.hexpat.o diff --git a/README.md b/README.md index ac59acc..e594611 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | QOI | `image/qoi` | [`patterns/qoi.hexpat`](patterns/qoi.hexpat) | QOI image files | | RAS | `image/x-sun-raster` | [`patterns/ras.hexpat`](patterns/ras.hexpat) | RAS image files | | ReFS | | [`patterns/refs.hexpat`](patterns/refs.hexpat) | Microsoft Resilient File System | +| RGBDS | | [`patterns/rgbds.hexpat`](patterns/rgbds.hexpat) | [RGBDS](https://rgbds.gbdev.io) object file format | | Shell Link | `application/x-ms-shortcut` | [`patterns/lnk.hexpat`](patterns/lnk.hexpat) | Windows Shell Link file format | | shp | | [`patterns/shp.hexpat`](patterns/shp.hexpat) | ESRI shape file | | shx | | [`patterns/shx.hexpat`](patterns/shx.hexpat) | ESRI index file | diff --git a/patterns/rgbds.hexpat b/patterns/rgbds.hexpat new file mode 100644 index 0000000..5752824 --- /dev/null +++ b/patterns/rgbds.hexpat @@ -0,0 +1,132 @@ +#pragma author ISSOtm +#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 + +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] @ $; +} diff --git a/tests/patterns/test_data/rgbds.hexpat.o b/tests/patterns/test_data/rgbds.hexpat.o new file mode 100644 index 0000000000000000000000000000000000000000..5a067b5ef628abc40fa6760ea54bfa17e41d1484 GIT binary patch literal 25009 zcmcJ13!I!qmG3u!0HPr;gb)JhgjdKym}edcak_hYW}5U&58XW(0_vBZnNBh=nGQWY zd4hCcHHgY%_xiZtPec|$Syr!H*mbYETv^$RaS;Vs-wrOs$6giXwW7lQ|8-8)S3Q|< zF?aX-rBdB>o^|TfsZ;e;Pp&Jm=GY(zE|?JnGf^)GGkbh#h}fp18*K29zS=yTA3KCj-RJBQO`erth6KCG*TKJHdMzP7S*i7qB`QRsMz(W z+i$dAG~Ay~HSe&f-h5b8Z#pch;|`1Js6UyCRT$F~}~ zI;Y-JtPJlcR*YrO^S>A#Ct})6$LIX>M+Xf;y5V&YUc*DI8RM0q^R^bZ84b4NOGD+c z;qKwB#TDgEhaH*n z=8>V|XaNqR;7ctSA*T+!0uDm5AP6lAIrI+Z$~(q0BilcBe`e1lq$PLeBaN|q;5&e~l!LjZsZ5=OF^IMCfqd|imy`3_8*8z{CXS`osue7O( z7CiqAK>KXz9W?%s0W>`Z7Zt#V6oovtOk>UuE1dl6y&sbjohntUrF4hd=AA$`GYJuR zNuvl@0M6tw8?_s};wYSKco)BybPjbYUW<>nxm;BlG@dZbD&pIG#Gx&vp({EorBZ~~ zu6Qd@*K5ALQrt>gIKAIt^*(5d7pv9E$lyfP27`B5OvH5^i9)fmxm2~Y>AgUJKocw# zLDb%>0DkL1SddA$9`lUxW^~tzq0!>jZTW2_YmmoO|3^_zOE8T2mYhQLgc6ZBBI@R> z0ygD{Hb-KZpiuC~Iy_ICZN-tX>d4q;I7-5VC`0!e78m)QNgYvl#D2ZQG67#o1`;UVWNeY%6hAm7y`aSZ`_RN@o+Qho6I*qa{D#upje315R|vD6dC~uG(89E) z9r_%?NE2ft)dCizl+7&mD7VW|AA-ij4d<`)Q}%aN9YHj)MU_wMth^m{#I{gIHa9#j z0Zm-^uRKH-y$>3hixg`WYKL`bv!12sC!$WL5@Eg&FNoH|P@N_MAc*&OWKz9hM}J{M z*wh@h2?lc1oyiIn(?3!%wXO8# znwq5fWaz-=xe(?0L?_M{H|9@GnCi`?;wt||g*^lT&Z&mV+jhk(m7*@qTLA;-0E2G)u~oiasDpMq*s{aY zdKr*t@Zg~!pl`KxhCSJiRM?%!2*OWQVhxCyWJj_y%qA|flVX_yQAO&EA}Q0jt83ss zh^9u@qGmr6Mn)47JhrBl$xM7U{;dlCK-&wn8g;``Nc<paR#TUYFX? z)ERapGWot#O3nCrWl;k=Or4fYYJDmbT0glFRJ6%PKr6XEk@~!ntfw~cYE}MvZSH1s zWU9Z0cnKY$2)H|DVseAD=9Me~GBY#!;+dX!UT1FykV(U7 z)syP&57);tX@oC!ind#ULO7V12<69+lF9=}XyeI3I@=reW_wdYy-2Bv!7=KLTp*!p z5mYJk#6{Vk;Ty#r1!a-HhGW$&a=aFfjBP3h0rRob zB{_n*6A)UKEI8#7oN`SoMY|^Dk4k|9X^f%(nW2)B?jV$jt~JR<_0>j&(pK>L?sQjo zm`kAxIbA((P}ORV9K0j?bCsSWt9q$iX2g`sfs`PT=*o8LNS>`gz?@Q6;T8|p9nW

KH#jR? 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 literal 0 HcmV?d00001