From 2463748a71c04e72aa71d7fa4a8a6f7bc8d1f6c2 Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Thu, 27 Aug 2026 07:07:35 +0000 Subject: [PATCH] re: the trailing data table is a per-phase TIMELINE of scheduled routines Decodes the table found at the end of every phase region. Layout: int N N x [ int offset ; float t ; int kind ] -- 8-byte typed records, tag 0x19 int, 0x1A float 1 + 3N matches the record count in every phase measured (Stage 02: 76/40/55 records for N = 25/13/18). Checks, all independent of each other: schedule entries disc-wide 675 0x1A float records disc-wide 675 (counted by a different route) offsets landing on the instruction stream 675/675 = 100.0% control, random 4-aligned offsets 33.3% The floats are seconds -- 0, 0.5, 1, 4, 5, 30, 50, 60, 90, 120, 150, 170, 180, 210, 240, 270, 300, 330, 360, 420, 570, 1020, 1080, 1140, 1170 -- and the targets are small one-shot coroutines that set arguments, call one built-in and end_coroutine. kind is 0 (556) or 5 (119) and is not identified. Runtime cross-check, recorded as consistency rather than confirmation: the closed REMAINING OB work measured Stage 02's squadron arrivals at t = 0, 120 and 210 s over n=5 emulator runs, and all three appear in phase 1's static schedule, with 120 and 210 each appearing TWICE. These are round numbers and phase 1 has ~22 distinct times over 0-1170, so presence alone is not unlikely; the doubling is the sharper detail and was not predicted in advance. New artefacts data/isl-stage02-schedule.txt and data/isl-schedule-all.txt with a committed generator (isl_report.py schedule). calls, phase-ends, conditions and phase-guards all regenerate byte-identical. Not settled and said so: kind is unread; the consumer is unread, so the decode rests on the structural checks above; whether the clock is per-phase or per-mission is an inference from the layout; and this is NOT what starts the unreachable code -- 0 of the 675 targets are unreached run-starts, so that ~15% gap stands. --- docs/re/BACKLOG.md | 17 + docs/re/data/isl-schedule-all.txt | 1012 +++++++++++++++++++++++++ docs/re/data/isl-stage02-schedule.txt | 68 ++ docs/re/structures/isl-schedule.md | 76 ++ tools/re-capture/isl.py | 41 + tools/re-capture/isl_report.py | 24 +- 6 files changed, 1236 insertions(+), 2 deletions(-) create mode 100644 docs/re/data/isl-schedule-all.txt create mode 100644 docs/re/data/isl-stage02-schedule.txt create mode 100644 docs/re/structures/isl-schedule.md diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index 36f7e7e..727834a 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -52,6 +52,23 @@ unknown, what evidence exists, and what the first step would be. Move an item in int values hit the stream 46/51 vs 29.5 % chance but **0 are unreached run-starts**), and what starts the other ~15 % of code is still unknown. +* ✅ **(2026-08-27) THE TRAILING DATA TABLE IS A TIMELINE — [structures/isl-schedule](structures/isl-schedule.md).** + Layout `int N; N x [int offset; float t; int kind]`; `1 + 3N` matches the record + count in every phase. **675 entries disc-wide — exactly the independently counted + number of `0x1A` float records — and 675/675 offsets land on the instruction + stream vs a 33.3 % control.** The floats are SECONDS (0, 0.5, 1, 4, 30, 60, 90, + 120, 150, 180, 210, 240, 300, 420, 1020 …) and the targets are small one-shot + coroutines (`set args; call builtinN; end_coroutine`). `kind` is 0 (556) or 5 + (119) — unidentified. 🟡 **Runtime cross-check, consistent not conclusive:** the + closed `REMAINING OB` work measured Stage 02 arrivals at **t = 0, 120, 210 s** + (n=5 emulator runs); all three are in phase 1's static schedule and **120 and 210 + each appear TWICE** — but the times are round numbers, so presence alone is weak; + the doubling is the sharper detail. Artefacts `data/isl-stage02-schedule.txt` and + `data/isl-schedule-all.txt`; the four earlier artefacts regenerate byte-identical. + 🟡 **Still NOT what starts the unreachable code** — 0 of the 675 targets are + unreached run-starts, so the ~15 % gap stands. The consumer is unread, and whether + the clock is per-phase or per-mission is an inference from layout, not a read. + ## ✅✅ SOLVED — the mission freeze was a modal sign-in dialog (2026-08-26) `XamShowSigninUI` opens a modal dialog and `xeXamDispatchDialog` blocks the diff --git a/docs/re/data/isl-schedule-all.txt b/docs/re/data/isl-schedule-all.txt new file mode 100644 index 0000000..13bdf88 --- /dev/null +++ b/docs/re/data/isl-schedule-all.txt @@ -0,0 +1,1012 @@ +# Stage01.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +57 entries. + +## phase 1 — 30 scheduled routines + t=0 kind=5 -> 0x0018A4 + t=0.5 kind=5 -> 0x00190C + t=1 kind=0 -> 0x006EF4 + t=4 kind=5 -> 0x001980 + t=7 kind=0 -> 0x006FB0 + t=15 kind=0 -> 0x007644 + t=20 kind=0 -> 0x001A9C + t=20 kind=0 -> 0x001C24 + t=20 kind=0 -> 0x001DB0 + t=60 kind=0 -> 0x001F3C + t=60 kind=0 -> 0x002228 + t=60 kind=0 -> 0x00771C + t=80 kind=0 -> 0x002390 + t=90 kind=0 -> 0x0077F4 + t=110 kind=0 -> 0x00251C + t=120 kind=0 -> 0x0078A4 + t=140 kind=0 -> 0x002684 + t=150 kind=0 -> 0x007954 + t=180 kind=0 -> 0x007A04 + t=210 kind=0 -> 0x007AB4 + t=240 kind=0 -> 0x007C04 + t=270 kind=0 -> 0x007CB4 + t=300 kind=0 -> 0x007D64 + t=330 kind=0 -> 0x007E14 + t=360 kind=0 -> 0x007F64 + t=420 kind=0 -> 0x008034 + t=480 kind=0 -> 0x0080E4 + t=510 kind=0 -> 0x008194 + t=540 kind=0 -> 0x008244 + t=570 kind=0 -> 0x0082F4 + +## phase 2 — 27 scheduled routines + t=0 kind=5 -> 0x00FEF8 + t=0.5 kind=5 -> 0x00FF60 + t=1 kind=0 -> 0x015B64 + t=4 kind=5 -> 0x00FFD4 + t=30 kind=0 -> 0x010484 + t=30 kind=0 -> 0x015E94 + t=50 kind=0 -> 0x010780 + t=50 kind=0 -> 0x015F44 + t=60 kind=0 -> 0x0109D8 + t=60 kind=0 -> 0x010B80 + t=70 kind=0 -> 0x010D28 + t=70 kind=0 -> 0x010FF4 + t=70 kind=0 -> 0x016094 + t=90 kind=0 -> 0x0161E4 + t=120 kind=0 -> 0x016294 + t=130 kind=0 -> 0x011464 + t=150 kind=0 -> 0x0163E4 + t=160 kind=0 -> 0x01160C + t=180 kind=0 -> 0x016494 + t=210 kind=0 -> 0x016544 + t=240 kind=0 -> 0x0165F4 + t=270 kind=0 -> 0x0166A4 + t=420 kind=0 -> 0x016754 + t=480 kind=0 -> 0x016804 + t=510 kind=0 -> 0x0168B4 + t=540 kind=0 -> 0x016A04 + t=570 kind=0 -> 0x016AB4 + +------------------------------------------------------------------------ + +# Stage02.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +56 entries. + +## phase 1 — 25 scheduled routines + t=0 kind=5 -> 0x002C04 + t=0.5 kind=5 -> 0x002C6C + t=1 kind=5 -> 0x002CE0 + t=1 kind=0 -> 0x00747C + t=4 kind=5 -> 0x002D30 + t=30 kind=0 -> 0x00323C + t=30 kind=0 -> 0x007754 + t=60 kind=0 -> 0x007804 + t=90 kind=0 -> 0x003448 + t=90 kind=0 -> 0x0078B4 + t=120 kind=0 -> 0x003A2C + t=120 kind=0 -> 0x007964 + t=170 kind=0 -> 0x003F84 + t=170 kind=0 -> 0x007AB4 + t=210 kind=0 -> 0x00461C + t=210 kind=0 -> 0x007C04 + t=240 kind=0 -> 0x004AF8 + t=240 kind=0 -> 0x007D54 + t=270 kind=0 -> 0x007EA4 + t=300 kind=0 -> 0x007F54 + t=330 kind=0 -> 0x0080A4 + t=1020 kind=0 -> 0x008154 + t=1080 kind=0 -> 0x008204 + t=1140 kind=0 -> 0x0082B4 + t=1170 kind=0 -> 0x008364 + +## phase 2 — 13 scheduled routines + t=0 kind=5 -> 0x0183D4 + t=0.5 kind=5 -> 0x01843C + t=1 kind=0 -> 0x01F230 + t=4 kind=5 -> 0x0184B0 + t=30 kind=0 -> 0x0186F8 + t=60 kind=0 -> 0x01892C + t=180 kind=0 -> 0x018B78 + t=240 kind=0 -> 0x018ED4 + t=300 kind=0 -> 0x01F488 + t=330 kind=0 -> 0x01F538 + t=360 kind=0 -> 0x01F5E8 + t=420 kind=0 -> 0x019118 + t=570 kind=0 -> 0x01F698 + +## phase 3 — 18 scheduled routines + t=0 kind=5 -> 0x0289EC + t=0.5 kind=5 -> 0x028A54 + t=1 kind=0 -> 0x028EC0 + t=1 kind=0 -> 0x02E364 + t=4 kind=5 -> 0x028AC8 + t=5 kind=5 -> 0x028E30 + t=50 kind=0 -> 0x029724 + t=120 kind=0 -> 0x0299C8 + t=120 kind=0 -> 0x02E63C + t=150 kind=0 -> 0x02A7BC + t=150 kind=0 -> 0x02E78C + t=180 kind=0 -> 0x029D14 + t=240 kind=0 -> 0x02E8DC + t=270 kind=0 -> 0x02E98C + t=300 kind=0 -> 0x02A92C + t=300 kind=0 -> 0x02EA3C + t=330 kind=0 -> 0x02EAEC + t=360 kind=0 -> 0x02EB9C + +------------------------------------------------------------------------ + +# Stage03.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +69 entries. + +## phase 1 — 20 scheduled routines + t=0 kind=5 -> 0x002404 + t=0.5 kind=5 -> 0x00246C + t=1 kind=0 -> 0x0054A0 + t=4 kind=5 -> 0x002530 + t=7 kind=5 -> 0x0024E0 + t=60 kind=0 -> 0x00282C + t=60 kind=0 -> 0x005924 + t=90 kind=0 -> 0x002B38 + t=90 kind=0 -> 0x0059D4 + t=120 kind=0 -> 0x005BF8 + t=150 kind=0 -> 0x002EBC + t=150 kind=0 -> 0x005CA8 + t=180 kind=0 -> 0x005DF8 + t=210 kind=0 -> 0x003114 + t=210 kind=0 -> 0x005EA8 + t=420 kind=0 -> 0x005FF8 + t=480 kind=0 -> 0x0060A8 + t=540 kind=0 -> 0x006158 + t=570 kind=0 -> 0x006208 + t=590 kind=0 -> 0x0062B8 + +## phase 2 — 32 scheduled routines + t=0 kind=5 -> 0x00C5BC + t=0.5 kind=5 -> 0x00C624 + t=1 kind=0 -> 0x010F84 + t=4 kind=5 -> 0x00C698 + t=30 kind=0 -> 0x00C760 + t=30 kind=0 -> 0x011190 + t=58 kind=0 -> 0x014C5C + t=60 kind=0 -> 0x0114E8 + t=80 kind=0 -> 0x00C9B0 + t=80 kind=0 -> 0x011598 + t=90 kind=0 -> 0x011648 + t=130 kind=0 -> 0x00CC24 + t=130 kind=0 -> 0x0116F8 + t=180 kind=0 -> 0x00CEE0 + t=180 kind=0 -> 0x011868 + t=240 kind=0 -> 0x00D154 + t=240 kind=0 -> 0x011918 + t=300 kind=0 -> 0x00D3C8 + t=300 kind=0 -> 0x011A68 + t=330 kind=0 -> 0x011BB8 + t=345 kind=0 -> 0x011DC8 + t=360 kind=0 -> 0x00D63C + t=360 kind=0 -> 0x011C68 + t=375 kind=0 -> 0x011EB4 + t=390 kind=0 -> 0x011FA0 + t=400 kind=0 -> 0x01208C + t=420 kind=0 -> 0x00DA94 + t=420 kind=0 -> 0x011D18 + t=420 kind=0 -> 0x012178 + t=430 kind=0 -> 0x012264 + t=460 kind=0 -> 0x0123F0 + t=490 kind=0 -> 0x0124DC + +## phase 3 — 17 scheduled routines + t=0 kind=5 -> 0x016E94 + t=0.5 kind=5 -> 0x016EFC + t=1 kind=0 -> 0x01C414 + t=4 kind=5 -> 0x016F70 + t=80 kind=0 -> 0x017038 + t=80 kind=0 -> 0x01C648 + t=90 kind=0 -> 0x01C798 + t=110 kind=0 -> 0x0178A8 + t=110 kind=0 -> 0x01C848 + t=120 kind=0 -> 0x01C8F8 + t=150 kind=0 -> 0x017BA4 + t=150 kind=0 -> 0x01C9A8 + t=210 kind=0 -> 0x01822C + t=240 kind=0 -> 0x01CA58 + t=300 kind=0 -> 0x01CB08 + t=540 kind=0 -> 0x01CBB8 + t=580 kind=0 -> 0x01CC68 + +------------------------------------------------------------------------ + +# Stage04.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +27 entries. + +## phase 1 — 11 scheduled routines + t=0 kind=5 -> 0x002070 + t=0.5 kind=5 -> 0x0020D8 + t=1 kind=0 -> 0x003F08 + t=4 kind=5 -> 0x00214C + t=15 kind=0 -> 0x002268 + t=30 kind=0 -> 0x0024E8 + t=420 kind=0 -> 0x00413C + t=480 kind=0 -> 0x0041EC + t=540 kind=0 -> 0x00429C + t=570 kind=0 -> 0x00434C + t=590 kind=0 -> 0x0043FC + +## phase 2 — 16 scheduled routines + t=0 kind=5 -> 0x007314 + t=0.5 kind=5 -> 0x00737C + t=1 kind=0 -> 0x00A9E4 + t=4 kind=5 -> 0x0073F0 + t=60 kind=0 -> 0x00ADD4 + t=90 kind=0 -> 0x00750C + t=150 kind=0 -> 0x007828 + t=210 kind=0 -> 0x007A24 + t=250 kind=0 -> 0x007D98 + t=270 kind=0 -> 0x0081BC + t=360 kind=0 -> 0x00AE84 + t=420 kind=0 -> 0x00AF34 + t=480 kind=0 -> 0x00AFE4 + t=540 kind=0 -> 0x00B094 + t=570 kind=0 -> 0x00B144 + t=590 kind=0 -> 0x00B1F4 + +------------------------------------------------------------------------ + +# Stage05.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +28 entries. + +## phase 1 — 19 scheduled routines + t=0 kind=5 -> 0x001664 + t=0.5 kind=5 -> 0x0016CC + t=1 kind=0 -> 0x00401C + t=4 kind=5 -> 0x001740 + t=60 kind=0 -> 0x0042B0 + t=80 kind=0 -> 0x001868 + t=100 kind=0 -> 0x004360 + t=130 kind=0 -> 0x001B30 + t=180 kind=0 -> 0x004410 + t=200 kind=0 -> 0x00248C + t=210 kind=0 -> 0x0044C0 + t=240 kind=0 -> 0x004570 + t=260 kind=0 -> 0x0027F4 + t=300 kind=0 -> 0x004620 + t=420 kind=0 -> 0x0046D0 + t=480 kind=0 -> 0x004780 + t=540 kind=0 -> 0x004830 + t=570 kind=0 -> 0x0048E0 + t=590 kind=0 -> 0x004990 + +## phase 2 — 9 scheduled routines + t=0 kind=5 -> 0x008E40 + t=0.5 kind=5 -> 0x008EA8 + t=1 kind=0 -> 0x00B37C + t=4 kind=5 -> 0x008F1C + t=150 kind=0 -> 0x009044 + t=420 kind=0 -> 0x00B6A0 + t=480 kind=0 -> 0x00B750 + t=540 kind=0 -> 0x00B800 + t=570 kind=0 -> 0x00B8B0 + +------------------------------------------------------------------------ + +# Stage06.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +40 entries. + +## phase 1 — 21 scheduled routines + t=0 kind=5 -> 0x0012A8 + t=0.5 kind=5 -> 0x001310 + t=1 kind=0 -> 0x004E74 + t=4 kind=5 -> 0x001384 + t=30 kind=0 -> 0x002870 + t=70 kind=0 -> 0x0014AC + t=90 kind=0 -> 0x0017D4 + t=90 kind=0 -> 0x0029FC + t=90 kind=0 -> 0x004FB4 + t=150 kind=0 -> 0x002B64 + t=150 kind=0 -> 0x005064 + t=160 kind=0 -> 0x001BE4 + t=190 kind=0 -> 0x001E64 + t=210 kind=0 -> 0x002CF0 + t=220 kind=0 -> 0x002224 + t=240 kind=0 -> 0x002450 + t=260 kind=0 -> 0x002634 + t=420 kind=0 -> 0x005114 + t=480 kind=0 -> 0x0051C4 + t=540 kind=0 -> 0x005274 + t=570 kind=0 -> 0x005324 + +## phase 2 — 9 scheduled routines + t=0 kind=5 -> 0x00BD0C + t=0.5 kind=5 -> 0x00BD74 + t=1 kind=0 -> 0x00E42C + t=4 kind=5 -> 0x00BDE8 + t=120 kind=0 -> 0x00BF10 + t=420 kind=0 -> 0x00E6F8 + t=480 kind=0 -> 0x00E7A8 + t=540 kind=0 -> 0x00E858 + t=570 kind=0 -> 0x00E908 + +## phase 3 — 10 scheduled routines + t=0 kind=5 -> 0x0138C4 + t=0.5 kind=5 -> 0x01392C + t=1 kind=0 -> 0x018388 + t=4 kind=5 -> 0x0139A0 + t=50 kind=0 -> 0x0168EC + t=60 kind=0 -> 0x0185E0 + t=90 kind=0 -> 0x018870 + t=1020 kind=0 -> 0x018920 + t=1080 kind=0 -> 0x0189D0 + t=1140 kind=0 -> 0x018A80 + +------------------------------------------------------------------------ + +# Stage07.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +19 entries. + +## phase 1 — 13 scheduled routines + t=0 kind=5 -> 0x0024EC + t=0.5 kind=5 -> 0x002554 + t=1 kind=0 -> 0x004F6C + t=4 kind=5 -> 0x0025C8 + t=60 kind=0 -> 0x005488 + t=90 kind=0 -> 0x005678 + t=120 kind=0 -> 0x0057C8 + t=150 kind=0 -> 0x0059B8 + t=180 kind=0 -> 0x005A68 + t=210 kind=0 -> 0x00616C + t=420 kind=0 -> 0x00621C + t=480 kind=0 -> 0x0062CC + t=540 kind=0 -> 0x00637C + +## phase 2 — 6 scheduled routines + t=0 kind=5 -> 0x00CB70 + t=0.5 kind=5 -> 0x00CBD8 + t=1 kind=0 -> 0x012578 + t=4 kind=5 -> 0x00CC4C + t=60 kind=0 -> 0x012C2C + t=570 kind=0 -> 0x012CDC + +------------------------------------------------------------------------ + +# Stage08.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +38 entries. + +## phase 1 — 22 scheduled routines + t=0 kind=5 -> 0x003250 + t=0.5 kind=5 -> 0x0032B8 + t=1 kind=0 -> 0x005F58 + t=3 kind=5 -> 0x00336C + t=3.5 kind=5 -> 0x0033BC + t=4 kind=5 -> 0x00340C + t=20 kind=0 -> 0x0062D4 + t=30 kind=0 -> 0x006434 + t=60 kind=0 -> 0x0067C8 + t=60 kind=0 -> 0x006878 + t=110 kind=0 -> 0x0069B4 + t=150 kind=0 -> 0x006ACC + t=160 kind=0 -> 0x006FB4 + t=190 kind=0 -> 0x007180 + t=240 kind=0 -> 0x0070D0 + t=360 kind=0 -> 0x007298 + t=420 kind=0 -> 0x007348 + t=450 kind=0 -> 0x0073F8 + t=480 kind=0 -> 0x0074A8 + t=510 kind=0 -> 0x007558 + t=540 kind=0 -> 0x007608 + t=570 kind=0 -> 0x0076B8 + +## phase 2 — 16 scheduled routines + t=0 kind=5 -> 0x00EC54 + t=0.5 kind=5 -> 0x00ECBC + t=1 kind=0 -> 0x0113F8 + t=4 kind=5 -> 0x00ED30 + t=60 kind=0 -> 0x011764 + t=90 kind=0 -> 0x011814 + t=120 kind=0 -> 0x0118C4 + t=130 kind=0 -> 0x011974 + t=170 kind=0 -> 0x011BD0 + t=200 kind=0 -> 0x011EA8 + t=230 kind=0 -> 0x0120E0 + t=240 kind=0 -> 0x0123B8 + t=420 kind=0 -> 0x012468 + t=480 kind=0 -> 0x012518 + t=540 kind=0 -> 0x0125C8 + t=570 kind=0 -> 0x012678 + +------------------------------------------------------------------------ + +# Stage09.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +37 entries. + +## phase 1 — 13 scheduled routines + t=0 kind=5 -> 0x0027A0 + t=0.5 kind=5 -> 0x002808 + t=1 kind=0 -> 0x005440 + t=4 kind=5 -> 0x00287C + t=60 kind=0 -> 0x00573C + t=90 kind=0 -> 0x002998 + t=140 kind=0 -> 0x002DF8 + t=180 kind=0 -> 0x0057EC + t=190 kind=0 -> 0x0031B8 + t=420 kind=0 -> 0x00589C + t=480 kind=0 -> 0x00594C + t=540 kind=0 -> 0x0059FC + t=570 kind=0 -> 0x005AAC + +## phase 2 — 10 scheduled routines + t=0 kind=5 -> 0x009D00 + t=0.5 kind=5 -> 0x009D68 + t=1 kind=0 -> 0x00C3E8 + t=4 kind=5 -> 0x009DDC + t=60 kind=0 -> 0x009EA4 + t=60 kind=0 -> 0x00C74C + t=90 kind=0 -> 0x00A08C + t=180 kind=0 -> 0x00A4B0 + t=210 kind=0 -> 0x00C7FC + t=270 kind=0 -> 0x00C8AC + +## phase 3 — 14 scheduled routines + t=0 kind=5 -> 0x01162C + t=0.5 kind=5 -> 0x011694 + t=1 kind=0 -> 0x019F2C + t=4 kind=5 -> 0x011708 + t=30 kind=0 -> 0x0117D0 + t=60 kind=0 -> 0x01A0E4 + t=90 kind=0 -> 0x01A194 + t=120 kind=0 -> 0x011A44 + t=120 kind=0 -> 0x01A384 + t=150 kind=0 -> 0x01A434 + t=200 kind=0 -> 0x011C18 + t=240 kind=0 -> 0x01A584 + t=270 kind=0 -> 0x01A634 + t=360 kind=0 -> 0x01A784 + +------------------------------------------------------------------------ + +# Stage10.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +11 entries. + +## phase 1 — 11 scheduled routines + t=0 kind=5 -> 0x000D80 + t=0.5 kind=5 -> 0x000DE8 + t=1 kind=0 -> 0x006B0C + t=4 kind=5 -> 0x000E5C + t=60 kind=0 -> 0x006BBC + t=90 kind=0 -> 0x006C6C + t=120 kind=0 -> 0x006D1C + t=150 kind=0 -> 0x006DCC + t=180 kind=0 -> 0x006E7C + t=210 kind=0 -> 0x006F2C + t=240 kind=0 -> 0x006FDC + +------------------------------------------------------------------------ + +# Stage11.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +25 entries. + +## phase 1 — 17 scheduled routines + t=0 kind=5 -> 0x001458 + t=0.5 kind=5 -> 0x0014C0 + t=1 kind=0 -> 0x004240 + t=4 kind=5 -> 0x001534 + t=60 kind=0 -> 0x00441C + t=90 kind=0 -> 0x0044CC + t=120 kind=0 -> 0x00457C + t=150 kind=0 -> 0x0046CC + t=160 kind=0 -> 0x001650 + t=160 kind=0 -> 0x00477C + t=180 kind=0 -> 0x00482C + t=240 kind=0 -> 0x0048DC + t=270 kind=0 -> 0x00498C + t=420 kind=0 -> 0x004A3C + t=480 kind=0 -> 0x004AEC + t=540 kind=0 -> 0x004B9C + t=570 kind=0 -> 0x004C4C + +## phase 2 — 8 scheduled routines + t=0 kind=5 -> 0x00BE00 + t=0.5 kind=5 -> 0x00BE68 + t=1 kind=0 -> 0x0111A0 + t=4 kind=5 -> 0x00BEDC + t=420 kind=0 -> 0x011310 + t=480 kind=0 -> 0x0113C0 + t=540 kind=0 -> 0x011470 + t=570 kind=0 -> 0x011520 + +------------------------------------------------------------------------ + +# Stage12.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +20 entries. + +## phase 1 — 20 scheduled routines + t=0 kind=5 -> 0x0013AC + t=0.5 kind=5 -> 0x001414 + t=1 kind=0 -> 0x008F24 + t=4 kind=5 -> 0x001488 + t=30 kind=0 -> 0x009528 + t=60 kind=0 -> 0x009678 + t=90 kind=0 -> 0x009728 + t=120 kind=0 -> 0x009878 + t=150 kind=0 -> 0x009928 + t=180 kind=0 -> 0x009A78 + t=240 kind=0 -> 0x009CF0 + t=270 kind=0 -> 0x009DA0 + t=300 kind=0 -> 0x009E50 + t=330 kind=0 -> 0x009FA0 + t=360 kind=0 -> 0x00A050 + t=390 kind=0 -> 0x00A100 + t=1020 kind=0 -> 0x00A1B0 + t=1080 kind=0 -> 0x00A260 + t=1140 kind=0 -> 0x00A310 + t=1170 kind=0 -> 0x00A3C0 + +------------------------------------------------------------------------ + +# Stage13.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +28 entries. + +## phase 1 — 28 scheduled routines + t=0 kind=5 -> 0x003058 + t=0.5 kind=5 -> 0x0030C0 + t=1 kind=0 -> 0x009A10 + t=4 kind=5 -> 0x003134 + t=10 kind=0 -> 0x009B50 + t=30 kind=0 -> 0x009C94 + t=80 kind=0 -> 0x009F24 + t=90 kind=0 -> 0x009FD4 + t=120 kind=0 -> 0x00A1C4 + t=150 kind=0 -> 0x00A4BC + t=180 kind=0 -> 0x00A56C + t=210 kind=0 -> 0x00A61C + t=240 kind=0 -> 0x00ADE0 + t=300 kind=0 -> 0x00AF4C + t=330 kind=0 -> 0x00B130 + t=360 kind=0 -> 0x00B1E0 + t=390 kind=0 -> 0x00B640 + t=420 kind=0 -> 0x00B790 + t=450 kind=0 -> 0x00B840 + t=480 kind=0 -> 0x00B990 + t=510 kind=0 -> 0x00BB88 + t=540 kind=0 -> 0x00BC38 + t=570 kind=0 -> 0x00BCE8 + t=600 kind=0 -> 0x00BD98 + t=630 kind=0 -> 0x00C084 + t=660 kind=0 -> 0x00C134 + t=690 kind=0 -> 0x00C1E4 + t=720 kind=0 -> 0x00C334 + +------------------------------------------------------------------------ + +# Stage14.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +25 entries. + +## phase 1 — 11 scheduled routines + t=0 kind=5 -> 0x002274 + t=0.5 kind=5 -> 0x0022DC + t=1 kind=0 -> 0x004CCC + t=4 kind=5 -> 0x002350 + t=30 kind=0 -> 0x004EBC + t=60 kind=0 -> 0x00500C + t=420 kind=0 -> 0x0050BC + t=480 kind=0 -> 0x00516C + t=540 kind=0 -> 0x00521C + t=570 kind=0 -> 0x0052CC + t=590 kind=0 -> 0x00537C + +## phase 2 — 14 scheduled routines + t=0 kind=5 -> 0x007D60 + t=0.5 kind=5 -> 0x007DC8 + t=1 kind=0 -> 0x009A34 + t=4 kind=5 -> 0x007E3C + t=60 kind=0 -> 0x009B84 + t=90 kind=0 -> 0x009C34 + t=150 kind=0 -> 0x009D84 + t=180 kind=0 -> 0x009E7C + t=240 kind=0 -> 0x009FCC + t=300 kind=0 -> 0x00A07C + t=360 kind=0 -> 0x00A12C + t=420 kind=0 -> 0x00A1DC + t=480 kind=0 -> 0x00A28C + t=540 kind=0 -> 0x00A33C + +------------------------------------------------------------------------ + +# Stage15.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +47 entries. + +## phase 1 — 23 scheduled routines + t=0 kind=5 -> 0x003DEC + t=0.5 kind=5 -> 0x003E54 + t=1 kind=0 -> 0x008948 + t=4 kind=5 -> 0x003EC8 + t=35 kind=0 -> 0x008C34 + t=65 kind=0 -> 0x008CE4 + t=90 kind=0 -> 0x008D94 + t=95 kind=0 -> 0x008E44 + t=105 kind=0 -> 0x008EF4 + t=165 kind=0 -> 0x009364 + t=180 kind=0 -> 0x009FD4 + t=200 kind=0 -> 0x009694 + t=215 kind=0 -> 0x009744 + t=230 kind=0 -> 0x0097F4 + t=240 kind=0 -> 0x0098A4 + t=255 kind=0 -> 0x009954 + t=285 kind=0 -> 0x009A04 + t=300 kind=0 -> 0x009B54 + t=360 kind=0 -> 0x009C74 + t=360 kind=0 -> 0x00A1E0 + t=420 kind=0 -> 0x009D24 + t=480 kind=0 -> 0x009DD4 + t=840 kind=0 -> 0x009F24 + +## phase 2 — 24 scheduled routines + t=0 kind=5 -> 0x010124 + t=0.5 kind=5 -> 0x01018C + t=1 kind=0 -> 0x01416C + t=4 kind=5 -> 0x010200 + t=30 kind=0 -> 0x014424 + t=60 kind=0 -> 0x0146B4 + t=90 kind=0 -> 0x014764 + t=120 kind=0 -> 0x0148B4 + t=150 kind=0 -> 0x014AD8 + t=180 kind=0 -> 0x014C60 + t=195 kind=0 -> 0x014F00 + t=225 kind=0 -> 0x015050 + t=240 kind=0 -> 0x015100 + t=285 kind=0 -> 0x0153C4 + t=300 kind=0 -> 0x015474 + t=360 kind=0 -> 0x0156C0 + t=390 kind=0 -> 0x015770 + t=420 kind=0 -> 0x015820 + t=600 kind=0 -> 0x015C08 + t=900 kind=0 -> 0x015CB8 + t=1020 kind=0 -> 0x015D68 + t=1080 kind=0 -> 0x015E18 + t=1140 kind=0 -> 0x015EC8 + t=1170 kind=0 -> 0x015F78 + +------------------------------------------------------------------------ + +# Stage16.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +20 entries. + +## phase 1 — 20 scheduled routines + t=0 kind=5 -> 0x00033C + t=0.5 kind=5 -> 0x0003A4 + t=1 kind=0 -> 0x0015AC + t=4 kind=5 -> 0x000418 + t=30 kind=0 -> 0x001768 + t=60 kind=0 -> 0x001818 + t=90 kind=0 -> 0x0018C8 + t=120 kind=0 -> 0x001A18 + t=150 kind=0 -> 0x001AC8 + t=180 kind=0 -> 0x001C18 + t=240 kind=0 -> 0x001CC8 + t=300 kind=0 -> 0x001D78 + t=360 kind=0 -> 0x001E28 + t=420 kind=0 -> 0x001ED8 + t=480 kind=0 -> 0x001F88 + t=510 kind=0 -> 0x002038 + t=540 kind=0 -> 0x0020E8 + t=570 kind=0 -> 0x002198 + t=590 kind=0 -> 0x002388 + t=595 kind=0 -> 0x002438 + +------------------------------------------------------------------------ + +# Stage18.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +3 entries. + +## phase 1 — 3 scheduled routines + t=0 kind=0 -> 0x0004EC + t=2 kind=0 -> 0x00054C + t=4 kind=0 -> 0x0005C8 + +------------------------------------------------------------------------ + +# Stage19.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +3 entries. + +## phase 1 — 3 scheduled routines + t=0 kind=0 -> 0x000438 + t=2 kind=0 -> 0x000498 + t=4 kind=0 -> 0x000514 + +------------------------------------------------------------------------ + +# Stage20.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +3 entries. + +## phase 1 — 3 scheduled routines + t=0 kind=0 -> 0x0005E4 + t=2 kind=0 -> 0x000644 + t=4 kind=0 -> 0x0006C0 + +------------------------------------------------------------------------ + +# Stage21.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +3 entries. + +## phase 1 — 3 scheduled routines + t=0 kind=0 -> 0x0004B0 + t=2 kind=0 -> 0x000510 + t=4 kind=0 -> 0x00058C + +------------------------------------------------------------------------ + +# Stage22.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +3 entries. + +## phase 1 — 3 scheduled routines + t=0 kind=0 -> 0x0003F8 + t=2 kind=0 -> 0x000458 + t=4 kind=0 -> 0x0004D4 + +------------------------------------------------------------------------ + +# Stage23.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +3 entries. + +## phase 1 — 3 scheduled routines + t=0 kind=0 -> 0x00030C + t=2 kind=0 -> 0x00036C + t=4 kind=0 -> 0x0003E8 + +------------------------------------------------------------------------ + +# Stage24.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +14 entries. + +## phase 1 — 14 scheduled routines + t=0 kind=5 -> 0x001D3C + t=0.5 kind=5 -> 0x001DA4 + t=1 kind=0 -> 0x007FC0 + t=4 kind=5 -> 0x001E0C + t=30 kind=0 -> 0x008110 + t=60 kind=0 -> 0x0081C0 + t=120 kind=0 -> 0x008270 + t=180 kind=0 -> 0x008320 + t=300 kind=0 -> 0x0083D0 + t=600 kind=0 -> 0x008480 + t=1620 kind=0 -> 0x008530 + t=1680 kind=0 -> 0x0085E0 + t=1740 kind=0 -> 0x008690 + t=1770 kind=0 -> 0x008740 + +------------------------------------------------------------------------ + +# Stage25.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +17 entries. + +## phase 1 — 17 scheduled routines + t=0 kind=5 -> 0x00406C + t=0 kind=0 -> 0x004360 + t=0 kind=0 -> 0x00444C + t=0.5 kind=5 -> 0x0040D4 + t=1 kind=0 -> 0x017E64 + t=4 kind=5 -> 0x00413C + t=180 kind=0 -> 0x018054 + t=360 kind=0 -> 0x018104 + t=540 kind=0 -> 0x0181B4 + t=600 kind=0 -> 0x004538 + t=600 kind=0 -> 0x00489C + t=720 kind=0 -> 0x018264 + t=900 kind=0 -> 0x018314 + t=1020 kind=0 -> 0x0183C4 + t=1080 kind=0 -> 0x018474 + t=1140 kind=0 -> 0x018524 + t=1170 kind=0 -> 0x0185D4 + +------------------------------------------------------------------------ + +# Stage26.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +25 entries. + +## phase 1 — 25 scheduled routines + t=0 kind=5 -> 0x00377C + t=0.5 kind=5 -> 0x0037E4 + t=1 kind=0 -> 0x00497C + t=1 kind=0 -> 0x00BDF0 + t=4 kind=5 -> 0x00384C + t=60 kind=0 -> 0x004EA8 + t=120 kind=0 -> 0x005680 + t=120 kind=0 -> 0x007DB8 + t=170 kind=0 -> 0x004BD8 + t=180 kind=0 -> 0x005E58 + t=270 kind=0 -> 0x00C08C + t=300 kind=0 -> 0x00C1DC + t=360 kind=0 -> 0x00C28C + t=450 kind=0 -> 0x00C33C + t=480 kind=0 -> 0x006630 + t=510 kind=0 -> 0x007ED4 + t=540 kind=0 -> 0x004D40 + t=570 kind=0 -> 0x00C3EC + t=600 kind=0 -> 0x006E08 + t=660 kind=0 -> 0x008090 + t=690 kind=0 -> 0x00C49C + t=720 kind=0 -> 0x0075E0 + t=750 kind=0 -> 0x00C54C + t=780 kind=0 -> 0x008D60 + t=840 kind=0 -> 0x00C5FC + +------------------------------------------------------------------------ + +# Stage27.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +19 entries. + +## phase 1 — 19 scheduled routines + t=0 kind=5 -> 0x001EDC + t=0.5 kind=5 -> 0x001F44 + t=1 kind=0 -> 0x00720C + t=4 kind=5 -> 0x001FAC + t=60 kind=0 -> 0x004244 + t=90 kind=0 -> 0x007368 + t=180 kind=0 -> 0x003B70 + t=210 kind=0 -> 0x00446C + t=240 kind=0 -> 0x003EB0 + t=300 kind=0 -> 0x007418 + t=420 kind=0 -> 0x00386C + t=450 kind=0 -> 0x0074C8 + t=540 kind=0 -> 0x007578 + t=660 kind=0 -> 0x007628 + t=780 kind=0 -> 0x0076D8 + t=1020 kind=0 -> 0x004758 + t=1080 kind=0 -> 0x007788 + t=1140 kind=0 -> 0x007838 + t=1170 kind=0 -> 0x0078E8 + +------------------------------------------------------------------------ + +# Stage28.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +8 entries. + +## phase 1 — 8 scheduled routines + t=0 kind=5 -> 0x001F40 + t=0.5 kind=5 -> 0x001FA8 + t=1 kind=0 -> 0x005FE0 + t=4 kind=5 -> 0x002010 + t=1020 kind=0 -> 0x00613C + t=1080 kind=0 -> 0x006308 + t=1140 kind=0 -> 0x0064D4 + t=1170 kind=0 -> 0x0066A0 + +------------------------------------------------------------------------ + +# Stage29.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +27 entries. + +## phase 1 — 27 scheduled routines + t=0 kind=5 -> 0x009BAC + t=0.5 kind=5 -> 0x00CBAC + t=1 kind=0 -> 0x03618C + t=4 kind=5 -> 0x00CC14 + t=10 kind=0 -> 0x01C520 + t=10 kind=0 -> 0x03623C + t=15 kind=0 -> 0x0233CC + t=40 kind=0 -> 0x03638C + t=120 kind=0 -> 0x036C90 + t=150 kind=0 -> 0x024088 + t=270 kind=0 -> 0x024DE4 + t=300.01 kind=0 -> 0x037294 + t=390 kind=0 -> 0x025BE0 + t=480 kind=0 -> 0x02693C + t=480 kind=0 -> 0x037898 + t=585 kind=0 -> 0x037948 + t=615 kind=0 -> 0x02EE54 + t=750 kind=0 -> 0x02FB8C + t=780 kind=0 -> 0x037A98 + t=870 kind=0 -> 0x0308C4 + t=900 kind=0 -> 0x03809C + t=990 kind=0 -> 0x0315FC + t=1020 kind=0 -> 0x0386A0 + t=1080 kind=0 -> 0x038750 + t=1110 kind=0 -> 0x032334 + t=1140 kind=0 -> 0x038800 + t=1170 kind=0 -> 0x0388B0 diff --git a/docs/re/data/isl-stage02-schedule.txt b/docs/re/data/isl-stage02-schedule.txt new file mode 100644 index 0000000..fd79ecf --- /dev/null +++ b/docs/re/data/isl-stage02-schedule.txt @@ -0,0 +1,68 @@ +# Stage02.ssb — phase timelines + +Generated by `tools/re-capture/isl_report.py schedule`. + +Each phase ends with a table of `(routine offset, time in seconds, kind)`. +56 entries. + +## phase 1 — 25 scheduled routines + t=0 kind=5 -> 0x002C04 + t=0.5 kind=5 -> 0x002C6C + t=1 kind=5 -> 0x002CE0 + t=1 kind=0 -> 0x00747C + t=4 kind=5 -> 0x002D30 + t=30 kind=0 -> 0x00323C + t=30 kind=0 -> 0x007754 + t=60 kind=0 -> 0x007804 + t=90 kind=0 -> 0x003448 + t=90 kind=0 -> 0x0078B4 + t=120 kind=0 -> 0x003A2C + t=120 kind=0 -> 0x007964 + t=170 kind=0 -> 0x003F84 + t=170 kind=0 -> 0x007AB4 + t=210 kind=0 -> 0x00461C + t=210 kind=0 -> 0x007C04 + t=240 kind=0 -> 0x004AF8 + t=240 kind=0 -> 0x007D54 + t=270 kind=0 -> 0x007EA4 + t=300 kind=0 -> 0x007F54 + t=330 kind=0 -> 0x0080A4 + t=1020 kind=0 -> 0x008154 + t=1080 kind=0 -> 0x008204 + t=1140 kind=0 -> 0x0082B4 + t=1170 kind=0 -> 0x008364 + +## phase 2 — 13 scheduled routines + t=0 kind=5 -> 0x0183D4 + t=0.5 kind=5 -> 0x01843C + t=1 kind=0 -> 0x01F230 + t=4 kind=5 -> 0x0184B0 + t=30 kind=0 -> 0x0186F8 + t=60 kind=0 -> 0x01892C + t=180 kind=0 -> 0x018B78 + t=240 kind=0 -> 0x018ED4 + t=300 kind=0 -> 0x01F488 + t=330 kind=0 -> 0x01F538 + t=360 kind=0 -> 0x01F5E8 + t=420 kind=0 -> 0x019118 + t=570 kind=0 -> 0x01F698 + +## phase 3 — 18 scheduled routines + t=0 kind=5 -> 0x0289EC + t=0.5 kind=5 -> 0x028A54 + t=1 kind=0 -> 0x028EC0 + t=1 kind=0 -> 0x02E364 + t=4 kind=5 -> 0x028AC8 + t=5 kind=5 -> 0x028E30 + t=50 kind=0 -> 0x029724 + t=120 kind=0 -> 0x0299C8 + t=120 kind=0 -> 0x02E63C + t=150 kind=0 -> 0x02A7BC + t=150 kind=0 -> 0x02E78C + t=180 kind=0 -> 0x029D14 + t=240 kind=0 -> 0x02E8DC + t=270 kind=0 -> 0x02E98C + t=300 kind=0 -> 0x02A92C + t=300 kind=0 -> 0x02EA3C + t=330 kind=0 -> 0x02EAEC + t=360 kind=0 -> 0x02EB9C diff --git a/docs/re/structures/isl-schedule.md b/docs/re/structures/isl-schedule.md new file mode 100644 index 0000000..c56e8a1 --- /dev/null +++ b/docs/re/structures/isl-schedule.md @@ -0,0 +1,76 @@ +# ✅ Each phase carries a TIMELINE — 675 scheduled routines across the disc + +The trailing data table found at the end of every phase region +([isl-stream-entry-points](../isl-stream-entry-points.md)) is decoded. It is the +mission's **scripted event schedule**. + +## Layout + +After the phase's code ends — at the first value of that phase's mission-level +`0x1883` record — comes a run of 8-byte typed records, tag `0x19` = int, +`0x1A` = IEEE float: + +``` +int N -- entry count +N x [ int offset ; float t ; int kind ] +``` + +`1 + 3N` matches the record count in **every** phase measured: Stage 02's three +phases hold 76, 40 and 55 records for N = 25, 13 and 18. + +## ✅ The checks + +| | | +|---|---| +| schedule entries disc-wide | **675** | +| `0x1A` float records disc-wide | **675** — the same number, independently counted | +| offsets landing on the instruction stream | **675 / 675 = 100.0 %** | +| control: random 4-aligned offsets | 33.3 % | + +The float count and the entry count are derived by different routes and agree +exactly, and every single offset resolves. `kind` is **0** (556) or **5** (119). + +## ✅ The floats are seconds + +The distribution is unmistakable: 0, 0.5, 1, 4, 5, 30, 50, 60, 90, 120, 150, +170, 180, 210, 240, 270, 300, 330, 360, 420, 570, 1020, 1080, 1140, 1170 … +mission times, not fractions. + +And the targets are what a schedule would point at — small one-shot coroutines: + +``` +002C04: set.i local[0] = 1 +002C1C: set.i local[4] = 1 +002C34: set.f local[8] = 0.4 +002C50: call builtin106(0x1, 0x1, 0.4) +002C5C: call end_coroutine +``` + +## 🟡 A runtime cross-check — consistent, and not proof + +The closed `REMAINING OB` work measured, on the emulator over n=5 runs, that +Stage 02's squadrons arrive at **t = 0, 120 and 210 s**. All three times are in +phase 1's static schedule, and **120 and 210 each appear twice**, which is what +two squadrons arriving together would look like. + +⚠️ Stated as consistency rather than confirmation: these are round numbers, and +phase 1 has ~22 distinct times spread over 0–1170, so three specified round +values all being present is not by itself unlikely. The **doubling** is the +sharper detail, and it was not predicted in advance. + +## Artefacts + +`data/isl-stage02-schedule.txt` and `data/isl-schedule-all.txt` (all 28 stages, +675 entries), generator `isl_report.py schedule`. The four earlier artefacts +regenerate byte-identical. + +## 🟡 Not settled + +* **`kind` (0 or 5) is not identified.** Two behaviours, no reading. +* **This is not what starts the unreachable code.** All 675 targets are already + reachable — **0 are unreached run-starts** — so the ~15 % gap stands. +* **Whether the schedule is per-phase-clock or mission-clock** is not + established; each phase's table restarts at t=0, which suggests per-phase, but + that is an inference from the layout, not a read of the consumer. +* **The consumer is unread.** Nothing here shows the engine walking this table; + the decode rests on the structural checks above. diff --git a/tools/re-capture/isl.py b/tools/re-capture/isl.py index 75df8bc..1ef2aae 100755 --- a/tools/re-capture/isl.py +++ b/tools/re-capture/isl.py @@ -495,6 +495,47 @@ def conditions(b, sym1=None, sym2=None): return out +def schedule(b): + """Each phase's trailing TIMELINE table: (phase, routine_offset, time_s, kind). + + Layout, after the phase's code ends (the `0x1883` record's first value): + + int N -- entry count + N x [ int offset ; float t ; int kind ] -- 8-byte typed records, + tag 0x19 int, 0x1A float + + `1 + 3N` matches the record count in every phase measured. Disc-wide there + are 675 entries -- exactly the number of `0x1A` float records, which is the + consistency check -- and **675 of 675 offsets land on the instruction + stream** against a 33.3 % chance rate. + + The floats are SECONDS: 0, 0.5, 1, 4, 30, 60, 90, 120, 150, 180, 240, 300, + 420 ... The `kind` field is 0 (556) or 5 (119). + """ + end = struct.unpack_from('>I', b, 0x0C)[0] + bases = phase_bases(b) + limits = list(bases[1:]) + [end] + out = [] + for ph, (base, hi) in enumerate(zip(bases, limits), 1): + o = base + while o + 4 <= hi and (struct.unpack_from('>I', b, o)[0] & 0xFF) <= 0x18: + ln = (struct.unpack_from('>I', b, o)[0] >> 8) & 0xFF + if ln == 0 or ln % 2: break + o += ln + if o + 8 > hi: continue + n = struct.unpack_from('>I', b, o + 4)[0] + o += 8 + for _ in range(n): + if o + 24 > hi: break + a = struct.unpack_from('>I', b, o + 4)[0] + t = struct.unpack('>f', struct.pack( + '>I', struct.unpack_from('>I', b, o + 12)[0]))[0] + k = struct.unpack_from('>I', b, o + 20)[0] + out.append((ph, base + a, t, k)) + o += 24 + return out + + def call_sites(b): """Every `call` in the code region. Scans on the encoding, not by decoding, so a bad length somewhere cannot hide the rest of the file.""" diff --git a/tools/re-capture/isl_report.py b/tools/re-capture/isl_report.py index 22aa4d5..2c31f56 100644 --- a/tools/re-capture/isl_report.py +++ b/tools/re-capture/isl_report.py @@ -12,6 +12,7 @@ generator in the tree is the point of this file. isl_report.py conditions -> every condition site, comparand resolved isl_report.py phase-guards -> the NECESSARY conditions for each exit isl_report.py phase-guards -> the same for every Stage*.ssb it holds + isl_report.py schedule -> the phase timeline tables The "needs the coroutine entry points" blocker recorded here is REFUTED: the instruction stream is FLAT and `isl.linear_offsets` reaches 25705/25705 call @@ -169,6 +170,23 @@ def emit_phase_guards(b, path): print(' %s0x%06X %s %s %s' % (tag, c['off'], lhs, c['rel'], rhs)) +def emit_schedule(b, path): + """The per-phase timeline: what the script launches, and when.""" + sch = isl.schedule(b) + print('# %s — phase timelines' % path) + print() + print('Generated by `tools/re-capture/isl_report.py schedule`.') + print() + print('Each phase ends with a table of `(routine offset, time in seconds, kind)`.') + print('%d entries.' % len(sch)) + for ph in sorted({p for p, _o, _t, _k in sch}): + rows = [r for r in sch if r[0] == ph] + print() + print('## phase %d — %d scheduled routines' % (ph, len(rows))) + for _p, off, t, k in sorted(rows, key=lambda r: (r[2], r[1])): + print(' t=%-8g kind=%d -> 0x%06X' % (t, k, off)) + + def main(): # The dominator pass over a large stage is memory-hungry and once OOM-KILLED # a run on this 15 GB box. Cap the address space so a bad input fails this @@ -186,14 +204,16 @@ def main(): if i: print(); print('-' * 72); print() {'calls': emit_calls, 'phase-ends': emit_phase_ends, 'conditions': emit_conditions, - 'phase-guards': emit_phase_guards}[sys.argv[2]]( + 'phase-guards': emit_phase_guards, + 'schedule': emit_schedule}[sys.argv[2]]( isl.load(f), os.path.basename(f)) return b = isl.load(path) name = path.replace('\\', '/').split('/')[-1] {'calls': emit_calls, 'phase-ends': emit_phase_ends, 'conditions': emit_conditions, - 'phase-guards': emit_phase_guards}[sys.argv[2]](b, name) + 'phase-guards': emit_phase_guards, + 'schedule': emit_schedule}[sys.argv[2]](b, name) if __name__ == '__main__':