/*
 * _gfx_rmw16_pixel — RMW одного нибла по (_gfx_g16_addr, _gfx_g16_y):
 * прочитать байт, стереть целевой нибл маской _gfx_g16_mask, вписать
 * _gfx_g16_nibble.  ~10 инструкций на пиксель — медленно, но байт
 * покрывает два горизонтальных пикселя, иначе никак.
 * Pre: W3 замаплен, DI активен.
 */

#include "../_bgi.h"

void _gfx_rmw16_pixel(void) __naked
{
    __asm
        ld    a, (__gfx_g16_y)
        out   (#0x89), a

        ld    hl, (__gfx_g16_addr)
        ld    a, (__gfx_g16_mask)
        ld    b, a              ; B = маска сохранения
        ld    a, (__gfx_g16_nibble)
        ld    c, a              ; C = новый нибл (в нужной половине)
        ld    a, (hl)
        and   a, b              ; стереть целевой нибл
        or    a, c              ; вписать новый
        ld    (hl), a
        ret
    __endasm;
}
