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:
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* gfx_pal_fload — загрузить палитру pal_num (0..3) из файла формата
|
||||
* gfx_pal_fsave (записи по 4 байта: B, G, R, 0). Файл может быть
|
||||
* УСЕЧЁН: грузится столько полных записей, сколько есть (палитра
|
||||
* 16-цветной картинки — файл 64 байта), остальные слоты не трогаются.
|
||||
* Возврат: число загруженных записей (0..256) или -1 + errno.
|
||||
*
|
||||
* NB: заливает только палитру pal_num — для дабл-буфера после загрузки
|
||||
* в 0 звать gfx_pal_sync().
|
||||
*/
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include "../_bgi.h"
|
||||
|
||||
int gfx_pal_fload(uint8_t pal_num, const char *path)
|
||||
{
|
||||
int fd, n, total = 0;
|
||||
uint8_t start = 0;
|
||||
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
while (total < 256) {
|
||||
uint8_t entries;
|
||||
|
||||
n = read(fd, _gfx_pal_buf, _GFX_PAL_CHUNK * 4);
|
||||
if (n < 0) { close(fd); return -1; }
|
||||
entries = (uint8_t)(n / 4);
|
||||
if (!entries)
|
||||
break;
|
||||
gfx_pal_load(pal_num, start, entries, _gfx_pal_buf);
|
||||
start += entries;
|
||||
total += entries;
|
||||
if (n < (int)(_GFX_PAL_CHUNK * 4))
|
||||
break; /* конец файла */
|
||||
}
|
||||
close(fd);
|
||||
return total;
|
||||
}
|
||||
Reference in New Issue
Block a user