feat(runtime): run tag-15 and tag-19 Control budgets
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
This commit is contained in:
5 files changed
+1143
-30
No files matched your search
@@ -752,8 +752,8 @@ amount, accumulator, aggregate или stage изменений.
|
||||
Поле `+0x618` изначально выключено; обработчик события `7` задаёт gate по
|
||||
правилу `gate = (arg == 2)` и вызывает пересчёт `0x2dc20`, только если gate
|
||||
изменился. Проекция сохраняет начальное состояние и уважает установленную
|
||||
suspension-метку. События Control пока не исполняются,
|
||||
поэтому это API остаётся явным CPU-шагом и не подключено к игровому clock.
|
||||
suspension-метку. События Control пока не исполняются, а ресурсный budget API
|
||||
вызывается явно и пока не подключён к игровому clock.
|
||||
Тесты Rust повторяют пропорциональный вектор, накопитель `+0x10`, округление
|
||||
`2^24`, sequential capacity boundary, достижимый negative capacity и откат при
|
||||
unsupported FX/lifecycle.
|
||||
@@ -776,18 +776,37 @@ descriptor `+0x20`. Исходная rate-функция возвращает `-
|
||||
вклад `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` |
|
||||
| Бюджет | Коэффициент tag 15 | Amount / processed / total, биты | Доля, биты | `+0x5dc` / `+0x5e0`, биты |
|
||||
|---|---|---|---|---|
|
||||
| `0.1` | `0.5` | `0x42206666` (`40.1`) | `0x3ecd4fdf` | `0x3e4ccccd` / `0x3e4ccccd` (`0.2`) |
|
||||
| `0.5` | `1` | `0x4220cccd` (`40.2`) | `0x3ecdd2f2` | `0x3ecccccd` / `0x3ecccccd` (`0.4`) |
|
||||
|
||||
Сравнение идёт по битам при x87 control word `0x007f`. Реальный update
|
||||
вызывает RVA `0x10ba0` и публикует новую долю одним callback selector `0x200`.
|
||||
Хотя генератор стоит первым в массиве, его update уже видит изменённое
|
||||
количество: категория tag 15 обслуживается раньше. Проверены также интервал
|
||||
и коэффициент, переданные mock-генератору. Его собственная генерация, другие
|
||||
категории и выполнение миссии этим не проверены.
|
||||
Rust пока не переносит этот изменяемый бюджетный цикл.
|
||||
категории и выполнение миссии этим не проверены. Исходные выходные ставки
|
||||
`+0x5dc` и `+0x5e0` также записываются на каждом вызове; при пустой таблице
|
||||
оба поля получают битовый отрицательный ноль.
|
||||
|
||||
Rust предоставляет явный CPU-вызов
|
||||
`advance_loaded_mission_control_budget(engine, handle, dt)`. Он переносит
|
||||
диспетчер и callbacks исходных factory tags `15` и `19`, если текущий
|
||||
descriptor tag равен `15` или `19` (native categories `0` или `1`). Rates `+0x5dc/+0x5e0`
|
||||
сохраняются отдельно. Вызов работает на копии полного состояния: неизвестный
|
||||
descriptor, factory callback, provider или численный диапазон возвращает
|
||||
ошибку без публикации частичных изменений. Вызов ещё не включён в Control clock;
|
||||
нативный oracle также проверяет пустую таблицу с отрицательным нулём в обеих
|
||||
выходных ставках и невырожденную пару исходных устройств tag 19/tag 15 при
|
||||
`dt = 0.375`. Этот парный вектор проверяет изменения amount, processed amount,
|
||||
накопителя, доли, обоих множителей и ставок `+0x5dc/+0x5e0` по битам. Rust-тест
|
||||
повторяет его на синтетической provider-таблице. Для лицензированного
|
||||
`min_l_n1.dat` отдельный тест подтверждает состав factory/current tags и то, что
|
||||
первый неподдержанный current tag `9` отклоняет весь шаг без изменений; полного
|
||||
успешного бюджетного прохода для реальной миссионной таблицы пока нет.
|
||||
Rust также отклоняет нулевой знаменатель обновления tag 19; тест вызывает эту
|
||||
ошибку после изменения provider потребителем и подтверждает откат всей таблицы.
|
||||
|
||||
#### Генератор tag 19 в том же бюджетном проходе
|
||||
|
||||
@@ -814,8 +833,18 @@ provider уже после потребителя tag `15`, повторно в
|
||||
собственный множитель. Это не запись коэффициента выделения в `+0x4c`, как у
|
||||
tag `15`: смысл изменения этого поля зависит от фабричного класса.
|
||||
Векторы проверяют конечные положительные значения при x87 CW `0x007f`;
|
||||
нулевой знаменатель, отрицательные параметры и другие классы устройств ими
|
||||
не покрыты. Перенос общего бюджетного цикла в Rust ещё не завершён.
|
||||
нативный oracle дополнительно фиксирует невырожденный случай, в котором
|
||||
коэффициенты различаются и поле `+0x20` ненулевое. Нулевой знаменатель,
|
||||
отрицательные параметры и другие классы устройств остаются непокрытыми.
|
||||
В этом дополнительном native-векторе `dt = 0.375`, provider `40/100`, tag 19
|
||||
имеет `B = 1`, `C0 = 0.25`, а tag 15 — `B = 0.125`, `C0 = 0.75`, `C1 = 1.25`
|
||||
и начальный множитель `0.8`. Получены rate генератора `0x3dcccccd`, rate
|
||||
потребителя `0xbe400000`, amount `0x42202b85`, ratio `0x3ecd0481`, накопитель
|
||||
`+0x10 = 0x3d2e1400`, множитель tag 15 `0x3f088889`, множитель tag 19 `0`, а
|
||||
обе выходные ставки равны `0x3e88888a`. Это проверяет раздельное чтение
|
||||
коэффициента `C1` и множителя `+0x4c`, а также ненулевую базовую стоимость.
|
||||
Поддержанные Rust-векторы не означают, что любой Control descriptor или
|
||||
полный миссионный цикл уже работает.
|
||||
|
||||
#### Активация и начальные часы
|
||||
|
||||
|
||||
Reference in new issue
Block a user