docs: бюджет тактов/размеров chunked-заливок + идеи дальнейших упрощений

docs/accel-fill-budget.md: полный разбор v3 (подготовка ~340Т на
прямоугольник, 46Т на чанк 16 линий, 53Т/51Т на линию, ~107 байт/leaf)
против per-line di/ei вариантов (djnz 72Т/линию ~63 байта; 16-бит IX
206Т/линию); break-even n≈9 линий, тотализатор, решение остаться на v3.
Краткие выжимки — в шапки _gfx_rect*fill256.

Идеи на будущее (там же): ограничить контракт стороной <=256 (широкие
прямоугольники пользователь выводит в два приёма); реализовать оба
варианта (поблочный/построчный) с переключением опцией сборки в духе
GFX_NOCHECK.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 17:58:17 +03:00
parent 2c414da465
commit 580837d2ee
4 changed files with 131 additions and 10 deletions
+1
View File
@@ -13,6 +13,7 @@
* прямоугольниках (|w−h| < 4) или когда форма известна заранее —
* выгоднее прямой вызов _gfx_recthfill256 / _gfx_rectvfill256
* (контракты — в их шапках: recthfill требует 1<=w<=256).
* Полный бюджет тактов/размеров всех вариантов: docs/accel-fill-budget.md.
*
* __sdcccall(1): x→HL, y→DE(E=y); w→4/5(ix), h→6/7(ix), color→8(ix).
* Диспетчер сохраняет HL/DE и стек как есть; leaf делает свой
+11 -5
View File
@@ -8,11 +8,17 @@
* Счётчик чанков — precompute (v3): один раз на входе E = h>>4 (полных
* чанков, ≤16 при h<=256) и h&15 — хвост (SMC в ld b,#n хвостовой
* скобки). Заголовок чанка = dec e/jr nz (~46Т на чанк ≈ 2.9Т/линию
* против ~173Т/чанк у 16-бит арифметики через IX-слоты); precompute
* ~170Т однократно. Итог ~54Т/линию. Хвост — отдельная скобка со
* СВОИМ армированием (второй SMC-слот размера): армирование обязано
* быть в каждой скобке — в окне EI CBL-ISR армирует акселератор своим
* размером блока.
* против ~173Т/чанк у 16-бит арифметики через IX-слоты). Хвост —
* отдельная скобка со СВОИМ армированием (второй SMC-слот размера):
* армирование обязано быть в каждой скобке — в окне EI CBL-ISR
* армирует акселератор своим размером блока.
*
* ---- БЮДЖЕТ (полный разбор: docs/accel-fill-budget.md) -------------
* подготовка ~340Т один раз на прямоугольник (пролог 102 + SMC 45 +
* precompute ~110 + эпилог 54); чанк 16 строк — 46Т; строка — 51Т.
* T(n) ≈ 340 + 46*(n/16) + 51*n; ~107 байт кода. Break-even против
* простейшего per-line di/ei (djnz, 70Т/линию, ~53 байта): n ≈ 9 —
* при n <= 8 линий простейший быстрее (максимум +140Т на n=1).
*
* Прямой вызов оправдан, когда форма известна заранее (широкие/низкие
* прямоугольники, w > h) — экономит ~160-245Т проверки диспетчера
+11 -5
View File
@@ -8,11 +8,17 @@
* Счётчик чанков — precompute (v3): один раз на входе E = w>>4 (полных
* чанков, ≤20 при w<=320) и w&15 — хвост (SMC в ld b,#n хвостовой
* скобки). Заголовок чанка = dec e/jr nz (~46Т на чанк ≈ 2.9Т/линию
* против ~173Т/чанк у 16-бит арифметики через IX-слоты); precompute
* ~170Т однократно. Итог ~56Т/линию. Хвост — отдельная скобка со
* СВОИМ армированием (второй SMC-слот размера): армирование обязано
* быть в каждой скобке — в окне EI CBL-ISR армирует акселератор своим
* размером блока.
* против ~173Т/чанк у 16-бит арифметики через IX-слоты). Хвост —
* отдельная скобка со СВОИМ армированием (второй SMC-слот размера):
* армирование обязано быть в каждой скобке — в окне EI CBL-ISR
* армирует акселератор своим размером блока.
*
* ---- БЮДЖЕТ (полный разбор: docs/accel-fill-budget.md) -------------
* подготовка ~340Т один раз на прямоугольник (пролог 102 + SMC 45 +
* precompute ~110 + эпилог 54); чанк 16 колонок — 46Т; колонка — 53Т.
* T(n) ≈ 340 + 46*(n/16) + 53*n; ~107 байт кода. Break-even против
* простейшего per-line di/ei (djnz, 72Т/линию, ~63 байта): n ≈ 9 —
* при n <= 8 линий простейший быстрее (максимум +140Т на n=1).
*
* Прямой вызов оправдан, когда форма известна заранее (высокие/узкие
* прямоугольники, w <= h) — экономит ~160-245Т проверки диспетчера