/*
 * _bgi_read_raw — прочитать пиксель (x,y), mode 0x81 (register-only asm).
 *
 * "Raw" = W3-naive: вызывающий уже сделал _bgi_begin (W3 на видеобанке, DI).
 * Для блиттинга: getimage/putimage читают тысячи пикселей в одной скобке.
 * За пределами экрана возвращает 0.
 *
 * __sdcccall(1): x→HL, y→DE (E=low); возврат uint8_t в A.  Всё в регистрах,
 * без статик-скретча (единый стиль с _bgi_plot_raw).
 */

#include "../_bgi.h"

uint8_t _bgi_read_raw(int x, int y) __naked __preserves_regs(d,e)
{
    (void)x; (void)y;
    __asm
        .globl __gfx_addr_base
#ifndef GFX_NOCHECK
        ld    a, l
        sub   a, #0x40
        ld    a, h
        sbc   a, #0x01
        jr    NC, rr_zero       ; (unsigned)x >= 320
        ld    a, d
        or    a, a
        jr    NZ, rr_zero       ; (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    a, (hl)           ; A = пиксель (возврат)
        ret
#ifndef GFX_NOCHECK
    rr_zero:
        xor   a, a
        ret
#endif
    __endasm;
}
