phase9: coordinator absorption — 2 more regions (308 regions / 299 distinct bodies)

Coordinator absorbed partition B directly: 0x800F5AF8 (four pointer-slots
stored from constants — the globals at 0x8011A9E4 are POINTER VALUES read by
lw rt,sym then stored through, not direct symbol stores) and 0x80021FA8
(six 16-byte records, four fields zeroed via symbol+index, store-order fix).
0x800518BC recorded as a bounded return-merge negative. Gate MATCH
whole-binary SHA-1 e173426c157384ebf1b6caf8c6fea18a85a14af9.
This commit is contained in:
Christopher Williams
2026-09-24 00:50:56 -04:00
parent 85ae47d4a1
commit 345f5ecce6
3 changed files with 102 additions and 0 deletions
+2
View File
@@ -50,6 +50,7 @@
0x80021F24 0x80021F50 src/func_80021F24.c
0x80021F50 0x80021F64 src/func_80021F50.c
0x80021F88 0x80021FA8 src/func_80021F88.c
0x80021FA8 0x80021FF4 src/func_80021FA8.c
0x80022A60 0x80022A98 src/func_80022A60.c
0x80022FB8 0x80022FCC src/func_80022FB8.c
0x80022FCC 0x80022FFC src/func_80022FCC.c
@@ -227,6 +228,7 @@
0x800F3A00 0x800F3A24 src/func_800F3A00.c
0x800F3E70 0x800F3E88 src/func_800F3E70.c
0x800F5200 0x800F521C src/func_800F5200.c
0x800F5AF8 0x800F5B40 src/func_800F5AF8.c
0x800F5B40 0x800F5B70 src/func_800F5B40.c
0x800F6570 0x800F6594 src/func_800F6570.c
0x800F75D0 0x800F760C src/func_800F75D0.c
1 # Code-region registry: one C region per matched function.
50 0x80021F24
51 0x80021F50
52 0x80021F88
53 0x80021FA8
54 0x80022A60
55 0x80022FB8
56 0x80022FCC
228 0x800F3A00
229 0x800F3E70
230 0x800F5200
231 0x800F5AF8
232 0x800F5B40
233 0x800F6570
234 0x800F75D0
+52
View File
@@ -0,0 +1,52 @@
/* func_80021FA8 — 0x80021FA8..0x80021FF4 (76 bytes).
*
* Zeroes four fields of six 16-byte records starting at 0x8012627C.
* The base+index address is the symbol macro form (finding 1): the base is a
* symbol at 0x8012627C — `lui at,0x8012` / `addu at,at,v1` / `sw zero,%lo(at)`
* — and the four fields sit at offsets 0/4/8/12 relative to the record base.
* The walk is a bottom tested loop with the counter in v1.
*
* Original words (abridged):
* 0x00001821 move v1,zero
* loop:
* 0x3C018012 lui at,0x8012
* 0x00230821 addu at,at,v1
* 0xAC206280 sw zero,25216(at) ; field +0
* 0x3C018012 lui at,0x8012
* 0x00230821 addu at,at,v1
* 0xAC20627C sw zero,25212(at) ; field -4 (record-relative)
* 0x3C018012 lui at,0x8012
* 0x00230821 addu at,at,v1
* 0xAC206284 sw zero,25220(at) ; field +8
* 0x3C018012 lui at,0x8012
* 0x00230821 addu at,at,v1
* 0xAC206288 sw zero,25224(at) ; field +12
* 0x24630010 addiu v1,v1,16
* 0x28620060 slti v0,v1,96
* 0x1440FFF1 bnez v0,loop
* 0x00000000 nop
* 0x03E00008 jr ra
* 0x00000000 nop
*
* The record base is 0x8012627C and 25212 = -4 relative to the highest
* displacement: the four fields are laid out as (base-4)..(base+12) with the
* record stride 16. The symbol is named D_8012627C from the offset arithmetic.
*
* LIMITS: the "records" reading (16-byte stride, 6 records) is derived from
* the loop geometry; the field meanings are unknown. Only the compiled bytes
* are evidence.
*/
extern int D_8012627C;
void func_80021FA8(void)
{
int i;
for (i = 0; i < 96; i += 16) {
*(int *)((char *)&D_8012627C + i + 4) = 0;
*(int *)((char *)&D_8012627C + i + 0) = 0;
*(int *)((char *)&D_8012627C + i + 8) = 0;
*(int *)((char *)&D_8012627C + i + 12) = 0;
}
}
+48
View File
@@ -0,0 +1,48 @@
/* func_800F5AF8 — 0x800F5AF8..0x800F5B40 (72 bytes).
*
* Stores four constants into four fixed globals at 0x8011A9E4..0x8011A9F0.
* The globals are loaded ABSOLUTELY (finding 2's same-register `lw rt,sym`
* macro: `lui v0,0x8012` / `lw v0,-22044(v0)`), so the symbols are named
* from their effective addresses and resolve implicitly.
*
* Original words:
* 0x3C030400 lui v1,0x400
* 0x3C028012 lui v0,0x8012
* 0x8C42A9E4 lw v0,-22044(v0) ; v0 = D_8011A9E4
* 0x34630002 ori v1,v1,0x2
* 0xAC430000 sw v1,0(v0) ; D_8011A9E4 = 0x4000002
* 0x3C028012 lui v0,0x8012
* 0x8C42A9E8 lw v0,-22040(v0) ; v0 = D_8011A9E8
* 0x00000000 nop
* 0xAC440000 sw a0,0(v0) ; D_8011A9E8 = a0
* 0x3C028012 lui v0,0x8012
* 0x8C42A9EC lw v0,-22036(v0) ; v0 = D_8011A9EC
* 0x3C030100 lui v1,0x100
* 0xAC400000 sw zero,0(v0) ; D_8011A9EC = 0
* 0x3C028012 lui v0,0x8012
* 0x8C42A9F0 lw v0,-22032(v0) ; v0 = D_8011A9F0
* 0x34630401 ori v1,v1,0x401
* 0x03E00008 jr ra
* 0xAC430000 sw v1,0(v0) ; D_8011A9F0 = 0x1000401 (jr slot)
*
* The constants interleave with the symbol loads in cc1's order: the 0x4000002
* is materialised before its store, 0x1000401 after. Writing the stores in the
* byte order of the original reproduces that.
*
* LIMITS: the globals are named D_8011A9E4..F0 from the absolute addresses;
* their meaning is unknown. The argument is stored raw (a0). Only the
* compiled bytes are evidence.
*/
extern int D_8011A9E4;
extern int D_8011A9E8;
extern int D_8011A9EC;
extern int D_8011A9F0;
void func_800F5AF8(int value)
{
*(int *)D_8011A9E4 = 0x4000002;
*(int *)D_8011A9E8 = value;
*(int *)D_8011A9EC = 0;
*(int *)D_8011A9F0 = 0x1000401;
}