forked from gameboyadvancesp/understanding-pokemon-red
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgamefreak.asm
258 lines (233 loc) · 5.1 KB
/
gamefreak.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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
; VRAM と OAM に ゲーフリのロゴと流れ星を転送
; LCDは有効
LoadShootingStarGraphics:
ld a, $f9
ld [rOBP0], a
ld a, $a4
ld [rOBP1], a
; 星のタイル(左上, 1枚)
ld de, AnimationTileset2 + $30
ld hl, vChars1 + $200
lb bc, BANK(AnimationTileset2), $01
call CopyVideoData
; 星のタイル(左下, 1枚)
ld de, AnimationTileset2 + $130
ld hl, vChars1 + $210
lb bc, BANK(AnimationTileset2), $01
call CopyVideoData
; ゲーフリの文字から落ちてくる小さい星
ld de, FallingStar
ld hl, vChars1 + $220
lb bc, BANK(FallingStar), (FallingStarEnd - FallingStar) / $10
call CopyVideoData
; OAMにゲーフリのロゴをコピー
ld hl, GameFreakLogoOAMData
ld de, wOAMBuffer + $60
ld bc, GameFreakLogoOAMDataEnd - GameFreakLogoOAMData
call CopyData
; OAMに星をコピー
ld hl, GameFreakShootingStarOAMData
ld de, wOAMBuffer
ld bc, GameFreakShootingStarOAMDataEnd - GameFreakShootingStarOAMData
jp CopyData
; ゲーフリのロゴと流れ星のアニメーション
; CheckForUserInterruptionの実行時点でユーザーが特定のキー入力をしていた場合、キャリーを立てて戻る(アニメーションのスキップ処理)
; アニメーションがスキップされなかったときは、キャリーをクリアして戻る
AnimateShootingStar:
call LoadShootingStarGraphics ; VRAM と OAMの 準備
; 流れ星が落ちてくる音
ld a, SFX_SHOOTING_STAR
call PlaySound
; 大きい星を左下に移動させていく(左下への流れ星)
ld hl, wOAMBuffer
lb bc, $a0, $4
.bigStarLoop
push hl
push bc
.bigStarInnerLoop
ld a, [hl] ; Y
add 4
ld [hli], a
ld a, [hl] ; X
add -4
ld [hli], a
inc hl
inc hl
dec c
jr nz, .bigStarInnerLoop
ld c, 1
call CheckForUserInterruption ; アニメーションをスキップ
pop bc
pop hl
ret c
ld a, [hl]
cp 80
jr nz, .next
jr .bigStarLoop
.next
cp b
jr nz, .bigStarLoop
; 大きい星を OAM から削除
ld hl, wOAMBuffer
ld c, 4
ld de, 4
.clearOAMLoop
ld [hl], 160
add hl, de
dec c
jr nz, .clearOAMLoop
; ゲーフリのロゴを点滅させる
ld b, 3
.flashLogoLoop
ld hl, rOBP0
rrc [hl]
rrc [hl]
ld c, 10
call CheckForUserInterruption
ret c
dec b
jr nz, .flashLogoLoop
; 小さい星のタイルを OAM に 24枚配置する
; この時点でコピーされた 24枚の OAMが画面上にはない
ld de, wOAMBuffer
ld a, 24
.initSmallStarsOAMLoop
push af
ld hl, SmallStarsOAM
ld bc, SmallStarsOAMEnd - SmallStarsOAM
call CopyData
pop af
dec a
jr nz, .initSmallStarsOAMLoop
; ゲーフリのロゴの下から小さい星をたくさん降らすアニメーション
xor a
ld [wMoveDownSmallStarsOAMCount], a
ld hl, SmallStarsWaveCoordsPointerTable
ld c, 6
.smallStarsLoop
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
push bc
push hl
ld hl, wOAMBuffer + $50
ld c, 4
.smallStarsInnerLoop ; introduce new wave of 4 small stars OAM entries
ld a, [de]
cp $ff
jr z, .next2
ld [hli], a ; Y
inc de
ld a, [de]
ld [hli], a ; X
inc de
inc hl
inc hl
dec c
jr nz, .smallStarsInnerLoop
ld a, [wMoveDownSmallStarsOAMCount]
cp 24
jr z, .next2
add 6 ; should be 4, but the extra 2 aren't visible on screen
ld [wMoveDownSmallStarsOAMCount], a
.next2
call MoveDownSmallStars
push af
; 次のウェーブ(ループ)のために OAM を前のアドレス(+16)にずらす
ld hl, wOAMBuffer + $10 ; 0x10 = 16
ld de, wOAMBuffer
ld bc, $50 ; 0x50 = 80
call CopyData
pop af
pop hl
pop bc
ret c
dec c
jr nz, .smallStarsLoop
and a
ret
SmallStarsOAM:
db $00,$00,$A2,$90
SmallStarsOAMEnd:
SmallStarsWaveCoordsPointerTable:
dw SmallStarsWave1Coords
dw SmallStarsWave2Coords
dw SmallStarsWave3Coords
dw SmallStarsWave4Coords
dw SmallStarsEmptyWave
dw SmallStarsEmptyWave
; The stars that fall from the Gamefreak logo come in 4 waves of 4 OAM entries.
; These arrays contain the Y and X coordinates of each OAM entry.
SmallStarsWave1Coords:
db $68,$30
db $68,$40
db $68,$58
db $68,$78
SmallStarsWave2Coords:
db $68,$38
db $68,$48
db $68,$60
db $68,$70
SmallStarsWave3Coords:
db $68,$34
db $68,$4C
db $68,$54
db $68,$64
SmallStarsWave4Coords:
db $68,$3C
db $68,$5C
db $68,$6C
db $68,$74
SmallStarsEmptyWave:
db $FF
MoveDownSmallStars:
ld b, 8
.loop
ld hl, wOAMBuffer + $5c
ld a, [wMoveDownSmallStarsOAMCount]
ld de, -4
ld c, a
.innerLoop
inc [hl] ; Y
add hl, de
dec c
jr nz, .innerLoop
; Toggle the palette so that the lower star in the small stars tile blinks in
; and out.
ld a, [rOBP1]
xor %10100000
ld [rOBP1], a
ld c, 3
call CheckForUserInterruption
ret c
dec b
jr nz, .loop
ret
GameFreakLogoOAMData:
db $48,$50,$8D,$00
db $48,$58,$8E,$00
db $50,$50,$8F,$00
db $50,$58,$90,$00
db $58,$50,$91,$00
db $58,$58,$92,$00
db $60,$30,$80,$00
db $60,$38,$81,$00
db $60,$40,$82,$00
db $60,$48,$83,$00
db $60,$50,$93,$00
db $60,$58,$84,$00
db $60,$60,$85,$00
db $60,$68,$83,$00
db $60,$70,$81,$00
db $60,$78,$86,$00
GameFreakLogoOAMDataEnd:
GameFreakShootingStarOAMData:
db $00,$A0,$A0,$10
db $00,$A8,$A0,$30
db $08,$A0,$A1,$10
db $08,$A8,$A1,$30
GameFreakShootingStarOAMDataEnd:
FallingStar:
INCBIN "gfx/falling_star.2bpp"
FallingStarEnd: