Skip to content

Commit b4e932b

Browse files
correctly order jump table entry blocks for games with multiple jump table-entered instructions
1 parent 935d447 commit b4e932b

1 file changed

Lines changed: 16 additions & 4 deletions

File tree

src/rebuilder.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ fn assemble_script<B: ByteOrder>(
3737
let mut previous_jump_entries = std::collections::HashSet::new();
3838

3939
let mut jump_entry_counts = HashMap::<u32, u32>::new();
40-
let mut jump_table_buffer: Vec<u8> = Vec::new();
40+
let mut jump_table_buffers: HashMap<u32, Vec<u8>> = HashMap::new();
4141

4242
for instruction in program {
4343
log::debug!("finding info for {}", instruction.name);
@@ -89,8 +89,16 @@ fn assemble_script<B: ByteOrder>(
8989
// this check deduplicates jump table entries
9090
// TODO: make game-specific config option, seems to be needed
9191
if previous_jump_entries.insert(name.0.clone()) {
92-
jump_table_buffer.write_all(&name.to_vec()).unwrap();
93-
jump_table_buffer.write_u32::<B>(offset).unwrap();
92+
jump_table_buffers
93+
.entry(instruction_info.id())
94+
.or_insert(Vec::new())
95+
.write_all(&name.to_vec())
96+
.unwrap();
97+
jump_table_buffers
98+
.entry(instruction_info.id())
99+
.or_insert(Vec::new())
100+
.write_u32::<B>(offset)
101+
.unwrap();
94102
jump_entry_counts
95103
.entry(instruction_info.id())
96104
.or_insert(0)
@@ -169,7 +177,11 @@ fn assemble_script<B: ByteOrder>(
169177
result.write_u32::<B>(*count).unwrap();
170178
}
171179

172-
result.append(&mut jump_table_buffer);
180+
for id in &db.jump_table_ids {
181+
if let Some(buffer) = jump_table_buffers.get_mut(id) {
182+
result.append(buffer);
183+
}
184+
}
173185
result.append(&mut script_buffer);
174186

175187
let result = result;

0 commit comments

Comments
 (0)