Hlavní navigace

Vlákno názorů k článku Vývoj pro ZX Spectrum: vlastní vykreslovací subrutiny potřetí od _dw - Optimalizovana varianta: calc_pixel_value: ...

  • Článek je starý, nové názory již nelze přidávat.
  • 21. 3. 2023 4:53

    _dw

    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

  • 21. 3. 2023 7:50

    atarist

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

  • 23. 3. 2023 18:46

    patron

    A všechny mnemotechnické instrukce na MOS 6502 byly ve stejném tříznakovém formátu od délce 1-3 bajty. Což bylo velmi přehledné a elegantní:

    LDA ($22),Y
    STA $69
    LDA $61
    RTS
    DEY
    STA $22
    STY $23
    LDY #$04
    JSR $04B0