Vlákno názorů k článku Vývoj her a dem pro ZX Spectrum: vlastní vykreslovací subrutiny od _dw - Jak ctu kapitolu 15. tak jsem si uvedomil,...

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

    _dw

    Jak ctu kapitolu 15. tak jsem si uvedomil, ze jsem udelal chybu ve vypoctu prechodu adresy znaku mezi tretinama.
    Nemohu komentovat ani opravit komentar co nebyl (jeste) schvalen takze pisi novy prispevek. Opravena verze je o bajt delsi a takt rychlejsi (zmena je jen pod djnz loop).

    loop:
        ld    A,(HL)        ; 1:7    načtení jednoho bajtu z masky
        ld  (DE),A          ; 1:7    zápis hodnoty na adresu (DE)
        inc   L             ; 1:4    posun na další bajt masky
        inc   D             ; 1:4    posun na definici dalšího obrazového řádku
        djnz loop           ; 2:8/13 vnitřní smyčka: blok s osmi zápisy
        inc   E             ; 1:4
        ret   z             ; 1:5/11 D+=8,E=E+1=0
        ld    D, C          ; 1:4
        ret                 ; 1:10   D=D,E=E+1

    V 15. kapitole rutina calc_block_address se ta taky vylepsit, kdyz misto rra se pouzije rrca.
    Puvodni:

    calc_block_address:
        ; parametry:
        ; B - x-ová souřadnice (ve znacích, ne pixelech)
        ; C - y-ová souřadnice (ve znacích, ne pixelech)
        ;
        ; návratové hodnoty:
        ; HL - adresa pro zápis bloku
        ;
        ; vzor adresy:
        ; 0 1 0 Y4 Y3 0 0 0 | Y2 Y1 Y0 X4 X3 X2 X1 X0
        ld    A, C          ; 1:4
        and %00000111       ; 2:7    pouze spodní tři bity y-ové souřadnice (řádky 0..7)
        rra                 ; 1:4
        rra                 ; 1:4
        rra                 ; 1:4
        rra                 ; 1:4    nyní jsou čísla řádků v horních třech bitech
        or    B             ; 1:4    připočítat x-ovou souřadnici
        ld    L, A          ; 1:4    máme spodní bajt adresy
                            ;        Y2 Y1 Y0 X4 X3 X2 X1 X0
        ld    A, C          ; 1:4    y-ová souřadnice
        and %00011000       ; 2:7    dva bity s indexem "bloku" 0..3 (dolní tři bity už máme zpracovány)
        or  %01000000       ; 2:7    "posun" do obrazové paměti (na 0x4000)
        ld    H, A          ; 1:4    máme horní bajt adresy
                            ;        00 01 00 Y4 Y3 00 00 00
        ret                 ; 1:10   návrat z podprogramu

    Nove:

    calc_block_address:
        ; parametry:
        ; B - x-ová souřadnice (ve znacích, ne pixelech)
        ; C - y-ová souřadnice (ve znacích, ne pixelech)
        ;
        ; návratové hodnoty:
        ; HL - adresa pro zápis bloku
        ;
        ; vzor adresy:
        ; 0 1 0 Y4 Y3 0 0 0 | Y2 Y1 Y0 X4 X3 X2 X1 X0
        ld    A, C          ; 1:4
        rrca                ; 1:4
        rrca                ; 1:4
        rrca                ; 1:4
        and %11100000       ; 2:7    nyní jsou čísla řádků v horních třech bitech
        or    B             ; 1:4    připočítat x-ovou souřadnici
        ld    L, A          ; 1:4    máme spodní bajt adresy
                            ;        Y2 Y1 Y0 X4 X3 X2 X1 X0
        ld    A, C          ; 1:4    y-ová souřadnice
        and %00011000       ; 2:7    dva bity s indexem "bloku" 0..3 (dolní tři bity už máme zpracovány)
        or  %01000000       ; 2:7    "posun" do obrazové paměti (na 0x4000)
        ld    H, A          ; 1:4    máme horní bajt adresy
                            ;        00 01 00 Y4 Y3 00 00 00
        ret                 ; 1:10   návrat z podprogramu
  • 2. 3. 2023 8:25

    Pavel Tišnovský
    Zlatý podporovatel

    ah to je taky pěkné. Ja to ta tak popravde v prvni verzi mel, ale uz nezbylo misto na popis tohoto triku rotace doprava. Taky bych to s dovolenim priste pouzil = je to ok pls?