SFX disassembler
This commit is contained in:
parent
59de8aa820
commit
3ebcf6883f
|
@ -107,6 +107,8 @@ func load_snes_rom_from_bytes(bytes: PoolByteArray) -> void:
|
||||||
MapLoader.load_snes_rom(self.snes_data, self.snes_buffer)
|
MapLoader.load_snes_rom(self.snes_data, self.snes_buffer)
|
||||||
yield(_on_loader_loading_stage_updated('Finished loading!', 'RomLoader'), 'completed')
|
yield(_on_loader_loading_stage_updated('Finished loading!', 'RomLoader'), 'completed')
|
||||||
emit_signal('rom_loaded')
|
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:
|
func load_snes_rom(filename: String) -> void:
|
||||||
var error := rom_snes.open(filename, File.READ)
|
var error := rom_snes.open(filename, File.READ)
|
||||||
|
|
|
@ -163,6 +163,51 @@ func translate_instruction(buffer: StreamPeer) -> Array:
|
||||||
operands.append(buffer.get_8())
|
operands.append(buffer.get_8())
|
||||||
return operands
|
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:
|
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:
|
# There are three ways a track's data can end:
|
||||||
|
|
Loading…
Reference in New Issue