dethrace/reccmp/notes.md

51 lines
1.2 KiB
Markdown

# Decomp notes
The original code generally prefers:
1. ">" instead of "<=" and vice versa
2. Generally nested if statements instead of early returns
3. For loops like `(i = 0, ptr = start_of_array; condition; i++, ptr++)`
In a for loop, a pattern lile this indicates something like
```asm
jne 0x5
jmp -0x10a
```
```
if (1) {
continue;
}
```
Pulling a local variable into a compiler-generated variable, then a set of cmp/jmp's pointing to code
locations above means a switch. The ordering of the cmp/jmp appears to be numerically sorted, regardless of
the ordering in the origina C code
For example, this came from a switch statement like
```
switch (version) {
case '2':
case '3':
case '4':
...
case '1':
...
break;
}
```
```
.text:0041F567 loc_41F567: ; CODE XREF: ReadMechanicsData+680↑j
.text:0041F567 cmp [ebp+var_1A8], 31h ; '1'
.text:0041F56E jz loc_41F4F2
.text:0041F574 cmp [ebp+var_1A8], 32h ; '2'
.text:0041F57B jl loc_41F593
.text:0041F581 cmp [ebp+var_1A8], 34h ; '4'
.text:0041F588 jle loc_41F480
.text:0041F58E jmp $+5
```