/* * pal_load — записать блок палитровых записей в VRAM * (BIOS $A4 PIC_SET_PAL): pal_num 0..7, start — первый слот, * count слотов (0 = 256), bgr0 — записи по 4 байта (B, G, R, 0). * * ВНИМАНИЕ: BIOS выбирает окно ПО АДРЕСУ БУФЕРА (исходник * docs/sources/Sprinter-BIOS/bios/exp/FUNC_SCREEN.ASM: `BIT 7,H` -> SLOT3 * либо SLOT1). Буфер выше 0x8000 — а на стеке он всегда там — заставляет * BIOS занять W1, где лежат резидентный код и вектор прерываний; на это * время ISR недоступен. В PoP это слышно как скрежет при затемнении. * Рядом со звуком пользуйтесь gfx_pal_write из libbgi: он пишет * видеопамять напрямую. */ #include "_palette.h" void pal_load(uint8_t pal_num, uint8_t start, uint8_t count, const uint8_t *bgr0) { _pal_num = pal_num; _pal_start = start; _pal_count = count; _pal_data = (uint16_t)(uintptr_t)bgr0; __asm push ix ld a, (__pal_start) ld e, a ; E = start ld a, (__pal_count) ld d, a ; D = count (0 = 256) ld hl, (__pal_data) ; HL = данные ld b, #0xFF ; B = маска (без AND) ld a, (__pal_num) ; A = номер палитры (бит 7 = 0: запись) ld c, #0xA4 ; BIOS PIC_SET_PAL rst #0x08 pop ix __endasm; }