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>
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* _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;
|
||||
}
|
||||
Reference in New Issue
Block a user