Vlákno názorů k článku Vykreslování spritů a animací na ZX Spectru od _dw - Vyzkousel jsem jeste rutinu co zabira pro kazdy...

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

    _dw

    Vyzkousel jsem jeste rutinu co zabira pro kazdy sprite dvojnasobek pameti, protoze ma pribalenou jeste masku pro mazani sveho okoli.
    Kazdy bajt je ulozen jako 16 bitova hodnota. Spodnich 8 bitu je ten sprite a hornich 8 bitu je maska. Nacita se to pres nastaveni SP na adresu spritu.
    Na zacatku vykresluji jeste pozadi, aby bylo videt co to dela.

    SCREEN_ADR      equ $4000
    ENTRY_POINT     equ $8000
    
            org ENTRY_POINT
    
    start:
            ld  a, %01010101
            ld de, 0x0020
            ld hl, 0x4000
            ld  c, 24
    chessboard_pattern:
            ld  b, 8
            ld (hl), a
            add hl, de
            djnz $-2
            cpl
            dec c
            jr nz, chessboard_pattern
    
            push hl                 ; 0x5800
    finish:
            pop  hl
            ld   de, -0x0020
            add  hl, de
            bit  6, h
            jr  nz, $+5
            ld   hl, 0x57E0
            push hl
    
            ld   d, h
            ld   e, l
            inc  e
            ld   a,(hl)
            rrca
            ld (hl), a
            ld  bc, 31
            ldir                     ; nakresli jeden pixelovy radek sachoveho pozadi
    
            ld b, 15                 ; x-ová souřadnice
            ld c, 3                  ; y-ová souřadnice
            call calc_sprite_address ; výpočet adresy spritu
            call draw_sprite
    
            ld b, 29                 ; x-ová souřadnice
            ld c, 21                 ; y-ová souřadnice
            call calc_sprite_address ; výpočet adresy
            call draw_sprite
    
    
            jr finish                ; žádný návrat do systému
    
    
    calc_sprite_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:
            ; DE - 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
            and %00000111            ; pouze spodní tři bity y-ové souřadnice (řádky 0..7)
            rrca
            rrca
            rrca                     ; nyní jsou čísla řádků v horních třech bitech
            or  b                    ; připočítat x-ovou souřadnici
            ld  e, a                 ; máme spodní bajt adresy
                                     ; Y2 Y1 Y0 X4 X3 X2 X1 X0
    
            ld  a, c                 ; y-ová souřadnice
            and %00011000            ; dva bity s indexem "bloku" 0..3 (dolní tři bity už máme zpracovány)
            or  %01000000            ; "posun" do obrazové paměti (na 0x4000)
            ld  d, a                 ; máme horní bajt adresy
                                     ; 0 1 0 Y5 Y4 0 0 0
            ret                      ; návrat z podprogramu
    
    
    draw_sprite:
            ld hl, SPRITE_ADR        ; 3:10
            ld  c, 3                 ; 2:7          výška spritu v řádcích
    draw_sprite_1:
            di                       ; 1:4
            ld (draw_sprite_e+1), sp ; 4:20
            ld sp, hl                ; 1:6          adresa, od níž začíná maska spritu
            ex de, hl                ; 1:4
                                    ;[12:51]
    draw_sprite_2:
            ld  b, 8                 ; 2:7          počitadlo zapsaných řádků
    
    
    draw_sprite_3:
            pop de                   ; 1:10         ; první sloupec
            ld  a, (hl)              ; 1:7
            and d                    ; 1:4
            xor e                    ; 1:4
            ld (hl), a               ; 1:7
    
            inc l                    ; 1:4
    
            pop de                   ; 1:10         ; druhý sloupec
            ld  a, (hl)              ; 1:7
            and d                    ; 1:4
            xor e                    ; 1:4
            ld (hl), a               ; 1:7
    
            inc l                    ; 1:4
    
            pop de                   ; 1:10         ; třetí sloupec
            ld  a, (hl)              ; 1:7
            and d                    ; 1:4
            xor e                    ; 1:4
            ld (hl), a               ; 1:7
    
            dec l                    ; 1:4
            dec l                    ; 1:4
            inc h                    ; 1:4          posun na definici dalšího obrazového řádku
            djnz draw_sprite_3       ; 2:13/8       vnitřní smyčka: blok s 3x osmi zápisy
                                    ;[22:1027=8*129-5]
    
    
            dec c                    ; 1:4
            jr  z, draw_sprite_e     ; 2:7/12
    
            ld  a, l                 ; 1:4
            add a, 0x20              ; 2:7
            ld  l, a                 ; 1:4
            jr  c, draw_sprite_2     ; 2:7/12
    
            ld  a, h                 ; 1:4
            sub 0x08                 ; 2:7
            ld  h, a                 ; 1:4
            jr  draw_sprite_2        ; 2:12
    
    draw_sprite_e:
            ld  sp, 0x0000           ; 3:10
            ei                       ; 1:4
            ret                      ; 1:10         návrat z podprogramu
    
    
    SPRITE_ADR
            db %00000000, %11111111, %00000000, %11111111, %00000000, %11111111   ; 1
            db %00000000, %11111110, %00000000, %00001111, %00000000, %11101111
            db %00000001, %11111100, %11110000, %00000111, %00010000, %11000111
            db %00000011, %11111000, %00111000, %00000000, %00010000, %11000111
            db %00000101, %11110000, %11010111, %00000000, %00010000, %00000111
            db %00000101, %11110000, %11001100, %00000000, %00010000, %11000111
            db %00000101, %11110000, %00110000, %00000001, %00010000, %11000111
            db %00000100, %11110000, %11001000, %00000001, %00010000, %11000111
            db %00000111, %11110000, %00110110, %00000000, %00010000, %11000111   ; 2
            db %00001100, %11100000, %11111110, %00000000, %00111000, %00000011
            db %00011111, %11000000, %11111000, %00000000, %00000000, %00000111
            db %00000000, %11100000, %00000000, %00000000, %00110000, %00000111
            db %00000011, %11111000, %11111111, %00000000, %10110000, %00000111
            db %00000101, %11110000, %11111110, %00000000, %11100000, %00001111
            db %00001110, %11100000, %11111101, %00000000, %11000000, %00011111
            db %00011000, %11000000, %11111100, %00000000, %00000000, %00111111
            db %00011000, %11000000, %00000000, %00000011, %00000000, %11111111   ; 3
            db %00000001, %11100100, %11111000, %00000011, %00000000, %11111111
            db %00000011, %11111000, %11111100, %00000001, %00000000, %11111111
            db %00000001, %11111100, %10110000, %00000011, %00000000, %11111111
            db %00000010, %11111000, %00001100, %00000001, %00000000, %11111111
            db %00000111, %11100000, %00001110, %01100000, %00000000, %01111111
            db %00011110, %11000000, %00000111, %11110000, %10000000, %00111111
            db %00000000, %11100001, %00000000, %11111000, %00000000, %01111111
    
    end ENTRY_POINT
  • 26. 7. 2023 21:55

    _dw

    Jde to vlastne i rovnou pomoci DE

    draw_sprite:
            ld hl, SPRITE_ADR        ; 3:10
            ld  c, 3                 ; 2:7          výška spritu v řádcích
    draw_sprite_1:
            di                       ; 1:4
            ld (draw_sprite_e+1), sp ; 4:20
            ld sp, hl                ; 1:6          adresa, od níž začíná maska spritu
                                    ;[11:47]
    draw_sprite_2:
            ld  b, 8                 ; 2:7          počitadlo zapsaných řádků
    
    
    draw_sprite_3:
            pop hl                   ; 1:10         ; první sloupec
            ld  a, (de)              ; 1:7
            and h                    ; 1:4
            xor l                    ; 1:4
            ld (de), a               ; 1:7
    
            inc e                    ; 1:4
    
            pop hl                   ; 1:10         ; druhý sloupec
            ld  a, (de)              ; 1:7
            and h                    ; 1:4
            xor l                    ; 1:4
            ld (de), a               ; 1:7
    
            inc e                    ; 1:4
    
            pop hl                   ; 1:10         ; třetí sloupec
            ld  a, (de)              ; 1:7
            and h                    ; 1:4
            xor l                    ; 1:4
            ld (de), a               ; 1:7
    
            dec e                    ; 1:4
            dec e                    ; 1:4
            inc d                    ; 1:4          posun na definici dalšího obrazového řádku
            djnz draw_sprite_3       ; 2:13/8       vnitřní smyčka: blok s 3x osmi zápisy
                                    ;[22:1027=8*129-5]
    
    
            dec c                    ; 1:4
            jr  z, draw_sprite_e     ; 2:7/12
    
            ld  a, e                 ; 1:4
            add a, 0x20              ; 2:7
            ld  e, a                 ; 1:4
            jr  c, draw_sprite_2     ; 2:7/12
    
            ld  a, d                 ; 1:4
            sub 0x08                 ; 2:7
            ld  d, a                 ; 1:4
            jr  draw_sprite_2        ; 2:12
    
    draw_sprite_e:
            ld  sp, 0x0000           ; 3:10
            ei                       ; 1:4
            ret                      ; 1:10         návrat z podprogramu

    26. 7. 2023, 21:55 editováno autorem komentáře