/*
 * _bgi_plot_raw — пиксель (x,y) цветом color, mode 0x81 (register-only asm).
 *
 * "Raw" = W3-naive: вызывающий уже сделал _bgi_begin (W3 на видеобанке, DI).
 * Адресация: CPU _gfx_addr_base + x, Port_Y (0x89) = y.
 *
 * __sdcccall(1): x→HL, y→DE (E=low), color→стек (1 байт над ret-адресом).
 * Всё считается в регистрах — ни статик-скретча, ни round-trip через _DATA
 * (самый горячий примитив: Брезенхэм в line/circle/fillpoly/draw_scaled).
 */

#include "../_bgi.h"

void _bgi_plot_raw(int x, int y, uint8_t color) __naked __preserves_regs(d,e)
{
    __asm
        .globl __gfx_addr_base
#ifndef GFX_NOCHECK
        ld    a, l
        sub   a, #0x40
        ld    a, h
        sbc   a, #0x01
        jr    NC, pp_done       ; (unsigned)x >= 320
        ld    a, d
        or    a, a
        jr    NZ, pp_done       ; (unsigned)y >= 256
#endif
        ld    a, e
        out   (#0x89), a        ; Port_Y = y
        ld    bc, (__gfx_addr_base)
        add   hl, bc            ; HL = base + x
        ld    c, l
        ld    b, h             ; BC = dest
        ld    hl, #2
        add   hl, sp
        ld    a, (hl)          ; A = color (со стека, SP+2)
        ld    h, b
        ld    l, c             ; HL = dest
        ld    (hl), a          ; выстрел
#ifndef GFX_NOCHECK
    pp_done:
#endif
        pop   hl              ; ret-адрес
        inc   sp             ; callee-pop байта color
        jp    (hl)
    __endasm;
}
