/* * _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; }