@gaialabs/core 0.1.16 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/compression/QuintetLZ.ts","../src/compression/registry.ts","../src/rom/project.ts","../src/rom/state.ts","../src/rom/extraction/processor.ts","../src/rom/extraction/reader.ts","../src/rom/extraction/references.ts","../src/rom/extraction/stack.ts","../src/rom/extraction/cop.ts","../src/rom/extraction/addressing.ts","../src/rom/extraction/transforms.ts","../src/utils/index.ts","../src/rom/extraction/strings.ts","../src/rom/extraction/parser.ts","../src/rom/extraction/asm.ts","../src/assembly/Stack.ts","../src/assembly/Registers.ts","../src/rom/extraction/blocks.ts","../src/rom/extraction/postprocessor.ts","../src/rom/extraction/writer.ts","../src/rom/rebuild/layout.ts","../src/rom/rebuild/processor.ts","../src/rom/rebuild/writer.ts","../src/rom/rebuild/string-processor.ts","../src/rom/rebuild/sorted-map.ts","../src/rom/rebuild/assembler-state.ts","../src/rom/rebuild/assembler.ts","../src/rom/generator.ts","../src/sprites/SpriteFrame.ts","../src/sprites/SpritePart.ts","../src/sprites/SpriteGroup.ts","../src/sprites/SpriteMap.ts","../src/index.ts"],"names":["BitStream","CompressionRegistry","readJsonFile","getDirectory","BlockReaderConstants","Address","AddressType","MemberType","Byte","Word","AddressSpace","LocationWrapper","StatusFlags","RomProcessingConstants","ChunkFileUtils","Op","RegisterType","createTableEntry","ChunkFile","BinType","createChunkFileFromDbFile","createChunkFileFromDbBlock","ObjectType","TypedNumber","obj","Long","x","AsmBlock","opCode","addrMode","summaryFromSupabaseByProject","crc32_buffer","DbRootUtils"],"mappings":"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","file":"index.js","sourcesContent":["import { BitStream, type ICompressionProvider } from '@gaialabs/shared';\n\n/**\n * QuintetLZ compression algorithm implementation\n * Dictionary-based compression used in Quintet games\n */\nexport class QuintetLZ implements ICompressionProvider {\n public static readonly DICTIONARY_SIZE = 0x100;\n public static readonly DICTIONARY_INIT = 0x20;\n public static readonly DICTIONARY_OFFSET = 0xEF;\n private static readonly DEFAULT_PAGE_SIZE = 0x8000;\n\n /**\n * Expand (decompress) data using QuintetLZ algorithm\n * @param srcData Source data buffer\n * @param srcPosition Starting position in source data\n * @param srcLen Length of source data to process\n * @returns Expanded data\n */\n public expand(srcData: Uint8Array, srcPosition: number = 0, srcLen: number = QuintetLZ.DEFAULT_PAGE_SIZE): Uint8Array {\n const bitStream = new BitStream(srcData, srcPosition);\n const srcStop = srcPosition + srcLen;\n\n // Initialize dictionary with spaces (0x20)\n const dictionary = new Uint8Array(QuintetLZ.DICTIONARY_SIZE);\n dictionary.fill(QuintetLZ.DICTIONARY_INIT);\n\n // Initialize positions\n let dictPosition = QuintetLZ.DICTIONARY_OFFSET;\n let outPosition = 0;\n\n // First two bytes is decompressed size\n const dstLen = bitStream.readShort();\n\n // Create output buffer with the expected size\n const outBuffer = new Uint8Array(dstLen);\n\n while (bitStream.currentPosition < srcStop && outPosition < dstLen) {\n // If current bit is set, read byte and add to output buffer and dictionary\n if (bitStream.readBit()) {\n // Read byte from bitstream\n const sample = bitStream.readByte();\n\n // Add byte to output buffer and increment\n if (outPosition < dstLen) {\n outBuffer[outPosition++] = sample;\n }\n\n // Add byte to dictionary\n dictionary[dictPosition] = sample;\n\n // Wrap dictionary index\n dictPosition = (dictPosition + 1) & 0xFF;\n }\n // If current bit is not set, read sequence from dictionary\n else {\n // Read wordIndex and wordLength from bitstream\n let wordIndex = bitStream.readByte();\n let wordLength = bitStream.readNibble() + 2;\n\n // Continue while there are remaining bytes to copy\n while (wordLength-- > 0) {\n // Read byte at wordIndex\n const sample = dictionary[wordIndex];\n\n // Wrap dictionary index\n wordIndex = (wordIndex + 1) & 0xFF;\n\n // Copy byte to output buffer and increment, but only if there is space\n if (outPosition < dstLen) {\n outBuffer[outPosition++] = sample;\n }\n\n // Add byte to dictionary and increment\n dictionary[dictPosition] = sample;\n\n // Wrap dictionary index\n dictPosition = (dictPosition + 1) & 0xFF;\n }\n }\n }\n\n // Return only the used portion of the buffer\n if (outPosition < dstLen) {\n return outBuffer.slice(0, outPosition);\n }\n\n return outBuffer;\n }\n\n /**\n * Compact (compress) data using QuintetLZ algorithm\n * @param srcData Source data to compress\n * @returns Compressed data\n */\n public compact(srcData: Uint8Array): Uint8Array {\n // Initialize dictionary with spaces\n const dictionary = new Uint8Array(QuintetLZ.DICTIONARY_SIZE);\n dictionary.fill(QuintetLZ.DICTIONARY_INIT);\n\n let offset = QuintetLZ.DICTIONARY_OFFSET;\n let srcIx = 0;\n let dstIx = 0;\n\n const srcLen = srcData.length;\n const outputBuffer = new Uint8Array(srcLen * 2); // Allocate extra space for safety\n\n // Write header (16-bit length in little-endian)\n outputBuffer[dstIx++] = srcLen & 0xFF;\n outputBuffer[dstIx++] = (srcLen >> 8) & 0xFF;\n\n const bitStream = new BitStream(outputBuffer, 2); // Start after header\n\n /**\n * Find the best match in the dictionary\n * @returns Tuple of [startByte, length]\n */\n const getCommand = (): [number, number] => {\n const maxLen = Math.min(srcLen - srcIx, 17);\n if (maxLen < 2) {\n return [0, 0];\n }\n\n let startByte = 0;\n let bestLen = 0;\n let bx = offset;\n\n for (let i = 0; i < 0x100; i++, bx = (bx + 1) & 0xFF) {\n let size = 0;\n let bix = bx;\n\n while (size < maxLen && dictionary[bix] === srcData[srcIx + size]) {\n bix = (bix + 1) & 0xFF;\n if (bix === offset) {\n bix = bx;\n }\n size++;\n }\n\n if (size > bestLen) {\n startByte = bx;\n bestLen = size;\n\n if (bestLen >= maxLen) {\n break;\n }\n }\n }\n\n return [startByte, bestLen];\n };\n\n while (srcIx < srcLen) {\n const [cmdStart, cmdLen] = getCommand();\n\n if (cmdLen >= 2) {\n // Write dictionary reference\n bitStream.writeBit(false);\n bitStream.writeByte(cmdStart);\n bitStream.writeNibble(cmdLen - 2);\n\n // Copy bytes to dictionary\n for (let i = 0; i < cmdLen; i++) {\n dictionary[offset] = srcData[srcIx++];\n offset = (offset + 1) & 0xFF;\n }\n } else {\n // Write literal byte\n bitStream.writeBit(true);\n const val = srcData[srcIx++];\n bitStream.writeByte(val);\n dictionary[offset] = val;\n offset = (offset + 1) & 0xFF;\n }\n }\n bitStream.flush();\n\n // Get the final size including the bit stream data\n const finalSize = Math.max(dstIx, bitStream.currentPosition);\n return outputBuffer.slice(0, finalSize);\n }\n} ","import { CompressionRegistry } from '@gaialabs/shared';\r\nimport { QuintetLZ } from './QuintetLZ';\r\n\r\n/**\r\n * Register compression providers with the global registry\r\n */\r\nexport function registerCompressionProviders(): void {\r\n // Register QuintetLZ compression provider\r\n CompressionRegistry.register('QuintetLZ', () => new QuintetLZ());\r\n}\r\n\r\n// Auto-register when this module is imported\r\nregisterCompressionProviders();\r\n","import { \n BinType, \n DbRootUtils, \n DbEntryPoint, \n type DbPath, \n readJsonFile, \n readFileAsBinary, \n getDirectory, \n type ChunkFile \n} from '@gaialabs/shared';\nimport '../compression'; // Import to ensure compression providers are registered\nimport { BlockReader, BlockWriter } from './extraction';\nimport { RomWriter } from './rebuild';\n\n/**\n * Main project management class\n * Converted from GaiaLib/ProjectRoot.cs\n */\nexport interface ProjectConfig {\n name: string;\n romPath: string;\n baseDir: string;\n system?: string;\n database: string;\n flipsPath?: string;\n resources: Record<BinType, DbPath>;\n databasePath?: string;\n systemPath?: string;\n compression?: string;\n}\n\n/**\n * Project root management\n */\nexport class ProjectRoot {\n public config: ProjectConfig;\n public name: string;\n public romPath: string;\n public baseDir: string;\n public system?: string;\n public database: string;\n public flipsPath?: string;\n public resources: Record<BinType, DbPath>;\n public databasePath?: string;\n public systemPath?: string;\n public compression?: string;\n\n constructor(config: ProjectConfig) {\n this.config = config;\n this.name = config.name;\n this.romPath = config.romPath;\n this.baseDir = config.baseDir;\n this.system = config.system;\n this.database = config.database;\n this.flipsPath = config.flipsPath;\n this.resources = config.resources;\n this.databasePath = config.databasePath;\n this.systemPath = config.systemPath;\n this.compression = config.compression;\n }\n\n /**\n * Load project from file or directory\n */\n public static async load(path?: string): Promise<ProjectRoot> {\n path = path || './project.json';\n\n try {\n // Try to load as JSON file using shared utility\n const config = await readJsonFile<ProjectConfig>(path);\n \n // Set default values\n if (!config.baseDir) {\n config.baseDir = await getDirectory(path);\n }\n \n //if (!config.database) {\n // config.database = 'us';\n //}\n\n //config.databasePath = `${config.baseDir}/db/${config.database}`;\n //config.systemPath = `${config.baseDir}/db/snes`;\n\n return new ProjectRoot(config);\n } catch (error) {\n // Fall back to directory-based configuration\n console.warn(`Failed to load project file: ${error}. Using directory-based configuration.`);\n }\n\n // Try as directory\n const defaultConfig: ProjectConfig = {\n name: 'GaiaLabs',\n baseDir: path,\n flipsPath: process?.env?.flips_path,\n romPath: process?.env?.rom_path || '',\n database: 'us',\n databasePath: `${path}/db/us`,\n systemPath: `${path}/db/snes`,\n resources: {} as Record<BinType, DbPath>\n };\n\n return new ProjectRoot(defaultConfig);\n }\n\n // /**\n // * Build the ROM (simplified)\n // */\n // public async build(files: ChunkFile[], entryPoints: DbEntryPoint[]): Promise<void> {\n // // Build ROM using rebuild writer\n // const writer = new RomWriter(entryPoints, this.config.cartName, this.config.makerCode);\n // await writer.repack(files);\n // }\n\n /**\n * Dump database and extract ROM data with comprehensive assembly processing\n */\n // public async dumpDatabase(): Promise<ChunkFile[]> {\n // // Load database and ROM data\n // const root = await DbRootUtils.fromFolder(this.databasePath!, this.systemPath!);\n // const rom = await readFileAsBinary(this.romPath);\n // //root.paths = this.resources;\n\n // const chunkReader = new BlockReader(rom, root);\n // const chunkFiles = chunkReader.analyzeAndResolve();\n\n // const blockWriter = new BlockWriter(chunkReader);\n // const writtenFiles = blockWriter.generateAllAsm(chunkFiles);\n\n // return chunkFiles;\n // }\n} ","/**\n * Lightweight ROM state placeholder used during early development.\n * This stub will be expanded as the ROM extraction pipeline matures.\n */\nexport class RomState {\n // Basic memory buffers\n public readonly cgram = new Uint8Array(0x200); // Color palette RAM\n public readonly vram = new Uint8Array(0x10000); // Video RAM\n\n /**\n * Create ROM state from scene metadata.\n * Parameters are currently unused but kept for future implementation.\n */\n public static async fromScene(\n _baseDir: string,\n _root: unknown,\n _metaFile: string,\n _id: number\n ): Promise<RomState> {\n return new RomState();\n }\n}\n\n/**\n * Utility helpers for working with RomState.\n */\nexport class RomStateUtils {\n /** Create an empty ROM state */\n public static createEmpty(): RomState {\n return new RomState();\n }\n\n /** Clear all data in the given ROM state */\n public static clear(state: RomState): void {\n state.cgram.fill(0);\n state.vram.fill(0);\n }\n}\n","import { Registers } from '../../assembly';\n\n/**\n * Manages CPU processor state during ROM analysis\n * Converted from GaiaLib/Rom/Extraction/ProcessorStateManager.cs\n */\nexport class ProcessorStateManager {\n public readonly accumulatorFlags = new Map<number, boolean | null>();\n public readonly indexFlags = new Map<number, boolean | null>();\n public readonly bankNotes = new Map<number, number | null>();\n public readonly stackPositions = new Map<number, number>();\n\n /**\n * Hydrate processor registers with stored state\n * Uses Registers from gaia-core/assembly for processor state management\n */\n public hydrateRegisters(position: number, reg: Registers): void {\n const acc = this.accumulatorFlags.get(position);\n if (acc !== undefined) {\n reg.accumulatorFlag = acc ?? undefined;\n }\n\n const ind = this.indexFlags.get(position);\n if (ind !== undefined) {\n reg.indexFlag = ind ?? undefined;\n }\n\n const bnk = this.bankNotes.get(position);\n if (bnk !== undefined) {\n reg.dataBank = bnk ?? undefined;\n }\n\n const stack = this.stackPositions.get(position);\n if (stack !== undefined) {\n reg.stack.location = stack;\n }\n }\n\n // Accumulator flag methods\n public getAccumulatorFlag(location: number): boolean | null | undefined {\n return this.accumulatorFlags.get(location);\n }\n\n public setAccumulatorFlag(location: number, value: boolean | null): void {\n this.accumulatorFlags.set(location, value);\n }\n\n public tryAddAccumulatorFlag(location: number, value: boolean | null): boolean {\n if (this.accumulatorFlags.has(location)) {\n return false;\n }\n this.accumulatorFlags.set(location, value);\n return true;\n }\n\n // Index flag methods\n public getIndexFlag(location: number): boolean | null | undefined {\n return this.indexFlags.get(location);\n }\n\n public setIndexFlag(location: number, value: boolean | null): void {\n this.indexFlags.set(location, value);\n }\n\n public tryAddIndexFlag(location: number, value: boolean | null): boolean {\n if (this.indexFlags.has(location)) {\n return false;\n }\n this.indexFlags.set(location, value);\n return true;\n }\n\n // Bank note methods\n public getBankNote(location: number): number | null | undefined {\n return this.bankNotes.get(location);\n }\n\n public setBankNote(location: number, value: number | null): void {\n this.bankNotes.set(location, value);\n }\n\n // Stack position methods\n public getStackPosition(location: number): number | undefined {\n return this.stackPositions.get(location);\n }\n\n public setStackPosition(location: number, value: number): void {\n this.stackPositions.set(location, value);\n }\n\n public tryAddStackPosition(location: number, value: number): boolean {\n if (this.stackPositions.has(location)) {\n return false;\n }\n this.stackPositions.set(location, value);\n return true;\n }\n} ","/**\r\n * Provides low-level ROM data reading functionality\r\n * Converted from GaiaLib/Rom/Extraction/RomDataReader.cs\r\n */\r\nexport class RomDataReader {\r\n public readonly romData: Uint8Array;\r\n public position: number;\r\n\r\n constructor(romData: Uint8Array) {\r\n if (!romData) {\r\n throw new Error('romData cannot be null');\r\n }\r\n this.romData = romData;\r\n this.position = 0;\r\n }\r\n\r\n public readByte(): number {\r\n return this.romData[this.position++];\r\n }\r\n\r\n public readSByte(): number {\r\n const value = this.readByte();\r\n return value > 127 ? value - 256 : value;\r\n }\r\n\r\n public readUShort(): number {\r\n return this.readByte() | (this.readByte() << 8);\r\n }\r\n\r\n public readShort(): number {\r\n const value = this.readUShort();\r\n return value > 32767 ? value - 65536 : value;\r\n }\r\n\r\n public readAddress(): number {\r\n return this.readByte() | (this.readByte() << 8) | (this.readByte() << 16);\r\n }\r\n\r\n public readInt(): number {\r\n return this.readByte() | (this.readByte() << 8) | (this.readByte() << 16) | (this.readByte() << 24);\r\n }\r\n\r\n public peekByte(): number {\r\n return this.romData[this.position];\r\n }\r\n\r\n public peekShort(): number {\r\n return this.romData[this.position] | (this.romData[this.position + 1] << 8);\r\n }\r\n\r\n public peekAddress(): number {\r\n return this.romData[this.position]\r\n | (this.romData[this.position + 1] << 8)\r\n | (this.romData[this.position + 2] << 16);\r\n }\r\n} ","import { AddressType, Address } from '@gaialabs/shared';\nimport { BlockReaderConstants } from '@gaialabs/shared';\nimport type { DbRoot } from '@gaialabs/shared';\n\n/**\n * Manages references, chunks, and markers during ROM analysis\n * Converted from GaiaLib/Rom/Extraction/ReferenceManager.cs\n */\nexport class ReferenceManager {\n public readonly structTable = new Map<number, string>();\n public readonly markerTable = new Map<number, number>();\n public readonly nameTable = new Map<number, string>();\n private readonly root: DbRoot;\n\n constructor(root: DbRoot) {\n if (!root) {\n throw new Error('root cannot be null');\n }\n this.root = root;\n }\n\n // Struct management\n public tryGetStruct(location: number): { found: boolean; chunkType?: string } {\n const chunkType = this.structTable.get(location);\n return { found: chunkType !== undefined, chunkType };\n }\n\n public tryAddStruct(location: number, chunkType: string): boolean {\n if (this.structTable.has(location)) {\n return false;\n }\n this.structTable.set(location, chunkType);\n return true;\n }\n\n public containsStruct(location: number): boolean {\n return this.structTable.has(location);\n }\n\n // Name management\n public tryGetName(location: number): { found: boolean; referenceName?: string } {\n const referenceName = this.nameTable.get(location);\n return { found: referenceName !== undefined, referenceName };\n }\n\n public tryAddName(location: number, referenceName: string): boolean {\n if (this.nameTable.has(location)) {\n return false;\n }\n this.nameTable.set(location, referenceName);\n return true;\n }\n\n // Marker management\n public tryGetMarker(location: number): { found: boolean; offset?: number } {\n const offset = this.markerTable.get(location);\n return { found: offset !== undefined, offset };\n }\n\n public setMarker(location: number, offset: number): void {\n this.markerTable.set(location, offset);\n }\n\n // Label creation\n public createBranchLabel(location: number): string {\n const name = `loc_${location.toString(16).toUpperCase().padStart(6, '0')}`;\n this.nameTable.set(location, name);\n return name;\n }\n\n public createTypeName(type: string, location: number): string {\n let name = type.toLowerCase();\n \n // Handle pointer characters\n while (name.length > 0 && BlockReaderConstants.POINTER_CHARACTERS.includes(name[0])) {\n name = name.substring(1) + '_list';\n }\n\n return `${name}_${location.toString(16).toUpperCase().padStart(6, '0')}`;\n }\n\n public createFallbackName(location: number): string {\n const fileMatch = this.root.files.find(x =>\n x.start <= location && x.end > location\n );\n\n if (fileMatch) {\n const offset = location - fileMatch.start;\n return fileMatch.name + (offset !== 0 ? `+${offset.toString(16).toUpperCase()}` : '');\n }\n\n return location.toString(16).toUpperCase().padStart(6, '0');\n }\n\n /**\n * Finds a reference location by its assigned name.\n */\n public findLocationByName(name: string): number | undefined {\n for (const [loc, refName] of this.nameTable) {\n if (refName === name) {\n return loc;\n }\n }\n return undefined;\n }\n\n public resolveName(location: number, type: AddressType, isBranch: boolean): string {\n const prefix = Address.codeFromType(type);\n let name: string;\n let label: string | null = null;\n let resolvedLocation = location;\n\n // Handle rewrites first\n const rewrite = this.root.rewrites[location];\n if (rewrite !== undefined) {\n const result = this.processRewrite(location, rewrite);\n resolvedLocation = result.location;\n label = result.label;\n }\n\n // Try to get existing reference\n const existingName = this.nameTable.get(resolvedLocation);\n if (existingName) {\n name = existingName;\n } else {\n name = isBranch ? \n this.createBranchLabel(resolvedLocation) : \n this.findClosestReference(resolvedLocation) || this.createFallbackName(resolvedLocation);\n }\n\n return `${prefix || ''}${name}${label || ''}`;\n }\n\n public findClosestReference(location: number): string | null {\n let closestDistance = BlockReaderConstants.REF_SEARCH_MAX_RANGE;\n let closestName: string | null = null;\n let closestLocation: number | null = null;\n\n for (const [entryKey, entryValue] of this.nameTable) {\n if (entryKey > location) {\n continue;\n }\n\n const distance = location - entryKey;\n if (distance >= closestDistance) {\n continue;\n }\n\n closestDistance = distance;\n closestName = entryValue;\n closestLocation = entryKey;\n\n if (closestDistance === 1) {\n break;\n }\n }\n\n return this.processClosestMatch(location, closestName, closestLocation, closestDistance);\n }\n\n private processRewrite(location: number, rewrite: number): { location: number; label: string | null } {\n const offset = location - rewrite;\n const cmd = offset < 0 ? '-' : '+';\n const absOffset = Math.abs(offset);\n\n let label: string | null = null;\n const structType = this.structTable.get(rewrite);\n \n if (structType === BlockReaderConstants.WIDE_STRING_TYPE) {\n this.markerTable.set(rewrite, absOffset);\n this.markerTable.set(location, absOffset);\n label = cmd === '-' ? BlockReaderConstants.NEGATIVE_MARKER_FORMAT : BlockReaderConstants.MARKER_FORMAT;\n } else {\n const formatString = cmd === '-' ? BlockReaderConstants.NEGATIVE_OFFSET_FORMAT : BlockReaderConstants.OFFSET_FORMAT;\n label = formatString.replace('{0:X}', absOffset.toString(16).toUpperCase());\n }\n\n return { location: rewrite, label };\n }\n\n private processClosestMatch(\n location: number, \n closestName: string | null, \n closestLocation: number | null, \n closestDistance: number\n ): string | null {\n if (!closestName || closestLocation === null) {\n return null;\n }\n\n let result = closestName;\n const structType = this.structTable.get(closestLocation);\n\n if (structType === BlockReaderConstants.WIDE_STRING_TYPE) {\n this.markerTable.set(closestLocation, closestDistance);\n this.markerTable.set(location, closestDistance);\n result += BlockReaderConstants.MARKER_FORMAT;\n } else {\n result += `+${closestDistance.toString(16).toUpperCase()}`;\n }\n\n return result;\n }\n} ","import { Registers } from '../../assembly';\nimport { StatusFlags } from '@gaialabs/shared';\nimport { RomDataReader } from './reader';\nimport type { BlockReader } from './blocks';\n\n/**\n * Handles stack operations for various stack-related instructions\n * Converted from GaiaLib/Rom/Extraction/StackOperations.cs\n */\nexport class StackOperations {\n private readonly _registers: Registers;\n private readonly _blockReader: BlockReader;\n\n constructor(registers: Registers, blockReader: BlockReader) {\n this._registers = registers;\n this._blockReader = blockReader;\n }\n\n public handleStackOperation(mnemonic: string): void {\n switch (mnemonic) {\n case 'PHD':\n this._registers.stack.push(this._registers.direct ?? 0);\n break;\n \n case 'PLD':\n this._registers.direct = this._registers.stack.popUInt16();\n break;\n \n case 'PHK':\n this._registers.stack.push((this._blockReader._romDataReader.position >> 16) | 0x80);\n break;\n \n case 'PHB':\n this._registers.stack.push(this._registers.dataBank ?? 0x81);\n break;\n \n case 'PLB':\n this._registers.dataBank = this._registers.stack.popByte();\n break;\n \n case 'PHP':\n this._registers.stack.push(this._registers.statusFlags);\n break;\n \n case 'PLP':\n this._registers.statusFlags = this._registers.stack.popByte() as StatusFlags;\n break;\n\n case 'PHA':\n this.handleAccumulatorPush();\n break;\n\n case 'PLA':\n this.handleAccumulatorPull();\n break;\n\n case 'PHX':\n this.handleXIndexPush();\n break;\n\n case 'PLX':\n this.handleXIndexPull();\n break;\n\n case 'PHY':\n this.handleYIndexPush();\n break;\n\n case 'PLY':\n this.handleYIndexPull();\n break;\n\n case 'XBA':\n this.handleExchangeBytes();\n break;\n }\n }\n\n private handleAccumulatorPush(): void {\n if (this._registers.accumulatorFlag === true) {\n this._registers.stack.push((this._registers.accumulator ?? 0) & 0xFF);\n } else {\n this._registers.stack.pushUInt16(this._registers.accumulator ?? 0);\n }\n }\n\n private handleAccumulatorPull(): void {\n if (this._registers.accumulatorFlag === true) {\n this._registers.accumulator = ((this._registers.accumulator ?? 0) & 0xFF00) | this._registers.stack.popByte();\n } else {\n this._registers.accumulator = this._registers.stack.popUInt16();\n }\n }\n\n private handleXIndexPush(): void {\n if (this._registers.indexFlag === true) {\n this._registers.stack.push((this._registers.xIndex ?? 0) & 0xFF);\n } else {\n this._registers.stack.pushUInt16(this._registers.xIndex ?? 0);\n }\n }\n\n private handleXIndexPull(): void {\n if (this._registers.indexFlag === true) {\n this._registers.xIndex = ((this._registers.xIndex ?? 0) & 0xFF00) | this._registers.stack.popByte();\n } else {\n this._registers.xIndex = this._registers.stack.popUInt16();\n }\n }\n\n private handleYIndexPush(): void {\n if (this._registers.indexFlag === true) {\n this._registers.stack.push((this._registers.yIndex ?? 0) & 0xFF);\n } else {\n this._registers.stack.pushUInt16(this._registers.yIndex ?? 0);\n }\n }\n\n private handleYIndexPull(): void {\n if (this._registers.indexFlag === true) {\n this._registers.yIndex = ((this._registers.yIndex ?? 0) & 0xFF00) | this._registers.stack.popByte();\n } else {\n this._registers.yIndex = this._registers.stack.popUInt16();\n }\n }\n\n private handleExchangeBytes(): void {\n const acc = this._registers.accumulator ?? 0;\n this._registers.accumulator = ((acc >> 8) | (acc << 8)) & 0xFFFF;\n }\n} ","import { RomDataReader } from './reader';\nimport {\n Address,\n AddressType,\n AddressSpace,\n LocationWrapper,\n MemberType,\n Byte,\n Word,\n} from '@gaialabs/shared';\nimport type { CopDef } from '@gaialabs/shared';\nimport type { DbRoot } from '@gaialabs/shared';\nimport type { BlockReader } from './blocks';\n\n/**\n * Handles COP (Coprocessor) command processing\n * Converted from GaiaLib/Rom/Extraction/CopCommandProcessor.cs\n */\nexport class CopCommandProcessor {\n private readonly _blockReader: BlockReader;\n private readonly _romDataReader: RomDataReader;\n\n constructor(blockReader: BlockReader) {\n this._blockReader = blockReader;\n this._romDataReader = blockReader._romDataReader;\n }\n\n /**\n * Parses a COP command based on its definition\n */\n public parseCopCommand(copDef: CopDef, operands: unknown[]): void {\n for (const partStr of copDef.parts) {\n // Use the first character to determine the address type (for pointers)\n const addrType = Address.typeFromCode(partStr[0]);\n const isPtr = addrType !== AddressType.Unknown;\n \n // Reference type is the target of a pointer from partStr, or the struct type if not a pointer\n const referenceType = isPtr ? partStr.substring(1) : this._blockReader._currentAsmBlock!.structName ?? 'Binary';\n \n // Member type resolves to the underlying pointer type, or partStr\n const memberTypeName = isPtr ? addrType.toString() : partStr;\n\n // Resolve member type name to a MemberType enum\n const memberType = this.tryParseMemberType(memberTypeName);\n if (memberType === null) {\n throw new Error('Cannot use structs in cop def'); // Only basic types are allowed in COP definitions\n }\n\n // If there is a label, ignore reading and use the label instead\n const label = this._blockReader._root.labels[this._romDataReader.position];\n if (label) {\n this._romDataReader.position += this.getMemberTypeSize(memberType);\n operands.push(label);\n } else {\n operands.push(this.readMemberTypeValue(memberType, partStr, isPtr, referenceType, addrType));\n }\n\n }\n }\n\n private tryParseMemberType(memberTypeName: string): MemberType | null {\n // Check if the string matches any MemberType enum value (case-insensitive)\n const upperName = memberTypeName.toUpperCase();\n for (const [key, value] of Object.entries(MemberType)) {\n if (key.toUpperCase() === upperName) {\n return value;\n }\n }\n return null;\n }\n\n private getMemberTypeSize(memberType: MemberType): number {\n switch (memberType) {\n case MemberType.Byte:\n return 1;\n case MemberType.Word:\n case MemberType.Offset:\n return 2;\n case MemberType.Address:\n return 3;\n default:\n throw new Error('Unsupported COP member type');\n }\n }\n\n private readMemberTypeValue(\n memberType: MemberType,\n partStr: string,\n isPtr: boolean,\n referenceType: string,\n addrType: AddressType\n ): unknown {\n switch (memberType) {\n case MemberType.Byte:\n return new Byte(this._romDataReader.readByte());\n case MemberType.Word:\n return new Word(this._romDataReader.readUShort());\n case MemberType.Offset:\n return this.createCopLocation(this._romDataReader.readUShort(), null, partStr, isPtr, referenceType, addrType);\n case MemberType.Address:\n return this.createCopLocation(this._romDataReader.readUShort(), this._romDataReader.readByte(), partStr, isPtr, referenceType, addrType);\n default:\n throw new Error('Unsupported COP member type');\n }\n }\n\n private createCopLocation(\n offset: number, \n bank: number | null, \n partStr: string, \n isPtr: boolean, \n otherStr: string, \n type: AddressType\n ): unknown {\n if (bank === null && offset === 0) {\n return new Word(offset);\n }\n\n const addr = new Address(bank ?? (this._romDataReader.position >> 16), offset);\n if (addr.space === AddressSpace.ROM) {\n const location = addr.toInt();\n if (partStr !== 'Address' && isPtr && !this._blockReader._root.rewrites[location]) {\n this._blockReader.noteType(location, otherStr, true);\n }\n\n // When address is unknown, try to use the part string (for Offset or Address)\n if (type === AddressType.Unknown) {\n type = this.tryParseAddressType(partStr) ?? AddressType.Unknown;\n }\n\n return new LocationWrapper(location, type);\n }\n return addr;\n }\n\n private tryParseAddressType(addressTypeName: string): AddressType | null {\n // Check if the string matches any AddressType enum value (case-insensitive)\n const upperName = addressTypeName.toUpperCase();\n for (const [key, value] of Object.entries(AddressType)) {\n if (key.toUpperCase() === upperName) {\n return value;\n }\n }\n return null;\n }\n} ","import { Registers } from '../../assembly';\nimport {\n AddressType,\n AddressSpace,\n Address,\n LocationWrapper,\n StatusFlags,\n Byte,\n Word,\n} from '@gaialabs/shared';\nimport { RomDataReader } from './reader';\nimport { StackOperations } from './stack';\nimport { TransformProcessor } from './transforms';\nimport { CopCommandProcessor } from './cop';\nimport type { DbRoot, CopDef, OpCode } from '@gaialabs/shared';\nimport type { BlockReader } from './blocks';\n\n/**\n * Context information for an operation being processed\n * Converted from GaiaLib/Rom/Extraction/AsmReader.cs OperationContext\n */\nexport class OperationContext {\n public size: number = 0;\n public nextAddress: number = 0;\n public xForm1: string | null = null;\n public xForm2: string | null = null;\n public copDef: CopDef | null = null;\n}\n\n/**\n * Handles different addressing modes for assembly instructions\n * Converted from GaiaLib/Rom/Extraction/AddressingModeHandler.cs\n */\nexport class AddressingModeHandler {\n private readonly _blockReader: BlockReader;\n private readonly _transformProcessor: TransformProcessor;\n private readonly _copProcessor: CopCommandProcessor;\n private readonly _dataReader: RomDataReader;\n\n constructor(blockReader: BlockReader, transformProcessor: TransformProcessor) {\n this._blockReader = blockReader;\n this._transformProcessor = transformProcessor;\n this._copProcessor = new CopCommandProcessor(blockReader);\n this._dataReader = blockReader._romDataReader;\n }\n\n public processAddressingMode(code: OpCode, context: OperationContext, reg: Registers): unknown[] {\n const operands: unknown[] = [];\n\n switch (code.mode) {\n case 'Stack':\n case 'Implied':\n case 'Accumulator':\n this.handleStackOrImpliedMode(code.mnem, reg);\n break;\n\n case 'Immediate':\n this.handleImmediateMode(code.mnem, context.size, operands, reg);\n break;\n\n case 'AbsoluteIndexedIndirect':\n this.handleAbsoluteMode(code.mnem, undefined, context.nextAddress, reg.dataBank, operands, reg, true);\n break;\n\n case 'AbsoluteIndirect':\n case 'AbsoluteIndirectLong':\n case 'Absolute':\n case 'AbsoluteIndexedX':\n case 'AbsoluteIndexedY':\n this.handleAbsoluteMode(code.mnem, undefined, context.nextAddress, reg.dataBank, operands, reg);\n break;\n\n case 'AbsoluteLong':\n case 'AbsoluteLongIndexedX':\n this.handleAbsoluteLongMode(code.mnem, operands, reg);\n break;\n\n case 'BlockMove':\n this.handleBlockMoveMode(operands, context);\n break;\n\n case 'DirectPage':\n case 'DirectPageIndexedIndirectX':\n case 'DirectPageIndexedX':\n case 'DirectPageIndexedY':\n case 'DirectPageIndirect':\n case 'DirectPageIndirectIndexedY':\n case 'DirectPageIndirectLong':\n case 'DirectPageIndirectLongIndexedY':\n this.handleDirectPageMode(operands);\n break;\n\n case 'PCRelative':\n this.handlePCRelativeMode(operands, context.nextAddress, reg, false);\n break;\n\n case 'PCRelativeLong':\n this.handlePCRelativeMode(operands, context.nextAddress, reg, true);\n break;\n\n case 'StackRelative':\n case 'StackRelativeIndirectIndexedY':\n this.handleStackRelativeMode(operands);\n break;\n\n case 'StackInterrupt':\n this.handleStackInterruptMode(code.mnem, operands, context);\n break;\n\n default:\n throw new Error(`Unknown addressing mode: ${code}`);\n }\n\n return operands;\n }\n\n private handleImmediateMode(mnemonic: string, size: number, operands: unknown[], reg: Registers): void {\n const operand = this.readImmediateOperand(size);\n operands.push(operand);\n this.updateRegisterForImmediateInstruction(mnemonic, operand, reg);\n }\n\n private readImmediateOperand(size: number) {\n return size === 3\n ? new Word(this._dataReader.readUShort())\n : new Byte(this._dataReader.readByte());\n }\n\n private updateRegisterForImmediateInstruction(\n mnemonic: string,\n operand: number | { value: number },\n reg: Registers\n ): void {\n const value = typeof operand === 'number' ? operand : operand.value;\n switch (mnemonic) {\n case 'LDA':\n reg.accumulator = this.calculateRegisterValue(reg.accumulator, value);\n break;\n\n case 'LDX':\n reg.xIndex = this.calculateRegisterValue(reg.xIndex, value);\n break;\n\n case 'LDY':\n reg.yIndex = this.calculateRegisterValue(reg.yIndex, value);\n break;\n\n case 'SEP':\n case 'REP':\n this.updateStatusFlags(mnemonic, value);\n break;\n }\n }\n\n private calculateRegisterValue(currentValue: number | undefined, operand: number): number {\n if (operand > 255) {\n // 16-bit mode: use full operand value\n return operand;\n } else {\n // 8-bit mode: preserve high byte\n return ((currentValue ?? 0) & 0xFF00) | operand;\n }\n }\n\n private updateStatusFlags(mnemonic: string, flagValue: number): void {\n const flag = flagValue as StatusFlags;\n const isSep = mnemonic === 'SEP';\n\n if (flag & StatusFlags.AccumulatorMode) {\n this._blockReader.AccumulatorFlags.set(this._dataReader.position, isSep);\n }\n\n if (flag & StatusFlags.IndexMode) {\n this._blockReader.IndexFlags.set(this._dataReader.position, isSep);\n }\n }\n\n private handleAbsoluteLongMode(mnemonic: string, operands: unknown[], reg: Registers): void {\n const refLoc = this._dataReader.readUShort();\n const bank = this._dataReader.readByte();\n const address = new Address(bank, refLoc);\n\n if (address.space === AddressSpace.ROM) {\n const wrapper = new LocationWrapper(address.toInt(), AddressType.Address);\n if (this.isJumpInstruction(mnemonic)) {\n this._blockReader.noteType(wrapper.location, 'Code', false, reg);\n }\n operands.push(wrapper);\n } else {\n operands.push(address);\n }\n }\n\n private handleBlockMoveMode(operands: unknown[], context: OperationContext): void {\n operands.push(new Byte(this._dataReader.readByte()));\n context.xForm2 = this._transformProcessor.getTransform();\n operands.push(new Byte(this._dataReader.readByte()));\n }\n\n private handleDirectPageMode(operands: unknown[]): void {\n operands.push(new Byte(this._dataReader.readByte()));\n }\n\n private handlePCRelativeMode(operands: unknown[], nextAddress: number, reg: Registers, isLong: boolean): void {\n const relative = isLong\n ? nextAddress + this._dataReader.readShort()\n : nextAddress + this._dataReader.readSByte();\n\n this._blockReader.noteType(relative, 'Code', undefined, reg);\n operands.push(new LocationWrapper(relative, AddressType.Relative));\n }\n\n private handleStackRelativeMode(operands: unknown[]): void {\n operands.push(new Byte(this._dataReader.readByte()));\n }\n\n private handleStackInterruptMode(mnemonic: string, operands: unknown[], context: OperationContext): void {\n const cmd = this._dataReader.readByte();\n operands.push(new Byte(cmd));\n\n if (mnemonic === 'COP') {\n const copDef = this._blockReader._root.copDef[cmd];\n if (!copDef) {\n throw new Error('Unknown COP command');\n }\n\n context.copDef = copDef;\n this._copProcessor.parseCopCommand(copDef, operands);\n }\n }\n\n private handleStackOrImpliedMode(mnemonic: string, reg: Registers): void {\n const stackOperations = new StackOperations(reg, this._blockReader);\n stackOperations.handleStackOperation(mnemonic);\n }\n\n private handleAbsoluteMode(\n mnemonic: string,\n xBank1: number | undefined,\n next: number,\n dataBank: number | undefined,\n operands: unknown[],\n registers: Registers,\n isIndexedIndirect: boolean = false\n ): void {\n let refLoc = this._dataReader.readUShort();\n\n const isPush = this.isPushInstruction(mnemonic);\n if (isPush) {\n refLoc++;\n }\n\n const isJump = isPush || isIndexedIndirect || this.isJumpInstruction(mnemonic);\n const bank = xBank1 ?? (isJump ? (this._dataReader.position >> 16) : dataBank ?? 0x81);\n\n const addr = new Address(bank, refLoc);\n if (addr.isROM) {\n const wrapper = new LocationWrapper(addr.toInt(), AddressType.Offset);\n if (isJump) {\n const type = isIndexedIndirect ? '*Code' : 'Code';\n const name = this._blockReader.noteType(wrapper.location, type, isPush, registers);\n\n if (isPush) {\n operands.push(`&${name}-1`);\n return;\n }\n }\n operands.push(wrapper);\n } else {\n operands.push(addr);\n }\n }\n\n private isJumpInstruction(mnemonic: string): boolean {\n return mnemonic[0] === 'J';\n }\n\n private isPushInstruction(mnemonic: string): boolean {\n return mnemonic[0] === 'P';\n }\n} ","import { RomDataReader } from './reader';\nimport { ReferenceManager } from './references';\nimport { RomProcessingConstants } from '@gaialabs/shared';\nimport type { BlockReader } from './blocks';\n\n/**\n * Handles transform processing for assembly instructions\n * Converted from GaiaLib/Rom/Extraction/TransformProcessor.cs\n */\nexport class TransformProcessor {\n private readonly _blockReader: BlockReader;\n private readonly _romDataReader: RomDataReader;\n private readonly _referenceManager: ReferenceManager;\n private readonly _labelLookup: Record<number, string>;\n\n // Location regex pattern: _([A-Fa-f0-9]{6})\n private static readonly LOCATION_REGEX = /_([A-Fa-f0-9]{6})/;\n\n constructor(romReader: BlockReader) {\n this._blockReader = romReader;\n this._romDataReader = romReader._romDataReader;\n this._referenceManager = romReader._referenceManager;\n this._labelLookup = romReader._root.labels;\n }\n\n /**\n * Retrieves transform information for the current ROM position\n */\n public getTransform(): string | null {\n const transform = this._labelLookup[this._romDataReader.position];\n if (transform === '') {\n return transform;\n } else if (!transform) {\n return null;\n }\n\n const transformName = this.cleanTransformName(transform);\n const referenceLocation = this.resolveTransformReference(transformName);\n \n if (referenceLocation !== null) {\n this._blockReader.resolveInclude(referenceLocation, false);\n }\n\n return transform;\n }\n\n /**\n * Applies transforms to operands\n */\n public applyTransforms(op1Label: string | null, op2Label: string | null, operands: unknown[]): void {\n this.applyTransform(op1Label, 0, operands);\n this.applyTransform(op2Label, 1, operands);\n }\n\n private applyTransform(transform: string | null, operandIndex: number, operands: unknown[]): void {\n if (transform === null || transform === undefined || operandIndex >= operands.length) {\n return;\n }\n\n // There is special logic for empty labels\n if (transform === '') {\n this.applyDefaultTransform(operandIndex, operands);\n } else {\n operands[operandIndex] = transform; // Otherwise it is a direct replacement\n }\n }\n\n private applyDefaultTransform(operandIndex: number, operands: unknown[]): void {\n \n let value = (this._romDataReader.position & 0xFF0000);\n const opnd = operands[operandIndex] as any;\n if(opnd && 'value' in opnd) {\n value |= opnd['value'];\n } else {\n value |= opnd as number;\n }\n\n const nameResult = this._referenceManager.tryGetName(value);\n let referenceName: string;\n \n if (!nameResult.found) {\n referenceName = `loc_${value.toString(16).toUpperCase().padStart(6, '0')}`;\n this._referenceManager.tryAddName(value, referenceName);\n } else {\n referenceName = nameResult.referenceName!;\n }\n \n this._blockReader.resolveInclude(value, false);\n operands[operandIndex] = `&${referenceName}`;\n }\n\n private cleanTransformName(transform: string): string {\n let name = transform;\n \n // Remove address space characters from the start\n while (name.length > 0 && RomProcessingConstants.ADDRESS_SPACE.includes(name[0])) {\n name = name.substring(1);\n }\n \n // Find math operators and truncate at that point\n let mathIndex = -1;\n for (let i = 0; i < name.length; i++) {\n if (RomProcessingConstants.OPERATORS.includes(name[i])) {\n mathIndex = i;\n break;\n }\n }\n \n if (mathIndex > 0) {\n name = name.substring(0, mathIndex);\n }\n \n return name;\n }\n\n private resolveTransformReference(transformName: string): number | null {\n // Directly resolve by name in the reference table\n const location = this._referenceManager.findLocationByName(transformName);\n if (location !== undefined) {\n return location;\n }\n\n // Fallback to parsing the location pattern\n const match = TransformProcessor.LOCATION_REGEX.exec(transformName);\n return match ? parseInt(match[1], 16) : null;\n }\n}","export function indexOfAny(str: string, chars: string[], startIndex = 0): number {\r\n for (let i = startIndex; i < str.length; i++) {\r\n if (chars.includes(str[i])) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nexport * from './debug-export';\r\n","import { RomDataReader } from './reader';\nimport { Address, AddressSpace, AddressType, MemberType, RomProcessingConstants, AsmBlockUtils, ChunkFileUtils, TableEntry } from '@gaialabs/shared';\nimport type { DbStringType, DbStringCommand } from '@gaialabs/shared';\nimport type { StringWrapper } from '@gaialabs/shared';\nimport type { BlockReader } from './blocks';\nimport { indexOfAny } from '../../utils';\n\n// Using shared TableEntry type from @gaialabs/shared\n\n/**\n * Reads and processes strings from ROM data\n * Converted from GaiaLib/Rom/Extraction/StringReader.cs\n */\nexport class StringReader {\n public static readonly STRING_REFERENCE_CHARACTERS = ['~', '^'];\n\n private readonly _blockReader: BlockReader;\n private readonly _romDataReader: RomDataReader;\n\n constructor(blockReader: BlockReader) {\n this._blockReader = blockReader;\n this._romDataReader = blockReader._romDataReader;\n }\n\n private resolveCommand(cmd: DbStringCommand, builder: string[]): void {\n if (cmd.types && cmd.types.length > 0) {\n builder.push(`[${cmd.value}`);\n\n let first = true;\n for (const t of cmd.types) {\n if (first) {\n builder.push(':');\n first = false;\n } else {\n builder.push(',');\n }\n\n switch (t) {\n case MemberType.Byte:\n builder.push(this._romDataReader.readByte().toString(16).toUpperCase());\n break;\n case MemberType.Word:\n builder.push(this._romDataReader.readUShort().toString(16).toUpperCase());\n break;\n case MemberType.Offset:\n const loc = this._romDataReader.readUShort() | (this._romDataReader.position & 0x3F0000);\n builder.push(`^${loc.toString(16).toUpperCase().padStart(6, '0')}`);\n break;\n case MemberType.Address:\n builder.push(`~${this._romDataReader.readAddress().toString(16).toUpperCase().padStart(6, '0')}`);\n break;\n case MemberType.Binary:\n let sfirst = true;\n do {\n const r = this._romDataReader.readByte();\n if (cmd.delimiter !== undefined && r === cmd.delimiter) {\n break;\n }\n if (sfirst) {\n sfirst = false;\n } else {\n builder.push(',');\n }\n builder.push(r.toString(16).toUpperCase());\n } while (this._blockReader.partCanContinue());\n break;\n default:\n throw new Error('Unsupported member type');\n }\n }\n builder.push(']');\n } else {\n builder.push(`[${cmd.value}]`);\n }\n }\n\n public parseString(stringType: DbStringType): StringWrapper {\n const dict = stringType.commands;\n const builder: string[] = [];\n const strLoc = this._romDataReader.position;\n const map = stringType.characterMap;\n const terminator = stringType.terminator;\n\n do {\n const c = this._romDataReader.readByte();\n if (c === terminator) {\n if (stringType.greedyTerminator) {\n while (this._romDataReader.peekByte() === terminator && this._blockReader.partCanContinue()) {\n this._romDataReader.position++;\n }\n }\n break;\n }\n\n const cmd = dict[c];\n if (cmd) {\n this.resolveCommand(cmd, builder);\n if (cmd.halt) {\n break;\n }\n } else {\n const index = this.shiftDown(c, stringType.shiftType);\n if (index >= 0 && index < map.length) {\n builder.push(map[index]);\n } else {\n // Fallback for unknown characters\n builder.push(`[${c.toString(16).toUpperCase()}]`);\n }\n }\n } while (this._blockReader.partCanContinue());\n\n return {\n string: builder.join(''),\n type: stringType,\n marker: 0,\n location: strLoc\n };\n }\n\n /**\n * Handles character shifting based on string type\n * This is a simplified implementation of the shift logic\n */\n private shiftDown(c: number, shiftType?: string): number {\n if (!shiftType) {\n return c;\n }\n\n switch (shiftType) {\n case 'wh2':\n // wh2 shift: ((c & 0x70) >> 1) | (c & 0x07)\n return ((c & 0x70) >> 1) | (c & 0x07);\n case 'h2':\n // h2 shift: ((c & 0xE0) >> 1) | (c & 0x0F)\n return ((c & 0xE0) >> 1) | (c & 0x0F);\n default:\n return c;\n }\n }\n\n public resolveString(sw: StringWrapper, isBranch: boolean): void {\n let str = sw.string;\n let ix = indexOfAny(str, StringReader.STRING_REFERENCE_CHARACTERS);\n \n while (ix >= 0) {\n if (ix + 6 < str.length) {\n const hexStr = str.substring(ix + 1, ix + 7);\n const sloc = parseInt(hexStr, 16);\n \n if (!isNaN(sloc)) {\n const addrs = new Address(sloc >> 16, sloc & 0xFFFF);\n if (addrs.space === AddressSpace.ROM) {\n this._blockReader.resolveInclude(sloc, false);\n const name = this._blockReader.resolveName(sloc, AddressType.Unknown, false);\n const opix = indexOfAny(name, RomProcessingConstants.OPERATORS);\n \n if (opix > 0) {\n const offsetStr = name.substring(opix + 1);\n let offset: number;\n \n if (offsetStr === 'M') {\n offset = this._blockReader._referenceManager.markerTable.get(sloc) || 0;\n } else {\n offset = parseInt(offsetStr, 16) || 0;\n }\n\n if (name[opix] === '-') {\n offset = -offset;\n }\n\n const targetName = name.substring(0, opix);\n const target = sloc - offset;\n \n // Try to find the target using IsOutside pattern\n const [isOutside, block, part] = ChunkFileUtils.isOutsideWithPart(this._blockReader._enrichedChunks, this._blockReader._currentChunk!, sloc);\n if (part != null) {\n const entry = part.objList?.find((x): x is TableEntry => \n typeof x === 'object' && x !== null && 'location' in x && 'object' in x && (x as TableEntry).location === target) as TableEntry | undefined;\n if (entry && entry.object) {\n (entry.object as StringWrapper).marker = offset;\n }\n }\n }\n }\n }\n }\n \n ix = indexOfAny(str, StringReader.STRING_REFERENCE_CHARACTERS, ix + 7);\n }\n }\n\n}","import { Op } from '@gaialabs/shared';\nimport { Registers } from '../../assembly';\nimport { RomDataReader } from './reader';\nimport { StringReader } from './strings';\nimport { ReferenceManager } from './references';\nimport {\n Address,\n AddressSpace,\n AddressType,\n ChunkFileUtils,\n LocationWrapper,\n MemberType,\n StructDef,\n Byte,\n Word,\n} from '@gaialabs/shared';\nimport type { DbRoot, DbBlock, DbPart } from '@gaialabs/shared';\nimport type { DbStruct } from '@gaialabs/shared';\nimport type { DbStringType } from '@gaialabs/shared';\nimport { AsmReader } from './asm';\nimport type { BlockReader } from './blocks';\n\n/**\n * Handles parsing of different data types from ROM\n * Converted from GaiaLib/Rom/Extraction/TypeParser.cs\n */\nexport class TypeParser {\n private readonly _blockReader: BlockReader;\n private readonly _romDataReader: RomDataReader;\n private readonly _stringReader: StringReader;\n private readonly _stringTypes: Record<string, DbStringType>;\n private readonly _referenceManager: ReferenceManager;\n\n constructor(blockReader: BlockReader) {\n this._blockReader = blockReader;\n this._referenceManager = blockReader._referenceManager;\n this._romDataReader = blockReader._romDataReader;\n this._stringReader = blockReader._stringReader;\n this._stringTypes = blockReader._root.stringTypes;\n }\n\n public parseType(typeName: string, reg: Registers | null, depth: number, bank?: number): unknown {\n \n // Shortcut for symbolic Offsets\n if (typeName[0] === '&') {\n return this.parseLocation(this._romDataReader.readUShort(), bank, typeName.substring(1), AddressType.Offset);\n }\n\n // Shortcut for symbolic Addresses\n if (typeName[0] === '@') {\n return this.parseLocation(this._romDataReader.readUShort(), this._romDataReader.readByte(), typeName.substring(1), AddressType.Address);\n }\n\n // Check string types\n const stringType = this._stringTypes[typeName];\n if (stringType) {\n return this._stringReader.parseString(stringType);\n }\n\n // Parse raw values\n const mType = this.tryParseMemberType(typeName);\n if (mType !== null) {\n switch (mType) {\n case MemberType.Byte:\n return new Byte(this._romDataReader.readByte());\n case MemberType.Word:\n return new Word(this.parseWordSafe());\n case MemberType.Offset:\n return this.parseLocation(this._romDataReader.readUShort(), bank, null, AddressType.Offset);\n case MemberType.Address:\n return this.parseLocation(this._romDataReader.readUShort(), this._romDataReader.readByte(), null, AddressType.Address);\n case MemberType.Binary:\n return this.parseBinary();\n case MemberType.Code:\n return this.parseCode(reg as Registers);\n default:\n throw new Error('Invalid member type');\n }\n }\n\n const parentType = this._blockReader._root.structs[typeName];\n if (!parentType) {\n throw new Error(`Unknown type: ${typeName}`);\n }\n\n const delimiter = parentType.delimiter;\n const discOffset = parentType.discriminator;\n const objects: unknown[] = [];\n\n // Continue to iterate until end or delimiter is reached\n let delReached: boolean;\n while (!(delReached = this._blockReader.delimiterReached(delimiter))) {\n const startPosition = this._romDataReader.position;\n let targetType = parentType;\n\n // If a discriminator offset is present, use it to identify the type\n if (discOffset !== undefined) {\n // Get discriminator position in ROM\n const discPosition = this._romDataReader.position + discOffset;\n\n // Get discriminator value\n const desc = this._romDataReader.romData[discPosition];\n\n // Advance position (hide value) if discriminator is first\n if (discOffset === 0) {\n this._romDataReader.position++;\n }\n\n // Match discriminator to type\n const matchedStruct = Object.values(this._blockReader._root.structs).find(\n x => x.parent === typeName && x.discriminator === desc\n );\n targetType = matchedStruct || parentType; // Default to parent if no match is found\n }\n\n const types = targetType.types;\n if (types && types.length > 0) {\n const memberCount = types.length;\n const prevPosition = this._romDataReader.position;\n const parts = new Array(memberCount); // Create new member collection\n const def: StructDef = { name: targetType.name, parts };\n\n // Parse each member of the struct\n for (let i = 0; i < memberCount; i++) {\n parts[i] = this.parseType(types[i], null, depth + 1, bank);\n }\n\n // Advance (hide) discriminator if it is the last member\n if (discOffset !== undefined && discOffset === this._romDataReader.position - prevPosition) {\n this._romDataReader.position++;\n }\n\n objects.push(def);\n }\n\n // Roll back work if struct overflows a chunk boundary\n // SHOULD only happen for the inventory sprite map\n let checkPosition = startPosition;\n while (++checkPosition < this._romDataReader.position) {\n if (this._referenceManager.containsStruct(checkPosition)) {\n this._romDataReader.position = checkPosition;\n break;\n }\n }\n\n // Stop if the reader should not continue\n if (!this._blockReader.partCanContinue()) {\n break;\n }\n }\n\n // If we have reached delimiter and at depth 0, note the struct\n if (delReached && depth === 0) {\n this._referenceManager.tryAddStruct(this._romDataReader.position, typeName);\n }\n\n return objects;\n }\n\n private tryParseMemberType(memberTypeName: string): MemberType | null {\n // Check if the string matches any MemberType enum value (case-insensitive)\n const upperName = memberTypeName.toUpperCase();\n for (const [key, value] of Object.entries(MemberType)) {\n if (key.toUpperCase() === upperName) {\n return value;\n }\n }\n return null;\n }\n\n private parseWordSafe(): number {\n return this._referenceManager.containsStruct(this._romDataReader.position + 1)\n ? this._romDataReader.readByte()\n : this._romDataReader.readUShort();\n }\n\n private parseBinary(): Uint8Array {\n // Store old position for length calculation\n const startPosition = this._romDataReader.position;\n\n // Advance the reader until we reach the end of the section\n do {\n this._romDataReader.position++;\n } while (this._blockReader.partCanContinue());\n\n // Length is determined by the new position relative to the old\n const len = this._romDataReader.position - startPosition;\n\n // Create buffer for the raw bytes\n const outBuffer = new Uint8Array(len);\n\n // Copy raw bytes from ROM to buffer\n for (let i = 0; i < len; i++) {\n outBuffer[i] = this._romDataReader.romData[startPosition + i];\n }\n\n return outBuffer;\n }\n\n private parseLocation(offset: number, bank: number | undefined, typeName: string | null, addrType: AddressType): unknown {\n // If bank is not provided and offset is 0, it should resolve to #$0000\n if ((bank === undefined || bank === null) && offset === 0) {\n return new Word(offset);\n }\n\n // Bank cannot be null, instead use bank from current position\n const resolvedBank = bank ?? (this._romDataReader.position >> 16);\n\n // Create the address with resolved bank\n const adrs = new Address(resolvedBank, offset);\n\n // If we have a system address, keep it as is\n if (adrs.space !== AddressSpace.ROM) {\n return adrs;\n }\n\n // Convert address to ROM location\n const loc = adrs.toInt();\n\n // If the location is inside the current block and there is no rewrite for it...\n if (\n this._blockReader._currentChunk &&\n ChunkFileUtils.isInside(this._blockReader._currentChunk, loc) &&\n !this._blockReader._root.rewrites[loc]\n ) {\n // Normalize the type name to default to current part definition\n const resolvedTypeName = typeName ?? this._blockReader._currentAsmBlock!.structName ?? 'Binary';\n\n // Add the struct type to our chunk table if it is not already present\n this._referenceManager.tryAddStruct(loc, resolvedTypeName);\n\n // If the location is not already in the reference table, add it\n const referenceName = `${resolvedTypeName.toLowerCase()}_${loc.toString(16).toUpperCase().padStart(6, '0')}`;\n this._referenceManager.tryAddName(loc, referenceName);\n }\n\n return new LocationWrapper(loc, addrType);\n }\n\n private parseCode(reg: Registers): Op[] {\n // Output list\n const opList: Op[] = [];\n\n let first = true;\n while (this._romDataReader.position < this._blockReader._partEnd) {\n // Check the chunk table for a new type block, but not on the first iteration\n if (first) {\n first = false;\n } else if (this._referenceManager.containsStruct(this._romDataReader.position)) {\n break;\n }\n\n // Process register adjustments before parse\n if (reg) {\n this._blockReader.hydrateRegisters(reg);\n }\n\n // Parse instruction\n const op = this._blockReader._asmReader.parseAsm(reg);\n\n // Add instruction to list\n opList.push(op);\n }\n\n return opList;\n }\n} ","import { Op, OpCode } from '@gaialabs/shared';\r\nimport { Registers } from '../../assembly';\r\nimport { RomDataReader } from './reader';\r\nimport { TransformProcessor } from './transforms';\r\nimport { AddressingModeHandler, OperationContext } from './addressing';\r\nimport type { BlockReader } from './blocks';\r\n\r\n/**\r\n * Parses assembly instructions from ROM data, handling different addressing modes\r\n * and maintaining CPU register state during analysis.\r\n * Converted from GaiaLib/Rom/Extraction/AsmReader.cs\r\n */\r\nexport class AsmReader {\r\n // Constants\r\n private static readonly PROCESSOR_FLAG_MASK = 0xDF;\r\n private static readonly ACCUMULATOR_OP_MASK = 0xF;\r\n private static readonly ACCUMULATOR_OP_VALUE = 0x9;\r\n public static readonly VARIABLE_SIZE_INDICATOR = -2;\r\n private static readonly TWO_BYTES_SIZE = 2;\r\n private static readonly THREE_BYTES_SIZE = 3;\r\n\r\n private readonly _blockReader: BlockReader;\r\n private readonly _transformProcessor: TransformProcessor;\r\n private readonly _addressingModeHandler: AddressingModeHandler;\r\n private readonly _romDataReader: RomDataReader;\r\n\r\n constructor(blockReader: BlockReader) {\r\n this._blockReader = blockReader;\r\n this._transformProcessor = new TransformProcessor(blockReader);\r\n this._addressingModeHandler = new AddressingModeHandler(blockReader, this._transformProcessor);\r\n this._romDataReader = blockReader._romDataReader;\r\n }\r\n\r\n public parseAsm(reg: Registers): Op {\r\n const opStart = this._romDataReader.position;\r\n const opCode = this._romDataReader.readByte();\r\n \r\n // Find matching OpCode in the database\r\n const code = this._blockReader._root.opCodes[opCode];\r\n if (!code) {\r\n throw new Error('Unknown OpCode');\r\n }\r\n\r\n // Initialize operation context\r\n const operationContext = this.initializeOperation(code, reg, opStart);\r\n\r\n // Process operands based on the addressing mode\r\n const operands = this._addressingModeHandler.processAddressingMode(code, operationContext, reg);\r\n \r\n // Apply label transforms to operands after processing. This ensures that the ROM state is processed and valid.\r\n this._transformProcessor.applyTransforms(operationContext.xForm1, operationContext.xForm2, operands);\r\n\r\n const op = new Op(\r\n code,\r\n opStart,\r\n operands,\r\n this._romDataReader.position - opStart\r\n );\r\n\r\n if (operationContext.copDef) {\r\n op.copDef = operationContext.copDef;\r\n }\r\n\r\n return op;\r\n }\r\n\r\n public clearDestinationRegister(code: OpCode, reg: Registers): void {\r\n switch (code.mnem) {\r\n case 'LDA':\r\n reg.accumulator = undefined;\r\n break;\r\n case 'LDX':\r\n reg.xIndex = undefined;\r\n break;\r\n case 'LDY':\r\n reg.yIndex = undefined;\r\n break;\r\n }\r\n }\r\n\r\n private initializeOperation(code: OpCode, reg: Registers, loc: number): OperationContext {\r\n // Calculate instruction size (some are variable)\r\n const size = this.calculateInstructionSize(code, reg);\r\n\r\n // Calculate next address (for branching)\r\n const next = loc + size;\r\n\r\n // Clear destination register for load operations. This resets the register state\r\n this.clearDestinationRegister(code, reg);\r\n\r\n const context = new OperationContext();\r\n context.size = size;\r\n context.nextAddress = next;\r\n context.xForm1 = this._transformProcessor.getTransform();\r\n context.xForm2 = null;\r\n context.copDef = null;\r\n\r\n return context;\r\n }\r\n\r\n private calculateInstructionSize(code: OpCode, reg: Registers): number {\r\n const addrMode = this._blockReader._root.addrLookup[code.mode];\r\n let size = addrMode.size;\r\n \r\n if (size === AsmReader.VARIABLE_SIZE_INDICATOR || code.mode === 'Immediate') {\r\n if((code.code & AsmReader.PROCESSOR_FLAG_MASK) === 0xC2){\r\n size = AsmReader.TWO_BYTES_SIZE;\r\n } else if ((code.code & AsmReader.ACCUMULATOR_OP_MASK) === AsmReader.ACCUMULATOR_OP_VALUE) {\r\n size = (reg.accumulatorFlag ?? false) ? AsmReader.TWO_BYTES_SIZE : AsmReader.THREE_BYTES_SIZE;\r\n } else {\r\n size = (reg.indexFlag ?? false) ? AsmReader.TWO_BYTES_SIZE : AsmReader.THREE_BYTES_SIZE;\r\n }\r\n }\r\n \r\n return size;\r\n }\r\n} ","/**\r\n * Represents the stack for the 65816 processor\r\n */\r\nexport class Stack {\r\n public bytes: Uint8Array;\r\n public location: number;\r\n\r\n constructor() {\r\n this.bytes = new Uint8Array(70);\r\n this.location = 10;\r\n }\r\n\r\n /**\r\n * Push a byte onto the stack\r\n */\r\n public push(value: number): void {\r\n this.bytes[this.location++] = value & 0xFF;\r\n }\r\n\r\n /**\r\n * Push a 16-bit value onto the stack (little-endian)\r\n */\r\n public pushUInt16(value: number): void {\r\n this.bytes[this.location++] = value & 0xFF;\r\n this.bytes[this.location++] = (value >> 8) & 0xFF;\r\n }\r\n\r\n /**\r\n * Pop a byte from the stack\r\n */\r\n public popByte(): number {\r\n return this.bytes[--this.location];\r\n }\r\n\r\n /**\r\n * Pop a 16-bit value from the stack (little-endian)\r\n */\r\n public popUInt16(): number {\r\n const high = this.bytes[--this.location];\r\n const low = this.bytes[--this.location];\r\n return (high << 8) | low;\r\n }\r\n\r\n /**\r\n * Reset the stack to initial state\r\n */\r\n public reset(): void {\r\n this.bytes.fill(0);\r\n this.location = 10;\r\n }\r\n} ","import { StatusFlags } from '@gaialabs/shared';\nimport { Stack } from './Stack';\n\n/**\n * Manages the 65816 processor registers and status flags\n */\nexport class Registers {\n public accumulatorFlag?: boolean;\n public indexFlag?: boolean;\n public direct?: number;\n public dataBank?: number;\n public accumulator?: number;\n public xIndex?: number;\n public yIndex?: number;\n public stack: Stack;\n\n constructor() {\n this.stack = new Stack();\n }\n\n /**\n * Get the current status flags\n */\n public get statusFlags(): StatusFlags {\n let flags = 0;\n if (this.accumulatorFlag ?? false) {\n flags |= StatusFlags.AccumulatorMode;\n }\n if (this.indexFlag ?? false) {\n flags |= StatusFlags.IndexMode;\n }\n return flags;\n }\n\n /**\n * Set the status flags\n */\n public set statusFlags(value: StatusFlags) {\n this.accumulatorFlag = (value & StatusFlags.AccumulatorMode) !== 0;\n this.indexFlag = (value & StatusFlags.IndexMode) !== 0;\n }\n\n /**\n * Reset all registers to initial state\n */\n public reset(): void {\n this.accumulatorFlag = undefined;\n this.indexFlag = undefined;\n this.direct = undefined;\n this.dataBank = undefined;\n this.accumulator = undefined;\n this.xIndex = undefined;\n this.yIndex = undefined;\n this.stack.reset();\n }\n} ","import { Registers } from '../../assembly';\nimport { Op } from '@gaialabs/shared';\nimport { RomDataReader } from './reader';\nimport { ProcessorStateManager } from './processor';\nimport { ReferenceManager } from './references';\nimport { StringReader } from './strings';\nimport { AsmReader } from './asm';\nimport { TypeParser } from './parser';\nimport { \n Address, \n AddressType, \n LocationWrapper, \n StructDef, \n RegisterType,\n BlockReaderConstants,\n RomProcessingConstants,\n TableEntry,\n createTableEntry,\n BinType,\n AsmBlock,\n createChunkFileFromDbFile,\n createChunkFileFromDbBlock,\n} from '@gaialabs/shared';\nimport type { DbFile, StringWrapper } from '@gaialabs/shared';\nimport type { DbRoot } from '@gaialabs/shared';\nimport type { DbBlock } from '@gaialabs/shared';\nimport type { DbPart } from '@gaialabs/shared';\nimport { ChunkFile, ChunkFileUtils } from '@gaialabs/shared';\nimport { indexOfAny } from '../../utils';\nimport { registerCompressionProviders } from '../../compression/registry'\n\nregisterCompressionProviders();\n\n/**\n * Central class for reading and analyzing ROM blocks\n * Converted from GaiaLib/Rom/Extraction/BlockReader.cs\n */\nexport class BlockReader {\n // Constants\n private static readonly REF_SEARCH_MAX_RANGE = 0x1A0;\n private static readonly BANK_MASK_CHECK = 0x40;\n private static readonly BYTE_DELIMITER_THRESHOLD = 0x100;\n private static readonly BANK_HIGH_MEMORY_1 = 0x7E;\n private static readonly BANK_HIGH_MEMORY_2 = 0x7F;\n private static readonly POINTER_CHARACTERS = ['&', '@'];\n\n // Location regex pattern: _([A-Fa-f0-9]{6})\n private static readonly LOCATION_REGEX = /_([A-Fa-f0-9]{6})/;\n\n // Core Dependencies\n public readonly _root: DbRoot;\n public readonly _stringReader: StringReader;\n public readonly _asmReader: AsmReader;\n public readonly _typeParser: TypeParser;\n public readonly _romDataReader: RomDataReader;\n public readonly _stateManager: ProcessorStateManager;\n public readonly _referenceManager: ReferenceManager;\n\n // Backward Compatibility Properties\n public get AccumulatorFlags(): Map<number, boolean | null> {\n return this._stateManager.accumulatorFlags;\n }\n\n public get IndexFlags(): Map<number, boolean | null> {\n return this._stateManager.indexFlags;\n }\n\n public get BankNotes(): Map<number, number | null> {\n return this._stateManager.bankNotes;\n }\n\n public get StackPosition(): Map<number, number> {\n return this._stateManager.stackPositions;\n }\n\n // Direct access to reference management collections\n public get _structTable(): Map<number, string> {\n return this._referenceManager.structTable;\n }\n\n public get _markerTable(): Map<number, number> {\n return this._referenceManager.markerTable;\n }\n\n public get _nameTable(): Map<number, string> {\n return this._referenceManager.nameTable;\n }\n\n // Current Processing State (Database)\n //public _currentBlock!: DbBlock;\n //public _currentPart: DbPart | null = null;\n public _partEnd: number = 0;\n \n // ChunkFile Processing State\n public _currentChunk: ChunkFile | null = null;\n public _currentAsmBlock: AsmBlock | null = null;\n public _enrichedChunks: ChunkFile[] = [];\n\n constructor(romData: Uint8Array, root: DbRoot) {\n this._romDataReader = new RomDataReader(romData);\n this._stateManager = new ProcessorStateManager();\n this._referenceManager = new ReferenceManager(root);\n this._root = root;\n\n this._stringReader = new StringReader(this as any);\n this._asmReader = new AsmReader(this as any);\n this._typeParser = new TypeParser(this as any);\n\n this.initializeOverrides();\n this.initializeFileReferences();\n }\n\n /**\n * Processes predefined overrides for registers and bank notes\n */\n private initializeOverrides(): void {\n for (const over of Object.values(this._root.overrides)) {\n switch (over.register) {\n case RegisterType.M:\n this._stateManager.setAccumulatorFlag(over.location, over.value === 1);\n break;\n case RegisterType.X:\n this._stateManager.setIndexFlag(over.location, over.value === 1);\n break;\n case RegisterType.B:\n this._stateManager.setBankNote(over.location, over.value);\n break;\n }\n }\n }\n\n /**\n * Processes predefined file references\n */\n private initializeFileReferences(): void {\n for (const file of this._root.files) {\n this._referenceManager.tryAddName(file.start, file.name);\n }\n }\n\n /**\n * Resolves mnemonic for a given address\n */\n public resolveMnemonic(addr: Address): void {\n // If the address is in high memory (ROM only), skip processing\n if ((addr.bank & Address.DATA_BANK_FLAG) !== 0) {\n return;\n }\n\n let offset = addr.offset;\n \n const label = this._root.mnemonics[offset];\n if (!label) {\n return;\n }\n\n const ix = indexOfAny(label, RomProcessingConstants.OPERATORS);\n if (ix >= 0) {\n let opnd = parseInt(label.substring(ix + 1), 16);\n const op = label[ix];\n if(op === '-')\n opnd = -opnd;\n \n offset -= opnd;\n }\n\n // Add to current block's mnemonics\n this._currentChunk!.mnemonics[offset] = label.substring(0, ix >= 0 ? ix : label.length);\n }\n\n /**\n * Resolves name for a location (delegated to ReferenceManager)\n */\n public resolveName(location: number, type: AddressType, isBranch: boolean): string {\n return this._referenceManager.resolveName(location, type, isBranch);\n }\n\n /**\n * Resolves include for a location\n */\n public resolveInclude(loc: number, isBranch: boolean): void {\n const [outside, foundBlock, foundPart] = ChunkFileUtils.isOutsideWithPart(this._enrichedChunks, this._currentChunk!, loc);\n if (outside && foundBlock && foundPart) {\n this._currentAsmBlock!.includes!.add({block: foundBlock, part: foundPart});\n } else if (isBranch && !this._referenceManager.tryGetName(loc).found) {\n const name = `loc_${loc.toString(16).toUpperCase().padStart(6, '0')}`;\n this._referenceManager.tryAddName(loc, name);\n }\n }\n\n /**\n * Notes a type at a location and manages chunk references\n */\n public noteType(loc: number, type: string, silent: boolean = false, reg?: Registers): string {\n this._referenceManager.tryAddStruct(loc, type);\n\n const nameResult = this._referenceManager.tryGetName(loc);\n let name: string;\n \n if (!nameResult.found) {\n name = this._referenceManager.createTypeName(type, loc);\n this._referenceManager.tryAddName(loc, name);\n } else {\n name = nameResult.referenceName!;\n }\n\n if (!silent && type === BlockReaderConstants.CODE_TYPE && reg) {\n this.updateRegisterState(loc, reg);\n }\n\n return name;\n }\n\n private updateRegisterState(loc: number, reg: Registers): void {\n if (reg.accumulatorFlag !== undefined) {\n this._stateManager.tryAddAccumulatorFlag(loc, reg.accumulatorFlag);\n }\n if (reg.indexFlag !== undefined) {\n this._stateManager.tryAddIndexFlag(loc, reg.indexFlag);\n }\n if (reg.stack.location > 0) {\n this._stateManager.tryAddStackPosition(loc, reg.stack.location);\n }\n }\n\n /**\n * Checks if a delimiter has been reached\n */\n public delimiterReached(delimiter?: number): boolean {\n if (delimiter === undefined) {\n return false;\n }\n\n if (delimiter >= BlockReaderConstants.BYTE_DELIMITER_THRESHOLD) {\n if (this._romDataReader.peekShort() === delimiter) {\n this._romDataReader.position += 2;\n return true;\n }\n } else if (this._romDataReader.peekByte() === delimiter) {\n this._romDataReader.position++;\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks if processing of the current part can continue\n */\n public partCanContinue(): boolean {\n return this._romDataReader.position < this._partEnd && \n !this._referenceManager.containsStruct(this._romDataReader.position);\n }\n\n public analyzeAndResolve(): ChunkFile[] {\n this.createChunkFilesFromDatabase();\n this.initializeBlocksAndParts();\n this.analyzeChunkFiles();\n this.resolveReferences();\n \n return this._enrichedChunks;\n }\n\n /**\n * Analyzes all blocks in the ROM\n */\n // private analyzeBlocks(): void {\n // this.initializeBlocksAndParts();\n\n // for (const chunk of this._enrichedChunks) {\n // this._currentChunk = chunk;\n // for (const part of chunk.parts || []) {\n // this.processPart(part);\n // }\n // }\n // }\n\n /**\n * Initializes blocks and parts with base references\n */\n private initializeBlocksAndParts(): void {\n for (const block of this._enrichedChunks) {\n for (const part of block.parts || []) {\n if(part.structName) {\n this._referenceManager.tryAddStruct(part.location, part.structName);\n }\n if(part.label) {\n this._referenceManager.tryAddName(part.location, part.label);\n }\n }\n }\n }\n\n /**\n * Processes a single part\n */\n private processPart(part: AsmBlock): void {\n this._currentAsmBlock = part;\n this._romDataReader.position = part.location;\n this._partEnd = part.location + part.size;\n\n let current = part.structName || BlockReaderConstants.BINARY_TYPE;\n const chunks: TableEntry[] = [];\n const reg = new Registers();\n const bank = part.bank;\n let last: TableEntry | null = null;\n\n while (this._romDataReader.position < this._partEnd) {\n const structResult = this._referenceManager.tryGetStruct(this._romDataReader.position);\n if (structResult.found) {\n current = structResult.chunkType!;\n } else if (last !== null) {\n this.processContinuousEntry(current, reg, bank, last);\n continue;\n }\n\n last = createTableEntry(this._romDataReader.position);\n chunks.push(last);\n this.processNewEntry(current, reg, bank, last);\n }\n\n part.objList = chunks;\n }\n\n /**\n * Processes a continuous entry (same type as previous)\n */\n private processContinuousEntry(current: string, reg: Registers, bank: number | undefined, last: TableEntry): void {\n const obj = this._typeParser.parseType(current, reg, 0, bank);\n if (!Array.isArray(last.object)) {\n last.object = [last.object];\n }\n (last.object as unknown[]).push(obj);\n }\n\n /**\n * Processes a new entry\n */\n private processNewEntry(current: string, reg: Registers, bank: number | undefined, last: TableEntry): void {\n let res = this._typeParser.parseType(current, reg, 0, bank);\n if (BlockReaderConstants.POINTER_CHARACTERS.includes(current[0]) && !Array.isArray(res)) {\n res = [res];\n }\n last.object = res;\n }\n\n /**\n * Creates ChunkFile objects from database structure\n */\n private createChunkFilesFromDatabase(): void {\n // Clear any previous results\n this._enrichedChunks = [];\n this.createChunkFilesFromSfx();\n // Convert DbFiles to binary ChunkFiles with rawData\n this.createChunkFilesFromDbFiles();\n // Convert DbBlocks to assembly ChunkFiles with parts\n this.createChunkFilesFromDbBlocks();\n }\n\n /**\n * Creates binary ChunkFiles from DbFiles (enriched with rawData)\n */\n private createChunkFilesFromSfx(): void {\n let pos = this._root.config.sfxLocation;\n const count = this._root.config.sfxCount;\n const romData = this._romDataReader.romData;\n\n const getSize = () => romData[pos++] | (romData[pos++] << 8);\n\n for (let i = 0; i < count; i++) {\n const size = getSize();\n const startPos = pos;\n let remaining = size;\n\n let end = pos + remaining;\n let data: Uint8Array;\n if (end & RomProcessingConstants.PAGE_SIZE) {\n const endLen = end & 0x7FFF;\n remaining -= endLen;\n data = romData.slice(pos, pos + remaining);\n pos += remaining + RomProcessingConstants.PAGE_SIZE;\n end = pos + endLen;\n const data2 = romData.slice(pos, end);\n data = new Uint8Array([...data, ...data2]);\n } else {\n data = romData.slice(pos, end);\n }\n pos = end;\n\n const chunk = new ChunkFile(`sfx${i.toString(16).toUpperCase().padStart(2, '0')}`, size, startPos, BinType.Sound);\n chunk.rawData = data;\n this._enrichedChunks.push(chunk);\n }\n }\n\n /**\n * Creates binary ChunkFiles from DbFiles (enriched with rawData)\n */\n private createChunkFilesFromDbFiles(): void {\n for (const dbFile of this._root.files) {\n const chunkFile = createChunkFileFromDbFile(this._romDataReader.romData, this._root.compression, dbFile);\n this._enrichedChunks.push(chunkFile);\n }\n }\n\n /**\n * Creates assembly ChunkFiles from DbBlocks (enriched with parts)\n */\n private createChunkFilesFromDbBlocks(): void {\n for (const block of this._root.blocks) {\n const chunkFile = createChunkFileFromDbBlock(block);\n this._enrichedChunks.push(chunkFile);\n }\n }\n /**\n * Analyzes only assembly ChunkFiles (those with parts from DbBlocks)\n */\n private analyzeChunkFiles(): void {\n // Only process assembly ChunkFiles, skip binary ones\n const assemblyChunks = this._enrichedChunks.filter(chunk => chunk.type === BinType.Assembly);\n \n for (const chunkFile of assemblyChunks) {\n this._currentChunk = chunkFile;\n for (const asmBlock of chunkFile.parts || []) {\n this._currentAsmBlock = asmBlock;\n this.processPart(asmBlock);\n }\n }\n }\n\n // /**\n // * Processes a single AsmBlock (similar to processPart)\n // */\n // private processAsmBlock(asmBlock: AsmBlock): void {\n // this._romDataReader.position = asmBlock.location;\n // this._partEnd = asmBlock.location + asmBlock.size;\n\n // let current = asmBlock.structName || BlockReaderConstants.BINARY_TYPE;\n // const chunks: TableEntry[] = [];\n // const reg = new Registers();\n // const bank = this._currentAsmBlock?.bank;\n // let last: TableEntry | null = null;\n\n // while (this._romDataReader.position < this._partEnd) {\n // const structResult = this._referenceManager.tryGetStruct(this._romDataReader.position);\n // if (structResult.found) {\n // current = structResult.chunkType!;\n // } else if (last !== null) {\n // this.processContinuousEntry(current, reg, bank, last);\n // continue;\n // }\n\n // last = createTableEntry(this._romDataReader.position);\n // chunks.push(last);\n // this.processNewEntry(current, reg, bank, last);\n // }\n\n // asmBlock.objList = chunks;\n // }\n\n /**\n * Resolves references in assembly ChunkFiles only\n */\n private resolveReferences(): void {\n for (const chunkFile of this._enrichedChunks) {\n this._currentChunk = chunkFile;\n \n for (const asmBlock of chunkFile.parts || []) {\n this._currentAsmBlock = asmBlock;\n this.resolveObject(asmBlock.objList, false);\n }\n }\n }\n\n /**\n * Resolves a single object and its references\n */\n private resolveObject(obj: unknown, isBranch: boolean): void {\n if (typeof obj === 'string') {\n // String objects don't need resolution\n return;\n }\n\n if (Array.isArray(obj)) {\n for (const o of obj) {\n this.resolveObject(o, isBranch);\n }\n return;\n }\n\n if (obj instanceof Address) {\n this.resolveMnemonic(obj);\n return;\n }\n\n if (typeof obj === 'number') {\n this.resolveInclude(obj, isBranch);\n return;\n }\n\n if (obj instanceof LocationWrapper) {\n this.resolveInclude(obj.location, isBranch);\n return;\n }\n\n if (obj && typeof obj === 'object') {\n if ('string' in obj && 'type' in obj) {\n // StringWrapper\n this._stringReader.resolveString(obj as StringWrapper, isBranch);\n return;\n }\n\n if ('name' in obj && 'parts' in obj) {\n // StructDef\n this.resolveObject((obj as StructDef).parts, isBranch);\n return;\n }\n\n if ('location' in obj && 'object' in obj) {\n // TableEntry\n this.resolveObject((obj as TableEntry).object, isBranch);\n return;\n }\n\n if ('code' in obj && 'operands' in obj) {\n // Op\n this.resolveOperationObject(obj as Op);\n return;\n }\n }\n }\n\n /**\n * Resolves references in an operation object\n */\n private resolveOperationObject(op: Op): void {\n const branch = this.isBranchOperation(op);\n for (const opnd of op.operands) {\n this.resolveObject(opnd, branch);\n }\n }\n\n /**\n * Checks if an operation is a branch operation\n */\n private isBranchOperation(op: Op): boolean {\n return op.mode === 'PCRelative' ||\n op.mode === 'PCRelativeLong' ||\n op.mnem[0] === 'J';\n }\n\n /**\n * Hydrates registers with stored state\n */\n public hydrateRegisters(reg: Registers): void {\n this._stateManager.hydrateRegisters(this._romDataReader.position, reg);\n }\n\n}","import { ChunkFile, DbBlock } from '@gaialabs/shared';\nimport { TableEntry } from '@gaialabs/shared';\nimport { StructDef, Word } from '@gaialabs/shared';\nimport { BlockReader } from './blocks';\nimport { ReferenceManager } from './references';\n\n/**\n * Handles post processing of extracted blocks.\n * Mirrors functionality of GaiaLib.Rom.Extraction.PostProcessor.\n */\nexport class PostProcessor {\n private readonly _referenceManager: ReferenceManager;\n\n constructor(reader: BlockReader) {\n this._referenceManager = reader._referenceManager;\n }\n\n /**\n * Execute post process directive on a block if present.\n */\n public process(block: ChunkFile): void {\n if (!block.postProcess || block.postProcess.trim() === '') {\n return;\n }\n\n let signature = block.postProcess;\n const parts: string[] = [];\n\n const index = signature.indexOf('(');\n if (index > 0) {\n const endIx = signature.indexOf(')', index);\n const params = signature.substring(\n index + 1,\n endIx >= 0 ? endIx : signature.length\n );\n if (params.length > 0) {\n for (const p of params.split(',')) {\n parts.push(p.trim());\n }\n }\n signature = signature.substring(0, index);\n }\n\n const fn = (this as any)[signature];\n if (typeof fn !== 'function') {\n throw new Error(`Unable to locate postprocess function ${signature}`);\n }\n fn.apply(this, [block, ...parts]);\n }\n\n /**\n * Builds a lookup table from struct entries.\n * Equivalent to PostProcessor.Lookup in C# implementation.\n */\n public Lookup(block: ChunkFile, keyIx: string, valueIx: string): void {\n const kix = parseInt(keyIx.trim());\n const vix = parseInt(valueIx.trim());\n\n if(!block.parts || block.parts.length === 0) {\n throw new Error('Invalid block structure for Lookup post process');\n }\n\n const table = block.parts[0]?.objList;\n const tableEntry = table && table[0];\n const entries = tableEntry?.object as unknown[] | undefined;\n\n if (!tableEntry || !entries) {\n throw new Error('Invalid table structure for Lookup post process');\n }\n\n const newParts: TableEntry[] = [];\n const newList: any[] = [];\n\n newParts.push({ location: tableEntry.location, object: newList });\n\n let eIx = 1;\n for (const entry of entries as StructDef[]) {\n if (!entry || !Array.isArray((entry as any).parts)) {\n continue;\n }\n const struct = entry as StructDef;\n let cIx = 0;\n let key: number | null = null;\n let value: unknown = null;\n\n for (const obj of struct.parts) {\n if (cIx === kix) {\n if(obj && typeof obj === 'object' && 'value' in obj) {\n key = obj.value as number;\n } else {\n key = obj as number;\n }\n } else if (cIx === vix) {\n value = obj;\n }\n cIx++;\n }\n\n if (key === null || value === null) {\n throw new Error('Could not locate key or value for transform');\n }\n\n const name = `entry_${key.toString(16).toUpperCase().padStart(2, '0')}`;\n const loc = tableEntry.location + eIx;\n\n newParts.push({ location: loc, object: value });\n\n // Force labels to match the new name\n this._referenceManager.nameTable.set(loc, name);\n\n while (newList.length <= key) {\n newList.push(new Word(0));\n }\n\n newList[key] = `&${name}`;\n eIx++;\n }\n\n block.parts[0].objList = newParts;\n }\n}\n\nexport default PostProcessor;\n\n","import { Op } from '@gaialabs/shared';\nimport { AsmBlock, ChunkFile, ChunkFileUtils, TypedNumber } from '@gaialabs/shared';\nimport { \n DbRoot,\n AddressType, \n MemberType,\n AddressSpace,\n TableEntry,\n StructDef,\n StringWrapper,\n LocationWrapper,\n Address\n} from '@gaialabs/shared';\nimport { BlockReader } from './blocks';\nimport { ReferenceManager } from './references';\nimport { PostProcessor } from './postprocessor';\n\n// Platform detection that works in both Node.js and web environments\nconst isWindows = (() => {\n // Check if we're in Node.js environment\n if (typeof process !== 'undefined' && process.platform) {\n return process.platform === 'win32';\n }\n // In web environment, check user agent as fallback\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n return navigator.userAgent.includes('Windows');\n }\n // Default to Unix-style line endings if we can't determine\n return false;\n})();\n\nconst NEWLINE = isWindows ? '\\r\\n' : '\\n';\n\n// Type tags for better object identification\nexport enum ObjectType {\n TableEntryArray = 'TableEntryArray',\n StructDef = 'StructDef',\n OpArray = 'OpArray',\n LocationWrapper = 'LocationWrapper',\n Address = 'Address',\n StringWrapper = 'StringWrapper',\n ByteArray = 'ByteArray',\n Array = 'Array',\n String = 'String',\n Number = 'Number',\n TypedNumber = 'TypedNumber'\n}\n\nexport class BlockWriter {\n private _root: DbRoot;\n private _blockReader: BlockReader;\n private _referenceManager: ReferenceManager;\n private _postProcessor: PostProcessor;\n private _isInline: boolean = false;\n private _currentPart: AsmBlock | null = null;\n\n constructor(reader: BlockReader) {\n this._blockReader = reader;\n this._root = reader._root;\n this._referenceManager = reader._referenceManager;\n this._postProcessor = new PostProcessor(reader);\n }\n\n // async writeBlocks(outPath: string): Promise<void> {\n // const res = DbRootUtils.getPath(this._root, BinType.Assembly);\n\n // const folderPath = join(outPath, res.folder);\n\n // for (const block of this._root.blocks) {\n // const groupedFolderPath = block.group \n // ? join(folderPath, block.group)\n // : folderPath;\n \n // await fs.mkdir(groupedFolderPath, { recursive: true });\n\n // const outFile = join(groupedFolderPath, `${block.name}.${res.extension}`);\n \n // // Check if file exists, skip if it does\n // try {\n // await fs.access(outFile);\n // continue;\n // } catch {\n // // File doesn't exist, continue with creation\n // }\n\n // const content = this.generateAsm(block);\n \n // await fs.writeFile(outFile, content);\n // }\n // }\n\n generateAllAsm(chunkFiles: ChunkFile[]): any[] {\n const lines: any[] = [];\n for (const block of chunkFiles) {\n lines.push({\n name: block.name,\n group: block.group,\n text: this.generateAsm(block)\n });\n }\n return lines;\n }\n\n generateAsm(block: ChunkFile): string{\n if(!block.parts) {\n throw new Error('Invalid block structure for generateAsm');\n }\n\n const lines: string[] = [];\n\n // Write bank information if not movable\n if (block.bank !== undefined) {\n lines.push(`?BANK ${block.bank.toString(16).toUpperCase().padStart(2, '0')}`);\n }\n\n // Write includes - these should be from the block's include list\n const includes = ChunkFileUtils.getIncludes(block);\n if (includes && includes.length > 0) {\n lines.push('');\n for (const inc of includes) {\n lines.push(`?INCLUDE '${inc.name}'`);\n }\n }\n\n // Write mnemonics - these should be from the root mnemonics that are referenced in this block\n const mnemonics = this.getMnemonicsForBlock(block);\n if (mnemonics && mnemonics.length > 0) {\n lines.push('');\n for (const [name, address] of mnemonics) {\n const paddedName = name.padEnd(30, ' ');\n lines.push(`!${paddedName} ${address.toString(16).toUpperCase().padStart(4, '0')}`);\n }\n }\n\n // Apply any post processing defined for the block\n this._postProcessor.process(block);\n\n // Process each part\n for (const part of block.parts || []) {\n this._currentPart = part;\n this._isInline = true;\n\n lines.push('');\n lines.push('---------------------------------------------');\n\n const objectLines = this.writeObject(part.objList, -1);\n lines.push(...objectLines);\n }\n\n let content = lines.join(NEWLINE);\n\n // Apply replace transforms\n if (block.transforms) {\n for (const x of block.transforms) {\n if (x.key && x.value) {\n const regex = new RegExp(x.key, 'g');\n content = content.replace(regex, x.value);\n }\n }\n }\n\n if(!isWindows){\n content = content.replace(/\\r/g, '');\n }\n\n return content;\n };\n\n private getMnemonicsForBlock(block: ChunkFile): [string, number][] {\n if (!block.mnemonics) {\n return [];\n }\n\n return Object.entries(block.mnemonics)\n .map(([k, v]) => [v, parseInt(k, 10)] as [string, number])\n .sort((a, b) => a[1] - b[1]);\n }\n\n private resolveOperand(op: Op, obj: any, isBranch: boolean = false): any {\n\n if(obj instanceof TypedNumber) {\n const len = obj.size * 2;\n return obj.value.toString(16).toUpperCase().padStart(len, '0');\n }\n\n if (typeof obj === 'number') {\n if (op.mode === 'Immediate') {\n return obj;\n }\n return this._blockReader.resolveName(obj, AddressType.Address, isBranch);\n }\n \n if (this.getObjectType(obj) === ObjectType.LocationWrapper) {\n const lw = obj as LocationWrapper;\n return this._blockReader.resolveName(lw.location, lw.type, isBranch);\n }\n if (this.getObjectType(obj) === ObjectType.Address) {\n const addr = obj as Address;\n\n if (op.size === 4) {\n return addr;\n }\n\n if (addr.isCodeBank && addr.offset < Address.UPPER_BANK) {\n const label = this._root.mnemonics[addr.offset];\n if (label) {\n return label;\n }\n }\n\n return addr.offset;\n }\n\n // Preserve tag information on typed numbers without resolving names\n if (obj && obj instanceof TypedNumber) {\n // const typed = obj as { _tag: string; value: any };\n\n // // Byte/Word objects should remain untouched\n // if (typed._tag === 'Byte' || typed._tag === 'Word' || typed._tag === 'TypedNumber') {\n // return obj;\n // }\n\n // if (typeof typed.value === 'number' && op.mode !== 'Immediate') {\n // const resolved = this._blockReader.resolveName(typed.value, AddressType.Address, isBranch);\n // return { ...typed, value: resolved };\n // }\n return obj;\n }\n return obj;\n }\n\n private getObjectType(obj: any): ObjectType {\n if (obj === null || obj === undefined) {\n return ObjectType.String;\n }\n\n // Check for explicit type tags first\n if (obj._tag) {\n return obj._tag as ObjectType;\n }\n\n if (obj instanceof TypedNumber) {\n return ObjectType.TypedNumber;\n }\n\n // Duck typing fallbacks\n if (Array.isArray(obj)) {\n if (obj.length > 0) {\n if (obj[0] && typeof obj[0] === 'object' && 'location' in obj[0] && 'object' in obj[0]) {\n return ObjectType.TableEntryArray;\n }\n if (obj[0] instanceof Op) {\n return ObjectType.OpArray;\n }\n }\n return ObjectType.Array;\n }\n\n if (obj instanceof Op) {\n return ObjectType.OpArray;\n }\n\n if (obj instanceof LocationWrapper) {\n return ObjectType.LocationWrapper;\n }\n\n if (obj instanceof Address) {\n return ObjectType.Address;\n }\n\n if (obj instanceof Uint8Array) {\n return ObjectType.ByteArray;\n }\n\n if (obj && typeof obj === 'object') {\n if ('string' in obj && 'type' in obj && 'marker' in obj && 'location' in obj) {\n return ObjectType.StringWrapper;\n }\n if ('name' in obj && 'parts' in obj) {\n return ObjectType.StructDef;\n }\n }\n\n if (typeof obj === 'string') {\n return ObjectType.String;\n }\n\n if (typeof obj === 'number') {\n return ObjectType.Number;\n }\n\n return ObjectType.String;\n }\n\n private writeObject(obj: any, depth: number, isBranch: boolean = false): string[] {\n const lines: string[] = [];\n\n const objType = this.getObjectType(obj);\n let objLines: string[];\n\n switch (objType) {\n case ObjectType.TableEntryArray:\n objLines = this.writeTableEntryArray(obj as TableEntry[], depth);\n break;\n\n case ObjectType.StructDef:\n objLines = this.writeStructDef(obj as StructDef, depth);\n break;\n\n case ObjectType.OpArray:\n objLines = this.writeOpArray(obj as Op[], depth);\n break;\n\n case ObjectType.LocationWrapper:\n objLines = [\n this._blockReader.resolveName(\n (obj as LocationWrapper).location,\n (obj as LocationWrapper).type,\n isBranch\n ),\n ];\n break;\n\n case ObjectType.Address:\n objLines = [`$${(obj as Address).toString()}`];\n break;\n\n case ObjectType.ByteArray:\n objLines = [\n `#${Array.from(obj as Uint8Array)\n .map(b => b.toString(16).toUpperCase().padStart(2, '0'))\n .join('')}`,\n ];\n break;\n\n case ObjectType.StringWrapper:\n objLines = this.writeStringWrapper(obj as StringWrapper);\n break;\n\n case ObjectType.Array:\n objLines = this.writeArray(obj as any[], depth);\n break;\n\n case ObjectType.Number:\n objLines = this.writeNumber(obj as number);\n break;\n\n case ObjectType.TypedNumber:\n objLines = this.writeTypedNumber(obj as any);\n break;\n\n case ObjectType.String:\n objLines = [String(obj)];\n break;\n\n default:\n objLines = [String(obj)];\n break;\n }\n\n lines.push(...objLines);\n\n return lines;\n }\n\n private writeTableEntryArray(tGroup: TableEntry[], depth: number): string[] {\n const lines: string[] = [];\n const isInline = this._isInline;\n //this._isInline = true;\n\n for (const t of tGroup) {\n const nameResult = this._referenceManager.tryGetName(t.location);\n const name = nameResult.found ? nameResult.referenceName! : `loc_${t.location.toString(16).toUpperCase().padStart(6, '0')}`;\n \n const objectLines = this.writeObject(t.object, depth + 1);\n lines.push('');\n lines.push(`${name} ${objectLines[0]}`);\n if (objectLines.length > 1) {\n lines.push(...objectLines.slice(1));\n }\n }\n \n this._isInline = isInline;\n return lines;\n }\n\n private writeStructDef(structObj: StructDef, depth: number): string[] {\n const parts: string[] = [];\n const isInline = this._isInline;\n this._isInline = true;\n for (const part of structObj.parts) {\n const partLines = this.writeObject(part, depth);\n parts.push(partLines.join(NEWLINE));\n }\n const line = `${structObj.name} < ${parts.join(', ')} >`;\n this._isInline = isInline; // match C# spacing behaviour\n return [line];\n }\n\n private writeOpArray(opList: Op[], depth: number): string[] {\n const lines: string[] = [];\n lines.push('{');\n const isInline = this._isInline;\n this._isInline = true; // instructions follow immediately\n \n let first = true;\n for (const op of opList) {\n if (first) {\n first = false;\n } else {\n // Check for labels on subsequent instructions\n const labelResult = this._referenceManager.tryGetName(op.location);\n if (labelResult.found) {\n lines.push('');\n lines.push(` ${labelResult.referenceName}:`);\n }\n }\n\n let opLine = ` ${op.mnem} `;\n\n if (op.copDef) {\n // Handle COP instructions specially\n opLine += `[${op.copDef.mnem}]`;\n if (op.operands && op.operands.length > 1) {\n const operandStrings: string[] = [];\n for (let i = 1; i < op.operands.length; i++) {\n const operandLines = this.writeObject(op.operands[i], depth + 1, false);\n operandStrings.push(operandLines[0]);\n }\n opLine += ` ( ${operandStrings.join(', ')} )`;\n }\n } else if (op.operands && op.operands.length > 0) {\n const isBr = op.mnem[0] === 'J' || \n op.mode === 'PCRelative' ||\n op.mode === 'PCRelativeLong';\n\n // Regular instruction formatting\n const resolvedOperand = this.resolveOperand(op, op.operands[0], isBr);\n const format = this._root.addrLookup[op.mode]?.formatString; // || this._root.config.asmFormats?.[op.code.mode];\n \n if (format) {\n let actualFormat = format;\n if (op.mode === 'Immediate' && op.size === 3) {\n actualFormat = format.replace('X2', 'X4');\n }\n const resolvedSecondOperand = op.operands.length > 1 ? this.resolveOperand(op, op.operands[1], isBr) : undefined;\n opLine += this.formatOperand(actualFormat, [resolvedOperand, resolvedSecondOperand]);\n } else {\n // Default formatting based on operand type\n opLine += this.formatDefaultOperand(resolvedOperand, op.size);\n }\n }\n \n lines.push(opLine);\n }\n \n lines.push('}');\n this._isInline = isInline; // ensure following object is separated by blank line\n return lines;\n }\n\n private formatDefaultOperand(operand: any, size: number): string {\n if (typeof operand === 'string') {\n return operand; // Already formatted\n }\n\n if (operand && operand instanceof TypedNumber) {\n return this.formatTypedNumber(operand);\n }\n\n if (typeof operand === 'number') {\n const hexSize = (size - 1) * 2;\n const hex = operand.toString(16).toUpperCase().padStart(hexSize, '0');\n return `$${hex}`;\n }\n \n return String(operand);\n }\n\n private writeStringWrapper(stringObj: StringWrapper): string[] {\n let str = stringObj.string;\n \n // Process string references\n const stringReferenceChars = ['~', '^'];\n for (const char of stringReferenceChars) {\n let ix = str.indexOf(char);\n while (ix >= 0) {\n const hexStr = str.substring(ix + 1, ix + 7);\n const rawAddr = parseInt(hexStr, 16);\n const adrs = new Address((rawAddr >> 16) & 0xFF, rawAddr & 0xFFFF);\n \n if (adrs.space === AddressSpace.ROM) {\n const addressType = char === '^' ? AddressType.Offset : AddressType.Address;\n const location = adrs.toInt();\n const name = this._blockReader.resolveName(location, addressType, false);\n str = str.replace(str.substring(ix, ix + 7), name);\n } else {\n throw new Error('Unsupported address space');\n }\n \n ix = str.indexOf(char, ix + 7);\n }\n }\n\n const refChar = stringObj.type.delimiter;\n let marker = stringObj.marker;\n \n if (marker <= 0) {\n const markerResult = this._referenceManager.tryGetMarker(stringObj.location);\n marker = markerResult.found ? markerResult.offset || 0 : 0;\n }\n\n if (marker > 0) {\n let six = 0;\n let mix = 0;\n \n while (mix < marker) {\n if (str[six] === '[') {\n const eix = str.indexOf(']', ++six);\n const parts = str.substring(six, eix).split(/[,: ]/);\n \n const cmd = Object.values(stringObj.type.commands).find((x: any) => x.value === parts[0]);\n if (cmd && (cmd as any).types) {\n for (const t of (cmd as any).types) {\n switch (t) {\n case MemberType.Byte:\n mix += 1;\n break;\n case MemberType.Word:\n case MemberType.Offset:\n mix += 2;\n break;\n case MemberType.Address:\n mix += 3;\n break;\n case MemberType.Binary:\n mix += parts.length - 1;\n break;\n default:\n throw new Error('Unsupported member type');\n }\n }\n }\n six = eix + 1;\n mix++;\n } else {\n six++;\n mix++;\n }\n }\n \n str = str.substring(0, six) + '[::]' + str.substring(six);\n }\n\n return [`${refChar}${str}${refChar}`];\n }\n\n private writeArray(arr: any[], depth: number): string[] {\n const lines: string[] = [];\n const indent = ' '.repeat(Math.max(0, depth));\n const isInline = this._isInline;\n lines.push('[');\n this._isInline = false; // start elements on their own lines\n\n for (let i = 0; i < arr.length; i++) {\n const objLines = this.writeObject(arr[i], depth + 1);\n for(const line of objLines) {\n lines.push(indent + ' ' + line);\n }\n lines[lines.length - 1] += ` ;${i.toString(16).toUpperCase().padStart(2, '0')}`;\n }\n\n lines.push(indent + ']');\n this._isInline = isInline;\n return lines;\n }\n\n private writeNumber(num: number): string[] {\n // Format numbers based on value and size\n if (num <= 0xff) {\n // Mirror C# BlockWriter: bytes omit the '$' prefix\n return [`#${num.toString(16).toUpperCase().padStart(2, '0')}`];\n }\n\n if (num <= 0xffff) {\n return [`#$${num.toString(16).toUpperCase().padStart(4, '0')}`];\n }\n\n return [`#$${num.toString(16).toUpperCase().padStart(6, '0')}`];\n }\n\n private formatTypedNumber(num: TypedNumber): string {\n if (typeof num.value === 'number') {\n const width = num.size * 2;\n const hex = num.value.toString(16).toUpperCase().padStart(width, '0');\n return num.size === 1 ? `#${hex}` : `#$${hex}`;\n }\n\n return `#${num.value}`;\n }\n\n private writeTypedNumber(num: TypedNumber): string[] {\n return [this.formatTypedNumber(num)];\n }\n\n private formatOperand(format: string, operands: any[]): string {\n return format.replace(/\\{(\\d+)(?::([^}]+))?\\}/g, (match, index, formatSpec) => {\n const operand = operands[parseInt(index)];\n if (operand && typeof operand === 'object' && operand._tag && 'value' in operand) {\n const value = operand.value;\n if (formatSpec && typeof value === 'number' && formatSpec.startsWith('X')) {\n const width = parseInt(formatSpec.substring(1)) || 2;\n return value.toString(16).toUpperCase().padStart(width, '0');\n }\n return String(value);\n }\n\n if (formatSpec && typeof operand === 'number') {\n if (formatSpec.startsWith('X')) {\n const width = parseInt(formatSpec.substring(1)) || 2;\n return operand.toString(16).toUpperCase().padStart(width, '0');\n }\n }\n return String(operand);\n });\n }\n} ","import type { ChunkFile } from '@gaialabs/shared';\r\nimport { RomProcessingConstants } from '@gaialabs/shared';\r\n\r\n/**\r\n * ROM layout planner\r\n * Converted from ext/GaiaLib/Rom/Rebuild/RomLayout.cs\r\n */\r\nexport class RomLayout {\r\n private static readonly MIN_ACCEPTED_REMAINING = 0x20;\r\n\r\n public readonly unmatchedFiles: ChunkFile[];\r\n private readonly bestResult: number[] = new Array(0x200).fill(0);\r\n private readonly bestSample: number[] = new Array(0x200).fill(0);\r\n\r\n private currentBank = 0;\r\n private currentUpper = false;\r\n private bestDepth = 0;\r\n private bestOffset = 0;\r\n private bestRemain = 0;\r\n\r\n constructor(files: Iterable<ChunkFile>) {\r\n // Filter out zero-size files and order: assembly first, then by size desc\r\n this.unmatchedFiles = Array.from(files)\r\n .filter(x => (x.size || 0) > 0)\r\n .sort((a, b) => {\r\n const aAsm = a.parts ? 0 : 1;\r\n const bAsm = b.parts ? 0 : 1;\r\n if (aAsm !== bAsm) return aAsm - bAsm;\r\n if (b.size !== a.size) return b.size - a.size;\r\n if (a.location !== b.location) return a.location - b.location;\r\n return a.name.localeCompare(b.name);\r\n });\r\n }\r\n\r\n public organize(): void {\r\n for (let page = 0; page < 0x80; page++) {\r\n if (this.unmatchedFiles.length === 0) break;\r\n\r\n let remain = RomProcessingConstants.PAGE_SIZE;\r\n if (page === 1) remain -= RomProcessingConstants.SNES_HEADER_SIZE;\r\n\r\n this.currentUpper = (page & 1) !== 0;\r\n this.currentBank = page >> 1;\r\n this.bestDepth = 0;\r\n this.bestRemain = remain;\r\n this.bestOffset = 0;\r\n const start = page << 15; // 0x8000 per page\r\n\r\n // Pass 1: assembly preferred in upper banks\r\n this.testDepth(0, 0, remain, this.currentUpper);\r\n\r\n // Pass 2: if upper, also try binary-only fill\r\n if (this.currentUpper) {\r\n this.bestOffset = this.bestDepth;\r\n this.testDepth(0, this.bestDepth, this.bestRemain, false);\r\n }\r\n\r\n // Assign positions for best selection\r\n let position = start;\r\n for (let i = 0; i < this.bestDepth;) {\r\n const file = this.unmatchedFiles[this.bestResult[i++]];\r\n file.location = position;\r\n console.log(` ${position.toString(16).toUpperCase().padStart(6, '0')}: ${file.name}`);\r\n position += file.size || 0;\r\n }\r\n\r\n console.log(`Page ${start.toString(16).toUpperCase().padStart(6, '0')} matched with ${this.bestDepth} files ${this.bestRemain} remaining`);\r\n // Commit: remove placed files from queue\r\n this.commitPage();\r\n }\r\n\r\n if (this.unmatchedFiles.length > 0) {\r\n const names = this.unmatchedFiles.map(x => x.name).join('\\r\\n');\r\n throw new Error(`Unable to match ${this.unmatchedFiles.length} files\\r\\n${names}`);\r\n }\r\n }\r\n\r\n private testDepth(startIndex: number, depth: number, remain: number, asmMode: boolean): boolean {\r\n for (let fileIndex = startIndex; fileIndex < this.unmatchedFiles.length; fileIndex++) {\r\n const file = this.unmatchedFiles[fileIndex];\r\n\r\n const fileSize = file.size || 0;\r\n if (fileSize > remain) continue;\r\n\r\n // Assembly preference and constraints\r\n if (file.parts) {\r\n if (!asmMode) {\r\n if (!this.currentUpper || ((file.bank ?? -1) >= 0)) continue;\r\n } else if (file.bank !== this.currentBank) {\r\n continue;\r\n }\r\n } else if (asmMode) {\r\n continue;\r\n } else if (file.upper && !this.currentUpper) {\r\n continue;\r\n }\r\n\r\n // Skip if already selected in first pass window\r\n let inList = false;\r\n for (let y = this.bestOffset; --y >= 0;) {\r\n if (this.bestResult[y] === fileIndex) {\r\n inList = true;\r\n break;\r\n }\r\n }\r\n if (inList) continue;\r\n\r\n // Try this file at current depth\r\n this.bestSample[depth] = fileIndex;\r\n const newRemain = remain - fileSize;\r\n\r\n if (newRemain < this.bestRemain) {\r\n this.bestRemain = newRemain;\r\n this.bestDepth = depth + 1;\r\n for (let i = this.bestOffset; i < this.bestDepth; i++) {\r\n this.bestResult[i] = this.bestSample[i];\r\n }\r\n }\r\n\r\n if (newRemain < RomLayout.MIN_ACCEPTED_REMAINING) return true;\r\n\r\n if (this.testDepth(fileIndex + 1, depth + 1, newRemain, asmMode)) return true;\r\n }\r\n return true;\r\n }\r\n\r\n private commitPage(): void {\r\n if (this.bestOffset > 0) {\r\n for (let i = this.bestDepth; --i >= 0;) {\r\n let lastY = 0;\r\n let lastX = 0;\r\n let y = 0;\r\n for (let x = this.bestDepth; --x >= 0;) {\r\n y = this.bestResult[x];\r\n if (y > lastY) {\r\n lastY = y;\r\n lastX = x;\r\n }\r\n }\r\n this.bestResult[lastX] = 0;\r\n this.unmatchedFiles.splice(lastY, 1);\r\n }\r\n } else {\r\n for (let i = this.bestDepth; --i >= 0;) {\r\n this.unmatchedFiles.splice(this.bestResult[i], 1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n","import { BinType } from '@gaialabs/shared';\r\nimport { ChunkFileUtils, type ChunkFile } from '@gaialabs/shared';\r\nimport { RomLayout } from './layout';\r\nimport { RomWriter } from './writer';\r\nimport { DbEntryPoint } from '@gaialabs/shared';\r\n\r\n/**\r\n * ROM rebuild processor\r\n * Converted from ext/GaiaLib/Rom/Rebuild/RomProcessor.cs\r\n */\r\nexport class RomProcessor {\r\n private readonly writer: RomWriter;\r\n\r\n constructor(writer: RomWriter) {\r\n this.writer = writer;\r\n }\r\n\r\n public async repack(allFiles: ChunkFile[]): Promise<void> {\r\n // Discover files\r\n //const allFiles = await this.discoverFiles(this.writer._projectRoot.baseDir);\r\n\r\n const patches = allFiles.filter(x => x.type === BinType.Patch);\r\n const asmFiles = allFiles.filter(x => !!x.parts);\r\n\r\n // Assembly processing now happens in project.ts via ChunkBlockReader.analyzeAndResolveChunks()\r\n // This provides comprehensive cross-referencing and object graph generation\r\n\r\n // Apply patches to asm blocks\r\n RomProcessor.applyPatches(asmFiles, patches);\r\n\r\n // Calculate ASM sizes\r\n for (const asm of asmFiles) {\r\n ChunkFileUtils.calculateSize(asm);\r\n }\r\n\r\n // Assign locations\r\n const layout = new RomLayout(allFiles);\r\n layout.organize();\r\n\r\n // Rebase assemblies\r\n for (const file of asmFiles) {\r\n ChunkFileUtils.rebase(file);\r\n }\r\n\r\n // Build include lookup map per asm file\r\n for (const f of asmFiles) {\r\n const includeBlocks = asmFiles\r\n .filter(x => f.includes?.has(x.name.toUpperCase()))\r\n .flatMap(x => x.parts!)\r\n .filter(b => !!b.label);\r\n\r\n f.includeLookup = new Map();\r\n\r\n for (const b of includeBlocks) {\r\n if (b.label) f.includeLookup.set(b.label.toUpperCase(), b);\r\n }\r\n\r\n for (const b of (f.parts || []).filter(x => !!x.label)) {\r\n if (b.label) f.includeLookup.set(b.label.toUpperCase(), b);\r\n }\r\n }\r\n\r\n // Create block lookup for resolving labels to locations\r\n const blockLookup = new Map<string, number>();\r\n for (const f of allFiles) {\r\n blockLookup.set(f.name.toUpperCase(), f.location);\r\n }\r\n\r\n // Write all files\r\n for (const file of allFiles) {\r\n await this.writer.writeFile(file, blockLookup);\r\n }\r\n\r\n // Entry point fixups\r\n const entryBlocks = (asmFiles\r\n .filter(x => (x.bank ?? -1) === 0)\r\n .flatMap(x => x.parts || [])\r\n .filter(b => !!b.label)) as { label?: string; location: number }[];\r\n\r\n for (const ep of this.writer.entryPoints) {\r\n const match = entryBlocks.find(b => b.label === ep.name);\r\n if (match) this.writer.writeTransform(ep.location, match.location & 0xFFFF);\r\n }\r\n }\r\n\r\n public static applyPatches(asmFiles: ChunkFile[], patches: ChunkFile[]): void {\r\n for (const patch of patches.filter(x => x.includes && x.includes.size > 0)) {\r\n let file: ChunkFile | null = null;\r\n let dstIx = -1;\r\n const inc = asmFiles.filter(x => patch.includes!.has(x.name.toUpperCase()));\r\n for (let ix = 0; patch.parts && ix < patch.parts.length;) {\r\n const block = patch.parts[ix];\r\n let match: any = null;\r\n if (block.label) { \r\n for (const i of inc) {\r\n if (!i.parts) continue;\r\n for (let y = 0; y < i.parts.length; y++) {\r\n const check = i.parts[y];\r\n if (check.label === block.label) {\r\n file = i; \r\n dstIx = y; \r\n match = check;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (match) {\r\n file!.parts![dstIx++] = block;\r\n } else if (dstIx >= 0) {\r\n file!.parts!.splice(dstIx++, 0, block);\r\n } else { ix++; continue; }\r\n file!.includes = file!.includes || new Set();\r\n file!.includes.add(patch.name.toUpperCase());\r\n patch.parts!.splice(ix, 1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n","import { \n BinType, \n AddressType, \n Address, \n RomProcessingConstants,\n type DbEntryPoint, \n type ChunkFile, \n type AsmBlock, \n type StringMarker,\n type TableEntry,\n LocationWrapper,\n Byte,\n Word,\n Long,\n TypedNumber\n} from '@gaialabs/shared';\nimport { RomProcessor as RebuildProcessor } from './processor';\nimport { Op } from '@gaialabs/shared';\n\n/**\n * ROM writer (binary)\n * Converted from ext/GaiaLib/Rom/Rebuild/RomWriter.cs (subset: binary write only)\n */\nexport class RomWriter {\n public bpsPath?: string;\n public readonly outBuffer: Uint8Array;\n public readonly entryPoints: DbEntryPoint[];\n public readonly cartName: string;\n public readonly makerCode: string;\n\n constructor(entryPoints: DbEntryPoint[], cartName: string, makerCode: string) {\n this.cartName = cartName;\n this.makerCode = makerCode;\n this.entryPoints = entryPoints;\n //There needs to be a way to determine the rom size and makeup\n this.outBuffer = new Uint8Array(0x400000);\n }\n\n public async repack(files: ChunkFile[]): Promise<Uint8Array> {\n const processor = new RebuildProcessor(this);\n await processor.repack(files);\n\n this.writeHeader();\n this.writeEntryPoints(files.filter(x => !!x.parts));\n this.writeChecksum();\n\n //await this.generatePatch();\n return this.outBuffer;\n }\n\n public writeHeader(): void {\n const buf = this.outBuffer!;\n // Maker/game code at 0xFFB0\n let pos = 0xFFB0;\n this.writeAscii(this.makerCode.padEnd(6, ' '), pos); pos += 6;\n for (let i = 0; i < 10; i++) buf[pos++] = 0;\n this.writeAscii(this.cartName.toUpperCase().padEnd(21, ' '), pos); pos += 21;\n buf[pos++] = 0x31; // map mode\n buf[pos++] = 0x02; // chipset\n buf[pos++] = 0x0C; // ROM size\n buf[pos++] = 0x03; // RAM size\n buf[pos++] = 0x01; // country\n buf[pos++] = 0x33; // dev id\n buf[pos++] = 0x00; // version\n }\n\n public writeChecksum(): void {\n const buf = this.outBuffer!;\n \n // Not sure why this is needed, but it is\n buf[0xFFDC] = 0xFF;\n buf[0xFFDD] = 0xFF;\n buf[0xFFDE] = 0;\n buf[0xFFDF] = 0;\n\n // checksum\n let sum = 0;\n for (let i = 0; i < buf.length; i++) sum += buf[i];\n\n // checksum at 0xFFDE\n buf[0xFFDE] = sum & 0xFF;\n buf[0xFFDF] = (sum >> 8) & 0xFF;\n // complement at 0xFFDC\n const comp = ~sum;\n buf[0xFFDC] = comp & 0xFF;\n buf[0xFFDD] = (comp >> 8) & 0xFF;\n }\n\n // private async generatePatch(): Promise<void> {\n // const flips = this._projectRoot.flipsPath;\n // if (!flips) return;\n // if (typeof process === 'undefined' || !process.versions?.node) return;\n // const { spawn } = await import('child_process');\n // const { resolve } = await import('path');\n // this.bpsPath = `${this._projectRoot.baseDir}/${this._projectRoot.name}.bps`;\n // await new Promise<void>((resolvePromise) => {\n // const p = spawn(flips, ['--create', '--bps', `${this._projectRoot.romPath}`, `${this.romPath}`, `${this.bpsPath}`], {\n // stdio: ['ignore', 'pipe', 'pipe']\n // });\n // p.on('close', () => resolvePromise());\n // });\n // }\n\n public writeEntryPoints(asmFiles: ChunkFile[]): void {\n const buf = this.outBuffer!;\n \n // Entry point fixups\n const entryBlocks = (asmFiles\n .filter(x => (x.bank ?? -1) === 0)\n .flatMap(x => x.parts || [])\n .filter(b => !!b.label)) as { label?: string; location: number }[];\n\n for (const ep of this.entryPoints) {\n const match = entryBlocks.find(b => b.label === ep.name);\n if (match) this.writeTransform(ep.location, match.location & 0xFFFF);\n }\n }\n\n public writeTransform(location: number, value: number, size?: number): void {\n const buf = this.outBuffer!;\n\n // Determine size based on value range if not explicitly provided\n if (size === undefined) {\n if (value <= 0xFF) {\n size = 1; // byte\n } else if (value <= 0xFFFF) {\n size = 2; // ushort \n } else if (value <= 0xFFFFFF) {\n size = 3; // uint (3 bytes)\n } else {\n size = 4; // full uint (4 bytes, though C# version only uses 3)\n }\n }\n\n // Write bytes based on size\n switch (size) {\n case 1: // byte\n buf[location] = value & 0xFF;\n break;\n case 2: // ushort\n buf[location] = value & 0xFF;\n buf[location + 1] = (value >> 8) & 0xFF;\n break;\n case 3: // uint (3 bytes as per C# version)\n buf[location] = value & 0xFF;\n buf[location + 1] = (value >> 8) & 0xFF;\n buf[location + 2] = (value >> 16) & 0xFF;\n break;\n case 4: // full uint\n buf[location] = value & 0xFF;\n buf[location + 1] = (value >> 8) & 0xFF;\n buf[location + 2] = (value >> 16) & 0xFF;\n buf[location + 3] = (value >> 24) & 0xFF;\n break;\n default:\n throw new Error(`Invalid size ${size} for writeTransform`);\n }\n }\n\n public async writeFile(file: ChunkFile, _chunkLookup: Map<string, number>): Promise<number> {\n const start = file.location;\n let pos = start;\n const buf = this.outBuffer!;\n\n if (file.rawData) {\n // Write type-specific headers\n const data = file.rawData;\n let remain = file.size;\n let srcPos = 0;\n if (file.type === BinType.Tilemap) {\n remain -= 2;\n buf[pos++] = data[srcPos++];\n buf[pos++] = data[srcPos++];\n } else if (file.type === BinType.Meta17) {\n remain -= 4;\n for (let i = 0; i < 4; i++) buf[pos++] = data[srcPos++];\n } else if (file.type === BinType.Sound) {\n remain -= 2;\n buf[pos++] = remain & 0xFF;\n buf[pos++] = (remain >> 8) & 0xFF;\n }\n\n //TODO: in the future perhaps we can compress assets, but for now this is not needed\n\n //Write compression header\n if (file.compressed !== undefined) {\n remain -= 2;\n const inverse = (0 - remain) & 0xFFFF;\n buf[pos++] = inverse & 0xFF;\n buf[pos++] = (inverse >> 8) & 0xFF;\n }\n\n // Copy the rest\n while (remain > 0) {\n buf[pos++] = data[srcPos++];\n remain--;\n }\n } else {\n // Handle assembly parts\n if (file.parts && file.parts.length > 0) {\n // For safety, ensure first block location matches file location when present\n if (file.parts[0].location !== file.location && (file.location || 0) !== 0) {\n throw new Error('Assembly was not based properly');\n }\n \n // Parse assembly parts\n this.parseAssembly(file.parts, _chunkLookup, file.includeLookup!);\n }\n }\n\n return pos - start;\n }\n\n // No address mapping required: layout assigns absolute file offsets\n\n private writeAscii(text: string, pos: number): void {\n const buf = this.outBuffer!;\n for (let i = 0; i < text.length; i++) buf[pos + i] = text.charCodeAt(i) & 0xFF;\n }\n\n /**\n * Parse assembly blocks and write binary data to output buffer\n * Converted from ext/GaiaLib/Rom/Rebuild/RomWriter.cs ParseAssembly method\n */\n private parseAssembly(\n blocks: AsmBlock[], \n chunkLookup: Map<string, number>, \n includeLookup: Map<string, AsmBlock>\n ): void {\n if (!blocks) {\n throw new Error('Assembly has not been parsed');\n }\n\n const buf = this.outBuffer!;\n\n let bix = 0;\n\n for (const block of blocks) {\n let oldPos: number | null = null;\n let position = block.location; // Always start at block's absolute location\n \n // Note: C# version had position management logic, but we always use block.location\n\n const objList = block.objList;\n let oix = 0;\n let opos = 0;\n\n // Process each object in the block's object list\n const processObject = (obj: unknown, parentOp?: Op): void => {\n let currentObj = obj;\n\n while (true) { // Top: label equivalent\n if (Array.isArray(currentObj)) {\n for (const obj of currentObj) {\n processObject(obj, parentOp);\n }\n break;\n } else if (this.isTableEntry(currentObj)) {\n currentObj = (currentObj as TableEntry).object;\n continue;\n } else if (currentObj instanceof Op) {\n const op = currentObj as Op;\n buf[position++] = op.code & 0xFF;\n opos += op.size;\n\n for (const operand of op.operands) {\n processObject(operand, op);\n }\n break;\n } else if (currentObj instanceof Uint8Array) {\n const arr = currentObj as Uint8Array;\n for (let i = 0; i < arr.length; i++) {\n buf[position + i] = arr[i];\n }\n position += arr.length;\n opos += arr.length;\n break;\n } else if (typeof currentObj === 'string') {\n const str = currentObj as string;\n let label = str;\n\n let ix = 0;\n while (ix < label.length && RomProcessingConstants.ADDRESS_SPACE.includes(label[ix])) {\n ix++;\n }\n\n if (ix > 0) {\n label = label.substring(ix);\n }\n\n let loc: number;\n const isRelative = parentOp && \n (parentOp.mode === 'PCRelative' || \n parentOp.mode === 'PCRelativeLong');\n\n const operatorIdx = this.indexOfAny(label, RomProcessingConstants.OPERATORS);\n let offset: number | null = null;\n let useMarker = false;\n\n if (operatorIdx > 0) {\n if (label[operatorIdx + 1] === 'M') {\n useMarker = true;\n } else {\n offset = parseInt(label.substring(operatorIdx + 1), 16);\n if (label[operatorIdx] === '-') {\n offset = -offset;\n }\n }\n label = label.substring(0, operatorIdx);\n }\n\n // Search local labels first\n const labelUpper = label.toUpperCase();\n let target: AsmBlock | undefined;\n\n if (includeLookup.has(labelUpper)) {\n target = includeLookup.get(labelUpper);\n loc = target!.location;\n } else if (chunkLookup.has(labelUpper)) {\n loc = chunkLookup.get(labelUpper)!;\n } else {\n // Handle direct hex values\n if (label.startsWith('#')) {\n label = label.substring(1);\n }\n if (label.startsWith('$')) {\n label = label.substring(1);\n }\n\n if (isRelative && label.length > 4) {\n const off = parseInt(label, 16) - (block.location + opos);\n currentObj = parentOp?.size === 2 ? (off & 0xFF) : (off & 0xFFFF);\n continue; // goto Top\n } else {\n let num: number;\n switch (label.length) {\n case 1:\n case 2:\n currentObj = new Byte(parseInt(label, 16));\n continue;\n case 3:\n case 4:\n currentObj = new Word(parseInt(label, 16));\n continue;\n case 5:\n case 6:\n currentObj = new Long(parseInt(label, 16));\n continue;\n default:\n throw new Error(`Invalid operand '${label}'`);\n }\n }\n }\n\n let type = Address.typeFromCode(str[0]);\n if (type === AddressType.Unknown) {\n type = parentOp?.size === 4 ? AddressType.Address\n : parentOp?.size === 2 ? AddressType.Unknown : AddressType.Offset;\n }\n\n if (isRelative) {\n loc -= block.location + opos;\n if (type === AddressType.Unknown && !(loc < 0x80 || loc >= 0x3FFF80)) {\n throw new Error('Relative out of range');\n }\n }\n\n if (offset !== null) {\n loc += offset;\n } else if (useMarker && target) {\n let markerOffset = 0;\n for (const part of target.objList) {\n if (this.isStringMarker(part)) {\n loc += markerOffset;\n break;\n } else {\n markerOffset += RomProcessingConstants.getSize(part);\n }\n }\n }\n\n switch (type) {\n case AddressType.Offset:\n currentObj = new Word(loc);\n continue;\n case AddressType.Bank:\n currentObj = new Byte(((loc >> 16) | ((loc & 0xFFFF) >= 0x8000 ? 0x80 : 0xC0)));\n continue;\n case AddressType.WBank:\n currentObj = new Word(((loc >> 16) | ((loc & 0xFFFF) >= 0x8000 ? 0x80 : 0xC0)));\n continue;\n case AddressType.Address:\n currentObj = new Long(loc | ((loc & 0xFFFF) >= 0x8000 ? 0x800000 : 0xC00000));\n continue;\n default:\n currentObj = new Byte(loc);\n continue;\n }\n \n } else if (currentObj instanceof TypedNumber) {\n let value = currentObj.value;\n for (let i = 0; i < currentObj.size; i++) {\n buf[position++] = value & 0xFF;\n value >>= 8;\n }\n break;\n } else if (typeof currentObj === 'number') {\n const num = currentObj as number;\n const size = parentOp?.size ?? 0;\n \n if (num <= 0xFF && size <= 2) {\n // byte\n buf[position] = num & 0xFF;\n position++;\n } else if (num <= 0xFFFF && size <= 3) {\n // ushort\n buf[position] = num & 0xFF;\n buf[position + 1] = (num >> 8) & 0xFF;\n position += 2;\n } else if (num <= 0xFFFFFF && size <= 4) {\n // 3-byte\n buf[position] = num & 0xFF;\n buf[position + 1] = (num >> 8) & 0xFF;\n buf[position + 2] = (num >> 16) & 0xFF;\n position += 3;\n } else {\n // 4-byte\n buf[position] = num & 0xFF;\n buf[position + 1] = (num >> 8) & 0xFF;\n buf[position + 2] = (num >> 16) & 0xFF;\n buf[position + 3] = (num >> 24) & 0xFF;\n position += 4;\n }\n break;\n } else if (this.isStringMarker(currentObj)) {\n // StringMarker - no operation needed\n break;\n } else {\n throw new Error(`Unable to process '${currentObj}'`);\n }\n }\n };\n\n for (const obj of objList) {\n oix++;\n processObject(obj);\n }\n\n // Position management no longer needed since we use absolute locations\n\n bix++;\n }\n }\n\n /**\n * Helper method to find index of any character from an array in a string\n */\n private indexOfAny(str: string, chars: string[]): number {\n for (let i = 0; i < str.length; i++) {\n if (chars.includes(str[i])) {\n return i;\n }\n }\n return -1;\n }\n\n /**\n * Helper method to check if an object is a StringMarker\n */\n private isStringMarker(obj: unknown): obj is StringMarker {\n return typeof obj === 'object' && obj !== null && 'offset' in obj;\n }\n\n private isTableEntry(obj: unknown): obj is TableEntry {\n return typeof obj === 'object' && obj !== null && 'location' in obj && 'object' in obj;\n }\n}\n\n\n","import { DbRoot, DbStringCommand, DbStringType } from '@gaialabs/shared';\r\nimport { MemberType } from '@gaialabs/shared';\r\nimport { RomProcessingConstants } from '@gaialabs/shared';\r\nimport { StringMarker } from '@gaialabs/shared';\r\nimport type { AssemblerContext } from './assembler-context';\r\n\r\n/**\r\n * String processor for assembly parsing\r\n * Converted from GaiaLib/Rom/Rebuild/StringProcessor.cs\r\n */\r\nexport class StringProcessor {\r\n private readonly memBuffer: number[] = [];\r\n private readonly context: AssemblerContext;\r\n private readonly root: DbRoot;\r\n\r\n constructor(context: AssemblerContext) {\r\n this.context = context;\r\n this.root = context.root;\r\n }\r\n\r\n public dispose(): void {\r\n // TypeScript/JavaScript doesn't need explicit disposal\r\n this.memBuffer.length = 0;\r\n }\r\n\r\n public consumeString(): void {\r\n let str: string | null = null;\r\n\r\n // Get character code of string type\r\n const typeChar = this.context.lineBuffer[0];\r\n\r\n // Find last index of character code\r\n const endIx = this.context.lineBuffer.indexOf(typeChar, 1);\r\n if (endIx >= 0) {\r\n // Take the line up until the type code\r\n str = this.context.lineBuffer.substring(1, endIx);\r\n // Line takes content after and code\r\n this.context.lineBuffer = this.context.lineBuffer.substring(endIx + 1)\r\n .replace(/^[\\s,\\t]+/, '');\r\n } else {\r\n // Take the remaining line\r\n str = this.context.lineBuffer.substring(1);\r\n this.context.lineBuffer = '';\r\n }\r\n\r\n // Reset memory buffer for new string\r\n this.memBuffer.length = 0;\r\n\r\n const stringType = this.root.stringCharLookup[typeChar];\r\n this.processString(str, stringType);\r\n }\r\n\r\n private flushBuffer(stringType: DbStringType, wrap: boolean = false): void {\r\n const size = this.memBuffer.length;\r\n if (size > 0) {\r\n const buffer = new Uint8Array(this.memBuffer);\r\n this.context.currentBlock!.objList.push(buffer);\r\n this.context.currentBlock!.size += size;\r\n this.memBuffer.length = 0;\r\n }\r\n }\r\n\r\n private processString(str: string, stringType: DbStringType): void {\r\n const dict = stringType.commands;\r\n const charMap = stringType.characterMap;\r\n const shift = this.getShiftUp(stringType.shiftType);\r\n let lastCmd: DbStringCommand | null = null;\r\n\r\n for (let x = 0; x < str.length; x++) {\r\n const c = str[x];\r\n if (c === '[') {\r\n const endIx = str.indexOf(']', x + 1);\r\n const splitChars = [':', ',', ' '];\r\n const parts = str.substring(x + 1, endIx)\r\n .split(new RegExp(`[${splitChars.join('')}]`))\r\n .filter(p => p.length > 0);\r\n\r\n x = endIx;\r\n\r\n // Marker\r\n if (parts.length === 0) {\r\n this.flushBuffer(stringType, true);\r\n this.context.currentBlock!.objList.push({\r\n offset: this.context.currentBlock!.size\r\n } as StringMarker);\r\n continue;\r\n }\r\n\r\n const cmd = Object.values(dict).find(x => x.value === parts[0]);\r\n if (cmd) {\r\n lastCmd = cmd;\r\n this.memBuffer.push(cmd.key);\r\n this.processStringCommand(cmd, stringType, parts);\r\n continue;\r\n }\r\n }\r\n\r\n lastCmd = null;\r\n\r\n // Process extra string layers\r\n if (this.applyLayers(c, stringType)) {\r\n continue;\r\n }\r\n }\r\n\r\n // Terminate string\r\n if (lastCmd === null || !lastCmd.halt) {\r\n this.memBuffer.push(stringType.terminator);\r\n }\r\n\r\n this.flushBuffer(stringType, true);\r\n }\r\n\r\n private applyLayers(c: string, stringType: DbStringType): boolean {\r\n if (this.applyMap(c, stringType.characterMap, this.getShiftUp(stringType.shiftType))) {\r\n return true;\r\n }\r\n\r\n if (stringType.layers) {\r\n for (const layer of stringType.layers) {\r\n if (this.applyMap(c, layer.map, x => x + layer.base)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private applyMap(c: string, map: string[], shift: (x: number) => number): boolean {\r\n for (let i = 0, len = map.length; i < len; i++) {\r\n const v = map[i];\r\n if (v != null && c === v[0]) {\r\n this.memBuffer.push(shift(i));\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private processStringCommand(cmd: DbStringCommand, stringType: DbStringType, parts: string[]): void {\r\n const hasPointer = cmd.types.includes(MemberType.Address) || cmd.types.includes(MemberType.Offset);\r\n if (hasPointer) {\r\n this.flushBuffer(stringType, true);\r\n }\r\n\r\n for (let y = 0, pix = 1; y < cmd.types.length; y++, pix++) {\r\n switch (cmd.types[y]) {\r\n case MemberType.Byte:\r\n this.memBuffer.push(parseInt(parts[pix], 16));\r\n break;\r\n\r\n case MemberType.Word:\r\n const us = parseInt(parts[pix], 16);\r\n this.memBuffer.push(us & 0xFF);\r\n this.memBuffer.push((us >> 8) & 0xFF);\r\n break;\r\n\r\n case MemberType.Binary:\r\n while (pix < parts.length) {\r\n const ch = parseInt(parts[pix], 16);\r\n this.memBuffer.push(ch);\r\n pix++;\r\n }\r\n if (cmd.delimiter !== undefined) {\r\n this.memBuffer.push(cmd.delimiter);\r\n }\r\n break;\r\n\r\n case MemberType.Offset:\r\n case MemberType.Address:\r\n // Have to keep these for later since we don't have lookups yet\r\n this.flushBuffer(stringType, false);\r\n this.context.currentBlock!.objList.push(parts[pix]);\r\n this.context.currentBlock!.size += cmd.types[y] === MemberType.Offset ? 2 : 3;\r\n break;\r\n }\r\n }\r\n\r\n if (hasPointer) {\r\n this.flushBuffer(stringType, false);\r\n }\r\n }\r\n\r\n private getShiftUp(shiftType?: string): (x: number) => number {\r\n switch (shiftType) {\r\n case 'h2':\r\n return (x: number) => (((x & 0x70) << 1) | (x & 0x0F));\r\n case 'wh2':\r\n return (x: number) => (((x & 0x38) << 1) | (x & 0x07));\r\n default:\r\n return (x: number) => x;\r\n }\r\n }\r\n}\r\n","/**\r\n * A map that sorts keys by length in descending order, then alphabetically\r\n * This is used for tag replacement where longer tags should be replaced first\r\n * to avoid conflicts (e.g., \"ABCD\" should be replaced before \"ABC\")\r\n */\r\nexport class SortedMap<V> {\r\n private map = new Map<string, V>();\r\n private _keys: string[] = [];\r\n\r\n public get size(): number {\r\n return this.map.size;\r\n }\r\n\r\n public set(key: string, value: V): this {\r\n if (!this.map.has(key)) {\r\n this._keys.push(key);\r\n this.sortKeys();\r\n }\r\n this.map.set(key, value);\r\n return this;\r\n }\r\n\r\n public get(key: string): V | undefined {\r\n return this.map.get(key);\r\n }\r\n\r\n public has(key: string): boolean {\r\n return this.map.has(key);\r\n }\r\n\r\n public delete(key: string): boolean {\r\n const result = this.map.delete(key);\r\n if (result) {\r\n const index = this._keys.indexOf(key);\r\n if (index >= 0) {\r\n this._keys.splice(index, 1);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n public clear(): void {\r\n this.map.clear();\r\n this._keys.length = 0;\r\n }\r\n\r\n public keys(): string[] {\r\n return [...this._keys];\r\n }\r\n\r\n public values(): V[] {\r\n return this._keys.map(key => this.map.get(key)!);\r\n }\r\n\r\n public entries(): [string, V][] {\r\n return this._keys.map(key => [key, this.map.get(key)!]);\r\n }\r\n\r\n public *[Symbol.iterator](): Generator<[string, V], void, unknown> {\r\n for (const key of this._keys) {\r\n yield [key, this.map.get(key)!];\r\n }\r\n }\r\n\r\n private sortKeys(): void {\r\n this._keys.sort((a, b) => {\r\n // Sort by length descending first\r\n if (a.length !== b.length) {\r\n return b.length - a.length;\r\n }\r\n // Then alphabetically\r\n return a.localeCompare(b);\r\n });\r\n }\r\n}\r\n","import { DbRoot, DbStruct, RomProcessingConstants } from '@gaialabs/shared';\r\nimport { AsmBlock } from '@gaialabs/shared';\r\nimport { Op, OpCode, Byte } from '@gaialabs/shared';\r\nimport type { AssemblerContext } from './assembler-context';\r\nimport { AsmReader } from '../extraction/asm';\r\n\r\n/**\r\n * Assembler state machine for processing assembly text\r\n * Converted from GaiaLib/Rom/Rebuild/AssemblerState.cs\r\n */\r\nexport class AssemblerState {\r\n private readonly dbStruct: DbStruct | null;\r\n private readonly parentStruct: DbStruct | null;\r\n private readonly root: DbRoot;\r\n private readonly discriminator: number | null;\r\n private delimiter: number | null;\r\n private memberOffset: number;\r\n private dataOffset: number;\r\n private readonly memberTypes: string[] | null;\r\n private currentType: string | null;\r\n private readonly context: AssemblerContext;\r\n\r\n constructor(context: AssemblerContext, structType: string | null = null, saveDelimiter: boolean = false) {\r\n this.context = context;\r\n this.root = context.root;\r\n\r\n this.dbStruct = structType === null ? null\r\n : Object.values(this.root.structs).find(x =>\r\n x.name.toLowerCase() === structType.toLowerCase()\r\n ) || null;\r\n\r\n this.parentStruct = !this.dbStruct || !this.dbStruct.parent ? null\r\n : Object.values(this.root.structs).find(x =>\r\n x.name.toLowerCase() === this.dbStruct!.parent!.toLowerCase()\r\n ) || null;\r\n\r\n this.discriminator = this.parentStruct?.discriminator ?? null;\r\n this.delimiter = this.dbStruct?.delimiter || null;\r\n this.memberOffset = 0;\r\n this.dataOffset = 0;\r\n this.memberTypes = this.dbStruct?.types || null;\r\n this.currentType = this.memberTypes?.[this.memberOffset] || null;\r\n\r\n if (saveDelimiter) {\r\n this.context.lastDelimiter = this.dbStruct?.delimiter ?? this.parentStruct?.delimiter ?? null;\r\n }\r\n }\r\n\r\n private checkDisc(): void {\r\n if (this.discriminator === this.dataOffset) {\r\n // Discriminator is always 1 byte\r\n this.context.currentBlock!.objList.push(this.dbStruct!.discriminator!);\r\n this.context.currentBlock!.size += 1;\r\n this.dataOffset += 1;\r\n }\r\n }\r\n\r\n private advancePart(): void {\r\n if (this.currentType != null && this.discriminator != null) {\r\n this.dataOffset += RomProcessingConstants.getSize(this.currentType);\r\n }\r\n\r\n if (this.memberTypes != null && this.memberOffset + 1 < this.memberTypes.length) {\r\n this.currentType = this.memberTypes[++this.memberOffset];\r\n }\r\n }\r\n\r\n private processOrigin(): void {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(3).replace(/^[\\s,\\t]+/, '');\r\n if (this.context.lineBuffer.startsWith('$')) {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1);\r\n }\r\n\r\n let hex: string;\r\n const endIx = this.context.lineBuffer.search(/[\\s,\\t]/);\r\n if (endIx >= 0) {\r\n hex = this.context.lineBuffer.substring(0, endIx);\r\n this.context.lineBuffer = this.context.lineBuffer.substring(endIx + 1).replace(/^[\\s,\\t]+/, '');\r\n } else {\r\n hex = this.context.lineBuffer;\r\n this.context.lineBuffer = '';\r\n }\r\n\r\n const location = parseInt(hex, 16);\r\n\r\n this.context.blocks.push(this.context.currentBlock = new AsmBlock(location));\r\n this.context.blockIndex++;\r\n }\r\n\r\n private static doMath(operand: string): string {\r\n const ix = operand.search(/[-+]/);\r\n if (ix >= 0) {\r\n const op = operand[ix];\r\n\r\n const vix = operand.lastIndexOf('$', ix) + 1;\r\n\r\n const valueStr = operand.substring(vix, ix);\r\n if (valueStr.match(/^[a-fA-F0-9]+$/)) {\r\n const value = parseInt(valueStr, 16);\r\n \r\n let endIx = operand.substring(ix + 1).search(RomProcessingConstants.SYMBOL_SPACE_REGEX);\r\n if(endIx < 0) {\r\n endIx = operand.length;\r\n }\r\n \r\n const number = parseInt(operand.substring(ix + 1, endIx), 16);\r\n\r\n let result: number;\r\n if (op === '-') {\r\n result = value - number;\r\n } else {\r\n result = value + number;\r\n }\r\n\r\n const len = (ix - vix) <= 2 ? 2 : (ix - vix) <= 4 ? 4 : 6;\r\n\r\n operand = operand.substring(0, vix) + result.toString(16).toUpperCase().padStart(len, '0') + operand.substring(endIx);\r\n }\r\n }\r\n return operand;\r\n }\r\n\r\n private tryCreateLabel(mnemonic: string, operand?: string): boolean {\r\n // Check that the operand has content\r\n if (!operand || operand.length === 0) {\r\n return false;\r\n }\r\n\r\n const labelChar = operand[0];\r\n\r\n // If our operand starts with a label space character, create a label\r\n if (!RomProcessingConstants.LABEL_SPACE.includes(labelChar)) {\r\n return false;\r\n }\r\n\r\n // Create new block for this label\r\n const newBlock = new AsmBlock(\r\n this.context.currentBlock!.location + this.context.currentBlock!.size,\r\n 0,\r\n this.root.stringDelimiters.includes(operand[0]),\r\n mnemonic\r\n );\r\n\r\n // Add block to assembler\r\n this.context.blocks.push(newBlock);\r\n\r\n // Set as current\r\n this.context.currentBlock = newBlock;\r\n\r\n // Increment current block index\r\n this.context.blockIndex++;\r\n\r\n // Remove label marker\r\n if (labelChar === ':') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1);\r\n } else if (labelChar === '[' || labelChar === '{') {\r\n this.context.lineBuffer = operand.substring(1).replace(/^[\\s,\\t]+/, '');\r\n\r\n // Process the next \r\n const state = new AssemblerState(this.context, this.currentType);\r\n state.processText(labelChar);\r\n\r\n // Advance to next part\r\n this.advancePart();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public processText(openTag?: string): void {\r\n this.checkDisc();\r\n\r\n while (!this.context.eof) {\r\n if (!this.context.getLine()) {\r\n return;\r\n }\r\n\r\n // if (this.context.lineBuffer.startsWith('DB')) {\r\n // const hex = this.context.lineBuffer.substring(2).replace(HEX_REGEX, '');\r\n // const data = this.hexStringToBytes(hex);\r\n // this.context.currentBlock!.objList.push(data);\r\n // this.context.currentBlock!.size += data.length;\r\n // this.context.lineBuffer = '';\r\n // continue;\r\n // }\r\n\r\n let mnemonic: string | null = null;\r\n let operand: string | null = null;\r\n let operand2: string | null = null;\r\n\r\n while (this.context.lineBuffer.length > 0) {\r\n const lineSymbol = this.context.lineBuffer[0];\r\n\r\n // Process strings\r\n if (this.root.stringDelimiters.includes(lineSymbol)) {\r\n this.context.stringProcessor.consumeString();\r\n this.advancePart();\r\n continue;\r\n }\r\n\r\n // Process raw data\r\n if (RomProcessingConstants.ADDRESS_SPACE.includes(lineSymbol)) {\r\n this.context.processRawData();\r\n\r\n if (openTag === '[') {\r\n this.context.lastDelimiter = null;\r\n }\r\n\r\n this.advancePart();\r\n continue;\r\n }\r\n\r\n if (lineSymbol === '>') {\r\n if (openTag === '<') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n this.checkDisc();\r\n }\r\n return;\r\n }\r\n\r\n // Array Close\r\n if (lineSymbol === ']') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n\r\n this.delimiter = this.delimiter ?? this.context.lastDelimiter;\r\n\r\n // Apply delimiter if set\r\n if (this.delimiter != null) {\r\n if (this.delimiter >= 0x100) {\r\n // When over the word boundary use two bytes\r\n this.context.currentBlock!.objList.push(this.delimiter);\r\n this.context.currentBlock!.size += 2;\r\n } else {\r\n // Otherwise default to single byte\r\n this.context.currentBlock!.objList.push(this.delimiter);\r\n this.context.currentBlock!.size += 1;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Block close\r\n if (lineSymbol === '}') {\r\n if (openTag === '{') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n }\r\n return;\r\n }\r\n\r\n // Array Open\r\n if (lineSymbol === '[') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n const state = new AssemblerState(this.context, this.currentType);\r\n state.processText('[');\r\n this.advancePart();\r\n continue;\r\n }\r\n\r\n // Process origin tags\r\n if (this.context.lineBuffer.startsWith('ORG')) {\r\n this.processOrigin();\r\n continue;\r\n }\r\n\r\n // Separate instructions into mnemonic and operand parts\r\n const symbolIndex = this.context.lineBuffer.search(RomProcessingConstants.SYMBOL_SPACE_REGEX);\r\n if (symbolIndex > 0) {\r\n mnemonic = this.context.lineBuffer.substring(0, symbolIndex);\r\n operand = this.context.lineBuffer.substring(symbolIndex).replace(/^[, \\t]+/, '');\r\n\r\n // Process object tags\r\n if (operand && operand.startsWith('<')) {\r\n this.context.lineBuffer = operand.substring(1).replace(/^[, \\t]+/, '');\r\n const state = new AssemblerState(this.context, mnemonic, openTag === '[' && this.currentType == null);\r\n state.processText('<');\r\n mnemonic = null;\r\n continue;\r\n }\r\n \r\n this.context.lineBuffer = operand;\r\n } else {\r\n mnemonic = this.context.lineBuffer;\r\n this.context.lineBuffer = '';\r\n }\r\n\r\n break;\r\n }\r\n\r\n if (mnemonic && mnemonic.length > 0) {\r\n // Get list of opcodes from mnemonic\r\n const codes = this.root.opLookup[mnemonic.toUpperCase()];\r\n\r\n // If no codes were found, try to create a label\r\n if (!codes || codes.length === 0) {\r\n if (this.tryCreateLabel(mnemonic, operand || undefined)) {\r\n continue;\r\n }\r\n\r\n // If label creation fails, throw exception\r\n throw new Error(`Unknown instruction line ${this.context.lineCount}: '${mnemonic}'`);\r\n }\r\n\r\n // Reset current assembler line\r\n this.context.lineBuffer = '';\r\n\r\n // No operand instructions\r\n if (!operand) {\r\n const opCode = codes.find(x => this.root.addrLookup[x.mode].size === 1);\r\n this.context.currentBlock!.objList.push(new Op (opCode, 0, [], 1));\r\n this.context.currentBlock!.size++;\r\n continue;\r\n }\r\n\r\n // Do maths before regex processing\r\n operand = AssemblerState.doMath(operand);\r\n\r\n // COP processing\r\n let opCode: OpCode | null = codes[0];\r\n if (opCode?.mnem === 'COP') {\r\n const parts = operand.split(/[\\s\\t,()[\\]$#]/).filter(p => p.length > 0);\r\n const cmd = parts[0];\r\n\r\n const cop = this.root.copLookup[cmd];\r\n if (!cop) {\r\n throw new Error(`Unknown COP command ${cmd}`);\r\n }\r\n\r\n this.context.currentBlock!.objList.push(new Op(opCode, 0, [new Byte(cop.code), ...parts.slice(1)], cop.size + 2));\r\n\r\n this.context.currentBlock!.size += cop.size + 2;\r\n\r\n continue;\r\n }\r\n\r\n opCode = null;\r\n for (const code of codes) {\r\n // Keep branch operands until all blocks are processed (for labels)\r\n if (code.mode === 'PCRelative' || code.mode === 'PCRelativeLong') {\r\n opCode = code;\r\n break;\r\n }\r\n\r\n // Regex parse operand based on addressing mode\r\n const addrMode = this.root.addrLookup[code.mode]; \r\n const regex = addrMode.parseRegex;\r\n if (regex) {\r\n const match = new RegExp(regex).exec(operand);\r\n if (match) {\r\n // Keep the current code\r\n opCode = code;\r\n\r\n // Operand is the \"first\" matched group\r\n operand = match[1];\r\n\r\n // Support for second operand (MVN/MVP)\r\n if (match.length > 2) {\r\n operand2 = match[2];\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (operand!.startsWith('#')) {\r\n operand = operand!.substring(1);\r\n }\r\n\r\n if (operand!.startsWith('$')) {\r\n operand = operand!.substring(1);\r\n }\r\n\r\n if (opCode == null) {\r\n const addrIx = operand!.search(RomProcessingConstants.ADDRESS_SPACE_REGEX);\r\n if (addrIx && addrIx >= 0) {\r\n const eix = operand!.search(/[\\s\\t,\\])]/);\r\n if (eix && eix >= 0) {\r\n operand = operand!.substring(addrIx, eix);\r\n }\r\n }\r\n\r\n opCode = codes.find(x => x.mode === 'Immediate')\r\n ?? codes.find(x => x.mode === 'AbsoluteLong')\r\n ?? codes.find(x => x.mode === 'Absolute')\r\n ?? null;\r\n\r\n if (opCode == null) {\r\n throw new Error(`Unable to determine mode/code line ${this.context.lineCount}: '${this.context.lineBuffer}'`);\r\n }\r\n }\r\n\r\n const opnd1 = this.context.parseOperand(operand!);\r\n\r\n const addrMode = this.root.addrLookup[opCode.mode];\r\n let size = addrMode.size;\r\n if (size === AsmReader.VARIABLE_SIZE_INDICATOR || opCode.mode === 'Immediate') {\r\n size = operand?.startsWith('^') || operand?.length === 2 ? 2 : 3;\r\n }\r\n\r\n const operands: unknown[] = operand2 != null ? [opnd1, this.context.parseOperand(operand2)] : [opnd1];\r\n\r\n this.context.currentBlock!.objList.push(new Op(opCode, 0, operands, size));\r\n\r\n this.context.currentBlock!.size += size;\r\n }\r\n }\r\n }\r\n\r\n private hexStringToBytes(hex: string): Uint8Array {\r\n const result = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n result[i / 2] = parseInt(hex.substring(i, i + 2), 16);\r\n }\r\n return result;\r\n }\r\n}\r\n","import { DbRoot, RomProcessingConstants, Word, Byte, Long } from '@gaialabs/shared';\r\nimport { AsmBlock } from '@gaialabs/shared';\r\nimport { StringProcessor } from './string-processor';\r\nimport { SortedMap } from './sorted-map';\r\nimport { AssemblerState } from './assembler-state';\r\nimport type { AssemblerContext } from './assembler-context';\r\n\r\n/**\r\n * Main assembler class for parsing assembly files\r\n * Converted from GaiaLib/Rom/Rebuild/Assembler.cs\r\n */\r\nexport class Assembler implements AssemblerContext {\r\n public readonly root: DbRoot;\r\n private readonly lines: string[];\r\n private currentLineIndex: number = 0;\r\n public readonly stringProcessor: StringProcessor;\r\n\r\n public lineBuffer: string = '';\r\n public includes = new Set<string>();\r\n public blocks: AsmBlock[] = [];\r\n public tags = new SortedMap<string | null>();\r\n public currentBlock: AsmBlock | null = null;\r\n public lineCount: number = 0;\r\n public blockIndex: number = 0;\r\n public lastDelimiter: number | null = null;\r\n public reqBank: number | null = null;\r\n public eof: boolean = false;\r\n\r\n constructor(dbRoot: DbRoot, textData: string) {\r\n this.root = dbRoot;\r\n // Handle both Windows (\\r\\n) and Unix (\\n) line endings\r\n this.lines = textData.split(/\\r?\\n/);\r\n this.stringProcessor = new StringProcessor(this);\r\n }\r\n\r\n public dispose(): void {\r\n this.stringProcessor.dispose();\r\n }\r\n\r\n public parseAssembly(): { blocks: AsmBlock[], includes: Set<string>, reqBank: number | null } {\r\n // Initialize root block (no label, location 0) and set as current\r\n this.blocks.push(this.currentBlock = new AsmBlock());\r\n\r\n // Initialize state machine and process text\r\n const state = new AssemblerState(this);\r\n state.processText();\r\n\r\n return { \r\n blocks: this.blocks, \r\n includes: this.includes, \r\n reqBank: this.reqBank \r\n };\r\n }\r\n\r\n public getLine(): boolean {\r\n // This can happen\r\n if (this.eof) {\r\n return false;\r\n }\r\n\r\n // Keep processing what we already have\r\n if (this.lineBuffer.length > 0) {\r\n return true;\r\n }\r\n\r\n let rawLine: string | null = null;\r\n \r\n while (true) {\r\n // Read next line\r\n if (this.currentLineIndex >= this.lines.length) {\r\n if (this.lineBuffer.length === 0) {\r\n this.eof = true;\r\n return false;\r\n } else {\r\n rawLine = '';\r\n }\r\n } else {\r\n rawLine = this.lines[this.currentLineIndex++];\r\n this.lineBuffer += rawLine;\r\n }\r\n\r\n this.lineCount++;\r\n\r\n // Ignore comments\r\n this.trimComments('--');\r\n this.trimComments(';');\r\n this.trimComments('//');\r\n\r\n // Trim\r\n this.lineBuffer = this.lineBuffer.replace(RomProcessingConstants.COMMA_SPACE_TRIM_REGEX, '');\r\n\r\n // This can happen\r\n if (this.lineBuffer.length === 0) {\r\n continue;\r\n }\r\n\r\n // Process hard line continuations\r\n if (this.lineBuffer.endsWith('\\\\')) {\r\n this.lineBuffer = this.lineBuffer.slice(0, -1);\r\n continue;\r\n }\r\n\r\n // Process directives\r\n if (this.lineBuffer[0] === '?') {\r\n this.processDirectives();\r\n this.lineBuffer = '';\r\n continue;\r\n }\r\n\r\n // Process tags\r\n if (this.lineBuffer[0] === '!') {\r\n this.processTags();\r\n this.lineBuffer = '';\r\n continue;\r\n }\r\n\r\n this.resolveTags();\r\n\r\n return true;\r\n }\r\n }\r\n\r\n private trimComments(sequence: string): void {\r\n // Look for the first instance of the comment sequence\r\n const index = this.lineBuffer.indexOf(sequence);\r\n if (index >= 0) {\r\n // Make sure it's not inside a string\r\n const strDelimRegex = new RegExp(`[${this.root.stringDelimiters.map(c => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('')}]`);\r\n const strIndex = this.lineBuffer.search(strDelimRegex);\r\n \r\n // This works with line continuations because the string ending will not be on this line yet\r\n // If no string, string starts after comment, or last delimiter is before comment, trim it\r\n if (strIndex < 0 || \r\n strIndex > index || \r\n this.lineBuffer.lastIndexOf(this.lineBuffer[strIndex] || '') < index) {\r\n this.lineBuffer = this.lineBuffer.substring(0, index);\r\n }\r\n }\r\n }\r\n\r\n private processDirectives(): void {\r\n // Find end of directive\r\n let endIx = this.lineBuffer.search(RomProcessingConstants.COMMA_SPACE_REGEX);\r\n\r\n // Default to line length if no end characters\r\n if (endIx < 0) {\r\n endIx = this.lineBuffer.length;\r\n }\r\n\r\n const value = this.lineBuffer.substring(endIx).replace(/^[\\s,\\t]+/, '');\r\n\r\n switch (this.lineBuffer.substring(1, endIx).toUpperCase()) {\r\n // This is taken care of by the loader\r\n case 'BANK':\r\n this.reqBank = parseInt(value, 16);\r\n break;\r\n\r\n case 'INCLUDE':\r\n if (value.length > 0) {\r\n this.includes.add(value.toUpperCase().replace(/'/g, ''));\r\n }\r\n break;\r\n }\r\n }\r\n\r\n private processTags(): void {\r\n // Remove the '!' prefix and trim leading spaces\r\n this.lineBuffer = this.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n\r\n // Process as many pairs as we can\r\n while (this.lineBuffer.length > 0) {\r\n // Default name and value\r\n let name = this.lineBuffer;\r\n let value: string | null = null;\r\n\r\n // Find first index of comma/space/tab\r\n let endIx = this.lineBuffer.search(/[\\s,\\t]/);\r\n\r\n if (endIx >= 0) {\r\n // Split into name and value\r\n name = this.lineBuffer.substring(0, endIx);\r\n value = this.lineBuffer.substring(endIx + 1).replace(/^[\\s,\\t]+/, '');\r\n\r\n // Find next index of comma/space/tab inside value\r\n const nextIx = value.search(/[\\s,\\t]/);\r\n if (nextIx >= 0) {\r\n // Line buffer then take the remainder\r\n this.lineBuffer = value.substring(nextIx + 1).replace(/^[\\s,\\t]+/, '');\r\n // Value takes up to next index\r\n value = value.substring(0, nextIx);\r\n } else {\r\n this.lineBuffer = ''; // No more pairs, clear buffer\r\n }\r\n } else {\r\n this.lineBuffer = ''; // Take all as name, clear buffer\r\n }\r\n\r\n // Assign name/value pair to tags\r\n this.tags.set(name, value);\r\n }\r\n }\r\n\r\n private resolveTags(): void {\r\n // Tags are sorted by length descending so longer tags are replaced first (avoids minor conflicts)\r\n for (const [key, value] of this.tags) {\r\n let ix: number;\r\n while ((ix = this.lineBuffer.toLowerCase().indexOf(key.toLowerCase())) >= 0) {\r\n this.lineBuffer = this.lineBuffer.substring(0, ix) + (value || '') + \r\n this.lineBuffer.substring(ix + key.length);\r\n }\r\n }\r\n }\r\n\r\n public parseOperand(opnd: string): unknown {\r\n if (!opnd) return null;\r\n\r\n if(opnd.match(/^[a-fA-F0-9]{2,6}$/)){\r\n switch(opnd.length){\r\n case 2:\r\n return new Byte(parseInt(opnd, 16));\r\n case 4:\r\n return new Word(parseInt(opnd, 16));\r\n case 6:\r\n return new Long(parseInt(opnd, 16));\r\n }\r\n }\r\n\r\n return opnd;\r\n }\r\n\r\n public processRawData(): void {\r\n let reverse = false;\r\n\r\n // Immediate binary marker\r\n if (this.lineBuffer[0] === '#') {\r\n this.lineBuffer = this.lineBuffer.substring(1);\r\n }\r\n\r\n // Reverse binary marker\r\n if (this.lineBuffer[0] === '$') {\r\n reverse = true;\r\n this.lineBuffer = this.lineBuffer.substring(1);\r\n }\r\n\r\n let hex: string;\r\n const symbolIx = this.lineBuffer.search(RomProcessingConstants.SYMBOL_SPACE_REGEX);\r\n if (symbolIx >= 0) {\r\n hex = this.lineBuffer.substring(0, symbolIx);\r\n this.lineBuffer = this.lineBuffer.substring(symbolIx).replace(/^[, \\t]+/, '');\r\n } else {\r\n hex = this.lineBuffer;\r\n this.lineBuffer = '';\r\n }\r\n\r\n if (hex.length > 0) {\r\n // Keep string values of address markers so they can be resolved later\r\n if (RomProcessingConstants.ADDRESS_SPACE.includes(hex[0])) {\r\n this.currentBlock!.objList.push(hex);\r\n this.currentBlock!.size += RomProcessingConstants.getSize(hex);\r\n } else {\r\n const data = this.hexStringToBytes(hex);\r\n if (data.length === 1) {\r\n this.currentBlock!.objList.push(new Byte(data[0]));\r\n this.currentBlock!.size++;\r\n } else {\r\n if (reverse) {\r\n data.reverse();\r\n }\r\n\r\n // Explicitly change two-byte data into number for easier processing later\r\n if (data.length === 2) {\r\n this.currentBlock!.objList.push(new Word(data[0] | (data[1] << 8)));\r\n this.currentBlock!.size += 2;\r\n } else {\r\n this.currentBlock!.objList.push(data);\r\n this.currentBlock!.size += data.length;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private hexStringToBytes(hex: string): Uint8Array {\r\n const result = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n result[i / 2] = parseInt(hex.substring(i, i + 2), 16);\r\n }\r\n return result;\r\n }\r\n}\r\n","import { ChunkFileUtils, crc32_buffer, DbEntryPoint, summaryFromSupabaseByProject } from '@gaialabs/shared';\r\nimport { DbRootUtils, ChunkFile, BinType, DbRoot } from '@gaialabs/shared';\r\nimport { BlockReader, BlockWriter } from './extraction';\r\nimport { RomLayout, RomProcessor, Assembler, RomWriter } from './rebuild';\r\n\r\nexport class RomGenerator {\r\n //private readonly patchFiles: ChunkFile[] = [];\r\n public readonly projectName?: string;\r\n public crc: number = 0;\r\n public branchId: string = '';\r\n //private chunkFiles: ChunkFile[] = [];\r\n //private asmFiles: ChunkFile[] = [];\r\n public dbRoot: DbRoot = {} as DbRoot;\r\n private sourceData: Uint8Array = new Uint8Array();\r\n\r\n constructor(projectName?: string) {\r\n this.projectName = projectName;\r\n }\r\n\r\n public async initialize(){\r\n var projectData = await summaryFromSupabaseByProject(this.projectName);\r\n this.crc = projectData.baseRomBranch.gameRomBranch.gameRom.crc;\r\n this.branchId = projectData.id;\r\n }\r\n\r\n public async validateAndDownload(sourceData: Uint8Array){\r\n const calc = crc32_buffer(sourceData);\r\n if (calc === this.crc) {\r\n //Initialize database\r\n this.dbRoot = await DbRootUtils.fromSupabaseProject(this.projectName, this.branchId);\r\n this.sourceData = sourceData;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public async generateProject(modules: string[], manualFiles?: ChunkFile[], unshiftManualFiles: boolean = false): Promise<Uint8Array> {\r\n if(!this.dbRoot) throw new Error('Database not initialized');\r\n if(!this.sourceData) throw new Error('Source data not initialized');\r\n\r\n //Initialize chunks\r\n const reader = new BlockReader(this.sourceData, this.dbRoot);\r\n const chunkFiles = reader.analyzeAndResolve();\r\n const asmFiles = chunkFiles.filter(b => b.type === BinType.Assembly);\r\n const patchFiles: ChunkFile[] = [];\r\n\r\n //Convert asm blocks to text\r\n const writer = new BlockWriter(reader);\r\n for(const block of asmFiles) block.textData = writer.generateAsm(block);\r\n \r\n //Apply baserom files\r\n for (const chunkFile of this.dbRoot.baseRomFiles!) this.applyPatchFile(chunkFile, chunkFiles, asmFiles, patchFiles);\r\n\r\n //Apply base project files and collect module files\r\n const moduleLookup = this.applyProjectInit(chunkFiles, asmFiles, patchFiles);\r\n\r\n //Apply manual files (before modules)\r\n if(unshiftManualFiles) {\r\n for(const file of manualFiles ?? []) this.applyPatchFile(file, chunkFiles, asmFiles, patchFiles);\r\n }\r\n\r\n //Apply selected modules\r\n for(const module of modules) {\r\n for(const file of moduleLookup.get(module)!) this.applyPatchFile(file, chunkFiles, asmFiles, patchFiles);\r\n }\r\n\r\n //Apply manual files\r\n if(!unshiftManualFiles) {\r\n for(const file of manualFiles ?? []) this.applyPatchFile(file, chunkFiles, asmFiles, patchFiles);\r\n }\r\n \r\n this.assembleCodeFromText(asmFiles);\r\n\r\n //Apply code patches\r\n RomProcessor.applyPatches(asmFiles, patchFiles);\r\n\r\n //Calculate sizes\r\n for (const asm of chunkFiles) ChunkFileUtils.calculateSize(asm);\r\n\r\n //Assign locations\r\n const layout = new RomLayout(chunkFiles);\r\n layout.organize();\r\n\r\n //Rebase assemblies\r\n for (const file of asmFiles) ChunkFileUtils.rebase(file);\r\n\r\n this.generateAsmIncludeLookups(asmFiles);\r\n\r\n //Generate block lookup\r\n const blockLookup = new Map<string, number>();\r\n for (const f of chunkFiles) blockLookup.set(f.name.toUpperCase(), f.location);\r\n\r\n const outRom = await this.writeRom(blockLookup, this.dbRoot.entryPoints, chunkFiles, asmFiles);\r\n return outRom;\r\n }\r\n\r\n private applyProjectInit(chunkFiles: ChunkFile[], asmFiles: ChunkFile[], patchFiles: ChunkFile[]){\r\n const moduleLookup: Map<string, ChunkFile[]> = new Map();\r\n\r\n //Run a single pass to collect all the module files, and apply base files\r\n for (const chunkFile of this.dbRoot.projectFiles!) {\r\n // Parse the patch file with the assembler\r\n console.log(`Processing patch: ${chunkFile.name}`);\r\n\r\n //ChunkFile.group is the module name\r\n if(chunkFile.group){\r\n let modArray: ChunkFile[];\r\n if(!moduleLookup.has(chunkFile.group)) moduleLookup.set(chunkFile.group, modArray = []);\r\n else modArray = moduleLookup.get(chunkFile.group)!;\r\n //Add chunk file to module array\r\n modArray!.push(chunkFile);\r\n } else this.applyPatchFile(chunkFile, chunkFiles, asmFiles, patchFiles); //If chunk file is not part of a group, apply it now\r\n }\r\n\r\n return moduleLookup;\r\n }\r\n\r\n //Assemble code from script text\r\n private assembleCodeFromText(asmFiles: ChunkFile[]){\r\n for(const block of asmFiles) {\r\n const assembler = new Assembler(this.dbRoot, block.textData!);\r\n const { blocks, includes, reqBank } = assembler.parseAssembly();\r\n block.parts = blocks;\r\n block.includes = includes;\r\n block.bank = reqBank ?? undefined;\r\n }\r\n }\r\n\r\n // Build include lookup map per asm file\r\n private generateAsmIncludeLookups(asmFiles: ChunkFile[]){\r\n for (const f of asmFiles) {\r\n const includeBlocks = asmFiles\r\n .filter(x => f.includes?.has(x.name.toUpperCase()))\r\n .flatMap(x => x.parts!)\r\n .filter(b => !!b.label);\r\n\r\n f.includeLookup = new Map();\r\n\r\n for (const b of includeBlocks) {\r\n if (b.label) f.includeLookup.set(b.label.toUpperCase(), b);\r\n }\r\n\r\n for (const b of (f.parts || []).filter(x => !!x.label)) {\r\n if (b.label) f.includeLookup.set(b.label.toUpperCase(), b);\r\n }\r\n }\r\n }\r\n\r\n public applyPatchFile(chunkFile: ChunkFile, chunkFiles: ChunkFile[], asmFiles: ChunkFile[], patchFiles: ChunkFile[]): void {\r\n console.log(`Processing patch: ${chunkFile.name}`);\r\n const existing = chunkFiles.find(x => x.name === chunkFile.name);\r\n\r\n if(chunkFile.type === BinType.Patch || chunkFile.type === BinType.Assembly) {\r\n if(existing){\r\n existing.textData = chunkFile.textData;\r\n } else {\r\n if(chunkFile.type === BinType.Patch) {\r\n patchFiles.push(chunkFile);\r\n }\r\n asmFiles.push(chunkFile);\r\n chunkFiles.push(chunkFile);\r\n }\r\n } else {\r\n if(existing){\r\n existing.rawData = chunkFile.rawData;\r\n existing.size = chunkFile.size;\r\n } else {\r\n chunkFiles.push(chunkFile);\r\n }\r\n }\r\n }\r\n\r\n private async writeRom(blockLookup: Map<string, number>, entryPoints: DbEntryPoint[], chunkFiles: ChunkFile[], asmFiles: ChunkFile[]){\r\n //Create rom writer\r\n const romWriter = new RomWriter(entryPoints, \"GAIALABS\", \"01JG \");\r\n\r\n // Write all files\r\n for (const file of chunkFiles.sort((a, b) => a.location - b.location)) await romWriter.writeFile(file, blockLookup);\r\n\r\n //Write header\r\n romWriter.writeHeader();\r\n\r\n //Write entry points\r\n romWriter.writeEntryPoints(asmFiles);\r\n\r\n //Write checksum\r\n romWriter.writeChecksum();\r\n\r\n return romWriter.outBuffer;\r\n }\r\n}","/**\r\n * Represents a single frame in a sprite animation sequence\r\n */\r\nexport class SpriteFrame {\r\n public duration: number;\r\n public groupIndex: number;\r\n \r\n /**\r\n * Internal offset to the group data (not serialized)\r\n */\r\n public groupOffset: number;\r\n\r\n constructor(duration: number = 0, groupIndex: number = 0, groupOffset: number = 0) {\r\n this.duration = duration;\r\n this.groupIndex = groupIndex;\r\n this.groupOffset = groupOffset;\r\n }\r\n} ","/**\r\n * Represents a single part/piece of a sprite\r\n */\r\nexport class SpritePart {\r\n public isLarge: boolean;\r\n public xOffset: number;\r\n public xOffsetMirror: number;\r\n public yOffset: number;\r\n public yOffsetMirror: number;\r\n public vMirror: boolean;\r\n public hMirror: boolean;\r\n public someOffset: number;\r\n public paletteIndex: number;\r\n public tileIndex: number;\r\n\r\n constructor() {\r\n this.isLarge = false;\r\n this.xOffset = 0;\r\n this.xOffsetMirror = 0;\r\n this.yOffset = 0;\r\n this.yOffsetMirror = 0;\r\n this.vMirror = false;\r\n this.hMirror = false;\r\n this.someOffset = 0;\r\n this.paletteIndex = 0;\r\n this.tileIndex = 0;\r\n }\r\n} ","import { SpritePart } from './SpritePart';\r\n\r\n/**\r\n * Represents a group of sprite parts that form a complete sprite frame\r\n */\r\nexport class SpriteGroup {\r\n public xOffset: number;\r\n public xOffsetMirror: number;\r\n public yOffset: number;\r\n public yOffsetMirror: number;\r\n public xRecoilHitboxOffset: number;\r\n public yRecoilHitboxOffset: number;\r\n public xRecoilHitboxTilesize: number;\r\n public yRecoilHitboxTilesize: number;\r\n public xHostileHitboxOffset: number;\r\n public xHostileHitboxSize: number;\r\n public yHostileHitboxOffset: number;\r\n public yHostileHitboxSize: number;\r\n public parts: SpritePart[];\r\n\r\n constructor() {\r\n this.xOffset = 0;\r\n this.xOffsetMirror = 0;\r\n this.yOffset = 0;\r\n this.yOffsetMirror = 0;\r\n this.xRecoilHitboxOffset = 0;\r\n this.yRecoilHitboxOffset = 0;\r\n this.xRecoilHitboxTilesize = 0;\r\n this.yRecoilHitboxTilesize = 0;\r\n this.xHostileHitboxOffset = 0;\r\n this.xHostileHitboxSize = 0;\r\n this.yHostileHitboxOffset = 0;\r\n this.yHostileHitboxSize = 0;\r\n this.parts = [];\r\n }\r\n} ","import { SpriteFrame } from './SpriteFrame';\r\nimport { SpriteGroup } from './SpriteGroup';\r\nimport { SpritePart } from './SpritePart';\r\n\r\n/**\r\n * Represents a complete sprite map with frame sets and groups\r\n */\r\nexport class SpriteMap {\r\n public frameSets: SpriteFrame[][];\r\n public groups: SpriteGroup[];\r\n\r\n constructor() {\r\n this.frameSets = [];\r\n this.groups = [];\r\n }\r\n\r\n /**\r\n * Create a SpriteMap from binary data\r\n * @param data Binary data buffer\r\n * @returns SpriteMap instance\r\n */\r\n public static fromBytes(data: Uint8Array): SpriteMap {\r\n let position = 0;\r\n\r\n const getByte = (): number => {\r\n if (position >= data.length) return 0;\r\n return data[position++];\r\n };\r\n\r\n const getUshort = (): number => {\r\n if (position + 1 >= data.length) return 0;\r\n const low = data[position++];\r\n const high = data[position++];\r\n return low | (high << 8);\r\n };\r\n\r\n const spriteMap = new SpriteMap();\r\n const setOffsets = new Set<number>();\r\n const groupOffsets = new Set<number>();\r\n\r\n // Read frame set offsets\r\n position = 0;\r\n while (!setOffsets.has(position)) {\r\n const offset = getUshort() - 0x4000;\r\n setOffsets.add(offset);\r\n }\r\n\r\n // Read frame sets\r\n for (const offStart of setOffsets) {\r\n position = offStart;\r\n const frameList: SpriteFrame[] = [];\r\n\r\n while (true) {\r\n const duration = getUshort();\r\n if (duration === 0xFFFF) {\r\n break;\r\n }\r\n\r\n const groupOffset = getUshort() - 0x4000;\r\n frameList.push(new SpriteFrame(duration, 0, groupOffset));\r\n groupOffsets.add(groupOffset);\r\n }\r\n\r\n spriteMap.frameSets.push(frameList);\r\n }\r\n\r\n // Read groups\r\n let grpIx = 0;\r\n const sortedGroupOffsets = Array.from(groupOffsets).sort((a, b) => a - b);\r\n \r\n for (const offStart of sortedGroupOffsets) {\r\n position = offStart;\r\n\r\n // Update frame group indices\r\n for (const set of spriteMap.frameSets) {\r\n for (const frame of set) {\r\n if (frame.groupOffset === offStart) {\r\n frame.groupIndex = grpIx;\r\n }\r\n }\r\n }\r\n\r\n const grp = new SpriteGroup();\r\n grp.xOffset = getByte();\r\n grp.xOffsetMirror = getByte();\r\n grp.yOffset = getByte();\r\n grp.yOffsetMirror = getByte();\r\n grp.xRecoilHitboxOffset = getByte();\r\n grp.yRecoilHitboxOffset = getByte();\r\n grp.xRecoilHitboxTilesize = getByte();\r\n grp.yRecoilHitboxTilesize = getByte();\r\n grp.xHostileHitboxOffset = getByte();\r\n grp.xHostileHitboxSize = getByte();\r\n grp.yHostileHitboxOffset = getByte();\r\n grp.yHostileHitboxSize = getByte();\r\n\r\n let numParts = getByte();\r\n while (numParts-- > 0) {\r\n const part = new SpritePart();\r\n part.isLarge = getByte() !== 0;\r\n part.xOffset = getByte();\r\n part.xOffsetMirror = getByte();\r\n part.yOffset = getByte();\r\n part.yOffsetMirror = getByte();\r\n\r\n const props = getUshort();\r\n part.vMirror = (props & 0x8000) !== 0;\r\n part.hMirror = (props & 0x4000) !== 0;\r\n part.someOffset = (props >> 12) & 0x3;\r\n part.paletteIndex = (props >> 9) & 0x7;\r\n part.tileIndex = props & 0x1FF;\r\n\r\n grp.parts.push(part);\r\n }\r\n\r\n spriteMap.groups.push(grp);\r\n grpIx++;\r\n }\r\n\r\n return spriteMap;\r\n }\r\n\r\n /**\r\n * Convert this SpriteMap to binary data\r\n * @returns Binary data buffer\r\n */\r\n public toBytes(): Uint8Array {\r\n // Calculate buffer size (estimate)\r\n let size = this.frameSets.length * 2; // Frame set offsets\r\n \r\n for (const set of this.frameSets) {\r\n size += (set.length * 4) + 2; // Frames + terminator\r\n }\r\n \r\n for (const grp of this.groups) {\r\n size += (grp.parts.length * 7) + 13; // Parts + group header\r\n }\r\n\r\n const buffer = new Uint8Array(size);\r\n let position = 0;\r\n\r\n const writeShort = (val: number): void => {\r\n buffer[position++] = val & 0xFF;\r\n buffer[position++] = (val >> 8) & 0xFF;\r\n };\r\n\r\n const writeLoc = (val: number): void => writeShort(val + 0x4000);\r\n\r\n let pos = this.frameSets.length << 1;\r\n const groupPos = new Array<number>(this.groups.length);\r\n\r\n // Write frame set offsets\r\n for (const set of this.frameSets) {\r\n writeLoc(pos);\r\n pos += (set.length << 2) + 2;\r\n }\r\n\r\n // Calculate group positions\r\n for (let i = 0; i < this.groups.length; i++) {\r\n groupPos[i] = pos;\r\n pos += this.groups[i].parts.length * 7 + 13;\r\n }\r\n\r\n // Write frame sets\r\n for (const set of this.frameSets) {\r\n for (const frm of set) {\r\n writeShort(frm.duration);\r\n writeLoc(groupPos[frm.groupIndex]);\r\n }\r\n writeShort(0xFFFF);\r\n }\r\n\r\n // Write groups\r\n for (const grp of this.groups) {\r\n buffer[position++] = grp.xOffset;\r\n buffer[position++] = grp.xOffsetMirror;\r\n buffer[position++] = grp.yOffset;\r\n buffer[position++] = grp.yOffsetMirror;\r\n buffer[position++] = grp.xRecoilHitboxOffset;\r\n buffer[position++] = grp.yRecoilHitboxOffset;\r\n buffer[position++] = grp.xRecoilHitboxTilesize;\r\n buffer[position++] = grp.yRecoilHitboxTilesize;\r\n buffer[position++] = grp.xHostileHitboxOffset;\r\n buffer[position++] = grp.xHostileHitboxSize;\r\n buffer[position++] = grp.yHostileHitboxOffset;\r\n buffer[position++] = grp.yHostileHitboxSize;\r\n buffer[position++] = grp.parts.length;\r\n\r\n for (const prt of grp.parts) {\r\n buffer[position++] = prt.isLarge ? 1 : 0;\r\n buffer[position++] = prt.xOffset;\r\n buffer[position++] = prt.xOffsetMirror;\r\n buffer[position++] = prt.yOffset;\r\n buffer[position++] = prt.yOffsetMirror;\r\n\r\n const accum = (prt.vMirror ? 0x8000 : 0)\r\n | (prt.hMirror ? 0x4000 : 0)\r\n | ((prt.someOffset & 0x3) << 12)\r\n | ((prt.paletteIndex & 0x7) << 9)\r\n | prt.tileIndex;\r\n\r\n writeShort(accum);\r\n }\r\n }\r\n\r\n // Return trimmed buffer\r\n return buffer.slice(0, position);\r\n }\r\n} ","// Universal ROM processing engine for GaiaLabs\r\n// This is the main entry point for gaia-core\r\n\r\n\r\n// Core modules\r\nexport * from './rom';\r\nexport * from './assembly';\r\nexport * from './compression';\r\nexport * from './sprites';\r\n\r\n// All core modules have been converted and are exported above\r\n\r\n/**\r\n * GaiaCore - Universal ROM processing engine\r\n * \r\n * This package provides the core functionality for ROM processing\r\n * that can run in both browser (Web Worker) and Node.js environments.\r\n * \r\n * High-level APIs:\r\n * - RomProcessor: Unified ROM processing workflows\r\n * - ProjectManager: Complete project lifecycle management\r\n * \r\n * Low-level modules:\r\n * - ROM: ROM state management, project configuration\r\n * - Assembly: 65816 instruction set, stack operations\r\n * - Compression: QuintetLZ compression algorithm\r\n * - Sprites: Sprite animation system\r\n */\r\nexport const GAIA_CORE_VERSION = '0.1.6';\r\n\r\n// Platform detection\r\nexport const isPlatformBrowser = typeof window !== 'undefined';\r\nexport const isPlatformNode = typeof process !== 'undefined' && process.versions?.node;\r\nexport const isPlatformWebWorker = typeof importScripts !== 'undefined'; "]}
1
+ {"version":3,"sources":["../src/compression/QuintetLZ.ts","../src/compression/registry.ts","../src/rom/project.ts","../src/rom/state.ts","../src/rom/extraction/processor.ts","../src/rom/extraction/reader.ts","../src/rom/extraction/references.ts","../src/rom/extraction/stack.ts","../src/rom/extraction/cop.ts","../src/rom/extraction/addressing.ts","../src/rom/extraction/transforms.ts","../src/utils/index.ts","../src/rom/extraction/strings.ts","../src/rom/extraction/parser.ts","../src/rom/extraction/asm.ts","../src/assembly/Stack.ts","../src/assembly/Registers.ts","../src/rom/extraction/blocks.ts","../src/rom/extraction/postprocessor.ts","../src/rom/extraction/writer.ts","../src/rom/rebuild/layout.ts","../src/rom/rebuild/processor.ts","../src/rom/rebuild/writer.ts","../src/rom/rebuild/string-processor.ts","../src/rom/rebuild/sorted-map.ts","../src/rom/rebuild/assembler-state.ts","../src/rom/rebuild/assembler.ts","../src/rom/generator.ts","../src/sprites/SpriteFrame.ts","../src/sprites/SpritePart.ts","../src/sprites/SpriteGroup.ts","../src/sprites/SpriteMap.ts","../src/index.ts"],"names":["BitStream","CompressionRegistry","readJsonFile","getDirectory","BlockReaderConstants","Address","AddressType","MemberType","Byte","Word","AddressSpace","LocationWrapper","StatusFlags","RomProcessingConstants","ChunkFileUtils","Op","RegisterType","createTableEntry","ChunkFile","BinType","createChunkFileFromDbFile","createChunkFileFromDbBlock","ObjectType","TypedNumber","obj","Long","x","AsmBlock","opCode","addrMode","summaryFromSupabaseByProject","crc32_buffer","DbRootUtils"],"mappings":"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","file":"index.js","sourcesContent":["import { BitStream, type ICompressionProvider } from '@gaialabs/shared';\n\n/**\n * QuintetLZ compression algorithm implementation\n * Dictionary-based compression used in Quintet games\n */\nexport class QuintetLZ implements ICompressionProvider {\n public static readonly DICTIONARY_SIZE = 0x100;\n public static readonly DICTIONARY_INIT = 0x20;\n public static readonly DICTIONARY_OFFSET = 0xEF;\n private static readonly DEFAULT_PAGE_SIZE = 0x8000;\n\n /**\n * Expand (decompress) data using QuintetLZ algorithm\n * @param srcData Source data buffer\n * @param srcPosition Starting position in source data\n * @param srcLen Length of source data to process\n * @returns Expanded data\n */\n public expand(srcData: Uint8Array, srcPosition: number = 0, srcLen: number = QuintetLZ.DEFAULT_PAGE_SIZE): Uint8Array {\n const bitStream = new BitStream(srcData, srcPosition);\n const srcStop = srcPosition + srcLen;\n\n // Initialize dictionary with spaces (0x20)\n const dictionary = new Uint8Array(QuintetLZ.DICTIONARY_SIZE);\n dictionary.fill(QuintetLZ.DICTIONARY_INIT);\n\n // Initialize positions\n let dictPosition = QuintetLZ.DICTIONARY_OFFSET;\n let outPosition = 0;\n\n // First two bytes is decompressed size\n let dstLen = bitStream.readShort();\n\n if(dstLen === 0){\n return srcData.slice(srcPosition + 2, srcStop);\n } else if(dstLen & 0x8000) {\n dstLen = 0x10000 - dstLen;\n }\n\n // Create output buffer with the expected size\n const outBuffer = new Uint8Array(dstLen);\n\n while (bitStream.currentPosition < srcStop && outPosition < dstLen) {\n // If current bit is set, read byte and add to output buffer and dictionary\n if (bitStream.readBit()) {\n // Read byte from bitstream\n const sample = bitStream.readByte();\n\n // Add byte to output buffer and increment\n if (outPosition < dstLen) {\n outBuffer[outPosition++] = sample;\n }\n\n // Add byte to dictionary\n dictionary[dictPosition] = sample;\n\n // Wrap dictionary index\n dictPosition = (dictPosition + 1) & 0xFF;\n }\n // If current bit is not set, read sequence from dictionary\n else {\n // Read wordIndex and wordLength from bitstream\n let wordIndex = bitStream.readByte();\n let wordLength = bitStream.readNibble() + 2;\n\n // Continue while there are remaining bytes to copy\n while (wordLength-- > 0) {\n // Read byte at wordIndex\n const sample = dictionary[wordIndex];\n\n // Wrap dictionary index\n wordIndex = (wordIndex + 1) & 0xFF;\n\n // Copy byte to output buffer and increment, but only if there is space\n if (outPosition < dstLen) {\n outBuffer[outPosition++] = sample;\n }\n\n // Add byte to dictionary and increment\n dictionary[dictPosition] = sample;\n\n // Wrap dictionary index\n dictPosition = (dictPosition + 1) & 0xFF;\n }\n }\n }\n\n // Return only the used portion of the buffer\n if (outPosition < dstLen) {\n return outBuffer.slice(0, outPosition);\n }\n\n return outBuffer;\n }\n\n /**\n * Compact (compress) data using QuintetLZ algorithm\n * @param srcData Source data to compress\n * @returns Compressed data\n */\n public compact(srcData: Uint8Array): Uint8Array {\n // Initialize dictionary with spaces\n const dictionary = new Uint8Array(QuintetLZ.DICTIONARY_SIZE);\n dictionary.fill(QuintetLZ.DICTIONARY_INIT);\n\n let offset = QuintetLZ.DICTIONARY_OFFSET;\n let srcIx = 0;\n let dstIx = 0;\n\n const srcLen = srcData.length;\n const outputBuffer = new Uint8Array(srcLen * 2); // Allocate extra space for safety\n\n // Write header (16-bit length in little-endian)\n outputBuffer[dstIx++] = srcLen & 0xFF;\n outputBuffer[dstIx++] = (srcLen >> 8) & 0xFF;\n\n const bitStream = new BitStream(outputBuffer, 2); // Start after header\n\n /**\n * Find the best match in the dictionary\n * @returns Tuple of [startByte, length]\n */\n const getCommand = (): [number, number] => {\n const maxLen = Math.min(srcLen - srcIx, 17);\n if (maxLen < 2) {\n return [0, 0];\n }\n\n let startByte = 0;\n let bestLen = 0;\n let bx = offset;\n\n for (let i = 0; i < 0x100; i++, bx = (bx + 1) & 0xFF) {\n let size = 0;\n let bix = bx;\n\n while (size < maxLen && dictionary[bix] === srcData[srcIx + size]) {\n bix = (bix + 1) & 0xFF;\n if (bix === offset) {\n bix = bx;\n }\n size++;\n }\n\n if (size > bestLen) {\n startByte = bx;\n bestLen = size;\n\n if (bestLen >= maxLen) {\n break;\n }\n }\n }\n\n return [startByte, bestLen];\n };\n\n while (srcIx < srcLen) {\n const [cmdStart, cmdLen] = getCommand();\n\n if (cmdLen >= 2) {\n // Write dictionary reference\n bitStream.writeBit(false);\n bitStream.writeByte(cmdStart);\n bitStream.writeNibble(cmdLen - 2);\n\n // Copy bytes to dictionary\n for (let i = 0; i < cmdLen; i++) {\n dictionary[offset] = srcData[srcIx++];\n offset = (offset + 1) & 0xFF;\n }\n } else {\n // Write literal byte\n bitStream.writeBit(true);\n const val = srcData[srcIx++];\n bitStream.writeByte(val);\n dictionary[offset] = val;\n offset = (offset + 1) & 0xFF;\n }\n }\n bitStream.flush();\n\n // Get the final size including the bit stream data\n const finalSize = Math.max(dstIx, bitStream.currentPosition);\n return outputBuffer.slice(0, finalSize);\n }\n} ","import { CompressionRegistry } from '@gaialabs/shared';\r\nimport { QuintetLZ } from './QuintetLZ';\r\n\r\n/**\r\n * Register compression providers with the global registry\r\n */\r\nexport function registerCompressionProviders(): void {\r\n // Register QuintetLZ compression provider\r\n CompressionRegistry.register('QuintetLZ', () => new QuintetLZ());\r\n}\r\n\r\n// Auto-register when this module is imported\r\nregisterCompressionProviders();\r\n","import { \n BinType, \n DbRootUtils, \n DbEntryPoint, \n type DbPath, \n readJsonFile, \n readFileAsBinary, \n getDirectory, \n type ChunkFile \n} from '@gaialabs/shared';\nimport '../compression'; // Import to ensure compression providers are registered\nimport { BlockReader, BlockWriter } from './extraction';\nimport { RomWriter } from './rebuild';\n\n/**\n * Main project management class\n * Converted from GaiaLib/ProjectRoot.cs\n */\nexport interface ProjectConfig {\n name: string;\n romPath: string;\n baseDir: string;\n system?: string;\n database: string;\n flipsPath?: string;\n resources: Record<BinType, DbPath>;\n databasePath?: string;\n systemPath?: string;\n compression?: string;\n}\n\n/**\n * Project root management\n */\nexport class ProjectRoot {\n public config: ProjectConfig;\n public name: string;\n public romPath: string;\n public baseDir: string;\n public system?: string;\n public database: string;\n public flipsPath?: string;\n public resources: Record<BinType, DbPath>;\n public databasePath?: string;\n public systemPath?: string;\n public compression?: string;\n\n constructor(config: ProjectConfig) {\n this.config = config;\n this.name = config.name;\n this.romPath = config.romPath;\n this.baseDir = config.baseDir;\n this.system = config.system;\n this.database = config.database;\n this.flipsPath = config.flipsPath;\n this.resources = config.resources;\n this.databasePath = config.databasePath;\n this.systemPath = config.systemPath;\n this.compression = config.compression;\n }\n\n /**\n * Load project from file or directory\n */\n public static async load(path?: string): Promise<ProjectRoot> {\n path = path || './project.json';\n\n try {\n // Try to load as JSON file using shared utility\n const config = await readJsonFile<ProjectConfig>(path);\n \n // Set default values\n if (!config.baseDir) {\n config.baseDir = await getDirectory(path);\n }\n \n //if (!config.database) {\n // config.database = 'us';\n //}\n\n //config.databasePath = `${config.baseDir}/db/${config.database}`;\n //config.systemPath = `${config.baseDir}/db/snes`;\n\n return new ProjectRoot(config);\n } catch (error) {\n // Fall back to directory-based configuration\n console.warn(`Failed to load project file: ${error}. Using directory-based configuration.`);\n }\n\n // Try as directory\n const defaultConfig: ProjectConfig = {\n name: 'GaiaLabs',\n baseDir: path,\n flipsPath: process?.env?.flips_path,\n romPath: process?.env?.rom_path || '',\n database: 'us',\n databasePath: `${path}/db/us`,\n systemPath: `${path}/db/snes`,\n resources: {} as Record<BinType, DbPath>\n };\n\n return new ProjectRoot(defaultConfig);\n }\n\n // /**\n // * Build the ROM (simplified)\n // */\n // public async build(files: ChunkFile[], entryPoints: DbEntryPoint[]): Promise<void> {\n // // Build ROM using rebuild writer\n // const writer = new RomWriter(entryPoints, this.config.cartName, this.config.makerCode);\n // await writer.repack(files);\n // }\n\n /**\n * Dump database and extract ROM data with comprehensive assembly processing\n */\n // public async dumpDatabase(): Promise<ChunkFile[]> {\n // // Load database and ROM data\n // const root = await DbRootUtils.fromFolder(this.databasePath!, this.systemPath!);\n // const rom = await readFileAsBinary(this.romPath);\n // //root.paths = this.resources;\n\n // const chunkReader = new BlockReader(rom, root);\n // const chunkFiles = chunkReader.analyzeAndResolve();\n\n // const blockWriter = new BlockWriter(chunkReader);\n // const writtenFiles = blockWriter.generateAllAsm(chunkFiles);\n\n // return chunkFiles;\n // }\n} ","/**\n * Lightweight ROM state placeholder used during early development.\n * This stub will be expanded as the ROM extraction pipeline matures.\n */\nexport class RomState {\n // Basic memory buffers\n public readonly cgram = new Uint8Array(0x200); // Color palette RAM\n public readonly vram = new Uint8Array(0x10000); // Video RAM\n\n /**\n * Create ROM state from scene metadata.\n * Parameters are currently unused but kept for future implementation.\n */\n public static async fromScene(\n _baseDir: string,\n _root: unknown,\n _metaFile: string,\n _id: number\n ): Promise<RomState> {\n return new RomState();\n }\n}\n\n/**\n * Utility helpers for working with RomState.\n */\nexport class RomStateUtils {\n /** Create an empty ROM state */\n public static createEmpty(): RomState {\n return new RomState();\n }\n\n /** Clear all data in the given ROM state */\n public static clear(state: RomState): void {\n state.cgram.fill(0);\n state.vram.fill(0);\n }\n}\n","import { Registers } from '../../assembly';\n\n/**\n * Manages CPU processor state during ROM analysis\n * Converted from GaiaLib/Rom/Extraction/ProcessorStateManager.cs\n */\nexport class ProcessorStateManager {\n public readonly accumulatorFlags = new Map<number, boolean | null>();\n public readonly indexFlags = new Map<number, boolean | null>();\n public readonly bankNotes = new Map<number, number | null>();\n public readonly stackPositions = new Map<number, number>();\n\n /**\n * Hydrate processor registers with stored state\n * Uses Registers from gaia-core/assembly for processor state management\n */\n public hydrateRegisters(position: number, reg: Registers): void {\n const acc = this.accumulatorFlags.get(position);\n if (acc !== undefined) {\n reg.accumulatorFlag = acc ?? undefined;\n }\n\n const ind = this.indexFlags.get(position);\n if (ind !== undefined) {\n reg.indexFlag = ind ?? undefined;\n }\n\n const bnk = this.bankNotes.get(position);\n if (bnk !== undefined) {\n reg.dataBank = bnk ?? undefined;\n }\n\n const stack = this.stackPositions.get(position);\n if (stack !== undefined) {\n reg.stack.location = stack;\n }\n }\n\n // Accumulator flag methods\n public getAccumulatorFlag(location: number): boolean | null | undefined {\n return this.accumulatorFlags.get(location);\n }\n\n public setAccumulatorFlag(location: number, value: boolean | null): void {\n this.accumulatorFlags.set(location, value);\n }\n\n public tryAddAccumulatorFlag(location: number, value: boolean | null): boolean {\n if (this.accumulatorFlags.has(location)) {\n return false;\n }\n this.accumulatorFlags.set(location, value);\n return true;\n }\n\n // Index flag methods\n public getIndexFlag(location: number): boolean | null | undefined {\n return this.indexFlags.get(location);\n }\n\n public setIndexFlag(location: number, value: boolean | null): void {\n this.indexFlags.set(location, value);\n }\n\n public tryAddIndexFlag(location: number, value: boolean | null): boolean {\n if (this.indexFlags.has(location)) {\n return false;\n }\n this.indexFlags.set(location, value);\n return true;\n }\n\n // Bank note methods\n public getBankNote(location: number): number | null | undefined {\n return this.bankNotes.get(location);\n }\n\n public setBankNote(location: number, value: number | null): void {\n this.bankNotes.set(location, value);\n }\n\n // Stack position methods\n public getStackPosition(location: number): number | undefined {\n return this.stackPositions.get(location);\n }\n\n public setStackPosition(location: number, value: number): void {\n this.stackPositions.set(location, value);\n }\n\n public tryAddStackPosition(location: number, value: number): boolean {\n if (this.stackPositions.has(location)) {\n return false;\n }\n this.stackPositions.set(location, value);\n return true;\n }\n} ","/**\r\n * Provides low-level ROM data reading functionality\r\n * Converted from GaiaLib/Rom/Extraction/RomDataReader.cs\r\n */\r\nexport class RomDataReader {\r\n public readonly romData: Uint8Array;\r\n public position: number;\r\n\r\n constructor(romData: Uint8Array) {\r\n if (!romData) {\r\n throw new Error('romData cannot be null');\r\n }\r\n this.romData = romData;\r\n this.position = 0;\r\n }\r\n\r\n public readByte(): number {\r\n return this.romData[this.position++];\r\n }\r\n\r\n public readSByte(): number {\r\n const value = this.readByte();\r\n return value > 127 ? value - 256 : value;\r\n }\r\n\r\n public readUShort(): number {\r\n return this.readByte() | (this.readByte() << 8);\r\n }\r\n\r\n public readShort(): number {\r\n const value = this.readUShort();\r\n return value > 32767 ? value - 65536 : value;\r\n }\r\n\r\n public readAddress(): number {\r\n return this.readByte() | (this.readByte() << 8) | (this.readByte() << 16);\r\n }\r\n\r\n public readInt(): number {\r\n return this.readByte() | (this.readByte() << 8) | (this.readByte() << 16) | (this.readByte() << 24);\r\n }\r\n\r\n public peekByte(): number {\r\n return this.romData[this.position];\r\n }\r\n\r\n public peekShort(): number {\r\n return this.romData[this.position] | (this.romData[this.position + 1] << 8);\r\n }\r\n\r\n public peekAddress(): number {\r\n return this.romData[this.position]\r\n | (this.romData[this.position + 1] << 8)\r\n | (this.romData[this.position + 2] << 16);\r\n }\r\n} ","import { AddressType, Address } from '@gaialabs/shared';\nimport { BlockReaderConstants } from '@gaialabs/shared';\nimport type { DbRoot } from '@gaialabs/shared';\n\n/**\n * Manages references, chunks, and markers during ROM analysis\n * Converted from GaiaLib/Rom/Extraction/ReferenceManager.cs\n */\nexport class ReferenceManager {\n public readonly structTable = new Map<number, string>();\n public readonly markerTable = new Map<number, number>();\n public readonly nameTable = new Map<number, string>();\n private readonly root: DbRoot;\n\n constructor(root: DbRoot) {\n if (!root) {\n throw new Error('root cannot be null');\n }\n this.root = root;\n }\n\n // Struct management\n public tryGetStruct(location: number): { found: boolean; chunkType?: string } {\n const chunkType = this.structTable.get(location);\n return { found: chunkType !== undefined, chunkType };\n }\n\n public tryAddStruct(location: number, chunkType: string): boolean {\n if (this.structTable.has(location)) {\n return false;\n }\n this.structTable.set(location, chunkType);\n return true;\n }\n\n public containsStruct(location: number): boolean {\n return this.structTable.has(location);\n }\n\n // Name management\n public tryGetName(location: number): { found: boolean; referenceName?: string } {\n const referenceName = this.nameTable.get(location);\n return { found: referenceName !== undefined, referenceName };\n }\n\n public tryAddName(location: number, referenceName: string): boolean {\n if (this.nameTable.has(location)) {\n return false;\n }\n this.nameTable.set(location, referenceName);\n return true;\n }\n\n // Marker management\n public tryGetMarker(location: number): { found: boolean; offset?: number } {\n const offset = this.markerTable.get(location);\n return { found: offset !== undefined, offset };\n }\n\n public setMarker(location: number, offset: number): void {\n this.markerTable.set(location, offset);\n }\n\n // Label creation\n public createBranchLabel(location: number): string {\n const name = `loc_${location.toString(16).toUpperCase().padStart(6, '0')}`;\n this.nameTable.set(location, name);\n return name;\n }\n\n public createTypeName(type: string, location: number): string {\n let name = type.toLowerCase();\n \n // Handle pointer characters\n while (name.length > 0 && BlockReaderConstants.POINTER_CHARACTERS.includes(name[0])) {\n name = name.substring(1) + '_list';\n }\n\n return `${name}_${location.toString(16).toUpperCase().padStart(6, '0')}`;\n }\n\n public createFallbackName(location: number): string {\n const fileMatch = this.root.files.find(x =>\n x.start <= location && x.end > location\n );\n\n if (fileMatch) {\n const offset = location - fileMatch.start;\n return fileMatch.name + (offset !== 0 ? `+${offset.toString(16).toUpperCase()}` : '');\n }\n\n return location.toString(16).toUpperCase().padStart(6, '0');\n }\n\n /**\n * Finds a reference location by its assigned name.\n */\n public findLocationByName(name: string): number | undefined {\n for (const [loc, refName] of this.nameTable) {\n if (refName === name) {\n return loc;\n }\n }\n return undefined;\n }\n\n public resolveName(location: number, type: AddressType, isBranch: boolean): string {\n const prefix = Address.codeFromType(type);\n let name: string;\n let label: string | null = null;\n let resolvedLocation = location;\n\n // Handle rewrites first\n const rewrite = this.root.rewrites[location];\n if (rewrite !== undefined) {\n const result = this.processRewrite(location, rewrite);\n resolvedLocation = result.location;\n label = result.label;\n }\n\n // Try to get existing reference\n const existingName = this.nameTable.get(resolvedLocation);\n if (existingName) {\n name = existingName;\n } else {\n name = isBranch ? \n this.createBranchLabel(resolvedLocation) : \n this.findClosestReference(resolvedLocation) || this.createFallbackName(resolvedLocation);\n }\n\n return `${prefix || ''}${name}${label || ''}`;\n }\n\n public findClosestReference(location: number): string | null {\n let closestDistance = BlockReaderConstants.REF_SEARCH_MAX_RANGE;\n let closestName: string | null = null;\n let closestLocation: number | null = null;\n\n for (const [entryKey, entryValue] of this.nameTable) {\n if (entryKey > location) {\n continue;\n }\n\n const distance = location - entryKey;\n if (distance >= closestDistance) {\n continue;\n }\n\n closestDistance = distance;\n closestName = entryValue;\n closestLocation = entryKey;\n\n if (closestDistance === 1) {\n break;\n }\n }\n\n return this.processClosestMatch(location, closestName, closestLocation, closestDistance);\n }\n\n private processRewrite(location: number, rewrite: number): { location: number; label: string | null } {\n const offset = location - rewrite;\n const cmd = offset < 0 ? '-' : '+';\n const absOffset = Math.abs(offset);\n\n let label: string | null = null;\n const structType = this.structTable.get(rewrite);\n \n if (structType === BlockReaderConstants.WIDE_STRING_TYPE) {\n this.markerTable.set(rewrite, absOffset);\n this.markerTable.set(location, absOffset);\n label = cmd === '-' ? BlockReaderConstants.NEGATIVE_MARKER_FORMAT : BlockReaderConstants.MARKER_FORMAT;\n } else {\n const formatString = cmd === '-' ? BlockReaderConstants.NEGATIVE_OFFSET_FORMAT : BlockReaderConstants.OFFSET_FORMAT;\n label = formatString.replace('{0:X}', absOffset.toString(16).toUpperCase());\n }\n\n return { location: rewrite, label };\n }\n\n private processClosestMatch(\n location: number, \n closestName: string | null, \n closestLocation: number | null, \n closestDistance: number\n ): string | null {\n if (!closestName || closestLocation === null) {\n return null;\n }\n\n let result = closestName;\n const structType = this.structTable.get(closestLocation);\n\n if (structType === BlockReaderConstants.WIDE_STRING_TYPE) {\n this.markerTable.set(closestLocation, closestDistance);\n this.markerTable.set(location, closestDistance);\n result += BlockReaderConstants.MARKER_FORMAT;\n } else {\n result += `+${closestDistance.toString(16).toUpperCase()}`;\n }\n\n return result;\n }\n} ","import { Registers } from '../../assembly';\nimport { StatusFlags } from '@gaialabs/shared';\nimport { RomDataReader } from './reader';\nimport type { BlockReader } from './blocks';\n\n/**\n * Handles stack operations for various stack-related instructions\n * Converted from GaiaLib/Rom/Extraction/StackOperations.cs\n */\nexport class StackOperations {\n private readonly _registers: Registers;\n private readonly _blockReader: BlockReader;\n\n constructor(registers: Registers, blockReader: BlockReader) {\n this._registers = registers;\n this._blockReader = blockReader;\n }\n\n public handleStackOperation(mnemonic: string): void {\n switch (mnemonic) {\n case 'PHD':\n this._registers.stack.push(this._registers.direct ?? 0);\n break;\n \n case 'PLD':\n this._registers.direct = this._registers.stack.popUInt16();\n break;\n \n case 'PHK':\n this._registers.stack.push((this._blockReader._romDataReader.position >> 16) | 0x80);\n break;\n \n case 'PHB':\n this._registers.stack.push(this._registers.dataBank ?? 0x81);\n break;\n \n case 'PLB':\n this._registers.dataBank = this._registers.stack.popByte();\n break;\n \n case 'PHP':\n this._registers.stack.push(this._registers.statusFlags);\n break;\n \n case 'PLP':\n this._registers.statusFlags = this._registers.stack.popByte() as StatusFlags;\n break;\n\n case 'PHA':\n this.handleAccumulatorPush();\n break;\n\n case 'PLA':\n this.handleAccumulatorPull();\n break;\n\n case 'PHX':\n this.handleXIndexPush();\n break;\n\n case 'PLX':\n this.handleXIndexPull();\n break;\n\n case 'PHY':\n this.handleYIndexPush();\n break;\n\n case 'PLY':\n this.handleYIndexPull();\n break;\n\n case 'XBA':\n this.handleExchangeBytes();\n break;\n }\n }\n\n private handleAccumulatorPush(): void {\n if (this._registers.accumulatorFlag === true) {\n this._registers.stack.push((this._registers.accumulator ?? 0) & 0xFF);\n } else {\n this._registers.stack.pushUInt16(this._registers.accumulator ?? 0);\n }\n }\n\n private handleAccumulatorPull(): void {\n if (this._registers.accumulatorFlag === true) {\n this._registers.accumulator = ((this._registers.accumulator ?? 0) & 0xFF00) | this._registers.stack.popByte();\n } else {\n this._registers.accumulator = this._registers.stack.popUInt16();\n }\n }\n\n private handleXIndexPush(): void {\n if (this._registers.indexFlag === true) {\n this._registers.stack.push((this._registers.xIndex ?? 0) & 0xFF);\n } else {\n this._registers.stack.pushUInt16(this._registers.xIndex ?? 0);\n }\n }\n\n private handleXIndexPull(): void {\n if (this._registers.indexFlag === true) {\n this._registers.xIndex = ((this._registers.xIndex ?? 0) & 0xFF00) | this._registers.stack.popByte();\n } else {\n this._registers.xIndex = this._registers.stack.popUInt16();\n }\n }\n\n private handleYIndexPush(): void {\n if (this._registers.indexFlag === true) {\n this._registers.stack.push((this._registers.yIndex ?? 0) & 0xFF);\n } else {\n this._registers.stack.pushUInt16(this._registers.yIndex ?? 0);\n }\n }\n\n private handleYIndexPull(): void {\n if (this._registers.indexFlag === true) {\n this._registers.yIndex = ((this._registers.yIndex ?? 0) & 0xFF00) | this._registers.stack.popByte();\n } else {\n this._registers.yIndex = this._registers.stack.popUInt16();\n }\n }\n\n private handleExchangeBytes(): void {\n const acc = this._registers.accumulator ?? 0;\n this._registers.accumulator = ((acc >> 8) | (acc << 8)) & 0xFFFF;\n }\n} ","import { RomDataReader } from './reader';\nimport {\n Address,\n AddressType,\n AddressSpace,\n LocationWrapper,\n MemberType,\n Byte,\n Word,\n} from '@gaialabs/shared';\nimport type { CopDef } from '@gaialabs/shared';\nimport type { DbRoot } from '@gaialabs/shared';\nimport type { BlockReader } from './blocks';\n\n/**\n * Handles COP (Coprocessor) command processing\n * Converted from GaiaLib/Rom/Extraction/CopCommandProcessor.cs\n */\nexport class CopCommandProcessor {\n private readonly _blockReader: BlockReader;\n private readonly _romDataReader: RomDataReader;\n\n constructor(blockReader: BlockReader) {\n this._blockReader = blockReader;\n this._romDataReader = blockReader._romDataReader;\n }\n\n /**\n * Parses a COP command based on its definition\n */\n public parseCopCommand(copDef: CopDef, operands: unknown[]): void {\n for (const partStr of copDef.parts) {\n // Use the first character to determine the address type (for pointers)\n const addrType = Address.typeFromCode(partStr[0]);\n const isPtr = addrType !== AddressType.Unknown;\n \n // Reference type is the target of a pointer from partStr, or the struct type if not a pointer\n const referenceType = isPtr ? partStr.substring(1) : this._blockReader._currentAsmBlock!.structName ?? 'Binary';\n \n // Member type resolves to the underlying pointer type, or partStr\n const memberTypeName = isPtr ? addrType.toString() : partStr;\n\n // Resolve member type name to a MemberType enum\n const memberType = this.tryParseMemberType(memberTypeName);\n if (memberType === null) {\n throw new Error('Cannot use structs in cop def'); // Only basic types are allowed in COP definitions\n }\n\n // If there is a label, ignore reading and use the label instead\n const label = this._blockReader._root.labels[this._romDataReader.position];\n if (label) {\n this._romDataReader.position += this.getMemberTypeSize(memberType);\n operands.push(label);\n } else {\n operands.push(this.readMemberTypeValue(memberType, partStr, isPtr, referenceType, addrType));\n }\n\n }\n }\n\n private tryParseMemberType(memberTypeName: string): MemberType | null {\n // Check if the string matches any MemberType enum value (case-insensitive)\n const upperName = memberTypeName.toUpperCase();\n for (const [key, value] of Object.entries(MemberType)) {\n if (key.toUpperCase() === upperName) {\n return value;\n }\n }\n return null;\n }\n\n private getMemberTypeSize(memberType: MemberType): number {\n switch (memberType) {\n case MemberType.Byte:\n return 1;\n case MemberType.Word:\n case MemberType.Offset:\n return 2;\n case MemberType.Address:\n return 3;\n default:\n throw new Error('Unsupported COP member type');\n }\n }\n\n private readMemberTypeValue(\n memberType: MemberType,\n partStr: string,\n isPtr: boolean,\n referenceType: string,\n addrType: AddressType\n ): unknown {\n switch (memberType) {\n case MemberType.Byte:\n return new Byte(this._romDataReader.readByte());\n case MemberType.Word:\n return new Word(this._romDataReader.readUShort());\n case MemberType.Offset:\n return this.createCopLocation(this._romDataReader.readUShort(), null, partStr, isPtr, referenceType, addrType);\n case MemberType.Address:\n return this.createCopLocation(this._romDataReader.readUShort(), this._romDataReader.readByte(), partStr, isPtr, referenceType, addrType);\n default:\n throw new Error('Unsupported COP member type');\n }\n }\n\n private createCopLocation(\n offset: number, \n bank: number | null, \n partStr: string, \n isPtr: boolean, \n otherStr: string, \n type: AddressType\n ): unknown {\n if (bank === null && offset === 0) {\n return new Word(offset);\n }\n\n const addr = new Address(bank ?? (this._romDataReader.position >> 16), offset);\n if (addr.space === AddressSpace.ROM) {\n const location = addr.toInt();\n if (partStr !== 'Address' && isPtr && !this._blockReader._root.rewrites[location]) {\n this._blockReader.noteType(location, otherStr, true);\n }\n\n // When address is unknown, try to use the part string (for Offset or Address)\n if (type === AddressType.Unknown) {\n type = this.tryParseAddressType(partStr) ?? AddressType.Unknown;\n }\n\n return new LocationWrapper(location, type);\n }\n return addr;\n }\n\n private tryParseAddressType(addressTypeName: string): AddressType | null {\n // Check if the string matches any AddressType enum value (case-insensitive)\n const upperName = addressTypeName.toUpperCase();\n for (const [key, value] of Object.entries(AddressType)) {\n if (key.toUpperCase() === upperName) {\n return value;\n }\n }\n return null;\n }\n} ","import { Registers } from '../../assembly';\nimport {\n AddressType,\n AddressSpace,\n Address,\n LocationWrapper,\n StatusFlags,\n Byte,\n Word,\n} from '@gaialabs/shared';\nimport { RomDataReader } from './reader';\nimport { StackOperations } from './stack';\nimport { TransformProcessor } from './transforms';\nimport { CopCommandProcessor } from './cop';\nimport type { DbRoot, CopDef, OpCode } from '@gaialabs/shared';\nimport type { BlockReader } from './blocks';\n\n/**\n * Context information for an operation being processed\n * Converted from GaiaLib/Rom/Extraction/AsmReader.cs OperationContext\n */\nexport class OperationContext {\n public size: number = 0;\n public nextAddress: number = 0;\n public xForm1: string | null = null;\n public xForm2: string | null = null;\n public copDef: CopDef | null = null;\n}\n\n/**\n * Handles different addressing modes for assembly instructions\n * Converted from GaiaLib/Rom/Extraction/AddressingModeHandler.cs\n */\nexport class AddressingModeHandler {\n private readonly _blockReader: BlockReader;\n private readonly _transformProcessor: TransformProcessor;\n private readonly _copProcessor: CopCommandProcessor;\n private readonly _dataReader: RomDataReader;\n\n constructor(blockReader: BlockReader, transformProcessor: TransformProcessor) {\n this._blockReader = blockReader;\n this._transformProcessor = transformProcessor;\n this._copProcessor = new CopCommandProcessor(blockReader);\n this._dataReader = blockReader._romDataReader;\n }\n\n public processAddressingMode(code: OpCode, context: OperationContext, reg: Registers): unknown[] {\n const operands: unknown[] = [];\n\n switch (code.mode) {\n case 'Stack':\n case 'Implied':\n case 'Accumulator':\n this.handleStackOrImpliedMode(code.mnem, reg);\n break;\n\n case 'Immediate':\n this.handleImmediateMode(code.mnem, context.size, operands, reg);\n break;\n\n case 'AbsoluteIndexedIndirect':\n this.handleAbsoluteMode(code.mnem, undefined, context.nextAddress, reg.dataBank, operands, reg, true);\n break;\n\n case 'AbsoluteIndirect':\n case 'AbsoluteIndirectLong':\n case 'Absolute':\n case 'AbsoluteIndexedX':\n case 'AbsoluteIndexedY':\n this.handleAbsoluteMode(code.mnem, undefined, context.nextAddress, reg.dataBank, operands, reg);\n break;\n\n case 'AbsoluteLong':\n case 'AbsoluteLongIndexedX':\n this.handleAbsoluteLongMode(code.mnem, operands, reg);\n break;\n\n case 'BlockMove':\n this.handleBlockMoveMode(operands, context);\n break;\n\n case 'DirectPage':\n case 'DirectPageIndexedIndirectX':\n case 'DirectPageIndexedX':\n case 'DirectPageIndexedY':\n case 'DirectPageIndirect':\n case 'DirectPageIndirectIndexedY':\n case 'DirectPageIndirectLong':\n case 'DirectPageIndirectLongIndexedY':\n this.handleDirectPageMode(operands);\n break;\n\n case 'PCRelative':\n this.handlePCRelativeMode(operands, context.nextAddress, reg, false);\n break;\n\n case 'PCRelativeLong':\n this.handlePCRelativeMode(operands, context.nextAddress, reg, true);\n break;\n\n case 'StackRelative':\n case 'StackRelativeIndirectIndexedY':\n this.handleStackRelativeMode(operands);\n break;\n\n case 'StackInterrupt':\n this.handleStackInterruptMode(code.mnem, operands, context);\n break;\n\n default:\n throw new Error(`Unknown addressing mode: ${code}`);\n }\n\n return operands;\n }\n\n private handleImmediateMode(mnemonic: string, size: number, operands: unknown[], reg: Registers): void {\n const operand = this.readImmediateOperand(size);\n operands.push(operand);\n this.updateRegisterForImmediateInstruction(mnemonic, operand, reg);\n }\n\n private readImmediateOperand(size: number) {\n return size === 3\n ? new Word(this._dataReader.readUShort())\n : new Byte(this._dataReader.readByte());\n }\n\n private updateRegisterForImmediateInstruction(\n mnemonic: string,\n operand: number | { value: number },\n reg: Registers\n ): void {\n const value = typeof operand === 'number' ? operand : operand.value;\n switch (mnemonic) {\n case 'LDA':\n reg.accumulator = this.calculateRegisterValue(reg.accumulator, value);\n break;\n\n case 'LDX':\n reg.xIndex = this.calculateRegisterValue(reg.xIndex, value);\n break;\n\n case 'LDY':\n reg.yIndex = this.calculateRegisterValue(reg.yIndex, value);\n break;\n\n case 'SEP':\n case 'REP':\n this.updateStatusFlags(mnemonic, value);\n break;\n }\n }\n\n private calculateRegisterValue(currentValue: number | undefined, operand: number): number {\n if (operand > 255) {\n // 16-bit mode: use full operand value\n return operand;\n } else {\n // 8-bit mode: preserve high byte\n return ((currentValue ?? 0) & 0xFF00) | operand;\n }\n }\n\n private updateStatusFlags(mnemonic: string, flagValue: number): void {\n const flag = flagValue as StatusFlags;\n const isSep = mnemonic === 'SEP';\n\n if (flag & StatusFlags.AccumulatorMode) {\n this._blockReader.AccumulatorFlags.set(this._dataReader.position, isSep);\n }\n\n if (flag & StatusFlags.IndexMode) {\n this._blockReader.IndexFlags.set(this._dataReader.position, isSep);\n }\n }\n\n private handleAbsoluteLongMode(mnemonic: string, operands: unknown[], reg: Registers): void {\n const refLoc = this._dataReader.readUShort();\n const bank = this._dataReader.readByte();\n const address = new Address(bank, refLoc);\n\n if (address.space === AddressSpace.ROM) {\n const wrapper = new LocationWrapper(address.toInt(), AddressType.Address);\n if (this.isJumpInstruction(mnemonic)) {\n this._blockReader.noteType(wrapper.location, 'Code', false, reg);\n }\n operands.push(wrapper);\n } else {\n operands.push(address);\n }\n }\n\n private handleBlockMoveMode(operands: unknown[], context: OperationContext): void {\n operands.push(new Byte(this._dataReader.readByte()));\n context.xForm2 = this._transformProcessor.getTransform();\n operands.push(new Byte(this._dataReader.readByte()));\n }\n\n private handleDirectPageMode(operands: unknown[]): void {\n operands.push(new Byte(this._dataReader.readByte()));\n }\n\n private handlePCRelativeMode(operands: unknown[], nextAddress: number, reg: Registers, isLong: boolean): void {\n const relative = isLong\n ? nextAddress + this._dataReader.readShort()\n : nextAddress + this._dataReader.readSByte();\n\n this._blockReader.noteType(relative, 'Code', undefined, reg);\n operands.push(new LocationWrapper(relative, AddressType.Relative));\n }\n\n private handleStackRelativeMode(operands: unknown[]): void {\n operands.push(new Byte(this._dataReader.readByte()));\n }\n\n private handleStackInterruptMode(mnemonic: string, operands: unknown[], context: OperationContext): void {\n const cmd = this._dataReader.readByte();\n operands.push(new Byte(cmd));\n\n if (mnemonic === 'COP') {\n const copDef = this._blockReader._root.copDef[cmd];\n if (!copDef) {\n throw new Error('Unknown COP command');\n }\n\n context.copDef = copDef;\n this._copProcessor.parseCopCommand(copDef, operands);\n }\n }\n\n private handleStackOrImpliedMode(mnemonic: string, reg: Registers): void {\n const stackOperations = new StackOperations(reg, this._blockReader);\n stackOperations.handleStackOperation(mnemonic);\n }\n\n private handleAbsoluteMode(\n mnemonic: string,\n xBank1: number | undefined,\n next: number,\n dataBank: number | undefined,\n operands: unknown[],\n registers: Registers,\n isIndexedIndirect: boolean = false\n ): void {\n let refLoc = this._dataReader.readUShort();\n\n const isPush = this.isPushInstruction(mnemonic);\n if (isPush) {\n refLoc++;\n }\n\n const isJump = isPush || isIndexedIndirect || this.isJumpInstruction(mnemonic);\n const bank = xBank1 ?? (isJump ? (this._dataReader.position >> 16) : dataBank ?? 0x81);\n\n const addr = new Address(bank, refLoc);\n if (addr.isROM) {\n const wrapper = new LocationWrapper(addr.toInt(), AddressType.Offset);\n if (isJump) {\n const type = isIndexedIndirect ? '&Code' : 'Code';\n const name = this._blockReader.noteType(wrapper.location, type, isPush, registers);\n\n if (isPush) {\n operands.push(`&${name}-1`);\n return;\n }\n }\n operands.push(wrapper);\n } else {\n operands.push(addr);\n }\n }\n\n private isJumpInstruction(mnemonic: string): boolean {\n return mnemonic[0] === 'J';\n }\n\n private isPushInstruction(mnemonic: string): boolean {\n return mnemonic[0] === 'P';\n }\n} ","import { RomDataReader } from './reader';\nimport { ReferenceManager } from './references';\nimport { RomProcessingConstants } from '@gaialabs/shared';\nimport type { BlockReader } from './blocks';\n\n/**\n * Handles transform processing for assembly instructions\n * Converted from GaiaLib/Rom/Extraction/TransformProcessor.cs\n */\nexport class TransformProcessor {\n private readonly _blockReader: BlockReader;\n private readonly _romDataReader: RomDataReader;\n private readonly _referenceManager: ReferenceManager;\n private readonly _labelLookup: Record<number, string>;\n\n // Location regex pattern: _([A-Fa-f0-9]{6})\n private static readonly LOCATION_REGEX = /_([A-Fa-f0-9]{6})/;\n\n constructor(romReader: BlockReader) {\n this._blockReader = romReader;\n this._romDataReader = romReader._romDataReader;\n this._referenceManager = romReader._referenceManager;\n this._labelLookup = romReader._root.labels;\n }\n\n /**\n * Retrieves transform information for the current ROM position\n */\n public getTransform(): string | null {\n const transform = this._labelLookup[this._romDataReader.position];\n if (transform === '') {\n return transform;\n } else if (!transform) {\n return null;\n }\n\n const transformName = this.cleanTransformName(transform);\n const referenceLocation = this.resolveTransformReference(transformName);\n \n if (referenceLocation !== null) {\n this._blockReader.resolveInclude(referenceLocation, false);\n }\n\n return transform;\n }\n\n /**\n * Applies transforms to operands\n */\n public applyTransforms(op1Label: string | null, op2Label: string | null, operands: unknown[]): void {\n this.applyTransform(op1Label, 0, operands);\n this.applyTransform(op2Label, 1, operands);\n }\n\n private applyTransform(transform: string | null, operandIndex: number, operands: unknown[]): void {\n if (transform === null || transform === undefined || operandIndex >= operands.length) {\n return;\n }\n\n // There is special logic for empty labels\n if (transform === '') {\n this.applyDefaultTransform(operandIndex, operands);\n } else {\n operands[operandIndex] = transform; // Otherwise it is a direct replacement\n }\n }\n\n private applyDefaultTransform(operandIndex: number, operands: unknown[]): void {\n \n let value = (this._romDataReader.position & 0xFF0000);\n const opnd = operands[operandIndex] as any;\n if(opnd && 'value' in opnd) {\n value |= opnd['value'];\n } else {\n value |= opnd as number;\n }\n\n const nameResult = this._referenceManager.tryGetName(value);\n let referenceName: string;\n \n if (!nameResult.found) {\n referenceName = `loc_${value.toString(16).toUpperCase().padStart(6, '0')}`;\n this._referenceManager.tryAddName(value, referenceName);\n } else {\n referenceName = nameResult.referenceName!;\n }\n \n this._blockReader.resolveInclude(value, false);\n operands[operandIndex] = `&${referenceName}`;\n }\n\n private cleanTransformName(transform: string): string {\n let name = transform;\n \n // Remove address space characters from the start\n while (name.length > 0 && RomProcessingConstants.ADDRESS_SPACE.includes(name[0])) {\n name = name.substring(1);\n }\n \n // Find math operators and truncate at that point\n let mathIndex = -1;\n for (let i = 0; i < name.length; i++) {\n if (RomProcessingConstants.OPERATORS.includes(name[i])) {\n mathIndex = i;\n break;\n }\n }\n \n if (mathIndex > 0) {\n name = name.substring(0, mathIndex);\n }\n \n return name;\n }\n\n private resolveTransformReference(transformName: string): number | null {\n // Directly resolve by name in the reference table\n const location = this._referenceManager.findLocationByName(transformName);\n if (location !== undefined) {\n return location;\n }\n\n // Fallback to parsing the location pattern\n const match = TransformProcessor.LOCATION_REGEX.exec(transformName);\n return match ? parseInt(match[1], 16) : null;\n }\n}","export function indexOfAny(str: string, chars: string[], startIndex = 0): number {\r\n for (let i = startIndex; i < str.length; i++) {\r\n if (chars.includes(str[i])) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nexport * from './debug-export';\r\n","import { RomDataReader } from './reader';\nimport { Address, AddressSpace, AddressType, MemberType, RomProcessingConstants, AsmBlockUtils, ChunkFileUtils, TableEntry } from '@gaialabs/shared';\nimport type { DbStringType, DbStringCommand } from '@gaialabs/shared';\nimport type { StringWrapper } from '@gaialabs/shared';\nimport type { BlockReader } from './blocks';\nimport { indexOfAny } from '../../utils';\n\n// Using shared TableEntry type from @gaialabs/shared\n\n/**\n * Reads and processes strings from ROM data\n * Converted from GaiaLib/Rom/Extraction/StringReader.cs\n */\nexport class StringReader {\n public static readonly STRING_REFERENCE_CHARACTERS = ['~', '^'];\n\n private readonly _blockReader: BlockReader;\n private readonly _romDataReader: RomDataReader;\n\n constructor(blockReader: BlockReader) {\n this._blockReader = blockReader;\n this._romDataReader = blockReader._romDataReader;\n }\n\n private resolveCommand(cmd: DbStringCommand, builder: string[]): void {\n if (cmd.types && cmd.types.length > 0) {\n builder.push(`[${cmd.value}`);\n\n let first = true;\n for (const t of cmd.types) {\n if (first) {\n builder.push(':');\n first = false;\n } else {\n builder.push(',');\n }\n\n switch (t) {\n case MemberType.Byte:\n builder.push(this._romDataReader.readByte().toString(16).toUpperCase());\n break;\n case MemberType.Word:\n builder.push(this._romDataReader.readUShort().toString(16).toUpperCase());\n break;\n case MemberType.Offset:\n const loc = this._romDataReader.readUShort() | (this._romDataReader.position & 0x3F0000);\n builder.push(`^${loc.toString(16).toUpperCase().padStart(6, '0')}`);\n break;\n case MemberType.Address:\n builder.push(`~${this._romDataReader.readAddress().toString(16).toUpperCase().padStart(6, '0')}`);\n break;\n case MemberType.Binary:\n let sfirst = true;\n do {\n const r = this._romDataReader.readByte();\n if (cmd.delimiter !== undefined && r === cmd.delimiter) {\n break;\n }\n if (sfirst) {\n sfirst = false;\n } else {\n builder.push(',');\n }\n builder.push(r.toString(16).toUpperCase());\n } while (this._blockReader.partCanContinue());\n break;\n default:\n throw new Error('Unsupported member type');\n }\n }\n builder.push(']');\n } else {\n builder.push(`[${cmd.value}]`);\n }\n }\n\n public parseString(stringType: DbStringType): StringWrapper {\n const dict = stringType.commands;\n const builder: string[] = [];\n const strLoc = this._romDataReader.position;\n const map = stringType.characterMap;\n const terminator = stringType.terminator;\n\n do {\n const c = this._romDataReader.readByte();\n if (c === terminator) {\n if (stringType.greedyTerminator) {\n while (this._romDataReader.peekByte() === terminator && this._blockReader.partCanContinue()) {\n this._romDataReader.position++;\n }\n }\n break;\n }\n\n const cmd = dict[c];\n if (cmd) {\n this.resolveCommand(cmd, builder);\n if (cmd.halt) {\n break;\n }\n } else {\n const index = this.shiftDown(c, stringType.shiftType);\n if (index >= 0 && index < map.length) {\n builder.push(map[index]);\n } else {\n // Fallback for unknown characters\n builder.push(`[${c.toString(16).toUpperCase()}]`);\n }\n }\n } while (this._blockReader.partCanContinue());\n\n return {\n string: builder.join(''),\n type: stringType,\n marker: 0,\n location: strLoc\n };\n }\n\n /**\n * Handles character shifting based on string type\n * This is a simplified implementation of the shift logic\n */\n private shiftDown(c: number, shiftType?: string): number {\n if (!shiftType) {\n return c;\n }\n\n switch (shiftType) {\n case 'wh2':\n // wh2 shift: ((c & 0x70) >> 1) | (c & 0x07)\n return ((c & 0x70) >> 1) | (c & 0x07);\n case 'h2':\n // h2 shift: ((c & 0xE0) >> 1) | (c & 0x0F)\n return ((c & 0xE0) >> 1) | (c & 0x0F);\n default:\n return c;\n }\n }\n\n public resolveString(sw: StringWrapper, isBranch: boolean): void {\n let str = sw.string;\n let ix = indexOfAny(str, StringReader.STRING_REFERENCE_CHARACTERS);\n \n while (ix >= 0) {\n if (ix + 6 < str.length) {\n const hexStr = str.substring(ix + 1, ix + 7);\n const sloc = parseInt(hexStr, 16);\n \n if (!isNaN(sloc)) {\n const addrs = new Address(sloc >> 16, sloc & 0xFFFF);\n if (addrs.space === AddressSpace.ROM) {\n this._blockReader.resolveInclude(sloc, false);\n const name = this._blockReader.resolveName(sloc, AddressType.Unknown, false);\n const opix = indexOfAny(name, RomProcessingConstants.OPERATORS);\n \n if (opix > 0) {\n const offsetStr = name.substring(opix + 1);\n let offset: number;\n \n if (offsetStr === 'M') {\n offset = this._blockReader._referenceManager.markerTable.get(sloc) || 0;\n } else {\n offset = parseInt(offsetStr, 16) || 0;\n }\n\n if (name[opix] === '-') {\n offset = -offset;\n }\n\n const targetName = name.substring(0, opix);\n const target = sloc - offset;\n \n // Try to find the target using IsOutside pattern\n const [isOutside, block, part] = ChunkFileUtils.isOutsideWithPart(this._blockReader._enrichedChunks, this._blockReader._currentChunk!, sloc);\n if (part != null) {\n const entry = part.objList?.find((x): x is TableEntry => \n typeof x === 'object' && x !== null && 'location' in x && 'object' in x && (x as TableEntry).location === target) as TableEntry | undefined;\n if (entry && entry.object) {\n (entry.object as StringWrapper).marker = offset;\n }\n }\n }\n }\n }\n }\n \n ix = indexOfAny(str, StringReader.STRING_REFERENCE_CHARACTERS, ix + 7);\n }\n }\n\n}","import { Op } from '@gaialabs/shared';\nimport { Registers } from '../../assembly';\nimport { RomDataReader } from './reader';\nimport { StringReader } from './strings';\nimport { ReferenceManager } from './references';\nimport {\n Address,\n AddressSpace,\n AddressType,\n ChunkFileUtils,\n LocationWrapper,\n MemberType,\n StructDef,\n Byte,\n Word,\n} from '@gaialabs/shared';\nimport type { DbRoot, DbBlock, DbPart } from '@gaialabs/shared';\nimport type { DbStruct } from '@gaialabs/shared';\nimport type { DbStringType } from '@gaialabs/shared';\nimport { AsmReader } from './asm';\nimport type { BlockReader } from './blocks';\n\n/**\n * Handles parsing of different data types from ROM\n * Converted from GaiaLib/Rom/Extraction/TypeParser.cs\n */\nexport class TypeParser {\n private readonly _blockReader: BlockReader;\n private readonly _romDataReader: RomDataReader;\n private readonly _stringReader: StringReader;\n private readonly _stringTypes: Record<string, DbStringType>;\n private readonly _referenceManager: ReferenceManager;\n\n constructor(blockReader: BlockReader) {\n this._blockReader = blockReader;\n this._referenceManager = blockReader._referenceManager;\n this._romDataReader = blockReader._romDataReader;\n this._stringReader = blockReader._stringReader;\n this._stringTypes = blockReader._root.stringTypes;\n }\n\n public parseType(typeName: string, reg: Registers | null, depth: number, bank?: number): unknown {\n \n // Shortcut for symbolic Offsets\n if (typeName[0] === '&') {\n return this.parseLocation(this._romDataReader.readUShort(), bank, typeName.substring(1), AddressType.Offset);\n }\n\n // Shortcut for symbolic Addresses\n if (typeName[0] === '@') {\n return this.parseLocation(this._romDataReader.readUShort(), this._romDataReader.readByte(), typeName.substring(1), AddressType.Address);\n }\n\n // Check string types\n const stringType = this._stringTypes[typeName];\n if (stringType) {\n return this._stringReader.parseString(stringType);\n }\n\n // Parse raw values\n const mType = this.tryParseMemberType(typeName);\n if (mType !== null) {\n switch (mType) {\n case MemberType.Byte:\n return new Byte(this._romDataReader.readByte());\n case MemberType.Word:\n return new Word(this.parseWordSafe());\n case MemberType.Offset:\n return this.parseLocation(this._romDataReader.readUShort(), bank, null, AddressType.Offset);\n case MemberType.Address:\n return this.parseLocation(this._romDataReader.readUShort(), this._romDataReader.readByte(), null, AddressType.Address);\n case MemberType.Binary:\n return this.parseBinary();\n case MemberType.Code:\n return this.parseCode(reg as Registers);\n default:\n throw new Error('Invalid member type');\n }\n }\n\n const parentType = this._blockReader._root.structs[typeName];\n if (!parentType) {\n throw new Error(`Unknown type: ${typeName}`);\n }\n\n const delimiter = parentType.delimiter;\n const discOffset = parentType.discriminator;\n const objects: unknown[] = [];\n\n // Continue to iterate until end or delimiter is reached\n let delReached: boolean;\n while (!(delReached = this._blockReader.delimiterReached(delimiter))) {\n const startPosition = this._romDataReader.position;\n let targetType = parentType;\n\n // If a discriminator offset is present, use it to identify the type\n if (discOffset !== undefined) {\n // Get discriminator position in ROM\n const discPosition = this._romDataReader.position + discOffset;\n\n // Get discriminator value\n const desc = this._romDataReader.romData[discPosition];\n\n // Advance position (hide value) if discriminator is first\n if (discOffset === 0) {\n this._romDataReader.position++;\n }\n\n // Match discriminator to type\n const matchedStruct = Object.values(this._blockReader._root.structs).find(\n x => x.parent === typeName && x.discriminator === desc\n );\n targetType = matchedStruct || parentType; // Default to parent if no match is found\n }\n\n const types = targetType.types;\n if (types && types.length > 0) {\n const memberCount = types.length;\n const prevPosition = this._romDataReader.position;\n const parts = new Array(memberCount); // Create new member collection\n const def: StructDef = { name: targetType.name, parts };\n\n // Parse each member of the struct\n for (let i = 0; i < memberCount; i++) {\n parts[i] = this.parseType(types[i], null, depth + 1, bank);\n }\n\n // Advance (hide) discriminator if it is the last member\n if (discOffset !== undefined && discOffset === this._romDataReader.position - prevPosition) {\n this._romDataReader.position++;\n }\n\n objects.push(def);\n }\n\n // Roll back work if struct overflows a chunk boundary\n // SHOULD only happen for the inventory sprite map\n let checkPosition = startPosition;\n while (++checkPosition < this._romDataReader.position) {\n if (this._referenceManager.containsStruct(checkPosition)) {\n this._romDataReader.position = checkPosition;\n break;\n }\n }\n\n // Stop if the reader should not continue\n if (!this._blockReader.partCanContinue()) {\n break;\n }\n }\n\n // If we have reached delimiter and at depth 0, note the struct\n if (delReached && depth === 0) {\n this._referenceManager.tryAddStruct(this._romDataReader.position, typeName);\n }\n\n return objects;\n }\n\n private tryParseMemberType(memberTypeName: string): MemberType | null {\n // Check if the string matches any MemberType enum value (case-insensitive)\n const upperName = memberTypeName.toUpperCase();\n for (const [key, value] of Object.entries(MemberType)) {\n if (key.toUpperCase() === upperName) {\n return value;\n }\n }\n return null;\n }\n\n private parseWordSafe(): number {\n return this._referenceManager.containsStruct(this._romDataReader.position + 1)\n ? this._romDataReader.readByte()\n : this._romDataReader.readUShort();\n }\n\n private parseBinary(): Uint8Array {\n // Store old position for length calculation\n const startPosition = this._romDataReader.position;\n\n // Advance the reader until we reach the end of the section\n do {\n this._romDataReader.position++;\n } while (this._blockReader.partCanContinue());\n\n // Length is determined by the new position relative to the old\n const len = this._romDataReader.position - startPosition;\n\n // Create buffer for the raw bytes\n const outBuffer = new Uint8Array(len);\n\n // Copy raw bytes from ROM to buffer\n for (let i = 0; i < len; i++) {\n outBuffer[i] = this._romDataReader.romData[startPosition + i];\n }\n\n return outBuffer;\n }\n\n private parseLocation(offset: number, bank: number | undefined, typeName: string | null, addrType: AddressType): unknown {\n // If bank is not provided and offset is 0, it should resolve to #$0000\n if ((bank === undefined || bank === null) && offset === 0) {\n return new Word(offset);\n }\n\n // Bank cannot be null, instead use bank from current position\n const resolvedBank = bank ?? (this._romDataReader.position >> 16);\n\n // Create the address with resolved bank\n const adrs = new Address(resolvedBank, offset);\n\n // If we have a system address, keep it as is\n if (adrs.space !== AddressSpace.ROM) {\n return adrs;\n }\n\n // Convert address to ROM location\n const loc = adrs.toInt();\n\n // If the location is inside the current block and there is no rewrite for it...\n if (\n this._blockReader._currentChunk &&\n ChunkFileUtils.isInside(this._blockReader._currentChunk, loc) &&\n !this._blockReader._root.rewrites[loc]\n ) {\n // Normalize the type name to default to current part definition\n const resolvedTypeName = typeName ?? this._blockReader._currentAsmBlock!.structName ?? 'Binary';\n\n // Add the struct type to our chunk table if it is not already present\n this._referenceManager.tryAddStruct(loc, resolvedTypeName);\n\n // If the location is not already in the reference table, add it\n const referenceName = `${resolvedTypeName.toLowerCase()}_${loc.toString(16).toUpperCase().padStart(6, '0')}`;\n this._referenceManager.tryAddName(loc, referenceName);\n }\n\n return new LocationWrapper(loc, addrType);\n }\n\n private parseCode(reg: Registers): Op[] {\n // Output list\n const opList: Op[] = [];\n\n let first = true;\n while (this._romDataReader.position < this._blockReader._partEnd) {\n // Check the chunk table for a new type block, but not on the first iteration\n if (first) {\n first = false;\n } else if (this._referenceManager.containsStruct(this._romDataReader.position)) {\n break;\n }\n\n // Process register adjustments before parse\n if (reg) {\n this._blockReader.hydrateRegisters(reg);\n }\n\n // Parse instruction\n const op = this._blockReader._asmReader.parseAsm(reg);\n\n // Add instruction to list\n opList.push(op);\n }\n\n return opList;\n }\n} ","import { Op, OpCode } from '@gaialabs/shared';\r\nimport { Registers } from '../../assembly';\r\nimport { RomDataReader } from './reader';\r\nimport { TransformProcessor } from './transforms';\r\nimport { AddressingModeHandler, OperationContext } from './addressing';\r\nimport type { BlockReader } from './blocks';\r\n\r\n/**\r\n * Parses assembly instructions from ROM data, handling different addressing modes\r\n * and maintaining CPU register state during analysis.\r\n * Converted from GaiaLib/Rom/Extraction/AsmReader.cs\r\n */\r\nexport class AsmReader {\r\n // Constants\r\n private static readonly PROCESSOR_FLAG_MASK = 0xDF;\r\n private static readonly ACCUMULATOR_OP_MASK = 0xF;\r\n private static readonly ACCUMULATOR_OP_VALUE = 0x9;\r\n public static readonly VARIABLE_SIZE_INDICATOR = -2;\r\n private static readonly TWO_BYTES_SIZE = 2;\r\n private static readonly THREE_BYTES_SIZE = 3;\r\n\r\n private readonly _blockReader: BlockReader;\r\n private readonly _transformProcessor: TransformProcessor;\r\n private readonly _addressingModeHandler: AddressingModeHandler;\r\n private readonly _romDataReader: RomDataReader;\r\n\r\n constructor(blockReader: BlockReader) {\r\n this._blockReader = blockReader;\r\n this._transformProcessor = new TransformProcessor(blockReader);\r\n this._addressingModeHandler = new AddressingModeHandler(blockReader, this._transformProcessor);\r\n this._romDataReader = blockReader._romDataReader;\r\n }\r\n\r\n public parseAsm(reg: Registers): Op {\r\n const opStart = this._romDataReader.position;\r\n const opCode = this._romDataReader.readByte();\r\n \r\n // Find matching OpCode in the database\r\n const code = this._blockReader._root.opCodes[opCode];\r\n if (!code) {\r\n throw new Error('Unknown OpCode');\r\n }\r\n\r\n // Initialize operation context\r\n const operationContext = this.initializeOperation(code, reg, opStart);\r\n\r\n // Process operands based on the addressing mode\r\n const operands = this._addressingModeHandler.processAddressingMode(code, operationContext, reg);\r\n \r\n // Apply label transforms to operands after processing. This ensures that the ROM state is processed and valid.\r\n this._transformProcessor.applyTransforms(operationContext.xForm1, operationContext.xForm2, operands);\r\n\r\n const op = new Op(\r\n code,\r\n opStart,\r\n operands,\r\n this._romDataReader.position - opStart\r\n );\r\n\r\n if (operationContext.copDef) {\r\n op.copDef = operationContext.copDef;\r\n }\r\n\r\n return op;\r\n }\r\n\r\n public clearDestinationRegister(code: OpCode, reg: Registers): void {\r\n switch (code.mnem) {\r\n case 'LDA':\r\n reg.accumulator = undefined;\r\n break;\r\n case 'LDX':\r\n reg.xIndex = undefined;\r\n break;\r\n case 'LDY':\r\n reg.yIndex = undefined;\r\n break;\r\n }\r\n }\r\n\r\n private initializeOperation(code: OpCode, reg: Registers, loc: number): OperationContext {\r\n // Calculate instruction size (some are variable)\r\n const size = this.calculateInstructionSize(code, reg);\r\n\r\n // Calculate next address (for branching)\r\n const next = loc + size;\r\n\r\n // Clear destination register for load operations. This resets the register state\r\n this.clearDestinationRegister(code, reg);\r\n\r\n const context = new OperationContext();\r\n context.size = size;\r\n context.nextAddress = next;\r\n context.xForm1 = this._transformProcessor.getTransform();\r\n context.xForm2 = null;\r\n context.copDef = null;\r\n\r\n return context;\r\n }\r\n\r\n private calculateInstructionSize(code: OpCode, reg: Registers): number {\r\n const addrMode = this._blockReader._root.addrLookup[code.mode];\r\n let size = addrMode.size;\r\n \r\n if (size === AsmReader.VARIABLE_SIZE_INDICATOR || code.mode === 'Immediate') {\r\n if((code.code & AsmReader.PROCESSOR_FLAG_MASK) === 0xC2){\r\n size = AsmReader.TWO_BYTES_SIZE;\r\n } else if ((code.code & AsmReader.ACCUMULATOR_OP_MASK) === AsmReader.ACCUMULATOR_OP_VALUE) {\r\n size = (reg.accumulatorFlag ?? false) ? AsmReader.TWO_BYTES_SIZE : AsmReader.THREE_BYTES_SIZE;\r\n } else {\r\n size = (reg.indexFlag ?? false) ? AsmReader.TWO_BYTES_SIZE : AsmReader.THREE_BYTES_SIZE;\r\n }\r\n }\r\n \r\n return size;\r\n }\r\n} ","/**\r\n * Represents the stack for the 65816 processor\r\n */\r\nexport class Stack {\r\n public bytes: Uint8Array;\r\n public location: number;\r\n\r\n constructor() {\r\n this.bytes = new Uint8Array(70);\r\n this.location = 10;\r\n }\r\n\r\n /**\r\n * Push a byte onto the stack\r\n */\r\n public push(value: number): void {\r\n this.bytes[this.location++] = value & 0xFF;\r\n }\r\n\r\n /**\r\n * Push a 16-bit value onto the stack (little-endian)\r\n */\r\n public pushUInt16(value: number): void {\r\n this.bytes[this.location++] = value & 0xFF;\r\n this.bytes[this.location++] = (value >> 8) & 0xFF;\r\n }\r\n\r\n /**\r\n * Pop a byte from the stack\r\n */\r\n public popByte(): number {\r\n return this.bytes[--this.location];\r\n }\r\n\r\n /**\r\n * Pop a 16-bit value from the stack (little-endian)\r\n */\r\n public popUInt16(): number {\r\n const high = this.bytes[--this.location];\r\n const low = this.bytes[--this.location];\r\n return (high << 8) | low;\r\n }\r\n\r\n /**\r\n * Reset the stack to initial state\r\n */\r\n public reset(): void {\r\n this.bytes.fill(0);\r\n this.location = 10;\r\n }\r\n} ","import { StatusFlags } from '@gaialabs/shared';\nimport { Stack } from './Stack';\n\n/**\n * Manages the 65816 processor registers and status flags\n */\nexport class Registers {\n public accumulatorFlag?: boolean;\n public indexFlag?: boolean;\n public direct?: number;\n public dataBank?: number;\n public accumulator?: number;\n public xIndex?: number;\n public yIndex?: number;\n public stack: Stack;\n\n constructor() {\n this.stack = new Stack();\n }\n\n /**\n * Get the current status flags\n */\n public get statusFlags(): StatusFlags {\n let flags = 0;\n if (this.accumulatorFlag ?? false) {\n flags |= StatusFlags.AccumulatorMode;\n }\n if (this.indexFlag ?? false) {\n flags |= StatusFlags.IndexMode;\n }\n return flags;\n }\n\n /**\n * Set the status flags\n */\n public set statusFlags(value: StatusFlags) {\n this.accumulatorFlag = (value & StatusFlags.AccumulatorMode) !== 0;\n this.indexFlag = (value & StatusFlags.IndexMode) !== 0;\n }\n\n /**\n * Reset all registers to initial state\n */\n public reset(): void {\n this.accumulatorFlag = undefined;\n this.indexFlag = undefined;\n this.direct = undefined;\n this.dataBank = undefined;\n this.accumulator = undefined;\n this.xIndex = undefined;\n this.yIndex = undefined;\n this.stack.reset();\n }\n} ","import { Registers } from '../../assembly';\nimport { Op } from '@gaialabs/shared';\nimport { RomDataReader } from './reader';\nimport { ProcessorStateManager } from './processor';\nimport { ReferenceManager } from './references';\nimport { StringReader } from './strings';\nimport { AsmReader } from './asm';\nimport { TypeParser } from './parser';\nimport { \n Address, \n AddressType, \n LocationWrapper, \n StructDef, \n RegisterType,\n BlockReaderConstants,\n RomProcessingConstants,\n TableEntry,\n createTableEntry,\n BinType,\n AsmBlock,\n createChunkFileFromDbFile,\n createChunkFileFromDbBlock,\n} from '@gaialabs/shared';\nimport type { DbFile, StringWrapper } from '@gaialabs/shared';\nimport type { DbRoot } from '@gaialabs/shared';\nimport type { DbBlock } from '@gaialabs/shared';\nimport type { DbPart } from '@gaialabs/shared';\nimport { ChunkFile, ChunkFileUtils } from '@gaialabs/shared';\nimport { indexOfAny } from '../../utils';\nimport { registerCompressionProviders } from '../../compression/registry'\n\nregisterCompressionProviders();\n\n/**\n * Central class for reading and analyzing ROM blocks\n * Converted from GaiaLib/Rom/Extraction/BlockReader.cs\n */\nexport class BlockReader {\n // Constants\n private static readonly REF_SEARCH_MAX_RANGE = 0x1A0;\n private static readonly BANK_MASK_CHECK = 0x40;\n private static readonly BYTE_DELIMITER_THRESHOLD = 0x100;\n private static readonly BANK_HIGH_MEMORY_1 = 0x7E;\n private static readonly BANK_HIGH_MEMORY_2 = 0x7F;\n private static readonly POINTER_CHARACTERS = ['&', '@'];\n\n // Location regex pattern: _([A-Fa-f0-9]{6})\n private static readonly LOCATION_REGEX = /_([A-Fa-f0-9]{6})/;\n\n // Core Dependencies\n public readonly _root: DbRoot;\n public readonly _stringReader: StringReader;\n public readonly _asmReader: AsmReader;\n public readonly _typeParser: TypeParser;\n public readonly _romDataReader: RomDataReader;\n public readonly _stateManager: ProcessorStateManager;\n public readonly _referenceManager: ReferenceManager;\n\n // Backward Compatibility Properties\n public get AccumulatorFlags(): Map<number, boolean | null> {\n return this._stateManager.accumulatorFlags;\n }\n\n public get IndexFlags(): Map<number, boolean | null> {\n return this._stateManager.indexFlags;\n }\n\n public get BankNotes(): Map<number, number | null> {\n return this._stateManager.bankNotes;\n }\n\n public get StackPosition(): Map<number, number> {\n return this._stateManager.stackPositions;\n }\n\n // Direct access to reference management collections\n public get _structTable(): Map<number, string> {\n return this._referenceManager.structTable;\n }\n\n public get _markerTable(): Map<number, number> {\n return this._referenceManager.markerTable;\n }\n\n public get _nameTable(): Map<number, string> {\n return this._referenceManager.nameTable;\n }\n\n // Current Processing State (Database)\n //public _currentBlock!: DbBlock;\n //public _currentPart: DbPart | null = null;\n public _partEnd: number = 0;\n \n // ChunkFile Processing State\n public _currentChunk: ChunkFile | null = null;\n public _currentAsmBlock: AsmBlock | null = null;\n public _enrichedChunks: ChunkFile[] = [];\n\n constructor(romData: Uint8Array, root: DbRoot) {\n this._romDataReader = new RomDataReader(romData);\n this._stateManager = new ProcessorStateManager();\n this._referenceManager = new ReferenceManager(root);\n this._root = root;\n\n this._stringReader = new StringReader(this as any);\n this._asmReader = new AsmReader(this as any);\n this._typeParser = new TypeParser(this as any);\n\n this.initializeOverrides();\n this.initializeFileReferences();\n }\n\n /**\n * Processes predefined overrides for registers and bank notes\n */\n private initializeOverrides(): void {\n for (const over of Object.values(this._root.overrides)) {\n switch (over.register) {\n case RegisterType.M:\n this._stateManager.setAccumulatorFlag(over.location, over.value === 1);\n break;\n case RegisterType.X:\n this._stateManager.setIndexFlag(over.location, over.value === 1);\n break;\n case RegisterType.B:\n this._stateManager.setBankNote(over.location, over.value);\n break;\n }\n }\n }\n\n /**\n * Processes predefined file references\n */\n private initializeFileReferences(): void {\n for (const file of this._root.files) {\n this._referenceManager.tryAddName(file.start, file.name);\n }\n }\n\n /**\n * Resolves mnemonic for a given address\n */\n public resolveMnemonic(addr: Address): void {\n // If the address is in high memory (ROM only), skip processing\n if ((addr.bank & Address.DATA_BANK_FLAG) !== 0) {\n return;\n }\n\n let offset = addr.offset;\n \n const label = this._root.mnemonics[offset];\n if (!label) {\n return;\n }\n\n const ix = indexOfAny(label, RomProcessingConstants.OPERATORS);\n if (ix >= 0) {\n let opnd = parseInt(label.substring(ix + 1), 16);\n const op = label[ix];\n if(op === '-')\n opnd = -opnd;\n \n offset -= opnd;\n }\n\n // Add to current block's mnemonics\n this._currentChunk!.mnemonics[offset] = label.substring(0, ix >= 0 ? ix : label.length);\n }\n\n /**\n * Resolves name for a location (delegated to ReferenceManager)\n */\n public resolveName(location: number, type: AddressType, isBranch: boolean): string {\n return this._referenceManager.resolveName(location, type, isBranch);\n }\n\n /**\n * Resolves include for a location\n */\n public resolveInclude(loc: number, isBranch: boolean): void {\n const [outside, foundBlock, foundPart] = ChunkFileUtils.isOutsideWithPart(this._enrichedChunks, this._currentChunk!, loc);\n if (outside && foundBlock && foundPart) {\n this._currentAsmBlock!.includes!.add({block: foundBlock, part: foundPart});\n } else if (isBranch && !this._referenceManager.tryGetName(loc).found) {\n const name = `loc_${loc.toString(16).toUpperCase().padStart(6, '0')}`;\n this._referenceManager.tryAddName(loc, name);\n }\n }\n\n /**\n * Notes a type at a location and manages chunk references\n */\n public noteType(loc: number, type: string, silent: boolean = false, reg?: Registers): string {\n this._referenceManager.tryAddStruct(loc, type);\n\n const nameResult = this._referenceManager.tryGetName(loc);\n let name: string;\n \n if (!nameResult.found) {\n name = this._referenceManager.createTypeName(type, loc);\n this._referenceManager.tryAddName(loc, name);\n } else {\n name = nameResult.referenceName!;\n }\n\n if (!silent && type === BlockReaderConstants.CODE_TYPE && reg) {\n this.updateRegisterState(loc, reg);\n }\n\n return name;\n }\n\n private updateRegisterState(loc: number, reg: Registers): void {\n if (reg.accumulatorFlag !== undefined) {\n this._stateManager.tryAddAccumulatorFlag(loc, reg.accumulatorFlag);\n }\n if (reg.indexFlag !== undefined) {\n this._stateManager.tryAddIndexFlag(loc, reg.indexFlag);\n }\n if (reg.stack.location > 0) {\n this._stateManager.tryAddStackPosition(loc, reg.stack.location);\n }\n }\n\n /**\n * Checks if a delimiter has been reached\n */\n public delimiterReached(delimiter?: number): boolean {\n if (delimiter === undefined) {\n return false;\n }\n\n if (delimiter >= BlockReaderConstants.BYTE_DELIMITER_THRESHOLD) {\n if (this._romDataReader.peekShort() === delimiter) {\n this._romDataReader.position += 2;\n return true;\n }\n } else if (this._romDataReader.peekByte() === delimiter) {\n this._romDataReader.position++;\n return true;\n }\n\n return false;\n }\n\n /**\n * Checks if processing of the current part can continue\n */\n public partCanContinue(): boolean {\n return this._romDataReader.position < this._partEnd && \n !this._referenceManager.containsStruct(this._romDataReader.position);\n }\n\n public analyzeAndResolve(): ChunkFile[] {\n this.createChunkFilesFromDatabase();\n this.initializeBlocksAndParts();\n this.analyzeChunkFiles();\n this.resolveReferences();\n \n return this._enrichedChunks;\n }\n\n /**\n * Analyzes all blocks in the ROM\n */\n // private analyzeBlocks(): void {\n // this.initializeBlocksAndParts();\n\n // for (const chunk of this._enrichedChunks) {\n // this._currentChunk = chunk;\n // for (const part of chunk.parts || []) {\n // this.processPart(part);\n // }\n // }\n // }\n\n /**\n * Initializes blocks and parts with base references\n */\n private initializeBlocksAndParts(): void {\n for (const block of this._enrichedChunks) {\n for (const part of block.parts || []) {\n if(part.structName) {\n this._referenceManager.tryAddStruct(part.location, part.structName);\n }\n if(part.label) {\n this._referenceManager.tryAddName(part.location, part.label);\n }\n }\n }\n }\n\n /**\n * Processes a single part\n */\n private processPart(part: AsmBlock): void {\n this._currentAsmBlock = part;\n this._romDataReader.position = part.location;\n this._partEnd = part.location + part.size;\n\n let current = part.structName || BlockReaderConstants.BINARY_TYPE;\n const chunks: TableEntry[] = [];\n const reg = new Registers();\n const bank = part.bank;\n let last: TableEntry | null = null;\n\n while (this._romDataReader.position < this._partEnd) {\n const structResult = this._referenceManager.tryGetStruct(this._romDataReader.position);\n if (structResult.found) {\n current = structResult.chunkType!;\n } else if (last !== null) {\n this.processContinuousEntry(current, reg, bank, last);\n continue;\n }\n\n last = createTableEntry(this._romDataReader.position);\n chunks.push(last);\n this.processNewEntry(current, reg, bank, last);\n }\n\n part.objList = chunks;\n }\n\n /**\n * Processes a continuous entry (same type as previous)\n */\n private processContinuousEntry(current: string, reg: Registers, bank: number | undefined, last: TableEntry): void {\n const obj = this._typeParser.parseType(current, reg, 0, bank);\n if (!Array.isArray(last.object)) {\n last.object = [last.object];\n }\n (last.object as unknown[]).push(obj);\n }\n\n /**\n * Processes a new entry\n */\n private processNewEntry(current: string, reg: Registers, bank: number | undefined, last: TableEntry): void {\n let res = this._typeParser.parseType(current, reg, 0, bank);\n if (BlockReaderConstants.POINTER_CHARACTERS.includes(current[0]) && !Array.isArray(res)) {\n res = [res];\n }\n last.object = res;\n }\n\n /**\n * Creates ChunkFile objects from database structure\n */\n private createChunkFilesFromDatabase(): void {\n // Clear any previous results\n this._enrichedChunks = [];\n this.createChunkFilesFromSfx();\n // Convert DbFiles to binary ChunkFiles with rawData\n this.createChunkFilesFromDbFiles();\n // Convert DbBlocks to assembly ChunkFiles with parts\n this.createChunkFilesFromDbBlocks();\n }\n\n /**\n * Creates binary ChunkFiles from DbFiles (enriched with rawData)\n */\n private createChunkFilesFromSfx(): void {\n let pos = this._root.config.sfxLocation;\n const count = this._root.config.sfxCount;\n const romData = this._romDataReader.romData;\n\n const getSize = () => romData[pos++] | (romData[pos++] << 8);\n\n for (let i = 0; i < count; i++) {\n const size = getSize();\n const startPos = pos;\n let remaining = size;\n\n let end = pos + remaining;\n let data: Uint8Array;\n if (end & RomProcessingConstants.PAGE_SIZE) {\n const endLen = end & 0x7FFF;\n remaining -= endLen;\n data = romData.slice(pos, pos + remaining);\n pos += remaining + RomProcessingConstants.PAGE_SIZE;\n end = pos + endLen;\n const data2 = romData.slice(pos, end);\n data = new Uint8Array([...data, ...data2]);\n } else {\n data = romData.slice(pos, end);\n }\n pos = end;\n\n const chunk = new ChunkFile(`sfx${i.toString(16).toUpperCase().padStart(2, '0')}`, size, startPos, BinType.Sound);\n chunk.rawData = data;\n this._enrichedChunks.push(chunk);\n }\n }\n\n /**\n * Creates binary ChunkFiles from DbFiles (enriched with rawData)\n */\n private createChunkFilesFromDbFiles(): void {\n for (const dbFile of this._root.files) {\n const chunkFile = createChunkFileFromDbFile(this._romDataReader.romData, this._root.compression, dbFile);\n this._enrichedChunks.push(chunkFile);\n }\n }\n\n /**\n * Creates assembly ChunkFiles from DbBlocks (enriched with parts)\n */\n private createChunkFilesFromDbBlocks(): void {\n for (const block of this._root.blocks) {\n const chunkFile = createChunkFileFromDbBlock(block);\n this._enrichedChunks.push(chunkFile);\n }\n }\n /**\n * Analyzes only assembly ChunkFiles (those with parts from DbBlocks)\n */\n private analyzeChunkFiles(): void {\n // Only process assembly ChunkFiles, skip binary ones\n const assemblyChunks = this._enrichedChunks.filter(chunk => chunk.type === BinType.Assembly);\n \n for (const chunkFile of assemblyChunks) {\n this._currentChunk = chunkFile;\n for (const asmBlock of chunkFile.parts || []) {\n this._currentAsmBlock = asmBlock;\n this.processPart(asmBlock);\n }\n }\n }\n\n // /**\n // * Processes a single AsmBlock (similar to processPart)\n // */\n // private processAsmBlock(asmBlock: AsmBlock): void {\n // this._romDataReader.position = asmBlock.location;\n // this._partEnd = asmBlock.location + asmBlock.size;\n\n // let current = asmBlock.structName || BlockReaderConstants.BINARY_TYPE;\n // const chunks: TableEntry[] = [];\n // const reg = new Registers();\n // const bank = this._currentAsmBlock?.bank;\n // let last: TableEntry | null = null;\n\n // while (this._romDataReader.position < this._partEnd) {\n // const structResult = this._referenceManager.tryGetStruct(this._romDataReader.position);\n // if (structResult.found) {\n // current = structResult.chunkType!;\n // } else if (last !== null) {\n // this.processContinuousEntry(current, reg, bank, last);\n // continue;\n // }\n\n // last = createTableEntry(this._romDataReader.position);\n // chunks.push(last);\n // this.processNewEntry(current, reg, bank, last);\n // }\n\n // asmBlock.objList = chunks;\n // }\n\n /**\n * Resolves references in assembly ChunkFiles only\n */\n private resolveReferences(): void {\n for (const chunkFile of this._enrichedChunks) {\n this._currentChunk = chunkFile;\n \n for (const asmBlock of chunkFile.parts || []) {\n this._currentAsmBlock = asmBlock;\n this.resolveObject(asmBlock.objList, false);\n }\n }\n }\n\n /**\n * Resolves a single object and its references\n */\n private resolveObject(obj: unknown, isBranch: boolean): void {\n if (typeof obj === 'string') {\n // String objects don't need resolution\n return;\n }\n\n if (Array.isArray(obj)) {\n for (const o of obj) {\n this.resolveObject(o, isBranch);\n }\n return;\n }\n\n if (obj instanceof Address) {\n this.resolveMnemonic(obj);\n return;\n }\n\n if (typeof obj === 'number') {\n this.resolveInclude(obj, isBranch);\n return;\n }\n\n if (obj instanceof LocationWrapper) {\n this.resolveInclude(obj.location, isBranch);\n return;\n }\n\n if (obj && typeof obj === 'object') {\n if ('string' in obj && 'type' in obj) {\n // StringWrapper\n this._stringReader.resolveString(obj as StringWrapper, isBranch);\n return;\n }\n\n if ('name' in obj && 'parts' in obj) {\n // StructDef\n this.resolveObject((obj as StructDef).parts, isBranch);\n return;\n }\n\n if ('location' in obj && 'object' in obj) {\n // TableEntry\n this.resolveObject((obj as TableEntry).object, isBranch);\n return;\n }\n\n if ('code' in obj && 'operands' in obj) {\n // Op\n this.resolveOperationObject(obj as Op);\n return;\n }\n }\n }\n\n /**\n * Resolves references in an operation object\n */\n private resolveOperationObject(op: Op): void {\n const branch = this.isBranchOperation(op);\n for (const opnd of op.operands) {\n this.resolveObject(opnd, branch);\n }\n }\n\n /**\n * Checks if an operation is a branch operation\n */\n private isBranchOperation(op: Op): boolean {\n return op.mode === 'PCRelative' ||\n op.mode === 'PCRelativeLong' ||\n op.mnem[0] === 'J';\n }\n\n /**\n * Hydrates registers with stored state\n */\n public hydrateRegisters(reg: Registers): void {\n this._stateManager.hydrateRegisters(this._romDataReader.position, reg);\n }\n\n}","import { ChunkFile, DbBlock } from '@gaialabs/shared';\nimport { TableEntry } from '@gaialabs/shared';\nimport { StructDef, Word } from '@gaialabs/shared';\nimport { BlockReader } from './blocks';\nimport { ReferenceManager } from './references';\n\n/**\n * Handles post processing of extracted blocks.\n * Mirrors functionality of GaiaLib.Rom.Extraction.PostProcessor.\n */\nexport class PostProcessor {\n private readonly _referenceManager: ReferenceManager;\n\n constructor(reader: BlockReader) {\n this._referenceManager = reader._referenceManager;\n }\n\n /**\n * Execute post process directive on a block if present.\n */\n public process(block: ChunkFile): void {\n if (!block.postProcess || block.postProcess.trim() === '') {\n return;\n }\n\n let signature = block.postProcess;\n const parts: string[] = [];\n\n const index = signature.indexOf('(');\n if (index > 0) {\n const endIx = signature.indexOf(')', index);\n const params = signature.substring(\n index + 1,\n endIx >= 0 ? endIx : signature.length\n );\n if (params.length > 0) {\n for (const p of params.split(',')) {\n parts.push(p.trim());\n }\n }\n signature = signature.substring(0, index);\n }\n\n const fn = (this as any)[signature];\n if (typeof fn !== 'function') {\n throw new Error(`Unable to locate postprocess function ${signature}`);\n }\n fn.apply(this, [block, ...parts]);\n }\n\n /**\n * Builds a lookup table from struct entries.\n * Equivalent to PostProcessor.Lookup in C# implementation.\n */\n public Lookup(block: ChunkFile, keyIx: string, valueIx: string): void {\n const kix = parseInt(keyIx.trim());\n const vix = parseInt(valueIx.trim());\n\n if(!block.parts || block.parts.length === 0) {\n throw new Error('Invalid block structure for Lookup post process');\n }\n\n const table = block.parts[0]?.objList;\n const tableEntry = table && table[0];\n const entries = tableEntry?.object as unknown[] | undefined;\n\n if (!tableEntry || !entries) {\n throw new Error('Invalid table structure for Lookup post process');\n }\n\n const newParts: TableEntry[] = [];\n const newList: any[] = [];\n\n newParts.push({ location: tableEntry.location, object: newList });\n\n let eIx = 1;\n for (const entry of entries as StructDef[]) {\n if (!entry || !Array.isArray((entry as any).parts)) {\n continue;\n }\n const struct = entry as StructDef;\n let cIx = 0;\n let key: number | null = null;\n let value: unknown = null;\n\n for (const obj of struct.parts) {\n if (cIx === kix) {\n if(obj && typeof obj === 'object' && 'value' in obj) {\n key = obj.value as number;\n } else {\n key = obj as number;\n }\n } else if (cIx === vix) {\n value = obj;\n }\n cIx++;\n }\n\n if (key === null || value === null) {\n throw new Error('Could not locate key or value for transform');\n }\n\n const name = `entry_${key.toString(16).toUpperCase().padStart(2, '0')}`;\n const loc = tableEntry.location + eIx;\n\n newParts.push({ location: loc, object: value });\n\n // Force labels to match the new name\n this._referenceManager.nameTable.set(loc, name);\n\n while (newList.length <= key) {\n newList.push(new Word(0));\n }\n\n newList[key] = `&${name}`;\n eIx++;\n }\n\n block.parts[0].objList = newParts;\n }\n}\n\nexport default PostProcessor;\n\n","import { Op } from '@gaialabs/shared';\nimport { AsmBlock, ChunkFile, ChunkFileUtils, TypedNumber } from '@gaialabs/shared';\nimport { \n DbRoot,\n AddressType, \n MemberType,\n AddressSpace,\n TableEntry,\n StructDef,\n StringWrapper,\n LocationWrapper,\n Address\n} from '@gaialabs/shared';\nimport { BlockReader } from './blocks';\nimport { ReferenceManager } from './references';\nimport { PostProcessor } from './postprocessor';\n\n// Platform detection that works in both Node.js and web environments\nconst isWindows = (() => {\n // Check if we're in Node.js environment\n if (typeof process !== 'undefined' && process.platform) {\n return process.platform === 'win32';\n }\n // In web environment, check user agent as fallback\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n return navigator.userAgent.includes('Windows');\n }\n // Default to Unix-style line endings if we can't determine\n return false;\n})();\n\nconst NEWLINE = isWindows ? '\\r\\n' : '\\n';\n\n// Type tags for better object identification\nexport enum ObjectType {\n TableEntryArray = 'TableEntryArray',\n StructDef = 'StructDef',\n OpArray = 'OpArray',\n LocationWrapper = 'LocationWrapper',\n Address = 'Address',\n StringWrapper = 'StringWrapper',\n ByteArray = 'ByteArray',\n Array = 'Array',\n String = 'String',\n Number = 'Number',\n TypedNumber = 'TypedNumber'\n}\n\nexport class BlockWriter {\n private _root: DbRoot;\n private _blockReader: BlockReader;\n private _referenceManager: ReferenceManager;\n private _postProcessor: PostProcessor;\n private _isInline: boolean = false;\n private _currentPart: AsmBlock | null = null;\n\n constructor(reader: BlockReader) {\n this._blockReader = reader;\n this._root = reader._root;\n this._referenceManager = reader._referenceManager;\n this._postProcessor = new PostProcessor(reader);\n }\n\n // async writeBlocks(outPath: string): Promise<void> {\n // const res = DbRootUtils.getPath(this._root, BinType.Assembly);\n\n // const folderPath = join(outPath, res.folder);\n\n // for (const block of this._root.blocks) {\n // const groupedFolderPath = block.group \n // ? join(folderPath, block.group)\n // : folderPath;\n \n // await fs.mkdir(groupedFolderPath, { recursive: true });\n\n // const outFile = join(groupedFolderPath, `${block.name}.${res.extension}`);\n \n // // Check if file exists, skip if it does\n // try {\n // await fs.access(outFile);\n // continue;\n // } catch {\n // // File doesn't exist, continue with creation\n // }\n\n // const content = this.generateAsm(block);\n \n // await fs.writeFile(outFile, content);\n // }\n // }\n\n generateAllAsm(chunkFiles: ChunkFile[]): any[] {\n const lines: any[] = [];\n for (const block of chunkFiles) {\n lines.push({\n name: block.name,\n group: block.group,\n text: this.generateAsm(block)\n });\n }\n return lines;\n }\n\n generateAsm(block: ChunkFile): string{\n if(!block.parts) {\n throw new Error('Invalid block structure for generateAsm');\n }\n\n const lines: string[] = [];\n\n // Write bank information if not movable\n if (block.bank !== undefined) {\n lines.push(`?BANK ${block.bank.toString(16).toUpperCase().padStart(2, '0')}`);\n }\n\n // Write includes - these should be from the block's include list\n const includes = ChunkFileUtils.getIncludes(block);\n if (includes && includes.length > 0) {\n lines.push('');\n for (const inc of includes) {\n lines.push(`?INCLUDE '${inc.name}'`);\n }\n }\n\n // Write mnemonics - these should be from the root mnemonics that are referenced in this block\n const mnemonics = this.getMnemonicsForBlock(block);\n if (mnemonics && mnemonics.length > 0) {\n lines.push('');\n for (const [name, address] of mnemonics) {\n const paddedName = name.padEnd(30, ' ');\n lines.push(`!${paddedName} ${address.toString(16).toUpperCase().padStart(4, '0')}`);\n }\n }\n\n // Apply any post processing defined for the block\n this._postProcessor.process(block);\n\n // Process each part\n for (const part of block.parts || []) {\n this._currentPart = part;\n this._isInline = true;\n\n lines.push('');\n lines.push('---------------------------------------------');\n\n const objectLines = this.writeObject(part.objList, -1);\n lines.push(...objectLines);\n }\n\n let content = lines.join(NEWLINE);\n\n // Apply replace transforms\n if (block.transforms) {\n for (const x of block.transforms) {\n if (x.key && x.value) {\n const regex = new RegExp(x.key, 'g');\n content = content.replace(regex, x.value);\n }\n }\n }\n\n if(!isWindows){\n content = content.replace(/\\r/g, '');\n }\n\n return content;\n };\n\n private getMnemonicsForBlock(block: ChunkFile): [string, number][] {\n if (!block.mnemonics) {\n return [];\n }\n\n return Object.entries(block.mnemonics)\n .map(([k, v]) => [v, parseInt(k, 10)] as [string, number])\n .sort((a, b) => a[1] - b[1]);\n }\n\n private resolveOperand(op: Op, obj: any, isBranch: boolean = false): any {\n\n if(obj instanceof TypedNumber) {\n const len = obj.size * 2;\n return obj.value.toString(16).toUpperCase().padStart(len, '0');\n }\n\n if (typeof obj === 'number') {\n if (op.mode === 'Immediate') {\n return obj;\n }\n return this._blockReader.resolveName(obj, AddressType.Address, isBranch);\n }\n \n if (this.getObjectType(obj) === ObjectType.LocationWrapper) {\n const lw = obj as LocationWrapper;\n return this._blockReader.resolveName(lw.location, lw.type, isBranch);\n }\n if (this.getObjectType(obj) === ObjectType.Address) {\n const addr = obj as Address;\n\n if (op.size === 4) {\n return addr;\n }\n\n if (addr.isCodeBank && addr.offset < Address.UPPER_BANK) {\n const label = this._root.mnemonics[addr.offset];\n if (label) {\n return label;\n }\n }\n\n return addr.offset;\n }\n\n // Preserve tag information on typed numbers without resolving names\n if (obj && obj instanceof TypedNumber) {\n // const typed = obj as { _tag: string; value: any };\n\n // // Byte/Word objects should remain untouched\n // if (typed._tag === 'Byte' || typed._tag === 'Word' || typed._tag === 'TypedNumber') {\n // return obj;\n // }\n\n // if (typeof typed.value === 'number' && op.mode !== 'Immediate') {\n // const resolved = this._blockReader.resolveName(typed.value, AddressType.Address, isBranch);\n // return { ...typed, value: resolved };\n // }\n return obj;\n }\n return obj;\n }\n\n private getObjectType(obj: any): ObjectType {\n if (obj === null || obj === undefined) {\n return ObjectType.String;\n }\n\n // Check for explicit type tags first\n if (obj._tag) {\n return obj._tag as ObjectType;\n }\n\n if (obj instanceof TypedNumber) {\n return ObjectType.TypedNumber;\n }\n\n // Duck typing fallbacks\n if (Array.isArray(obj)) {\n if (obj.length > 0) {\n if (obj[0] && typeof obj[0] === 'object' && 'location' in obj[0] && 'object' in obj[0]) {\n return ObjectType.TableEntryArray;\n }\n if (obj[0] instanceof Op) {\n return ObjectType.OpArray;\n }\n }\n return ObjectType.Array;\n }\n\n if (obj instanceof Op) {\n return ObjectType.OpArray;\n }\n\n if (obj instanceof LocationWrapper) {\n return ObjectType.LocationWrapper;\n }\n\n if (obj instanceof Address) {\n return ObjectType.Address;\n }\n\n if (obj instanceof Uint8Array) {\n return ObjectType.ByteArray;\n }\n\n if (obj && typeof obj === 'object') {\n if ('string' in obj && 'type' in obj && 'marker' in obj && 'location' in obj) {\n return ObjectType.StringWrapper;\n }\n if ('name' in obj && 'parts' in obj) {\n return ObjectType.StructDef;\n }\n }\n\n if (typeof obj === 'string') {\n return ObjectType.String;\n }\n\n if (typeof obj === 'number') {\n return ObjectType.Number;\n }\n\n return ObjectType.String;\n }\n\n private writeObject(obj: any, depth: number, isBranch: boolean = false): string[] {\n const lines: string[] = [];\n\n const objType = this.getObjectType(obj);\n let objLines: string[];\n\n switch (objType) {\n case ObjectType.TableEntryArray:\n objLines = this.writeTableEntryArray(obj as TableEntry[], depth);\n break;\n\n case ObjectType.StructDef:\n objLines = this.writeStructDef(obj as StructDef, depth);\n break;\n\n case ObjectType.OpArray:\n objLines = this.writeOpArray(obj as Op[], depth);\n break;\n\n case ObjectType.LocationWrapper:\n objLines = [\n this._blockReader.resolveName(\n (obj as LocationWrapper).location,\n (obj as LocationWrapper).type,\n isBranch\n ),\n ];\n break;\n\n case ObjectType.Address:\n objLines = [`$${(obj as Address).toString()}`];\n break;\n\n case ObjectType.ByteArray:\n objLines = [\n `#${Array.from(obj as Uint8Array)\n .map(b => b.toString(16).toUpperCase().padStart(2, '0'))\n .join('')}`,\n ];\n break;\n\n case ObjectType.StringWrapper:\n objLines = this.writeStringWrapper(obj as StringWrapper);\n break;\n\n case ObjectType.Array:\n objLines = this.writeArray(obj as any[], depth);\n break;\n\n case ObjectType.Number:\n objLines = this.writeNumber(obj as number);\n break;\n\n case ObjectType.TypedNumber:\n objLines = this.writeTypedNumber(obj as any);\n break;\n\n case ObjectType.String:\n objLines = [String(obj)];\n break;\n\n default:\n objLines = [String(obj)];\n break;\n }\n\n lines.push(...objLines);\n\n return lines;\n }\n\n private writeTableEntryArray(tGroup: TableEntry[], depth: number): string[] {\n const lines: string[] = [];\n const isInline = this._isInline;\n //this._isInline = true;\n\n for (const t of tGroup) {\n const nameResult = this._referenceManager.tryGetName(t.location);\n const name = nameResult.found ? nameResult.referenceName! : `loc_${t.location.toString(16).toUpperCase().padStart(6, '0')}`;\n \n const objectLines = this.writeObject(t.object, depth + 1);\n lines.push('');\n lines.push(`${name} ${objectLines[0]}`);\n if (objectLines.length > 1) {\n lines.push(...objectLines.slice(1));\n }\n }\n \n this._isInline = isInline;\n return lines;\n }\n\n private writeStructDef(structObj: StructDef, depth: number): string[] {\n const parts: string[] = [];\n const isInline = this._isInline;\n this._isInline = true;\n for (const part of structObj.parts) {\n const partLines = this.writeObject(part, depth);\n parts.push(partLines.join(NEWLINE));\n }\n const line = `${structObj.name} < ${parts.join(', ')} >`;\n this._isInline = isInline; // match C# spacing behaviour\n return [line];\n }\n\n private writeOpArray(opList: Op[], depth: number): string[] {\n const lines: string[] = [];\n lines.push('{');\n const isInline = this._isInline;\n this._isInline = true; // instructions follow immediately\n \n let first = true;\n for (const op of opList) {\n if (first) {\n first = false;\n } else {\n // Check for labels on subsequent instructions\n const labelResult = this._referenceManager.tryGetName(op.location);\n if (labelResult.found) {\n lines.push('');\n lines.push(` ${labelResult.referenceName}:`);\n }\n }\n\n let opLine = ` ${op.mnem} `;\n\n if (op.copDef) {\n // Handle COP instructions specially\n opLine += `[${op.copDef.mnem}]`;\n if (op.operands && op.operands.length > 1) {\n const operandStrings: string[] = [];\n for (let i = 1; i < op.operands.length; i++) {\n const operandLines = this.writeObject(op.operands[i], depth + 1, false);\n operandStrings.push(operandLines[0]);\n }\n opLine += ` ( ${operandStrings.join(', ')} )`;\n }\n } else if (op.operands && op.operands.length > 0) {\n const isBr = op.mnem[0] === 'J' || \n op.mode === 'PCRelative' ||\n op.mode === 'PCRelativeLong';\n\n // Regular instruction formatting\n const resolvedOperand = this.resolveOperand(op, op.operands[0], isBr);\n const format = this._root.addrLookup[op.mode]?.formatString; // || this._root.config.asmFormats?.[op.code.mode];\n \n if (format) {\n let actualFormat = format;\n if (op.mode === 'Immediate' && op.size === 3) {\n actualFormat = format.replace('X2', 'X4');\n }\n const resolvedSecondOperand = op.operands.length > 1 ? this.resolveOperand(op, op.operands[1], isBr) : undefined;\n opLine += this.formatOperand(actualFormat, [resolvedOperand, resolvedSecondOperand]);\n } else {\n // Default formatting based on operand type\n opLine += this.formatDefaultOperand(resolvedOperand, op.size);\n }\n }\n \n lines.push(opLine);\n }\n \n lines.push('}');\n this._isInline = isInline; // ensure following object is separated by blank line\n return lines;\n }\n\n private formatDefaultOperand(operand: any, size: number): string {\n if (typeof operand === 'string') {\n return operand; // Already formatted\n }\n\n if (operand && operand instanceof TypedNumber) {\n return this.formatTypedNumber(operand);\n }\n\n if (typeof operand === 'number') {\n const hexSize = (size - 1) * 2;\n const hex = operand.toString(16).toUpperCase().padStart(hexSize, '0');\n return `$${hex}`;\n }\n \n return String(operand);\n }\n\n private writeStringWrapper(stringObj: StringWrapper): string[] {\n let str = stringObj.string;\n \n // Process string references\n const stringReferenceChars = ['~', '^'];\n for (const char of stringReferenceChars) {\n let ix = str.indexOf(char);\n while (ix >= 0) {\n const hexStr = str.substring(ix + 1, ix + 7);\n const rawAddr = parseInt(hexStr, 16);\n const adrs = new Address((rawAddr >> 16) & 0xFF, rawAddr & 0xFFFF);\n \n if (adrs.space === AddressSpace.ROM) {\n const addressType = char === '^' ? AddressType.Offset : AddressType.Address;\n const location = adrs.toInt();\n const name = this._blockReader.resolveName(location, addressType, false);\n str = str.replace(str.substring(ix, ix + 7), name);\n } else {\n throw new Error('Unsupported address space');\n }\n \n ix = str.indexOf(char, ix + 7);\n }\n }\n\n const refChar = stringObj.type.delimiter;\n let marker = stringObj.marker;\n \n if (marker <= 0) {\n const markerResult = this._referenceManager.tryGetMarker(stringObj.location);\n marker = markerResult.found ? markerResult.offset || 0 : 0;\n }\n\n if (marker > 0) {\n let six = 0;\n let mix = 0;\n \n while (mix < marker) {\n if (str[six] === '[') {\n const eix = str.indexOf(']', ++six);\n const parts = str.substring(six, eix).split(/[,: ]/);\n \n const cmd = Object.values(stringObj.type.commands).find((x: any) => x.value === parts[0]);\n if (cmd && (cmd as any).types) {\n for (const t of (cmd as any).types) {\n switch (t) {\n case MemberType.Byte:\n mix += 1;\n break;\n case MemberType.Word:\n case MemberType.Offset:\n mix += 2;\n break;\n case MemberType.Address:\n mix += 3;\n break;\n case MemberType.Binary:\n mix += parts.length - 1;\n break;\n default:\n throw new Error('Unsupported member type');\n }\n }\n }\n six = eix + 1;\n mix++;\n } else {\n six++;\n mix++;\n }\n }\n \n str = str.substring(0, six) + '[::]' + str.substring(six);\n }\n\n return [`${refChar}${str}${refChar}`];\n }\n\n private writeArray(arr: any[], depth: number): string[] {\n const lines: string[] = [];\n const indent = ' '.repeat(Math.max(0, depth));\n const isInline = this._isInline;\n lines.push('[');\n this._isInline = false; // start elements on their own lines\n\n for (let i = 0; i < arr.length; i++) {\n const objLines = this.writeObject(arr[i], depth + 1);\n for(const line of objLines) {\n lines.push(indent + ' ' + line);\n }\n lines[lines.length - 1] += ` ;${i.toString(16).toUpperCase().padStart(2, '0')}`;\n }\n\n lines.push(indent + ']');\n this._isInline = isInline;\n return lines;\n }\n\n private writeNumber(num: number): string[] {\n // Format numbers based on value and size\n if (num <= 0xff) {\n // Mirror C# BlockWriter: bytes omit the '$' prefix\n return [`#${num.toString(16).toUpperCase().padStart(2, '0')}`];\n }\n\n if (num <= 0xffff) {\n return [`#$${num.toString(16).toUpperCase().padStart(4, '0')}`];\n }\n\n return [`#$${num.toString(16).toUpperCase().padStart(6, '0')}`];\n }\n\n private formatTypedNumber(num: TypedNumber): string {\n if (typeof num.value === 'number') {\n const width = num.size * 2;\n const hex = num.value.toString(16).toUpperCase().padStart(width, '0');\n return num.size === 1 ? `#${hex}` : `#$${hex}`;\n }\n\n return `#${num.value}`;\n }\n\n private writeTypedNumber(num: TypedNumber): string[] {\n return [this.formatTypedNumber(num)];\n }\n\n private formatOperand(format: string, operands: any[]): string {\n return format.replace(/\\{(\\d+)(?::([^}]+))?\\}/g, (match, index, formatSpec) => {\n const operand = operands[parseInt(index)];\n if (operand && typeof operand === 'object' && operand._tag && 'value' in operand) {\n const value = operand.value;\n if (formatSpec && typeof value === 'number' && formatSpec.startsWith('X')) {\n const width = parseInt(formatSpec.substring(1)) || 2;\n return value.toString(16).toUpperCase().padStart(width, '0');\n }\n return String(value);\n }\n\n if (formatSpec && typeof operand === 'number') {\n if (formatSpec.startsWith('X')) {\n const width = parseInt(formatSpec.substring(1)) || 2;\n return operand.toString(16).toUpperCase().padStart(width, '0');\n }\n }\n return String(operand);\n });\n }\n} ","import type { ChunkFile } from '@gaialabs/shared';\r\nimport { RomProcessingConstants } from '@gaialabs/shared';\r\n\r\n/**\r\n * ROM layout planner\r\n * Converted from ext/GaiaLib/Rom/Rebuild/RomLayout.cs\r\n */\r\nexport class RomLayout {\r\n private static readonly MIN_ACCEPTED_REMAINING = 0x20;\r\n\r\n public readonly unmatchedFiles: ChunkFile[];\r\n private readonly bestResult: number[] = new Array(0x200).fill(0);\r\n private readonly bestSample: number[] = new Array(0x200).fill(0);\r\n\r\n private currentBank = 0;\r\n private currentUpper = false;\r\n private bestDepth = 0;\r\n private bestOffset = 0;\r\n private bestRemain = 0;\r\n\r\n constructor(files: Iterable<ChunkFile>) {\r\n // Filter out zero-size files and order: assembly first, then by size desc\r\n this.unmatchedFiles = Array.from(files)\r\n .filter(x => (x.size || 0) > 0)\r\n .sort((a, b) => {\r\n const aAsm = a.parts ? 0 : 1;\r\n const bAsm = b.parts ? 0 : 1;\r\n if (aAsm !== bAsm) return aAsm - bAsm;\r\n if (b.size !== a.size) return b.size - a.size;\r\n if (a.location !== b.location) return a.location - b.location;\r\n return a.name.localeCompare(b.name);\r\n });\r\n }\r\n\r\n public organize(): void {\r\n for (let page = 0; page < 0x80; page++) {\r\n if (this.unmatchedFiles.length === 0) break;\r\n\r\n let remain = RomProcessingConstants.PAGE_SIZE;\r\n if (page === 1) remain -= RomProcessingConstants.SNES_HEADER_SIZE;\r\n\r\n this.currentUpper = (page & 1) !== 0;\r\n this.currentBank = page >> 1;\r\n this.bestDepth = 0;\r\n this.bestRemain = remain;\r\n this.bestOffset = 0;\r\n const start = page << 15; // 0x8000 per page\r\n\r\n // Pass 1: assembly preferred in upper banks\r\n this.testDepth(0, 0, remain, this.currentUpper);\r\n\r\n // Pass 2: if upper, also try binary-only fill\r\n if (this.currentUpper) {\r\n this.bestOffset = this.bestDepth;\r\n this.testDepth(0, this.bestDepth, this.bestRemain, false);\r\n }\r\n\r\n // Assign positions for best selection\r\n let position = start;\r\n for (let i = 0; i < this.bestDepth;) {\r\n const file = this.unmatchedFiles[this.bestResult[i++]];\r\n file.location = position;\r\n console.log(` ${position.toString(16).toUpperCase().padStart(6, '0')}: ${file.name}`);\r\n position += file.size || 0;\r\n }\r\n\r\n console.log(`Page ${start.toString(16).toUpperCase().padStart(6, '0')} matched with ${this.bestDepth} files ${this.bestRemain} remaining`);\r\n // Commit: remove placed files from queue\r\n this.commitPage();\r\n }\r\n\r\n if (this.unmatchedFiles.length > 0) {\r\n const names = this.unmatchedFiles.map(x => x.name).join('\\r\\n');\r\n throw new Error(`Unable to match ${this.unmatchedFiles.length} files\\r\\n${names}`);\r\n }\r\n }\r\n\r\n private testDepth(startIndex: number, depth: number, remain: number, asmMode: boolean): boolean {\r\n for (let fileIndex = startIndex; fileIndex < this.unmatchedFiles.length; fileIndex++) {\r\n const file = this.unmatchedFiles[fileIndex];\r\n\r\n const fileSize = file.size || 0;\r\n if (fileSize > remain) continue;\r\n\r\n // Assembly preference and constraints\r\n if (file.parts) {\r\n if (!asmMode) {\r\n if (!this.currentUpper || ((file.bank ?? -1) >= 0)) continue;\r\n } else if (file.bank !== this.currentBank) {\r\n continue;\r\n }\r\n } else if (asmMode) {\r\n continue;\r\n } else if (file.upper && !this.currentUpper) {\r\n continue;\r\n }\r\n\r\n // Skip if already selected in first pass window\r\n let inList = false;\r\n for (let y = this.bestOffset; --y >= 0;) {\r\n if (this.bestResult[y] === fileIndex) {\r\n inList = true;\r\n break;\r\n }\r\n }\r\n if (inList) continue;\r\n\r\n // Try this file at current depth\r\n this.bestSample[depth] = fileIndex;\r\n const newRemain = remain - fileSize;\r\n\r\n if (newRemain < this.bestRemain) {\r\n this.bestRemain = newRemain;\r\n this.bestDepth = depth + 1;\r\n for (let i = this.bestOffset; i < this.bestDepth; i++) {\r\n this.bestResult[i] = this.bestSample[i];\r\n }\r\n }\r\n\r\n if (newRemain < RomLayout.MIN_ACCEPTED_REMAINING) return true;\r\n\r\n if (this.testDepth(fileIndex + 1, depth + 1, newRemain, asmMode)) return true;\r\n }\r\n return true;\r\n }\r\n\r\n private commitPage(): void {\r\n if (this.bestOffset > 0) {\r\n for (let i = this.bestDepth; --i >= 0;) {\r\n let lastY = 0;\r\n let lastX = 0;\r\n let y = 0;\r\n for (let x = this.bestDepth; --x >= 0;) {\r\n y = this.bestResult[x];\r\n if (y > lastY) {\r\n lastY = y;\r\n lastX = x;\r\n }\r\n }\r\n this.bestResult[lastX] = 0;\r\n this.unmatchedFiles.splice(lastY, 1);\r\n }\r\n } else {\r\n for (let i = this.bestDepth; --i >= 0;) {\r\n this.unmatchedFiles.splice(this.bestResult[i], 1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n","import { BinType } from '@gaialabs/shared';\r\nimport { ChunkFileUtils, type ChunkFile } from '@gaialabs/shared';\r\nimport { RomLayout } from './layout';\r\nimport { RomWriter } from './writer';\r\nimport { DbEntryPoint } from '@gaialabs/shared';\r\n\r\n/**\r\n * ROM rebuild processor\r\n * Converted from ext/GaiaLib/Rom/Rebuild/RomProcessor.cs\r\n */\r\nexport class RomProcessor {\r\n private readonly writer: RomWriter;\r\n\r\n constructor(writer: RomWriter) {\r\n this.writer = writer;\r\n }\r\n\r\n public async repack(allFiles: ChunkFile[]): Promise<void> {\r\n // Discover files\r\n //const allFiles = await this.discoverFiles(this.writer._projectRoot.baseDir);\r\n\r\n const patches = allFiles.filter(x => x.type === BinType.Patch);\r\n const asmFiles = allFiles.filter(x => !!x.parts);\r\n\r\n // Assembly processing now happens in project.ts via ChunkBlockReader.analyzeAndResolveChunks()\r\n // This provides comprehensive cross-referencing and object graph generation\r\n\r\n // Apply patches to asm blocks\r\n RomProcessor.applyPatches(asmFiles, patches);\r\n\r\n // Calculate ASM sizes\r\n for (const asm of asmFiles) {\r\n ChunkFileUtils.calculateSize(asm);\r\n }\r\n\r\n // Assign locations\r\n const layout = new RomLayout(allFiles);\r\n layout.organize();\r\n\r\n // Rebase assemblies\r\n for (const file of asmFiles) {\r\n ChunkFileUtils.rebase(file);\r\n }\r\n\r\n // Build include lookup map per asm file\r\n for (const f of asmFiles) {\r\n const includeBlocks = asmFiles\r\n .filter(x => f.includes?.has(x.name.toUpperCase()))\r\n .flatMap(x => x.parts!)\r\n .filter(b => !!b.label);\r\n\r\n f.includeLookup = new Map();\r\n\r\n for (const b of includeBlocks) {\r\n if (b.label) f.includeLookup.set(b.label.toUpperCase(), b);\r\n }\r\n\r\n for (const b of (f.parts || []).filter(x => !!x.label)) {\r\n if (b.label) f.includeLookup.set(b.label.toUpperCase(), b);\r\n }\r\n }\r\n\r\n // Create block lookup for resolving labels to locations\r\n const blockLookup = new Map<string, number>();\r\n for (const f of allFiles) {\r\n blockLookup.set(f.name.toUpperCase(), f.location);\r\n }\r\n\r\n // Write all files\r\n for (const file of allFiles) {\r\n await this.writer.writeFile(file, blockLookup);\r\n }\r\n\r\n // Entry point fixups\r\n const entryBlocks = (asmFiles\r\n .filter(x => (x.bank ?? -1) === 0)\r\n .flatMap(x => x.parts || [])\r\n .filter(b => !!b.label)) as { label?: string; location: number }[];\r\n\r\n for (const ep of this.writer.entryPoints) {\r\n const match = entryBlocks.find(b => b.label === ep.name);\r\n if (match) this.writer.writeTransform(ep.location, match.location & 0xFFFF);\r\n }\r\n }\r\n\r\n public static applyPatches(asmFiles: ChunkFile[], patches: ChunkFile[]): void {\r\n for (const patch of patches.filter(x => x.includes && x.includes.size > 0)) {\r\n let file: ChunkFile | null = null;\r\n let dstIx = -1;\r\n const inc = asmFiles.filter(x => patch.includes!.has(x.name.toUpperCase()));\r\n for (let ix = 0; patch.parts && ix < patch.parts.length;) {\r\n const block = patch.parts[ix];\r\n let match: any = null;\r\n if (block.label) { \r\n for (const i of inc) {\r\n if (!i.parts) continue;\r\n for (let y = 0; y < i.parts.length; y++) {\r\n const check = i.parts[y];\r\n if (check.label === block.label) {\r\n file = i; \r\n dstIx = y; \r\n match = check;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (match) {\r\n file!.parts![dstIx++] = block;\r\n } else if (dstIx >= 0) {\r\n file!.parts!.splice(dstIx++, 0, block);\r\n } else { ix++; continue; }\r\n file!.includes = file!.includes || new Set();\r\n file!.includes.add(patch.name.toUpperCase());\r\n patch.parts!.splice(ix, 1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n","import { \n BinType, \n AddressType, \n Address, \n RomProcessingConstants,\n type DbEntryPoint, \n type ChunkFile, \n type AsmBlock, \n type StringMarker,\n type TableEntry,\n LocationWrapper,\n Byte,\n Word,\n Long,\n TypedNumber\n} from '@gaialabs/shared';\nimport { RomProcessor as RebuildProcessor } from './processor';\nimport { Op } from '@gaialabs/shared';\n\n/**\n * ROM writer (binary)\n * Converted from ext/GaiaLib/Rom/Rebuild/RomWriter.cs (subset: binary write only)\n */\nexport class RomWriter {\n public bpsPath?: string;\n public readonly outBuffer: Uint8Array;\n public readonly entryPoints: DbEntryPoint[];\n public readonly cartName: string;\n public readonly makerCode: string;\n\n constructor(entryPoints: DbEntryPoint[], cartName: string, makerCode: string) {\n this.cartName = cartName;\n this.makerCode = makerCode;\n this.entryPoints = entryPoints;\n //There needs to be a way to determine the rom size and makeup\n this.outBuffer = new Uint8Array(0x400000);\n }\n\n public async repack(files: ChunkFile[]): Promise<Uint8Array> {\n const processor = new RebuildProcessor(this);\n await processor.repack(files);\n\n this.writeHeader();\n this.writeEntryPoints(files.filter(x => !!x.parts));\n this.writeChecksum();\n\n //await this.generatePatch();\n return this.outBuffer;\n }\n\n public writeHeader(): void {\n const buf = this.outBuffer!;\n // Maker/game code at 0xFFB0\n let pos = 0xFFB0;\n this.writeAscii(this.makerCode.padEnd(6, ' '), pos); pos += 6;\n for (let i = 0; i < 10; i++) buf[pos++] = 0;\n this.writeAscii(this.cartName.toUpperCase().padEnd(21, ' '), pos); pos += 21;\n buf[pos++] = 0x31; // map mode\n buf[pos++] = 0x02; // chipset\n buf[pos++] = 0x0C; // ROM size\n buf[pos++] = 0x03; // RAM size\n buf[pos++] = 0x01; // country\n buf[pos++] = 0x33; // dev id\n buf[pos++] = 0x00; // version\n }\n\n public writeChecksum(): void {\n const buf = this.outBuffer!;\n \n // Not sure why this is needed, but it is\n buf[0xFFDC] = 0xFF;\n buf[0xFFDD] = 0xFF;\n buf[0xFFDE] = 0;\n buf[0xFFDF] = 0;\n\n // checksum\n let sum = 0;\n for (let i = 0; i < buf.length; i++) sum += buf[i];\n\n // checksum at 0xFFDE\n buf[0xFFDE] = sum & 0xFF;\n buf[0xFFDF] = (sum >> 8) & 0xFF;\n // complement at 0xFFDC\n const comp = ~sum;\n buf[0xFFDC] = comp & 0xFF;\n buf[0xFFDD] = (comp >> 8) & 0xFF;\n }\n\n // private async generatePatch(): Promise<void> {\n // const flips = this._projectRoot.flipsPath;\n // if (!flips) return;\n // if (typeof process === 'undefined' || !process.versions?.node) return;\n // const { spawn } = await import('child_process');\n // const { resolve } = await import('path');\n // this.bpsPath = `${this._projectRoot.baseDir}/${this._projectRoot.name}.bps`;\n // await new Promise<void>((resolvePromise) => {\n // const p = spawn(flips, ['--create', '--bps', `${this._projectRoot.romPath}`, `${this.romPath}`, `${this.bpsPath}`], {\n // stdio: ['ignore', 'pipe', 'pipe']\n // });\n // p.on('close', () => resolvePromise());\n // });\n // }\n\n public writeEntryPoints(asmFiles: ChunkFile[]): void {\n const buf = this.outBuffer!;\n \n // Entry point fixups\n const entryBlocks = (asmFiles\n .filter(x => (x.bank ?? -1) === 0)\n .flatMap(x => x.parts || [])\n .filter(b => !!b.label)) as { label?: string; location: number }[];\n\n for (const ep of this.entryPoints) {\n const match = entryBlocks.find(b => b.label === ep.name);\n if (match) this.writeTransform(ep.location, match.location & 0xFFFF);\n }\n }\n\n public writeTransform(location: number, value: number, size?: number): void {\n const buf = this.outBuffer!;\n\n // Determine size based on value range if not explicitly provided\n if (size === undefined) {\n if (value <= 0xFF) {\n size = 1; // byte\n } else if (value <= 0xFFFF) {\n size = 2; // ushort \n } else if (value <= 0xFFFFFF) {\n size = 3; // uint (3 bytes)\n } else {\n size = 4; // full uint (4 bytes, though C# version only uses 3)\n }\n }\n\n // Write bytes based on size\n switch (size) {\n case 1: // byte\n buf[location] = value & 0xFF;\n break;\n case 2: // ushort\n buf[location] = value & 0xFF;\n buf[location + 1] = (value >> 8) & 0xFF;\n break;\n case 3: // uint (3 bytes as per C# version)\n buf[location] = value & 0xFF;\n buf[location + 1] = (value >> 8) & 0xFF;\n buf[location + 2] = (value >> 16) & 0xFF;\n break;\n case 4: // full uint\n buf[location] = value & 0xFF;\n buf[location + 1] = (value >> 8) & 0xFF;\n buf[location + 2] = (value >> 16) & 0xFF;\n buf[location + 3] = (value >> 24) & 0xFF;\n break;\n default:\n throw new Error(`Invalid size ${size} for writeTransform`);\n }\n }\n\n public async writeFile(file: ChunkFile, _chunkLookup: Map<string, number>): Promise<number> {\n const start = file.location;\n let pos = start;\n const buf = this.outBuffer!;\n\n if (file.rawData) {\n // Write type-specific headers\n const data = file.rawData;\n let remain = file.size;\n let srcPos = 0;\n if (file.type === BinType.Tilemap) {\n remain -= 2;\n buf[pos++] = data[srcPos++];\n buf[pos++] = data[srcPos++];\n } else if (file.type === BinType.Meta17) {\n remain -= 4;\n for (let i = 0; i < 4; i++) buf[pos++] = data[srcPos++];\n } else if (file.type === BinType.Sound) {\n remain -= 2;\n buf[pos++] = remain & 0xFF;\n buf[pos++] = (remain >> 8) & 0xFF;\n }\n\n //TODO: in the future perhaps we can compress assets, but for now this is not needed\n\n //Write compression header\n if (file.compressed !== undefined) {\n remain -= 2;\n const inverse = (0 - remain) & 0xFFFF;\n buf[pos++] = inverse & 0xFF;\n buf[pos++] = (inverse >> 8) & 0xFF;\n }\n\n // Copy the rest\n while (remain > 0) {\n buf[pos++] = data[srcPos++];\n remain--;\n }\n } else {\n // Handle assembly parts\n if (file.parts && file.parts.length > 0) {\n // For safety, ensure first block location matches file location when present\n if (file.parts[0].location !== file.location && (file.location || 0) !== 0) {\n throw new Error('Assembly was not based properly');\n }\n \n // Parse assembly parts\n this.parseAssembly(file.parts, _chunkLookup, file.includeLookup!);\n }\n }\n\n return pos - start;\n }\n\n // No address mapping required: layout assigns absolute file offsets\n\n private writeAscii(text: string, pos: number): void {\n const buf = this.outBuffer!;\n for (let i = 0; i < text.length; i++) buf[pos + i] = text.charCodeAt(i) & 0xFF;\n }\n\n /**\n * Parse assembly blocks and write binary data to output buffer\n * Converted from ext/GaiaLib/Rom/Rebuild/RomWriter.cs ParseAssembly method\n */\n private parseAssembly(\n blocks: AsmBlock[], \n chunkLookup: Map<string, number>, \n includeLookup: Map<string, AsmBlock>\n ): void {\n if (!blocks) {\n throw new Error('Assembly has not been parsed');\n }\n\n const buf = this.outBuffer!;\n\n let bix = 0;\n\n for (const block of blocks) {\n let oldPos: number | null = null;\n let position = block.location; // Always start at block's absolute location\n \n // Note: C# version had position management logic, but we always use block.location\n\n const objList = block.objList;\n let oix = 0;\n let opos = 0;\n\n // Process each object in the block's object list\n const processObject = (obj: unknown, parentOp?: Op): void => {\n let currentObj = obj;\n\n while (true) { // Top: label equivalent\n if (Array.isArray(currentObj)) {\n for (const obj of currentObj) {\n processObject(obj, parentOp);\n }\n break;\n } else if (this.isTableEntry(currentObj)) {\n currentObj = (currentObj as TableEntry).object;\n continue;\n } else if (currentObj instanceof Op) {\n const op = currentObj as Op;\n buf[position++] = op.code & 0xFF;\n opos += op.size;\n\n for (const operand of op.operands) {\n processObject(operand, op);\n }\n break;\n } else if (currentObj instanceof Uint8Array) {\n const arr = currentObj as Uint8Array;\n for (let i = 0; i < arr.length; i++) {\n buf[position + i] = arr[i];\n }\n position += arr.length;\n opos += arr.length;\n break;\n } else if (typeof currentObj === 'string') {\n const str = currentObj as string;\n let label = str;\n\n let ix = 0;\n while (ix < label.length && RomProcessingConstants.ADDRESS_SPACE.includes(label[ix])) {\n ix++;\n }\n\n if (ix > 0) {\n label = label.substring(ix);\n }\n\n let loc: number;\n const isRelative = parentOp && \n (parentOp.mode === 'PCRelative' || \n parentOp.mode === 'PCRelativeLong');\n\n const operatorIdx = this.indexOfAny(label, RomProcessingConstants.OPERATORS);\n let offset: number | null = null;\n let useMarker = false;\n\n if (operatorIdx > 0) {\n if (label[operatorIdx + 1] === 'M') {\n useMarker = true;\n } else {\n offset = parseInt(label.substring(operatorIdx + 1), 16);\n if (label[operatorIdx] === '-') {\n offset = -offset;\n }\n }\n label = label.substring(0, operatorIdx);\n }\n\n // Search local labels first\n const labelUpper = label.toUpperCase();\n let target: AsmBlock | undefined;\n\n if (includeLookup.has(labelUpper)) {\n target = includeLookup.get(labelUpper);\n loc = target!.location;\n } else if (chunkLookup.has(labelUpper)) {\n loc = chunkLookup.get(labelUpper)!;\n } else {\n // Handle direct hex values\n if (label.startsWith('#')) {\n label = label.substring(1);\n }\n if (label.startsWith('$')) {\n label = label.substring(1);\n }\n\n if (isRelative && label.length > 4) {\n const off = parseInt(label, 16) - (block.location + opos);\n currentObj = parentOp?.size === 2 ? (off & 0xFF) : (off & 0xFFFF);\n continue; // goto Top\n } else {\n let num: number;\n switch (label.length) {\n case 1:\n case 2:\n currentObj = new Byte(parseInt(label, 16));\n continue;\n case 3:\n case 4:\n currentObj = new Word(parseInt(label, 16));\n continue;\n case 5:\n case 6:\n currentObj = new Long(parseInt(label, 16));\n continue;\n default:\n throw new Error(`Invalid operand '${label}'`);\n }\n }\n }\n\n let type = Address.typeFromCode(str[0]);\n if (type === AddressType.Unknown) {\n type = parentOp?.size === 4 ? AddressType.Address\n : parentOp?.size === 2 ? AddressType.Unknown : AddressType.Offset;\n }\n\n if (isRelative) {\n loc -= block.location + opos;\n if (type === AddressType.Unknown && !(loc < 0x80 || loc >= 0x3FFF80)) {\n throw new Error('Relative out of range');\n }\n }\n\n if (offset !== null) {\n loc += offset;\n } else if (useMarker && target) {\n let markerOffset = 0;\n for (const part of target.objList) {\n if (this.isStringMarker(part)) {\n loc += markerOffset;\n break;\n } else {\n markerOffset += RomProcessingConstants.getSize(part);\n }\n }\n }\n\n switch (type) {\n case AddressType.Offset:\n currentObj = new Word(loc);\n continue;\n case AddressType.Bank:\n currentObj = new Byte(((loc >> 16) | ((loc & 0xFFFF) >= 0x8000 ? 0x80 : 0xC0)));\n continue;\n case AddressType.WBank:\n currentObj = new Word(((loc >> 16) | ((loc & 0xFFFF) >= 0x8000 ? 0x80 : 0xC0)));\n continue;\n case AddressType.Address:\n currentObj = new Long(loc | ((loc & 0xFFFF) >= 0x8000 ? 0x800000 : 0xC00000));\n continue;\n default:\n currentObj = new Byte(loc);\n continue;\n }\n \n } else if (currentObj instanceof TypedNumber) {\n let value = currentObj.value;\n for (let i = 0; i < currentObj.size; i++) {\n buf[position++] = value & 0xFF;\n value >>= 8;\n }\n break;\n } else if (typeof currentObj === 'number') {\n const num = currentObj as number;\n const size = parentOp?.size ?? 0;\n \n if (num <= 0xFF && size <= 2) {\n // byte\n buf[position] = num & 0xFF;\n position++;\n } else if (num <= 0xFFFF && size <= 3) {\n // ushort\n buf[position] = num & 0xFF;\n buf[position + 1] = (num >> 8) & 0xFF;\n position += 2;\n } else if (num <= 0xFFFFFF && size <= 4) {\n // 3-byte\n buf[position] = num & 0xFF;\n buf[position + 1] = (num >> 8) & 0xFF;\n buf[position + 2] = (num >> 16) & 0xFF;\n position += 3;\n } else {\n // 4-byte\n buf[position] = num & 0xFF;\n buf[position + 1] = (num >> 8) & 0xFF;\n buf[position + 2] = (num >> 16) & 0xFF;\n buf[position + 3] = (num >> 24) & 0xFF;\n position += 4;\n }\n break;\n } else if (this.isStringMarker(currentObj)) {\n // StringMarker - no operation needed\n break;\n } else {\n throw new Error(`Unable to process '${currentObj}'`);\n }\n }\n };\n\n for (const obj of objList) {\n oix++;\n processObject(obj);\n }\n\n // Position management no longer needed since we use absolute locations\n\n bix++;\n }\n }\n\n /**\n * Helper method to find index of any character from an array in a string\n */\n private indexOfAny(str: string, chars: string[]): number {\n for (let i = 0; i < str.length; i++) {\n if (chars.includes(str[i])) {\n return i;\n }\n }\n return -1;\n }\n\n /**\n * Helper method to check if an object is a StringMarker\n */\n private isStringMarker(obj: unknown): obj is StringMarker {\n return typeof obj === 'object' && obj !== null && 'offset' in obj;\n }\n\n private isTableEntry(obj: unknown): obj is TableEntry {\n return typeof obj === 'object' && obj !== null && 'location' in obj && 'object' in obj;\n }\n}\n\n\n","import { DbRoot, DbStringCommand, DbStringType } from '@gaialabs/shared';\r\nimport { MemberType } from '@gaialabs/shared';\r\nimport { RomProcessingConstants } from '@gaialabs/shared';\r\nimport { StringMarker } from '@gaialabs/shared';\r\nimport type { AssemblerContext } from './assembler-context';\r\n\r\n/**\r\n * String processor for assembly parsing\r\n * Converted from GaiaLib/Rom/Rebuild/StringProcessor.cs\r\n */\r\nexport class StringProcessor {\r\n private readonly memBuffer: number[] = [];\r\n private readonly context: AssemblerContext;\r\n private readonly root: DbRoot;\r\n\r\n constructor(context: AssemblerContext) {\r\n this.context = context;\r\n this.root = context.root;\r\n }\r\n\r\n public dispose(): void {\r\n // TypeScript/JavaScript doesn't need explicit disposal\r\n this.memBuffer.length = 0;\r\n }\r\n\r\n public consumeString(): void {\r\n let str: string | null = null;\r\n\r\n // Get character code of string type\r\n const typeChar = this.context.lineBuffer[0];\r\n\r\n // Find last index of character code\r\n const endIx = this.context.lineBuffer.indexOf(typeChar, 1);\r\n if (endIx >= 0) {\r\n // Take the line up until the type code\r\n str = this.context.lineBuffer.substring(1, endIx);\r\n // Line takes content after and code\r\n this.context.lineBuffer = this.context.lineBuffer.substring(endIx + 1)\r\n .replace(/^[\\s,\\t]+/, '');\r\n } else {\r\n // Take the remaining line\r\n str = this.context.lineBuffer.substring(1);\r\n this.context.lineBuffer = '';\r\n }\r\n\r\n // Reset memory buffer for new string\r\n this.memBuffer.length = 0;\r\n\r\n const stringType = this.root.stringCharLookup[typeChar];\r\n this.processString(str, stringType);\r\n }\r\n\r\n private flushBuffer(stringType: DbStringType, wrap: boolean = false): void {\r\n const size = this.memBuffer.length;\r\n if (size > 0) {\r\n const buffer = new Uint8Array(this.memBuffer);\r\n this.context.currentBlock!.objList.push(buffer);\r\n this.context.currentBlock!.size += size;\r\n this.memBuffer.length = 0;\r\n }\r\n }\r\n\r\n private processString(str: string, stringType: DbStringType): void {\r\n const dict = stringType.commands;\r\n const charMap = stringType.characterMap;\r\n const shift = this.getShiftUp(stringType.shiftType);\r\n let lastCmd: DbStringCommand | null = null;\r\n\r\n for (let x = 0; x < str.length; x++) {\r\n const c = str[x];\r\n if (c === '[') {\r\n const endIx = str.indexOf(']', x + 1);\r\n const splitChars = [':', ',', ' '];\r\n const parts = str.substring(x + 1, endIx)\r\n .split(new RegExp(`[${splitChars.join('')}]`))\r\n .filter(p => p.length > 0);\r\n\r\n x = endIx;\r\n\r\n // Marker\r\n if (parts.length === 0) {\r\n this.flushBuffer(stringType, true);\r\n this.context.currentBlock!.objList.push({\r\n offset: this.context.currentBlock!.size\r\n } as StringMarker);\r\n continue;\r\n }\r\n\r\n const cmd = Object.values(dict).find(x => x.value === parts[0]);\r\n if (cmd) {\r\n lastCmd = cmd;\r\n this.memBuffer.push(cmd.key);\r\n this.processStringCommand(cmd, stringType, parts);\r\n continue;\r\n }\r\n }\r\n\r\n lastCmd = null;\r\n\r\n // Process extra string layers\r\n if (this.applyLayers(c, stringType)) {\r\n continue;\r\n }\r\n }\r\n\r\n // Terminate string\r\n if (lastCmd === null || !lastCmd.halt) {\r\n this.memBuffer.push(stringType.terminator);\r\n }\r\n\r\n this.flushBuffer(stringType, true);\r\n }\r\n\r\n private applyLayers(c: string, stringType: DbStringType): boolean {\r\n if (this.applyMap(c, stringType.characterMap, this.getShiftUp(stringType.shiftType))) {\r\n return true;\r\n }\r\n\r\n if (stringType.layers) {\r\n for (const layer of stringType.layers) {\r\n if (this.applyMap(c, layer.map, x => x + layer.base)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private applyMap(c: string, map: string[], shift: (x: number) => number): boolean {\r\n for (let i = 0, len = map.length; i < len; i++) {\r\n const v = map[i];\r\n if (v != null && c === v[0]) {\r\n this.memBuffer.push(shift(i));\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private processStringCommand(cmd: DbStringCommand, stringType: DbStringType, parts: string[]): void {\r\n const hasPointer = cmd.types.includes(MemberType.Address) || cmd.types.includes(MemberType.Offset);\r\n if (hasPointer) {\r\n this.flushBuffer(stringType, true);\r\n }\r\n\r\n for (let y = 0, pix = 1; y < cmd.types.length; y++, pix++) {\r\n switch (cmd.types[y]) {\r\n case MemberType.Byte:\r\n this.memBuffer.push(parseInt(parts[pix], 16));\r\n break;\r\n\r\n case MemberType.Word:\r\n const us = parseInt(parts[pix], 16);\r\n this.memBuffer.push(us & 0xFF);\r\n this.memBuffer.push((us >> 8) & 0xFF);\r\n break;\r\n\r\n case MemberType.Binary:\r\n while (pix < parts.length) {\r\n const ch = parseInt(parts[pix], 16);\r\n this.memBuffer.push(ch);\r\n pix++;\r\n }\r\n if (cmd.delimiter !== undefined) {\r\n this.memBuffer.push(cmd.delimiter);\r\n }\r\n break;\r\n\r\n case MemberType.Offset:\r\n case MemberType.Address:\r\n // Have to keep these for later since we don't have lookups yet\r\n this.flushBuffer(stringType, false);\r\n this.context.currentBlock!.objList.push(parts[pix]);\r\n this.context.currentBlock!.size += cmd.types[y] === MemberType.Offset ? 2 : 3;\r\n break;\r\n }\r\n }\r\n\r\n if (hasPointer) {\r\n this.flushBuffer(stringType, false);\r\n }\r\n }\r\n\r\n private getShiftUp(shiftType?: string): (x: number) => number {\r\n switch (shiftType) {\r\n case 'h2':\r\n return (x: number) => (((x & 0x70) << 1) | (x & 0x0F));\r\n case 'wh2':\r\n return (x: number) => (((x & 0x38) << 1) | (x & 0x07));\r\n default:\r\n return (x: number) => x;\r\n }\r\n }\r\n}\r\n","/**\r\n * A map that sorts keys by length in descending order, then alphabetically\r\n * This is used for tag replacement where longer tags should be replaced first\r\n * to avoid conflicts (e.g., \"ABCD\" should be replaced before \"ABC\")\r\n */\r\nexport class SortedMap<V> {\r\n private map = new Map<string, V>();\r\n private _keys: string[] = [];\r\n\r\n public get size(): number {\r\n return this.map.size;\r\n }\r\n\r\n public set(key: string, value: V): this {\r\n if (!this.map.has(key)) {\r\n this._keys.push(key);\r\n this.sortKeys();\r\n }\r\n this.map.set(key, value);\r\n return this;\r\n }\r\n\r\n public get(key: string): V | undefined {\r\n return this.map.get(key);\r\n }\r\n\r\n public has(key: string): boolean {\r\n return this.map.has(key);\r\n }\r\n\r\n public delete(key: string): boolean {\r\n const result = this.map.delete(key);\r\n if (result) {\r\n const index = this._keys.indexOf(key);\r\n if (index >= 0) {\r\n this._keys.splice(index, 1);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n public clear(): void {\r\n this.map.clear();\r\n this._keys.length = 0;\r\n }\r\n\r\n public keys(): string[] {\r\n return [...this._keys];\r\n }\r\n\r\n public values(): V[] {\r\n return this._keys.map(key => this.map.get(key)!);\r\n }\r\n\r\n public entries(): [string, V][] {\r\n return this._keys.map(key => [key, this.map.get(key)!]);\r\n }\r\n\r\n public *[Symbol.iterator](): Generator<[string, V], void, unknown> {\r\n for (const key of this._keys) {\r\n yield [key, this.map.get(key)!];\r\n }\r\n }\r\n\r\n private sortKeys(): void {\r\n this._keys.sort((a, b) => {\r\n // Sort by length descending first\r\n if (a.length !== b.length) {\r\n return b.length - a.length;\r\n }\r\n // Then alphabetically\r\n return a.localeCompare(b);\r\n });\r\n }\r\n}\r\n","import { DbRoot, DbStruct, RomProcessingConstants } from '@gaialabs/shared';\r\nimport { AsmBlock } from '@gaialabs/shared';\r\nimport { Op, OpCode, Byte } from '@gaialabs/shared';\r\nimport type { AssemblerContext } from './assembler-context';\r\nimport { AsmReader } from '../extraction/asm';\r\n\r\n/**\r\n * Assembler state machine for processing assembly text\r\n * Converted from GaiaLib/Rom/Rebuild/AssemblerState.cs\r\n */\r\nexport class AssemblerState {\r\n private readonly dbStruct: DbStruct | null;\r\n private readonly parentStruct: DbStruct | null;\r\n private readonly root: DbRoot;\r\n private readonly discriminator: number | null;\r\n private delimiter: number | null;\r\n private memberOffset: number;\r\n private dataOffset: number;\r\n private readonly memberTypes: string[] | null;\r\n private currentType: string | null;\r\n private readonly context: AssemblerContext;\r\n\r\n constructor(context: AssemblerContext, structType: string | null = null, saveDelimiter: boolean = false) {\r\n this.context = context;\r\n this.root = context.root;\r\n\r\n this.dbStruct = structType === null ? null\r\n : Object.values(this.root.structs).find(x =>\r\n x.name.toLowerCase() === structType.toLowerCase()\r\n ) || null;\r\n\r\n this.parentStruct = !this.dbStruct || !this.dbStruct.parent ? null\r\n : Object.values(this.root.structs).find(x =>\r\n x.name.toLowerCase() === this.dbStruct!.parent!.toLowerCase()\r\n ) || null;\r\n\r\n this.discriminator = this.parentStruct?.discriminator ?? null;\r\n this.delimiter = this.dbStruct?.delimiter || null;\r\n this.memberOffset = 0;\r\n this.dataOffset = 0;\r\n this.memberTypes = this.dbStruct?.types || null;\r\n this.currentType = this.memberTypes?.[this.memberOffset] || null;\r\n\r\n if (saveDelimiter) {\r\n this.context.lastDelimiter = this.dbStruct?.delimiter ?? this.parentStruct?.delimiter ?? null;\r\n }\r\n }\r\n\r\n private checkDisc(): void {\r\n if (this.discriminator === this.dataOffset) {\r\n // Discriminator is always 1 byte\r\n this.context.currentBlock!.objList.push(this.dbStruct!.discriminator!);\r\n this.context.currentBlock!.size += 1;\r\n this.dataOffset += 1;\r\n }\r\n }\r\n\r\n private advancePart(): void {\r\n if (this.currentType != null && this.discriminator != null) {\r\n this.dataOffset += RomProcessingConstants.getSize(this.currentType);\r\n }\r\n\r\n if (this.memberTypes != null && this.memberOffset + 1 < this.memberTypes.length) {\r\n this.currentType = this.memberTypes[++this.memberOffset];\r\n }\r\n }\r\n\r\n private processOrigin(): void {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(3).replace(/^[\\s,\\t]+/, '');\r\n if (this.context.lineBuffer.startsWith('$')) {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1);\r\n }\r\n\r\n let hex: string;\r\n const endIx = this.context.lineBuffer.search(/[\\s,\\t]/);\r\n if (endIx >= 0) {\r\n hex = this.context.lineBuffer.substring(0, endIx);\r\n this.context.lineBuffer = this.context.lineBuffer.substring(endIx + 1).replace(/^[\\s,\\t]+/, '');\r\n } else {\r\n hex = this.context.lineBuffer;\r\n this.context.lineBuffer = '';\r\n }\r\n\r\n const location = parseInt(hex, 16);\r\n\r\n this.context.blocks.push(this.context.currentBlock = new AsmBlock(location));\r\n this.context.blockIndex++;\r\n }\r\n\r\n private static doMath(operand: string): string {\r\n const ix = operand.search(/[-+]/);\r\n if (ix >= 0) {\r\n const op = operand[ix];\r\n\r\n const vix = operand.lastIndexOf('$', ix) + 1;\r\n\r\n const valueStr = operand.substring(vix, ix);\r\n if (valueStr.match(/^[a-fA-F0-9]+$/)) {\r\n const value = parseInt(valueStr, 16);\r\n \r\n let endIx = operand.substring(ix + 1).search(RomProcessingConstants.SYMBOL_SPACE_REGEX);\r\n if(endIx < 0) {\r\n endIx = operand.length;\r\n }\r\n \r\n const number = parseInt(operand.substring(ix + 1, endIx), 16);\r\n\r\n let result: number;\r\n if (op === '-') {\r\n result = value - number;\r\n } else {\r\n result = value + number;\r\n }\r\n\r\n const len = (ix - vix) <= 2 ? 2 : (ix - vix) <= 4 ? 4 : 6;\r\n\r\n operand = operand.substring(0, vix) + result.toString(16).toUpperCase().padStart(len, '0') + operand.substring(endIx);\r\n }\r\n }\r\n return operand;\r\n }\r\n\r\n private tryCreateLabel(mnemonic: string, operand?: string): boolean {\r\n // Check that the operand has content\r\n if (!operand || operand.length === 0) {\r\n return false;\r\n }\r\n\r\n const labelChar = operand[0];\r\n\r\n // If our operand starts with a label space character, create a label\r\n if (!RomProcessingConstants.LABEL_SPACE.includes(labelChar)) {\r\n return false;\r\n }\r\n\r\n // Create new block for this label\r\n const newBlock = new AsmBlock(\r\n this.context.currentBlock!.location + this.context.currentBlock!.size,\r\n 0,\r\n this.root.stringDelimiters.includes(operand[0]),\r\n mnemonic\r\n );\r\n\r\n // Add block to assembler\r\n this.context.blocks.push(newBlock);\r\n\r\n // Set as current\r\n this.context.currentBlock = newBlock;\r\n\r\n // Increment current block index\r\n this.context.blockIndex++;\r\n\r\n // Remove label marker\r\n if (labelChar === ':') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1);\r\n } else if (labelChar === '[' || labelChar === '{') {\r\n this.context.lineBuffer = operand.substring(1).replace(/^[\\s,\\t]+/, '');\r\n\r\n // Process the next \r\n const state = new AssemblerState(this.context, this.currentType);\r\n state.processText(labelChar);\r\n\r\n // Advance to next part\r\n this.advancePart();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public processText(openTag?: string): void {\r\n this.checkDisc();\r\n\r\n while (!this.context.eof) {\r\n if (!this.context.getLine()) {\r\n return;\r\n }\r\n\r\n // if (this.context.lineBuffer.startsWith('DB')) {\r\n // const hex = this.context.lineBuffer.substring(2).replace(HEX_REGEX, '');\r\n // const data = this.hexStringToBytes(hex);\r\n // this.context.currentBlock!.objList.push(data);\r\n // this.context.currentBlock!.size += data.length;\r\n // this.context.lineBuffer = '';\r\n // continue;\r\n // }\r\n\r\n let mnemonic: string | null = null;\r\n let operand: string | null = null;\r\n let operand2: string | null = null;\r\n\r\n while (this.context.lineBuffer.length > 0) {\r\n const lineSymbol = this.context.lineBuffer[0];\r\n\r\n // Process strings\r\n if (this.root.stringDelimiters.includes(lineSymbol)) {\r\n this.context.stringProcessor.consumeString();\r\n this.advancePart();\r\n continue;\r\n }\r\n\r\n // Process raw data\r\n if (RomProcessingConstants.ADDRESS_SPACE.includes(lineSymbol)) {\r\n this.context.processRawData();\r\n\r\n if (openTag === '[') {\r\n this.context.lastDelimiter = null;\r\n }\r\n\r\n this.advancePart();\r\n continue;\r\n }\r\n\r\n if (lineSymbol === '>') {\r\n if (openTag === '<') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n this.checkDisc();\r\n }\r\n return;\r\n }\r\n\r\n // Array Close\r\n if (lineSymbol === ']') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n\r\n this.delimiter = this.delimiter ?? this.context.lastDelimiter;\r\n\r\n // Apply delimiter if set\r\n if (this.delimiter != null) {\r\n if (this.delimiter >= 0x100) {\r\n // When over the word boundary use two bytes\r\n this.context.currentBlock!.objList.push(this.delimiter);\r\n this.context.currentBlock!.size += 2;\r\n } else {\r\n // Otherwise default to single byte\r\n this.context.currentBlock!.objList.push(this.delimiter);\r\n this.context.currentBlock!.size += 1;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Block close\r\n if (lineSymbol === '}') {\r\n if (openTag === '{') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n }\r\n return;\r\n }\r\n\r\n // Array Open\r\n if (lineSymbol === '[') {\r\n this.context.lineBuffer = this.context.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n const state = new AssemblerState(this.context, this.currentType);\r\n state.processText('[');\r\n this.advancePart();\r\n continue;\r\n }\r\n\r\n // Process origin tags\r\n if (this.context.lineBuffer.startsWith('ORG')) {\r\n this.processOrigin();\r\n continue;\r\n }\r\n\r\n // Separate instructions into mnemonic and operand parts\r\n const symbolIndex = this.context.lineBuffer.search(RomProcessingConstants.SYMBOL_SPACE_REGEX);\r\n if (symbolIndex > 0) {\r\n mnemonic = this.context.lineBuffer.substring(0, symbolIndex);\r\n operand = this.context.lineBuffer.substring(symbolIndex).replace(/^[, \\t]+/, '');\r\n\r\n // Process object tags\r\n if (operand && operand.startsWith('<')) {\r\n this.context.lineBuffer = operand.substring(1).replace(/^[, \\t]+/, '');\r\n const state = new AssemblerState(this.context, mnemonic, openTag === '[' && this.currentType == null);\r\n state.processText('<');\r\n mnemonic = null;\r\n continue;\r\n }\r\n \r\n this.context.lineBuffer = operand;\r\n } else {\r\n mnemonic = this.context.lineBuffer;\r\n this.context.lineBuffer = '';\r\n }\r\n\r\n break;\r\n }\r\n\r\n if (mnemonic && mnemonic.length > 0) {\r\n // Get list of opcodes from mnemonic\r\n const codes = this.root.opLookup[mnemonic.toUpperCase()];\r\n\r\n // If no codes were found, try to create a label\r\n if (!codes || codes.length === 0) {\r\n if (this.tryCreateLabel(mnemonic, operand || undefined)) {\r\n continue;\r\n }\r\n\r\n // If label creation fails, throw exception\r\n throw new Error(`Unknown instruction line ${this.context.lineCount}: '${mnemonic}'`);\r\n }\r\n\r\n // Reset current assembler line\r\n this.context.lineBuffer = '';\r\n\r\n // No operand instructions\r\n if (!operand) {\r\n const opCode = codes.find(x => this.root.addrLookup[x.mode].size === 1);\r\n this.context.currentBlock!.objList.push(new Op (opCode, 0, [], 1));\r\n this.context.currentBlock!.size++;\r\n continue;\r\n }\r\n\r\n // Do maths before regex processing\r\n operand = AssemblerState.doMath(operand);\r\n\r\n // COP processing\r\n let opCode: OpCode | null = codes[0];\r\n if (opCode?.mnem === 'COP') {\r\n const parts = operand.split(/[\\s\\t,()[\\]$#]/).filter(p => p.length > 0);\r\n const cmd = parts[0];\r\n\r\n const cop = this.root.copLookup[cmd];\r\n if (!cop) {\r\n throw new Error(`Unknown COP command ${cmd}`);\r\n }\r\n\r\n this.context.currentBlock!.objList.push(new Op(opCode, 0, [new Byte(cop.code), ...parts.slice(1)], cop.size + 2));\r\n\r\n this.context.currentBlock!.size += cop.size + 2;\r\n\r\n continue;\r\n }\r\n\r\n opCode = null;\r\n for (const code of codes) {\r\n // Keep branch operands until all blocks are processed (for labels)\r\n if (code.mode === 'PCRelative' || code.mode === 'PCRelativeLong') {\r\n opCode = code;\r\n break;\r\n }\r\n\r\n // Regex parse operand based on addressing mode\r\n const addrMode = this.root.addrLookup[code.mode]; \r\n const regex = addrMode.parseRegex;\r\n if (regex) {\r\n const match = new RegExp(regex).exec(operand);\r\n if (match) {\r\n // Keep the current code\r\n opCode = code;\r\n\r\n // Operand is the \"first\" matched group\r\n operand = match[1];\r\n\r\n // Support for second operand (MVN/MVP)\r\n if (match.length > 2) {\r\n operand2 = match[2];\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (operand!.startsWith('#')) {\r\n operand = operand!.substring(1);\r\n }\r\n\r\n if (operand!.startsWith('$')) {\r\n operand = operand!.substring(1);\r\n }\r\n\r\n if (opCode == null) {\r\n const addrIx = operand!.search(RomProcessingConstants.ADDRESS_SPACE_REGEX);\r\n if (addrIx && addrIx >= 0) {\r\n const eix = operand!.search(/[\\s\\t,\\])]/);\r\n if (eix && eix >= 0) {\r\n operand = operand!.substring(addrIx, eix);\r\n }\r\n }\r\n\r\n opCode = codes.find(x => x.mode === 'Immediate')\r\n ?? codes.find(x => x.mode === 'AbsoluteLong')\r\n ?? codes.find(x => x.mode === 'Absolute')\r\n ?? null;\r\n\r\n if (opCode == null) {\r\n throw new Error(`Unable to determine mode/code line ${this.context.lineCount}: '${this.context.lineBuffer}'`);\r\n }\r\n }\r\n\r\n const opnd1 = this.context.parseOperand(operand!);\r\n\r\n const addrMode = this.root.addrLookup[opCode.mode];\r\n let size = addrMode.size;\r\n if (size === AsmReader.VARIABLE_SIZE_INDICATOR || opCode.mode === 'Immediate') {\r\n size = operand?.startsWith('^') || operand?.length === 2 ? 2 : 3;\r\n }\r\n\r\n const operands: unknown[] = operand2 != null ? [opnd1, this.context.parseOperand(operand2)] : [opnd1];\r\n\r\n this.context.currentBlock!.objList.push(new Op(opCode, 0, operands, size));\r\n\r\n this.context.currentBlock!.size += size;\r\n }\r\n }\r\n }\r\n\r\n private hexStringToBytes(hex: string): Uint8Array {\r\n const result = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n result[i / 2] = parseInt(hex.substring(i, i + 2), 16);\r\n }\r\n return result;\r\n }\r\n}\r\n","import { DbRoot, RomProcessingConstants, Word, Byte, Long } from '@gaialabs/shared';\r\nimport { AsmBlock } from '@gaialabs/shared';\r\nimport { StringProcessor } from './string-processor';\r\nimport { SortedMap } from './sorted-map';\r\nimport { AssemblerState } from './assembler-state';\r\nimport type { AssemblerContext } from './assembler-context';\r\n\r\n/**\r\n * Main assembler class for parsing assembly files\r\n * Converted from GaiaLib/Rom/Rebuild/Assembler.cs\r\n */\r\nexport class Assembler implements AssemblerContext {\r\n public readonly root: DbRoot;\r\n private readonly lines: string[];\r\n private currentLineIndex: number = 0;\r\n public readonly stringProcessor: StringProcessor;\r\n\r\n public lineBuffer: string = '';\r\n public includes = new Set<string>();\r\n public blocks: AsmBlock[] = [];\r\n public tags = new SortedMap<string | null>();\r\n public currentBlock: AsmBlock | null = null;\r\n public lineCount: number = 0;\r\n public blockIndex: number = 0;\r\n public lastDelimiter: number | null = null;\r\n public reqBank: number | null = null;\r\n public eof: boolean = false;\r\n\r\n constructor(dbRoot: DbRoot, textData: string) {\r\n this.root = dbRoot;\r\n // Handle both Windows (\\r\\n) and Unix (\\n) line endings\r\n this.lines = textData.split(/\\r?\\n/);\r\n this.stringProcessor = new StringProcessor(this);\r\n }\r\n\r\n public dispose(): void {\r\n this.stringProcessor.dispose();\r\n }\r\n\r\n public parseAssembly(): { blocks: AsmBlock[], includes: Set<string>, reqBank: number | null } {\r\n // Initialize root block (no label, location 0) and set as current\r\n this.blocks.push(this.currentBlock = new AsmBlock());\r\n\r\n // Initialize state machine and process text\r\n const state = new AssemblerState(this);\r\n state.processText();\r\n\r\n return { \r\n blocks: this.blocks, \r\n includes: this.includes, \r\n reqBank: this.reqBank \r\n };\r\n }\r\n\r\n public getLine(): boolean {\r\n // This can happen\r\n if (this.eof) {\r\n return false;\r\n }\r\n\r\n // Keep processing what we already have\r\n if (this.lineBuffer.length > 0) {\r\n return true;\r\n }\r\n\r\n let rawLine: string | null = null;\r\n \r\n while (true) {\r\n // Read next line\r\n if (this.currentLineIndex >= this.lines.length) {\r\n if (this.lineBuffer.length === 0) {\r\n this.eof = true;\r\n return false;\r\n } else {\r\n rawLine = '';\r\n }\r\n } else {\r\n rawLine = this.lines[this.currentLineIndex++];\r\n this.lineBuffer += rawLine;\r\n }\r\n\r\n this.lineCount++;\r\n\r\n // Ignore comments\r\n this.trimComments('--');\r\n this.trimComments(';');\r\n this.trimComments('//');\r\n\r\n // Trim\r\n this.lineBuffer = this.lineBuffer.replace(RomProcessingConstants.COMMA_SPACE_TRIM_REGEX, '');\r\n\r\n // This can happen\r\n if (this.lineBuffer.length === 0) {\r\n continue;\r\n }\r\n\r\n // Process hard line continuations\r\n if (this.lineBuffer.endsWith('\\\\')) {\r\n this.lineBuffer = this.lineBuffer.slice(0, -1);\r\n continue;\r\n }\r\n\r\n // Process directives\r\n if (this.lineBuffer[0] === '?') {\r\n this.processDirectives();\r\n this.lineBuffer = '';\r\n continue;\r\n }\r\n\r\n // Process tags\r\n if (this.lineBuffer[0] === '!') {\r\n this.processTags();\r\n this.lineBuffer = '';\r\n continue;\r\n }\r\n\r\n this.resolveTags();\r\n\r\n return true;\r\n }\r\n }\r\n\r\n private trimComments(sequence: string): void {\r\n // Look for the first instance of the comment sequence\r\n const index = this.lineBuffer.indexOf(sequence);\r\n if (index >= 0) {\r\n // Make sure it's not inside a string\r\n const strDelimRegex = new RegExp(`[${this.root.stringDelimiters.map(c => c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('')}]`);\r\n const strIndex = this.lineBuffer.search(strDelimRegex);\r\n \r\n // This works with line continuations because the string ending will not be on this line yet\r\n // If no string, string starts after comment, or last delimiter is before comment, trim it\r\n if (strIndex < 0 || \r\n strIndex > index || \r\n this.lineBuffer.lastIndexOf(this.lineBuffer[strIndex] || '') < index) {\r\n this.lineBuffer = this.lineBuffer.substring(0, index);\r\n }\r\n }\r\n }\r\n\r\n private processDirectives(): void {\r\n // Find end of directive\r\n let endIx = this.lineBuffer.search(RomProcessingConstants.COMMA_SPACE_REGEX);\r\n\r\n // Default to line length if no end characters\r\n if (endIx < 0) {\r\n endIx = this.lineBuffer.length;\r\n }\r\n\r\n const value = this.lineBuffer.substring(endIx).replace(/^[\\s,\\t]+/, '');\r\n\r\n switch (this.lineBuffer.substring(1, endIx).toUpperCase()) {\r\n // This is taken care of by the loader\r\n case 'BANK':\r\n this.reqBank = parseInt(value, 16);\r\n break;\r\n\r\n case 'INCLUDE':\r\n if (value.length > 0) {\r\n this.includes.add(value.toUpperCase().replace(/'/g, ''));\r\n }\r\n break;\r\n }\r\n }\r\n\r\n private processTags(): void {\r\n // Remove the '!' prefix and trim leading spaces\r\n this.lineBuffer = this.lineBuffer.substring(1).replace(/^[\\s,\\t]+/, '');\r\n\r\n // Process as many pairs as we can\r\n while (this.lineBuffer.length > 0) {\r\n // Default name and value\r\n let name = this.lineBuffer;\r\n let value: string | null = null;\r\n\r\n // Find first index of comma/space/tab\r\n let endIx = this.lineBuffer.search(/[\\s,\\t]/);\r\n\r\n if (endIx >= 0) {\r\n // Split into name and value\r\n name = this.lineBuffer.substring(0, endIx);\r\n value = this.lineBuffer.substring(endIx + 1).replace(/^[\\s,\\t]+/, '');\r\n\r\n // Find next index of comma/space/tab inside value\r\n const nextIx = value.search(/[\\s,\\t]/);\r\n if (nextIx >= 0) {\r\n // Line buffer then take the remainder\r\n this.lineBuffer = value.substring(nextIx + 1).replace(/^[\\s,\\t]+/, '');\r\n // Value takes up to next index\r\n value = value.substring(0, nextIx);\r\n } else {\r\n this.lineBuffer = ''; // No more pairs, clear buffer\r\n }\r\n } else {\r\n this.lineBuffer = ''; // Take all as name, clear buffer\r\n }\r\n\r\n // Assign name/value pair to tags\r\n this.tags.set(name, value);\r\n }\r\n }\r\n\r\n private resolveTags(): void {\r\n // Tags are sorted by length descending so longer tags are replaced first (avoids minor conflicts)\r\n for (const [key, value] of this.tags) {\r\n let ix: number;\r\n while ((ix = this.lineBuffer.toLowerCase().indexOf(key.toLowerCase())) >= 0) {\r\n this.lineBuffer = this.lineBuffer.substring(0, ix) + (value || '') + \r\n this.lineBuffer.substring(ix + key.length);\r\n }\r\n }\r\n }\r\n\r\n public parseOperand(opnd: string): unknown {\r\n if (!opnd) return null;\r\n\r\n if(opnd.match(/^[a-fA-F0-9]{2,6}$/)){\r\n switch(opnd.length){\r\n case 2:\r\n return new Byte(parseInt(opnd, 16));\r\n case 4:\r\n return new Word(parseInt(opnd, 16));\r\n case 6:\r\n return new Long(parseInt(opnd, 16));\r\n }\r\n }\r\n\r\n return opnd;\r\n }\r\n\r\n public processRawData(): void {\r\n let reverse = false;\r\n\r\n // Immediate binary marker\r\n if (this.lineBuffer[0] === '#') {\r\n this.lineBuffer = this.lineBuffer.substring(1);\r\n }\r\n\r\n // Reverse binary marker\r\n if (this.lineBuffer[0] === '$') {\r\n reverse = true;\r\n this.lineBuffer = this.lineBuffer.substring(1);\r\n }\r\n\r\n let hex: string;\r\n const symbolIx = this.lineBuffer.search(RomProcessingConstants.SYMBOL_SPACE_REGEX);\r\n if (symbolIx >= 0) {\r\n hex = this.lineBuffer.substring(0, symbolIx);\r\n this.lineBuffer = this.lineBuffer.substring(symbolIx).replace(/^[, \\t]+/, '');\r\n } else {\r\n hex = this.lineBuffer;\r\n this.lineBuffer = '';\r\n }\r\n\r\n if (hex.length > 0) {\r\n // Keep string values of address markers so they can be resolved later\r\n if (RomProcessingConstants.ADDRESS_SPACE.includes(hex[0])) {\r\n this.currentBlock!.objList.push(hex);\r\n this.currentBlock!.size += RomProcessingConstants.getSize(hex);\r\n } else {\r\n const data = this.hexStringToBytes(hex);\r\n if (data.length === 1) {\r\n this.currentBlock!.objList.push(new Byte(data[0]));\r\n this.currentBlock!.size++;\r\n } else {\r\n if (reverse) {\r\n data.reverse();\r\n }\r\n\r\n // Explicitly change two-byte data into number for easier processing later\r\n if (data.length === 2) {\r\n this.currentBlock!.objList.push(new Word(data[0] | (data[1] << 8)));\r\n this.currentBlock!.size += 2;\r\n } else {\r\n this.currentBlock!.objList.push(data);\r\n this.currentBlock!.size += data.length;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private hexStringToBytes(hex: string): Uint8Array {\r\n const result = new Uint8Array(hex.length / 2);\r\n for (let i = 0; i < hex.length; i += 2) {\r\n result[i / 2] = parseInt(hex.substring(i, i + 2), 16);\r\n }\r\n return result;\r\n }\r\n}\r\n","import { ChunkFileUtils, crc32_buffer, DbEntryPoint, summaryFromSupabaseByProject } from '@gaialabs/shared';\r\nimport { DbRootUtils, ChunkFile, BinType, DbRoot } from '@gaialabs/shared';\r\nimport { BlockReader, BlockWriter } from './extraction';\r\nimport { RomLayout, RomProcessor, Assembler, RomWriter } from './rebuild';\r\n\r\nexport class RomGenerator {\r\n //private readonly patchFiles: ChunkFile[] = [];\r\n public readonly projectName?: string;\r\n public crc: number = 0;\r\n public branchId: string = '';\r\n //private chunkFiles: ChunkFile[] = [];\r\n //private asmFiles: ChunkFile[] = [];\r\n public dbRoot: DbRoot = {} as DbRoot;\r\n private sourceData: Uint8Array = new Uint8Array();\r\n\r\n constructor(projectName?: string) {\r\n this.projectName = projectName;\r\n }\r\n\r\n public async initialize(){\r\n var projectData = await summaryFromSupabaseByProject(this.projectName);\r\n this.crc = projectData.baseRomBranch.gameRomBranch.gameRom.crc;\r\n this.branchId = projectData.id;\r\n }\r\n\r\n public async validateAndDownload(sourceData: Uint8Array){\r\n const calc = crc32_buffer(sourceData);\r\n if (calc === this.crc) {\r\n //Initialize database\r\n this.dbRoot = await DbRootUtils.fromSupabaseProject(this.projectName, this.branchId);\r\n this.sourceData = sourceData;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public async generateProject(modules: string[], manualFiles?: ChunkFile[], unshiftManualFiles: boolean = false): Promise<Uint8Array> {\r\n if(!this.dbRoot) throw new Error('Database not initialized');\r\n if(!this.sourceData) throw new Error('Source data not initialized');\r\n\r\n //Initialize chunks\r\n const reader = new BlockReader(this.sourceData, this.dbRoot);\r\n const chunkFiles = reader.analyzeAndResolve();\r\n const asmFiles = chunkFiles.filter(b => b.type === BinType.Assembly);\r\n const patchFiles: ChunkFile[] = [];\r\n\r\n //Convert asm blocks to text\r\n const writer = new BlockWriter(reader);\r\n for(const block of asmFiles) block.textData = writer.generateAsm(block);\r\n \r\n //Apply baserom files\r\n for (const chunkFile of this.dbRoot.baseRomFiles!) this.applyPatchFile(chunkFile, chunkFiles, asmFiles, patchFiles);\r\n\r\n //Apply base project files and collect module files\r\n const moduleLookup = this.applyProjectInit(chunkFiles, asmFiles, patchFiles);\r\n\r\n //Apply manual files (before modules)\r\n if(unshiftManualFiles) {\r\n for(const file of manualFiles ?? []) this.applyPatchFile(file, chunkFiles, asmFiles, patchFiles);\r\n }\r\n\r\n //Apply selected modules\r\n for(const module of modules) {\r\n for(const file of moduleLookup.get(module)!) this.applyPatchFile(file, chunkFiles, asmFiles, patchFiles);\r\n }\r\n\r\n //Apply manual files\r\n if(!unshiftManualFiles) {\r\n for(const file of manualFiles ?? []) this.applyPatchFile(file, chunkFiles, asmFiles, patchFiles);\r\n }\r\n \r\n this.assembleCodeFromText(asmFiles);\r\n\r\n //Apply code patches\r\n RomProcessor.applyPatches(asmFiles, patchFiles);\r\n\r\n //Calculate sizes\r\n for (const asm of chunkFiles) ChunkFileUtils.calculateSize(asm);\r\n\r\n //Assign locations\r\n const layout = new RomLayout(chunkFiles);\r\n layout.organize();\r\n\r\n //Rebase assemblies\r\n for (const file of asmFiles) ChunkFileUtils.rebase(file);\r\n\r\n this.generateAsmIncludeLookups(asmFiles);\r\n\r\n //Generate block lookup\r\n const blockLookup = new Map<string, number>();\r\n for (const f of chunkFiles) blockLookup.set(f.name.toUpperCase(), f.location);\r\n\r\n const outRom = await this.writeRom(blockLookup, this.dbRoot.entryPoints, chunkFiles, asmFiles);\r\n return outRom;\r\n }\r\n\r\n private applyProjectInit(chunkFiles: ChunkFile[], asmFiles: ChunkFile[], patchFiles: ChunkFile[]){\r\n const moduleLookup: Map<string, ChunkFile[]> = new Map();\r\n\r\n //Run a single pass to collect all the module files, and apply base files\r\n for (const chunkFile of this.dbRoot.projectFiles!) {\r\n // Parse the patch file with the assembler\r\n console.log(`Processing patch: ${chunkFile.name}`);\r\n\r\n //ChunkFile.group is the module name\r\n if(chunkFile.group){\r\n let modArray: ChunkFile[];\r\n if(!moduleLookup.has(chunkFile.group)) moduleLookup.set(chunkFile.group, modArray = []);\r\n else modArray = moduleLookup.get(chunkFile.group)!;\r\n //Add chunk file to module array\r\n modArray!.push(chunkFile);\r\n } else this.applyPatchFile(chunkFile, chunkFiles, asmFiles, patchFiles); //If chunk file is not part of a group, apply it now\r\n }\r\n\r\n return moduleLookup;\r\n }\r\n\r\n //Assemble code from script text\r\n private assembleCodeFromText(asmFiles: ChunkFile[]){\r\n for(const block of asmFiles) {\r\n const assembler = new Assembler(this.dbRoot, block.textData!);\r\n const { blocks, includes, reqBank } = assembler.parseAssembly();\r\n block.parts = blocks;\r\n block.includes = includes;\r\n block.bank = reqBank ?? undefined;\r\n }\r\n }\r\n\r\n // Build include lookup map per asm file\r\n private generateAsmIncludeLookups(asmFiles: ChunkFile[]){\r\n for (const f of asmFiles) {\r\n const includeBlocks = asmFiles\r\n .filter(x => f.includes?.has(x.name.toUpperCase()))\r\n .flatMap(x => x.parts!)\r\n .filter(b => !!b.label);\r\n\r\n f.includeLookup = new Map();\r\n\r\n for (const b of includeBlocks) {\r\n if (b.label) f.includeLookup.set(b.label.toUpperCase(), b);\r\n }\r\n\r\n for (const b of (f.parts || []).filter(x => !!x.label)) {\r\n if (b.label) f.includeLookup.set(b.label.toUpperCase(), b);\r\n }\r\n }\r\n }\r\n\r\n public applyPatchFile(chunkFile: ChunkFile, chunkFiles: ChunkFile[], asmFiles: ChunkFile[], patchFiles: ChunkFile[]): void {\r\n console.log(`Processing patch: ${chunkFile.name}`);\r\n const existing = chunkFiles.find(x => x.name === chunkFile.name);\r\n\r\n if(chunkFile.type === BinType.Patch || chunkFile.type === BinType.Assembly) {\r\n if(existing){\r\n existing.textData = chunkFile.textData;\r\n } else {\r\n if(chunkFile.type === BinType.Patch) {\r\n patchFiles.push(chunkFile);\r\n }\r\n asmFiles.push(chunkFile);\r\n chunkFiles.push(chunkFile);\r\n }\r\n } else {\r\n if(existing){\r\n existing.rawData = chunkFile.rawData;\r\n existing.size = chunkFile.size;\r\n } else {\r\n chunkFiles.push(chunkFile);\r\n }\r\n }\r\n }\r\n\r\n private async writeRom(blockLookup: Map<string, number>, entryPoints: DbEntryPoint[], chunkFiles: ChunkFile[], asmFiles: ChunkFile[]){\r\n //Create rom writer\r\n const romWriter = new RomWriter(entryPoints, \"GAIALABS\", \"01JG \");\r\n\r\n // Write all files\r\n for (const file of chunkFiles) await romWriter.writeFile(file, blockLookup);\r\n\r\n //Write header\r\n romWriter.writeHeader();\r\n\r\n //Write entry points\r\n romWriter.writeEntryPoints(asmFiles);\r\n\r\n //Write checksum\r\n romWriter.writeChecksum();\r\n\r\n return romWriter.outBuffer;\r\n }\r\n}","/**\r\n * Represents a single frame in a sprite animation sequence\r\n */\r\nexport class SpriteFrame {\r\n public duration: number;\r\n public groupIndex: number;\r\n \r\n /**\r\n * Internal offset to the group data (not serialized)\r\n */\r\n public groupOffset: number;\r\n\r\n constructor(duration: number = 0, groupIndex: number = 0, groupOffset: number = 0) {\r\n this.duration = duration;\r\n this.groupIndex = groupIndex;\r\n this.groupOffset = groupOffset;\r\n }\r\n} ","/**\r\n * Represents a single part/piece of a sprite\r\n */\r\nexport class SpritePart {\r\n public isLarge: boolean;\r\n public xOffset: number;\r\n public xOffsetMirror: number;\r\n public yOffset: number;\r\n public yOffsetMirror: number;\r\n public vMirror: boolean;\r\n public hMirror: boolean;\r\n public someOffset: number;\r\n public paletteIndex: number;\r\n public tileIndex: number;\r\n\r\n constructor() {\r\n this.isLarge = false;\r\n this.xOffset = 0;\r\n this.xOffsetMirror = 0;\r\n this.yOffset = 0;\r\n this.yOffsetMirror = 0;\r\n this.vMirror = false;\r\n this.hMirror = false;\r\n this.someOffset = 0;\r\n this.paletteIndex = 0;\r\n this.tileIndex = 0;\r\n }\r\n} ","import { SpritePart } from './SpritePart';\r\n\r\n/**\r\n * Represents a group of sprite parts that form a complete sprite frame\r\n */\r\nexport class SpriteGroup {\r\n public xOffset: number;\r\n public xOffsetMirror: number;\r\n public yOffset: number;\r\n public yOffsetMirror: number;\r\n public xRecoilHitboxOffset: number;\r\n public yRecoilHitboxOffset: number;\r\n public xRecoilHitboxTilesize: number;\r\n public yRecoilHitboxTilesize: number;\r\n public xHostileHitboxOffset: number;\r\n public xHostileHitboxSize: number;\r\n public yHostileHitboxOffset: number;\r\n public yHostileHitboxSize: number;\r\n public parts: SpritePart[];\r\n\r\n constructor() {\r\n this.xOffset = 0;\r\n this.xOffsetMirror = 0;\r\n this.yOffset = 0;\r\n this.yOffsetMirror = 0;\r\n this.xRecoilHitboxOffset = 0;\r\n this.yRecoilHitboxOffset = 0;\r\n this.xRecoilHitboxTilesize = 0;\r\n this.yRecoilHitboxTilesize = 0;\r\n this.xHostileHitboxOffset = 0;\r\n this.xHostileHitboxSize = 0;\r\n this.yHostileHitboxOffset = 0;\r\n this.yHostileHitboxSize = 0;\r\n this.parts = [];\r\n }\r\n} ","import { SpriteFrame } from './SpriteFrame';\r\nimport { SpriteGroup } from './SpriteGroup';\r\nimport { SpritePart } from './SpritePart';\r\n\r\n/**\r\n * Represents a complete sprite map with frame sets and groups\r\n */\r\nexport class SpriteMap {\r\n public frameSets: SpriteFrame[][];\r\n public groups: SpriteGroup[];\r\n\r\n constructor() {\r\n this.frameSets = [];\r\n this.groups = [];\r\n }\r\n\r\n /**\r\n * Create a SpriteMap from binary data\r\n * @param data Binary data buffer\r\n * @returns SpriteMap instance\r\n */\r\n public static fromBytes(data: Uint8Array): SpriteMap {\r\n let position = 0;\r\n\r\n const getByte = (): number => {\r\n if (position >= data.length) return 0;\r\n return data[position++];\r\n };\r\n\r\n const getUshort = (): number => {\r\n if (position + 1 >= data.length) return 0;\r\n const low = data[position++];\r\n const high = data[position++];\r\n return low | (high << 8);\r\n };\r\n\r\n const spriteMap = new SpriteMap();\r\n const setOffsets = new Set<number>();\r\n const groupOffsets = new Set<number>();\r\n\r\n // Read frame set offsets\r\n position = 0;\r\n while (!setOffsets.has(position)) {\r\n const offset = getUshort() - 0x4000;\r\n setOffsets.add(offset);\r\n }\r\n\r\n // Read frame sets\r\n for (const offStart of setOffsets) {\r\n position = offStart;\r\n const frameList: SpriteFrame[] = [];\r\n\r\n while (true) {\r\n const duration = getUshort();\r\n if (duration === 0xFFFF) {\r\n break;\r\n }\r\n\r\n const groupOffset = getUshort() - 0x4000;\r\n frameList.push(new SpriteFrame(duration, 0, groupOffset));\r\n groupOffsets.add(groupOffset);\r\n }\r\n\r\n spriteMap.frameSets.push(frameList);\r\n }\r\n\r\n // Read groups\r\n let grpIx = 0;\r\n const sortedGroupOffsets = Array.from(groupOffsets).sort((a, b) => a - b);\r\n \r\n for (const offStart of sortedGroupOffsets) {\r\n position = offStart;\r\n\r\n // Update frame group indices\r\n for (const set of spriteMap.frameSets) {\r\n for (const frame of set) {\r\n if (frame.groupOffset === offStart) {\r\n frame.groupIndex = grpIx;\r\n }\r\n }\r\n }\r\n\r\n const grp = new SpriteGroup();\r\n grp.xOffset = getByte();\r\n grp.xOffsetMirror = getByte();\r\n grp.yOffset = getByte();\r\n grp.yOffsetMirror = getByte();\r\n grp.xRecoilHitboxOffset = getByte();\r\n grp.yRecoilHitboxOffset = getByte();\r\n grp.xRecoilHitboxTilesize = getByte();\r\n grp.yRecoilHitboxTilesize = getByte();\r\n grp.xHostileHitboxOffset = getByte();\r\n grp.xHostileHitboxSize = getByte();\r\n grp.yHostileHitboxOffset = getByte();\r\n grp.yHostileHitboxSize = getByte();\r\n\r\n let numParts = getByte();\r\n while (numParts-- > 0) {\r\n const part = new SpritePart();\r\n part.isLarge = getByte() !== 0;\r\n part.xOffset = getByte();\r\n part.xOffsetMirror = getByte();\r\n part.yOffset = getByte();\r\n part.yOffsetMirror = getByte();\r\n\r\n const props = getUshort();\r\n part.vMirror = (props & 0x8000) !== 0;\r\n part.hMirror = (props & 0x4000) !== 0;\r\n part.someOffset = (props >> 12) & 0x3;\r\n part.paletteIndex = (props >> 9) & 0x7;\r\n part.tileIndex = props & 0x1FF;\r\n\r\n grp.parts.push(part);\r\n }\r\n\r\n spriteMap.groups.push(grp);\r\n grpIx++;\r\n }\r\n\r\n return spriteMap;\r\n }\r\n\r\n /**\r\n * Convert this SpriteMap to binary data\r\n * @returns Binary data buffer\r\n */\r\n public toBytes(): Uint8Array {\r\n // Calculate buffer size (estimate)\r\n let size = this.frameSets.length * 2; // Frame set offsets\r\n \r\n for (const set of this.frameSets) {\r\n size += (set.length * 4) + 2; // Frames + terminator\r\n }\r\n \r\n for (const grp of this.groups) {\r\n size += (grp.parts.length * 7) + 13; // Parts + group header\r\n }\r\n\r\n const buffer = new Uint8Array(size);\r\n let position = 0;\r\n\r\n const writeShort = (val: number): void => {\r\n buffer[position++] = val & 0xFF;\r\n buffer[position++] = (val >> 8) & 0xFF;\r\n };\r\n\r\n const writeLoc = (val: number): void => writeShort(val + 0x4000);\r\n\r\n let pos = this.frameSets.length << 1;\r\n const groupPos = new Array<number>(this.groups.length);\r\n\r\n // Write frame set offsets\r\n for (const set of this.frameSets) {\r\n writeLoc(pos);\r\n pos += (set.length << 2) + 2;\r\n }\r\n\r\n // Calculate group positions\r\n for (let i = 0; i < this.groups.length; i++) {\r\n groupPos[i] = pos;\r\n pos += this.groups[i].parts.length * 7 + 13;\r\n }\r\n\r\n // Write frame sets\r\n for (const set of this.frameSets) {\r\n for (const frm of set) {\r\n writeShort(frm.duration);\r\n writeLoc(groupPos[frm.groupIndex]);\r\n }\r\n writeShort(0xFFFF);\r\n }\r\n\r\n // Write groups\r\n for (const grp of this.groups) {\r\n buffer[position++] = grp.xOffset;\r\n buffer[position++] = grp.xOffsetMirror;\r\n buffer[position++] = grp.yOffset;\r\n buffer[position++] = grp.yOffsetMirror;\r\n buffer[position++] = grp.xRecoilHitboxOffset;\r\n buffer[position++] = grp.yRecoilHitboxOffset;\r\n buffer[position++] = grp.xRecoilHitboxTilesize;\r\n buffer[position++] = grp.yRecoilHitboxTilesize;\r\n buffer[position++] = grp.xHostileHitboxOffset;\r\n buffer[position++] = grp.xHostileHitboxSize;\r\n buffer[position++] = grp.yHostileHitboxOffset;\r\n buffer[position++] = grp.yHostileHitboxSize;\r\n buffer[position++] = grp.parts.length;\r\n\r\n for (const prt of grp.parts) {\r\n buffer[position++] = prt.isLarge ? 1 : 0;\r\n buffer[position++] = prt.xOffset;\r\n buffer[position++] = prt.xOffsetMirror;\r\n buffer[position++] = prt.yOffset;\r\n buffer[position++] = prt.yOffsetMirror;\r\n\r\n const accum = (prt.vMirror ? 0x8000 : 0)\r\n | (prt.hMirror ? 0x4000 : 0)\r\n | ((prt.someOffset & 0x3) << 12)\r\n | ((prt.paletteIndex & 0x7) << 9)\r\n | prt.tileIndex;\r\n\r\n writeShort(accum);\r\n }\r\n }\r\n\r\n // Return trimmed buffer\r\n return buffer.slice(0, position);\r\n }\r\n} ","// Universal ROM processing engine for GaiaLabs\r\n// This is the main entry point for gaia-core\r\n\r\n\r\n// Core modules\r\nexport * from './rom';\r\nexport * from './assembly';\r\nexport * from './compression';\r\nexport * from './sprites';\r\n\r\n// All core modules have been converted and are exported above\r\n\r\n/**\r\n * GaiaCore - Universal ROM processing engine\r\n * \r\n * This package provides the core functionality for ROM processing\r\n * that can run in both browser (Web Worker) and Node.js environments.\r\n * \r\n * High-level APIs:\r\n * - RomProcessor: Unified ROM processing workflows\r\n * - ProjectManager: Complete project lifecycle management\r\n * \r\n * Low-level modules:\r\n * - ROM: ROM state management, project configuration\r\n * - Assembly: 65816 instruction set, stack operations\r\n * - Compression: QuintetLZ compression algorithm\r\n * - Sprites: Sprite animation system\r\n */\r\nexport const GAIA_CORE_VERSION = '0.1.6';\r\n\r\n// Platform detection\r\nexport const isPlatformBrowser = typeof window !== 'undefined';\r\nexport const isPlatformNode = typeof process !== 'undefined' && process.versions?.node;\r\nexport const isPlatformWebWorker = typeof importScripts !== 'undefined'; "]}