phase9: absorption — 0x800A623C + 0x800A5CEC (348 regions / 339 bodies)

Two more coordinator tier-2 wrappers, both first-try: 0x800A623C
(symbol-form constant + pass-through swap), 0x800A5CEC (guarded call with
zero in the jal slot). Gate MATCH whole-binary SHA-1
e173426c157384ebf1b6caf8c6fea18a85a14af9.
This commit is contained in:
Christopher Williams
2026-09-24 01:37:17 -04:00
parent 140549ede4
commit 13efa438ce
3 changed files with 72 additions and 0 deletions
+2
View File
@@ -221,6 +221,8 @@
0x800A2F20 0x800A2F44 src/func_800A2F20.c
0x800A45E0 0x800A466C src/func_8009E8D0.c
0x800A5CC8 0x800A5CEC src/func_800A5CC8.c
0x800A5CEC 0x800A5D24 src/func_800A5CEC.c
0x800A623C 0x800A6268 src/func_800A623C.c
0x800A6268 0x800A6294 src/func_800A6268.c
0x800A648C 0x800A64C8 src/func_800A648C.c
0x800A74BC 0x800A74D0 src/func_800A74BC.c
1 # Code-region registry: one C region per matched function.
221 0x800A2F20
222 0x800A45E0
223 0x800A5CC8
224 0x800A5CEC
225 0x800A623C
226 0x800A6268
227 0x800A648C
228 0x800A74BC
+37
View File
@@ -0,0 +1,37 @@
/* func_800A5CEC — 0x800A5CEC..0x800A5D24 (56 bytes).
*
* When bit 0 of arg->byte_27 is clear, calls func_800A5C1C with a signed
* halfword from arg+2 and zero.
*
* Original words:
* 0x27BDFFE8 addiu sp,sp,-24
* 0xAFBF0010 sw ra,16(sp)
* 0x90820027 lbu v0,39(a0) ; v0 = arg->byte_27
* 0x00000000 nop
* 0x30420001 andi v0,v0,0x1
* 0x14400004 bnez v0,done ; if (bit0 != 0) -> skip
* 0x00000000 nop
* 0x84840002 lh a0,2(a0) ; a0 = *(short *)(arg + 2)
* 0x0C029707 jal func_800A5C1C
* 0x00002821 move a1,zero ; (delay) a1 = 0
* done:
* 0x8FBF0010 lw ra,16(sp)
* 0x27BD0018 addiu sp,sp,24
* 0x03E00008 jr ra
* 0x00000000 nop
*
* The guard inverts: the call happens when the AND result is zero
* (bit0 clear). The second argument is the zero constant in the jal
* delay slot.
*
* LIMITS: the +39 byte flag and +2 halfword offsets are hypotheses; the
* bytes are the evidence. Only the compiled bytes are evidence.
*/
void func_800A5C1C(int, int);
void func_800A5CEC(char *arg)
{
if ((arg[39] & 1) == 0)
func_800A5C1C(*(short *)(arg + 2), 0);
}
+33
View File
@@ -0,0 +1,33 @@
/* func_800A623C — 0x800A623C..0x800A6268 (44 bytes).
*
* Calls func_80012DE8 with a fixed address and the forwarded argument.
*
* Original words:
* 0x27BDFFE8 addiu sp,sp,-24
* 0xAFBF0010 sw ra,16(sp)
* 0x00802821 move a1,a0 ; a1 = arg (forwarded)
* 0x3C048012 lui a0,0x8012
* 0x24843660 addiu a0,a0,13920 ; a0 = 0x80123660 (symbol form)
* 0x0C004B7A jal func_80012DE8
* 0x00000000 nop
* 0x8FBF0010 lw ra,16(sp)
* 0x27BD0018 addiu sp,sp,24
* 0x03E00008 jr ra
* 0x00000000 nop
*
* The fixed address uses the symbol materialisation (lui+addiu), so it is
* written as a symbol constant (finding 5). a0/a1 are swapped: the constant
* takes the first slot, the argument the second (pass-through idiom).
*
* LIMITS: the fixed address's meaning is a hypothesis. Only the compiled
* bytes are evidence.
*/
void func_80012DE8(int, int);
extern int D_80123660;
void func_800A623C(int arg)
{
func_80012DE8((int)&D_80123660, arg);
}