SFX disassembler

This commit is contained in:
Luke Hubmayer-Werner 2024-07-17 23:20:02 +09:30
parent 59de8aa820
commit 3ebcf6883f
2 changed files with 47 additions and 0 deletions

View File

@ -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)

View File

@ -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: