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:
+20
-12
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user