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)
|
||||
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)
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue