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:
2026-07-10 14:32:21 +03:00
parent 52636a5d6e
commit 029607971f
31 changed files with 618 additions and 283 deletions
+36
View File
@@ -0,0 +1,36 @@
/*
* _gfx_vfill256_segment — вертикальный Fill-burst акселератора (register-ABI).
*
* ВХОД (регистры; вызывается ТОЛЬКО из asm — raw-примитивами):
* HL = CPU-адрес колонки (base + x)
* C = цвет
* B = длина (0 = 256 — конвенция акселератора)
* E = y (стартовая строка для Port_Y)
* Клоббер: A, F. Сохраняет BC/DE/HL/IX/IY (все accel-опкоды — no-op'ы по
* регистрам; см. _gfx_hfill256.c). Pre: W3 замаплен (вызывающий сделал _bgi_begin).
*
* Опкоды: LD D,D (0x52) размер блока (SMC-immediate), LD E,E (0x5B)
* вертикальный Fill, LD B,B (0x40) выключить.
*/
#include "../_bgi.h"
void _gfx_vfill256_segment(void) __naked
{
__asm
ld a, b
ld (_vfill256_len_imm), a ; SMC: размер блока <- B
ld a, e
out (#0x89), a ; Port_Y <- E (y)
di
ld d, d ; 0x52 режим размера блока
ld a, #0
_vfill256_len_imm = . - 1
ld e, e ; 0x5B вертикальный Fill (E=y, no-op)
ld a, c ; 0x79 A = цвет
ld (hl), a ; выстрел; заливает len байт
ld b, b ; 0x40 выключить (B=len, no-op)
ei
ret
__endasm;
}