Files
Sprinter-SDCC/libbgi/bgi256/_bgi_hspan_raw.c
T
snark13 029607971f 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>
2026-07-10 14:32:21 +03:00

67 lines
2.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* _bgi_hspan_raw — горизонтальная линия len пикселей от (x,y), mode 0x81,
* через Fill-burst'ы акселератора (до 256 байт за выстрел). W3-naive:
* вызывающий обрамляет _bgi_begin/_bgi_end.
*
* __sdcccall(1): x→HL, y→DE(E=y), len→стек(4/5(ix)), color→стек(6(ix)).
* Значения передаются в _gfx_hfill256_segment через регистры (HL=addr,
* C=color, B=len, E=y) — без глобального скретча. len>256 (макс. ширина
* 320) → два burst'а: хвост (len-256) на addr+256, затем 256 на addr;
* усечение len до байта даёт (len-256) для 257..320 (256 -> 0 = «256»).
*/
#include "../_bgi.h"
void _bgi_hspan_raw(int x, int y, int len, uint8_t color) __naked
{
__asm
.globl __gfx_addr_base
.globl __gfx_hfill256_segment
push ix
ld ix, #0
add ix, sp
#ifndef GFX_NOCHECK
ld a, d
or a, a
jr NZ, hs_ret ; (unsigned)y >= 256
ld a, l
sub a, #0x40
ld a, h
sbc a, #0x01
jr NC, hs_ret ; (unsigned)x >= 320
#endif
ld c, l
ld b, h ; BC = x
ld hl, (__gfx_addr_base)
add hl, bc ; HL = base + x
ld a, 6 (ix)
ld c, a ; C = color
ld a, 5 (ix)
or a, a
jr Z, hs_single ; len < 256
ld a, 4 (ix)
or a, a
jr Z, hs_single ; len == 256 (B=0)
;; 257..320: два burst-a
push hl ; base addr
inc h ; addr + 256
ld a, 4 (ix)
ld b, a ; B = len-256 (низкий байт)
call __gfx_hfill256_segment
pop hl ; base addr
ld b, #0 ; 256
call __gfx_hfill256_segment
jr hs_ret
hs_single:
ld a, 4 (ix)
ld b, a ; B = len (0 если ==256)
call __gfx_hfill256_segment
hs_ret:
pop ix
pop hl
pop af
inc sp
jp (hl)
__endasm;
}