/* * _gfx_rectfill256 — заливка прямоугольника (x,y,w,h) цветом color, mode 0x81. * * Выбор ориентации burst'а: если w>h и w<=256 — гоним h горизонтальных * Fill'ов шириной w (y++ на каждой строке); иначе w вертикальных Fill'ов * высотой h (addr++ на каждой колонке). Инварианты (color=C, len=B) и * бегущий addr=HL/y=E живут в регистрах через весь цикл — _gfx_*_segment * их сохраняет; счётчик другой размерности крутится в его стек-слоте. * * __sdcccall(1): x→HL, y→DE(E=y); w→4/5(ix), h→6/7(ix), color→8(ix). * Pre: W3 замаплен, DI активен вокруг выстрелов внутри segment'ов. * Вызывающий управляет _bgi_begin/_bgi_end. w,h предполагаются >= 0. */ #include "../_bgi.h" void _gfx_rectfill256(int x, int y, int w, int h, uint8_t color) __naked { __asm .globl __gfx_addr_base .globl __gfx_hfill256_segment .globl __gfx_vfill256_segment push ix ld ix, #0 add ix, sp ld bc, (__gfx_addr_base) add hl, bc ; HL = base + x (бегущий addr) ld a, 8 (ix) ld c, a ; C = color ;; --- ветка: w>h && w<=256 ? (unsigned, w/h >= 0) --- ld a, 4 (ix) sub a, 6 (ix) ld b, a ; (w-h) низкий ld a, 5 (ix) sbc a, 7 (ix) ; CF=1 если w не (w>h) ld a, 5 (ix) ; w high cp a, #2 jr NC, rf_vbranch ; w >= 512 dec a jr NZ, rf_hbranch ; high==0 -> w<256 ld a, 4 (ix) or a, a jr NZ, rf_vbranch ; high==1,low!=0 -> w>256 rf_hbranch: ld a, 4 (ix) ld b, a ; B = len = w (256 -> 0) rf_hloop: ld a, 6 (ix) or a, 7 (ix) jr Z, rf_done ; h == 0 call __gfx_hfill256_segment inc e ; y++ ld a, 6 (ix) sub a, #1 ld 6 (ix), a ld a, 7 (ix) sbc a, #0 ld 7 (ix), a jr rf_hloop rf_vbranch: ld a, 6 (ix) ld b, a ; B = len = h (256 -> 0) rf_vloop: ld a, 4 (ix) or a, 5 (ix) jr Z, rf_done ; w == 0 call __gfx_vfill256_segment inc hl ; addr++ ld a, 4 (ix) sub a, #1 ld 4 (ix), a ld a, 5 (ix) sbc a, #0 ld 5 (ix), a jr rf_vloop rf_done: pop ix pop hl pop af pop af inc sp jp (hl) __endasm; }