-
Notifications
You must be signed in to change notification settings - Fork 1
/
titleroutines.asm
453 lines (363 loc) · 8.28 KB
/
titleroutines.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
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
;
; titleroutines.asm
; Part of the game dúshlán for the NES
;
; Copyright (c) 2016 Peter McQuillan
;
; All Rights Reserved.
;
; Distributed under the BSD Software License (see license.txt)
;
;
;; Title screen loop
; This is the title screen loop. Here we show the game logo, show options that the player
; can configure and play the title music
TitleScreen:
JSR WaitFrame ; wait for the NMI VBlank
JSR ClearScreen
LDA #<dushlanlogo1
STA logoaddr
LDA #>dushlanlogo1
STA logoaddr + 1
JSR PrintWordsWithBlocks
LDA #<dushlanlogo2
STA logoaddr
LDA #>dushlanlogo2
STA logoaddr + 1
JSR PrintWordsWithBlocks
LDA #<copyright_str
STA textprintaddr
LDA #>copyright_str
STA textprintaddr + 1
JSR WriteTextToScreen
LDA #<music_by_str
STA textprintaddr
LDA #>music_by_str
STA textprintaddr + 1
JSR WriteTextToScreen
LDA #<msg_menu_start
STA textprintaddr
LDA #>msg_menu_start
STA textprintaddr + 1
JSR WriteTextToScreen
LDA #<msg_menu_difficulty
STA textprintaddr
LDA #>msg_menu_difficulty
STA textprintaddr + 1
JSR WriteTextToScreen
LDA #<msg_menu_dropmethod
STA textprintaddr
LDA #>msg_menu_dropmethod
STA textprintaddr + 1
JSR WriteTextToScreen
LDA #<msg_menu_ingamemusic
STA textprintaddr
LDA #>msg_menu_ingamemusic
STA textprintaddr + 1
JSR WriteTextToScreen
LDA #<msg_menu_controls
STA textprintaddr
LDA #>msg_menu_controls
STA textprintaddr + 1
JSR WriteTextToScreen
JSR DrawTitleArrow
JSR WriteDifficultyLevel
JSR WriteDropMethod
JSR WriteMusicChoice
JSR WriteControllerOption
lda #song_index_Title
sta sound_param_byte_0
jsr play_song
TitleScreenLoop:
TitleLatchController:
JSR ReadFromController1
; Button status for each controller is returned in the following order: A, B, Select, Start, Up, Down, Left, Right.
LDA buttonspressed ; player 1 - A
AND #%10000000
CMP #$00
BEQ TitleReadB
; do stuff for A button
JSR SelectAtTitleArrow
JSR SmallDelay
TitleReadB:
LDA buttonspressed ; player 1 - B
AND #%01000000
CMP #$00
BEQ TitleReadSelect
; Do stuff for B button
TitleReadSelect:
LDA buttonspressed ; player 1 - Select
AND #%00100000
CMP #$00
BEQ TitleReadStart
JSR SelectAtTitleArrow
JSR SmallDelay
TitleReadStart:
LDA buttonspressed ; player 1 - Start
AND #%00010000
CMP #$00
BEQ TitleReadUp
; Stuff for Start button
LDA #1
STA startgamerequested
TitleReadUp:
LDA buttonspressed ; player 1 - Up
AND #%00001000
CMP #$00
BEQ TitleReadDown
; Stuff for Up button
JSR MoveTitleArrowUp
JSR SmallDelay
TitleReadDown:
LDA buttonspressed ; player 1 - Down
AND #%00000100
CMP #$00
BEQ TitleReadLeft
; Stuff for Down button
JSR MoveTitleArrowDown
JSR SmallDelay
TitleReadLeft:
LDA buttonspressed ; player 1 - Left
AND #%00000010
CMP #$00
BEQ TitleReadRight
; Stuff for Left button
TitleReadRight:
LDA buttonspressed ; player 1 - Right
AND #%00000001
CMP #$00
BEQ TitleNotRight
; Stuff for Right button
TitleNotRight:
LDA startgamerequested
CMP #1
BEQ title1
; if game not started, keep in title loop
JMP TitleScreenLoop
title1:
; reset startgamerequested, then start the game
JSR HideAllSprites
JSR PlayInGameMusic
LDA #0
STA startgamerequested
JMP StartGame
; this draws the title arrow at the position pointed to by titlearrowpos
DrawTitleArrow:
LDX #TITLEARROWX
LDA #TITLEARROWY
CLC
ADC titlearrowpos
TAY
JSR ConvertToPixels
LDA tmpy
STA $0200
LDA #RIGHTARROWTILE
STA $0201
LDA #1
STA $0202
LDA tmpx
STA $0203
RTS
; this moves the arrow up on the title screen
MoveTitleArrowUp:
; titlearrowpos cannot be less than 0
LDA titlearrowpos
CMP #0
BEQ mtau1
; titlearrowpos is > 0, so lets decrement it
DEC titlearrowpos
JSR DrawTitleArrow
mtau1:
RTS
; this moves the arrow down on the title screen
MoveTitleArrowDown:
; titlearrowpos cannot be more than 4
LDA titlearrowpos
CMP #4
BEQ mtad1
; titlearrowpos is < 4, so lets increment it
INC titlearrowpos
JSR DrawTitleArrow
mtad1:
RTS
; this selects the option at the arrow, either start game or change menu setting
SelectAtTitleArrow:
LDA titlearrowpos
CMP #0
BEQ sata1
CMP #1
BEQ sata2
CMP #2
BEQ sata6
CMP #3
BEQ sata8
CMP #4
BEQ sata10
RTS
sata1:
; start game selected
LDA #1
STA startgamerequested
RTS
sata2:
; difficulty selected - 0 is normal, 1 is hard
LDA difficulty
CMP #0
BEQ sata3
JMP sata4
sata3:
; currently normal, set to hard
LDA #1
STA difficulty
JMP sata5
sata4:
; currently hard, set to normal
LDA #0
STA difficulty
sata5:
JSR WriteDifficultyLevel
RTS
sata6:
; drop method, values are 0, 1 and 2
INC dropmethod
LDA dropmethod
CMP #3
BNE sata7
LDA #0
STA dropmethod
sata7:
JSR WriteDropMethod
RTS
sata8:
; music choice, values are 0,1,2 and 3
INC ingamemusic
LDA ingamemusic
CMP #4
BNE sata9
LDA #0
STA ingamemusic
sata9:
JSR WriteMusicChoice
RTS
sata10:
; controller choice values are 0 and 1
INC controlleroption
LDA controlleroption
CMP #2
BNE sata11
LDA #0
STA controlleroption
sata11:
JSR WriteControllerOption
RTS
; this displays the current controller choice on the title screen
WriteControllerOption:
LDA controlleroption
CMP #0
BEQ wco1
JMP wco2
wco1:
LDA #<msg_menu_controls_normal
STA textprintaddr
LDA #>msg_menu_controls_normal
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
wco2:
LDA #<msg_menu_controls_alternate
STA textprintaddr
LDA #>msg_menu_controls_alternate
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
; this displays the current difficulty level on the title screen
WriteDifficultyLevel:
LDA difficulty
CMP #0
BEQ wdl1
JMP wdl2
wdl1:
LDA #<msg_menu_difficulty_normal
STA textprintaddr
LDA #>msg_menu_difficulty_normal
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
wdl2:
LDA #<msg_menu_difficulty_hard
STA textprintaddr
LDA #>msg_menu_difficulty_hard
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
; this displays the current drop method being used on the title screen
WriteDropMethod:
LDA dropmethod
CMP #0
BEQ wdm1
CMP #1
BEQ wdm2
CMP #2
BEQ wdm3
RTS
wdm1:
LDA #<msg_menu_dropmethod_normal
STA textprintaddr
LDA #>msg_menu_dropmethod_normal
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
wdm2:
LDA #<msg_menu_dropmethod_likedown
STA textprintaddr
LDA #>msg_menu_dropmethod_likedown
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
wdm3:
LDA #<msg_menu_dropmethod_mixture
STA textprintaddr
LDA #>msg_menu_dropmethod_mixture
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
; this displays the music choice being used on the title screen
WriteMusicChoice:
LDA ingamemusic
CMP #0
BEQ wmc1
CMP #1
BEQ wmc2
CMP #2
BEQ wmc3
CMP #3
BEQ wmc4
RTS
wmc1:
LDA #<msg_menu_ingamemusic_themeA
STA textprintaddr
LDA #>msg_menu_ingamemusic_themeA
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
wmc2:
LDA #<msg_menu_ingamemusic_themeB
STA textprintaddr
LDA #>msg_menu_ingamemusic_themeB
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
wmc3:
LDA #<msg_menu_ingamemusic_themeC
STA textprintaddr
LDA #>msg_menu_ingamemusic_themeC
STA textprintaddr + 1
JSR WriteTextToScreen
RTS
wmc4:
LDA #<msg_menu_ingamemusic_silence
STA textprintaddr
LDA #>msg_menu_ingamemusic_silence
STA textprintaddr + 1
JSR WriteTextToScreen
RTS