From 4af8896a9433f9a0011414f3065dfcf91286e70f Mon Sep 17 00:00:00 2001 From: Joebannerlord Date: Sun, 1 Nov 2026 10:36:47 -0600 Subject: [PATCH] feat(rac4): match forty-five NTSC-U helpers Add 45 independently verified functions totaling 1,936 retail bytes and the pinned compiler routes needed to reproduce them. Preserve whole-file flags, upstream SN float handling and the original reconstructed sources. Correct the proven US inventory split at 01EC3498 without unrelated churn. Full compilation passes for 5,306 source files; 26 route/profile tests pass. Fresh objects match retail after standard relocation resolution in memory, with 28 actual call/address target groups verified and no object patches. US coverage/progress passes at 4,520 functions / 352,712 bytes. The like-for-like audit gains 45 exact functions with no new discrepancies. Retain three existing non-exact and 827 unlisted functions, 80 relocation mismatches and three unresolved targets. PAL inputs are unavailable; its coverage guard lacks 45 new US rows and must be completed before merge. No PAL result, game behavior or whole-tree clean audit is claimed. Retail inputs, binaries, generated assembly and scratch evidence stay local. Co-Authored-By: Codex --- README.md | 10 +- config/us/inventory.tsv | 3 +- config/us/map.tsv | 45 + docs/TOOLCHAIN.md | 170 +++ notes/ntscu-batch-2026-10-31.md | 98 ++ notes/ntscu-five-04.md | 71 + notes/ntscu-five-05.md | 56 + notes/ntscu-five-06.md | 55 + notes/ntscu-five-2026-10-31.md | 249 +++ notes/ntscu-fortyfive-publication.md | 97 ++ notes/ntscu-single-2026-10-31.md | 39 + notes/ntscu-twenty-07.md | 85 ++ progress/report.json | 2109 ++++++++++++++++++++------ src/core/001221D8.c | 21 + src/core/0014ADD8.c | 14 + src/core/0014C368.c | 9 + src/core/0014D010.c | 11 + src/core/0014DE80.c | 12 + src/net/01E9B268.c | 13 + src/net/01EA0610.c | 13 + src/net/01EA47E8.c | 8 + src/net/01EA4EE8.c | 10 + src/net/01EA71C8.c | 13 + src/net/01EA88A0.c | 9 + src/net/01EA9800.c | 15 + src/net/01EA9D98.c | 16 + src/net/01EA9FE8.c | 12 + src/net/01EAA020.c | 12 + src/net/01EAA060.c | 12 + src/net/01EAA0D0.c | 25 + src/net/01EB0D78.c | 8 + src/net/01EB4DB0.c | 8 + src/net/01EB4DE8.c | 12 + src/net/01EB4E40.c | 10 + src/net/01EB4FF0.c | 10 + src/net/01EB7288.c | 11 + src/net/01EB72B0.c | 11 + src/net/01EB72D8.c | 12 + src/net/01EB84B8.c | 12 + src/net/01EBDED0.c | 16 + src/net/01EBDEF0.c | 11 + src/net/01EC2840.c | 11 + src/net/01EC3498.c | 9 + src/net/01EC52B8.c | 11 + src/net/01EC9B08.c | 13 + src/net/01ED5548.c | 9 + src/net/01ED5570.c | 9 + src/net/01ED5638.c | 9 + src/net/01ED8500.c | 11 + src/net/01ED9BE8.c | 8 + src/net/01EDA098.c | 8 + src/net/01EDB030.c | 9 + src/net/01EDB388.c | 9 + src/net/01EED4D8.c | 10 + src/net/01EEE000.c | 8 + src/net/01EF21FC.c | 10 + src/net/01EFA2A4.c | 8 + src/net/01F07154.c | 8 + tools/cc.sh | 163 +- tools/ee296.py | 32 + tools/ee29_01.py | 83 + tools/ee32_030210.py | 58 + tools/ee32_030926.py | 33 + tools/ee32_040921.py | 92 ++ tools/test_cc_routes.py | 129 ++ tools/test_ee29_01.py | 37 + tools/test_ee32_040921.py | 51 + tools/test_ee32_profiles.py | 51 + 68 files changed, 3845 insertions(+), 477 deletions(-) create mode 100644 notes/ntscu-batch-2026-10-31.md create mode 100644 notes/ntscu-five-04.md create mode 100644 notes/ntscu-five-05.md create mode 100644 notes/ntscu-five-06.md create mode 100644 notes/ntscu-five-2026-10-31.md create mode 100644 notes/ntscu-fortyfive-publication.md create mode 100644 notes/ntscu-single-2026-10-31.md create mode 100644 notes/ntscu-twenty-07.md create mode 100644 src/core/001221D8.c create mode 100644 src/core/0014ADD8.c create mode 100644 src/core/0014C368.c create mode 100644 src/core/0014D010.c create mode 100644 src/core/0014DE80.c create mode 100644 src/net/01E9B268.c create mode 100644 src/net/01EA0610.c create mode 100644 src/net/01EA47E8.c create mode 100644 src/net/01EA4EE8.c create mode 100644 src/net/01EA71C8.c create mode 100644 src/net/01EA88A0.c create mode 100644 src/net/01EA9800.c create mode 100644 src/net/01EA9D98.c create mode 100644 src/net/01EA9FE8.c create mode 100644 src/net/01EAA020.c create mode 100644 src/net/01EAA060.c create mode 100644 src/net/01EAA0D0.c create mode 100644 src/net/01EB0D78.c create mode 100644 src/net/01EB4DB0.c create mode 100644 src/net/01EB4DE8.c create mode 100644 src/net/01EB4E40.c create mode 100644 src/net/01EB4FF0.c create mode 100644 src/net/01EB7288.c create mode 100644 src/net/01EB72B0.c create mode 100644 src/net/01EB72D8.c create mode 100644 src/net/01EB84B8.c create mode 100644 src/net/01EBDED0.c create mode 100644 src/net/01EBDEF0.c create mode 100644 src/net/01EC2840.c create mode 100644 src/net/01EC3498.c create mode 100644 src/net/01EC52B8.c create mode 100644 src/net/01EC9B08.c create mode 100644 src/net/01ED5548.c create mode 100644 src/net/01ED5570.c create mode 100644 src/net/01ED5638.c create mode 100644 src/net/01ED8500.c create mode 100644 src/net/01ED9BE8.c create mode 100644 src/net/01EDA098.c create mode 100644 src/net/01EDB030.c create mode 100644 src/net/01EDB388.c create mode 100644 src/net/01EED4D8.c create mode 100644 src/net/01EEE000.c create mode 100644 src/net/01EF21FC.c create mode 100644 src/net/01EFA2A4.c create mode 100644 src/net/01F07154.c create mode 100644 tools/ee296.py create mode 100644 tools/ee29_01.py create mode 100644 tools/ee32_030210.py create mode 100644 tools/ee32_030926.py create mode 100644 tools/ee32_040921.py create mode 100644 tools/test_ee29_01.py create mode 100644 tools/test_ee32_040921.py create mode 100644 tools/test_ee32_profiles.py diff --git a/README.md b/README.md index 7cf0d653..15a79dcd 100644 --- a/README.md +++ b/README.md @@ -47,10 +47,10 @@ A function counts as matched on a version when its C, built with its file's own | | Functions (exact) | Code (exact) | Fuzzy | | --- | ---: | ---: | ---: | -| **Main program** | 2,784 of 8,948 | 203,876 of 2,193,280 bytes (9.30%) | 9.81% | -| Engine core (core.text) | 765 of 1,695 | 72,908 of 298,900 bytes (24.39%) | 24.93% | +| **Main program** | 2,829 of 8,949 | 205,812 of 2,193,280 bytes (9.38%) | 9.90% | +| Engine core (core.text) | 770 of 1,695 | 73,292 of 298,900 bytes (24.52%) | 25.06% | | libgcc | 2 of 2 | 16 of 16 bytes (100.00%) | 100.00% | -| Network (net.text) | 478 of 2,441 | 15,372 of 465,620 bytes (3.30%) | 4.31% | +| Network (net.text) | 518 of 2,442 | 16,924 of 465,620 bytes (3.63%) | 4.65% | | Resident menus (.text) | 1,536 of 4,785 | 114,776 of 1,416,576 bytes (8.10%) | 8.45% | | frontbin's own code | 3 of 25 | 804 of 12,168 bytes (6.61%) | 6.61% | | **Shared level code** | 1,082 of 5,076 | 83,504 of 1,980,204 bytes (4.22%) | 4.90% | @@ -69,9 +69,9 @@ A function counts as matched on a version when its C, built with its file's own | Level 14: Ghost Station (and 34) | 6 of 29 | 444 of 14,548 bytes (3.05%) | 3.05% | | Level 15: Control Level (and 35) | 13 of 135 | 932 of 116,368 bytes (0.80%) | 0.80% | | Level 41: Battledome Tower (all 22 multiplayer maps) | 81 of 374 | 11,296 of 139,984 bytes (8.07%) | 9.93% | -| **Total** | 4,475 of 18,085 | 350,776 of 5,782,424 bytes (6.07%) | 6.68% | +| **Total** | 4,520 of 18,086 | 352,712 of 5,782,424 bytes (6.10%) | 6.71% | -Each distinct function counts once: frontbin's copy of the menus is the main image's, and a level function counts once however many of the 47 levels have it. 203,876 bytes (3.53%) are in units with nothing left to decompile. +Each distinct function counts once: frontbin's copy of the menus is the main image's, and a level function counts once however many of the 47 levels have it. 205,812 bytes (3.56%) are in units with nothing left to decompile. **PAL (`SCES_532.85`)** diff --git a/config/us/inventory.tsv b/config/us/inventory.tsv index 7f6be925..ef53dcdb 100644 --- a/config/us/inventory.tsv +++ b/config/us/inventory.tsv @@ -7282,7 +7282,8 @@ main net.text 01EC3288 380 function main net.text 01EC3408 40 function main net.text 01EC3430 48 function main net.text 01EC3460 52 function -main net.text 01EC3498 44 function +main net.text 01EC3498 32 function +main net.text 01EC34B8 12 function main net.text 01EC34C8 12 function main net.text 01EC34D8 460 function main net.text 01EC36A8 84 function diff --git a/config/us/map.tsv b/config/us/map.tsv index 849a2c67..139b52cc 100644 --- a/config/us/map.tsv +++ b/config/us/map.tsv @@ -5545,3 +5545,48 @@ func_L41_00445E10 nonmatching/shared/func_L41_00445E10.c near func_L41_00445E10 func_L41_00446500 nonmatching/shared/func_L41_00446500.c near func_L41_00446500 level_41:.text:00446500:836 94.50 func_L41_0044C720 nonmatching/shared/func_L41_0044C720.c near func_L41_0044C720 level_41:.text:0044C720:272 84.56 func_L41_0061C668 nonmatching/shared/func_L41_0061C668.c near func_L41_0061C668 level_41:.text:0061C668:148 95.27 +func_001221D8 src/core/001221D8.c match func_001221D8 main:core.text:001221D8:108 100.00 +func_0014ADD8 src/core/0014ADD8.c match func_0014ADD8 main:core.text:0014ADD8:56 100.00 +func_0014C368 src/core/0014C368.c match func_0014C368 main:core.text:0014C368:68 100.00 +func_0014D010 src/core/0014D010.c match func_0014D010 main:core.text:0014D010:68 100.00 +func_0014DE80 src/core/0014DE80.c match func_0014DE80 main:core.text:0014DE80:84 100.00 +func_01E9B268 src/net/01E9B268.c match func_01E9B268 main:net.text:01E9B268:40 100.00 +func_01EA0610 src/net/01EA0610.c match func_01EA0610 main:net.text:01EA0610:40 100.00 +func_01EA47E8 src/net/01EA47E8.c match func_01EA47E8 main:net.text:01EA47E8:40 100.00 +func_01EA4EE8 src/net/01EA4EE8.c match func_01EA4EE8 main:net.text:01EA4EE8:32 100.00 +func_01EA71C8 src/net/01EA71C8.c match func_01EA71C8 main:net.text:01EA71C8:36 100.00 +func_01EA88A0 src/net/01EA88A0.c match func_01EA88A0 main:net.text:01EA88A0:36 100.00 +func_01EA9800 src/net/01EA9800.c match func_01EA9800 main:net.text:01EA9800:36 100.00 +func_01EA9D98 src/net/01EA9D98.c match func_01EA9D98 main:net.text:01EA9D98:72 100.00 +func_01EA9FE8 src/net/01EA9FE8.c match func_01EA9FE8 main:net.text:01EA9FE8:52 100.00 +func_01EAA020 src/net/01EAA020.c match func_01EAA020 main:net.text:01EAA020:52 100.00 +func_01EAA060 src/net/01EAA060.c match func_01EAA060 main:net.text:01EAA060:52 100.00 +func_01EAA0D0 src/net/01EAA0D0.c match func_01EAA0D0 main:net.text:01EAA0D0:96 100.00 +func_01EB0D78 src/net/01EB0D78.c match func_01EB0D78 main:net.text:01EB0D78:28 100.00 +func_01EB4DB0 src/net/01EB4DB0.c match func_01EB4DB0 main:net.text:01EB4DB0:28 100.00 +func_01EB4DE8 src/net/01EB4DE8.c match func_01EB4DE8 main:net.text:01EB4DE8:36 100.00 +func_01EB4E40 src/net/01EB4E40.c match func_01EB4E40 main:net.text:01EB4E40:36 100.00 +func_01EB4FF0 src/net/01EB4FF0.c match func_01EB4FF0 main:net.text:01EB4FF0:36 100.00 +func_01EB7288 src/net/01EB7288.c match func_01EB7288 main:net.text:01EB7288:36 100.00 +func_01EB72B0 src/net/01EB72B0.c match func_01EB72B0 main:net.text:01EB72B0:36 100.00 +func_01EB72D8 src/net/01EB72D8.c match func_01EB72D8 main:net.text:01EB72D8:36 100.00 +func_01EB84B8 src/net/01EB84B8.c match func_01EB84B8 main:net.text:01EB84B8:36 100.00 +func_01EBDED0 src/net/01EBDED0.c match func_01EBDED0 main:net.text:01EBDED0:32 100.00 +func_01EBDEF0 src/net/01EBDEF0.c match func_01EBDEF0 main:net.text:01EBDEF0:32 100.00 +func_01EC2840 src/net/01EC2840.c match func_01EC2840 main:net.text:01EC2840:40 100.00 +func_01EC3498 src/net/01EC3498.c match func_01EC3498 main:net.text:01EC3498:32 100.00 +func_01EC52B8 src/net/01EC52B8.c match func_01EC52B8 main:net.text:01EC52B8:36 100.00 +func_01EC9B08 src/net/01EC9B08.c match func_01EC9B08 main:net.text:01EC9B08:40 100.00 +func_01ED5548 src/net/01ED5548.c match func_01ED5548 main:net.text:01ED5548:36 100.00 +func_01ED5570 src/net/01ED5570.c match func_01ED5570 main:net.text:01ED5570:32 100.00 +func_01ED5638 src/net/01ED5638.c match func_01ED5638 main:net.text:01ED5638:32 100.00 +func_01ED8500 src/net/01ED8500.c match func_01ED8500 main:net.text:01ED8500:40 100.00 +func_01ED9BE8 src/net/01ED9BE8.c match func_01ED9BE8 main:net.text:01ED9BE8:32 100.00 +func_01EDA098 src/net/01EDA098.c match func_01EDA098 main:net.text:01EDA098:28 100.00 +func_01EDB030 src/net/01EDB030.c match func_01EDB030 main:net.text:01EDB030:36 100.00 +func_01EDB388 src/net/01EDB388.c match func_01EDB388 main:net.text:01EDB388:36 100.00 +func_01EED4D8 src/net/01EED4D8.c match func_01EED4D8 main:net.text:01EED4D8:40 100.00 +func_01EEE000 src/net/01EEE000.c match func_01EEE000 main:net.text:01EEE000:40 100.00 +func_01EF21FC src/net/01EF21FC.c match func_01EF21FC main:net.text:01EF21FC:32 100.00 +func_01EFA2A4 src/net/01EFA2A4.c match func_01EFA2A4 main:net.text:01EFA2A4:36 100.00 +func_01F07154 src/net/01F07154.c match func_01F07154 main:net.text:01F07154:28 100.00 diff --git a/docs/TOOLCHAIN.md b/docs/TOOLCHAIN.md index ea9175c2..c56eb232 100644 --- a/docs/TOOLCHAIN.md +++ b/docs/TOOLCHAIN.md @@ -91,6 +91,176 @@ Options apply to the whole file, never to one function: GCC 2.95 takes them per translation unit. If one function needs other flags, it goes in a file of its own. +On the SN route, explicit `-Wa,...` options are also forwarded, unchanged, +to both assembler driver invocations. Other compiler options, including +the compiler's `-G` setting, retain their existing routing. For example, +`/* cflags: -Wa,-G0 */` disables assembler literal-pool loads for a whole +translation unit; this is verified for the global-free `0014C368` and +`0014DE80` units. It is not a general replacement for the default assembler +settings: the small-data and nop passes assume the default threshold for +global accesses, so files with globals, `__gp` aliases or filled delay slots +need separate byte and relocation evidence before using it. The `@ee29` +route retains its existing assembler invocation. + +### Isolated EE-GCC 2.9-ee-991111-01 + +`/* cflags: @ee29-01 -O2 -G0 -Wa,-G0 */` selects the original +`2.9-ee-991111-01` C compiler, then the existing SN assembler driver. +This profile emits the divide padding needed by `src/core/0014D010.c`. +No SN output fixups run on this route: its compiler-generated assembly is +assembled without rewriting it. Existing SN and `@ee29` routes are unchanged. + +`tools/ee29_01.py` verifies each required file against its pinned SHA-256 +before executing anything. The default private profile directory is +`build/isolated/ee-gcc2.9-991111-01/`; `EE29_01_ROOT` can select another +location. Supply only these files from the public compiler releases: + +- [ee-gcc2.9-991111-01.tar.xz](https://github.com/decompme/compilers/releases/download/compilers/ee-gcc2.9-991111-01.tar.xz), + archive SHA-256 `ed684fd98f89d36b0121caab311052089103e3b36241fcef4338cc9ea41c75b8`: + `bin/ee-gcc`, `lib/gcc-lib/ee/2.9-ee-991111-01/cc1` and `cpp`. +- [ee-gcc2.9-991111-01-dtls13010.tar.gz](https://github.com/decompme/compilers/releases/download/compilers/ee-gcc2.9-991111-01-dtls13010.tar.gz), + archive SHA-256 `3ab52a7ea962100f2a7df3e04d3e7a758aad669eb365251682e769b755d9d586`: + put only `lib/ld-2.3.6.so` at `runtime/ld-2.3.6.so`, and a byte-identical + copy of `lib/libc-2.3.6.so` at `runtime/libc.so.6`. + +The compiler source is public GPL code at +[GirianSeed/ee-gcc, src-2.9-ee-991111-01](https://github.com/GirianSeed/ee-gcc/tree/src-2.9-ee-991111-01). +No SDK headers, samples or source are needed. Do not commit these binaries, +archives or runtime libraries. The installed compiler directories need no changes. + +The executables are 32-bit Linux binaries. On Windows the helper uses +headless WSL (`EE29_01_WSL_DISTRO`, default `docker-desktop`); it does not +open Docker Desktop or install system libraries. It uses the private loader +and libc above. Inputs are copied unchanged to a native `/tmp` directory +because old 32-bit `stat()` cannot represent Windows-mount inode numbers; +the emitted assembly is copied back unchanged. This changes source paths +and transports only the source plus project `include/` tree. The route has +been verified for the self-contained D010 unit, which has no path-dependent +macros or source-relative includes; arbitrary units need separate validation. + +### Isolated EE-GCC 3.2-ee-040921 evaluation + +`/* cflags: @ee32-040921 -O2 -G0 */` selects an isolated C compiler from +the public [decompme compiler bundle](https://github.com/decompme/compilers/releases/download/compilers/ee-gcc3.2-040921.tar.xz). +The observed archive SHA-256 is +`8c60ca7482523190e999524a7e4de2379dcf7ffee543c1b5663bfdf6a80ebf0f`. +This pins the evaluated download; it is not a publisher-supplied checksum +or proof of correspondence to a particular public GCC source/patch set. +Its driver and cc1 identify themselves as `3.2-ee-040921`. No SDK headers, +samples or source are used. The profile is an evaluation route, not evidence +that retail's NET component used this compiler. + +`tools/ee32_040921.py` requires these hash-checked files beneath +`build/isolated/ee-gcc3.2-040921/` (override with `EE32_040921_ROOT`): + +- `bin/ee-gcc`: SHA-256 + `a5095b5d7b55f91535b12e48e9d808170fa9fb8c0620c43c2fb61379b1a3663a`; +- `lib/gcc-lib/ee/3.2-ee-040921/cc1`: SHA-256 + `0bcc90bd23e10698e75047db9a84ea47e753791115fdd23d6f637a544f6d257d`; +- the same private `runtime/ld-2.3.6.so` and `runtime/libc.so.6`, with + the same hashes, as the isolated EE 2.9 profile above. Copies live in + the new profile; neither installed toolchain nor the old profile changes. + +Windows uses headless WSL, default distro `docker-desktop` (override with +`EE32_040921_WSL_DISTRO`). It opens no desktop application and installs +no system runtime. The driver, cc1 wrapper and input/include copies use +native temporary storage where needed by the old 32-bit filesystem API. +The emitted assembly is copied back unchanged and assembled by the +existing SN driver, forwarding explicit `-Wa,...` options. No SN output +fixups or instruction rewriting run on this route. Options apply to the +whole source file; conflicting profile markers are rejected. + +The function-free probe verifies the expected 64-bit `long`, 32-bit `int` +and 32-bit pointer ABI using only the project's `common.h`. Arbitrary +translation units, path-dependent macros and source-relative includes +need their own validation. Every claimed match still requires independent +byte, call/global and relocation-target checks. + +### Additional isolated EE-GCC 3.2 profiles + +Two additional opt-in profiles preserve their original driver, C compiler, +preprocessor and compiler specs. They never rewrite emitted instructions +and use the existing SN assembler, forwarding explicit `-Wa,...` options. +Their defaults are `-O2 -G0`, and profile markers cannot be combined. + +| Whole-file marker | Ignored profile directory | Helper | +|---|---|---| +| `@ee32-030926` | `build/isolated/ee-gcc3.2-030926/` | `tools/ee32_030926.py` | +| `@ee32-030210` | `build/isolated/ee-gcc3.2-030210-beta2/` | `tools/ee32_030210.py` | + +Each helper records all required file hashes and rejects missing or changed +inputs before executing anything. The observed public bundle SHA-256 values +are `6b92b61e40f80835b165d14fadd57d4046dbee82195599f791626180fe79b8e9` +for [030926](https://github.com/decompme/compilers/releases/download/compilers/ee-gcc3.2-030926.tar.gz) +and `5244521973d3fa9712cc9f945e6e45c489d69d846ca6639b0c07c3e885a923a1` +for [030210 beta2](https://github.com/decompme/compilers/releases/download/compilers/ee-gcc3.2-030210-beta2.tar.gz). +These pin the evaluated downloads; publisher checksums and exact public +source/patch correspondence have not been established. No SDK source, +headers or samples are extracted or used. + +030926 uses the same private Linux loader/libc as 040921. Its `cc1`, `cpp0` +and original `specs` are pinned; the shared transport copies their executable +wrappers and specs onto native temporary storage. Override its root/distro +with `EE32_030926_ROOT` / `EE32_030926_WSL_DISTRO`. + +030210 beta2 is a native Windows/Cygwin profile. Supply its original +`bin/ee-gcc.exe`, `lib/gcc-lib/ee/3.2-beta2-ee-030210/{cc1.exe,cpp0.exe,specs}` +and bundled `dll/{cygwin1.dll,cygintl-2.dll,cygiconv-2.dll}`. Its DLL path +is added only to the compiler child's environment, with no system install +or global environment change. The helper suppresses system loader/crash +dialogs and starts the compiler without a new console window. It has no +alternate runtime fallback. Override its root with `EE32_030210_ROOT`. +Both profiles passed function-free scalar/pointer ABI probes; this is not +proof of a source match. Every candidate still requires full byte and +relocation-target verification. The existing installed compiler files stay +unchanged. + +### Installed older SN compiler evaluations + +The opt-in whole-file markers `@sn114` and `@sn274` select the already +installed SN 1.14 (GCC 2.95.3) and SN 2.74 (GCC 2.95.2) drivers respectively +from `toolchain/sn-prodg-24/local/sce/ee/gcc/`. Each uses an explicit matching +`lib/gcc-lib/ee//` prefix. Missing backends fail rather than falling +back to another compiler. The defaults remain `-O2 -G8 +-mno-check-zero-division`; the unsupported `-fopt-stack` is omitted. Both +retain the existing SN assembly passes and the default SN assembler driver. +These routes do not alter the installed files or the default compiler. +Function-free probes verified this project's scalar/pointer ABI; candidate +byte/target checks remain mandatory and no match follows from the probes. + +`@sn107` selects another already installed compiler. Its directory is +misleadingly named `2.96-ee-001003-1`, but its actual `cc1.exe` and `cpp.exe` +identify as SN 2.95.3 v1.07. Both are byte-identical to the public +`ee-gcc2.95.3-107` package in decompme's `ps2_compilers.tar.xz`. The driver +is shared with the other SN versions. This route explicitly selects the +unchanged `2.95.3/specs`, which matches that original package, alongside +the v1.07 backend/preprocessor. Installed files are never renamed or edited. + +### Actual isolated EE-GCC 2.96 + +`/* cflags: @ee296 -O2 -G0 */` selects the distinct Linux compiler from +[ee-gcc2.96.tar.xz](https://github.com/decompme/compilers/releases/download/compilers/ee-gcc2.96.tar.xz), +observed archive SHA-256 +`0590d2ca9da8f5903889d66761220d14b47a8d14ba987ca53db84a1650a1fd0a`. +It reports `2.96-ee-001003-1`; it is not the SN compiler in the same-named +installed Windows directory. The original driver, `cc1` and `cpp0` hashes +and private runtime hashes are pinned in `tools/ee296.py`. No specs file +is supplied by this archive, so the original driver uses its built-in specs. + +Its default ignored root is `build/isolated/ee-gcc2.96/` (override with +`EE296_ROOT`); `EE296_WSL_DISTRO` selects the headless WSL distro, default +`docker-desktop`. It uses the shared native-storage transport, private +loader/libc and existing SN assembler, with no SN output fixups and no +compiler-output edits. No SDK source, headers or samples are used. As with +the other mirrored compiler bundles, exact public source/patch correspondence +has not been established; hashes identify the evaluated binary inputs. + +The canonical early-return source for `func_01EA4EE8` matches with this +profile. Its complete opcode/register/constant fields, HI16/LO16 target, +scalar ABI and integrated rebuild were verified. The relocation pair resolves +to the address `0x001AFD28`, not the contents at that address. This is a +per-function proof, not identification of the compiler for the whole NET unit. + ## The assembler Retail's code was assembled by SN's own assembler (`ps2eeas`), not by the GNU diff --git a/notes/ntscu-batch-2026-10-31.md b/notes/ntscu-batch-2026-10-31.md new file mode 100644 index 00000000..0396f809 --- /dev/null +++ b/notes/ntscu-batch-2026-10-31.md @@ -0,0 +1,98 @@ +# Bounded NTSC-U matching batch, 2026-10-31 + +Target: Deadlocked SCUS_974.65 only. Starting revision: +`749612988ee65ce999b7c8959012b1fc2c5b6641`. Fetch confirmed clean main equal +to origin/main. Open PRs #50, #51, #52 and #53 were inspected, including +actual diffs; none was draft at inspection. Source, maps, near misses, +claims and prior logs were checked before claiming these four functions. +Each had zero prior attempts. Main-image US normalized-code comparisons +found no other equivalent for any of them. PAL's committed inventory has +the same four core addresses and sizes; its retail bytes are absent, so +PAL byte equivalence was not established. + +## Completed result + +| Function | Bytes | Counted runs / cap | Compiler / file options | +| --- | ---: | ---: | --- | +| `func_0014ADD8` | 56 | 3 / 6 | Existing default SN profile | +| `func_0014C368` | 68 | 3 / 6 | SN, `-Wa,-G0` | +| `func_0014D010` | 68 | 5 / 6 | Original EE-GCC 2.9-ee-991111-01, `-O2 -G0 -Wa,-G0` | +| `func_0014DE80` | 84 | 2 / 6 | SN, `-Wa,-G0` | + +All four are integrated in their own `src/core/
.c` files: four +functions / 276 bytes added, with no other function attempted. Thirteen +launcher runs were counted, including two initial Git Bash sandbox startup +failures and the isolated profile's first filesystem failure. Four further +rebuilds verified unchanged accepted candidates from integrated source; +these were verification, not additional candidate searches. Logs and all +candidates remain in ignored `build/try//` directories. + +Each source was reviewed independently, written under the landing lock, +then rebuilt through the existing local matching launcher. ADD8, D010 and +DE80 equal all their retail bytes without masking and have no relocation +fields, calls or globals. C368 equals retail with only its single call +relocation masked; its actual target resolves correctly to `func_00136378`. +Independent and targeted relocation checks have zero new mismatches and +zero unresolved targets. Matched claims remain held; no landing lock remains. + +ADD8 uses an unsigned wrapping counter and a signed initial test, avoiding +signed-overflow tricks. DE80 preserves the signed byte and s16 checks and +ordered float comparison. D010 preserves the scaled reciprocal, conversion +and clamp. Its normal float-to-integer cast has a finite representable input +domain; the byte match is not a general abstract-C claim for NaN, infinity +or unrepresentable values. Its observed caller reads the float from a table; +no live input-domain validation was performed. + +## Resolved build causes + +The initial early-stop diagnoses for C368 and DE80 were incomplete. Their +`li.s` constants were becoming GNU assembler literal-pool loads. The SN +build driver now forwards explicit standard `-Wa,...` file options to both +assembler passes, unchanged and in order. The new files opt into `-Wa,-G0`. +No existing source used `-Wa` options; default and existing `@ee29` invocations +remain unchanged. The small-data/nop passes retain their fixed assumptions, +so this evidence does not qualify that option for arbitrary files with globals. + +D010 still lacked two nops with the installed profiles, including a direct +probe of the installed SN assembler. The owner approved one isolated extra +compiler-profile investigation. A hash-pinned public original +`2.9-ee-991111-01` compiler emits the required padding itself. Its new +`@ee29-01` whole-file route performs no compiler-output rewriting or SN +fixups. It uses private Linux runtime libraries and headless WSL; both +installed toolchains and system libraries are unchanged. Old 32-bit stat() +cannot represent Windows-mount inode numbers, so byte-identical source and +project include files are staged on native WSL /tmp; emitted assembly is +copied back unchanged. This transport is qualified for this self-contained +unit, which uses no path-dependent macros or source-relative includes. +Archive provenance, hashes, runtime requirements and transport limits are +in `docs/TOOLCHAIN.md` and `tools/ee29_01.py`. No SDK headers, samples or source +were used or extracted. No compiler or runtime binaries are committed. + +Ten compiler-route tests and four isolated-profile tests pass. A separate +Terra High review found no actionable issues in either the opt-in forwarding +change or the isolated route for this scope. No game was launched. + +## Preserved baseline and report boundaries + +The legacy byte audit went from 3,498 to 3,502 exact functions, adding only +these four. The same three pre-existing non-exact functions remain: +`func_00161890`, `func_00547A98` and `func_L01_004F3100`. The same 761 functions +remain outside that audit's old lists. The full relocation audit retains +identical records for 80 discrepancies and three unresolved targets; this +is not a clean whole-tree qualification. + +Full US map regeneration on the unchanged baseline changed 59 unrelated +rows: 51 library rows and eight existing near-miss mappings. Raw before and +after maps are preserved. Only these four new rows from the official map +generator were adopted by the batch's deterministic selection script; +every pre-batch row and its order were retained. US progress and the README +table were regenerated: 4,155 / 18,085 functions, 322,540 / 5,782,424 bytes. +US map coverage and progress guards and diff whitespace checks pass. + +PAL files remain unchanged in this NTSC-U-only batch. Its static coverage +check reports the four new US source rows missing; absent PAL retail inputs +prevent verifying their PAL mapping. No passing PAL guard or PAL match is +claimed. Detailed local receipts: `build/batches/codex-20261031-ntscu-01/`. + +The first local commit remains intact. Completion work is a separate local +commit; no squash, push, PR, publication or game launch was performed. diff --git a/notes/ntscu-five-04.md b/notes/ntscu-five-04.md new file mode 100644 index 00000000..f7b66cdf --- /dev/null +++ b/notes/ntscu-five-04.md @@ -0,0 +1,71 @@ +# Five-function NTSC-U follow-up + +The previous ten verified functions (564 retail bytes) were squashed at +the user's request into `486e1069`, preserving the identical content tree. +Their seven unpublished commits remain on the local recovery branch +`codex/deadlocked-before-squash-20261031`. Nothing was pushed. + +A fresh Luna Medium probe safely fetched origin/main at `fe6ec0d2` and +refreshed local source/maps, claims, near misses and all open/draft PRs. +The branch was one local commit ahead and 69 behind; no merge or rebase +was performed. The only open PR, #54, had expanded to seventeen PAL +functions at `a2469f02`. Its actual source patch was inspected. Five +unclaimed NTSC-U functions were selected with no local/upstream/PR/history +overlap or normalized duplicate among existing same-size US source places. +PAL bytes remain absent, so no PAL byte-equivalence claim is made. + +The primary claimed exactly five as `codex-20261031-five-04`. Two Terra +Medium workers handled one function at a time in separate scratch +directories, with no nested agents and no numerical attempt ceiling. +Every candidate is logged and preserved. All five matched with the already +approved original EE-GCC 2.96 profile, whole-file `@ee296 -O2 -G0`: + +| Function | Retail bytes | Candidate runs | Behavior | +|---|---:|---:|---| +| `func_01EAA020` | 52 | 9 | Null returns 2; call `func_00126BE0` with word +0xC; -1 maps to 900 (0x384), other results to 0 | +| `func_01EAA060` | 52 | 1 | Same contract with the distinct `func_00126BC0` target | +| `func_01EA9FE8` | 52 | 1 | Same contract with the distinct `func_00126BB0` target | +| `func_01EAA0D0` | 96 | 13 | Initialize five words; return 1 for nonzero unsigned ordered bounds, otherwise 0; invalid bounds store status 2 | +| `func_01EA9D98` | 72 | 14 | Clear byte 0 and words 4/8; call `func_01EA9F90(context)`; mark byte 0 on success and preserve helper status; null returns 2 | + +The total is **324 bytes and 38 logged candidates**. No selected function +remains unmatched. Negative early-return C resolved the shared-result +allocation/layout differences; no new toolchain change was needed in this +batch. No register pins, artificial operations, volatile ordering, output +patches or altered calling conventions were used. + +Primary review checked actual assembly rather than the scout's rough +semantic descriptions: 900 is decimal `0x384`, the wrappers test -1, the +initializer has unsigned ordered bounds, and the resetter returns the +helper status. These descriptions were corrected in the ignored report. +The syscall stubs' observed return use requires signed-word return +declarations in the new wrappers; unrelated existing void declarations +were left alone. The reset helper reads its incoming context pointer and +writes fields +0xC/+0x10, so the caller passes the pointer explicitly and +its private context type includes that minimum prefix. + +All complete opcode/register/constant fields match. The initializer's +96 bytes match without masking; standard resolution of the four verified +JAL relocations makes each other complete function byte-identical, with no +alignment padding and no compiler object modified. Integration took the +landing lock. Every actual source was rebuilt through the normal launcher +and independently checked again before installing its new object. The four +actual call targets were audited separately, even for the similar wrappers. + +Only the five new rows from the official US map generator were adopted; +all earlier rows and their order remain unchanged, including the recorded +unrelated regeneration discrepancies. US coverage/progress and whitespace +checks pass. US progress is **4,166 functions / 323,152 matched bytes**. +The legacy audit adds exactly five functions, reaching 3,513 exact while +retaining the same three non-exact and 761 unlisted functions. The full +like-for-like relocation discrepancy records remain byte-identical: 80 +existing mismatches and three unresolved targets. No clean whole-tree +audit is claimed. All 136 installed compiler/tool files retain their +recorded hashes. + +PAL source/metadata are untouched. Its coverage guard still fails because +PAL inputs are absent and now lacks fifteen local US rows across these +batches. No PAL progress was invented or regenerated. Proofs, candidates, +logs, PR exclusions and baseline snapshots remain under ignored +`build/try/` and `build/batches/codex-20261031-five-04/`. The matched claims +are retained. No push, PR, publication or game launch was performed. diff --git a/notes/ntscu-five-05.md b/notes/ntscu-five-05.md new file mode 100644 index 00000000..96cb5cfc --- /dev/null +++ b/notes/ntscu-five-05.md @@ -0,0 +1,56 @@ +# Five NTSC-U network helpers + +This collection adds five independently verified functions, 180 retail bytes, +after the fifteen-function local commit `52169993`. The prior fifteen remain +unchanged. Claims are retained as `codex-20261101-five-05`. + +| Function | Bytes | Candidate files / logged runs | Whole-file profile | Behavior | +| --- | ---: | ---: | --- | --- | +| `func_01EA9800` | 36 | 11 / 12 | `@ee296 -O2 -G0` | Copy one byte when both pointers are valid; return 2 on null, otherwise 0 | +| `func_01EB4DE8` | 36 | 2 / 3 | `@ee296 -O2 -G0` | Compare the first words of two eight-byte values passed by value | +| `func_01EB7288` | 36 | 2 / 2 | `@ee296 -O2 -G0` | Read unsigned halfword +0x1A4 into a halfword output; null pointers return 2 without writing | +| `func_01EB84B8` | 36 | 1 / 1 | `@ee296 -O2 -G0` | Clear a valid word output before checking context; read unsigned halfword +0x19C on success | +| `func_01EC52B8` | 36 | 1 / 1 | `@ee32-040921 -O2 -G0` | Return 0 for 0, -84 and -108, otherwise 1 | + +Two Terra Medium workers handled one function at a time in separate scratch +directories. All 17 candidate files and 19 logged attempts are preserved; +the latter include two initial failed compiler launches. There was no +numerical attempt ceiling. The byte-copy register allocation matched after +using separate early returns and a byte temporary. Existing pinned compiler +profiles sufficed; no compiler or build-pipeline changes were made. + +Primary review checked each function's actual assembly, argument registers, +return values, offsets, access widths and null-check/write ordering. The +comparison spills the two incoming 64-bit registers into separate 16-byte +stack slots and compares their low words. An ordinary two-word aggregate +reproduces that ABI. The function is registered at table +0x58 by +`func_01EB4B60`; its adjacent initializer clears eight bytes, and the adjacent +predicate spills one eight-byte value. Original type identity remains +unknown; no direct caller or conflicting source declaration was found. + +Integration took the landing lock. Each actual source was rebuilt through +the normal launcher and independently verified again before installing its +object. All 180 bytes match retail without relocation masking or alignment +padding. All five functions have no calls, globals or relocations; targeted +relocation checks have no mismatches or unresolved targets. No object bytes +were patched. The 136 recorded installed toolchain files retain their hashes. + +US coverage and progress checks pass at **4,171 functions / 323,332 bytes**. +The official US map generator's five new rows were adopted while preserving +all old rows and their order. Its 59 unrelated baseline row discrepancies +remain excluded, with the complete raw generated output retained locally. +The legacy audit is 3,518 exact, retaining the same three non-exact and 761 +unlisted functions. The full relocation discrepancy record remains +byte-identical: 80 existing mismatches and three unresolved entries. + +The recorded origin/main and PR #54/#55/#56 heads were unchanged. A current +GitHub search also surfaced PR #57 through #70; their actual patches add PAL +game functions with unrelated addresses and behavior, without selected NET +function overlap. PAL retail inputs remain absent, so PAL byte equivalence +is unverified. PAL source and metadata are untouched; its coverage guard +now lacks twenty local US rows, including these five. No PAL rows or progress +were fabricated. + +Proofs, baseline snapshots, raw reports, overlap review, candidates and logs +remain ignored under `build/batches/codex-20261101-five-05/` and `build/try/`. +No push, PR, publication, game launch or desktop interaction was performed. diff --git a/notes/ntscu-five-06.md b/notes/ntscu-five-06.md new file mode 100644 index 00000000..7cf4f2b9 --- /dev/null +++ b/notes/ntscu-five-06.md @@ -0,0 +1,55 @@ +# Five more NTSC-U network helpers + +This collection adds five verified functions, **172 retail bytes**, after +`d853ce16`. The previous twenty local matches remain unchanged. All five +claims are retained as `codex-20261101-five-06`. + +| Function | Bytes | Behavior | +| --- | ---: | --- | +| `func_01EBDED0` | 32 | Always clear the required word output; null context returns positive 0xD2F2, otherwise copy word +0x70 and return 0 | +| `func_01EBDEF0` | 32 | Always clear the required halfword output; null context returns positive 0xD2F3, otherwise copy unsigned halfword +0x5C and return 0 | +| `func_01EB72B0` | 36 | Check output and context pointers; return 2 without writing on null, otherwise copy unsigned halfword +0x1A2 and return 0 | +| `func_01EB4E40` | 36 | Forward the buffer and first word of an eight-byte value to `func_01EA91C0`; return 0 | +| `func_01EB4FF0` | 36 | Pass fixed address 0x001B26C0 to `func_01E9D390`, ignore its result and return 0 | + +Origin was freshly fetched without merging. All seventeen currently open +PR patches, local source/maps/near misses/claims/history and shared xmap +records were checked. Strict normalized fingerprints found no duplicates +among same-size US NET functions. Neither version's map had selected rows. +PAL inventories have corresponding addresses and extents, but PAL retail +inputs remain absent, so byte equivalence is unverified. + +Two reused Terra Medium workers handled one function at a time in separate +scratch directories, with no nested workers or numerical attempt ceiling. +Every function matched its first candidate using the existing whole-file +profile `@ee296 -O2 -G0`. All five candidates and logged runs are preserved. +No compiler, toolchain or build-pipeline changes were needed. + +Primary review checked actual assembly, ABI, widths, offsets, null behavior +and write ordering. The formatter wrapper's m2c draft omitted the unchanged +buffer argument in a0; the reconstructed C explicitly forwards it together +with the first aggregate word in a1. The callee consumes both registers to +format dotted-decimal bytes. The aggregate's original type identity is +unknown. The other wrapper passes an address, not the contents there; its +callee overwrites incoming a0 before use and returns a word that is ignored. + +Integration took the landing lock. Each actual source was rebuilt through +the normal launcher and independently checked again before installing its +object. All 172 bytes match after standard relocation resolution in a proof +copy held only in memory, with no padding or object edits. The three getters +match without any masking. Independent target checks verify both calls and +the HI16/LO16 address pair, with zero new mismatches or unresolved targets. +All 136 recorded installed toolchain files retain their hashes. + +Official US coverage/progress checks pass at **4,176 functions / 323,504 +bytes**. Only the official generator's five new map rows were adopted; +all old rows and order were preserved. Its 59 unrelated regeneration +discrepancies and complete raw output remain recorded locally. The legacy +audit reaches 3,523 exact and retains the same three non-exact and 761 +unlisted functions. Full relocation discrepancy records remain byte-identical: +80 existing mismatches and three unresolved entries. + +PAL files are untouched. Its coverage guard lacks twenty-five local US rows; +no PAL rows or progress were fabricated. Proofs, snapshots, raw reports and +attempts remain ignored under `build/batches/codex-20261101-five-06/` and +`build/try/`. No push, PR, publication, game launch or desktop interaction. diff --git a/notes/ntscu-five-2026-10-31.md b/notes/ntscu-five-2026-10-31.md new file mode 100644 index 00000000..4ca5aea5 --- /dev/null +++ b/notes/ntscu-five-2026-10-31.md @@ -0,0 +1,249 @@ +# Five-function NTSC-U batch, 2026-10-31 + +Starting revision: `1d647ecb`, on `codex/deadlocked-ntscu-batch-20261031`. +A safe fetch found origin/main at `fe6ec0d2`; this branch was three commits +ahead and 69 behind. No merge or rebase was performed. The Luna Medium +scout checked source, claims, attempts, US/PAL inventories and maps, and +all open/draft PRs. The only open PR was #54, whose actual PAL source +changes were inspected. No overlapping work was found. Full US code +comparisons found no exact duplicate source places locally or upstream; +PAL retail bytes are unavailable, so no PAL byte-equivalence claim is made. + +Five functions were claimed as `codex-20261031-five-03`. Two Terra Medium +workers used separate function scratch directories. A bounded Terra High +escalation investigated the getters' return allocation after Medium attempts +stalled; it matched the halfword getter using ordinary early returns and +whole-file `-Os`. No worker spawned children. + +| Function | Behavior | Exact bytes | Candidate runs | Whole-file flags | +|---|---|---:|---:|---| +| `func_01EA88A0` | ASCII decimal-digit predicate | 36 | 3 | default | +| `func_01E9B268` | Unaligned sixteen-byte copy to destination +0x34 | 40 | 5 | `-fno-schedule-insns` | +| `func_01EB72D8` | Halfword output from object +0x1CC; clear output before null-object failure | 36 | 6 | `-Os` | + +Primary review compared each complete function with retail without masking +or alignment padding, checked its memory/control-flow semantics, and audited +targets. None has calls, globals or relocations. Integration took the +landing lock. Every integrated source was then rebuilt through the existing +local matching launcher and verified again. The copy retains both loads +before its stores; the halfword getter retains the output-zeroing side effect +on its null-object failure path. + +The other two functions remain outside `src/`: + +| Function | Best preserved candidate | Difference | Used / approved runs | +|---|---|---|---:| +| `func_01EA71C8` | `build/try/func_01EA71C8/p0.c` | BYTES 7/36; status/load registers and return move | 17 / 18 | +| `func_01EA4EE8` | `build/try/func_01EA4EE8/p0.c` | BYTES 8/32; status/global-address registers and return move | 17 / 18 | + +The user raised the original six-run ceiling to twelve for all five, +then eighteen for these two remaining functions. Their final runs are held +for a justified test. Rewording, size optimization, scheduler options and +the available EE 2.9 routes have not resolved the allocation. Function-free +diagnostics found the installed SN 1.14 backend incompatible with the +wrapper's default stack option and the alternate driver's preprocessing +invocation. No target run was hidden in those diagnostics. A public +EE-GCC 3.2-040921 bundle is an availability lead only: neither its exact +binary provenance nor a connection to Deadlocked's NET code was established. +An explicit exception to the original no-toolchain-changes constraint was +requested before evaluating it. No new profile has been downloaded or added. +No source wall or impossibility is claimed for either near miss. + +The legacy audit adds exactly the three verified functions, from 3,503 to +3,506 exact. Its original three non-exact functions and 761 unlisted +functions remain. The like-for-like relocation audit retains byte-identical +records: 80 existing mismatches and three unresolved targets. An additional +audit including library objects retained those 80 mismatches and reported +55 extra unresolved library targets; it has a different scope from the +baseline. No clean whole-tree audit is claimed. + +The official US map generator was run. Its 59 pre-existing unrelated row +differences reproduced the pre-batch regeneration baseline; only the three +new generated rows were adopted, preserving every old row and its order. +US progress and the README table were regenerated: 4,159 functions and +322,760 matched bytes. US map/progress and whitespace checks pass. PAL +files are unchanged; its coverage guard lacks the five prior local source +rows plus these three. PAL inputs are absent and outside this NTSC-U batch. + +Candidates, attempt logs, ownership, baseline snapshots, PR exclusions, +independent proofs and diagnostics remain in ignored `build/try/` and +`build/batches/codex-20261031-five-03/`. All five claims are retained while +the two remaining functions are pending. No existing work, toolchain or +baseline discrepancy was changed. No squash, push, PR or game launch was +performed. + +## Continued allocator investigation + +The user then requested continued work and questioned the attempt caps. +The numerical ceilings were removed for the two remaining functions; +the old budget files and every logged attempt were retained. Work stayed +on these two functions. No additional source match has been claimed. + +EE-GCC 3.2-ee-040921 was evaluated in a separate ignored profile. Its +original C compiler and driver run with copies of the existing private +32-bit Linux runtime through headless WSL. Inputs, include files and its +executable wrapper use native temporary storage for the old filesystem API. +Compiler output is transported unchanged to the existing SN assembler. +The helper validates the required binary/runtime hashes before execution. +Neither installed toolchain was changed: all 136 files still have their +recorded SHA-256 values. Whole-file markers also permit evaluations using +the already installed SN 1.14 and SN 2.74 drivers, omitting their unsupported +stack option and pinning the corresponding backend/preprocessor paths. +The default SN 1.36 and existing EE 2.9 routes retain their behavior. + +The 040921 compiler fixes the status register and common return layout. +The best getter is now **BYTES 2/36**, and the best global helper is +**BYTES 4/32**: each uses `$t7` for the data/address temporary where retail +uses `$v1`. These figures count differing bytes, not matching bytes. +The primary independently checked the global helper's HI16/LO16 pair: +one target check, no mismatch or unresolved target, resolving the stored +address to `0x001AFD28` in `core.bss`. This does not make it a byte match. +The packet's claim that this global was undeclared was stale: +`src/net/01EA3778.c` already declares a signed-word array alias at that +address and passes its address to a 24-byte copy. + +RTL diagnostics locate the temporary's selection in local allocation, +before global allocation coalesces the result into `$v0`. Verbose options, +disabling pre-allocation scheduling and disabling the live-range pass did +not resolve it. Typed/ordinary-register locals, structure assignment and +the older installed SN compilers also did not match. A standard `memmove` +expression retained a call and is unsuitable. A real inline store helper +was inlined but retained the older SN register mismatch. No artificial +operations, hard register bindings, assembly or volatile ordering were used. +Current logged totals are 29 getter attempts and 22 global-helper attempts. + +The Luna scout inspected the unmodified 040921 compiler binary's symbol +data: its initialized allocation table starts `15,14,...,0`, consistent +with local selection of `$t7`. The closest earlier 030926 build has the +same allocation and fixed/call-used tables, so it was not executed or used +for target compiles. The older 030210-beta2 build instead has PE32/Cygwin +binaries and no visible allocation-order table. Public GCC 3.2.3 source +conditionally declares that table under `REG_ALLOC_ORDER`, whose undefined +case uses ascending order. This supports a beta experiment, but does not +prove the vendor binary's behavior or exact source/patch provenance. + +Only compiler binaries, bundled runtime DLLs and the original compiler +control specs were extracted from the beta archive. Its non-system DLL +import dependencies are all present. No SDK headers, samples or source +were read or extracted. The attempted native version probe was rejected +by automatic approval review before the command ran: executing downloaded +PE32 binaries and DLLs on Windows was judged a risk not clearly authorized +by the general continuation. Specific permission was requested for the +version/ABI probes and two target functions. No indirect execution or +runtime workaround was attempted; native execution remains pending. + +Fourteen fake-driver route tests and six isolated-helper tests pass. A +rebuild of the committed default-route digit predicate still matches, and +all three committed integrated objects retain their full unmasked proofs. +No additional source, map or progress rows changed in this continuation; +the recorded broad-audit discrepancies and PAL boundary remain as above. +All new artifacts and the exact rejected action are checkpointed under the +ignored batch directory. Claims remain held for the pending functions. + +## Word getter verified; final address helper pending + +The user authorized continuing the isolated beta checks, then explicitly +approved the separate 030926 profile when automatic review distinguished +the two executable profiles. Both passed version/scalar ABI checks using +their original pinned inputs. The beta reproduces the older shared-status +allocation; 030926 reproduces the newer address-renaming behavior. Neither +profile supplied a new match. Their opt-in routes, original specs and +private runtime handling are documented in `docs/TOOLCHAIN.md`. + +`func_01EA71C8` **matches all 36 bytes** using its original shared-status C +and whole-file `@ee32-040921 -O2 -G0 -frename-registers`. It used 31 logged +attempts. Primary review found no calls, globals or relocations, compared +the complete code without masking or padding, integrated under the landing +lock, rebuilt the actual source, and verified the new integrated object. +The source correctly avoids all accesses on either null-pointer failure. + +Only its official generated US map row was adopted, preserving every old +row and order and the previously recorded regeneration differences. US +progress now records 4,160 functions and 322,796 matched bytes. US coverage +passes. The legacy audit has 3,507 exact functions with the same three +non-exact and 761 unlisted functions. The like-for-like relocation records +remain identical to the baseline (80 mismatches, three unresolved). PAL +files remain untouched; its coverage guard now lacks nine local US rows. + +The remaining `func_01EA4EE8` has 47 logged attempts and remains outside +`src/`. Its nearest valid candidate still differs in two bytes: address-high +register `a1` versus retail `v1`, with the completed address in `v1`. +The captured renamer dump processes the low-address chain first. The public +GPL GCC 3.2 reference then explains the observed high-chain exclusion: its +last instruction writes the newly assigned `v1`, and the conservative overlap +check excludes that register. Exact source identity for the vendor binary +is unproven, so this is a reference-supported explanation, not proof of +its implementation. No output or compiler binary was patched. + +Both installed original SN assemblers were checked on a small non-game +address-macro probe, including ordinary optimization options. They keep the +two macro instructions adjacent; there is no evidence supporting an +invented scheduling fixup. An attempted full GCC-output assembly with the +older original assembler crashed and produced a zero-byte object; it is +not a usable match proof. The decoded compiler option table provides no +local-allocation disable switch. No speculative aggregate-return interface, +fixed-register flags, volatile ordering or artificial arithmetic was used. + +Two interrupted beta launcher results were independently recovered and +recorded exactly once in `runs.log`; the artifacts and accounting notes +are retained. Later worker approval-context failures did not run candidates; +the primary supplied the already recorded authorization for the same checks +and used the normal launcher. No rejected action was run indirectly. + +Sixteen route tests and eight profile tests pass. An initial rerun of the +profile tests failed because the sandbox denied its temporary directory; +the unchanged tests passed with the normal permitted execution context. +The newly integrated getter still rebuilds exact after shared transport +changes. The remaining investigation is original-compiler build metadata, +with no arbitrary numerical attempt ceiling. The user's subsequent sequence +is recorded: finish this final match, commit and squash the local matching +work, then refresh origin/PRs/claims with Luna and claim five more functions. +That squash and new selection have not happened while the last match is +still pending. No push, PR or game launch was performed. + +## Five-function batch complete + +`func_01EA4EE8` matched on logged attempt 51 with the actual original +EE-GCC `2.96-ee-001003-1`, `-O2 -G0`, and canonical scalar early-return C. +The installed directory bearing that version name had instead contained +SN v1.07: the scout established this by compiler/preprocessor banners and +hash comparison with the public v1.07 package. Testing that already +installed v1.07 did not match. The user then explicitly approved the +distinct Linux EE 2.96 compiler, whose pinned isolated profile passed the +scalar ABI probe. Its shared-status candidate did not match; its ordinary +early-return form did. No output fixup, register binding, artificial +operation, changed ABI or compiler-binary edit was needed. + +Primary review verified all 32 bytes' opcode/register/constant fields, +the null-output return of `0x17`, the successful pointer store and zero +return, and the lack of calls or a stack frame. Its HI16/LO16 pair resolves +to the correct `D_1AFD28` address, `0x001AFD28` in `core.bss`. Applying only +standard relocation fields to an in-memory proof copy yields all retail +bytes exactly. The compiled object itself was never patched. Source was +integrated under the landing lock, rebuilt through the normal launcher, +and independently checked again. The new object replaced no existing one. + +All five selected functions now match, totaling **180 retail bytes**. +Only the five new official generated US map rows were adopted over the +batch, retaining every earlier row and order and the 59 known unrelated +regeneration differences. US coverage/progress passes: **4,161 functions, +322,828 matched bytes**. The legacy audit adds exactly these five over +the fresh batch baseline, reaching 3,508 exact with the original three +non-exact functions and 761 unlisted functions. Relocation discrepancy +records remain identical: 80 mismatches and three unresolved targets. +PAL files remain unchanged; its coverage guard lacks ten local US rows. + +The complete local matching work now contains ten independently verified +functions and **564 retail bytes** since `74961298`. A targeted pre-squash +review rechecked all ten current objects, their alignment boundaries and +their two relocated targets (one call and one global address). All 136 +installed toolchain files still have their original recorded hashes. +Sixteen route tests and eight profile tests pass, including the real EE +2.96 and already installed SN v1.07 selection paths and profile guards. + +The user authorized committing and squashing this local work, followed +by a fresh Luna origin/local/PR/claim probe and five new function claims. +The completed-function claims are retained. The batch's preserved +artifacts include every candidate and failed attempt, final proofs, +compiler-identity evidence and the audit snapshots. No push, PR or game +launch is authorized or performed. diff --git a/notes/ntscu-fortyfive-publication.md b/notes/ntscu-fortyfive-publication.md new file mode 100644 index 00000000..b73fde57 --- /dev/null +++ b/notes/ntscu-fortyfive-publication.md @@ -0,0 +1,97 @@ +# Forty-five NTSC-U helpers: publication snapshot + +This publication branch rebases the forty-five verified local matches onto +upstream `fe6ec0d2`. The reconstructed source files are byte-for-byte unchanged +from the local work. Historical batch notes describe their original checkout +and audit baselines; this snapshot describes the rebased publication result. + +The collection contains **45 matched functions / 1,936 retail bytes**. All +5,306 non-library C translation units compile in the complete source build. +The 45 newly built objects pass full non-relocated-field comparison and +standard relocation resolution in an in-memory proof copy, with **28 actual +call/address target groups** checked independently. No compiler object is +patched, and this is static matching proof, not a game or native-port test. + +The merged compiler script preserves upstream `@lit4` handling and float +constant expansion for SN code, together with the pinned compiler profiles +needed by these sources. Compiler options remain whole-file options. All +26 compiler-route/profile tests pass. Compiler binaries, private runtimes, +retail inputs, generated assembly, objects and scratch evidence stay local. + +Against a same-pipeline upstream baseline with these 45 objects excluded, +the legacy audit increases from **3,756 to 3,801 exact functions**. It retains +the same three non-exact and 827 unlisted functions. Full relocation discrepancy +records remain byte-identical: 80 preexisting mismatches and three unresolved +targets. The new functions have no new mismatches or unresolved targets. + +The US coverage and progress checks pass at **4,520 of 18,086 functions / +352,712 of 5,782,424 bytes**. The increase is exactly 45 functions and +1,936 matched bytes. The official inventory generator was used to split +`func_01EC3498`'s proven 32-byte extent from the independent 12-byte neighbor +`func_01EC34B8`; the neighbor remains unmatched. This adds one function to the +inventory denominator and corrects the previous twelve-byte overcredit. +Only these two officially generated inventory rows and the 45 new verified US +map rows were adopted; all unrelated upstream rows and ordering are preserved. +The official map generator's 59 unrelated baseline differences remain excluded. + +**Draft review limitation:** PAL retail inputs are unavailable. PAL sources, +map, report and README progress are unchanged from upstream. The PAL coverage +check fails because the 45 new US source functions lack PAL map rows. No PAL +match, mismatch or regional equivalence is invented. A contributor with the +PAL inputs must regenerate and review PAL mapping before this draft is merged. +The current CI workflow runs both regional checks, so this limitation prevents +a green progress-report job until the PAL work is completed. + +All seventeen open PR patches were checked against the complete function set; +no direct source/function overlap was found. The deferred `func_01EEEDA0` +scheduling near miss and all scratch attempts are excluded from this commit. +Its local claim was released. No game launch, desktop input or upstream merge +was performed. Matching work is paused after this publication batch. + +| Function | Verified retail bytes | +| --- | ---: | +| `func_001221D8` | 108 | +| `func_0014ADD8` | 56 | +| `func_0014C368` | 68 | +| `func_0014D010` | 68 | +| `func_0014DE80` | 84 | +| `func_01E9B268` | 40 | +| `func_01EA0610` | 40 | +| `func_01EA47E8` | 40 | +| `func_01EA4EE8` | 32 | +| `func_01EA71C8` | 36 | +| `func_01EA88A0` | 36 | +| `func_01EA9800` | 36 | +| `func_01EA9D98` | 72 | +| `func_01EA9FE8` | 52 | +| `func_01EAA020` | 52 | +| `func_01EAA060` | 52 | +| `func_01EAA0D0` | 96 | +| `func_01EB0D78` | 28 | +| `func_01EB4DB0` | 28 | +| `func_01EB4DE8` | 36 | +| `func_01EB4E40` | 36 | +| `func_01EB4FF0` | 36 | +| `func_01EB7288` | 36 | +| `func_01EB72B0` | 36 | +| `func_01EB72D8` | 36 | +| `func_01EB84B8` | 36 | +| `func_01EBDED0` | 32 | +| `func_01EBDEF0` | 32 | +| `func_01EC2840` | 40 | +| `func_01EC3498` | 32 | +| `func_01EC52B8` | 36 | +| `func_01EC9B08` | 40 | +| `func_01ED5548` | 36 | +| `func_01ED5570` | 32 | +| `func_01ED5638` | 32 | +| `func_01ED8500` | 40 | +| `func_01ED9BE8` | 32 | +| `func_01EDA098` | 28 | +| `func_01EDB030` | 36 | +| `func_01EDB388` | 36 | +| `func_01EED4D8` | 40 | +| `func_01EEE000` | 40 | +| `func_01EF21FC` | 32 | +| `func_01EFA2A4` | 36 | +| `func_01F07154` | 28 | diff --git a/notes/ntscu-single-2026-10-31.md b/notes/ntscu-single-2026-10-31.md new file mode 100644 index 00000000..d1a7b571 --- /dev/null +++ b/notes/ntscu-single-2026-10-31.md @@ -0,0 +1,39 @@ +# One-function NTSC-U follow-up, 2026-10-31 + +Starting revision: `d91a9c46`. Fetched origin/main remained `74961298`; +the clean local branch was two commits ahead. Refreshed and inspected all +six open PRs (#48 through #53), including their actual diffs, and checked +source, US/PAL maps, claims and existing attempts before selection. + +Matched **`func_001221D8`**, 108 bytes, in `src/core/001221D8.c`. +It rounds a trailing decimal digit and propagates carry through preceding +`'9'` bytes. It has no calls, globals or relocations. Its normalized US +code is unique among the resident functions checked, and no existing map +row owned its place. No PR overlap was found. PAL inventory has the same +address/size; PAL instruction bytes remain unavailable. + +The Terra Medium worker used four of six allowed candidate runs; p3.c +matched. Primary review verified all 108 bytes against retail without +masking, then integrated under the landing lock and rebuilt the source +through the existing local launcher. That rebuild also matched exactly. +The function can access preceding storage for a length-one rounding input, +as retail does; its caller must provide valid storage on that path. No +undefined-behavior or instruction-injection trick was used to obtain the match. + +The legacy byte audit adds exactly this function (3,502 to 3,503 exact), +retaining the same three non-exact functions and 761 unlisted functions. +Full relocation records remain identical: 80 existing discrepancies and +three unresolved targets. No clean whole-tree audit is claimed. + +Only the new row from the official US map generator was adopted; all +pre-existing map rows and their ordering were preserved. US progress and +the README table were regenerated: 4,156 functions, 322,648 matched bytes. +US coverage/progress and whitespace checks pass. PAL files are unchanged; +its missing mapping rows now include this source alongside the previous +four, and the PAL coverage guard remains failing without PAL inputs. + +Candidates, notes, baseline snapshots, PR exclusions, independent proof +and audit logs remain in ignored `build/try/func_001221D8/` and +`build/batches/codex-20261031-single-02/`. The matched claim is retained. +Only this function was attempted. No tools, toolchains or previous matches +were changed. No squash, push, PR or game launch was performed. diff --git a/notes/ntscu-twenty-07.md b/notes/ntscu-twenty-07.md new file mode 100644 index 00000000..c42014a9 --- /dev/null +++ b/notes/ntscu-twenty-07.md @@ -0,0 +1,85 @@ +# Twenty NTSC-U network helpers + +This collection adds **twenty independently verified functions / 696 retail +bytes** after `617abef3`. The earlier twenty-five local matches remain closed. +The twenty matched claims are retained as `codex-20261101-twenty-07`. + +| Function | Verified bytes | Behavior | +| --- | ---: | --- | +| `func_01EB0D78` | 28 | Clear 0x34 bytes and return the destination | +| `func_01EB4DB0` | 28 | Clear eight bytes and return the destination | +| `func_01EDA098` | 28 | Clear 0x30 bytes and return the destination | +| `func_01F07154` | 28 | Clear 0x40 bytes and return the destination | +| `func_01EC3498` | 32 | Call `func_01EA9ED8` with fixed context 0x001B69C0 and null optional output; preserve status | +| `func_01ED5570` | 32 | Copy 0x18 bytes from 0x001B7678 to the incoming destination | +| `func_01ED5638` | 32 | Copy 0x30 bytes from 0x001B7690 to the incoming destination | +| `func_01ED9BE8` | 32 | Forward two inputs and constants -0x3C6, 0x12C and zero; preserve callback result | +| `func_01EF21FC` | 32 | Clear word +0x400 before zeroing the first 0x400 bytes; return destination | +| `func_01ED5548` | 36 | Copy 0x18 bytes from the incoming source to fixed destination 0x001B7678 | +| `func_01EDB388` | 36 | Clear 0x114 bytes and return zero | +| `func_01EA0610` | 40 | Initialize valid output to 0x100, then read context word +0x404; null returns 0x17 | +| `func_01EA47E8` | 40 | Read a word from a nonnull table only for unsigned indices below 256 | +| `func_01EC2840` | 40 | Null returns 2; nonzero +0x3C returns 0xD6DA; otherwise set +0x38 to one and return zero | +| `func_01EC9B08` | 40 | Same guarded output contract, distinct context word +0x408 | +| `func_01ED8500` | 40 | Null returns -21; otherwise clear words +0/+4/+0xC, set halfword +0x10 to -1, preserve +8 | +| `func_01EEE000` | 40 | Test ASCII A-Z or a-z using defined unsigned range arithmetic | +| `func_01EDB030` | 36 | Forward a halfword-array pointer and shifted/masked word count; return the helper's mask | +| `func_01EFA2A4` | 36 | Forward the object, signed low byte and zero flag to `func_01EFA118` | +| `func_01EED4D8` | 40 | Call `func_01F0C090` with address 0x0019C2D8 and code 0xE7, then return zero | + +Origin was freshly fetched without merging. All seventeen open PR patches, +local source/maps/near misses/claims/history, normalized same-size US NET +fingerprints and shared xmap records were checked. PR #54 had grown to +twenty-eight PAL functions, without selected-function overlap. PAL bytes are +absent, so equivalent inventory addresses do not prove regional byte identity. + +Two reused Terra Medium workers matched one function at a time in disjoint +scratch folders. The twenty landed functions retain 36 candidates and logged +runs. They use existing pinned `@ee296 -O2 -G0`; the signed-byte wrapper adds +whole-file `-fno-optimize-sibling-calls`, and the final fixed-address wrapper +adds whole-file `-mno-split-addresses`. No toolchain or build-pipeline change +was made. Plain C only; no pins, inline assembly, barriers, volatile ordering, +invented dependencies, undefined-overflow tricks or object edits. + +One originally selected function, `func_01EEEDA0`, remains a deferred near +miss. Its initial word load and output write ordering are understood, but an +independent address calculation and store remain swapped. Its 57 candidate +runs, seven diagnostic runs, RTL-comment evidence and notes remain local. +A bounded fresh Terra High diagnosis confirmed the scheduling tie after the +Medium reviews. No numerical attempt ceiling was imposed. Its claim was +released and the freshly checked `func_01EED4D8` substituted within this +twenty-match batch. The near miss is excluded from source and progress. + +Primary review checked actual callees, incoming arguments, signedness, +memory widths, offsets and write ordering. The memset/memcpy-like helpers +return their destination pointers; tail wrappers preserve those results. +The signed-byte helper has arbitrary v0 on early paths, so its wrapper uses +a void interface. Other inferred source type identities remain provisional. +Integration took the landing lock. Every actual source was rebuilt through +the normal launcher and checked again before installing its object. All +696 bytes match after standard relocation resolution in an in-memory proof +copy only; six functions match without masking. All nineteen call/address +target groups pass independently, with no new mismatch or unresolved target. + +Official US coverage/progress checks pass at **4,196 functions / 324,212 +bytes**. This report credits **708 new bytes**, twelve more than the proven +696: `config/us/inventory.tsv` merges the 32-byte `func_01EC3498` with its +separate 12-byte neighbor `func_01EC34B8`, while the legacy function list and +new official map row correctly record the matched 32-byte extent. The extra +twelve bytes are neighboring code, not zero padding, and are **not proven +by this batch**. The existing catalogue and reporting tools were not changed; +the full discrepancy is recorded locally. Do not equate that report credit +with additional verified code. + +Only the official generator's twenty new US map rows were adopted; all old +rows and order remain unchanged. Its 59 unrelated regeneration discrepancies +and raw output are retained. The legacy audit reaches 3,543 exact while +retaining the same three non-exact and 761 unlisted functions. Full relocation +discrepancy records remain byte-identical: 80 existing mismatches and three +unresolved targets. All 136 recorded installed toolchain hashes are unchanged. + +PAL files are untouched; its coverage guard lacks forty-five local US rows. +No PAL results were fabricated. All scratch, proofs, snapshots, raw reports +and selection amendments remain ignored under `build/try/` and +`build/batches/codex-20261101-twenty-07/`. No push, PR, publication, further +squash, game launch or desktop interaction was performed. diff --git a/progress/report.json b/progress/report.json index 006e7f06..5f2d0c5c 100644 --- a/progress/report.json +++ b/progress/report.json @@ -1,51 +1,51 @@ { "version": 2, "measures": { - "fuzzy_match_percent": 6.68089, + "fuzzy_match_percent": 6.714371, "total_code": "5782424", - "matched_code": "350776", - "matched_code_percent": 6.066245, - "total_functions": 18085, - "matched_functions": 4475, - "matched_functions_percent": 24.744263, - "complete_code": "203876", - "complete_code_percent": 3.525788, - "total_units": 2842, - "complete_units": 2782 + "matched_code": "352712", + "matched_code_percent": 6.099726, + "total_functions": 18086, + "matched_functions": 4520, + "matched_functions_percent": 24.991706, + "complete_code": "205812", + "complete_code_percent": 3.559269, + "total_units": 2887, + "complete_units": 2827 }, "categories": [ { "id": "core", "name": "Main program", "measures": { - "fuzzy_match_percent": 9.807596, + "fuzzy_match_percent": 9.895865, "total_code": "2193280", - "matched_code": "203876", - "matched_code_percent": 9.295484, - "total_functions": 8948, - "matched_functions": 2784, - "matched_functions_percent": 31.113098, - "complete_code": "203876", - "complete_code_percent": 9.295484, - "total_units": 2827, - "complete_units": 2782 + "matched_code": "205812", + "matched_code_percent": 9.383754, + "total_functions": 8949, + "matched_functions": 2829, + "matched_functions_percent": 31.612471, + "complete_code": "205812", + "complete_code_percent": 9.383754, + "total_units": 2872, + "complete_units": 2827 } }, { "id": "core_text", "name": "Engine core (core.text)", "measures": { - "fuzzy_match_percent": 24.93376, + "fuzzy_match_percent": 25.062232, "total_code": "298900", - "matched_code": "72908", - "matched_code_percent": 24.392104, + "matched_code": "73292", + "matched_code_percent": 24.520575, "total_functions": 1695, - "matched_functions": 765, - "matched_functions_percent": 45.132743, + "matched_functions": 770, + "matched_functions_percent": 45.427729, "complete_code": "0", "complete_code_percent": 0.0, - "total_units": 769, - "complete_units": 763 + "total_units": 774, + "complete_units": 768 } }, { @@ -69,17 +69,17 @@ "id": "net_text", "name": "Network (net.text)", "measures": { - "fuzzy_match_percent": 4.313815, + "fuzzy_match_percent": 4.647134, "total_code": "465620", - "matched_code": "15372", - "matched_code_percent": 3.301405, - "total_functions": 2441, - "matched_functions": 478, - "matched_functions_percent": 19.582138, + "matched_code": "16924", + "matched_code_percent": 3.634724, + "total_functions": 2442, + "matched_functions": 518, + "matched_functions_percent": 21.212121, "complete_code": "0", "complete_code_percent": 0.0, - "total_units": 486, - "complete_units": 478 + "total_units": 526, + "complete_units": 518 } }, { @@ -3286,6 +3286,41 @@ ] } }, + { + "name": "core/001221D8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "108", + "matched_code": "108", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "108", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_001221D8", + "size": "108", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "1188312" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/core/001221D8.c", + "progress_categories": [ + "core", + "core_text" + ] + } + }, { "name": "core/00122248", "measures": { @@ -11056,6 +11091,41 @@ ] } }, + { + "name": "core/0014ADD8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "56", + "matched_code": "56", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "56", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_0014ADD8", + "size": "56", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "1355224" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/core/0014ADD8.c", + "progress_categories": [ + "core", + "core_text" + ] + } + }, { "name": "core/0014AFA8", "measures": { @@ -11231,6 +11301,76 @@ ] } }, + { + "name": "core/0014C368", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "68", + "matched_code": "68", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "68", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_0014C368", + "size": "68", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "1360744" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/core/0014C368.c", + "progress_categories": [ + "core", + "core_text" + ] + } + }, + { + "name": "core/0014D010", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "68", + "matched_code": "68", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "68", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_0014D010", + "size": "68", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "1363984" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/core/0014D010.c", + "progress_categories": [ + "core", + "core_text" + ] + } + }, { "name": "core/0014D210", "measures": { @@ -11511,6 +11651,41 @@ ] } }, + { + "name": "core/0014DE80", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "84", + "matched_code": "84", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "84", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_0014DE80", + "size": "84", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "1367680" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/core/0014DE80.c", + "progress_categories": [ + "core", + "core_text" + ] + } + }, { "name": "core/0014DFB0", "measures": { @@ -80925,6 +81100,41 @@ ] } }, + { + "name": "net/01E9B268", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "40", + "matched_code": "40", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "40", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01E9B268", + "size": "40", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32092776" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01E9B268.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01E9B460", "measures": { @@ -81520,6 +81730,41 @@ ] } }, + { + "name": "net/01EA0610", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "40", + "matched_code": "40", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "40", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EA0610", + "size": "40", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32114192" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EA0610.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EA0640", "measures": { @@ -81835,6 +82080,41 @@ ] } }, + { + "name": "net/01EA47E8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "40", + "matched_code": "40", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "40", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EA47E8", + "size": "40", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32131048" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EA47E8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EA4EE0", "measures": { @@ -81870,6 +82150,41 @@ ] } }, + { + "name": "net/01EA4EE8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "32", + "matched_code": "32", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "32", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EA4EE8", + "size": "32", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32132840" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EA4EE8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EA5688", "measures": { @@ -82150,6 +82465,41 @@ ] } }, + { + "name": "net/01EA71C8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EA71C8", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32141768" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EA71C8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EA71F0", "measures": { @@ -82325,6 +82675,41 @@ ] } }, + { + "name": "net/01EA88A0", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EA88A0", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32147616" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EA88A0.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EA8908", "measures": { @@ -82710,6 +83095,41 @@ ] } }, + { + "name": "net/01EA9800", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EA9800", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32151552" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EA9800.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EA9828", "measures": { @@ -82780,6 +83200,146 @@ ] } }, + { + "name": "net/01EA9D98", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "72", + "matched_code": "72", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "72", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EA9D98", + "size": "72", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32152984" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EA9D98.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EA9FE8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "52", + "matched_code": "52", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "52", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EA9FE8", + "size": "52", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32153576" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EA9FE8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EAA020", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "52", + "matched_code": "52", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "52", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EAA020", + "size": "52", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32153632" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EAA020.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EAA060", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "52", + "matched_code": "52", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "52", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EAA060", + "size": "52", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32153696" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EAA060.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EAA098", "measures": { @@ -82815,6 +83375,41 @@ ] } }, + { + "name": "net/01EAA0D0", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "96", + "matched_code": "96", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "96", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EAA0D0", + "size": "96", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32153808" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EAA0D0.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EAAE98", "measures": { @@ -83025,6 +83620,41 @@ ] } }, + { + "name": "net/01EB0D78", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "28", + "matched_code": "28", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "28", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB0D78", + "size": "28", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32181624" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB0D78.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EB10A0", "measures": { @@ -83340,6 +83970,146 @@ ] } }, + { + "name": "net/01EB4DB0", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "28", + "matched_code": "28", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "28", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB4DB0", + "size": "28", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32198064" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB4DB0.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EB4DE8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB4DE8", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32198120" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB4DE8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EB4E40", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB4E40", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32198208" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB4E40.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EB4FF0", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB4FF0", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32198640" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB4FF0.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EB5398", "measures": { @@ -83410,6 +84180,111 @@ ] } }, + { + "name": "net/01EB7288", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB7288", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32207496" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB7288.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EB72B0", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB72B0", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32207536" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB72B0.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EB72D8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB72D8", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32207576" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB72D8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EB7770", "measures": { @@ -83515,6 +84390,41 @@ ] } }, + { + "name": "net/01EB84B8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EB84B8", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32212152" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EB84B8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EB84E0", "measures": { @@ -83970,6 +84880,76 @@ ] } }, + { + "name": "net/01EBDED0", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "32", + "matched_code": "32", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "32", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EBDED0", + "size": "32", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32235216" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EBDED0.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EBDEF0", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "32", + "matched_code": "32", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "32", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EBDEF0", + "size": "32", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32235248" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EBDEF0.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EBE220", "measures": { @@ -84215,6 +85195,41 @@ ] } }, + { + "name": "net/01EC2840", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "40", + "matched_code": "40", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "40", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EC2840", + "size": "40", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32254016" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EC2840.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EC2920", "measures": { @@ -84355,6 +85370,41 @@ ] } }, + { + "name": "net/01EC3498", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "32", + "matched_code": "32", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "32", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EC3498", + "size": "32", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32257176" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EC3498.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EC34C8", "measures": { @@ -84390,6 +85440,41 @@ ] } }, + { + "name": "net/01EC52B8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EC52B8", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32264888" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EC52B8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EC54F0", "measures": { @@ -84565,6 +85650,41 @@ ] } }, + { + "name": "net/01EC9B08", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "40", + "matched_code": "40", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "40", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EC9B08", + "size": "40", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32283400" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EC9B08.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01ECC958", "measures": { @@ -85300,6 +86420,76 @@ ] } }, + { + "name": "net/01ED5548", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01ED5548", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32331080" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01ED5548.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01ED5570", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "32", + "matched_code": "32", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "32", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01ED5570", + "size": "32", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32331120" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01ED5570.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01ED5590", "measures": { @@ -85370,6 +86560,41 @@ ] } }, + { + "name": "net/01ED5638", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "32", + "matched_code": "32", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "32", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01ED5638", + "size": "32", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32331320" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01ED5638.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01ED5710", "measures": { @@ -85615,6 +86840,41 @@ ] } }, + { + "name": "net/01ED8500", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "40", + "matched_code": "40", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "40", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01ED8500", + "size": "40", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32343296" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01ED8500.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01ED8588", "measures": { @@ -85895,6 +87155,76 @@ ] } }, + { + "name": "net/01ED9BE8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "32", + "matched_code": "32", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "32", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01ED9BE8", + "size": "32", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32349160" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01ED9BE8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, + { + "name": "net/01EDA098", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "28", + "matched_code": "28", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "28", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EDA098", + "size": "28", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32350360" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EDA098.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EDA0B8", "measures": { @@ -86210,6 +87540,41 @@ ] } }, + { + "name": "net/01EDB030", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EDB030", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32354352" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EDB030.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EDB058", "measures": { @@ -86350,6 +87715,41 @@ ] } }, + { + "name": "net/01EDB388", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EDB388", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32355208" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EDB388.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EDBB20", "measures": { @@ -92755,6 +94155,41 @@ ] } }, + { + "name": "net/01EED4D8", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "40", + "matched_code": "40", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "40", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EED4D8", + "size": "40", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32429272" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EED4D8.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EED598", "measures": { @@ -92895,6 +94330,41 @@ ] } }, + { + "name": "net/01EEE000", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "40", + "matched_code": "40", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "40", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EEE000", + "size": "40", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32432128" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EEE000.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EEE070", "measures": { @@ -93630,6 +95100,41 @@ ] } }, + { + "name": "net/01EF21FC", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "32", + "matched_code": "32", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "32", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EF21FC", + "size": "32", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32449020" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EF21FC.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EF2618", "measures": { @@ -94995,6 +96500,41 @@ ] } }, + { + "name": "net/01EFA2A4", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "36", + "matched_code": "36", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "36", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01EFA2A4", + "size": "36", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32481956" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01EFA2A4.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01EFB5E0", "measures": { @@ -96010,6 +97550,41 @@ ] } }, + { + "name": "net/01F07154", + "measures": { + "fuzzy_match_percent": 100.0, + "total_code": "28", + "matched_code": "28", + "matched_code_percent": 100.0, + "total_functions": 1, + "matched_functions": 1, + "matched_functions_percent": 100.0, + "complete_code": "28", + "complete_code_percent": 100.0, + "total_units": 1, + "complete_units": 1 + }, + "functions": [ + { + "name": "func_01F07154", + "size": "28", + "fuzzy_match_percent": 100.0, + "address": "0", + "metadata": { + "virtual_address": "32534868" + } + } + ], + "metadata": { + "complete": true, + "source_path": "src/net/01F07154.c", + "progress_categories": [ + "core", + "net_text" + ] + } + }, { "name": "net/01F07300", "measures": { @@ -128366,11 +129941,11 @@ { "name": "main/core.text/0012xxxx", "measures": { - "fuzzy_match_percent": 0.593348, - "total_code": "47528", + "fuzzy_match_percent": 0.594699, + "total_code": "47420", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 282, + "total_functions": 281, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -128424,15 +129999,6 @@ "virtual_address": "1187872" } }, - { - "name": "func_001221D8", - "size": "108", - "fuzzy_match_percent": 0.0, - "address": "7784", - "metadata": { - "virtual_address": "1188312" - } - }, { "name": "func_00122360", "size": "1468", @@ -132360,11 +133926,11 @@ { "name": "main/core.text/0014xxxx", "measures": { - "fuzzy_match_percent": 1.458473, - "total_code": "50464", + "fuzzy_match_percent": 1.466494, + "total_code": "50188", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 166, + "total_functions": 162, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -133309,15 +134875,6 @@ "virtual_address": "1354872" } }, - { - "name": "func_0014ADD8", - "size": "56", - "fuzzy_match_percent": 0.0, - "address": "42888", - "metadata": { - "virtual_address": "1355224" - } - }, { "name": "func_0014AE10", "size": "408", @@ -133453,15 +135010,6 @@ "virtual_address": "1360568" } }, - { - "name": "func_0014C368", - "size": "68", - "fuzzy_match_percent": 0.0, - "address": "48408", - "metadata": { - "virtual_address": "1360744" - } - }, { "name": "func_0014C3B0", "size": "4", @@ -133534,15 +135082,6 @@ "virtual_address": "1363448" } }, - { - "name": "func_0014D010", - "size": "68", - "fuzzy_match_percent": 0.0, - "address": "51648", - "metadata": { - "virtual_address": "1363984" - } - }, { "name": "func_0014D058", "size": "132", @@ -133651,15 +135190,6 @@ "virtual_address": "1367488" } }, - { - "name": "func_0014DE80", - "size": "84", - "fuzzy_match_percent": 0.0, - "address": "55344", - "metadata": { - "virtual_address": "1367680" - } - }, { "name": "func_0014DED8", "size": "216", @@ -136569,11 +138099,11 @@ { "name": "main/net.text/01E9xxxx", "measures": { - "fuzzy_match_percent": 3.369386, - "total_code": "23832", + "fuzzy_match_percent": 3.37505, + "total_code": "23792", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 133, + "total_functions": 132, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -136780,15 +138310,6 @@ "virtual_address": "32092736" } }, - { - "name": "func_01E9B268", - "size": "40", - "fuzzy_match_percent": 0.0, - "address": "4712", - "metadata": { - "virtual_address": "32092776" - } - }, { "name": "func_01E9B290", "size": "60", @@ -137792,11 +139313,11 @@ { "name": "main/net.text/01EAxxxx", "measures": { - "fuzzy_match_percent": 0.800496, - "total_code": "65960", + "fuzzy_match_percent": 0.807153, + "total_code": "65416", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 302, + "total_functions": 291, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -137868,15 +139389,6 @@ "virtual_address": "32114008" } }, - { - "name": "func_01EA0610", - "size": "40", - "fuzzy_match_percent": 0.0, - "address": "1480", - "metadata": { - "virtual_address": "32114192" - } - }, { "name": "func_01EA0638", "size": "4", @@ -138345,15 +139857,6 @@ "virtual_address": "32130928" } }, - { - "name": "func_01EA47E8", - "size": "40", - "fuzzy_match_percent": 0.0, - "address": "18336", - "metadata": { - "virtual_address": "32131048" - } - }, { "name": "func_01EA4810", "size": "148", @@ -138444,15 +139947,6 @@ "virtual_address": "32132624" } }, - { - "name": "func_01EA4EE8", - "size": "32", - "fuzzy_match_percent": 0.0, - "address": "20128", - "metadata": { - "virtual_address": "32132840" - } - }, { "name": "func_01EA4F08", "size": "96", @@ -138759,15 +140253,6 @@ "virtual_address": "32141560" } }, - { - "name": "func_01EA71C8", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "29056", - "metadata": { - "virtual_address": "32141768" - } - }, { "name": "func_01EA7248", "size": "48", @@ -139056,15 +140541,6 @@ "virtual_address": "32147232" } }, - { - "name": "func_01EA88A0", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "34904", - "metadata": { - "virtual_address": "32147616" - } - }, { "name": "func_01EA88C8", "size": "60", @@ -139353,15 +140829,6 @@ "virtual_address": "32151440" } }, - { - "name": "func_01EA9800", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "38840", - "metadata": { - "virtual_address": "32151552" - } - }, { "name": "func_01EA9850", "size": "56", @@ -139470,15 +140937,6 @@ "virtual_address": "32152872" } }, - { - "name": "func_01EA9D98", - "size": "72", - "fuzzy_match_percent": 0.0, - "address": "40272", - "metadata": { - "virtual_address": "32152984" - } - }, { "name": "func_01EA9DE0", "size": "72", @@ -139533,24 +140991,6 @@ "virtual_address": "32153488" } }, - { - "name": "func_01EA9FE8", - "size": "52", - "fuzzy_match_percent": 0.0, - "address": "40864", - "metadata": { - "virtual_address": "32153576" - } - }, - { - "name": "func_01EAA020", - "size": "52", - "fuzzy_match_percent": 0.0, - "address": "40920", - "metadata": { - "virtual_address": "32153632" - } - }, { "name": "func_01EAA058", "size": "4", @@ -139560,24 +141000,6 @@ "virtual_address": "32153688" } }, - { - "name": "func_01EAA060", - "size": "52", - "fuzzy_match_percent": 0.0, - "address": "40984", - "metadata": { - "virtual_address": "32153696" - } - }, - { - "name": "func_01EAA0D0", - "size": "96", - "fuzzy_match_percent": 0.0, - "address": "41096", - "metadata": { - "virtual_address": "32153808" - } - }, { "name": "func_01EAA130", "size": "232", @@ -140536,11 +141958,11 @@ { "name": "main/net.text/01EBxxxx", "measures": { - "fuzzy_match_percent": 0.562895, - "total_code": "61644", + "fuzzy_match_percent": 0.566313, + "total_code": "61272", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 216, + "total_functions": 205, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -140576,15 +141998,6 @@ "virtual_address": "32181528" } }, - { - "name": "func_01EB0D78", - "size": "28", - "fuzzy_match_percent": 0.0, - "address": "264", - "metadata": { - "virtual_address": "32181624" - } - }, { "name": "func_01EB0D98", "size": "192", @@ -141017,15 +142430,6 @@ "virtual_address": "32197928" } }, - { - "name": "func_01EB4DB0", - "size": "28", - "fuzzy_match_percent": 0.0, - "address": "16704", - "metadata": { - "virtual_address": "32198064" - } - }, { "name": "func_01EB4DD0", "size": "24", @@ -141035,15 +142439,6 @@ "virtual_address": "32198096" } }, - { - "name": "func_01EB4DE8", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "16760", - "metadata": { - "virtual_address": "32198120" - } - }, { "name": "func_01EB4E10", "size": "48", @@ -141053,15 +142448,6 @@ "virtual_address": "32198160" } }, - { - "name": "func_01EB4E40", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "16848", - "metadata": { - "virtual_address": "32198208" - } - }, { "name": "func_01EB4E68", "size": "48", @@ -141089,15 +142475,6 @@ "virtual_address": "32198528" } }, - { - "name": "func_01EB4FF0", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "17280", - "metadata": { - "virtual_address": "32198640" - } - }, { "name": "func_01EB5018", "size": "896", @@ -141458,33 +142835,6 @@ "virtual_address": "32207392" } }, - { - "name": "func_01EB7288", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "26136", - "metadata": { - "virtual_address": "32207496" - } - }, - { - "name": "func_01EB72B0", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "26176", - "metadata": { - "virtual_address": "32207536" - } - }, - { - "name": "func_01EB72D8", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "26216", - "metadata": { - "virtual_address": "32207576" - } - }, { "name": "func_01EB7300", "size": "608", @@ -141575,15 +142925,6 @@ "virtual_address": "32211928" } }, - { - "name": "func_01EB84B8", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "30792", - "metadata": { - "virtual_address": "32212152" - } - }, { "name": "func_01EB84F8", "size": "272", @@ -142259,24 +143600,6 @@ "virtual_address": "32235128" } }, - { - "name": "func_01EBDED0", - "size": "32", - "fuzzy_match_percent": 0.0, - "address": "53856", - "metadata": { - "virtual_address": "32235216" - } - }, - { - "name": "func_01EBDEF0", - "size": "32", - "fuzzy_match_percent": 0.0, - "address": "53888", - "metadata": { - "virtual_address": "32235248" - } - }, { "name": "func_01EBDF10", "size": "276", @@ -142506,11 +143829,11 @@ { "name": "main/net.text/01ECxxxx", "measures": { - "fuzzy_match_percent": 1.402002, - "total_code": "63552", + "fuzzy_match_percent": 1.405274, + "total_code": "63404", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 221, + "total_functions": 218, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -142807,15 +144130,6 @@ "virtual_address": "32253944" } }, - { - "name": "func_01EC2840", - "size": "40", - "fuzzy_match_percent": 0.0, - "address": "9264", - "metadata": { - "virtual_address": "32254016" - } - }, { "name": "func_01EC2868", "size": "76", @@ -142970,12 +144284,12 @@ } }, { - "name": "func_01EC3498", - "size": "44", + "name": "func_01EC34B8", + "size": "12", "fuzzy_match_percent": 0.0, - "address": "12424", + "address": "12456", "metadata": { - "virtual_address": "32257176" + "virtual_address": "32257208" } }, { @@ -143257,15 +144571,6 @@ "virtual_address": "32264832" } }, - { - "name": "func_01EC52B8", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "20136", - "metadata": { - "virtual_address": "32264888" - } - }, { "name": "func_01EC52E0", "size": "72", @@ -143887,15 +145192,6 @@ "virtual_address": "32283176" } }, - { - "name": "func_01EC9B08", - "size": "40", - "fuzzy_match_percent": 0.0, - "address": "38648", - "metadata": { - "virtual_address": "32283400" - } - }, { "name": "func_01EC9B30", "size": "108", @@ -144521,11 +145817,11 @@ { "name": "main/net.text/01EDxxxx", "measures": { - "fuzzy_match_percent": 0.836307, - "total_code": "57036", + "fuzzy_match_percent": 0.840314, + "total_code": "56764", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 275, + "total_functions": 267, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -145254,24 +146550,6 @@ "virtual_address": "32330920" } }, - { - "name": "func_01ED5548", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "21808", - "metadata": { - "virtual_address": "32331080" - } - }, - { - "name": "func_01ED5570", - "size": "32", - "fuzzy_match_percent": 0.0, - "address": "21848", - "metadata": { - "virtual_address": "32331120" - } - }, { "name": "func_01ED55B0", "size": "136", @@ -145281,15 +146559,6 @@ "virtual_address": "32331184" } }, - { - "name": "func_01ED5638", - "size": "32", - "fuzzy_match_percent": 0.0, - "address": "22048", - "metadata": { - "virtual_address": "32331320" - } - }, { "name": "func_01ED5658", "size": "92", @@ -146028,15 +147297,6 @@ "virtual_address": "32343120" } }, - { - "name": "func_01ED8500", - "size": "40", - "fuzzy_match_percent": 0.0, - "address": "34024", - "metadata": { - "virtual_address": "32343296" - } - }, { "name": "func_01ED8528", "size": "96", @@ -146334,15 +147594,6 @@ "virtual_address": "32349072" } }, - { - "name": "func_01ED9BE8", - "size": "32", - "fuzzy_match_percent": 0.0, - "address": "39888", - "metadata": { - "virtual_address": "32349160" - } - }, { "name": "func_01ED9C08", "size": "88", @@ -146370,15 +147621,6 @@ "virtual_address": "32349344" } }, - { - "name": "func_01EDA098", - "size": "28", - "fuzzy_match_percent": 0.0, - "address": "41088", - "metadata": { - "virtual_address": "32350360" - } - }, { "name": "func_01EDA110", "size": "684", @@ -146577,15 +147819,6 @@ "virtual_address": "32354200" } }, - { - "name": "func_01EDB030", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "45080", - "metadata": { - "virtual_address": "32354352" - } - }, { "name": "func_01EDB090", "size": "116", @@ -146640,15 +147873,6 @@ "virtual_address": "32355080" } }, - { - "name": "func_01EDB388", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "45936", - "metadata": { - "virtual_address": "32355208" - } - }, { "name": "func_01EDB3B0", "size": "44", @@ -147022,11 +148246,11 @@ { "name": "main/net.text/01EExxxx", "measures": { - "fuzzy_match_percent": 1.301111, - "total_code": "64176", + "fuzzy_match_percent": 1.302735, + "total_code": "64096", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 242, + "total_functions": 240, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -148691,15 +149915,6 @@ "virtual_address": "32428652" } }, - { - "name": "func_01EED4D8", - "size": "40", - "fuzzy_match_percent": 0.0, - "address": "54328", - "metadata": { - "virtual_address": "32429272" - } - }, { "name": "func_01EED500", "size": "40", @@ -148817,15 +150032,6 @@ "virtual_address": "32431952" } }, - { - "name": "func_01EEE000", - "size": "40", - "fuzzy_match_percent": 0.0, - "address": "57184", - "metadata": { - "virtual_address": "32432128" - } - }, { "name": "func_01EEE028", "size": "72", @@ -149226,11 +150432,11 @@ { "name": "main/net.text/01EFxxxx", "measures": { - "fuzzy_match_percent": 0.454657, - "total_code": "64004", + "fuzzy_match_percent": 0.45514, + "total_code": "63936", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 301, + "total_functions": 299, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -149482,15 +150688,6 @@ "virtual_address": "32448912" } }, - { - "name": "func_01EF21FC", - "size": "32", - "fuzzy_match_percent": 0.0, - "address": "8452", - "metadata": { - "virtual_address": "32449020" - } - }, { "name": "func_01EF221C", "size": "40", @@ -150904,15 +152101,6 @@ "virtual_address": "32481560" } }, - { - "name": "func_01EFA2A4", - "size": "36", - "fuzzy_match_percent": 0.0, - "address": "41388", - "metadata": { - "virtual_address": "32481956" - } - }, { "name": "func_01EFA2C8", "size": "160", @@ -151961,11 +153149,11 @@ { "name": "main/net.text/01F0xxxx", "measures": { - "fuzzy_match_percent": 1.083049, - "total_code": "50044", + "fuzzy_match_percent": 1.083656, + "total_code": "50016", "matched_code": "0", "matched_code_percent": 0.0, - "total_functions": 273, + "total_functions": 272, "matched_functions": 0, "matched_functions_percent": 0.0, "complete_code": "0", @@ -153261,15 +154449,6 @@ "virtual_address": "32534784" } }, - { - "name": "func_01F07154", - "size": "28", - "fuzzy_match_percent": 0.0, - "address": "28896", - "metadata": { - "virtual_address": "32534868" - } - }, { "name": "func_01F07170", "size": "40", diff --git a/src/core/001221D8.c b/src/core/001221D8.c new file mode 100644 index 00000000..698452ad --- /dev/null +++ b/src/core/001221D8.c @@ -0,0 +1,21 @@ +#include "common.h" + +// Rounds the trailing decimal digit and propagates carry, reporting overflow. +s32 func_001221D8(s8 *arg0, s32 arg1) { + s8 *p; + if (arg1 > 0) { + arg1--; + p = arg0 + arg1; + if (*p >= '5') { + do { + *p = '0'; + arg1--; + p--; + } while (arg1 > 0 && *p == '9'); + arg0 += arg1; + if (*arg0 == '9') return 0; + *arg0 = (u8)*arg0 + 1; + } + } + return 1; +} diff --git a/src/core/0014ADD8.c b/src/core/0014ADD8.c new file mode 100644 index 00000000..cd8ef9ca --- /dev/null +++ b/src/core/0014ADD8.c @@ -0,0 +1,14 @@ +#include "common.h" + +// Scales successive source elements by successive powers of the multiplier. +void func_0014ADD8(f32 *arg0, f32 *arg1, u32 arg2, f32 fparg0) { + f32 factor = 1.0f; + if ((s32)arg2 >= 0) { + arg2++; + do { + f32 value = *arg0++ * factor; + factor *= fparg0; + *arg1++ = value; + } while (--arg2 != 0); + } +} diff --git a/src/core/0014C368.c b/src/core/0014C368.c new file mode 100644 index 00000000..060d38f8 --- /dev/null +++ b/src/core/0014C368.c @@ -0,0 +1,9 @@ +/* cflags: -Wa,-G0 */ +#include "common.h" + +extern f32 func_00136378(f32); + +// Converts the integer argument and passes the scaled value to the callee. +f32 func_0014C368(s32 arg0) { + return func_00136378(5.075174f - ((f32)arg0 * 0.01174797f)); +} diff --git a/src/core/0014D010.c b/src/core/0014D010.c new file mode 100644 index 00000000..519604b9 --- /dev/null +++ b/src/core/0014D010.c @@ -0,0 +1,11 @@ +/* cflags: @ee29-01 -O2 -G0 -Wa,-G0 */ +#include "common.h" + +// Computes a scaled reciprocal and caps it at the supplied limit. +s32 func_0014D010(s32 arg0, f32 fparg0) { + s32 value = (s32)(((512.0f / fparg0) * 3.9f) + 0.5f); + if (arg0 < value) { + value = arg0; + } + return value; +} diff --git a/src/core/0014DE80.c b/src/core/0014DE80.c new file mode 100644 index 00000000..376c4d90 --- /dev/null +++ b/src/core/0014DE80.c @@ -0,0 +1,12 @@ +/* cflags: -Wa,-G0 */ +#include "common.h" + +// Returns whether both signed fields, the argument, and the threshold satisfy the checks. +s32 func_0014DE80(s8 *arg0, s16 arg1, f32 arg2) { + s32 result = 0; + s8 field = arg0[0x14]; + if (field == 1 && arg1 == field && arg0[0x15] == arg1 && arg2 >= 0.45f) { + result = 1; + } + return result; +} diff --git a/src/net/01E9B268.c b/src/net/01E9B268.c new file mode 100644 index 00000000..1f1c4eaf --- /dev/null +++ b/src/net/01E9B268.c @@ -0,0 +1,13 @@ +/* cflags: -fno-schedule-insns */ +#include "common.h" + +typedef struct { u64 f0; u64 f8; } __attribute__((packed)) Type1; +typedef struct { u8 f0[0x34]; u64 f34; u64 f3C; } __attribute__((packed)) Type2; +/* Copies sixteen bytes into the destination at offset 0x34. */ +s32 func_01E9B268(Type2 *dst, const Type1 *src) { + u64 first = src->f0; + u64 second = src->f8; + dst->f34 = first; + dst->f3C = second; + return 0; +} diff --git a/src/net/01EA0610.c b/src/net/01EA0610.c new file mode 100644 index 00000000..d34a1777 --- /dev/null +++ b/src/net/01EA0610.c @@ -0,0 +1,13 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { char pad[0x404]; s32 f404; } Type1; +// Sets the output default and copies the context value if available. +s32 func_01EA0610(s32 *out, Type1 *ctx) { + s32 result = 0x17; + if (out == NULL) return result; + *out = 0x100; + if (ctx == NULL) return result; + { s32 value = ctx->f404; result = 0; *out = value; } + return result; +} diff --git a/src/net/01EA47E8.c b/src/net/01EA47E8.c new file mode 100644 index 00000000..e108278e --- /dev/null +++ b/src/net/01EA47E8.c @@ -0,0 +1,8 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +// Returns the indexed word when the table and index are valid. +s32 func_01EA47E8(s32 *table, u32 index) { + if (table != NULL && index < 0x100U) return *(s32 *)((u8 *)table + (index << 2)); + return 0; +} diff --git a/src/net/01EA4EE8.c b/src/net/01EA4EE8.c new file mode 100644 index 00000000..20decb9a --- /dev/null +++ b/src/net/01EA4EE8.c @@ -0,0 +1,10 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern s32 D_1AFD28[]; +/* Stores the global buffer address; a null output returns 0x17. */ +s32 func_01EA4EE8(s32 **arg0) { + if (arg0 == NULL) return 0x17; + *arg0 = D_1AFD28; + return 0; +} diff --git a/src/net/01EA71C8.c b/src/net/01EA71C8.c new file mode 100644 index 00000000..169761d2 --- /dev/null +++ b/src/net/01EA71C8.c @@ -0,0 +1,13 @@ +/* cflags: @ee32-040921 -O2 -G0 -frename-registers */ +#include "common.h" + +/* Copies the word at offset 0xC to the output, or returns 2 for a null argument. */ +s32 func_01EA71C8(void *object, s32 *out) +{ + s32 result = 2; + if (object != 0 && out != 0) { + result = 0; + *out = *(s32 *)((char *)object + 0xC); + } + return result; +} diff --git a/src/net/01EA88A0.c b/src/net/01EA88A0.c new file mode 100644 index 00000000..3ecb4cfc --- /dev/null +++ b/src/net/01EA88A0.c @@ -0,0 +1,9 @@ +#include "common.h" + +/* Returns whether the argument is an ASCII decimal digit. */ +s32 func_01EA88A0(s32 arg0) { + s32 below = arg0 < 0x30; + s32 upper = arg0 < 0x3A; + if (upper && !below) return 1; + return 0; +} diff --git a/src/net/01EA9800.c b/src/net/01EA9800.c new file mode 100644 index 00000000..127581b0 --- /dev/null +++ b/src/net/01EA9800.c @@ -0,0 +1,15 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +// Copies one byte when both pointers are valid and returns a status. +s32 func_01EA9800(u8 *arg0, u8 *arg1) { + s32 result = 2; + if (arg0 == NULL) return result; + if (arg1 == NULL) return result; + { + u8 value = *arg0; + result = 0; + *arg1 = value; + } + return result; +} diff --git a/src/net/01EA9D98.c b/src/net/01EA9D98.c new file mode 100644 index 00000000..d20bdaba --- /dev/null +++ b/src/net/01EA9D98.c @@ -0,0 +1,16 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u8 f0; u8 f1[3]; u32 f4, f8, fC, f10; } Type1; +extern s32 func_01EA9F90(Type1 *); +/* Clears the context and marks it active if initialization succeeds. */ +s32 func_01EA9D98(Type1 *arg0) { + s32 result; + if (arg0 == NULL) return 2; + arg0->f0 = 0; + arg0->f4 = 0; + arg0->f8 = 0; + result = func_01EA9F90(arg0); + if (result == 0) arg0->f0 = 1; + return result; +} diff --git a/src/net/01EA9FE8.c b/src/net/01EA9FE8.c new file mode 100644 index 00000000..a444622a --- /dev/null +++ b/src/net/01EA9FE8.c @@ -0,0 +1,12 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern s32 func_00126BB0(s32); + +/* Returns 2 for null, otherwise maps the helper result to a status. */ +s32 func_01EA9FE8(void *object) +{ + if (object == 0) + return 2; + return func_00126BB0(*(s32 *)((char *)object + 0xC)) == -1 ? 0x384 : 0; +} diff --git a/src/net/01EAA020.c b/src/net/01EAA020.c new file mode 100644 index 00000000..16a59875 --- /dev/null +++ b/src/net/01EAA020.c @@ -0,0 +1,12 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern s32 func_00126BE0(s32); + +/* Returns 2 for null, otherwise maps the helper result to a status. */ +s32 func_01EAA020(void *object) +{ + if (object == 0) + return 2; + return func_00126BE0(*(s32 *)((char *)object + 0xC)) == -1 ? 0x384 : 0; +} diff --git a/src/net/01EAA060.c b/src/net/01EAA060.c new file mode 100644 index 00000000..464cfb61 --- /dev/null +++ b/src/net/01EAA060.c @@ -0,0 +1,12 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern s32 func_00126BC0(s32); + +/* Returns 2 for null, otherwise maps the helper result to a status. */ +s32 func_01EAA060(void *object) +{ + if (object == 0) + return 2; + return func_00126BC0(*(s32 *)((char *)object + 0xC)) == -1 ? 0x384 : 0; +} diff --git a/src/net/01EAA0D0.c b/src/net/01EAA0D0.c new file mode 100644 index 00000000..ac7b480d --- /dev/null +++ b/src/net/01EAA0D0.c @@ -0,0 +1,25 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u32 f0, f4, f8, fc, f10; } Type1; +/* Initializes a context and validates its bounds. */ +s32 func_01EAA0D0(Type1 *arg0, u32 arg1, u32 arg2) { + s32 result = 0; + if (arg0 != NULL) { + arg0->f10 = 0; + arg0->f0 = arg1; + arg0->f8 = arg1; + arg0->f4 = arg2; + arg0->fc = 0; + if (arg1 == 0) { + arg0->f10 = 2; + return 0; + } + if (arg2 == 0 || arg1 >= arg2) { + arg0->f10 = 2; + return 0; + } + result = 1; + } + return result; +} diff --git a/src/net/01EB0D78.c b/src/net/01EB0D78.c new file mode 100644 index 00000000..adb2e849 --- /dev/null +++ b/src/net/01EB0D78.c @@ -0,0 +1,8 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern void *func_0011A518(void *, s32, u32); +// Clears 0x34 bytes and returns the destination. +void *func_01EB0D78(void *p) { + return func_0011A518(p, 0, 0x34); +} diff --git a/src/net/01EB4DB0.c b/src/net/01EB4DB0.c new file mode 100644 index 00000000..c0e6a3bc --- /dev/null +++ b/src/net/01EB4DB0.c @@ -0,0 +1,8 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern void *func_0011A518(void *, s32, u32); +// Clears 0x8 bytes and returns the destination. +void *func_01EB4DB0(void *p) { + return func_0011A518(p, 0, 0x8); +} diff --git a/src/net/01EB4DE8.c b/src/net/01EB4DE8.c new file mode 100644 index 00000000..de5744c1 --- /dev/null +++ b/src/net/01EB4DE8.c @@ -0,0 +1,12 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { + s32 f0; + s32 f4; +} Type1; + +/* Compare the first words of two eight-byte values passed by value. */ +s32 func_01EB4DE8(Type1 arg0, Type1 arg1) { + return arg0.f0 == arg1.f0; +} diff --git a/src/net/01EB4E40.c b/src/net/01EB4E40.c new file mode 100644 index 00000000..a9b5bd6f --- /dev/null +++ b/src/net/01EB4E40.c @@ -0,0 +1,10 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { s32 f0; s32 f4; } Type1; +extern void func_01EA91C0(u8 *, u32); +// Formats the first word into the supplied buffer and returns zero. +s32 func_01EB4E40(u8 *buffer, Type1 value) { + func_01EA91C0(buffer, value.f0); + return 0; +} diff --git a/src/net/01EB4FF0.c b/src/net/01EB4FF0.c new file mode 100644 index 00000000..3a99e54f --- /dev/null +++ b/src/net/01EB4FF0.c @@ -0,0 +1,10 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern u8 D_001B26C0[]; +extern s32 func_01E9D390(void *); +// Invokes the worker with the fixed address and returns zero. +s32 func_01EB4FF0(void) { + func_01E9D390(D_001B26C0); + return 0; +} diff --git a/src/net/01EB7288.c b/src/net/01EB7288.c new file mode 100644 index 00000000..86c63ee3 --- /dev/null +++ b/src/net/01EB7288.c @@ -0,0 +1,11 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u8 f0[0x1A4]; u16 f1A4; } Type1; +/* Copies the halfword when both pointers are valid. */ +s32 func_01EB7288(Type1 *arg0, u16 *arg1) { + if (arg1 == NULL) return 2; + if (arg0 == NULL) return 2; + *arg1 = arg0->f1A4; + return 0; +} diff --git a/src/net/01EB72B0.c b/src/net/01EB72B0.c new file mode 100644 index 00000000..4cff84cb --- /dev/null +++ b/src/net/01EB72B0.c @@ -0,0 +1,11 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u8 f0[0x1A2]; u16 f1A2; } Type1; +/* Copies the halfword when both pointers are valid. */ +s32 func_01EB72B0(Type1 *arg0, u16 *arg1) { + if (arg1 == NULL) return 2; + if (arg0 == NULL) return 2; + *arg1 = arg0->f1A2; + return 0; +} diff --git a/src/net/01EB72D8.c b/src/net/01EB72D8.c new file mode 100644 index 00000000..ec0f1091 --- /dev/null +++ b/src/net/01EB72D8.c @@ -0,0 +1,12 @@ +/* cflags: -Os */ +#include "common.h" + +typedef struct { u8 f0[0x1CC]; u16 f1CC; } Type1; +/* Reads the halfword at offset 0x1CC when both pointers are valid. */ +s32 func_01EB72D8(Type1 *arg0, u16 *arg1) { + if (arg1 == NULL) return 2; + *arg1 = 0; + if (arg0 == NULL) return 2; + *arg1 = arg0->f1CC; + return 0; +} diff --git a/src/net/01EB84B8.c b/src/net/01EB84B8.c new file mode 100644 index 00000000..2c53074d --- /dev/null +++ b/src/net/01EB84B8.c @@ -0,0 +1,12 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u8 f0[0x19C]; u16 f19C; } Type1; +/* Reads the halfword into a word output, or returns 2 for null pointers. */ +s32 func_01EB84B8(Type1 *arg0, s32 *arg1) { + if (arg1 == NULL) return 2; + *arg1 = 0; + if (arg0 == NULL) return 2; + *arg1 = arg0->f19C; + return 0; +} diff --git a/src/net/01EBDED0.c b/src/net/01EBDED0.c new file mode 100644 index 00000000..8f61874d --- /dev/null +++ b/src/net/01EBDED0.c @@ -0,0 +1,16 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { char pad[0x70]; s32 f70; } Type1; +// Clears the output and copies the context value when available. +s32 func_01EBDED0(Type1 *arg0, s32 *arg1) { + s32 result = 0xD2F2; + *arg1 = 0; + if (arg0 == NULL) return result; + { + s32 value = arg0->f70; + result = 0; + *arg1 = value; + } + return result; +} diff --git a/src/net/01EBDEF0.c b/src/net/01EBDEF0.c new file mode 100644 index 00000000..1e386d59 --- /dev/null +++ b/src/net/01EBDEF0.c @@ -0,0 +1,11 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u8 f0[0x5C]; u16 f5C; } Type1; +/* Clears the output and copies the context halfword when available. */ +s32 func_01EBDEF0(Type1 *arg0, u16 *arg1) { + *arg1 = 0; + if (arg0 == NULL) return 0xD2F3; + *arg1 = arg0->f5C; + return 0; +} diff --git a/src/net/01EC2840.c b/src/net/01EC2840.c new file mode 100644 index 00000000..49fabf21 --- /dev/null +++ b/src/net/01EC2840.c @@ -0,0 +1,11 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u8 f0[0x38]; s32 f38; s32 f3C; } Type1; +/* Enables the object when its state permits it. */ +s32 func_01EC2840(Type1 *arg0) { + if (arg0 == NULL) return 2; + if (arg0->f3C != 0) return 0xD6DA; + arg0->f38 = 1; + return 0; +} diff --git a/src/net/01EC3498.c b/src/net/01EC3498.c new file mode 100644 index 00000000..fc442b06 --- /dev/null +++ b/src/net/01EC3498.c @@ -0,0 +1,9 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern u8 D_001B69C0[]; +extern s32 func_01EA9ED8(void *, s32 *); +// Calls the context helper without requesting its optional output. +s32 func_01EC3498(void) { + return func_01EA9ED8(D_001B69C0, NULL); +} diff --git a/src/net/01EC52B8.c b/src/net/01EC52B8.c new file mode 100644 index 00000000..a5578764 --- /dev/null +++ b/src/net/01EC52B8.c @@ -0,0 +1,11 @@ +/* cflags: @ee32-040921 -O2 -G0 */ +#include "common.h" + +// Identifies status values other than the three excluded codes. +s32 func_01EC52B8(s32 arg0) { + s32 result = 0; + if (arg0 != 0 && arg0 != -0x54) { + result = arg0 != -0x6c; + } + return result; +} diff --git a/src/net/01EC9B08.c b/src/net/01EC9B08.c new file mode 100644 index 00000000..de5c04dc --- /dev/null +++ b/src/net/01EC9B08.c @@ -0,0 +1,13 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { char pad[0x408]; s32 f408; } Type1; +// Sets the output default and copies the context value if available. +s32 func_01EC9B08(s32 *out, Type1 *ctx) { + s32 result = 0x17; + if (out == NULL) return result; + *out = 0x100; + if (ctx == NULL) return result; + { s32 value = ctx->f408; result = 0; *out = value; } + return result; +} diff --git a/src/net/01ED5548.c b/src/net/01ED5548.c new file mode 100644 index 00000000..33571fcf --- /dev/null +++ b/src/net/01ED5548.c @@ -0,0 +1,9 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern u8 D_001B7678[]; +extern void *func_0011A370(void *, const void *, u32); +// Copies the source record to the fixed destination. +void *func_01ED5548(const void *p) { + return func_0011A370(D_001B7678, p, 0x18); +} diff --git a/src/net/01ED5570.c b/src/net/01ED5570.c new file mode 100644 index 00000000..254512ad --- /dev/null +++ b/src/net/01ED5570.c @@ -0,0 +1,9 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern u8 D_001B7678[]; +extern void *func_0011A370(void *, const void *, u32); +// Copies the fixed 24-byte record to the destination. +void *func_01ED5570(void *p) { + return func_0011A370(p, D_001B7678, 0x18); +} diff --git a/src/net/01ED5638.c b/src/net/01ED5638.c new file mode 100644 index 00000000..5e9eda7d --- /dev/null +++ b/src/net/01ED5638.c @@ -0,0 +1,9 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern u8 D_001B7690[]; +extern void *func_0011A370(void *, const void *, u32); +// Copies the fixed 48-byte record to the destination. +void *func_01ED5638(void *p) { + return func_0011A370(p, D_001B7690, 0x30); +} diff --git a/src/net/01ED8500.c b/src/net/01ED8500.c new file mode 100644 index 00000000..f5236cba --- /dev/null +++ b/src/net/01ED8500.c @@ -0,0 +1,11 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { s32 f0, f4, f8, fc; s16 f10; } Type1; +// Clears three fields and marks the final field invalid. +s32 func_01ED8500(Type1 *p) { + s32 result = -0x15; + if (p == NULL) return result; + p->fc = 0; p->f4 = 0; p->f0 = 0; p->f10 = -1; + return 0; +} diff --git a/src/net/01ED9BE8.c b/src/net/01ED9BE8.c new file mode 100644 index 00000000..399392f8 --- /dev/null +++ b/src/net/01ED9BE8.c @@ -0,0 +1,8 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern s32 func_01ED9B90(void *, void *, s32, s32, s32); +// Passes a fixed status and duration to the callback helper. +s32 func_01ED9BE8(void *object, void *state) { + return func_01ED9B90(object, state, -0x3C6, 0x12C, 0); +} diff --git a/src/net/01EDA098.c b/src/net/01EDA098.c new file mode 100644 index 00000000..2f9ae9e5 --- /dev/null +++ b/src/net/01EDA098.c @@ -0,0 +1,8 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern void *func_0011A518(void *, s32, u32); +// Clears 0x30 bytes and returns the destination. +void *func_01EDA098(void *p) { + return func_0011A518(p, 0, 0x30); +} diff --git a/src/net/01EDB030.c b/src/net/01EDB030.c new file mode 100644 index 00000000..aeb1b353 --- /dev/null +++ b/src/net/01EDB030.c @@ -0,0 +1,9 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u16 *f0; u32 f4; } Type1; +extern u32 func_01EDA958(void *, u16 *, u16); +// Builds a mask from the halfwords described by the input record. +u32 func_01EDB030(void *arg0, Type1 *arg1) { + return func_01EDA958(arg0, arg1->f0, (u16)(arg1->f4 >> 1)); +} diff --git a/src/net/01EDB388.c b/src/net/01EDB388.c new file mode 100644 index 00000000..684f4e17 --- /dev/null +++ b/src/net/01EDB388.c @@ -0,0 +1,9 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern void *func_0011A518(void *, s32, u32); +// Clears the object and returns zero. +s32 func_01EDB388(void *p) { + func_0011A518(p, 0, 0x114); + return 0; +} diff --git a/src/net/01EED4D8.c b/src/net/01EED4D8.c new file mode 100644 index 00000000..40e4756f --- /dev/null +++ b/src/net/01EED4D8.c @@ -0,0 +1,10 @@ +/* cflags: @ee296 -O2 -G0 -mno-split-addresses */ +#include "common.h" + +extern void func_01F0C090(const char *, s32); +extern char D_0019C2D8[]; +/* Calls the handler with the fixed string and code, then returns zero. */ +s32 func_01EED4D8(void) { + func_01F0C090(D_0019C2D8, 0xE7); + return 0; +} diff --git a/src/net/01EEE000.c b/src/net/01EEE000.c new file mode 100644 index 00000000..ba7b1358 --- /dev/null +++ b/src/net/01EEE000.c @@ -0,0 +1,8 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +// Returns whether the input is an ASCII alphabetic character. +s32 func_01EEE000(u32 x) { + if (x - 0x41U >= 26U && x - 0x61U >= 26U) return 0; + return 1; +} diff --git a/src/net/01EF21FC.c b/src/net/01EF21FC.c new file mode 100644 index 00000000..027bef36 --- /dev/null +++ b/src/net/01EF21FC.c @@ -0,0 +1,10 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +typedef struct { u8 data[0x400]; s32 f400; } Type1; +extern void *func_0011A518(void *, s32, u32); +// Clears the trailing word and the first 0x400 bytes. +void *func_01EF21FC(Type1 *p) { + p->f400 = 0; + return func_0011A518(p, 0, 0x400); +} diff --git a/src/net/01EFA2A4.c b/src/net/01EFA2A4.c new file mode 100644 index 00000000..3d34cc70 --- /dev/null +++ b/src/net/01EFA2A4.c @@ -0,0 +1,8 @@ +/* cflags: @ee296 -O2 -G0 -fno-optimize-sibling-calls */ +#include "common.h" + +extern void func_01EFA118(void *, s8, s32); +// Forwards the signed byte and a zero flag to the object helper. +void func_01EFA2A4(void *p, s8 value) { + func_01EFA118(p, value, 0); +} diff --git a/src/net/01F07154.c b/src/net/01F07154.c new file mode 100644 index 00000000..ba6b5ff1 --- /dev/null +++ b/src/net/01F07154.c @@ -0,0 +1,8 @@ +/* cflags: @ee296 -O2 -G0 */ +#include "common.h" + +extern void *func_0011A518(void *, s32, u32); +// Clears 0x40 bytes and returns the destination. +void *func_01F07154(void *p) { + return func_0011A518(p, 0, 0x40); +} diff --git a/tools/cc.sh b/tools/cc.sh index e60a7451..ebcb283b 100755 --- a/tools/cc.sh +++ b/tools/cc.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Compile a translation unit with the original compiler: SN GCC 2.95.3 by default, Sony EE GCC 2.9 -# for translation units whose cflags contain the standalone token @ee29. +# Compile with SN 1.36 by default; standalone profile markers opt a whole +# translation unit into an original compiler described in docs/TOOLCHAIN.md. set -euo pipefail cd "$(dirname "$0")/.." if [ "$#" -lt 2 ]; then @@ -34,18 +34,138 @@ tmp=build/tmp/$(echo "${out%.o}" | tr '/' '_') # flag exactly as supplied (including values containing spaces). ee29=0 lit4=0 +ee29_01=0 +ee32_040921=0 +ee32_030210=0 +ee32_030926=0 +sn114=0 +sn274=0 +sn107=0 +ee296=0 flags29=() +sn_asflags=() for flag in "$@"; do if [ "$flag" = '@ee29' ]; then ee29=1 elif [ "$flag" = '@lit4' ]; then - # keep GNU as's .lit4 loads for li.s (skip tools/ps2eeas_lis.py) + # Keep GNU as literal-pool loads rather than expanding li.s. lit4=1 + elif [ "$flag" = '@ee29-01' ]; then + ee29_01=1 + elif [ "$flag" = '@ee32-040921' ]; then + ee32_040921=1 + elif [ "$flag" = '@ee32-030210' ]; then + ee32_030210=1 + elif [ "$flag" = '@ee32-030926' ]; then + ee32_030926=1 + elif [ "$flag" = '@sn114' ]; then + sn114=1 + elif [ "$flag" = '@sn274' ]; then + sn274=1 + elif [ "$flag" = '@sn107' ]; then + sn107=1 + elif [ "$flag" = '@ee296' ]; then + ee296=1 else flags29+=("$flag") + # -S does not run the assembler. Preserve explicit assembler options + # for both SN assembly passes without forwarding compiler-only flags. + case "$flag" in + -Wa,*) sn_asflags+=("$flag") ;; + esac fi done +if [ "$ee296" -eq 1 ]; then + if [ "$((ee29 + ee29_01 + ee32_040921 + ee32_030210 + ee32_030926 + sn114 + sn274 + sn107))" -ne 0 ]; then + echo 'error: choose only one compiler profile with @ee296' >&2 + exit 1 + fi + if [ ! -f "$CC" ]; then + echo "error: SN EE assembler driver not found: $CC" >&2 + exit 1 + fi + if [ "${#flags29[@]}" -eq 0 ]; then + flags29=(-O2 -G0) + fi + "$PY" tools/ee296.py "$src" "$tmp.s" "${flags29[@]}" + run_compiler "$CC" "${sn_asflags[@]}" -c "$tmp.s" -o "$out" + exit 0 +fi + +if [ "$((sn114 + sn274 + sn107))" -gt 0 ] && [ "$((ee29 + ee29_01 + ee32_040921 + ee32_030210 + ee32_030926 + sn114 + sn274 + sn107))" -ne 1 ]; then + echo 'error: choose only one older SN compiler profile' >&2 + exit 1 +fi + +if [ "$ee32_030926" -eq 1 ]; then + if [ "$((ee29 + ee29_01 + ee32_040921 + ee32_030210))" -ne 0 ]; then + echo 'error: choose only one compiler profile with @ee32-030926' >&2 + exit 1 + fi + if [ ! -f "$CC" ]; then + echo "error: SN EE assembler driver not found: $CC" >&2 + exit 1 + fi + if [ "${#flags29[@]}" -eq 0 ]; then + flags29=(-O2 -G0) + fi + "$PY" tools/ee32_030926.py "$src" "$tmp.s" "${flags29[@]}" + run_compiler "$CC" "${sn_asflags[@]}" -c "$tmp.s" -o "$out" + exit 0 +fi + +if [ "$ee32_030210" -eq 1 ]; then + if [ "$((ee29 + ee29_01 + ee32_040921))" -ne 0 ]; then + echo 'error: choose only one compiler profile with @ee32-030210' >&2 + exit 1 + fi + if [ ! -f "$CC" ]; then + echo "error: SN EE assembler driver not found: $CC" >&2 + exit 1 + fi + if [ "${#flags29[@]}" -eq 0 ]; then + flags29=(-O2 -G0) + fi + "$PY" tools/ee32_030210.py "$src" "$tmp.s" "${flags29[@]}" + run_compiler "$CC" "${sn_asflags[@]}" -c "$tmp.s" -o "$out" + exit 0 +fi + +if [ "$ee32_040921" -eq 1 ]; then + if [ "$ee29" -eq 1 ] || [ "$ee29_01" -eq 1 ]; then + echo 'error: choose only one compiler profile: @ee29, @ee29-01 or @ee32-040921' >&2 + exit 1 + fi + if [ ! -f "$CC" ]; then + echo "error: SN EE assembler driver not found: $CC" >&2 + exit 1 + fi + if [ "${#flags29[@]}" -eq 0 ]; then + flags29=(-O2 -G0) + fi + "$PY" tools/ee32_040921.py "$src" "$tmp.s" "${flags29[@]}" + run_compiler "$CC" "${sn_asflags[@]}" -c "$tmp.s" -o "$out" + exit 0 +fi + +if [ "$ee29_01" -eq 1 ]; then + if [ "$ee29" -eq 1 ]; then + echo 'error: choose either @ee29 or @ee29-01, not both' >&2 + exit 1 + fi + if [ ! -f "$CC" ]; then + echo "error: SN EE assembler driver not found: $CC" >&2 + exit 1 + fi + if [ "${#flags29[@]}" -eq 0 ]; then + flags29=(-O2 -G0) + fi + "$PY" tools/ee29_01.py "$src" "$tmp.s" "${flags29[@]}" + run_compiler "$CC" "${sn_asflags[@]}" -c "$tmp.s" -o "$out" + exit 0 +fi + if [ "$ee29" -eq 1 ]; then E29=toolchain/sn-prodg-24/local/sce/ee/gcc E29_CC=$E29/bin/ee-gcc.exe @@ -74,12 +194,43 @@ if [ ! -f "$CC" ]; then echo "error: SN EE compiler not found: $CC" >&2 exit 1 fi -run_compiler "$CC" -O2 -G8 -fopt-stack -mno-check-zero-division ${flags29[@]+"${flags29[@]}"} -Iinclude -S "$src" -o "$tmp.s" +compiler=$CC +compiler_prefix=() +compiler_defaults=(-O2 -G8 -fopt-stack -mno-check-zero-division) +if [ "$sn114" -eq 1 ] || [ "$sn274" -eq 1 ] || [ "$sn107" -eq 1 ]; then + version=2.95.3 + program=ee-gcc2953.exe + if [ "$sn274" -eq 1 ]; then + version=2.95.2 + program=ee-gcc295.exe + fi + if [ "$sn107" -eq 1 ]; then + version=2.96-ee-001003-1 + fi + compiler=toolchain/sn-prodg-24/local/sce/ee/gcc/bin/$program + compiler_prefix=(-Btoolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/$version/) + if [ "$sn107" -eq 1 ]; then + # This directory's cc1/cpp are SN 1.07 despite its label. Use the + # unchanged specs shipped with the public 1.07 compiler bundle. + compiler_prefix+=(-specs=toolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/2.95.3/specs) + fi + compiler_defaults=(-O2 -G8 -mno-check-zero-division) + if [ ! -f "$compiler" ]; then + echo "error: older SN compiler not found: $compiler" >&2 + exit 1 + fi + backend=toolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/$version + if [ ! -f "$backend/cc1.exe" ] || [ ! -f "$backend/cpp.exe" ]; then + echo "error: older SN backend or preprocessor not found: $backend" >&2 + exit 1 + fi +fi +run_compiler "$compiler" "${compiler_prefix[@]}" "${compiler_defaults[@]}" "${flags29[@]}" -Iinclude -S "$src" -o "$tmp.s" "$PY" tools/ps2eeas_dli.py "$tmp.s" "$tmp.s" if [ "$lit4" -eq 0 ]; then "$PY" tools/ps2eeas_lis.py "$tmp.s" "$tmp.s" fi "$PY" tools/ps2eeas_sdata.py "$tmp.s" "$tmp.s" -run_compiler "$CC" -c "$tmp.s" -o "${tmp}_first.o" +run_compiler "$CC" "${sn_asflags[@]}" -c "$tmp.s" -o "${tmp}_first.o" "$PY" tools/ps2eeas_nops.py "$tmp.s" "${tmp}_first.o" "${tmp}_fixed.s" -run_compiler "$CC" -c "${tmp}_fixed.s" -o "$out" \ No newline at end of file +run_compiler "$CC" "${sn_asflags[@]}" -c "${tmp}_fixed.s" -o "$out" diff --git a/tools/ee296.py b/tools/ee296.py new file mode 100644 index 00000000..03d92e0d --- /dev/null +++ b/tools/ee296.py @@ -0,0 +1,32 @@ +"""Original EE-GCC 2.96 profile; distinct from the mislabeled local SN directory.""" +import os +from pathlib import Path +import sys + +import ee32_040921 + +ROOT = Path(__file__).resolve().parent.parent +VERSION = '2.96-ee-001003-1' +FILES = { + 'bin/ee-gcc': 'b8c284d16c9c0a0e8788e9522c46881e224ad01fa1c732aed43f821cc32f168b', + f'lib/gcc-lib/ee/{VERSION}/cc1': '59ec92b3f9f3513e0633331af304733e3094de30884e662a8cb584a51c1c42b5', + f'lib/gcc-lib/ee/{VERSION}/cpp0': 'f6f6b598f39649edfe171d6da8c7f91d07f2b87c2aeeffffbc5f566bfb1a39a9', + 'runtime/ld-2.3.6.so': ee32_040921.FILES['runtime/ld-2.3.6.so'], + 'runtime/libc.so.6': ee32_040921.FILES['runtime/libc.so.6'], +} + + +def compile_source(source: Path, output: Path, flags: list[str]) -> int: + profile = Path(os.environ.get('EE296_ROOT', ROOT / 'build/isolated/ee-gcc2.96')) + distro = os.environ.get('EE296_WSL_DISTRO', 'docker-desktop') + return ee32_040921.compile_source(source, output, flags, version=VERSION, + files=FILES, profile=profile, distro=distro, label='ee296') + + +if __name__ == '__main__': + if len(sys.argv) < 3: + sys.exit('usage: ee296.py SOURCE.c OUTPUT.s [compiler flags...]') + try: + sys.exit(compile_source(Path(sys.argv[1]).resolve(), Path(sys.argv[2]).resolve(), sys.argv[3:])) + except (OSError, ValueError) as error: + sys.exit(str(error)) diff --git a/tools/ee29_01.py b/tools/ee29_01.py new file mode 100644 index 00000000..605afa49 --- /dev/null +++ b/tools/ee29_01.py @@ -0,0 +1,83 @@ +"""Run the pinned, isolated Linux EE-GCC 2.9-ee-991111-01 C compiler. + +This transports compiler execution only; it never edits compiler output. +Windows uses headless WSL. See docs/TOOLCHAIN.md for the required profile. +""" +from __future__ import annotations + +import hashlib +import os +from pathlib import Path, PureWindowsPath +import shlex +import subprocess +import sys + +ROOT = Path(__file__).resolve().parent.parent +VERSION = '2.9-ee-991111-01' +FILES = { + 'bin/ee-gcc': '64d0a50fef499da0b98177eb5e79e41dfb066ad44246b137c78a266ef97ee265', + f'lib/gcc-lib/ee/{VERSION}/cc1': 'b9aef69f93efb949f15ea58189e8eef4a002b9fe4de5d3fcf89c34e1244ec026', + f'lib/gcc-lib/ee/{VERSION}/cpp': 'f85a54d241e019993fa7a06285d3677856b3b431e10318a587ab029373c603d7', + 'runtime/ld-2.3.6.so': 'd5a16aee4a04db7fa27a5c071a0bef62002ee679bf5ecce51e383003cf840fd8', + 'runtime/libc.so.6': '7b091aee7173e3a7cbddc6630fa6b0d0106944b5618b0b27c2c058ea9c3d92eb', +} + + +def wsl_path(path: str, distro: str) -> str: + p = PureWindowsPath(path) + if not p.drive or p.drive.startswith('\\'): + raise ValueError('EE29-01 WSL execution requires a local drive path') + mount = '/mnt/host' if distro == 'docker-desktop' else '/mnt' + return '/'.join([mount, p.drive[0].lower(), *p.parts[1:]]) + + +def compile_source(source: Path, output: Path, flags: list[str]) -> int: + profile = Path(os.environ.get('EE29_01_ROOT', ROOT / 'build/isolated/ee-gcc2.9-991111-01')).resolve() + for relative, expected in FILES.items(): + p = profile / relative + if not p.is_file() or hashlib.sha256(p.read_bytes()).hexdigest() != expected: + raise ValueError(f'@ee29-01 missing or unverified profile file: {p} (docs/TOOLCHAIN.md)') + + distro = os.environ.get('EE29_01_WSL_DISTRO', 'docker-desktop') + convert = (lambda p: wsl_path(str(p.resolve()), distro)) if os.name == 'nt' else (lambda p: str(p.resolve())) + # The driver execs cc1/cpp by name. Private wrappers give those original + # binaries their bundled loader without installing anything in /lib. + wrappers = output.parent / (output.stem + '_ee29_01') + wrappers.mkdir(parents=True, exist_ok=True) + loader = convert(profile / 'runtime/ld-2.3.6.so') + runtime = convert(profile / 'runtime') + for program in ('cc1', 'cpp'): + command = [loader, '--library-path', runtime, convert(profile / f'lib/gcc-lib/ee/{VERSION}/{program}')] + (wrappers / program).write_text('#!/bin/sh\nexec ' + shlex.join(command) + ' "$@"\n', newline='\n') + compiler = [loader, '--library-path', runtime, convert(profile / 'bin/ee-gcc'), + '-B' + convert(wrappers) + '/', *flags] + executable = [convert(profile / 'bin/ee-gcc'), loader, + convert(profile / f'lib/gcc-lib/ee/{VERSION}/cc1'), + convert(profile / f'lib/gcc-lib/ee/{VERSION}/cpp'), + convert(wrappers / 'cc1'), convert(wrappers / 'cpp')] + script = 'cd ' + shlex.quote(convert(ROOT)) + ' && chmod +x ' + shlex.join(executable) + # Old 32-bit glibc stat() cannot represent the large inode numbers of + # WSL's Windows mounts. Compile byte-identical inputs on native /tmp, + # then copy the emitted assembly back without altering it. + script += ' && work=$(mktemp -d /tmp/rac4-ee29-01.XXXXXXXX)' + script += ' && cp ' + shlex.quote(convert(source)) + ' "$work/source.c"' + script += ' && cp -R ' + shlex.quote(convert(ROOT / 'include')) + ' "$work/include"' + script += ' && export TMPDIR="$work"' + script += ' && printf "ee29-01 scratch: %s\\n" "$work" >&2' + script += ' && ' + shlex.join(compiler) + ' -I"$work/include" -S "$work/source.c" -o "$work/output.s"' + script += ' && cp "$work/output.s" ' + shlex.quote(convert(output)) + host = ['wsl.exe', '-d', distro, '-e', '/bin/sh', '-c'] if os.name == 'nt' else ['/bin/sh', '-c'] + return subprocess.run([*host, script], cwd=ROOT).returncode + + +def main() -> int: + if len(sys.argv) < 3: + sys.exit('usage: ee29_01.py SOURCE.c OUTPUT.s [compiler flags...]') + try: + return compile_source(Path(sys.argv[1]).resolve(), Path(sys.argv[2]).resolve(), sys.argv[3:]) + except (OSError, ValueError) as error: + sys.exit(str(error)) + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/tools/ee32_030210.py b/tools/ee32_030210.py new file mode 100644 index 00000000..f90fe689 --- /dev/null +++ b/tools/ee32_030210.py @@ -0,0 +1,58 @@ +"""Run the pinned original EE-GCC 3.2 beta2 on Windows, without output edits.""" +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import subprocess +import sys + +ROOT = Path(__file__).resolve().parent.parent +VERSION = '3.2-beta2-ee-030210' +FILES = { + 'bin/ee-gcc.exe': '2873e3a3ec5fe9188677445385ad5fc7be7fc24fee10296b677cbae679e2503e', + f'lib/gcc-lib/ee/{VERSION}/cc1.exe': 'fd46a0564787b2e7bb9effc094d77a86c7f7ac1a511c0149aeb416376b63fd79', + f'lib/gcc-lib/ee/{VERSION}/cpp0.exe': '1f1cf0066429847bb403563d3f42f98d655f64ba05db75a267d2b4c6d070cec8', + f'lib/gcc-lib/ee/{VERSION}/specs': 'de08511f81d6c9fb829c1aad69d12447a4ce874865a9b70aaebe8bfeb6ecc44f', + 'dll/cygwin1.dll': '84b6266a2e3eee856ef247277040065c4ede7e504932a3a83f85d2a11b7713ed', + 'dll/cygintl-2.dll': 'ca618177d22da0199b73183197fdd4ff4b103deba3aebef7cc5d8a02bd92a835', + 'dll/cygiconv-2.dll': '3dcd9023abf5260b675d5bf68003fb71b20d036a7893dc17d295e8f47f36f1e7', +} + + +def compile_source(source: Path, output: Path, flags: list[str]) -> int: + profile = Path(os.environ.get('EE32_030210_ROOT', ROOT / 'build/isolated/ee-gcc3.2-030210-beta2')).resolve() + for relative, expected in FILES.items(): + path = profile / relative + if not path.is_file() or hashlib.sha256(path.read_bytes()).hexdigest() != expected: + raise ValueError(f'@ee32-030210 missing or unverified profile file: {path} (docs/TOOLCHAIN.md)') + if os.name != 'nt': + raise ValueError('@ee32-030210 currently requires native Windows; no alternate runtime is selected') + import ctypes + # Inherited by the compiler children; keep loader/crash diagnostics in + # the redirected logs instead of opening system error dialogs. + old_mode = ctypes.windll.kernel32.SetErrorMode(0x8003) + env = os.environ.copy() + env['PATH'] = str(profile / 'dll') + os.pathsep + env.get('PATH', '') + command = [str(profile / 'bin/ee-gcc.exe'), + '-B' + (profile / f'lib/gcc-lib/ee/{VERSION}').as_posix() + '/', + *flags, '-I' + (ROOT / 'include').as_posix(), + '-S', source.as_posix(), '-o', output.as_posix()] + try: + return subprocess.run(command, cwd=ROOT, env=env, + creationflags=subprocess.CREATE_NO_WINDOW).returncode + finally: + ctypes.windll.kernel32.SetErrorMode(old_mode) + + +def main() -> int: + if len(sys.argv) < 3: + sys.exit('usage: ee32_030210.py SOURCE.c OUTPUT.s [compiler flags...]') + try: + return compile_source(Path(sys.argv[1]).resolve(), Path(sys.argv[2]).resolve(), sys.argv[3:]) + except (OSError, ValueError) as error: + sys.exit(str(error)) + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/tools/ee32_030926.py b/tools/ee32_030926.py new file mode 100644 index 00000000..0736720e --- /dev/null +++ b/tools/ee32_030926.py @@ -0,0 +1,33 @@ +"""Original EE-GCC 3.2-ee-030926 profile using the shared unchanged-output transport.""" +import os +from pathlib import Path +import sys + +import ee32_040921 + +ROOT = Path(__file__).resolve().parent.parent +VERSION = '3.2-ee-030926' +FILES = { + 'bin/ee-gcc': '8ba17b0f2cbcc87b31bb164766bc3e7e340f714adfb518bc4634a6f1ffda8951', + f'lib/gcc-lib/ee/{VERSION}/cc1': 'da4fec4d48d91e62fd968f76acb16981dd8131d02f27c1b7559f0e903b590eb6', + f'lib/gcc-lib/ee/{VERSION}/cpp0': '2d1a4b260e143a8b467bb7609cb3fd60ae541174ffff78d922feb2d7fbb0e218', + f'lib/gcc-lib/ee/{VERSION}/specs': '17a1f6cd0d5bbb4d80bb77726e879eda08bc19c59ec2df5e77bab99c7cc1a3fa', + 'runtime/ld-2.3.6.so': ee32_040921.FILES['runtime/ld-2.3.6.so'], + 'runtime/libc.so.6': ee32_040921.FILES['runtime/libc.so.6'], +} + + +def compile_source(source: Path, output: Path, flags: list[str]) -> int: + profile = Path(os.environ.get('EE32_030926_ROOT', ROOT / 'build/isolated/ee-gcc3.2-030926')) + distro = os.environ.get('EE32_030926_WSL_DISTRO', 'docker-desktop') + return ee32_040921.compile_source(source, output, flags, version=VERSION, + files=FILES, profile=profile, distro=distro) + + +if __name__ == '__main__': + if len(sys.argv) < 3: + sys.exit('usage: ee32_030926.py SOURCE.c OUTPUT.s [compiler flags...]') + try: + sys.exit(compile_source(Path(sys.argv[1]).resolve(), Path(sys.argv[2]).resolve(), sys.argv[3:])) + except (OSError, ValueError) as error: + sys.exit(str(error)) diff --git a/tools/ee32_040921.py b/tools/ee32_040921.py new file mode 100644 index 00000000..268197c2 --- /dev/null +++ b/tools/ee32_040921.py @@ -0,0 +1,92 @@ +"""Run the isolated EE-GCC 3.2-ee-040921 C compiler without output edits. + +Windows uses headless WSL with a private, hash-checked 32-bit runtime. +See docs/TOOLCHAIN.md for profile inputs and proof boundaries. +""" +from __future__ import annotations + +import hashlib +import os +from pathlib import Path +import shlex +import subprocess +import sys + +from ee29_01 import wsl_path + +ROOT = Path(__file__).resolve().parent.parent +VERSION = '3.2-ee-040921' +FILES = { + 'bin/ee-gcc': 'a5095b5d7b55f91535b12e48e9d808170fa9fb8c0620c43c2fb61379b1a3663a', + f'lib/gcc-lib/ee/{VERSION}/cc1': '0bcc90bd23e10698e75047db9a84ea47e753791115fdd23d6f637a544f6d257d', + 'runtime/ld-2.3.6.so': 'd5a16aee4a04db7fa27a5c071a0bef62002ee679bf5ecce51e383003cf840fd8', + 'runtime/libc.so.6': '7b091aee7173e3a7cbddc6630fa6b0d0106944b5618b0b27c2c058ea9c3d92eb', +} + + +def compile_source(source: Path, output: Path, flags: list[str], *, + version: str = VERSION, files: dict[str, str] | None = None, + profile: Path | None = None, distro: str | None = None, + label: str | None = None) -> int: + profile = (profile or Path(os.environ.get('EE32_040921_ROOT', ROOT / 'build/isolated/ee-gcc3.2-040921'))).resolve() + files = FILES if files is None else files + tag = version.removeprefix('3.2-ee-') + label = label or 'ee32-' + tag + for relative, expected in files.items(): + path = profile / relative + if not path.is_file() or hashlib.sha256(path.read_bytes()).hexdigest() != expected: + raise ValueError(f'@{label} missing or unverified profile file: {path} (docs/TOOLCHAIN.md)') + + distro = distro or os.environ.get('EE32_040921_WSL_DISTRO', 'docker-desktop') + convert = (lambda path: wsl_path(str(path.resolve()), distro)) if os.name == 'nt' else (lambda path: str(path.resolve())) + wrappers = output.parent / (output.stem + '_' + label.replace('-', '_')) + wrappers.mkdir(parents=True, exist_ok=True) + loader = convert(profile / 'runtime/ld-2.3.6.so') + runtime = convert(profile / 'runtime') + cc1 = convert(profile / f'lib/gcc-lib/ee/{version}/cc1') + command = [loader, '--library-path', runtime, cc1] + wrapper = wrappers / 'cc1' + wrapper.write_text('#!/bin/sh\nexec ' + shlex.join(command) + ' "$@"\n', newline='\n') + driver = convert(profile / 'bin/ee-gcc') + compiler = [loader, '--library-path', runtime, driver] + script = 'cd ' + shlex.quote(convert(ROOT)) + ' && chmod +x ' + shlex.join([driver, loader, cc1, convert(wrapper)]) + # Keep old 32-bit filesystem interfaces on native Linux storage. Copy + # byte-identical inputs and emitted assembly; never rewrite instructions. + script += ' && work=$(mktemp -d /tmp/rac4-' + label + '.XXXXXXXX)' + # This driver's executable search also uses 32-bit stat(), so its + # cc1 wrapper must live on native storage along with the inputs. + script += ' && mkdir "$work/bin" && cp ' + shlex.quote(convert(wrapper)) + ' "$work/bin/cc1"' + script += ' && chmod +x "$work/bin/cc1"' + cpp = f'lib/gcc-lib/ee/{version}/cpp0' + if cpp in files: + cpp_command = [loader, '--library-path', runtime, convert(profile / cpp)] + cpp_wrapper = wrappers / 'cpp0' + cpp_wrapper.write_text('#!/bin/sh\nexec ' + shlex.join(cpp_command) + ' "$@"\n', newline='\n') + script += ' && chmod +x ' + shlex.quote(convert(profile / cpp)) + script += ' && cp ' + shlex.quote(convert(cpp_wrapper)) + ' "$work/bin/cpp0" && chmod +x "$work/bin/cpp0"' + specs = f'lib/gcc-lib/ee/{version}/specs' + if specs in files: + script += ' && cp ' + shlex.quote(convert(profile / specs)) + ' "$work/bin/specs"' + script += ' && cp ' + shlex.quote(convert(source)) + ' "$work/source.c"' + script += ' && cp -R ' + shlex.quote(convert(ROOT / 'include')) + ' "$work/include"' + script += ' && export TMPDIR="$work"' + script += ' && printf "' + label + ' scratch: %s\n" "$work" >&2' + script += ' && cd "$work"' + script += ' && ' + shlex.join(compiler) + ' -B"$work/bin/" ' + shlex.join(flags) + script += ' -I"$work/include" -S "$work/source.c" -o "$work/output.s"' + script += ' && cp "$work/output.s" ' + shlex.quote(convert(output)) + host = ['wsl.exe', '-d', distro, '-e', '/bin/sh', '-c'] if os.name == 'nt' else ['/bin/sh', '-c'] + return subprocess.run([*host, script], cwd=ROOT).returncode + + +def main() -> int: + if len(sys.argv) < 3: + sys.exit('usage: ee32_040921.py SOURCE.c OUTPUT.s [compiler flags...]') + try: + return compile_source(Path(sys.argv[1]).resolve(), Path(sys.argv[2]).resolve(), sys.argv[3:]) + except (OSError, ValueError) as error: + sys.exit(str(error)) + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/tools/test_cc_routes.py b/tools/test_cc_routes.py index 14438409..9fe823d7 100644 --- a/tools/test_cc_routes.py +++ b/tools/test_cc_routes.py @@ -52,6 +52,12 @@ def setUp(self) -> None: self._touch("toolchain/sn-prodg-3.01/usr/local/sce/ee/gcc/bin/ee-gcc2953.exe") self._touch("toolchain/sn-prodg-24/local/sce/ee/gcc/bin/ee-gcc.exe") self._touch("toolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/2.9-ee-991111/stamp") + for program, version in (('ee-gcc2953.exe', '2.95.3'), ('ee-gcc295.exe', '2.95.2')): + self._touch('toolchain/sn-prodg-24/local/sce/ee/gcc/bin/' + program) + for backend in ('cc1.exe', 'cpp.exe'): + self._touch('toolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/' + version + '/' + backend) + for backend in ('cc1.exe', 'cpp.exe'): + self._touch('toolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/2.96-ee-001003-1/' + backend) def tearDown(self) -> None: self.temp.cleanup() @@ -83,6 +89,10 @@ def test_default_sn_route_keeps_fixups(self) -> None: self.assertIn("tools/ps2eeas_lis.py", calls[2]) self.assertIn("tools/ps2eeas_sdata.py", calls[3]) self.assertIn("tools/ps2eeas_nops.py", calls[5]) + self.assertEqual(calls[4][2], "-c") + self.assertEqual(calls[6][2], "-c") + self.assertNotIn("-DVALUE=one two", calls[4]) + self.assertNotIn("-DVALUE=one two", calls[6]) self.assertTrue((self.root / "build/obj/default.o").exists()) def test_lit4_marker_skips_lis_and_is_not_passed_on(self) -> None: @@ -94,6 +104,125 @@ def test_lit4_marker_skips_lis_and_is_not_passed_on(self) -> None: self.assertIn("-DVALUE=one two", calls[0]) self.assertFalse(any("tools/ps2eeas_lis.py" in call for call in calls)) + def test_lit4_marker_does_not_reach_isolated_compiler(self) -> None: + result = self.run_cc("source.c", "build/obj/lit4-ee296.o", "@ee296", "@lit4", "-O2", "-G0") + self.assertEqual(result.returncode, 0, result.stderr) + calls = self.calls() + self.assertEqual([call[0] for call in calls], ["python", "wine"]) + self.assertFalse(any("@lit4" in call for call in calls)) + self.assertFalse(any("ps2eeas_" in arg for call in calls for arg in call)) + + def test_explicit_assembler_options_reach_both_sn_passes(self) -> None: + options = ["-Wa,-G0", "-Wa,-I,path with spaces"] + result = self.run_cc("source.c", "build/obj/asflags.o", + "-G0", options[0], "-mno-split-addresses", options[1]) + self.assertEqual(result.returncode, 0, result.stderr) + calls = self.calls() + for index in (4, 6): + call = calls[index] + self.assertEqual(call[2:call.index("-c")], options) + self.assertNotIn("-G0", call) + self.assertNotIn("-mno-split-addresses", call) + self.assertEqual([arg for arg in calls[0] if arg.startswith("-Wa,")], options) + + def test_explicit_assembler_options_do_not_change_ee29_assembler_route(self) -> None: + result = self.run_cc("source.c", "build/obj/asflags29.o", "@ee29", "-Wa,-G0") + self.assertEqual(result.returncode, 0, result.stderr) + calls = self.calls() + self.assertEqual(len(calls), 2) + self.assertIn("-Wa,-G0", calls[0]) + self.assertNotIn("-Wa,-G0", calls[1]) + self.assertEqual(calls[1][2], "-c") + + def test_ee29_01_uses_isolated_compiler_without_rewriting_its_output(self) -> None: + result = self.run_cc("source.c", "build/obj/ee29_01.o", + "@ee29-01", "-O2", "-G0", "-Wa,-G0") + self.assertEqual(result.returncode, 0, result.stderr) + calls = self.calls() + self.assertEqual([call[0] for call in calls], ["python", "wine"]) + self.assertEqual(calls[0][1:3], ["tools/ee29_01.py", "source.c"]) + self.assertEqual(calls[0][-3:], ["-O2", "-G0", "-Wa,-G0"]) + self.assertEqual(calls[1][2:4], ["-Wa,-G0", "-c"]) + self.assertFalse(any("ps2eeas_" in arg for call in calls for arg in call)) + + def test_conflicting_compiler_profiles_are_rejected_before_execution(self) -> None: + result = self.run_cc("source.c", "build/obj/conflict.o", "@ee29", "@ee29-01") + self.assertNotEqual(result.returncode, 0) + self.assertIn('choose either @ee29 or @ee29-01', result.stderr) + self.assertFalse(self.trace.exists()) + + def test_ee32_040921_uses_isolated_compiler_without_output_fixups(self) -> None: + result = self.run_cc('source.c', 'build/obj/ee32.o', + '@ee32-040921', '-O2', '-G0', '-Wa,-G0') + self.assertEqual(result.returncode, 0, result.stderr) + calls = self.calls() + self.assertEqual([call[0] for call in calls], ['python', 'wine']) + self.assertEqual(calls[0][1:3], ['tools/ee32_040921.py', 'source.c']) + self.assertEqual(calls[0][-3:], ['-O2', '-G0', '-Wa,-G0']) + self.assertEqual(calls[1][2:4], ['-Wa,-G0', '-c']) + self.assertFalse(any('ps2eeas_' in arg for call in calls for arg in call)) + + def test_ee32_conflicts_are_rejected_before_execution(self) -> None: + for other in ('@ee29', '@ee29-01'): + with self.subTest(other=other): + result = self.run_cc('source.c', 'build/obj/conflict32.o', other, '@ee32-040921') + self.assertNotEqual(result.returncode, 0) + self.assertIn('choose only one compiler profile', result.stderr) + self.assertFalse(self.trace.exists()) + + def test_older_sn_profiles_keep_fixups_and_omit_unsupported_stack_flag(self) -> None: + for marker, program, version in (('@sn114', 'ee-gcc2953.exe', '2.95.3'), + ('@sn274', 'ee-gcc295.exe', '2.95.2'), + ('@sn107', 'ee-gcc2953.exe', '2.96-ee-001003-1')): + with self.subTest(marker=marker): + self.trace.unlink(missing_ok=True) + result = self.run_cc('source.c', 'build/obj/older.o', marker, '-Wa,-G0') + self.assertEqual(result.returncode, 0, result.stderr) + calls = self.calls() + self.assertTrue(calls[0][1].endswith('/' + program)) + self.assertIn('-Btoolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/' + version + '/', calls[0]) + self.assertNotIn('-fopt-stack', calls[0]) + self.assertNotIn(marker, calls[0]) + if marker == '@sn107': + self.assertIn('-specs=toolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/2.95.3/specs', calls[0]) + self.assertEqual([c[0] for c in calls], ['wine', 'python', 'python', 'python', 'wine', 'python', 'wine']) + for i in (4, 6): + self.assertTrue(calls[i][1].endswith('/ee-gcc2953.exe')) + self.assertIn('-Wa,-G0', calls[i]) + + def test_older_sn_missing_backend_does_not_fall_back_to_another_compiler(self) -> None: + (self.root / 'toolchain/sn-prodg-24/local/sce/ee/gcc/lib/gcc-lib/ee/2.95.3/cc1.exe').unlink() + result = self.run_cc('source.c', 'build/obj/missing114.o', '@sn114') + self.assertNotEqual(result.returncode, 0) + self.assertIn('older SN backend or preprocessor not found', result.stderr) + self.assertFalse(self.trace.exists()) + + def test_additional_ee32_profiles_use_original_emitters_and_sn_assembler(self) -> None: + for marker, helper in (('@ee32-030210', 'ee32_030210.py'), + ('@ee32-030926', 'ee32_030926.py'), + ('@ee296', 'ee296.py')): + with self.subTest(marker=marker): + self.trace.unlink(missing_ok=True) + result = self.run_cc('source.c', 'build/obj/ee32more.o', marker, '-O2', '-G0', '-Wa,-G0') + self.assertEqual(result.returncode, 0, result.stderr) + calls = self.calls() + self.assertEqual([c[0] for c in calls], ['python', 'wine']) + self.assertEqual(calls[0][1], 'tools/' + helper) + self.assertEqual(calls[0][-3:], ['-O2', '-G0', '-Wa,-G0']) + self.assertEqual(calls[1][2:4], ['-Wa,-G0', '-c']) + self.assertFalse(any('ps2eeas_' in a for c in calls for a in c)) + + def test_additional_ee32_profile_conflicts_stop_before_execution(self) -> None: + for profiles in (('@ee32-030210', '@ee32-030926'), + ('@ee32-030210', '@ee32-040921'), + ('@ee32-030926', '@ee29-01'), + ('@ee296', '@sn107')): + with self.subTest(profiles=profiles): + result = self.run_cc('source.c', 'build/obj/conflictmore.o', *profiles) + self.assertNotEqual(result.returncode, 0) + self.assertIn('choose only one compiler profile', result.stderr) + self.assertFalse(self.trace.exists()) + def test_ee29_route_uses_pinned_compiler_and_assembler_without_fixups(self) -> None: result = self.run_cc("source.c", "build/obj/ee29.o", "@ee29", "-O2", "-G2", "-DNAME=two words") self.assertEqual(result.returncode, 0, result.stderr) diff --git a/tools/test_ee29_01.py b/tools/test_ee29_01.py new file mode 100644 index 00000000..8071ff2a --- /dev/null +++ b/tools/test_ee29_01.py @@ -0,0 +1,37 @@ +"""Path transport and profile validation for the isolated compiler route.""" +import tempfile +from pathlib import Path +import unittest +from unittest.mock import patch + +import ee29_01 + + +class IsolatedCompilerTests(unittest.TestCase): + def test_docker_desktop_mount_and_spaces(self): + self.assertEqual(ee29_01.wsl_path(r'D:\My Project\try.c', 'docker-desktop'), + '/mnt/host/d/My Project/try.c') + + def test_standard_wsl_drive_mount(self): + self.assertEqual(ee29_01.wsl_path(r'C:\work\try.c', 'Ubuntu'), '/mnt/c/work/try.c') + + def test_unc_profile_path_is_rejected(self): + with self.assertRaises(ValueError): + ee29_01.wsl_path(r'\\server\share\try.c', 'docker-desktop') + + def test_missing_or_modified_profile_stops_before_compiler_execution(self): + with tempfile.TemporaryDirectory() as temp: + with patch.dict(ee29_01.os.environ, {'EE29_01_ROOT': temp}): + with patch.object(ee29_01.subprocess, 'run') as run: + with self.assertRaisesRegex(ValueError, 'missing or unverified'): + ee29_01.compile_source(Path('try.c'), Path('out.s'), []) + path = Path(temp) / 'bin/ee-gcc' + path.parent.mkdir() + path.write_bytes(b'modified compiler') + with self.assertRaisesRegex(ValueError, 'missing or unverified'): + ee29_01.compile_source(Path('try.c'), Path('out.s'), []) + run.assert_not_called() + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_ee32_040921.py b/tools/test_ee32_040921.py new file mode 100644 index 00000000..9cd45dda --- /dev/null +++ b/tools/test_ee32_040921.py @@ -0,0 +1,51 @@ +"""Fail-closed profile validation and native-storage command transport.""" +import hashlib +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch + +import ee32_040921 + + +class IsolatedCompilerTests(unittest.TestCase): + def test_modified_runtime_stops_before_any_execution(self): + with tempfile.TemporaryDirectory() as temp: + profile = Path(temp) + files = {'bin/ee-gcc': b'driver', 'runtime/libc.so.6': b'runtime'} + expected = {} + for relative, body in files.items(): + path = profile / relative + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(body) + expected[relative] = hashlib.sha256(body).hexdigest() + (profile / 'runtime/libc.so.6').write_bytes(b'changed') + with patch.dict(ee32_040921.os.environ, {'EE32_040921_ROOT': temp}): + with patch.object(ee32_040921, 'FILES', expected): + with patch.object(ee32_040921.subprocess, 'run') as run: + with self.assertRaisesRegex(ValueError, 'missing or unverified'): + ee32_040921.compile_source(profile / 'source.c', profile / 'out.s', []) + run.assert_not_called() + + def test_driver_search_and_inputs_use_native_storage(self): + with tempfile.TemporaryDirectory(prefix='ee32 profile ') as temp: + profile = Path(temp) + output = profile / 'result.s' + with patch.dict(ee32_040921.os.environ, {'EE32_040921_ROOT': temp}): + with patch.object(ee32_040921, 'FILES', {}): + with patch.object(ee32_040921.subprocess, 'run') as run: + run.return_value.returncode = 9 + result = ee32_040921.compile_source(profile / 'source.c', output, ['-DNAME=two words']) + self.assertEqual(result, 9) + script = run.call_args.args[0][-1] + self.assertIn('-B"$work/bin/"', script) + self.assertIn('"$work/bin/cc1"', script) + self.assertIn("'-DNAME=two words'", script) + self.assertIn(' -S "$work/source.c" -o "$work/output.s"', script) + self.assertIn(' && cp "$work/output.s" ', script) + wrapper = output.parent / (output.stem + '_ee32_040921') / 'cc1' + self.assertTrue(wrapper.read_text().endswith(' "$@"\n')) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_ee32_profiles.py b/tools/test_ee32_profiles.py new file mode 100644 index 00000000..42076c10 --- /dev/null +++ b/tools/test_ee32_profiles.py @@ -0,0 +1,51 @@ +"""Additional isolated profile guards and native child-process environment.""" +import hashlib +import os +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch + +import ee32_030210 +import ee32_030926 +import ee296 + + +class AdditionalProfiles(unittest.TestCase): + def test_both_profiles_reject_modified_inputs_before_execution(self): + for module, env_name in ((ee32_030210, 'EE32_030210_ROOT'), + (ee32_030926, 'EE32_030926_ROOT'), + (ee296, 'EE296_ROOT')): + with self.subTest(profile=env_name), tempfile.TemporaryDirectory() as temp: + root = Path(temp) + (root / 'specs').write_bytes(b'original') + expected = {'specs': hashlib.sha256(b'original').hexdigest()} + (root / 'specs').write_bytes(b'modified') + with patch.dict(os.environ, {env_name: temp}), patch.object(module, 'FILES', expected): + with patch('subprocess.run') as run: + with self.assertRaisesRegex(ValueError, 'missing or unverified'): + module.compile_source(root / 'source.c', root / 'out.s', []) + run.assert_not_called() + + @unittest.skipUnless(os.name == 'nt', 'native Windows profile') + def test_beta_private_dll_path_does_not_mutate_parent_environment(self): + with tempfile.TemporaryDirectory(prefix='ee32 beta ') as temp: + root = Path(temp) + old_path = os.environ.get('PATH') + with patch.dict(os.environ, {'EE32_030210_ROOT': temp}), patch.object(ee32_030210, 'FILES', {}): + with patch('ctypes.windll.kernel32.SetErrorMode', return_value=7) as mode: + with patch.object(ee32_030210.subprocess, 'run') as run: + run.return_value.returncode = 5 + self.assertEqual(ee32_030210.compile_source(root / 'source.c', root / 'out.s', ['-DNAME=two words']), 5) + args = run.call_args.args[0] + self.assertIn('-DNAME=two words', args) + self.assertEqual(args[-4:], ['-S', (root / 'source.c').as_posix(), '-o', (root / 'out.s').as_posix()]) + env = run.call_args.kwargs['env'] + self.assertTrue(env['PATH'].startswith(str(root / 'dll') + os.pathsep)) + self.assertEqual(os.environ.get('PATH'), old_path) + self.assertEqual(run.call_args.kwargs['creationflags'], ee32_030210.subprocess.CREATE_NO_WINDOW) + self.assertEqual(mode.call_args_list[-1].args, (7,)) + + +if __name__ == '__main__': + unittest.main()