tests/w0page + docs §9в: атласы в страницах W0 — probe-тест (все PASS)
Схема: атлас в EMM-странице, на время sprite_update страница
подключается в W0. Все прерывания исполняют 0x38 текущей страницы W0
(IM1 напрямую, IM2-трамплин чейнит jp 0x0038) — защита: стаб в первых
0x100 байтах страницы (0x38: JP на W2-хелпер: свап на страницу DSS →
честный 0x38 → restore спрайт-страницы; 0x66: RETN).
Проверено в dev-MAME (tests/w0page, все PASS):
P1 ESTEX READ в W3-замапленную страницу;
P3 IM1: ~5 c busy-цикла с EI при странице в W0 — жив, сентинел цел;
P4 IM2: 100 кадровых прерываний посчитаны при подключенной странице
(тракт трамплин→чейн→стаб→DSS→restore);
P5 accel-блит src=0x0100 (W0) — пиксели верны по ОЗУ-копии.
Формат .atl в §3.1 дополнен: атлас ≤ 16К−0x100 (одна страница, один
файл), вариант II — 0x100-заголовок, файл-офсет == офсет страницы ==
W0-адрес, загрузка = read() целиком + патч стаба. На железе
перепроверить.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -195,10 +195,27 @@ sy=j*fh. (w/h ленты при этом задублированы: вывод
|
||||
построению: ленты разных размеров просто конкатенируются. Пример
|
||||
(два спрайта 16×16 на 8 и 12 вариаций + один 24×24 на 4): шапка 8 +
|
||||
каталог 24 + (4+2048) + (4+3072) + (4+2304) = 7468 байт, паддинг 0.
|
||||
Ограничение u16-offset: файл ≤ 64 КБ (для больших — версия 'SPA2' с
|
||||
u24/u32, пока не нужна). Загрузчик — тонкий хелпер (fread целиком +
|
||||
арифметика каталога) + Python-упаковщик (PNG → .atl) в toolchain;
|
||||
делать по потребности первого реального приложения.
|
||||
Привязка к W0-страницам (решение 2026-07-13, см. §9в): один атлас =
|
||||
одна EMM-страница = один файл. Размер данных атласа ограничен
|
||||
16К − 0x100 (страница минус резерв ISR-стаба); если данных больше —
|
||||
следующий атлас в ОТДЕЛЬНОМ файле на своей странице (sprite_t.page их
|
||||
различает). Два варианта офсетов в каталоге:
|
||||
|
||||
I. offset = адрес в W0 (0x0100-based): каталог сразу содержит
|
||||
готовые указатели, данные в файле идут после каталога впритык.
|
||||
II. файл несёт 0x100-байтовый заголовок, so that файл-офсет ==
|
||||
офсет в странице == W0-адрес: загрузчик читает файл ЦЕЛИКОМ в
|
||||
offset 0 страницы и лишь патчит стаб (3 байта JP в 0x38, RETN в
|
||||
0x66). Раскладка заголовка: 0x00-0x07 магия+count,
|
||||
0x08-0x37 резерв, 0x38-0x3A и 0x66-0x67 — место под патч стаба,
|
||||
0x68-0xFF каталог (19 записей × 8 Б). Файл ≤ 16384 Б ровно.
|
||||
|
||||
Рекомендуется II: загрузка = один read() страницы, замапленной в W3
|
||||
(приём проверен в mdview2) + патч 5 байт; офсеты совпадают в файле,
|
||||
странице и W0 — нечего пересчитывать. Вариант I оставляет атласам
|
||||
возможность жить в обычной памяти (malloc-буфер) без страницы.
|
||||
Python-упаковщик (PNG → .atl) в toolchain и загрузчик — делать по
|
||||
потребности первого реального приложения.
|
||||
|
||||
## 4. Внутренности
|
||||
|
||||
@@ -648,6 +665,41 @@ noclip доехал до приложения. С vsync-капом оба ва
|
||||
ВНИМАНИЕ: noclip требует гарантии приложения, что спрайты целиком на
|
||||
экране — выход за край портит соседнюю память (tests/spriteclip).
|
||||
|
||||
## 9в. Атласы в страницах W0 (дизайн 2026-07-13; probe-тест PASS)
|
||||
|
||||
Атласы грузятся в EMM-страницы (mem_alloc_pages) и на время
|
||||
sprite_update подключаются в W0 (OUT 0x82) — W2-heap свободен от
|
||||
спрайтов, объём = EMM (~3.4 МБ). Загрузка — read() в страницу,
|
||||
замапленную в W3 (приём mdview2; вне рендера W3 свободна).
|
||||
|
||||
ОПАСНОСТЬ: все прерывания исполняют 0x38 текущей страницы W0 — IM1
|
||||
напрямую, наш IM2-трамплин чейнит jp 0x0038 (libc/irq/_irq_tramp.c);
|
||||
не ходит в W0 только личный CBL-путь. ЗАЩИТА — стаб на каждой
|
||||
странице (первые 0x100 байт зарезервированы):
|
||||
0x38: JP <w0_isr_stub в W2>; 0x66: RETN (NMI).
|
||||
Стаб: свап W0 на страницу ядра DSS (снята со старта IN A,(0x82)) →
|
||||
подложить возврат на стек → jp 0x0038 (честный обработчик, EI/RETI) →
|
||||
хвост: ВОССТАНОВИТЬ спрайт-страницу (_w0_cur) → ret. Restore
|
||||
обязателен (закрывает EI-щель между out(0x82) движка и DI leaf'а);
|
||||
один стаб покрывает IM1 и IM2-чейн; вложенное прерывание в хвосте
|
||||
безопасно (W0 в этот момент = DSS, стаб не реентерится).
|
||||
|
||||
ПРАВИЛО: пока спрайт-страница в W0 — НИКАКИХ ESTEX/BIOS (RST-диспетчер
|
||||
живёт на странице DSS). Движок: пролог/эпилог sprite_update
|
||||
сохраняет/возвращает страницу DSS; sprite_t получит поле page.
|
||||
|
||||
Probe-тест tests/w0page (MAME dev, 2026-07-13, ВСЕ PASS):
|
||||
P1 ESTEX READ в W3-замапленную страницу;
|
||||
P3 IM1: busy-цикл ~5 c с EI при странице в W0 — жив, сентинел цел;
|
||||
P4 IM2 (irq_install): 100 кадровых прерываний посчитаны при
|
||||
подключенной странице (полный тракт трамплин→чейн→стаб→DSS→
|
||||
restore), сентинел цел;
|
||||
P5 accel-блит src = 0x0100 (W0) банком 0x50 — пиксели верны по
|
||||
ОЗУ-копии (getpixel).
|
||||
На железе перепроверить вместе с остальным. Альтернатива без стабов —
|
||||
W1, но только tiny (в small/big/huge в W1 код) — отвергнута в пользу
|
||||
универсального W0.
|
||||
|
||||
## 10. Риски / что проверить артефактом (Фаза 0)
|
||||
|
||||
Статус 2026-07-11: пп. 1–3 закрыты для MAME 0.283 (tests/gfxbanks,
|
||||
|
||||
Reference in New Issue
Block a user