-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmenu.asm
390 lines (359 loc) · 7.14 KB
/
menu.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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
InitializeMenu:
JSR _Initialize
JSR _DisableNMI
JSR PrecalculateCounters
JSR PrecalculateAvailableSets
JSR _SetMenuPointer
JSR _WaitForVBlank
RTS
PrecalculateAvailableSets:
LDX #$FF
STX level_sets_unlocked
PrecalculateAvailableSetsStep:
INX
INC level_sets_unlocked
LDA total_levels_cleared
CMP levels_to_unlock, x
BCS PrecalculateAvailableSetsStep
RTS
PrecalculateCounters:
LDX #$00
LDA level_set_counter
STA level_hi
LDA level_set
STA level_lo
STX level_set_counter
STX level_set
STX total_levels
STX total_levels_cleared
PrecalculateCountersStep:
STX offset_y
TXA
ASL a
ASL a
ASL a
STA offset_x
LDA medals, x
STA dividend
LDA #$00
STA dividend + 1
JSR SetDivisor
JSR Hex2Dec
CopyMedalDigits:
LDA offset_x
CLC
ADC #$04
TAY
JSR _SetDigitTargetBox
LDX #SCORE_DIGITS
JSR _CopyDigits
LDA offset_y
ASL a
TAX
LDA scores, x
STA dividend
INX
LDA scores, x
STA dividend + 1
JSR _SaveMedal
JSR SetDivisor
JSR Hex2Dec
JSR CopyScoreDigits
CheckIfLevelCleared:
LDA level_cleared
BEQ IncrementLevel
AddClearedLevel:
INC levels_cleared
INC total_levels_cleared
IncrementLevel:
INC total_levels
INC level_set_counter
LDX level_set
LDA level_set_count, x
CMP level_set_counter
BNE PrecalculateCountersStepEnd
JSR SaveLevelSetStatistics
ResetLevelSetCounter:
INC level_set
LDA #$00
STA level_set_counter
STA levels_cleared
PrecalculateCountersStepEnd
LDX offset_y
INX
CPX #LEVELS
BNE PrecalculateCountersStep
JSR SaveGlobalStatistics
RestoreVariables:
LDA level_hi
STA level_set_counter
LDA level_lo
STA level_set
RTS
CopyScoreDigits:
LDY offset_x
LDX #SCORE_DIGITS
LDA #$00
STA level_cleared
CopyScoreDigit:
LDA decimal, x
STA [digit_target_lo], y
BEQ CopyScoreDigitIncrement
INC level_cleared
CopyScoreDigitIncrement:
INY
DEX
BPL CopyScoreDigit
RTS
SaveLevelSetStatistics:
JSR _SetDigitTargetCounters
LDA levels_cleared
STA dividend
JSR SetDivisor
JSR Hex2Dec
LDA level_set
ASL a
ASL a
TAY
STY index
LDX #LEVELS_DIGITS
JSR _CopyDigits
SaveLevelSetLevelCount:
LDA level_set_counter
STA dividend
JSR SetDivisor
JSR Hex2Dec
LDA index
CLC
ADC #$02
TAY
LDX #LEVELS_DIGITS
JSR _CopyDigits
RTS
SaveGlobalStatistics:
JSR _SetDigitTargetCounters
LDA total_levels_cleared
STA dividend
JSR SetDivisor
JSR Hex2Dec
LDY #GLOBAL_STATISTICS_OFF
LDX #TOTAL_DIGITS
JSR _CopyDigits
CopyClearedLevelsCountDigits:
LDA total_levels
STA dividend
JSR SetDivisor
JSR Hex2Dec
LDY #GLOBAL_STATISTICS_OFF + TOTAL_DIGITS + 1
LDX #TOTAL_DIGITS
JSR _CopyDigits
RTS
MenuLogic:
JSR _CalculateLevelSetOffset
LDX screen_movement
BEQ CheckIfLevelSelected
ChangePalettes:
DEC screen_movement
JSR _PrepareAndLoadPalettes
JSR _ResetPPU
JMP MenuLogicEnd
CheckIfLevelSelected:
LDX screen_offset
BEQ ContinueMenuLogic
JSR DrawUpcomingLevel
JSR _ResetPPU
JMP MenuLogicEnd
ContinueMenuLogic:
LDA speed
AND #%00000001
BNE DrawStatistics
DrawLevelTexts:
JSR _CalculateTextRange
JSR _DrawLevelTexts
JMP MenuDrawEnd
DrawStatistics:
JSR _DrawScores
JSR _DrawLevels
JSR _DrawLevelSetText
JSR _DrawSoundOptionChoice
JSR _DrawMusicOptionChoice
MenuDrawEnd:
INC speed
JSR _ResetPPU
DrawArrows:
LDA #$F0
STA SPR_ADDRESS_LARROW + $00
STA SPR_ADDRESS_LARROW + $04
STA SPR_ADDRESS_RARROW + $00
STA SPR_ADDRESS_RARROW + $04
LDA #$18
STA SPR_ADDRESS_RARROW + $01
STA SPR_ADDRESS_RARROW + $05
STA SPR_ADDRESS_LARROW + $01
STA SPR_ADDRESS_LARROW + $05
LDA #$03
STA SPR_ADDRESS_RARROW + $02
LDA #$83
STA SPR_ADDRESS_RARROW + $06
LDA #$43
STA SPR_ADDRESS_LARROW + $02
LDA #$C3
STA SPR_ADDRESS_LARROW + $06
DrawLeftArrow:
LDA level_set
CMP #$01
BCC DrawRightArrow
JSR _DrawLeftArrow
DrawRightArrow:
LDA level_set
CLC
ADC #$01
CMP level_sets_unlocked
BEQ ReadMenuController
JSR _DrawRightArrow
ReadMenuController:
JSR _LatchController
JSR _ReadController
CheckIfButtonPressed:
LDA button_pressed
BNE CheckNoInput
JMP CheckInput
CheckNoInput:
LDA input
BEQ JumpToReleaseController
JMP MenuLogicEnd
JumpToReleaseController:
JMP ReleaseController
CheckInput:
LDA input
CMP #$01
BEQ JumpToMoveCursorRight
CMP #$02
BEQ JumpToMoveCursorLeft
CMP #$04
BEQ JumpToMoveCursorDown
CMP #$08
BEQ JumpToMoveCursorUp
CMP #$10
BEQ JumpToEnterLevel
CMP #$40
BEQ JumpToToggleSound
CMP #$80
BEQ JumpToToggleMusic
JMP ReleaseController
JumpToMoveCursorRight:
JMP MoveCursorRight
JumpToMoveCursorLeft:
JMP MoveCursorLeft
JumpToMoveCursorUp:
JMP MoveCursorUp
JumpToMoveCursorDown:
JMP MoveCursorDown
JumpToToggleSound:
JMP ToggleSound
JumpToToggleMusic:
JMP ToggleMusic
JumpToEnterLevel:
JMP EnterLevel
MoveCursorLeft:
INC screen_movement
INC button_pressed
LDA level_set
BNE ChangeLevelSetLeft
JMP SetCursor
ChangeLevelSetLeft:
JSR _PlaySoundChangeSet
DEC level_set
LDA #$00
STA screen_offset
STA speed
STA level_set_counter
JMP SetCursor
MoveCursorRight:
INC screen_movement
INC button_pressed
LDA level_set
CLC
ADC #$01
CMP level_sets_unlocked
BNE CheckIfLastLevelSet
JMP SetCursor
CheckIfLastLevelSet:
CMP #LEVEL_SETS
BNE ChangeLevelSetRight
JMP SetCursor
ChangeLevelSetRight:
JSR _PlaySoundChangeSet
INC level_set
LDA #$00
STA screen_offset
STA speed
STA level_set_counter
JMP SetCursor
MoveCursorDown:
INC button_pressed
LDA level_set_counter
LDX level_set
LDA level_set_count, x
SEC
SBC #$01
CMP level_set_counter
BNE ScrollDown
JMP SetCursor
ScrollDown
JSR _PlaySoundScroll
INC level_set_counter
JMP SetCursor
MoveCursorUp:
INC button_pressed
LDA level_set_counter
BNE ScrollUp
JMP SetCursor
ScrollUp:
JSR _PlaySoundScroll
DEC level_set_counter
JMP SetCursor
EnterLevel:
INC screen_offset
JSR _HideCursor
JSR _CalculateNextLevelPointer
JMP MenuLogicEnd
SetCursor:
JSR _CalculateAndSetCursorPosition
JMP MenuLogicEnd
ToggleSound:
INC button_pressed
LDA sound_off
JSR _Toggle
STA sound_off
JMP MenuLogicEnd
ToggleMusic:
INC button_pressed
LDA music_off
JSR _Toggle
STA music_off
JMP MenuLogicEnd
ReleaseController:
LDA #$00
STA button_pressed
MenuLogicEnd:
RTS
DrawUpcomingLevel:
LDA #$24
STA ppu_address
JSR _SetLevelPointer
JSR _RedrawLevelStep
BNE DrawUpcomingLevelEnd
RTS
DrawUpcomingLevelEnd:
LDA #$00
STA level_loading
STA screen_offset
LDA #$01
STA game
JSR _DisableNMI
JSR InitializeGame
JSR _EnterLevel
JSR _EnableNMI
DrawUpcomingLevelLoop:
JMP DrawUpcomingLevelLoop