Files
Sprinter-SDCC/libbgi/bgi256/_bgi_vspan_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

86 lines
2.6 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_vspan_raw — вертикальная линия len пикселей от (x,y), mode 0x81,
* через Vertical 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_vfill256_segment передаём HL=addr, C=color, B=len, E=y (без
* глобального скретча). x держим в BC на время клипа (clip портит HL/DE),
* адрес считаем в конце. len усекается до байта: 256 -> 0 = «256».
*/
#include "../_bgi.h"
void _bgi_vspan_raw(int x, int y, int len, uint8_t color) __naked
{
__asm
.globl __gfx_addr_base
.globl __gfx_vfill256_segment
push ix
ld ix, #0
add ix, sp
#ifndef GFX_NOCHECK
ld a, l
sub a, #0x40
ld a, h
sbc a, #0x01
jr NC, vs_ret ; (unsigned)x >= 320
#endif
ld c, l
ld b, h ; BC = x (пережить клип)
#ifndef GFX_NOCHECK
bit 7, d
jr Z, vs_ypos
;; y < 0: len += y ; y = 0
ld l, 4 (ix)
ld h, 5 (ix)
add hl, de ; len + y (y отрицателен)
ld 4 (ix), l
ld 5 (ix), h
ld de, #0
vs_ypos:
ld a, d
or a, a
jr NZ, vs_ret ; y >= 256
;; y + len > 256 ? -> len = 256 - y
ld l, 4 (ix)
ld h, 5 (ix)
add hl, de ; y + len (D=0)
ld a, h
or a, a
jr Z, vs_lenchk ; < 256
dec a
jr NZ, vs_clamp ; high >= 2
ld a, l
or a, a
jr Z, vs_lenchk ; == 256
vs_clamp:
xor a, a
sub a, e ; 0 - y (низкий байт)
ld 4 (ix), a
ld a, #1
sbc a, #0 ; 1 - borrow => 256 - y
ld 5 (ix), a
vs_lenchk:
ld a, 4 (ix)
or a, 5 (ix)
jr Z, vs_ret ; len == 0
bit 7, 5 (ix)
jr NZ, vs_ret ; len < 0
#endif
ld hl, (__gfx_addr_base)
add hl, bc ; HL = base + x
ld a, 6 (ix)
ld c, a ; C = color
ld a, 4 (ix)
ld b, a ; B = len (256 -> 0)
call __gfx_vfill256_segment
vs_ret:
pop ix
pop hl
pop af
inc sp
jp (hl)
__endasm;
}