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".