From 3ebcf6883f6608aba63f0b1a32dc5bb3ca39ba30 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Wed, 17 Jul 2024 23:20:02 +0930 Subject: [PATCH] SFX disassembler --- scripts/loaders/RomLoader.gd | 2 ++ scripts/loaders/snes/music.gd | 45 +++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/scripts/loaders/RomLoader.gd b/scripts/loaders/RomLoader.gd index e9230fb..bfb965e 100644 --- a/scripts/loaders/RomLoader.gd +++ b/scripts/loaders/RomLoader.gd @@ -107,6 +107,8 @@ func load_snes_rom_from_bytes(bytes: PoolByteArray) -> void: MapLoader.load_snes_rom(self.snes_data, self.snes_buffer) yield(_on_loader_loading_stage_updated('Finished loading!', 'RomLoader'), 'completed') emit_signal('rom_loaded') + var music = load('res://scripts/loaders/snes/music_ff5.gd').new() + music.disassemble_sfx(self.snes_buffer) func load_snes_rom(filename: String) -> void: var error := rom_snes.open(filename, File.READ) diff --git a/scripts/loaders/snes/music.gd b/scripts/loaders/snes/music.gd index 16d8878..8d3f8a1 100644 --- a/scripts/loaders/snes/music.gd +++ b/scripts/loaders/snes/music.gd @@ -163,6 +163,51 @@ func translate_instruction(buffer: StreamPeer) -> Array: operands.append(buffer.get_8()) return operands +func disassemble_raw(buffer: StreamPeerBuffer, labels: Dictionary, address_start := 0x3000, address_end := 0x4800) -> PoolStringArray: + var output := PoolStringArray() + var address := address_start + var address_offset: int = address_start - buffer.get_position() + var ins_labels := EventType.keys() + while address < address_end: + if address in labels: + output.append(labels[address]) + var instruction := translate_instruction(buffer) + var event_type = instruction[0] + match event_type: + EventType.NOTE: + var pulses = instruction[2] + match instruction[1]: + NOTE_IS_REST: + output.append(' $%04x: NOTE_REST %d pulses'%[address, pulses]) + NOTE_IS_TIE: + output.append(' $%04x: NOTE_TIE %d pulses'%[address, pulses]) + var pitch: + output.append(' $%04x: NOTE %d %d pulses'%[address, pitch, pulses]) + _: + if len(instruction) > 1: + output.append(' $%04x: %s %s'%[address, ins_labels[event_type], instruction.slice(1, -1)]) + else: + output.append(' $%04x: %s'%[address, ins_labels[event_type]]) + address = address_offset + buffer.get_position() + return output + +func disassemble_sfx(buffer: StreamPeerBuffer): + var labels := {} + buffer.seek(0x041F97) + for sfx in 178: + for channel in 2: + var offset: int = buffer.get_u16() + if offset >= 0x3000: + if offset in labels: + labels[offset] = labels[offset] + ', SFX_0x%02X:%d'%[sfx, channel] + labels[offset] = 'SFX_0x%02X:%d'%[sfx, channel] + buffer.seek(0x042397) + var lines := disassemble_raw(buffer, labels) + var file := File.new() + file.open('output/sfx_bank_disassembly.txt', File.WRITE) + for line in lines: + file.store_line(line) + file.close() func unroll_track(buffer: StreamPeerBuffer, bgm_start_pos: int, track_start_pos: int, bgm_end_pos: int, bgm_id='N/A') -> Array: # There are three ways a track's data can end: