aboutsummaryrefslogtreecommitdiff
path: root/docs/appendices/script-vm.md
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-29 14:36:40 +0300
committerValentin Popov <valentin@popov.link>2026-10-29 14:36:40 +0300
commit35b9d86637e43f8289c61aba09dce8e939ecdd4f (patch)
treed465d52708da4c2d98e56b93436a89abf2e3145b /docs/appendices/script-vm.md
parente6408fe9123a51f6a82167b0ec37cfc9757b849d (diff)
downloadfparkan-35b9d86637e43f8289c61aba09dce8e939ecdd4f.tar.xz
fparkan-35b9d86637e43f8289c61aba09dce8e939ecdd4f.zip
test(runtime): verify native Control budget updates
Diffstat (limited to 'docs/appendices/script-vm.md')
-rw-r--r--docs/appendices/script-vm.md31
1 files changed, 31 insertions, 0 deletions
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md
index c4c0255..9ed3e80 100644
--- a/docs/appendices/script-vm.md
+++ b/docs/appendices/script-vm.md
@@ -644,6 +644,37 @@ oracle вызывает оригинальные `FUN_10010ba0` (RVA `0x10ba0`),
входного времени и порядок доставки установлены статически, как описано ниже;
Rust продолжает читать начальные provider snapshots и не моделирует эти изменения.
+#### Бюджет и обновление устройства tag 15
+
+Для той же сборки `Control.dll` oracle исполняет оригинальный диспетчер
+RVA `0x2d340`, распределение по категориям RVA `0x2dca0`, конструктор tag 15
+RVA `0x22ae0`, его rate RVA `0x22b20` и update RVA `0x22bb0`.
+Категория читается из текущего descriptor через RVA `0x2c3a0`.
+Порядок масок категорий — `8`, `1`, `0x24`, `0x10`, `2`.
+Поэтому порядок обслуживания может отличаться от порядка устройств в массиве.
+Положительные вклады образуют начальный бюджет; потребность выбранных
+категорий определяет коэффициент выделения.
+
+Вектор задаёт provider с максимумом `100`, количеством `40` и долей `0.4`,
+интервал `0.5` секунды, коэффициенты tag 15 равные `1` и нулевое поле
+ descriptor `+0x20`. Исходная rate-функция возвращает `-0.2`.
+Генератор с descriptor tag `14` подставлен явно: mock возвращает положительный
+вклад `0.1` или `0.5` и записывает аргументы своего update. Функции tag 15,
+provider getter и изменение количества не подменены.
+
+| Бюджет | Коэффициент tag 15 | Amount / processed / total, биты | Доля, биты |
+|---|---|---|---|
+| `0.1` | `0.5` | `0x42206666` (`40.1`) | `0x3ecd4fdf` |
+| `0.5` | `1` | `0x4220cccd` (`40.2`) | `0x3ecdd2f2` |
+
+Сравнение идёт по битам при x87 control word `0x007f`. Реальный update
+вызывает RVA `0x10ba0` и публикует новую долю одним callback selector `0x200`.
+Хотя генератор стоит первым в массиве, его update уже видит изменённое
+количество: категория tag 15 обслуживается раньше. Проверены также интервал
+и коэффициент, переданные mock-генератору. Его собственная генерация, другие
+категории, активный clock-путь и выполнение миссии этим не проверены.
+Rust пока не переносит этот изменяемый бюджетный цикл.
+
#### Доставка игровых часов в Control
Статическая цепочка относится к GOG-модулям `World3D.dll` (SHA-256