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
+20 -12
View File
@@ -62,8 +62,8 @@ int _videomode_raw_set(uint8_t mode);
extern uint8_t _gfx_saved_w3;
void _bgi_begin(void);
void _bgi_end(void);
void _bgi_begin(void) __preserves_regs(b,c,d,e,h,l);
void _bgi_end(void) __preserves_regs(b,c,d,e,h,l);
/* ---- LEAF-операции драйвера (bgi256/ или bgi16/) ----------------- *
* Каждая self-contained: raw-варианты НЕ ставят свою W3-скобку
@@ -86,17 +86,25 @@ unsigned _bgi_read (int x, int y);
void _bgi_hspan (int x, int y, int len, uint8_t color);
void _bgi_clearall(uint8_t color);
/* ---- Скретч акселератора 256 (bgi256/_gfx_acc256.c) -------------- *
* Общий для hspan/vspan/clear; однопоточно, IRQ выключены между
* _bgi_begin/_bgi_end. */
extern uint8_t _gfx_acc_color;
extern uint8_t _gfx_acc_y;
extern uint8_t _gfx_acc_len; /* 0 = 256 — конвенция акселератора */
extern uint16_t _gfx_acc_addr;
/* ---- Fill-burst'ы акселератора 256 (register-ABI, asm-only) ------ *
* Вызываются ТОЛЬКО из asm raw-примитивов; аргументы в регистрах, без
* глобального скретча в _DATA:
* HL = CPU-адрес (base + x), C = color,
* B = длина (0 = 256), E = y (строка для Port_Y).
* Клоббер A/F; сохраняют BC/DE/HL/IX/IY. Pre: W3 замаплен, IRQ гасятся
* внутри вокруг одного выстрела. Прототип void(void) — только чтобы
* линкер видел символ (реальный ABI регистровый, см. bgi256/_gfx_*fill256.c). */
/* Горизонтальный Fill-burst: _gfx_acc_len байт с _gfx_acc_addr на
* строке _gfx_acc_y (W3 замаплен, DI активен). */
void _gfx_hfill256_chunk(void);
/* Горизонтальный Fill-burst (bgi256/_gfx_hfill256.c). */
void _gfx_hfill256_segment(void);
/* Вертикальный Fill-burst (bgi256/_gfx_vfill256.c). */
void _gfx_vfill256_segment(void);
/* Заливка прямоугольника цветом: x, y, w, h, color.
* Механизм: один раз задаётся Horizontal_Size, затем в цикле по Y
* акселератор копирует байт цвета на ширину строки (docs/part2/accelerator_doc.txt). */
void _gfx_rectfill256(int x, int y, int w, int h, uint8_t color);
/* ---- Скретч 16-цветных примитивов (bgi16/_gfx_g16_state.c) ------- */
extern uint8_t _gfx_g16_y;