/* * _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; }