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
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 podprogramu26. 7. 2023, 21:55 editováno autorem komentáře