Odpovídáte na názor k článku Vývoj pro ZX Spectrum: vlastní vykreslovací subrutiny potřetí. Názory mohou přidávat pouze registrovaní uživatelé. Nově přidané názory se na webu objeví až po schválení redakcí.
Optimalizovana varianta:
calc_pixel_value:
; parametry:
; B - x-ová souřadnice (v pixelech)
;
; návratové hodnoty:
; A - hodnota pixelu
push bc ; zapamatovat si hodnotu v registru B
ld a, b ; A: X7 X6 X5 X4 X3 X2 X1 X0
and %00000111 ; A: 0 0 0 0 0 X2 X1 X0
ld b, a ; počitadlo smyčky (neměníme příznaky)
ld a, %10000000 ; výchozí maska (neměníme příznaky)
jr z, end_calc ; pokud je nyní souřadnice nulová, zapíšeme výchozí masku + konec
next_shift:
srl a ; posunout masku doprava
djnz next_shift ; 1x až 7x
end_calc:
pop bc ; obnovit hodnotu v registru B
ret ; návrat z podprogramu
"srl a" je dvoubajtova instrukce na 8 taktu. Lepsi je pouzit "polovicni" "rrca".
Da se usetrit jeste jeden bajt kdyz se vyhodi podmineny skok a nahradi za inc a zmenime masku.
calc_pixel_value:
; parametry:
; B - x-ová souřadnice (v pixelech)
;
; návratové hodnoty:
; A - hodnota pixelu
if 0
push bc ; 1:11 zapamatovat si hodnotu v registru B
ld a, b ; 1:4 A: X7 X6 X5 X4 X3 X2 X1 X0
and %00000111 ; 2:7 A: 0 0 0 0 0 X2 X1 X0
ld b, a ; 1:4 počitadlo smyčky
inc b ; 1:4 počitadlo smyčky + 1
ld a, %00000001 ; 2:7 výchozí maska
rrca ; 1:4 posunout masku doprava
djnz $-1 ; 2:8/13 1x až 8x
pop bc ; 1:10 obnovit hodnotu v registru B
ret ; 1:10 návrat z podprogramu
else
ld a, b ; 1:4 A: X7 X6 X5 X4 X3 X2 X1 X0
and %00000111 ; 2:7 A: 0 0 0 0 0 X2 X1 X0
cpl ; 1:4 xor FF
rlca ; 1:4
rlca ; 1:4
rlca ; 1:4
ld ($+5),A ; 3:13
xor A ; 1:4
set 0,A ; 2:8
ret ; 1:10 návrat z podprogramu
endif
A nebo zvolit trosku silenou (ne kazdeho tohle napadne) variantu, s nemenym casem a samomodifikujicim se kodem.
21. 3. 2023, 04:54 editováno autorem komentáře