/*
 * _gfx_hfill16_chunk — горизонтальный Fill-burst акселератора для
 * mode 0x82: _gfx_g16_len байт значения _gfx_g16_byte с _gfx_g16_addr
 * на строке _gfx_g16_y.  Один burst красит до 256 байт = 512 пикселей.
 * Pre: W3 замаплен, DI активен.
 *
 * SMC только у байта длины.  Цвет предзагружается в C и уходит через
 * `ld a, c` (0x79) — вставить ещё один `ld a,#n` между LD C,C и
 * стреляющим LD (HL),A нельзя: FSM акселератора перечитает immediate
 * как новый размер блока.
 */

#include "../_bgi.h"

void _gfx_hfill16_chunk(void) __naked
{
    __asm
        ld    a, (__gfx_g16_len)
        ld    (_hfill16_len_imm), a

        ld    a, (__gfx_g16_byte)
        ld    c, a

        ld    a, (__gfx_g16_y)
        out   (#0x89), a

        ld    hl, (__gfx_g16_addr)

        ld    d, d              ; 0x52 — режим размера блока
        ld    a, #0             ; 0x3E nn — длина (патчится)
    _hfill16_len_imm = . - 1
        ld    c, c              ; 0x49 — горизонтальный Fill
        ld    a, c              ; 0x79 — A = байт цвета
        ld    (hl), a           ; выстрел
        ld    b, b              ; 0x40 — выключить
        ret
    __endasm;
}
