class Section(cmodel.Struct): groupid = cmodel.LeS32 #if -1, contains exported symbols only name = cmodel.String("ascii") bank = cmodel.LeS32 org = cmodel.LeS32 numsymbols = cmodel.LeU32 symbols = cmodel.Array(Symbol, "numsymbols") datasize = cmodel.LeU32 data = cmodel.If(lambda self: self.groupid > 0 and self._CField__container._CField__container.groups[self.groupid].typeid == SectionGroup.GROUP_TEXT, SectionData) __order__ = ["groupid", "name", "bank", "org", "numsymbols", "symbols", "datasize", "data"]
class BPSPatchStruct(cmodel.Struct): magic = cmodel.Magic(b"BPS1") srcSize = VarInt targetSize = VarInt metadataSize = VarInt metadata = cmodel.String( "utf-8") #This is also XML, consider adding cmodel.XML? patchData = cmodel.Array(PatchEntry, 12, cmodel.ParseToEOF) srcChksum = cmodel.LeU32 tgtChksum = cmodel.LeU32 chksum = cmodel.LeU32
class Rgb2Patch(cmodel.Struct): srcfile = cmodel.String("ascii") srcline = cmodel.LeU32 patchoffset = cmodel.LeU32 patchtype = cmodel.Enum(cmodel.U8, "BYTE", "LE16", "LE32", "BE16", "BE32") numpatchexprs = cmodel.LeU32 patchexprs = cmodel.Array(Rgb2PatchExpr, "numpatchexprs", countType=cmodel.BytesCount) __order__ = [ "srcfile", "srcline", "patchoffset", "patchtype", "numpatchexprs", "patchexprs" ]
class Symbol(cmodel.Struct): name = cmodel.String("ascii") symtype = cmodel.Enum(cmodel.LeS32, "EXPORT", "IMPORT", "LOCAL", "LOCALEXPORT", "LOCALIMPORT", ("FLAT_WHAT", -1)) value = cmodel.If("symtype", lambda x: x in [-1, 0, 2, 3], cmodel.LeS32) __order__ = ["name", "symtype", "value"]
class SectionGroup(cmodel.Struct): name = cmodel.String("ascii") typeid = cmodel.Enum(cmodel.LeU32, "GROUP_TEXT", "GROUP_BSS") __order__ = ["name", "typeid"]
class Rgb2Symbol(cmodel.Struct): name = cmodel.String("ascii") symtype = cmodel.Enum(cmodel.U8, "LOCAL", "IMPORT", "EXPORT") value = cmodel.If("symtype", lambda x: x in [0, 2], Rgb2SymValue) __order__ = ["name", "symtype", "value"]