{"version":3,"sources":["assembly/disassembler/class.ts"],"names":["PrimitiveInt","PrimitiveFloat","PrimitiveString","utilNumberToHex","InstructionAbstractCompareAndBranchIfFalseBranchTarget","InstructionAbstractBranchAlwaysBranchTarget","InstructionBCLCompareAndBranchIfFalse","InstructionBCLBranchAlways","InstructionAbstractBranchTarget","InstructionBCLPushConstantString","InstructionBCLCreateObject","InstructionBCLGetThisMemberFunction","InstructionBCLGetThisMemberValue","InstructionBCLSetThisMemberValue","InstructionBCLGetMemberFunction","InstructionBCLGetMemberValue","InstructionBCLSetMemberValue","InstructionBCLLineNumberAlt1","InstructionBCLGetGameVariable","InstructionBCLSetGameVariable","InstructionBCLCallGameFunction","InstructionBCLCallGameFunctionFromString","InstructionBCLCallGameFunctionDirect","InstructionBCLGetVariableValue","InstructionBCLSetVariableValue","InstructionBCLPushConstantColor8888","InstructionBCLPushConstantColor5551","typed","ExceptionInternal","ExceptionInvalid","ASTNodeFile","ASTNodeArgumentNumber","ASTNodeArgumentString","ASTNodeStatementInstruction","ASTNodeStatementBlock","ASTNodeStatementLine","Assembly","AssemblyDisassembler","constructor","disableTransformSymbols","enableIndexComments","reset","disassemble","osi","ast","entries","statements","add","args","push","nl","subroutineOffsetToId","_disassembleMapSubroutineOffsetToId","functionsByOffset","_disassembleMapFunctionOffsetToDefinitions","classMethodByOffset","_disassembleMapClassMethodOffsetToDefinitions","classParents","mapClassParents","classMethodImplementByOffset","_disassembleMapclassMethodImplementsByOffset","disassembleMetadata","disassembleStrings","disassembleGlobals","disassembleSymbols","disassembleSources","disassembleFunctions","disassembleClasses","entry","subroutines","itter","disassembleSubroutine","_disassembleCreateStatementBlock","version","_disassembleCreateStatementInstruction","arguments","_disassembleCreateArgumentFromInt","header","flags","disassembleStringP8NTable","stringTable","globalTable","symbolTable","sourceTable","table","name","instruction","tableEntries","i","length","inst","_disassembleCreateArgumentFromString","_disassembleSetComment","comment","begin","identifier","text","functionEntries","functionTable","func","disassembleFunction","functionDefinition","index","offset","value","id","get","undefined","argEntries","argc","_disassembleCreateArgumentFromNumber","parents","classEntries","classTable","nameByStructure","_disassembleMapClassStructuresToNames","structure","set","definition","parentName","parent","extend","extends","disassembleClass","classDefinition","comments","stringEncode","join","property","itterProperties","disassembleClassProperty","method","itterMethods","disassembleClassMethod","symbols","nameArg","_disassembleConvertSymbolToArgumentComment","symbol","arg","subroutineEntry","subroutine","mapSourceRange","Map","off","r","addLine","line","_disassembleCreateStatementLine","instructions","disassembleInstruction","_disassembleMapSourceRangeComment","classInfo","strings","globals","classes","disassembleInstructionArguments","jumpedTo","jumpedFrom","OUTER","cast","arg0","arg1","range","Math","min","max","str","classEntry","Instruction","indexNS","indexName","info","stringNS","stringName","nameIndex","globalName","argGet","disassembleInstructionArgument","argument","argumentIndex","int","base","float","_disassembleCreateArgumentFromFloat","lines","sources","source","src","subroutineID","has","list","names","Set","nameV","s","existing","methodSerialize","patentInfo","extending","inherited","ov","toString","end","sym"],"mappings":"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","sourcesContent":["import {\n\tPrimitive,\n\tPrimitiveInt,\n\tPrimitiveInt16U,\n\tPrimitiveFloat,\n\tPrimitiveString,\n\tPrimitiveStringP8N,\n\tutilNumberToHex\n} from '@sage-js/core';\nimport {\n\tOSI,\n\tStringP8NTable,\n\tFunctionDefinition,\n\tIClassDefinitionTableEntry,\n\tMapClassDefinitionTableEntryExtends,\n\tClassDefinitionProperty,\n\tClassDefinitionMethod,\n\tISubroutineTableEntry,\n\tInstruction,\n\tInstructionAbstractCompareAndBranchIfFalseBranchTarget,\n\tInstructionAbstractBranchAlwaysBranchTarget,\n\tInstructionBCLCompareAndBranchIfFalse,\n\tInstructionBCLBranchAlways,\n\tInstructionAbstractBranchTarget,\n\tInstructionBCLPushConstantString,\n\tInstructionBCLCreateObject,\n\tInstructionBCLGetThisMemberFunction,\n\tInstructionBCLGetThisMemberValue,\n\tInstructionBCLSetThisMemberValue,\n\tInstructionBCLGetMemberFunction,\n\tInstructionBCLGetMemberValue,\n\tInstructionBCLSetMemberValue,\n\tInstructionBCLLineNumberAlt1,\n\tInstructionBCLGetGameVariable,\n\tInstructionBCLSetGameVariable,\n\tInstructionBCLCallGameFunction,\n\tInstructionBCLCallGameFunctionFromString,\n\tInstructionBCLCallGameFunctionDirect,\n\tInstructionBCLGetVariableValue,\n\tInstructionBCLSetVariableValue,\n\tInstructionBCLPushConstantColor8888,\n\tInstructionBCLPushConstantColor5551\n} from '@sage-js/res-osi';\n\nimport {typed} from '../../typed';\nimport {\n\tMapSubroutineOffsetToId,\n\tMapFunctionOffsetToDefinitions,\n\tMapClassMethodOffsetToDefinitions,\n\tMapClassStructuresToNames,\n\tMapSourceRange\n} from '../../types';\nimport {ExceptionInternal} from '../../exception/internal';\nimport {ExceptionInvalid} from '../../exception/invalid';\nimport {ASTNodeFile} from '../../ast/node/file';\nimport {ASTNodeComment} from '../../ast/node/comment';\nimport {ASTNodeArgument} from '../../ast/node/argument/class';\nimport {ASTNodeArgumentNumber} from '../../ast/node/argument/number';\nimport {ASTNodeArgumentString} from '../../ast/node/argument/string';\nimport {ASTNodeStatement} from '../../ast/node/statement/class';\nimport {\n\tASTNodeStatementInstruction\n} from '../../ast/node/statement/instruction';\nimport {ASTNodeStatementBlock} from '../../ast/node/statement/block';\nimport {ASTNodeStatementLine} from '../../ast/node/statement/line';\nimport {Assembly} from '../class';\n\n/**\n * AssemblyDisassembler constructor.\n */\nexport class AssemblyDisassembler extends Assembly {\n\t/**\n\t * Disable transforming class property and method symbols to strings.\n\t */\n\tpublic disableTransformSymbols = false;\n\n\t/**\n\t * Include comments for the index different things appear.\n\t */\n\tpublic enableIndexComments = false;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Reset any stateful properties.\n\t */\n\tpublic reset() {\n\t\t// Does nothing at present.\n\t}\n\n\t/**\n\t * Disassemble OSI to AST.\n\t *\n\t * @param osi OSI instance.\n\t * @returns AST file.\n\t */\n\tpublic disassemble(osi: OSI) {\n\t\tconst ast = new ASTNodeFile();\n\n\t\t// Helper functions.\n\t\tconst {entries} = ast.statements;\n\t\tconst add = (...args: ASTNodeStatement[]) => {\n\t\t\tentries.push(...args);\n\t\t};\n\t\tconst nl = () => {\n\t\t\tadd(new ASTNodeStatementLine());\n\t\t};\n\n\t\t// Create mappings.\n\t\tconst subroutineOffsetToId =\n\t\t\tthis._disassembleMapSubroutineOffsetToId(osi);\n\n\t\tconst functionsByOffset =\n\t\t\tthis._disassembleMapFunctionOffsetToDefinitions(osi);\n\n\t\tconst classMethodByOffset =\n\t\t\tthis._disassembleMapClassMethodOffsetToDefinitions(osi);\n\n\t\tconst classParents = osi.mapClassParents();\n\n\t\tconst classMethodImplementByOffset =\n\t\t\tthis._disassembleMapclassMethodImplementsByOffset(\n\t\t\t\tosi,\n\t\t\t\tclassParents\n\t\t\t);\n\n\t\t// Create the AST statements.\n\t\tadd(...this.disassembleMetadata(osi));\n\t\tnl();\n\t\tadd(...this.disassembleStrings(osi));\n\t\tnl();\n\t\tadd(...this.disassembleGlobals(osi));\n\t\tnl();\n\t\tadd(...this.disassembleSymbols(osi));\n\t\tnl();\n\t\tadd(...this.disassembleSources(osi));\n\t\tnl();\n\t\tadd(...this.disassembleFunctions(\n\t\t\tosi,\n\t\t\tsubroutineOffsetToId\n\t\t));\n\t\tnl();\n\t\tadd(...this.disassembleClasses(\n\t\t\tosi,\n\t\t\tsubroutineOffsetToId,\n\t\t\tclassParents\n\t\t));\n\n\t\tfor (const entry of osi.subroutines.itter()) {\n\t\t\tnl();\n\t\t\tadd(...this.disassembleSubroutine(\n\t\t\t\tosi,\n\t\t\t\tentry,\n\t\t\t\tsubroutineOffsetToId,\n\t\t\t\tfunctionsByOffset,\n\t\t\t\tclassMethodByOffset,\n\t\t\t\tclassMethodImplementByOffset\n\t\t\t));\n\t\t}\n\n\t\treturn ast;\n\t}\n\n\t/**\n\t * Encode OSI AST metadata.\n\t *\n\t * @param osi OSI instance.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleMetadata(osi: OSI): ASTNodeStatement[] {\n\t\tconst ast = this._disassembleCreateStatementBlock('metadata');\n\n\t\tconst version = this._disassembleCreateStatementInstruction('version');\n\n\t\tversion.arguments.entries.push(\n\t\t\tthis._disassembleCreateArgumentFromInt(osi.header.version),\n\t\t\tthis._disassembleCreateArgumentFromInt(osi.header.flags)\n\t\t);\n\n\t\tast.statements.entries.push(version);\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST strings.\n\t *\n\t * @param osi OSI instance.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleStrings(osi: OSI): ASTNodeStatement[] {\n\t\treturn this.disassembleStringP8NTable(\n\t\t\tosi.header.stringTable,\n\t\t\t'strings',\n\t\t\t'string'\n\t\t);\n\t}\n\n\t/**\n\t * Encode OSI AST globals.\n\t *\n\t * @param osi OSI instance.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleGlobals(osi: OSI): ASTNodeStatement[] {\n\t\treturn this.disassembleStringP8NTable(\n\t\t\tosi.header.globalTable,\n\t\t\t'globals',\n\t\t\t'global'\n\t\t);\n\t}\n\n\t/**\n\t * Encode OSI AST symbols.\n\t *\n\t * @param osi OSI instance.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleSymbols(osi: OSI): ASTNodeStatement[] {\n\t\treturn this.disassembleStringP8NTable(\n\t\t\tosi.header.symbolTable,\n\t\t\t'symbols',\n\t\t\t'symbol'\n\t\t);\n\t}\n\n\t/**\n\t * Encode OSI AST sources.\n\t *\n\t * @param osi OSI instance.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleSources(osi: OSI): ASTNodeStatement[] {\n\t\treturn this.disassembleStringP8NTable(\n\t\t\tosi.header.sourceTable,\n\t\t\t'sources',\n\t\t\t'source'\n\t\t);\n\t}\n\n\t/**\n\t * Encode OSI AST PrimitiveStringP8NTable.\n\t *\n\t * @param table Table to be encoded.\n\t * @param name Block name.\n\t * @param instruction Instruction names.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleStringP8NTable(\n\t\ttable: StringP8NTable,\n\t\tname: string,\n\t\tinstruction: string\n\t): ASTNodeStatement[] {\n\t\tconst ast = this._disassembleCreateStatementBlock(name);\n\t\tconst {entries} = ast.statements;\n\n\t\tconst tableEntries = table.entries;\n\t\tfor (let i = 0; i < tableEntries.length; i++) {\n\t\t\tconst entry = tableEntries[i];\n\n\t\t\tconst inst = this._disassembleCreateStatementInstruction(\n\t\t\t\tinstruction\n\t\t\t);\n\n\t\t\tinst.arguments.entries.push(\n\t\t\t\tthis._disassembleCreateArgumentFromString(entry)\n\t\t\t);\n\n\t\t\tif (this.enableIndexComments) {\n\t\t\t\tthis._disassembleSetComment(inst.comment, `${i}`);\n\t\t\t}\n\n\t\t\tentries.push(inst);\n\t\t}\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST functions.\n\t *\n\t * @param osi OSI instance.\n\t * @param subroutineOffsetToId Map of subroutine offsets to IDs.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleFunctions(\n\t\tosi: OSI,\n\t\tsubroutineOffsetToId: MapSubroutineOffsetToId\n\t): ASTNodeStatement[] {\n\t\tconst ast = this._disassembleCreateStatementBlock('functions');\n\t\tast.begin.identifier.text = 'functions';\n\n\t\tconst {entries} = ast.statements;\n\t\tconst functionEntries = osi.header.functionTable.entries;\n\t\tfor (let i = 0; i < functionEntries.length; i++) {\n\t\t\tconst func = functionEntries[i];\n\t\t\tentries.push(...this.disassembleFunction(\n\t\t\t\tosi,\n\t\t\t\tfunc,\n\t\t\t\ti,\n\t\t\t\tsubroutineOffsetToId\n\t\t\t));\n\t\t}\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST function.\n\t *\n\t * @param osi OSI instance.\n\t * @param functionDefinition Function definition.\n\t * @param index Table index.\n\t * @param subroutineOffsetToId Map of subroutine offsets to IDs.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleFunction(\n\t\tosi: OSI,\n\t\tfunctionDefinition: FunctionDefinition,\n\t\tindex: number,\n\t\tsubroutineOffsetToId: MapSubroutineOffsetToId\n\t): ASTNodeStatement[] {\n\t\tconst ast = this._disassembleCreateStatementInstruction('function');\n\t\tif (this.enableIndexComments) {\n\t\t\tthis._disassembleSetComment(ast.comment, `${index}`);\n\t\t}\n\n\t\tconst offset = functionDefinition.offset.value;\n\t\tconst id = subroutineOffsetToId.get(offset);\n\t\t// eslint-disable-next-line no-undefined\n\t\tif (id === undefined) {\n\t\t\tthrow new ExceptionInvalid(\n\t\t\t\t`No subroutine at offset: ${offset}`\n\t\t\t);\n\t\t}\n\n\t\tconst argEntries = ast.arguments.entries;\n\t\targEntries.push(\n\t\t\tthis._disassembleCreateArgumentFromString(functionDefinition.name)\n\t\t);\n\n\t\targEntries.push(\n\t\t\tthis._disassembleCreateArgumentFromInt(functionDefinition.argc)\n\t\t);\n\n\t\targEntries.push(\n\t\t\tthis._disassembleCreateArgumentFromNumber(id)\n\t\t);\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST classes.\n\t *\n\t * @param osi OSI instance.\n\t * @param subroutineOffsetToId Map of subroutine offsets to IDs.\n\t * @param parents Parent mappings.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleClasses(\n\t\tosi: OSI,\n\t\tsubroutineOffsetToId: MapSubroutineOffsetToId,\n\t\tparents: MapClassDefinitionTableEntryExtends | null = null\n\t): ASTNodeStatement[] {\n\t\tconst ast = this._disassembleCreateStatementBlock('classes');\n\t\tparents = parents || osi.mapClassParents();\n\n\t\tconst {entries} = ast.statements;\n\t\tconst classEntries = osi.header.classTable.entries;\n\t\tconst nameByStructure = this._disassembleMapClassStructuresToNames(osi);\n\t\tfor (const {name, structure} of classEntries) {\n\t\t\tnameByStructure.set(structure, name);\n\t\t}\n\t\tfor (let i = 0; i < classEntries.length; i++) {\n\t\t\tconst definition = classEntries[i];\n\t\t\tlet parentName: PrimitiveStringP8N | null = null;\n\t\t\tconst parent = parents.get(definition) || null;\n\t\t\tconst extend = definition.structure.extends;\n\t\t\tif (parent) {\n\t\t\t\tparentName = parent.name;\n\t\t\t}\n\t\t\telse if (extend) {\n\t\t\t\tparentName = nameByStructure.get(extend) || null;\n\t\t\t}\n\t\t\tentries.push(...this.disassembleClass(\n\t\t\t\tosi,\n\t\t\t\tdefinition,\n\t\t\t\ti,\n\t\t\t\tsubroutineOffsetToId,\n\t\t\t\tparentName\n\t\t\t));\n\t\t}\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST class.\n\t *\n\t * @param osi OSI instance.\n\t * @param classDefinition Class definition.\n\t * @param index Table index.\n\t * @param subroutineOffsetToId Map of subroutine offsets to IDs.\n\t * @param parentName Parent name or null.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleClass(\n\t\tosi: OSI,\n\t\tclassDefinition: IClassDefinitionTableEntry,\n\t\tindex: number,\n\t\tsubroutineOffsetToId: MapSubroutineOffsetToId,\n\t\tparentName: PrimitiveStringP8N | null = null\n\t): ASTNodeStatement[] {\n\t\tconst {name, structure} = classDefinition;\n\n\t\tconst comments = this.enableIndexComments ? [`${index}`] : [];\n\t\tif (parentName) {\n\t\t\tconst name = parentName.stringEncode();\n\t\t\tcomments.push(`extends ${name}`);\n\t\t}\n\n\t\tconst ast = this._disassembleCreateStatementBlock('class');\n\t\tthis._disassembleSetComment(ast.begin.comment, comments.join(', '));\n\n\t\tast.begin.arguments.entries.push(\n\t\t\tthis._disassembleCreateArgumentFromString(name)\n\t\t);\n\n\t\tconst {entries} = ast.statements;\n\n\t\tfor (const property of structure.itterProperties()) {\n\t\t\tentries.push(...this.disassembleClassProperty(\n\t\t\t\tosi,\n\t\t\t\tproperty\n\t\t\t));\n\t\t}\n\n\t\tfor (const method of structure.itterMethods()) {\n\t\t\tentries.push(...this.disassembleClassMethod(\n\t\t\t\tosi,\n\t\t\t\tmethod,\n\t\t\t\tsubroutineOffsetToId\n\t\t\t));\n\t\t}\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST class property.\n\t *\n\t * @param osi OSI instance.\n\t * @param property Class property.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleClassProperty(\n\t\tosi: OSI,\n\t\tproperty: ClassDefinitionProperty\n\t): ASTNodeStatement[] {\n\t\tconst symbols = osi.header.symbolTable.entries;\n\n\t\tconst ast = this._disassembleCreateStatementInstruction('property');\n\n\t\tconst nameArg = this._disassembleConvertSymbolToArgumentComment(\n\t\t\tsymbols,\n\t\t\tproperty.symbol\n\t\t);\n\t\tast.arguments.entries.push(nameArg.arg);\n\t\tif (nameArg.comment !== null) {\n\t\t\tthis._disassembleSetComment(ast.comment, nameArg.comment);\n\t\t}\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Encode OSI AST class property.\n\t *\n\t * @param osi OSI instance.\n\t * @param method Class method.\n\t * @param subroutineOffsetToId Map offsets to ID.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleClassMethod(\n\t\tosi: OSI,\n\t\tmethod: ClassDefinitionMethod,\n\t\tsubroutineOffsetToId: MapSubroutineOffsetToId\n\t): ASTNodeStatement[] {\n\t\tconst symbols = osi.header.symbolTable.entries;\n\n\t\tconst offset = method.offset.value;\n\t\tconst id = subroutineOffsetToId.get(offset);\n\t\t// eslint-disable-next-line no-undefined\n\t\tif (id === undefined) {\n\t\t\tthrow new ExceptionInvalid(\n\t\t\t\t`No subroutine at offset: ${offset}`\n\t\t\t);\n\t\t}\n\n\t\tconst ast = this._disassembleCreateStatementInstruction('method');\n\n\t\tconst nameArg = this._disassembleConvertSymbolToArgumentComment(\n\t\t\tsymbols,\n\t\t\tmethod.symbol\n\t\t);\n\t\tast.arguments.entries.push(nameArg.arg);\n\t\tif (nameArg.comment !== null) {\n\t\t\tthis._disassembleSetComment(ast.comment, nameArg.comment);\n\t\t}\n\n\t\tast.arguments.entries.push(\n\t\t\tthis._disassembleCreateArgumentFromNumber(id)\n\t\t);\n\n\t\treturn [ast];\n\t}\n\n\t/**\n\t * Subroutine block from OSI.\n\t *\n\t * @param osi OSI instance.\n\t * @param subroutineEntry Subroutine entry.\n\t * @param subroutineOffsetToId Map offsets to ID.\n\t * @param functionsByOffset Map function offset to function info.\n\t * @param classMethodByOffset Map class offset to method info.\n\t * @param classMethodImplementByOffset Map class offset to implement info.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleSubroutine(\n\t\tosi: OSI,\n\t\tsubroutineEntry: ISubroutineTableEntry,\n\t\tsubroutineOffsetToId: MapSubroutineOffsetToId,\n\t\tfunctionsByOffset: MapFunctionOffsetToDefinitions,\n\t\tclassMethodByOffset: MapClassMethodOffsetToDefinitions,\n\t\tclassMethodImplementByOffset: MapClassMethodOffsetToDefinitions\n\t): ASTNodeStatement[] {\n\t\tconst {offset, subroutine} = subroutineEntry;\n\n\t\tconst symbols = osi.header.symbolTable.entries;\n\n\t\tconst mapSourceRange = new Map() as MapSourceRange;\n\n\t\tconst off = offset.value;\n\t\tconst id = subroutineOffsetToId.get(off);\n\t\t// eslint-disable-next-line no-undefined\n\t\tif (id === undefined) {\n\t\t\tthrow new ExceptionInvalid(\n\t\t\t\t`No subroutine at offset: ${off}`\n\t\t\t);\n\t\t}\n\n\t\tconst r: ASTNodeStatement[] = [];\n\n\t\tconst addLine = (comment = '') => {\n\t\t\tconst line = this._disassembleCreateStatementLine();\n\t\t\tthis._disassembleSetComment(line.comment, comment);\n\t\t\tr.push(line);\n\t\t};\n\n\t\tconst ast = this._disassembleCreateStatementBlock('subroutine');\n\t\tast.begin.arguments.entries.push(\n\t\t\tthis._disassembleCreateArgumentFromNumber(id)\n\t\t);\n\t\taddLine(`address: 0x${utilNumberToHex(off)}`);\n\n\t\t// Loop over the instructions.\n\t\tconst {entries} = ast.statements;\n\t\tfor (const instruction of subroutine.instructions) {\n\t\t\tentries.push(...this.disassembleInstruction(\n\t\t\t\tosi,\n\t\t\t\tinstruction,\n\t\t\t\tsubroutineEntry,\n\t\t\t\tmapSourceRange\n\t\t\t));\n\t\t}\n\n\t\t// Add comments for source file range.\n\t\tr.push(...this._disassembleMapSourceRangeComment(osi, mapSourceRange));\n\n\t\t// Add comments for any function that references this.\n\t\tfor (const func of functionsByOffset.get(off) || []) {\n\t\t\taddLine(`function: ${func.name.stringEncode()}`);\n\t\t}\n\n\t\t// Add comments for methods that did not inherit the subroutine.\n\t\tfor (const {\n\t\t\tclassInfo,\n\t\t\tmethod\n\t\t} of classMethodImplementByOffset.get(off) || []) {\n\t\t\tconst symbol = symbols[method.symbol.value];\n\t\t\tconst {name} = classInfo;\n\t\t\taddLine(\n\t\t\t\t`implement: ${name.stringEncode()}.${symbol.stringEncode()}`\n\t\t\t);\n\t\t}\n\n\t\t// Add comments for any methods that references this.\n\t\tfor (const {\n\t\t\tclassInfo,\n\t\t\tmethod\n\t\t} of classMethodByOffset.get(off) || []) {\n\t\t\tconst symbol = symbols[method.symbol.value];\n\t\t\tconst {name} = classInfo;\n\t\t\taddLine(`method: ${name.stringEncode()}.${symbol.stringEncode()}`);\n\t\t}\n\n\t\tr.push(ast);\n\t\treturn r;\n\t}\n\n\t/**\n\t * Subroutine block from OSI.\n\t *\n\t * @param osi OSI instance.\n\t * @param instruction Subroutine instruction.\n\t * @param subroutineEntry Subroutine entry.\n\t * @param mapSourceRange Map sources to ranges.\n\t * @returns AST statements.\n\t */\n\tpublic disassembleInstruction(\n\t\tosi: OSI,\n\t\tinstruction: Instruction,\n\t\tsubroutineEntry: ISubroutineTableEntry,\n\t\tmapSourceRange: MapSourceRange\n\t) {\n\t\tconst strings = osi.header.stringTable.entries;\n\t\tconst symbols = osi.header.symbolTable.entries;\n\t\tconst globals = osi.header.globalTable.entries;\n\t\tconst classes = osi.header.classTable.entries;\n\n\t\tconst r: ASTNodeStatement[] = [];\n\n\t\tconst ast = this._disassembleCreateStatementInstruction(\n\t\t\tinstruction.name\n\t\t);\n\t\tast.arguments.entries = this.disassembleInstructionArguments(\n\t\t\tosi,\n\t\t\tinstruction\n\t\t);\n\n\t\tlet comment = '';\n\t\tlet jumpedTo = false;\n\t\tlet jumpedFrom = false;\n\n\t\tOUTER: do {\n\t\t\t// Create source file comment file and range info.\n\t\t\t{\n\t\t\t\tconst cast =\n\t\t\t\t\ttyped.cast(instruction, InstructionBCLLineNumberAlt1);\n\t\t\t\tif (cast) {\n\t\t\t\t\tconst line = cast.arg0.value;\n\t\t\t\t\tconst index = cast.arg1.value;\n\t\t\t\t\tconst range = mapSourceRange.get(index);\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\trange[0] = Math.min(range[0], line);\n\t\t\t\t\t\trange[1] = Math.max(range[1], line);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tmapSourceRange.set(index, [line, line]);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Lookup strings.\n\t\t\t{\n\t\t\t\tconst cast =\n\t\t\t\t\ttyped.cast(instruction, InstructionBCLPushConstantString);\n\t\t\t\tif (cast) {\n\t\t\t\t\tconst index = cast.arg0.value;\n\t\t\t\t\tconst str = strings[index];\n\t\t\t\t\tif (str) {\n\t\t\t\t\t\tcomment = str.stringEncode();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcomment = '?';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Lookup class.\n\t\t\t{\n\t\t\t\tconst cast =\n\t\t\t\t\ttyped.cast(instruction, InstructionBCLCreateObject);\n\t\t\t\tif (cast) {\n\t\t\t\t\tconst index = cast.arg0.value;\n\t\t\t\t\tconst classEntry = classes[index];\n\t\t\t\t\tif (classEntry) {\n\t\t\t\t\t\tcomment = classEntry.name.stringEncode();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcomment = '?';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Loopup symbols.\n\t\t\tfor (const Instruction of [\n\t\t\t\tInstructionBCLGetThisMemberFunction,\n\t\t\t\tInstructionBCLGetThisMemberValue,\n\t\t\t\tInstructionBCLSetThisMemberValue,\n\t\t\t\tInstructionBCLGetMemberFunction,\n\t\t\t\tInstructionBCLGetMemberValue,\n\t\t\t\tInstructionBCLSetMemberValue\n\t\t\t]) {\n\t\t\t\tconst cast = typed.cast(instruction, Instruction);\n\t\t\t\tif (!cast) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst index = cast.arg0.value;\n\t\t\t\tconst symbol = symbols[index];\n\t\t\t\tif (symbol) {\n\t\t\t\t\tcomment = symbol.stringEncode();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcomment = '?';\n\t\t\t\t}\n\t\t\t\tbreak OUTER;\n\t\t\t}\n\n\t\t\t// Lookup strings for functions.\n\t\t\t{\n\t\t\t\tconst cast = typed.cast(\n\t\t\t\t\tinstruction,\n\t\t\t\t\tInstructionBCLCallGameFunctionFromString\n\t\t\t\t);\n\t\t\t\tif (cast) {\n\t\t\t\t\tconst index = cast.arg0.value;\n\t\t\t\t\tconst str = strings[index];\n\t\t\t\t\tif (str) {\n\t\t\t\t\t\tcomment = str.stringEncode();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcomment = '?';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const Instruction of [\n\t\t\t\tInstructionBCLGetGameVariable,\n\t\t\t\tInstructionBCLSetGameVariable,\n\t\t\t\tInstructionBCLCallGameFunction\n\t\t\t]) {\n\t\t\t\tconst cast = typed.cast(instruction, Instruction);\n\t\t\t\tif (!cast) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst indexNS = cast.arg0.value;\n\t\t\t\tconst indexName = cast.arg1.value;\n\t\t\t\tconst info = ['?', '?'];\n\n\t\t\t\tconst stringNS = strings[indexNS];\n\t\t\t\tif (stringNS) {\n\t\t\t\t\tinfo[0] = stringNS.stringEncode();\n\t\t\t\t}\n\t\t\t\tconst stringName = strings[indexName];\n\t\t\t\tif (stringName) {\n\t\t\t\t\tinfo[1] = stringName.stringEncode();\n\t\t\t\t}\n\t\t\t\tcomment = info.join('.');\n\n\t\t\t\tbreak OUTER;\n\t\t\t}\n\n\t\t\t// Mark variables as global or local.\n\t\t\tfor (const Instruction of [\n\t\t\t\tInstructionBCLGetVariableValue,\n\t\t\t\tInstructionBCLSetVariableValue\n\t\t\t]) {\n\t\t\t\tconst cast = typed.cast(instruction, Instruction);\n\t\t\t\tif (!cast) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst index = cast.arg0.value;\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tif (index & 0x8000) {\n\t\t\t\t\tcomment = 'global';\n\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tconst nameIndex = index ^ 0x8000;\n\t\t\t\t\tconst globalName = globals[nameIndex];\n\t\t\t\t\tif (globalName) {\n\t\t\t\t\t\tcomment += ` ${globalName.stringEncode()}`;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcomment += ' ?';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcomment = 'local';\n\t\t\t\t}\n\t\t\t\tbreak OUTER;\n\t\t\t}\n\n\t\t\t// Add newline after branchers.\n\t\t\tfor (const Instruction of [\n\t\t\t\tInstructionAbstractCompareAndBranchIfFalseBranchTarget,\n\t\t\t\tInstructionAbstractBranchAlwaysBranchTarget\n\t\t\t]) {\n\t\t\t\tconst cast = typed.cast(instruction, Instruction);\n\t\t\t\tif (!cast) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// If the instruction includes an offset add warning.\n\t\t\t\tif (cast.arg1.value) {\n\t\t\t\t\tcomment = 'WARNING: Offset from target';\n\t\t\t\t}\n\t\t\t\tjumpedFrom = true;\n\t\t\t\tbreak OUTER;\n\t\t\t}\n\t\t\tfor (const Instruction of [\n\t\t\t\tInstructionBCLCompareAndBranchIfFalse,\n\t\t\t\tInstructionBCLBranchAlways\n\t\t\t]) {\n\t\t\t\tconst cast = typed.cast(instruction, Instruction);\n\t\t\t\tif (!cast) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tjumpedFrom = true;\n\t\t\t\tbreak OUTER;\n\t\t\t}\n\n\t\t\t// Add newline before targets.\n\t\t\tfor (const Instruction of [\n\t\t\t\tInstructionAbstractBranchTarget\n\t\t\t]) {\n\t\t\t\tconst cast = typed.cast(instruction, Instruction);\n\t\t\t\tif (!cast) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tjumpedTo = true;\n\t\t\t\tbreak OUTER;\n\t\t\t}\n\n\t\t\t// Add a warning comment for an unexpected instructions.\n\t\t\tfor (const Instruction of [\n\t\t\t\tInstructionBCLCallGameFunctionDirect\n\t\t\t]) {\n\t\t\t\tconst cast = typed.cast(instruction, Instruction);\n\t\t\t\tif (!cast) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcomment = 'WARNING: Unexpected instruction';\n\t\t\t\tbreak OUTER;\n\t\t\t}\n\t\t}\n\t\t// eslint-disable-next-line no-constant-condition\n\t\twhile (false);\n\n\t\tif (jumpedTo) {\n\t\t\tconst line = new ASTNodeStatementLine();\n\t\t\tthis._disassembleSetComment(line.comment, '<-');\n\t\t\tr.push(line);\n\t\t}\n\n\t\tthis._disassembleSetComment(ast.comment, comment);\n\t\tr.push(ast);\n\n\t\tif (jumpedFrom) {\n\t\t\tconst line = new ASTNodeStatementLine();\n\t\t\tthis._disassembleSetComment(line.comment, '->');\n\t\t\tr.push(line);\n\t\t}\n\n\t\treturn r;\n\t}\n\n\t/**\n\t * Arguments AST from instruction.\n\t *\n\t * @param osi OSI instance.\n\t * @param instruction Instruction.\n\t * @returns AST arguments.\n\t */\n\tpublic disassembleInstructionArguments(\n\t\tosi: OSI,\n\t\tinstruction: Instruction\n\t): ASTNodeArgument[] {\n\t\tconst r: ASTNodeArgument[] = [];\n\t\tfor (let i = 0; i < instruction.argc; i++) {\n\t\t\tconst arg = instruction.argGet(i);\n\t\t\tr.push(\n\t\t\t\tthis.disassembleInstructionArgument(\n\t\t\t\t\tosi,\n\t\t\t\t\targ,\n\t\t\t\t\ti,\n\t\t\t\t\tinstruction\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Argument AST from instruction and argument.\n\t *\n\t * @param osi OSI instance.\n\t * @param argument Instruction argument.\n\t * @param argumentIndex Instruction argument index.\n\t * @param instruction Instruction.\n\t * @returns AST argument.\n\t */\n\tpublic disassembleInstructionArgument(\n\t\tosi: OSI,\n\t\targument: Primitive,\n\t\targumentIndex: number,\n\t\tinstruction: Instruction\n\t): ASTNodeArgument {\n\t\tconst int = typed.cast(argument, PrimitiveInt);\n\t\tif (int) {\n\t\t\tlet base = 10;\n\n\t\t\t// Change base for some instruction types.\n\t\t\t// Perhaps make this extendable.\n\t\t\tif (\n\t\t\t\targumentIndex === 0 &&\n\t\t\t\t(\n\t\t\t\t\ttyped.cast(\n\t\t\t\t\t\tinstruction,\n\t\t\t\t\t\tInstructionBCLPushConstantColor8888\n\t\t\t\t\t) ||\n\t\t\t\t\ttyped.cast(\n\t\t\t\t\t\tinstruction,\n\t\t\t\t\t\tInstructionBCLPushConstantColor5551\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tbase = 16;\n\t\t\t}\n\n\t\t\treturn this._disassembleCreateArgumentFromInt(int, base);\n\t\t}\n\n\t\tconst float = typed.cast(argument, PrimitiveFloat);\n\t\tif (float) {\n\t\t\treturn this._disassembleCreateArgumentFromFloat(float);\n\t\t}\n\n\t\tconst str = typed.cast(argument, PrimitiveString);\n\t\tif (str) {\n\t\t\treturn this._disassembleCreateArgumentFromString(str);\n\t\t}\n\n\t\t// Should never get here.\n\t\tthrow new ExceptionInternal('Unhandled instruction argument type');\n\t}\n\n\t/**\n\t * Subroutine block from OSI.\n\t *\n\t * @param osi OSI instance.\n\t * @param mapSourceRange Map sources to ranges.\n\t * @returns AST statements.\n\t */\n\tprotected _disassembleMapSourceRangeComment(\n\t\tosi: OSI,\n\t\tmapSourceRange: MapSourceRange\n\t) {\n\t\tconst lines: ASTNodeStatementLine[] = [];\n\t\tconst sources = osi.header.sourceTable.entries;\n\n\t\t// Add comments for source file range.\n\t\tfor (const [index, range] of mapSourceRange) {\n\t\t\tconst source = sources[index];\n\t\t\tconst line = this._disassembleCreateStatementLine();\n\t\t\tconst src = source ? source.stringEncode() : 'unknown';\n\t\t\tthis._disassembleSetComment(\n\t\t\t\tline.comment,\n\t\t\t\t`source: ${index} ${src} ${range.join(':')}`\n\t\t\t);\n\t\t\tlines.push(line);\n\t\t}\n\n\t\treturn lines;\n\t}\n\n\t/**\n\t * Map subroutine offsets to incremental IDs.\n\t *\n\t * @param osi OSI instance.\n\t * @returns Map object.\n\t */\n\tprotected _disassembleMapSubroutineOffsetToId(\n\t\tosi: OSI\n\t): MapSubroutineOffsetToId {\n\t\t// Create subroutine offset to ID mappings.\n\t\tconst r = new Map() as MapSubroutineOffsetToId;\n\t\tlet subroutineID = 0;\n\t\tfor (const {offset} of osi.subroutines.itter()) {\n\t\t\tconst off = offset.value;\n\t\t\tif (r.has(subroutineID)) {\n\t\t\t\tthrow new ExceptionInvalid(`Duplicate offset: ${off}`);\n\t\t\t}\n\t\t\tr.set(off, subroutineID);\n\t\t\tsubroutineID++;\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Map function offsets to function definitions.\n\t *\n\t * @param osi OSI instance.\n\t * @returns Map object.\n\t */\n\tprotected _disassembleMapFunctionOffsetToDefinitions(\n\t\tosi: OSI\n\t): MapFunctionOffsetToDefinitions {\n\t\t// Create subroutine offset to function mappings.\n\t\tconst r = new Map() as MapFunctionOffsetToDefinitions;\n\t\tfor (const func of osi.header.functionTable.entries) {\n\t\t\tconst off = func.offset.value;\n\t\t\tconst list = r.get(off) || [];\n\t\t\tlist.push(func);\n\t\t\tr.set(off, list);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Map OSI class structures to names, with some sanity checking.\n\t *\n\t * @param osi OSI instance.\n\t * @returns Map object.\n\t */\n\tprotected _disassembleMapClassStructuresToNames(osi: OSI) {\n\t\tconst names = new Set<string>();\n\t\tconst r = new Map() as MapClassStructuresToNames;\n\t\tfor (const {name, structure} of osi.header.classTable.entries) {\n\t\t\tconst nameV = name.value;\n\t\t\tif (names.has(nameV)) {\n\t\t\t\tconst s = name.stringEncode();\n\t\t\t\tthrow new ExceptionInvalid(`Class name not unique: ${s}`);\n\t\t\t}\n\t\t\tnames.add(nameV);\n\n\t\t\tconst existing = r.get(structure) || null;\n\t\t\tif (existing) {\n\t\t\t\tconst s = name.stringEncode();\n\t\t\t\tthrow new ExceptionInvalid(`Class structure not unique: ${s}`);\n\t\t\t}\n\t\t\tr.set(structure, name);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Map class method offsets to class definitions.\n\t *\n\t * @param osi OSI instance.\n\t * @returns Map object.\n\t */\n\tprotected _disassembleMapClassMethodOffsetToDefinitions(\n\t\tosi: OSI\n\t): MapClassMethodOffsetToDefinitions {\n\t\t// Create subroutine offset to class and method mappings.\n\t\tconst r = new Map() as MapClassMethodOffsetToDefinitions;\n\t\tfor (const classInfo of osi.header.classTable.entries) {\n\t\t\tconst {structure} = classInfo;\n\t\t\tfor (const method of structure.itterMethods()) {\n\t\t\t\tconst off = method.offset.value;\n\t\t\t\tconst list = r.get(off) || [];\n\t\t\t\tlist.push({classInfo, method});\n\t\t\t\tr.set(off, list);\n\t\t\t}\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Map class method offsets to class definitions of implementation.\n\t *\n\t * @param osi OSI instance.\n\t * @param parents Parent mappings.\n\t * @returns Map object.\n\t */\n\tprotected _disassembleMapclassMethodImplementsByOffset(\n\t\tosi: OSI,\n\t\tparents: MapClassDefinitionTableEntryExtends | null = null\n\t) {\n\t\tparents = parents || osi.mapClassParents();\n\n\t\tconst methodSerialize = (method: ClassDefinitionMethod) =>\n\t\t\t`${method.symbol.value},${method.offset.value}`;\n\n\t\t// Create subroutine offset to class and method mappings.\n\t\tconst r = new Map() as MapClassMethodOffsetToDefinitions;\n\t\tfor (const classInfo of osi.header.classTable.entries) {\n\t\t\tconst {structure} = classInfo;\n\t\t\tconst extend = structure.extends;\n\t\t\tconst patentInfo = parents.get(classInfo) || null;\n\t\t\tconst extending = patentInfo ? patentInfo.structure : extend;\n\t\t\t// console.log(extending);\n\n\t\t\t// List methods that may be inherited.\n\t\t\tconst inherited = new Set<string>();\n\t\t\tif (extending) {\n\t\t\t\tfor (const method of extending.itterMethods()) {\n\t\t\t\t\tinherited.add(methodSerialize(method));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Itterate methods to find those that are not being inherited.\n\t\t\tfor (const method of structure.itterMethods()) {\n\t\t\t\t// Skip inherited.\n\t\t\t\tif (inherited.has(methodSerialize(method))) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Add those not inherited to map.\n\t\t\t\tconst ov = method.offset.value;\n\t\t\t\tconst list = r.get(ov) || [];\n\t\t\t\tr.set(ov, list);\n\t\t\t\tlist.push({\n\t\t\t\t\tclassInfo,\n\t\t\t\t\tmethod\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Create argument number from primitive int.\n\t *\n\t * @param value Primitive int.\n\t * @param base Integer base.\n\t * @returns AST argument.\n\t */\n\tprotected _disassembleCreateArgumentFromInt(\n\t\tvalue: PrimitiveInt,\n\t\tbase = 10\n\t) {\n\t\tconst ast = new ASTNodeArgumentNumber();\n\t\tast.text = value.stringEncode(base);\n\t\treturn ast;\n\t}\n\n\t/**\n\t * Create argument number from primitive float.\n\t *\n\t * @param value Primitive float.\n\t * @returns AST argument.\n\t */\n\tprotected _disassembleCreateArgumentFromFloat(\n\t\tvalue: PrimitiveFloat\n\t) {\n\t\tconst ast = new ASTNodeArgumentNumber();\n\t\tast.text = value.stringEncode();\n\t\treturn ast;\n\t}\n\n\t/**\n\t * Create argument number from regular number primitive.\n\t *\n\t * @param value Number primitive.\n\t * @returns AST argument.\n\t */\n\tprotected _disassembleCreateArgumentFromNumber(\n\t\tvalue: number\n\t) {\n\t\tconst ast = new ASTNodeArgumentNumber();\n\t\tast.text = value.toString();\n\t\treturn ast;\n\t}\n\n\t/**\n\t * Create argument string from primitive string.\n\t *\n\t * @param value Primitive string.\n\t * @returns AST argument.\n\t */\n\tprotected _disassembleCreateArgumentFromString(\n\t\tvalue: PrimitiveString\n\t) {\n\t\tconst ast = new ASTNodeArgumentString();\n\t\tast.text = value.stringEncode();\n\t\treturn ast;\n\t}\n\n\t/**\n\t * Set comment from text.\n\t *\n\t * @param comment Comment node.\n\t * @param str Comment body.\n\t */\n\tprotected _disassembleSetComment(\n\t\tcomment: ASTNodeComment,\n\t\tstr: string\n\t) {\n\t\tcomment.text = str ? `; ${str}` : '';\n\t}\n\n\t/**\n\t * Create AST statement line.\n\t *\n\t * @returns New instance.\n\t */\n\tprotected _disassembleCreateStatementLine() {\n\t\treturn new ASTNodeStatementLine();\n\t}\n\n\t/**\n\t * Create AST statement block.\n\t *\n\t * @param id Identifier string.\n\t * @returns New instance.\n\t */\n\tprotected _disassembleCreateStatementBlock(id: string) {\n\t\tconst ast = new ASTNodeStatementBlock();\n\t\tast.begin.identifier.text = id;\n\t\tthis._disassembleSetComment(ast.end.comment, id);\n\t\treturn ast;\n\t}\n\n\t/**\n\t * Create AST statement instruction.\n\t *\n\t * @param id Identifier string.\n\t * @returns New instance.\n\t */\n\tprotected _disassembleCreateStatementInstruction(id: string) {\n\t\tconst ast = new ASTNodeStatementInstruction();\n\t\tast.identifier.text = id;\n\t\treturn ast;\n\t}\n\n\t/**\n\t * Convert symbol to argument and comment.\n\t *\n\t * @param symbols Symbols list.\n\t * @param symbol Symbol ID.\n\t * @returns Arg an comment values.\n\t */\n\tprotected _disassembleConvertSymbolToArgumentComment(\n\t\tsymbols: PrimitiveStringP8N[],\n\t\tsymbol: PrimitiveInt16U\n\t) {\n\t\tconst sym = symbols[symbol.value];\n\t\tif (this.disableTransformSymbols || !sym) {\n\t\t\treturn {\n\t\t\t\targ: this._disassembleCreateArgumentFromInt(symbol),\n\t\t\t\tcomment: sym ? sym.stringEncode() : null\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\targ: this._disassembleCreateArgumentFromString(sym),\n\t\t\tcomment: this.enableIndexComments ? symbol.stringEncode() : null\n\t\t};\n\t}\n}\n"],"file":"class.mjs","sourceRoot":"../../../src"}