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 5:37

    _dw

    A nejtezsi cast nakonec. Prevod YX na adresu v HL. Najit efektivni cestu je tak slozity, ze jsem se rovnou podival jak jsem to resil nekdy predtim... .) Taky jsou v mem pasmu 4 rano... .)

    https://github.com/DW0RKiN/M4_FORTH/blob/master/M4/graphic_runtime.m4

    Po "drobne" uprave se da usetrit rovnych 6 bajtu!

    calc_pixel_address:
            ; parametry:
            ; B - x-ová souřadnice (v pixelech)
            ; C - y-ová souřadnice (v pixelech)
            ;
            ; návratové hodnoty:
            ; HL - adresa pro zápis pixelu
            ;
            ; pozměněné registry:
            ; A
            ;
            ; vzor adresy:
            ; 0 1 0 Y7 Y6 Y2 Y1 Y0 | Y5 Y4 Y3 X4 X3 X2 X1 X0
      if 1
        ld    A, C          ; 1:4       bbrrrsss = Y
        or    0x01          ; 2:7       bbrrrss1 carry = 0
        rra                 ; 1:4       0bbrrrss carry = 1
        rra                 ; 1:4       10bbrrrs carry = s?
        and   A             ; 1:4       10bbrrrs carry = 0
        rra                 ; 1:4       010bbrrr
        ld    L, A          ; 1:4       .....rrr
        xor   C             ; 1:4       ????????
        and   0xF8          ; 2:7       ?????000
        xor   C             ; 1:4       010bbsss
        ld    H, A          ; 1:4       H = 64+8*INT (b/64)+(b mod 8)
    
        ld    A, L          ; 1:4       .....rrr
        xor   B             ; 1:4       ???????? provede se 2x takze zadna zmena, mezitim ale vynulujeme hornich 5 bitu
        and   0x07          ; 2:7       00000???
        xor   B             ; 1:4       cccccrrr
        rrca                ; 1:4       rcccccrr
        rrca                ; 1:4       rrcccccr
        rrca                ; 1:4       rrrccccc
        ld    L, A          ; 1:4       L = 32*INT (b/(b mod 64)/8)+INT (x/8).
    
        ret                 ; 1:10      návrat z podprogramu
      else
            ld  a, c              ; všech osm bitů Y-ové souřadnice
            and %00000111         ; pouze spodní tři bity y-ové souřadnice (Y2 Y1 Y0)
                                  ; A: 0 0 0 0 0 Y2 Y1 Y0
            or  %01000000         ; "posun" do obrazové paměti (na 0x4000)
            ld  h, a              ; část horního bajtu adresy je vypočtena
                                  ; H: 0 1 0 0 0 Y2 Y1 Y0
    
            ld  a, c              ; všech osm bitů Y-ové souřadnice
            rra
            rra
            rra                   ; rotace doprava -> Y1 Y0 xx Y7 Y6 Y5 Y4 Y3
            and %00011000         ; zamaskovat
                                  ; A: 0  0  0 Y7 Y6  0  0  0
            or  h                 ; a přidat k vypočtenému mezivýsledku
            ld  h, a              ; H: 0  1  0 Y7 Y6 Y2 Y1 Y0
    
            ld  a, c              ; všech osm bitů Y-ové souřadnice
            rla
            rla                   ; A:  Y5 Y4 Y3 Y2 Y1 Y0 xx xx
            and %11100000         ; A:  Y5 Y4 Y3 0  0  0  0  0
            ld  l, a              ; část spodního bajtu adresy je vypočtena
    
            ld  a, b              ; všech osm bitů X-ové souřadnice
            rra
            rra
            rra                   ; rotace doprava -> 0  0  0  X7 X6 X5 X4
            and %00011111         ; A: 0  0  0  X7 X6 X5 X4 X3
            or  l                 ; A: Y5 Y3 Y3 X7 X6 X5 X4 X3
            ld  l, a              ; spodní bajt adresy je vypočten
    
            ret                   ; návrat z podprogramu
      endif