libbgi: gfx_pal_sync + палитра ↔ файл (gfx_pal_fsave/fload); все PASS

- gfx_pal_sync(): палитра страницы 1 := палитре 0 (все 256 записей,
  чанками по 64 через общий буфер _gfx_pal_buf в W2) — обязательный
  шаг дабл-буфера (грабли examples/space: без него флип на страницу 1
  чёрный).  examples/space переведён на хелпер.
- gfx_pal_fsave(pal, path): 256 записей × 4 Б (B,G,R,0 — родной формат
  BIOS $A4) = 1024 Б.
- gfx_pal_fload(pal, path): принимает и усечённый файл (64 Б = палитра
  16 цветов) — грузит сколько есть, остальные слоты не трогает;
  возвращает число записей.

tests/palfile (MAME dev, все PASS): fsave; fload восстанавливает
испорченные слоты (n=256); усечённый файл на 2 записи чинит только их
(n=2, слот 2 не тронут); sync чинит испорченный слот палитры 1.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 16:51:49 +03:00
parent 8792594c5a
commit 6dea6955c2
10 changed files with 224 additions and 8 deletions
+6
View File
@@ -155,6 +155,12 @@ void _gfx_w0_isr(void);
#define _ATL_DIR_OFF 0x68u /* каталог: count × 8 Б (макс 19) */
#define _ATL_DATA_OFF 0x100u /* ленты; = резерв ISR-стаба */
/* ---- Палитровые хелперы (common/_gfx_pal_buf.c) ------------------- *
* Общий буфер чанковых операций (sync/fload/fsave): 64 записи × 4 Б;
* в W2 (BIOS $A4 требует буфер в #4000-#BFFF). */
#define _GFX_PAL_CHUNK 64u
extern uint8_t _gfx_pal_buf[_GFX_PAL_CHUNK * 4];
/* ---- Авто-анимация спрайтов (§9г) --------------------------------- *
* Тикер подключается указателем (DCE: программа без sprite_anim/
* sprite_moveto не тянет его код): дефолт NULL (_BSS), ставят