Odpověď na názor

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

  • Č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