public static CodeInfo DisassembleCode(GMFileContent content, uint id) { if (id >= content.Code->Count) { throw new ArgumentOutOfRangeException(nameof(id)); } var cee = (CodeEntryE *)GMFile.PtrFromOffset(content, (&content.Code->Offsets)[id]); var len = cee->Length; var bc = &cee->Bytecode; if (content.General->BytecodeVersion > 0xE) { var cef = (CodeEntryF *)cee; bc = (uint *)((byte *)&cef->BytecodeOffset + cef->BytecodeOffset); // ikr? } var ret = new List <IntPtr>(); // doesn't like T* as type arg len = Utils.PadTo(len, 4); AnyInstruction *instr; for (uint i = 0; i * 4 < len; /* see loop end */) { instr = (AnyInstruction *)(bc + i); ret.Add((IntPtr)instr); i += DisasmExt.Size(instr, content.General->BytecodeVersion); } return(new CodeInfo { Name = SectionReader.StringFromOffset(content, cee->Name), Instructions = Utils.MPtrListToPtrArr(ret), Size = cee->Length }); }