6dea6955c2
- 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>
100 lines
3.4 KiB
C
100 lines
3.4 KiB
C
/*
|
|
* palfile — тест палитровых хелперов: gfx_pal_sync / gfx_pal_fsave /
|
|
* gfx_pal_fload. Программные проверки (gfx_pal_get_color), MAME —
|
|
* только хост.
|
|
*
|
|
* P1 fsave: сохранить дефолтную палитру 0 → PAL0.PAL (1024 Б).
|
|
* P2 fload: испортить слоты 1 и 200 → fload(0) вернул 256 и ОБА
|
|
* слота восстановились (полный файл).
|
|
* P3 усечённый файл: записать 2 записи (8 Б) → испортить слоты 0,1,2
|
|
* → fload вернул 2, слоты 0,1 восстановлены, слот 2 НЕ тронут.
|
|
* P4 sync: испортить слот 5 палитры 1 → gfx_pal_sync() → слот 5
|
|
* палитры 1 == слоту 5 палитры 0.
|
|
*/
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <graphics.h>
|
|
#include <gfx.h>
|
|
|
|
static uint8_t eq(uint8_t p, uint8_t i, uint8_t r, uint8_t g, uint8_t b)
|
|
{
|
|
uint8_t rr, gg, bb;
|
|
|
|
gfx_pal_get_color(p, i, &rr, &gg, &bb);
|
|
return rr == r && gg == g && bb == b;
|
|
}
|
|
|
|
static void get3(uint8_t p, uint8_t i, uint8_t *rgb)
|
|
{
|
|
gfx_pal_get_color(p, i, rgb, rgb + 1, rgb + 2);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
uint8_t a[3], c[3], ok;
|
|
int n;
|
|
|
|
puts("PALFILE: pal sync/fsave/fload");
|
|
initgraph();
|
|
|
|
/* ---- P1: сохранить дефолт ---------------------------------------- */
|
|
ok = (gfx_pal_fsave(0, "pal0.pal") == 0);
|
|
closegraph();
|
|
printf("P1 fsave: %s\n", ok ? "PASS" : "FAIL");
|
|
if (!ok) return 1;
|
|
|
|
initgraph();
|
|
/* ---- P2: полный fload восстанавливает испорченное ----------------- */
|
|
get3(0, 1, a); /* эталоны */
|
|
get3(0, 200, c);
|
|
gfx_pal_set(0, 1, 63, 0, 63); /* испортить */
|
|
gfx_pal_set(0, 200, 1, 2, 3);
|
|
n = gfx_pal_fload(0, "pal0.pal");
|
|
ok = (n == 256) && eq(0, 1, a[0], a[1], a[2])
|
|
&& eq(0, 200, c[0], c[1], c[2]);
|
|
closegraph();
|
|
printf("P2 fload: %s (n=%d)\n", ok ? "PASS" : "FAIL", n);
|
|
|
|
initgraph();
|
|
/* ---- P3: усечённый файл ------------------------------------------- */
|
|
{
|
|
int fd = creat("pal2.pal", 0);
|
|
uint8_t two[8];
|
|
uint8_t i;
|
|
|
|
/* первые 2 записи из pal0.pal */
|
|
for (i = 0; i < 8; i++) two[i] = 0;
|
|
{
|
|
int f0 = open("pal0.pal", O_RDONLY);
|
|
read(f0, two, 8);
|
|
close(f0);
|
|
}
|
|
write(fd, two, 8);
|
|
close(fd);
|
|
}
|
|
get3(0, 0, a);
|
|
get3(0, 1, c);
|
|
gfx_pal_set(0, 0, 63, 63, 0);
|
|
gfx_pal_set(0, 1, 0, 63, 63);
|
|
gfx_pal_set(0, 2, 7, 7, 7); /* слот 2 портим НАВСЕГДА */
|
|
n = gfx_pal_fload(0, "pal2.pal");
|
|
ok = (n == 2) && eq(0, 0, a[0], a[1], a[2])
|
|
&& eq(0, 1, c[0], c[1], c[2])
|
|
&& eq(0, 2, 7, 7, 7); /* не тронут fload'ом */
|
|
closegraph();
|
|
printf("P3 trunc: %s (n=%d)\n", ok ? "PASS" : "FAIL", n);
|
|
|
|
initgraph();
|
|
/* ---- P4: sync ------------------------------------------------------ */
|
|
get3(0, 5, a);
|
|
gfx_pal_set(1, 5, 1, 1, 1); /* испортить у страницы 1 */
|
|
gfx_pal_sync();
|
|
ok = eq(1, 5, a[0], a[1], a[2]);
|
|
closegraph();
|
|
printf("P4 sync: %s\n", ok ? "PASS" : "FAIL");
|
|
|
|
puts("done");
|
|
return 0;
|
|
}
|