-
Notifications
You must be signed in to change notification settings - Fork 0
/
125-shifted-sprite.asm
158 lines (125 loc) · 4.58 KB
/
125-shifted-sprite.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
; This article is part of series:
; "Vývoj pro slavné ZX Spectrum"
; https://www.root.cz/serialy/vyvoj-pro-slavne-zx-spectrum/
;
; Repository:
; https://github.com/tisnik/8bit-fame
;
; Example #124:
; Load 8 shifted sprites from include files.
; Draw 24x24 sprites on screen.
SCREEN_ADR equ $4000
ENTRY_POINT equ $8000
org ENTRY_POINT
draw_shifted_sprite MACRO index
ld hl, SPRITE_ADR+(index*24*4) ; adresa, od níž začíná maska spritu
call draw_sprite
endm
start:
ld b, 0 ; x-ová souřadnice
ld c, 2 ; y-ová souřadnice
call calc_sprite_address ; výpočet adresy spritu
draw_shifted_sprite 0
ld b, 0 ; x-ová souřadnice
ld c, 5 ; y-ová souřadnice
call calc_sprite_address ; výpočet adresy spritu
draw_shifted_sprite 1
ld b, 0 ; x-ová souřadnice
ld c, 9 ; y-ová souřadnice
call calc_sprite_address ; výpočet adresy
draw_shifted_sprite 2
ld b, 0 ; x-ová souřadnice
ld c, 12 ; y-ová souřadnice
call calc_sprite_address ; výpočet adresy
draw_shifted_sprite 3
ld b, 0 ; x-ová souřadnice
ld c, 16 ; y-ová souřadnice
call calc_sprite_address ; výpočet adresy
draw_shifted_sprite 4
ld b, 0 ; x-ová souřadnice
ld c, 19 ; y-ová souřadnice
call calc_sprite_address ; výpočet adresy
draw_shifted_sprite 5
finish:
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
;
; popis struktury obrazové paměti:
; https://www.root.cz/clanky/vyvoj-her-a-dem-pro-zx-spectrum-vlastni-vykreslovaci-subrutiny/#k03
;
; postup výpočtu adresy:
; https://www.root.cz/clanky/vyvoj-her-a-dem-pro-zx-spectrum-vlastni-vykreslovaci-subrutiny/#k15
;
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
add_e MACRO n ; zvýšení hodnoty regitru E
ld a, e
add a, n
ld e, a
endm
draw_sprite:
push de
call draw_8_lines ; vykreslit prvních 8 řádků spritu
pop de
add_e 32 ; zvýšit E o hodnotu 32
push de
call draw_8_lines ; vykreslit druhých 8 řádků spritu
pop de
add_e 32 ; zvýšit E o hodnotu 32
call draw_8_lines ; vykreslit třetích 8 řádků spritu
ret ; návrat z podprogramu
draw_8_lines:
ld b, 8 ; počitadlo zapsaných řádků
loop:
ld a,(hl) ; načtení jednoho bajtu z masky
ld (de),a ; zápis hodnoty na adresu (DE)
inc hl ; posun na další bajt masky
inc e
ld a,(hl) ; načtení jednoho bajtu z masky
ld (de),a ; zápis hodnoty na adresu (DE)
inc hl ; posun na další bajt masky
inc e
ld a,(hl) ; načtení jednoho bajtu z masky
ld (de),a ; zápis hodnoty na adresu (DE)
inc hl ; posun na další bajt masky
inc e
ld a,(hl) ; načtení jednoho bajtu z masky
ld (de),a ; zápis hodnoty na adresu (DE)
inc hl ; posun na další bajt masky
inc d ; posun na definici dalšího obrazového řádku
dec e ; korekce - posun zpět pod první osmici pixelů
dec e ; dtto
dec e ; dtto
djnz loop ; vnitřní smyčka: blok s 4x osmi zápisy
ret ; návrat z podprogramu
SPRITE_ADR
include "sprite_0.asm"
include "sprite_1.asm"
include "sprite_2.asm"
include "sprite_3.asm"
include "sprite_4.asm"
include "sprite_5.asm"
include "sprite_6.asm"
include "sprite_7.asm"
end ENTRY_POINT