From a6584e1978759abfda5fdf307d34247e918286a5 Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Fri, 25 Sep 2026 09:33:55 -0400 Subject: [PATCH] phase12: match four worker claims (730 bodies / 739 regions) --- config/match_worklist.tsv | 4 ++-- config/regions.tsv | 4 ++++ phase-ends/CURRENT_PHASE.md | 10 +++++----- phase-ends/logs/Phase12.md | 17 +++++++++++++++++ src/func_80037984.c | 22 ++++++++++++++++++++++ src/func_8003EB18.c | 21 +++++++++++++++++++++ src/func_800C1E54.c | 22 ++++++++++++++++++++++ src/func_800F8928.c | 18 ++++++++++++++++++ 8 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 src/func_80037984.c create mode 100644 src/func_8003EB18.c create mode 100644 src/func_800C1E54.c create mode 100644 src/func_800F8928.c diff --git a/config/match_worklist.tsv b/config/match_worklist.tsv index eb66d56..5d4669d 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=733 +# excluded_already_registered=737 # 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=95 +# excluded_recorded_negative=91 # excluded_restores_unsaved=11 # excluded_trapping_arith=48 diff --git a/config/regions.tsv b/config/regions.tsv index 43ba415..29a0402 100644 --- a/config/regions.tsv +++ b/config/regions.tsv @@ -212,6 +212,7 @@ 0x80036F70 0x8003713C src/func_80036F70.c 0x8003768C 0x800376CC src/func_8003768C.c 0x800376CC 0x80037770 src/func_800376CC.c +0x80037984 0x800379E0 src/func_80037984.c 0x80038788 0x80038790 src/func_80038788.c 0x80038790 0x8003879C src/func_80038790.c 0x80038D48 0x80038DD8 src/func_80038D48.c @@ -223,6 +224,7 @@ 0x8003B320 0x8003B34C src/func_8003B320.c 0x8003CB8C 0x8003CBE4 src/func_8003CB8C.c 0x8003D310 0x8003D35C src/func_8003D310.c +0x8003EB18 0x8003EB84 src/func_8003EB18.c 0x80041610 0x80041688 src/func_80041610.c 0x800419D0 0x80041A24 src/func_800419D0.c 0x80041A24 0x80041A58 src/func_80041A24.c @@ -580,6 +582,7 @@ 0x800BFEE0 0x800BFF00 src/func_800BFEE0.c 0x800BFF00 0x800BFF20 src/func_800BFF00.c 0x800C1424 0x800C14BC src/func_800C1424.c +0x800C1E54 0x800C1EA8 src/func_800C1E54.c 0x800C1EA8 0x800C1F04 src/func_800C1EA8.c 0x800C3514 0x800C356C src/func_800C3514.c 0x800C5C84 0x800C5CBC src/func_800C5C84.c @@ -620,6 +623,7 @@ 0x800F8294 0x800F82A4 src/func_800F8294.c 0x800F8638 0x800F8658 src/func_800F8638.c 0x800F88F0 0x800F8928 src/func_800F88F0.c maspsx=epilogue +0x800F8928 0x800F8970 src/func_800F8928.c maspsx=epilogue 0x800F8A0C 0x800F8A48 src/func_800F8A0C.c 0x800F8ACC 0x800F8ADC src/func_800F8ACC.c 0x800F8ADC 0x800F8AEC src/func_800F8ADC.c diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index f602749..250330c 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -6,11 +6,11 @@ ## STATE — SOLO CONTINUATION, 2026-09-24 (current) -**726 bodies / 735 regions**, from 685 / 694 at the last session stop — **+41 bodies / +41 regions**. -The Phase 12 milestone remains 750 bodies, so **+24 remains**. The promoted whole-binary gate is green: -`c_regions=735`, `differing_bytes=0`, SHA-1 +**730 bodies / 739 regions**, from 685 / 694 at the last session stop — **+45 bodies / +45 regions**. +The Phase 12 milestone remains 750 bodies, so **+20 remains**. The promoted whole-binary gate is green: +`c_regions=739`, `differing_bytes=0`, SHA-1 `e173426c157384ebf1b6caf8c6fea18a85a14af9`; 348 synthetic tests pass and extents report -`regions=735 disagreements=0 result=AGREE`. +`regions=739 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=735 disagreements=0 result=AGREE`. +check reports `regions=739 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 69b71a5..0be879a 100644 --- a/phase-ends/logs/Phase12.md +++ b/phase-ends/logs/Phase12.md @@ -2502,3 +2502,20 @@ SHA-1, exit 0. `make check` passed with 348 tests and extents `regions=730 disag **Count after task 29: 726 bodies / 735 regions (+124 bodies from the Phase 12 open baseline; +24 remain to milestone 750).** + +### Worker B batch — four exact claims + +The fresh tracked sources were re-verified and merged after the worker's claims: + +* `0x800F8928..0x800F8970`, 72/72, `maspsx=epilogue`. +* `0x800C1E54..0x800C1EA8`, 84/84, guarded local escaping to a third call. +* `0x80037984..0x800379E0`, 92/92, with the first helper argument distinct from the later + `+5356` argument. +* `0x8003EB18..0x8003EB84`, 108/108, absolute state read and symbol-form callback address. + +The four-region candidate whole-binary gate passed at `c_regions=739`, zero differing bytes, expected +SHA-1, exit 0. `make check` passed with 348 tests and extents `regions=739 disagreements=0`; worklist +regeneration remains 952 rows. + +**Count after task 33: 730 bodies / 739 regions (+128 bodies from the Phase 12 open baseline; ++20 remain to milestone 750).** diff --git a/src/func_80037984.c b/src/func_80037984.c new file mode 100644 index 0000000..39aa9d7 --- /dev/null +++ b/src/func_80037984.c @@ -0,0 +1,22 @@ +/* + * func_80037984 — 92 bytes at 0x80037984..0x800379E0 + * + * Resolve a record, pass the original argument plus a fixed offset to a helper, + * then mark the resolved record and return success. The first helper receives + * the original argument; the +5356 setup belongs to the later call. + */ + +int func_800376CC(int); +void func_80026560(int, int *); + +int func_80037984(int a0) +{ + int *p = (int *)func_800376CC(a0); + + if (p != 0) { + func_80026560(a0 + 5356, p); + *(int *)*p = -1; + return 1; + } + return 0; +} diff --git a/src/func_8003EB18.c b/src/func_8003EB18.c new file mode 100644 index 0000000..fc4d879 --- /dev/null +++ b/src/func_8003EB18.c @@ -0,0 +1,21 @@ +/* + * func_8003EB18 — 108 bytes at 0x8003EB18..0x8003EB84 + * + * Select one of two callback argument modes from the input value and the + * absolute state word at 0x80121A80. The callback data address is a symbol so + * the original lui/addiu materialization is retained. + */ + +extern char D_8003EA88[]; +void func_800137C8(int, int, int); + +void func_8003EB18(int a0, int a1) +{ + if (a1 == 127) { + if (*(int *)0x80121A80 != 3) + func_800137C8((int)D_8003EA88, 1, 1); + } else { + if (*(int *)0x80121A80 == 3) + func_800137C8((int)D_8003EA88, 1, 0); + } +} diff --git a/src/func_800C1E54.c b/src/func_800C1E54.c new file mode 100644 index 0000000..e49423a --- /dev/null +++ b/src/func_800C1E54.c @@ -0,0 +1,22 @@ +/* + * func_800C1E54 — 84 bytes at 0x800C1E54..0x800C1EA8 + * + * When the argument's field at +468 is nonzero, obtain a value, pass it to a + * second helper, then pass its address to a third helper. The local starts at + * zero inside the guarded block because its address escapes. + */ + +int func_800C14BC(void); +void func_800C1A58(int, int); +void func_80026650(int *); + +void func_800C1E54(int a0) +{ + if (*(int *)(a0 + 468) != 0) { + int v = 0; + + v = func_800C14BC(); + func_800C1A58(a0, v); + func_80026650(&v); + } +} diff --git a/src/func_800F8928.c b/src/func_800F8928.c new file mode 100644 index 0000000..ae67d89 --- /dev/null +++ b/src/func_800F8928.c @@ -0,0 +1,18 @@ +/* + * func_800F8928 — 72 bytes at 0x800F8928..0x800F8970 + * + * Call the stored function pointer with the first argument, then pass its + * result and the original second/third arguments to a fixed helper. + * + * REGION TOKEN: `maspsx=epilogue`. + */ + +extern int D_8011FE24; +void func_8010513C(int, int, int); + +void func_800F8928(int a0, int a1, int a2) +{ + int v = ((int (*)(int))D_8011FE24)(a0); + + func_8010513C(v, a1, a2); +}