/*
 * gfx_pal_load — загрузить блок записей графической палитры
 * (BIOS $A4 PIC_SET_PAL): pal_num 0..3, start — первый слот,
 * count слотов (0 = 256), data — записи по 4 байта (B, G, R, 0).
 *
 * Собственный inline-asm вместо тонкой обёртки над pal_load — тонкая
 * обёртка через __sdcccall(1)-передачу эмпирически ломала текстовую
 * палитру (следующая печать в текстовом режиме вешалась).
 */

#include "../_bgi.h"
#include <palette.h>

static uint8_t  gpl_num_;
static uint8_t  gpl_start_;
static uint8_t  gpl_count_;
static uint16_t gpl_data_;

void gfx_pal_load(uint8_t pal_num, uint8_t start, uint8_t count,
                  const uint8_t *data)
{
    gpl_num_   = pal_num;
    gpl_start_ = start;
    gpl_count_ = count;
    gpl_data_  = (uint16_t)(uintptr_t)data;

    __asm
        push  ix
        ld    a, (_gpl_start_)
        ld    e, a                  ; E = start
        ld    a, (_gpl_count_)
        ld    d, a                  ; D = count (0 = 256)
        ld    hl, (_gpl_data_)      ; HL = data
        ld    b, #0xFF              ; маска
        ld    a, (_gpl_num_)        ; A = номер палитры
        ld    c, #0xA4              ; BIOS PIC_SET_PAL
        rst   #0x08
        pop   ix
    __endasm;
}
