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:
@@ -1,21 +1,41 @@
|
||||
/*
|
||||
* _bgi_clear_raw — залить всё поле 320×256 цветом color, mode 0x81.
|
||||
* Построчный hfill: 256 строк × 2 burst'а (256 + 64 байта) = 512.
|
||||
* W3-naive: вызывающий обрамляет begin/end.
|
||||
* 320 вертикальных Fill-burst'ов (по колонке 256 строк), Port_Y=0.
|
||||
* Register-only asm, без глобального скретча. W3-naive: вызывающий
|
||||
* обрамляет _bgi_begin/_bgi_end. color → A (__sdcccall(1)).
|
||||
*/
|
||||
|
||||
#include "../_bgi.h"
|
||||
|
||||
void _bgi_clear_raw(uint8_t color)
|
||||
void _bgi_clear_raw(uint8_t color) __naked
|
||||
{
|
||||
_gfx_acc_color = color;
|
||||
for (int y = 0; y < GFX_HEIGHT; y++) {
|
||||
_gfx_acc_y = (uint8_t)y;
|
||||
_gfx_acc_addr = _gfx_addr_base; /* burst 256 байт */
|
||||
_gfx_acc_len = 0;
|
||||
_gfx_hfill256_chunk();
|
||||
_gfx_acc_addr = (uint16_t)(_gfx_addr_base + 256); /* burst 64 байта */
|
||||
_gfx_acc_len = 64;
|
||||
_gfx_hfill256_chunk();
|
||||
}
|
||||
__asm
|
||||
ld c, a ; color -> c
|
||||
xor a, a
|
||||
out (#0x89), a ; Port_Y = 0
|
||||
|
||||
ld hl, (__gfx_addr_base) ; HL = база draw-страницы (0xC000/0xC140)
|
||||
ld de, #0x0000
|
||||
|
||||
_clear_cyc0:
|
||||
ld a, e ; if DE >= 320 - return
|
||||
sub a, #0x40
|
||||
ld a, d
|
||||
sbc a, #0x01
|
||||
ret NC
|
||||
|
||||
;; --- ПОСЛЕДОВАТЕЛЬНОСТЬ АКСЕЛЕРАТОРА ---
|
||||
di
|
||||
ld d, d ; 0x52 — режим размера блока
|
||||
ld a, #0 ; 0x3E 0 — размер (256 точек по высоте)
|
||||
ld e, e ; 0x5B — вертикальный Fill
|
||||
ld a, c ; 0x79 — A = цвет (НЕ ещё один ld a,#n)
|
||||
ld (hl), a ; выстрел; заливает _gfx_acc_len байт
|
||||
ld b, b ; 0x40 — выключить
|
||||
ei
|
||||
|
||||
inc hl
|
||||
inc de
|
||||
jr _clear_cyc0
|
||||
__endasm;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user