Files
Sprinter-SDCC/tests/atlas/gen_frames.py
T
snark13 0e935343d9 libbgi: W0-атласы спрайтов — загрузчик, движок, упаковщик (все проверки PASS)
Реализация §3.1/§9в: атлас = один .atl-файл = одна EMM-страница,
подключаемая в W0 на время блита.

- atlas_load: read() файла целиком в страницу через W3 + патч ISR-стаба
  (0x38: JP _gfx_w0_isr; 0x66: RETN); atlas_free/atlas_image/
  atlas_sprite_init; gfx_w0_map/unmap для ручных вызовов.
- _gfx_w0_isr (стаб из tests/w0page): свап на ядро DSS → честный 0x38 →
  restore спрайт-страницы; покрывает IM1 и IM2-чейн.
- sprite_t.page (0 = обычная память); sprite_update в блит-проходе
  мапит страницу по смене (один OUT на атлас), эпилог возвращает DSS
  (+52 Б на движок — цена фичи).
- toolchain/mkatlas.py: PNG (indexed) / raw → .atl; заголовок 0x100,
  каталог 0x68 (19 лент), файл-офсет == офсет страницы == W0-адрес.
- Сплит _gfx_sprite_fns → _gfx_blit_fn.c + _gfx_heal_fn.c (1 указатель
  = 1 модуль): putsprite-only программа не тянет heal-ядро (spriteclip
  ловил +292 Б; теперь −68 Б от эталона).

tests/atlas (MAME dev, PASS): загрузка (count/страница), каталог и
данные по W0-адресам (заголовок ленты через gfx_w0_map), 3 спрайта из
двух лент через движок — пиксели проверены read_vram побайтно
(0x10/0x12/0x21, прозрачный угол = фон).

docs: §9г — предложение авто-анимации (кадровая ±step без умножений,
tween-Брезенхэм порциями, тикер через funcptr) — ОБСУЖДАЕТСЯ.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 15:52:00 +03:00

30 lines
1.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""Генератор тестовых лент для tests/atlas (сырые байты для mkatlas.py).
frames1.raw — 16×16, 4 кадра вертикально (16×64): кадр k = заливка
0x10+k, рамка 0x04, углы 0xFF (прозрачные).
frames2.raw — 24×24, 2 кадра вертикально (24×48): кадр k = заливка
0x20+k, рамка 0x0E, углы 0xFF.
"""
def strip(fw, fh, n, fill0, border):
out = bytearray()
for k in range(n):
for y in range(fh):
for x in range(fw):
edge_x = x in (0, fw - 1)
edge_y = y in (0, fh - 1)
if edge_x and edge_y:
out.append(0xFF) # прозрачный угол
elif edge_x or edge_y:
out.append(border)
else:
out.append(fill0 + k)
return out
open("frames1.raw", "wb").write(strip(16, 16, 4, 0x10, 0x04))
open("frames2.raw", "wb").write(strip(24, 24, 2, 0x20, 0x0E))
print("gen_frames: frames1.raw (16x16x4), frames2.raw (24x24x2)")