diff --git a/config/match_worklist.tsv b/config/match_worklist.tsv index bda6376..f184a73 100644 --- a/config/match_worklist.tsv +++ b/config/match_worklist.tsv @@ -959,7 +959,7 @@ 952 0x801007E0 0x80100808 40 fallthrough 3 frame 1 - 1 # # listed=952 -# excluded_already_registered=728 +# excluded_already_registered=731 # excluded_bad_extent_start=8 # excluded_degenerate_body=252 # excluded_delay_slot_start=5 @@ -968,6 +968,6 @@ # excluded_low_confidence_grade=90 # excluded_named_exclusion=9 # excluded_no_extent=0 -# excluded_recorded_negative=100 +# excluded_recorded_negative=97 # excluded_restores_unsaved=11 # excluded_trapping_arith=48 diff --git a/config/regions.tsv b/config/regions.tsv index e393480..21d6c67 100644 --- a/config/regions.tsv +++ b/config/regions.tsv @@ -378,10 +378,12 @@ 0x80073250 0x80073284 src/func_80073250.c 0x80073364 0x800733C4 src/func_80073364.c 0x800734A4 0x800734DC src/func_800734A4.c +0x8007374C 0x80073798 src/func_8007374C.c 0x80073F78 0x8007405C src/func_80073F78.c 0x80074C00 0x80074C74 src/func_80074C00.c 0x8007759C 0x800775E4 src/func_8007759C.c 0x80077D04 0x80077D7C src/func_80077D04.c +0x8007A114 0x8007A16C src/func_8007A114.c 0x8007A2AC 0x8007A324 src/func_8007A2AC.c 0x8007A404 0x8007A428 src/func_8007A404.c 0x8007A428 0x8007A4FC src/func_8007A428.c @@ -604,6 +606,7 @@ 0x800F6E50 0x800F6ED0 src/func_800F6E50.c maspsx=epilogue 0x800F6F20 0x800F6F5C src/func_800F6F20.c 0x800F75D0 0x800F760C src/func_800F75D0.c +0x800F7610 0x800F765C src/func_800F7610.c maspsx=epilogue 0x800F7990 0x800F79C0 src/func_800F7990.c 0x800F79C0 0x800F79F0 src/func_800F79C0.c 0x800F79F0 0x800F7A20 src/func_800F79F0.c diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 4bf7501..4cbf51b 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -6,11 +6,11 @@ ## STATE — SOLO CONTINUATION, 2026-09-24 (current) -**721 bodies / 730 regions**, from 685 / 694 at the last session stop — **+36 bodies / +36 regions**. -The Phase 12 milestone remains 750 bodies, so **+29 remains**. The promoted whole-binary gate is green: -`c_regions=730`, `differing_bytes=0`, SHA-1 +**724 bodies / 733 regions**, from 685 / 694 at the last session stop — **+39 bodies / +39 regions**. +The Phase 12 milestone remains 750 bodies, so **+26 remains**. The promoted whole-binary gate is green: +`c_regions=733`, `differing_bytes=0`, SHA-1 `e173426c157384ebf1b6caf8c6fea18a85a14af9`; 348 synthetic tests pass and extents report -`regions=730 disagreements=0 result=AGREE`. +`regions=733 disagreements=0 result=AGREE`. The requested second batch of 20 is complete. Twenty additional bodies are now matched: `0x800BC9C4`, `0x800BC8C4`, `0x8006BB0C`, `0x8002D17C`, `0x801029A0`, `0x80055958`, @@ -24,7 +24,7 @@ Final clean verification (2026-09-25): `make clean && make all`, `make worklist` `make extents-verify`, and `make check` all exited 0. Both clean assembly and code rebuilds matched the USA executable byte-for-byte; each is 1,886,208 bytes with SHA-1 `e173426c157384ebf1b6caf8c6fea18a85a14af9`. The final worklist is 952 rows and the extents -check reports `regions=730 disagreements=0 result=AGREE`. +check reports `regions=733 disagreements=0 result=AGREE`. ## STATE — SESSION STOP, 2026-09-24 23:35 (historical; superseded by the state above, kept for provenance) **685 bodies / 694 regions**, from 602 / 611 at the Phase 11 close — **+83 bodies**. **Milestone 750 was NOT diff --git a/phase-ends/logs/Phase12.md b/phase-ends/logs/Phase12.md index a33de86..3ce0e4f 100644 --- a/phase-ends/logs/Phase12.md +++ b/phase-ends/logs/Phase12.md @@ -2470,3 +2470,22 @@ SHA-1, exit 0. `make check` passed with 348 tests and extents `regions=730 disag **Count after the peer batch: 721 bodies / 730 regions (+119 bodies from the Phase 12 open baseline; +29 remain to milestone 750).** + +### Peer batch 2 — `0x8007374C` and `0x800F7610` MATCH + +* `0x8007374C..0x80073798`, 76/76, plain C with hard-bound object/counter registers. +* `0x800F7610..0x800F765C`, 76/76, three callback loads with `maspsx=epilogue`. +* Both peer sources were copied to tracked paths, freshly re-verified, and merged as a two-region + candidate. The candidate whole-binary gate passed at `c_regions=732`, zero differing bytes, + expected SHA-1, exit 0. + +### Worker D claim — `0x8007A114` MATCH + +* `0x8007A114..0x8007A16C`, 88/88, default toolchain. The scaled index is written before the literal + base in the address addition to preserve the original commutative operand order. +* Fresh range and candidate whole-binary gate both passed with zero differing bytes; the candidate + gate reported `c_regions=733`, expected SHA-1, exit 0. `make check` passed with 348 tests and + extents `regions=733 disagreements=0`; worklist regeneration reports 952 rows. + +**Count after task 27: 724 bodies / 733 regions (+122 bodies from the Phase 12 open baseline; ++26 remain to milestone 750).** diff --git a/src/func_8007374C.c b/src/func_8007374C.c new file mode 100644 index 0000000..0e751b7 --- /dev/null +++ b/src/func_8007374C.c @@ -0,0 +1,26 @@ +/* + * func_8007374C — 76 bytes at 0x8007374C..0x80073798 + * + * Allocate/look up an object, clear its state word, and initialize its tag + * from the caller's shifted index plus the low nibble of g_80122354. + * + * The object layout and helper meaning are address-based hypotheses; the + * instruction match is the evidence for this region. + */ + +typedef struct Obj { char pad[30]; short tag; char pad2[8]; short state; } Obj; +extern Obj *func_80073798(int); +extern int g_80122354; + +void func_8007374C(int a0) +{ + register int s0 __asm__("$16") = a0; + register Obj *p __asm__("$4") = func_80073798(s0); + register int shifted __asm__("$3"); + + if (p) { + p->state = 0; + shifted = s0 << 4; + p->tag = (short)(shifted + (g_80122354 & 15)); + } +} diff --git a/src/func_8007A114.c b/src/func_8007A114.c new file mode 100644 index 0000000..c03627a --- /dev/null +++ b/src/func_8007A114.c @@ -0,0 +1,26 @@ +/* + * func_8007A114 — 88 bytes at 0x8007A114..0x8007A16C + * + * Resolve a record from a short index and a literal base pointer, select one + * of two values according to the record tag, and return its low bit. + * + * The scaled index is written before the base in the address addition to + * preserve the original commutative operand order. The base address is literal + * because this site uses an absolute load despite the registry's gp marker. + * + * The structure meanings are address-based hypotheses; the byte match is the + * evidence for this region. + */ + +int func_8007A114(char *a0) +{ + char *p = (char *)(*(short *)(a0 + 2) * 76 + *(int *)0x80121BFC); + unsigned int v; + + if (*(unsigned char *)(p + 42) == 24) + v = *(unsigned int *)(p + 40) >> 8; + else + v = *(unsigned short *)(*(int *)(a0 + 28) + 6); + + return v & 1; +} diff --git a/src/func_800F7610.c b/src/func_800F7610.c new file mode 100644 index 0000000..209025c --- /dev/null +++ b/src/func_800F7610.c @@ -0,0 +1,25 @@ +/* + * func_800F7610 — 76 bytes at 0x800F7610..0x800F765C + * + * Dispatch three fields from an object to three helpers. The original keeps + * the object pointer in s0 and uses the documented epilogue delay-slot shape. + * + * REGION TOKEN: `maspsx=epilogue`. + * + * The field names and helper purposes are address-based hypotheses; the byte + * match is the evidence for this region. + */ + +typedef struct Obj { short h0; int w4; unsigned char b8, b9, b10; } Obj; +extern void func_80103B54(short); +extern void func_80103B60(int); +extern void func_80103B6C(unsigned char, unsigned char, unsigned char); + +void func_800F7610(Obj *a0) +{ + register Obj *s0 __asm__("$16") = a0; + + func_80103B54(s0->h0); + func_80103B60(s0->w4); + func_80103B6C(s0->b8, s0->b9, s0->b10); +}