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
tyjo jsem Atarista a znam docela dost dobre MOS 6502. Ale tady je videt, ze Z80 je o dost vic komplikovany. Tedy ne, ze by mel nejake slozite instrukce nebo chovani, ale zda se mi, ze je tady vic moznosti jak neco napsat.
Asi to ve vysledku byla vetsi zabava v tom psat, tezko po tech letech posoudit :)
PS: 6502 mela zase brutalnejsi adresovaci rezimy, ale porat to bylo +- "ortogonalni".