Files
Sprinter-SDCC/libbgi/bgi256/_gfx_rectfill256.c
T
snark13 029607971f libbgi: bgi256 fill-примитивы на register-ABI + typedef color_t
- удалён глобальный скретч акселератора (_gfx_acc256.c); fill-сегменты
  (_gfx_hfill256/_gfx_vfill256) принимают аргументы в регистрах HL/C/B/E,
  вызываются только из asm raw-примитивов
- новый _gfx_rectfill256: заливка прямоугольника через Horizontal_Size
- raw-примитивы (plot/read/hspan/vspan/clear) переписаны под новый ABI
- graphics.h: typedef color_t (uint8_t) для всех public color-функций
- sprinter-cc: флаг --safe (линковка *_safe.lib при наличии)
- CLAUDE.md/mame_interactive: авто-прогон тестов в MAME
- gfx_demo: демонстрация rectfill

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 14:32:21 +03:00

92 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* _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<h
jr C, rf_vbranch
or a, b
jr Z, rf_vbranch ; w==h -> не (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;
}