Давай это будешь ты
---------- Post added at 16:42 ---------- Previous post was at 16:34 ----------
Кстати, есть смысл подумать над ускорением flat shading в пиксельном разрешении. В Iris Ultrademo обвязка сканлайна порядка 350 тактов, хотя отрисовка 11 тактов на байт (причём обычно рисуется как раз один байт).
Быстрый сканлайн мог бы выглядеть примерно так:
scanline1/2
ld c,n1/n2 ;текстура
exx
add hl,bc ;-Xl ;или +Xl
add ix,de ;-Xr ;или +Xr
ld a,h
exx
ld h,a
ld l,b ;#e0 ;или #1f
jp (hl) ;переход на ветку нужного Xl
:57
sub hx ;scan_width
add a,a ;или ld l,a,l,(hl) (-1t)
add a,a ;
ld l,a ;
ld a,e
and b ;#e0 ;или or b ;#1f
add a,N ;Xl/8+scrx ;или 31-(Xl/8+scrx)
jp (hl) ;переход на ветку нужной ширины в этом сегменте
:39 (-1)
ld e,a
jp ... ;переход на нужную рисовалку
для нулевой ширины:
inc d
ret ;выход без отрисовки
:14
рисовалка:
[ld a,(de)
xor c
and N ;scrmask
xor c
ld (de),a
inc e]
[ld a,c
dup N
ld (de),a
inc e
edup]
[ld a,(de)
xor c
and N ;scrmask
xor c
ld (de),a]
inc d
ret
:N+14
итого обвязка 114..128t (-1), включая inc d, ddeblock и 4(5) переходов
ddeblock
ld a,e
sub b ;#e0
ld e,a
jp nc,scanline1 ;или jr
ld a,d
sub 8
ld d,a
jp scanline1 ;или приклеить
:1/8*(47-25/8)=5.5 ;или 1/8*(37-15/8)=4.4
или:
ld a,e
add a,b ;#1f ;всё равно перейдёт на следующий сканлайн, а нам только это и надо
ld e,a
sbc a,a
and -8
add a,d
ld d,a
:1/8*31=3.9
стек (перед впрыгом надо вставить ловушку - quit):
scanline1
scanline2
scanline1
scanline2
scanline1
scanline2
scanline1
scanline2
ddeblock ;там jp scanline1
scanline2
scanline1
scanline2
...
quit
размер рисовалок:
для width=1..8: 4..15 байт ~9 (64 шт)
для width=9..16: 7..18 байт ~13 (64 шт)
для width=17..24: 9..20 байт ~15 (64 шт)
для width=25..32: 11..22 байт ~17 (64 шт) - итого ~3500 байт
...
дальше можно использовать 8*8 процедур с циклом от h,hx (l свободен):
[ld a,(de)
xor c
and N ;scrmask
xor c
ld (de),a
inc e]
ld a,hx ;-Xr
and #f8
ld l,a
ld a,h ;-Xl
and #f8
sub l
rra
srl a
srl a
dec a
ld l,a
;или dec l:ld l,(hl) (тогда inc e в рисовалках, и это выгодно)
;или ld l, в джампе на длинные линии (тогда в Xl-ветке ld l,a:ld l,(hl), и это выгодно)
ld a,c
ld (de),a
inc e
dec l
jnz $-3
[ld a,(de)
xor c
and N ;scrmask
xor c
ld (de),a]
inc d
ret
размер 24(10)..37(23) байт ~34(20) (64 шт) - итого 2176(1280)
По сравнению с размером сканлайнов (которые займут столько сегментов, сколько есть разных значений Xl, то есть порядка сотни) это - мелочь.



Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 



