UNPKG

snes-disassembler

Version:

A Super Nintendo (SNES) ROM disassembler for 65816 assembly

96 lines 3.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RomHeaderParser = void 0; const cartridge_types_1 = require("./cartridge-types"); /** * Parses extended ROM header information to determine ROM mapping settings * Works with standard SNES ROMs following the copier header format */ class RomHeaderParser { /** * Detect enhanced ROM mapping settings based on common modes (LoROM/HiROM) */ static detectMappingMode(cartridgeInfo) { switch (cartridgeInfo.type) { case cartridge_types_1.CartridgeType.HiROM: return 'HiROM'; case cartridge_types_1.CartridgeType.ExHiROM: return 'ExHiROM'; case cartridge_types_1.CartridgeType.LoROM: return 'LoROM'; case cartridge_types_1.CartridgeType.ExLoROM: return 'ExLoROM'; default: return 'LoROM'; // Fallback to LoROM } } /** * Parses the ROM header to identify detailed memory mapping and special chip settings */ static parseROMHeader(data, offset) { const mapMode = data[offset + 0x15]; const cartridgeType = data[offset + 0x16]; const romSpeedByte = data[offset + 0x17]; const detectedType = (0, cartridge_types_1.detectCartridgeType)(mapMode, cartridgeType); const memorySpeed = (0, cartridge_types_1.getMemorySpeed)(mapMode); const cartridgeInfo = { type: detectedType, mapMode: mapMode, romSize: this.calculateROMSize(data[offset + 0x17]), ramSize: this.calculateRAMSize(data[offset + 0x18]), hasBattery: (0, cartridge_types_1.hasBatteryBackup)(cartridgeType), hasRTC: detectedType === cartridge_types_1.CartridgeType.SRTC, speed: memorySpeed, regions: [], // To be filled with actual memory regions specialChip: this.detectSpecialChip(cartridgeType) }; // Custom logic to determine ROM and RAM sizes, speed, regions // Example only, replace with actual implementation matching header data return cartridgeInfo; } static calculateROMSize(romSizeByte) { return Math.pow(2, romSizeByte + 10); // 2^(X+10) bytes } static calculateRAMSize(ramSizeByte) { return Math.pow(2, ramSizeByte + 10); // 2^(X+10) bytes } static detectSpecialChip(cartridgeType) { switch (cartridgeType) { case 0x13: case 0x14: case 0x15: case 0x1A: return 'SuperFX Graphics Support Unit'; case 0x34: case 0x35: return 'SA-1 Super Accelerator'; case 0x03: return 'DSP-1 Digital Signal Processor'; case 0x05: return 'DSP-2 Digital Signal Processor'; case 0x06: return 'DSP-3 Digital Signal Processor'; case 0x0A: return 'DSP-4 Digital Signal Processor'; case 0x43: case 0x45: return 'S-DD1 Data Decompression'; case 0x55: return 'S-RTC Real-Time Clock'; case 0xF3: return 'CX4 Math Coprocessor'; case 0xF5: return 'ST010 Graphics Processor'; case 0xF6: return 'ST011 Graphics Processor'; case 0xF9: return 'SPC7110 Data Decompression'; case 0xFE: return 'MSU-1 Audio Enhancement'; default: return undefined; } } } exports.RomHeaderParser = RomHeaderParser; //# sourceMappingURL=rom-header-parser.js.map