From 50a74cc0a64352a50dd1023d48d0f94a4eca9627 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sat, 18 Jul 2026 20:44:10 +0400 Subject: feat(script): classify VM dispatch selectors --- docs/appendices/script-vm.md | 9 +++++++++ docs/tomes/06-behavior.md | 8 ++++++++ 2 files changed, 17 insertions(+) (limited to 'docs') diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md index 128acd9..6836f82 100644 --- a/docs/appendices/script-vm.md +++ b/docs/appendices/script-vm.md @@ -53,6 +53,15 @@ cargo run -p fparkan-cli -- script inspect ` records, 20 references и 0 trailing bytes. Это corpus evidence для reader-а, но не разрешение на исполнение неизвестных 73 opcodes. +Теперь установлен selector: loader `0x10001000` создаёт 73 pointers в +фиксированном порядке, а `0x10011e70` копирует их без перестановки в runtime +array. Во всех 58 GOG `.scr` первый header word каждого nested record равен +`0..72` либо `0xffff_ffff`: соответственно 2095 handler selectors и 3992 +sentinel records. Поэтому `ScriptInstruction::dispatch_selector()` возвращает +`Handler(0..72)`, `Sentinel` или сохраняемый `Unknown(u32)`. Первый handler +(`Handler(0)`, VA `0x10008034`) только устанавливает current context и flag +`+0x50 = 1`; это не даёт ему игрового имени и не заменяет runtime trace. + TMA properties остаются four raw `u32` words плюс имя, пока consumer/schema не задаст тип (integer/float bits/ObjectId/enum/fixed-point/index). В том числе сохраняются `NOT USED`; corpus подтверждает `Invulnerability`, life state, diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md index 5e0299e..ad1832c 100644 --- a/docs/tomes/06-behavior.md +++ b/docs/tomes/06-behavior.md @@ -143,6 +143,14 @@ references каждого record, жёстко ограничивает counts/a файла, но не таблица семантик: названия opcode/words появятся только после handler contracts и runtime traces. +Связь первого header word с dispatch теперь доказана статически: `ai.dll` +создаёт 73 handler pointers в известном порядке и копирует table без +перестановки. По всем 58 GOG packages первый word — индекс `0..72` либо +`0xffff_ffff` sentinel; `fparkan-script` отражает это как typed +`ScriptDispatchSelector`, сохраняя неожиданные значения `Unknown`. Первый +handler лишь инициирует execution context (`+0x50 = 1`); его gameplay meaning +пока не назван. + Безопасная runtime-модель: ```text -- cgit v1.2.3