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>
31 lines
861 B
C
31 lines
861 B
C
/*
|
|
* gfx_pal_fsave — сохранить палитру pal_num (0..3) в файл: 256 записей
|
|
* по 4 байта (B, G, R, 0 — родной формат BIOS $A4), итого 1024 байта.
|
|
* Пишется чанками по 64 записи через общий буфер. 0 — OK; -1 + errno.
|
|
*/
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include "../_bgi.h"
|
|
|
|
int gfx_pal_fsave(uint8_t pal_num, const char *path)
|
|
{
|
|
uint8_t k, start = 0;
|
|
int fd, rc = 0;
|
|
|
|
fd = creat(path, 0);
|
|
if (fd < 0)
|
|
return -1;
|
|
|
|
for (k = 0; k < 4; k++) {
|
|
gfx_pal_get(pal_num, start, _GFX_PAL_CHUNK, _gfx_pal_buf);
|
|
if (write(fd, _gfx_pal_buf, _GFX_PAL_CHUNK * 4)
|
|
!= _GFX_PAL_CHUNK * 4) {
|
|
rc = -1;
|
|
break;
|
|
}
|
|
start += _GFX_PAL_CHUNK;
|
|
}
|
|
close(fd);
|
|
return rc;
|
|
}
|