-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfx8.asm
218 lines (189 loc) · 5.9 KB
/
fx8.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
section "fx8", ROM0
include "registers.asm"
include "memory.asm"
include "common.asm"
include "assets/gradient.inc"
DELAY equ 2
fx8_COUNTER1 equ $FF
fx8_COUNTER2 equ $FF
fx8_COUNTER3 equ $F0
fx8::
mResetFadeVariables
mResetLoader
mResetVars
mSetStates STATE_FADE_IN, STATE_RUN_FX
mEnableLoading
xor a
ld [current_index],a
ld [frames_rendered],a
ld [fx_counter], a
ld [fx_counter+1], a
ld [fx_counter+2], a
ld h,high(frame_list)
ld a,[current_index]
and a,$01
rl a
ld l,a
ld a,[hl+]
ld [current_frame],a
ld a,[hl+]
ld [current_frame+1],a
ld a,high(tiles_start)
ld [current_frame],a
ld a,low(tiles_start)
ld [current_frame+1],a
ld a, %11100100
ld [BGP], a
ld a, DELAY
ld [delay], a
ld a, [LCDC]
set 3, a
ld [LCDC], a
call fx8_loop
ret
fx8_loop:
mUpdateMusic
mDefineFadeLogic
mUpdateBackground
ld a, [fx_counter]
inc a
cp fx8_COUNTER1
jr nz, .end_scene
ld a, [fx_counter+1]
inc a
cp fx8_COUNTER2
jr nz, .end_scene1
ld a, [fx_counter+2]
inc a
cp fx8_COUNTER3
jr nz, .end_scene2
ld a, [current_state]
cp STATE_RUN_FX
jr nz, .end_scene2
mResetFadeVariables
mSetStates STATE_FADE_OUT, STATE_END_FX
.end_scene2:
ld [fx_counter+2], a
jr .cont
.end_scene1:
ld [fx_counter+1], a
jr .cont
.end_scene:
ld [fx_counter], a
.cont:
ld a, [delay]
dec a
ld [delay], a
jr nz, .vblank
ld a, DELAY
ld [delay], a
call run_fx
jr .skipvblank
.vblank:
mWaitVBlank
.skipvblank:
mJumpCheckEnding fx8_loop
run_fx:
.render_frame:
ld a,[current_frame] ; Frames are 16 bit addresses to tilemaps
ld d,a
ld a,[current_frame+1] ; So we load the high and low bytes into DE
ld e,a
ld hl,$9C00 ; Set the start VRAM address to write
ld c,18 ; Set C to 18. C will be our counter
.render_line:
mSetROMBank 4 ; First we set the ROM bank to 4
rept 20
ld a,[de] ; Unroll this loop that loads
ld [hl+],a ; a line of tilemap indices into VRAM
inc de
endr
dec c
ld a,c
ld [temp_y],a ; Decrement our counter C and save it
ld bc,$000C ; Offset the WRAM write address by $0C
add hl,bc ; because the total tiles in the map are 32
ld a,[temp_y]
ld c,a ; Restore our counter in C
jr nz,.render_line ; If the counter isn't 0 repeat .render_line
ld a,[frames_rendered]
inc a
ld [frames_rendered],a ; This will act as a delay for rendering
and $03 ; the next frame
jr nz,.render_frame ; if we render everything too fast it looks bad
.change_frame:
ld a,[current_index] ; Here we change to the next frame
inc a ; We increment the current frame index
and %111111 ; Mask it so we don't overflow the frame list
ld [current_index],a
ld h,high(frame_list) ; Load high byte for the address of the frame list
rl a ; Use the frame index as low byte but multiply by 2
ld l,a
ld a,[hl+] ; Store new frame low byte address
ld [current_frame+1],a
ld a,[hl+]
ld [current_frame],a ; Store new frame high byte address
mWaitVBlank
ret
section "frame_list_fx8", ROM0, ALIGN[8]
frame_list:
dw tile_1,tile_1,tile_1,tile_2,tile_2,tile_3,tile_3,tile_4,tile_4,tile_5,tile_5,tile_6,tile_6,tile_7,tile_7,tile_8,tile_8,tile_9,tile_10,tile_11,tile_12,tile_13,tile_14,tile_15,tile_15,tile_16,tile_17,tile_18,tile_19,tile_21,tile_23,tile_25,tile_26,tile_27,tile_27,tile_28,tile_28,tile_29,tile_30,tile_31,tile_32,tile_33,tile_33,tile_34,tile_35,tile_36,tile_36,tile_36,tile_37,tile_38,tile_39,tile_40,tile_41,tile_42,tile_42,tile_43,tile_43,tile_44,tile_44,tile_45,tile_45,tile_46,tile_46,tile_47,tile_47,tile_48,tile_48
section "tilesfx8", ROMX, BANK[4], ALIGN[8]
tiles_start:
tile_1: incbin "assets/sh1.tiles"
tile_2: incbin "assets/sh2.tiles"
tile_3: incbin "assets/sh3.tiles"
tile_4: incbin "assets/sh4.tiles"
tile_5: incbin "assets/sh5.tiles"
tile_6: incbin "assets/sh6.tiles"
tile_7: incbin "assets/sh7.tiles"
tile_8: incbin "assets/sh8.tiles"
tile_9: incbin "assets/sh9.tiles"
tile_10: incbin "assets/sh10.tiles"
tile_11: incbin "assets/sh11.tiles"
tile_12: incbin "assets/sh12.tiles"
tile_13: incbin "assets/sh13.tiles"
tile_14: incbin "assets/sh14.tiles"
tile_15: incbin "assets/sh15.tiles"
tile_16: incbin "assets/sh16.tiles"
tile_17: incbin "assets/sh17.tiles"
tile_18: incbin "assets/sh18.tiles"
tile_19: incbin "assets/sh19.tiles"
tile_21: incbin "assets/sh21.tiles"
tile_23: incbin "assets/sh23.tiles"
tile_25: incbin "assets/sh25.tiles"
tile_26: incbin "assets/sh26.tiles"
tile_27: incbin "assets/sh27.tiles"
tile_28: incbin "assets/sh28.tiles"
tile_29: incbin "assets/sh29.tiles"
tile_30: incbin "assets/sh30.tiles"
tile_31: incbin "assets/sh31.tiles"
tile_32: incbin "assets/sh32.tiles"
tile_33: incbin "assets/sh33.tiles"
tile_34: incbin "assets/sh34.tiles"
tile_35: incbin "assets/sh35.tiles"
tile_36: incbin "assets/sh36.tiles"
tile_37: incbin "assets/sh37.tiles"
tile_38: incbin "assets/sh38.tiles"
tile_39: incbin "assets/sh39.tiles"
tile_40: incbin "assets/sh40.tiles"
tile_41: incbin "assets/sh41.tiles"
tile_42: incbin "assets/sh42.tiles"
tile_43: incbin "assets/sh43.tiles"
tile_44: incbin "assets/sh44.tiles"
tile_45: incbin "assets/sh45.tiles"
tile_46: incbin "assets/sh46.tiles"
tile_47: incbin "assets/sh47.tiles"
tile_48: incbin "assets/sh48.tiles"
tiles_end:
; =======================
section "Varsfx8", WRAM0
; =======================
; VARIABLES
; =======================
temp_y:: ds $01
current_index:: ds $01
current_frame:: ds $02
frames_rendered:: ds $01
delay:: ds $01
; =======================