-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBank $82.asm
13431 lines (11859 loc) · 590 KB
/
Bank $82.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
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;;; $8000: Game state 6/1Fh/28h (loading game data / set up new game / load demo game data) ;;;
{
$82:8000 08 PHP
$82:8001 C2 30 REP #$30
$82:8003 AD 98 09 LDA $0998 [$7E:0998] ;\
$82:8006 C9 28 00 CMP #$0028 ;} If [game state] = 28h (load demo game data):
$82:8009 D0 12 BNE $12 [$801D] ;/
$82:800B 20 9B 81 JSR $819B [$82:819B] ; Initialise IO registers for gameplay
$82:800E 20 E2 82 JSR $82E2 [$82:82E2] ; Load standard BG3 tiles and sprite tiles, clear tilemaps
$82:8011 20 C5 82 JSR $82C5 [$82:82C5] ; Load initial palette
$82:8014 22 0D E0 91 JSL $91E00D[$91:E00D] ; Initialise Samus
$82:8018 20 79 86 JSR $8679 [$82:8679] ; Load demo room data
$82:801B 80 42 BRA $42 [$805F] ; Go to BRANCH_GAMEPLAY
$82:801D AF 14 D9 7E LDA $7ED914[$7E:D914] ;\
$82:8021 C9 05 00 CMP #$0005 ;} If already on Zebes: go to BRANCH_ON_ZEBES
$82:8024 F0 28 BEQ $28 [$804E] ;/
$82:8026 C9 1F 00 CMP #$001F ;\
$82:8029 F0 16 BEQ $16 [$8041] ;} If starting at Ceres: go to BRANCH_CERES
$82:802B C9 22 00 CMP #$0022 ;\
$82:802E F0 02 BEQ $02 [$8032] ;} If landing on Zebes: go to BRANCH_ZEBES_LANDING
$82:8030 80 1C BRA $1C [$804E] ; Go to BRANCH_ON_ZEBES
; BRANCH_ZEBES_LANDING
$82:8032 9C 9F 07 STZ $079F [$7E:079F] ; Area = Crateria
$82:8035 A9 12 00 LDA #$0012 ;\
$82:8038 8D 8B 07 STA $078B [$7E:078B] ;} Load station index = 12h (Zebes landing cutscene)
$82:803B 22 8C 85 80 JSL $80858C[$80:858C] ; Load map explored
$82:803F 80 0D BRA $0D [$804E] ; Go to BRANCH_ON_ZEBES
; BRANCH_CERES
$82:8041 A9 06 00 LDA #$0006 ;\
$82:8044 8D 9F 07 STA $079F [$7E:079F] ;} Area = Ceres
$82:8047 9C 8B 07 STZ $078B [$7E:078B] ; Load station index = 0
$82:804A 22 93 9E 80 JSL $809E93[$80:9E93] ; Clear timer RAM
; BRANCH_ON_ZEBES
$82:804E 20 9B 81 JSR $819B [$82:819B] ; Initialise IO registers for gameplay
$82:8051 20 E2 82 JSR $82E2 [$82:82E2] ; Load standard BG3 tiles and sprite tiles, clear tilemaps
$82:8054 20 C5 82 JSR $82C5 [$82:82C5] ; Load initial palette
$82:8057 22 0D E0 91 JSL $91E00D[$91:E00D] ; Initialise Samus
$82:805B 22 37 C4 80 JSL $80C437[$80:C437] ; Load from load station
; BRANCH_GAMEPLAY
$82:805F 22 7B A0 80 JSL $80A07B[$80:A07B] ; Start gameplay
$82:8063 22 79 9A 80 JSL $809A79[$80:9A79] ; Initialise HUD
$82:8067 22 84 97 A0 JSL $A09784[$A0:9784] ; RTL
$82:806B 08 PHP ;\
$82:806C C2 30 REP #$30 ;|
$82:806E A0 20 00 LDY #$0020 ;|
$82:8071 A2 00 00 LDX #$0000 ;|
;|
$82:8074 BF 80 C1 7E LDA $7EC180,x[$7E:C180];|
$82:8078 9F 80 C3 7E STA $7EC380,x[$7E:C380];} Target Samus palette = [Samus palette]
$82:807C E8 INX ;|
$82:807D E8 INX ;|
$82:807E 88 DEY ;|
$82:807F 88 DEY ;|
$82:8080 D0 F2 BNE $F2 [$8074] ;|
$82:8082 28 PLP ;/
$82:8083 A9 01 00 LDA #$0001 ;\
$82:8086 8D 23 07 STA $0723 [$7E:0723] ;} Screen fade delay = 1
$82:8089 8D 25 07 STA $0725 [$7E:0725] ; Screen fade counter = 1
$82:808C 22 4B 83 80 JSL $80834B[$80:834B] ; Enable NMI
$82:8090 22 00 80 86 JSL $868000[$86:8000] ; Enable enemy projectiles
$82:8094 22 AD 83 84 JSL $8483AD[$84:83AD] ; Enable PLMs
$82:8098 22 C2 C4 8D JSL $8DC4C2[$8D:C4C2] ; Enable palette FX objects
$82:809C 22 88 82 88 JSL $888288[$88:8288] ; Enable HDMA objects
$82:80A0 22 00 80 87 JSL $878000[$87:8000] ; Enable animated tile objects
$82:80A4 22 0F 8E 90 JSL $908E0F[$90:8E0F] ; Set liquid physics type
$82:80A8 AD 98 09 LDA $0998 [$7E:0998] ;\
$82:80AB C9 28 00 CMP #$0028 ;} If [game state] = 28h (load demo game data):
$82:80AE D0 03 BNE $03 [$80B3] ;/
$82:80B0 4C 46 81 JMP $8146 [$82:8146] ; Go to BRANCH_DEMO
$82:80B3 AF 14 D9 7E LDA $7ED914[$7E:D914] ;\
$82:80B7 C9 22 00 CMP #$0022 ;} If not landing on Zebes: go to BRANCH_NOT_ZEBES_LANDING
$82:80BA D0 37 BNE $37 [$80F3] ;/
$82:80BC A9 05 00 LDA #$0005 ;\
$82:80BF 22 C1 8F 80 JSL $808FC1[$80:8FC1] ;} Queue song 0 music track
$82:80C3 A9 0F 00 LDA #$000F ;\
$82:80C6 8D A0 0D STA $0DA0 [$7E:0DA0] ;} $0DA0 = Fh
; LOOP_ALPHA
$82:80C9 22 D7 8C A0 JSL $A08CD7[$A0:8CD7] ; Transfer enemy tiles to VRAM and initialise enemies
$82:80CD 22 38 83 80 JSL $808338[$80:8338] ; Wait for NMI
$82:80D1 CE A0 0D DEC $0DA0 [$7E:0DA0] ; Decrement $0DA0
$82:80D4 10 F3 BPL $F3 [$80C9] ; If [$0DA0] > 0: go to LOOP_ALPHA
$82:80D6 EE 98 09 INC $0998 [$7E:0998] ; Game state = 7 (main gameplay fading in)
$82:80D9 08 PHP ;\
$82:80DA C2 30 REP #$30 ;|
$82:80DC A0 00 02 LDY #$0200 ;|
$82:80DF A2 00 00 LDX #$0000 ;|
;|
$82:80E2 BF 00 C2 7E LDA $7EC200,x[$7E:C200];|
$82:80E6 9F 00 C0 7E STA $7EC000,x[$7E:C000];} Palettes = [target palettes]
$82:80EA E8 INX ;|
$82:80EB E8 INX ;|
$82:80EC 88 DEY ;|
$82:80ED 88 DEY ;|
$82:80EE D0 F2 BNE $F2 [$80E2] ;|
$82:80F0 28 PLP ;/
$82:80F1 28 PLP
$82:80F2 60 RTS ; Return
; BRANCH_NOT_ZEBES_LANDING
$82:80F3 A9 06 00 LDA #$0006 ;\
$82:80F6 8D A0 0D STA $0DA0 [$7E:0DA0] ;} $0DA0 = 6
; LOOP_BETA
$82:80F9 22 D7 8C A0 JSL $A08CD7[$A0:8CD7] ; Transfer enemy tiles to VRAM and initialise enemies
$82:80FD 22 38 83 80 JSL $808338[$80:8338] ; Wait for NMI
$82:8101 CE A0 0D DEC $0DA0 [$7E:0DA0] ; Decrement $0DA0
$82:8104 10 F3 BPL $F3 [$80F9] ; If [$0DA0] > 0: go to LOOP_BETA
$82:8106 A9 07 00 LDA #$0007 ;\
$82:8109 8D 98 09 STA $0998 [$7E:0998] ;} Game state = 7 (main gameplay fading in)
$82:810C 08 PHP ;\
$82:810D C2 30 REP #$30 ;|
$82:810F A0 00 02 LDY #$0200 ;|
$82:8112 A2 00 00 LDX #$0000 ;|
;|
$82:8115 BF 00 C2 7E LDA $7EC200,x[$7E:C200];|
$82:8119 9F 00 C0 7E STA $7EC000,x[$7E:C000];} Palettes = [target palettes]
$82:811D E8 INX ;|
$82:811E E8 INX ;|
$82:811F 88 DEY ;|
$82:8120 88 DEY ;|
$82:8121 D0 F2 BNE $F2 [$8115] ;|
$82:8123 28 PLP ;/
$82:8124 AF 14 D9 7E LDA $7ED914[$7E:D914] ;\
$82:8128 C9 1F 00 CMP #$001F ;} If starting at Ceres:
$82:812B D0 10 BNE $10 [$813D] ;/
$82:812D A9 00 00 LDA #$0000 ;\
$82:8130 8F BE C1 7E STA $7EC1BE[$7E:C1BE] ;} Sprite palette 5, colour Fh = 0
$82:8134 A9 08 00 LDA #$0008 ;\
$82:8137 22 84 F0 90 JSL $90F084[$90:F084] ;} Run Samus command - set up Samus for Ceres start
$82:813B 28 PLP
$82:813C 60 RTS ; Return
$82:813D A9 09 00 LDA #$0009 ;\
$82:8140 22 84 F0 90 JSL $90F084[$90:F084] ;} Run Samus command - set up Samus for Zebes start
$82:8144 28 PLP
$82:8145 60 RTS ; Return
; BRANCH_DEMO
$82:8146 A9 06 00 LDA #$0006 ;\
$82:8149 8D A0 0D STA $0DA0 [$7E:0DA0] ;} $0DA0 = 6
$82:814C 22 D7 8C A0 JSL $A08CD7[$A0:8CD7] ; Transfer enemy tiles to VRAM and initialise enemies
$82:8150 22 38 83 80 JSL $808338[$80:8338] ; Wait for NMI
$82:8154 CE A0 0D DEC $0DA0 [$7E:0DA0] ; Decrement $0DA0
$82:8157 10 F3 BPL $F3 [$814C] ; If [$0DA0] > 0: loop
$82:8159 AD 57 1F LDA $1F57 [$7E:1F57] ;\
$82:815C 3A DEC A ;|
$82:815D 85 12 STA $12 [$7E:0012] ;|
$82:815F 0A ASL A ;|
$82:8160 0A ASL A ;|
$82:8161 0A ASL A ;|
$82:8162 65 12 ADC $12 [$7E:0012] ;|
$82:8164 0A ASL A ;|
$82:8165 85 12 STA $12 [$7E:0012] ;|
$82:8167 AD 55 1F LDA $1F55 [$7E:1F55] ;|
$82:816A 0A ASL A ;} Execute [[$876C + demo set * 2] + (demo scene index - 1) * 12h + 10h]
$82:816B AA TAX ;|
$82:816C BD 6C 87 LDA $876C,x ;|
$82:816F 18 CLC ;|
$82:8170 65 12 ADC $12 [$7E:0012] ;|
$82:8172 AA TAX ;|
$82:8173 BD 10 00 LDA $0010,x ;|
$82:8176 85 12 STA $12 [$7E:0012] ;|
$82:8178 A2 00 00 LDX #$0000 ;|
$82:817B FC 12 00 JSR ($0012,x) ;/
$82:817E EE 98 09 INC $0998 [$7E:0998] ; Game state = 29h (transition to demo)
$82:8181 08 PHP ;\
$82:8182 C2 30 REP #$30 ;|
$82:8184 A0 00 02 LDY #$0200 ;|
$82:8187 A2 00 00 LDX #$0000 ;|
;|
$82:818A BF 00 C2 7E LDA $7EC200,x[$7E:C880];|
$82:818E 9F 00 C0 7E STA $7EC000,x[$7E:C680];} Palettes = [target palettes]
$82:8192 E8 INX ;|
$82:8193 E8 INX ;|
$82:8194 88 DEY ;|
$82:8195 88 DEY ;|
$82:8196 D0 F2 BNE $F2 [$818A] ;|
$82:8198 28 PLP ;/
$82:8199 28 PLP
$82:819A 60 RTS
}
;;; $819B: Initialise IO registers for gameplay ;;;
{
$82:819B 08 PHP
$82:819C 20 A4 81 JSR $81A4 [$82:81A4] ; Initialise CPU registers for gameplay
$82:819F 20 DD 81 JSR $81DD [$82:81DD] ; Initialise PPU registers for gameplay
$82:81A2 28 PLP
$82:81A3 60 RTS
}
;;; $81A4: Initialise CPU registers for gameplay ;;;
{
$82:81A4 08 PHP
$82:81A5 E2 30 SEP #$30
$82:81A7 A9 01 LDA #$01 ;\
$82:81A9 8D 00 42 STA $4200 ;} Enable joypad auto-read, disable interrupts
$82:81AC 85 84 STA $84 [$7E:0084] ;/
$82:81AE 9C 01 42 STZ $4201 ; Joypad programmable IO port = 0
$82:81B1 9C 02 42 STZ $4202 ; Multiplicand = 0
$82:81B4 9C 03 42 STZ $4203 ; Multiplier = 0
$82:81B7 9C 04 42 STZ $4204 ;\
$82:81BA 9C 05 42 STZ $4205 ;} Dividend = 0
$82:81BD 9C 06 42 STZ $4206 ; Divisor = 0
$82:81C0 9C 07 42 STZ $4207 ;\
$82:81C3 9C 08 42 STZ $4208 ;} Horizontal timer = 0
$82:81C6 9C 09 42 STZ $4209 ;\
$82:81C9 9C 0A 42 STZ $420A ;} Vertical timer = 0
$82:81CC 9C 0B 42 STZ $420B ; Disable DMAs
$82:81CF 9C 0C 42 STZ $420C ;\
$82:81D2 64 85 STZ $85 [$7E:0085] ;} Disable HDMAs
$82:81D4 A9 01 LDA #$01 ;\
$82:81D6 8D 0D 42 STA $420D ;} Set fast ROM
$82:81D9 85 86 STA $86 [$7E:0086] ;/
$82:81DB 28 PLP
$82:81DC 60 RTS
}
;;; $81DD: Set up PPU for gameplay ;;;
{
$82:81DD 08 PHP
$82:81DE E2 30 SEP #$30
$82:81E0 A9 80 LDA #$80 ;\
$82:81E2 8D 00 21 STA $2100 ;} Enable forced blank
$82:81E5 85 51 STA $51 [$7E:0051] ;/
$82:81E7 A9 03 LDA #$03 ;\
$82:81E9 8D 01 21 STA $2101 ;} Sprite tiles base address = $6000, sprite sizes = 8x8 / 16x16
$82:81EC 85 52 STA $52 [$7E:0052] ;/
$82:81EE 9C 02 21 STZ $2102 ;\
$82:81F1 64 53 STZ $53 [$7E:0053] ;|
$82:81F3 A9 80 LDA #$80 ;} Top priority sprite number = $00
$82:81F5 8D 03 21 STA $2103 ;|
$82:81F8 85 54 STA $54 [$7E:0054] ;/
$82:81FA 9C 04 21 STZ $2104 ;\
$82:81FD 9C 04 21 STZ $2104 ;} OAM write address = $0000
$82:8200 A9 09 LDA #$09 ;\
$82:8202 8D 05 21 STA $2105 ;} BG mode = 1 with BG3 priority, BG tile sizes = 8x8
$82:8205 85 55 STA $55 [$7E:0055] ;/
$82:8207 9C 06 21 STZ $2106 ;\
$82:820A 64 57 STZ $57 [$7E:0057] ;} Disable mosaic
$82:820C 64 5D STZ $5D [$7E:005D] ;\
$82:820E 9C 0B 21 STZ $210B ;|
$82:8211 A9 04 LDA #$04 ;} BG1/2/4 tiles base address = $0000, BG3 tiles base address = $4000
$82:8213 85 5E STA $5E [$7E:005E] ;|
$82:8215 8D 0C 21 STA $210C ;/
$82:8218 A9 51 LDA #$51 ;\
$82:821A 85 58 STA $58 [$7E:0058] ;} BG1 tilemap base address = $5000, size = 64x32
$82:821C 8D 07 21 STA $2107 ;/
$82:821F A9 49 LDA #$49 ;\
$82:8221 85 59 STA $59 [$7E:0059] ;} BG2 tilemap base address = $4800, size = 64x32
$82:8223 8D 08 21 STA $2108 ;/
$82:8226 A9 5A LDA #$5A ;\
$82:8228 85 5A STA $5A [$7E:005A] ;} BG3 tilemap base address = $5800, size = 32x64
$82:822A 8D 09 21 STA $2109 ;/
$82:822D A9 00 LDA #$00 ;\
$82:822F 85 5C STA $5C [$7E:005C] ;} BG4 tilemap base address = $0000, size = 32x32
$82:8231 8D 0A 21 STA $210A ;/
$82:8234 9C 15 21 STZ $2115 ; VRAM address increment mode = 8-bit access
$82:8237 9C 23 21 STZ $2123 ;\
$82:823A 64 60 STZ $60 [$7E:0060] ;} Disable BG1/2 windowing
$82:823C 9C 23 21 STZ $2123
$82:823F 64 60 STZ $60 [$7E:0060]
$82:8241 9C 24 21 STZ $2124 ;\
$82:8244 64 61 STZ $61 [$7E:0061] ;} Disable BG3/4 windowing
$82:8246 9C 25 21 STZ $2125 ;\
$82:8249 64 62 STZ $62 [$7E:0062] ;} Disable sprite/colour windowing
$82:824B 9C 26 21 STZ $2126 ;\
$82:824E 64 63 STZ $63 [$7E:0063] ;} Window 1 left position = 0
$82:8250 9C 27 21 STZ $2127 ;\
$82:8253 64 64 STZ $64 [$7E:0064] ;} Window 1 right position = 0
$82:8255 9C 28 21 STZ $2128 ;\
$82:8258 64 65 STZ $65 [$7E:0065] ;} Window 2 left position = 0
$82:825A 9C 29 21 STZ $2129 ;\
$82:825D 64 66 STZ $66 [$7E:0066] ;} Window 2 right position = 0
$82:825F 9C 2A 21 STZ $212A ;\
$82:8262 64 67 STZ $67 [$7E:0067] ;} Windowed background combining logic = OR
$82:8264 9C 2B 21 STZ $212B ;\
$82:8267 64 68 STZ $68 [$7E:0068] ;} Windowed sprite/colour combining logic = OR
$82:8269 A9 17 LDA #$17 ;\
$82:826B 8D 2C 21 STA $212C ;} Enable BG1/2/3 and sprites
$82:826E 85 69 STA $69 [$7E:0069] ;/
$82:8270 9C 2E 21 STZ $212E ;\
$82:8273 64 6C STZ $6C [$7E:006C] ;} Enable all layers in window area main screen
$82:8275 A9 00 LDA #$00 ;\
$82:8277 8D 2D 21 STA $212D ;} Disable all subscreen layers
$82:827A 85 6B STA $6B [$7E:006B] ;/
$82:827C 9C 2F 21 STZ $212F ;\
$82:827F 64 6D STZ $6D [$7E:006D] ;} Enable all layers in window area subscreen
$82:8281 9C 30 21 STZ $2130 ;\
$82:8284 64 6E STZ $6E [$7E:006E] ;|
$82:8286 9C 31 21 STZ $2131 ;} Disable colour math
$82:8289 64 71 STZ $71 [$7E:0071] ;/
$82:828B A9 E0 LDA #$E0 ;\
$82:828D 8D 32 21 STA $2132 ;} Colour math subscreen backdrop colour = 0
$82:8290 A9 00 LDA #$00 ;\
$82:8292 8D 33 21 STA $2133 ;} Use standard NTSC resolution
$82:8295 85 77 STA $77 [$7E:0077] ;/
$82:8297 C2 30 REP #$30
$82:8299 9C 90 05 STZ $0590 [$7E:0590] ; OAM data index = 0
$82:829C A9 00 00 LDA #$0000 ;\
$82:829F A2 00 30 LDX #$3000 ;|
$82:82A2 A0 FE 07 LDY #$07FE ;} $7E:3000..37FD = 0
$82:82A5 22 F6 83 80 JSL $8083F6[$80:83F6] ;/
$82:82A9 A9 6F 00 LDA #$006F ;\
$82:82AC A2 00 40 LDX #$4000 ;|
$82:82AF A0 FE 07 LDY #$07FE ;} $7E:4000..47FD = 006Fh
$82:82B2 22 F6 83 80 JSL $8083F6[$80:83F6] ;/
$82:82B6 A9 0F 2C LDA #$2C0F ;\
$82:82B9 A2 00 40 LDX #$4000 ;|
$82:82BC A0 FE 00 LDY #$00FE ;} $7E:4000..FD = 2C0Fh
$82:82BF 22 F6 83 80 JSL $8083F6[$80:83F6] ;/
$82:82C3 28 PLP
$82:82C4 60 RTS
}
;;; $82C5: Load initial palette ;;;
{
; Palette loaded when loading a save or demo.
; Nothing is displayed during this time, so it's unclear why this palette is loaded at all
$82:82C5 08 PHP
$82:82C6 E2 30 SEP #$30
$82:82C8 08 PHP
$82:82C9 C2 30 REP #$30
$82:82CB A0 00 02 LDY #$0200
$82:82CE A2 00 00 LDX #$0000
$82:82D1 BF 00 80 9A LDA $9A8000,x[$9A:8000]
$82:82D5 9F 00 C0 7E STA $7EC000,x[$7E:C000]
$82:82D9 E8 INX
$82:82DA E8 INX
$82:82DB 88 DEY
$82:82DC 88 DEY
$82:82DD D0 F2 BNE $F2 [$82D1]
$82:82DF 28 PLP
$82:82E0 28 PLP
$82:82E1 60 RTS
}
;;; $82E2: Load standard BG3 tiles and sprite tiles, clear tilemaps ;;;
{
$82:82E2 08 PHP
$82:82E3 E2 30 SEP #$30
$82:82E5 A9 00 LDA #$00 ;\
$82:82E7 8D 16 21 STA $2116 ;|
$82:82EA A9 40 LDA #$40 ;|
$82:82EC 8D 17 21 STA $2117 ;|
$82:82EF A9 80 LDA #$80 ;|
$82:82F1 8D 15 21 STA $2115 ;} VRAM $4000..4FFF (BG3 tiles and BG2 tilemap) = [$9A:B200..D1FF]
$82:82F4 22 A9 91 80 JSL $8091A9[$80:91A9] ;|
$82:82F8 dx 01,01,18,9AB200,2000;|
$82:8300 A9 02 LDA #$02 ;|
$82:8302 8D 0B 42 STA $420B ;/
$82:8305 A9 00 LDA #$00 ;\
$82:8307 8D 16 21 STA $2116 ;|
$82:830A A9 60 LDA #$60 ;|
$82:830C 8D 17 21 STA $2117 ;|
$82:830F A9 80 LDA #$80 ;|
$82:8311 8D 15 21 STA $2115 ;} VRAM $6000..7FFF (sprite tiles) = [$9A:D200..11FF] (size is completely wrong, goes through free space and wraps into RAM)
$82:8314 22 A9 91 80 JSL $8091A9[$80:91A9] ;|
$82:8318 dx 01,01,18,9AD200,4000;|
$82:8320 A9 02 LDA #$02 ;|
$82:8322 8D 0B 42 STA $420B ;/
$82:8325 A9 00 LDA #$00 ;\
$82:8327 8D 16 21 STA $2116 ;|
$82:832A A9 50 LDA #$50 ;|
$82:832C 8D 17 21 STA $2117 ;|
$82:832F A9 80 LDA #$80 ;|
$82:8331 8D 15 21 STA $2115 ;} VRAM $5000..57FF (BG1 tilemap) = [$7E:4000..4FFF] (see $82A9)
$82:8334 22 A9 91 80 JSL $8091A9[$80:91A9] ;|
$82:8338 dx 01,01,18,7E4000,1000;|
$82:8340 A9 02 LDA #$02 ;|
$82:8342 8D 0B 42 STA $420B ;/
$82:8345 A9 00 LDA #$00 ;\
$82:8347 8D 16 21 STA $2116 ;|
$82:834A A9 58 LDA #$58 ;|
$82:834C 8D 17 21 STA $2117 ;|
$82:834F A9 80 LDA #$80 ;|
$82:8351 8D 15 21 STA $2115 ;} VRAM $5800..5BFF (BG3 tilemap) = [$7E:4000..47FF] (see $82A9)
$82:8354 22 A9 91 80 JSL $8091A9[$80:91A9] ;|
$82:8358 dx 01,01,18,7E4000,0800;|
$82:8360 A9 02 LDA #$02 ;|
$82:8362 8D 0B 42 STA $420B ;/
$82:8365 28 PLP
$82:8366 60 RTS
}
;;; $8367: Game state 20h (made it to Ceres elevator) ;;;
{
$82:8367 08 PHP
$82:8368 C2 30 REP #$30
$82:836A AD 43 09 LDA $0943 [$7E:0943] ;\
$82:836D F0 04 BEQ $04 [$8373] ;} If [timer status] != inactive:
$82:836F 22 6C 9F 80 JSL $809F6C[$80:9F6C] ; Draw timer
$82:8373 20 44 8B JSR $8B44 [$82:8B44] ; Main gameplay
$82:8376 CE A0 0A DEC $0AA0 [$7E:0AA0] ; Decrement reached Ceres elevator fade timer
$82:8379 F0 02 BEQ $02 [$837D] ;\
$82:837B 10 09 BPL $09 [$8386] ;} If [reached Ceres elevator fade timer] > 0: return
$82:837D EE 98 09 INC $0998 [$7E:0998] ; Game state = 21h (blackout from Ceres)
$82:8380 9C 23 07 STZ $0723 [$7E:0723] ; Screen fade delay = 0
$82:8383 9C 25 07 STZ $0725 [$7E:0725] ; Screen fade counter = 0
$82:8386 28 PLP
$82:8387 60 RTS
}
;;; $8388: Game state 21h (blackout from Ceres) ;;;
{
$82:8388 08 PHP
$82:8389 C2 30 REP #$30
$82:838B AD 43 09 LDA $0943 [$7E:0943] ;\
$82:838E F0 04 BEQ $04 [$8394] ;} If [timer status] != inactive:
$82:8390 22 6C 9F 80 JSL $809F6C[$80:9F6C] ; Draw timer
$82:8394 20 44 8B JSR $8B44 [$82:8B44] ; Main gameplay
$82:8397 22 24 89 80 JSL $808924[$80:8924] ; Handle fading out
$82:839B E2 20 SEP #$20
$82:839D A5 51 LDA $51 [$7E:0051] ;\
$82:839F C9 80 CMP #$80 ;} If not finished fading out:
$82:83A1 F0 04 BEQ $04 [$83A7] ;/
$82:83A3 C2 20 REP #$20 ; >_<;
$82:83A5 28 PLP
$82:83A6 60 RTS ; Return
$82:83A7 22 4B 83 80 JSL $80834B[$80:834B] ; Enable NMI
$82:83AB C2 20 REP #$20
$82:83AD 22 9E 82 88 JSL $88829E[$88:829E] ; Wait until the end of a v-blank and clear (H)DMA queue
$82:83B1 22 5F 98 80 JSL $80985F[$80:985F] ; Disable h/v-counter interrupts
$82:83B5 9C 82 19 STZ $1982 [$7E:1982] ; Default layer blending configuration = 0
$82:83B8 64 AB STZ $AB [$7E:00AB] ; Interrupt command = 0
$82:83BA E2 20 SEP #$20
$82:83BC 64 6E STZ $6E [$7E:006E] ;\
$82:83BE 64 71 STZ $71 [$7E:0071] ;} Disable colour math
$82:83C0 A9 10 LDA #$10 ;\
$82:83C2 85 69 STA $69 [$7E:0069] ;} Main screen layers = sprites
$82:83C4 64 6B STZ $6B [$7E:006B] ; Disable subscreen layers
$82:83C6 64 6C STZ $6C [$7E:006C] ;\
$82:83C8 64 6D STZ $6D [$7E:006D] ;} Enable all layers in window area
$82:83CA A9 09 LDA #$09 ;\
$82:83CC 85 55 STA $55 [$7E:0055] ;} Use mode 1 with BG3 priority and 8x8 tile sizes
$82:83CE C2 20 REP #$20
$82:83D0 9C 23 07 STZ $0723 [$7E:0723] ; Screen fade delay = 0
$82:83D3 9C 25 07 STZ $0725 [$7E:0725] ; Screen fade counter = 0
$82:83D6 A9 22 00 LDA #$0022 ;\
$82:83D9 8F 14 D9 7E STA $7ED914[$7E:D914] ;} Set landing on Zebes
$82:83DD 8D 98 09 STA $0998 [$7E:0998] ; Game state = 22h (Ceres goes boom, Samus goes to Zebes)
$82:83E0 AD 52 09 LDA $0952 [$7E:0952] ;\
$82:83E3 22 00 80 81 JSL $818000[$81:8000] ;} Save current save slot to SRAM
$82:83E7 A9 1B C1 LDA #$C11B ;\
$82:83EA 8D 51 1F STA $1F51 [$7E:1F51] ;} Cinematic function = $C11B (Ceres goes boom)
$82:83ED 9C 3F 09 STZ $093F [$7E:093F] ; Ceres status = 0
$82:83F0 9C 43 09 STZ $0943 [$7E:0943] ; Timer status = inactive
$82:83F3 A9 00 00 LDA #$0000 ;\
$82:83F6 22 C1 8F 80 JSL $808FC1[$80:8FC1] ;} Queue music stop
$82:83FA A9 02 00 LDA #$0002 ;\
$82:83FD 22 21 90 80 JSL $809021[$80:9021] ;} Queue sound 2, sound library 1, max queued sounds allowed = 15 (silence)
$82:8401 A9 71 00 LDA #$0071 ;\
$82:8404 22 A3 90 80 JSL $8090A3[$80:90A3] ;} Queue sound 71h, sound library 2, max queued sounds allowed = 15 (silence)
$82:8408 A9 01 00 LDA #$0001 ;\
$82:840B 22 25 91 80 JSL $809125[$80:9125] ;} Queue sound 1, sound library 3, max queued sounds allowed = 15 (silence)
$82:840F 28 PLP
$82:8410 60 RTS
}
;;; $8411: Game state 23h (time up) ;;;
{
$82:8411 08 PHP
$82:8412 C2 30 REP #$30
$82:8414 20 44 8B JSR $8B44 [$82:8B44] ; Main gameplay
$82:8417 A9 08 00 LDA #$0008 ;\
$82:841A 8F 02 C4 7E STA $7EC402[$7E:C402] ;} Palette change denominator = 8
$82:841E 20 02 DA JSR $DA02 [$82:DA02] ; Advance gradual colour change of all palettes
$82:8421 90 0C BCC $0C [$842F] ; If reached target colour:
$82:8423 A9 24 00 LDA #$0024 ;\
$82:8426 8D 98 09 STA $0998 [$7E:0998] ;} Game state = 24h (whiting out from time up)
$82:8429 9C 23 07 STZ $0723 [$7E:0723] ; Screen fade delay = 0
$82:842C 9C 25 07 STZ $0725 [$7E:0725] ; Screen fade counter = 0
$82:842F 28 PLP
$82:8430 60 RTS
}
;;; $8431: Game state 24h (whiting out from time up) ;;;
{
$82:8431 08 PHP
$82:8432 C2 30 REP #$30
$82:8434 22 24 89 80 JSL $808924[$80:8924] ; Handle fading out
$82:8438 E2 20 SEP #$20
$82:843A A5 51 LDA $51 [$7E:0051] ;\
$82:843C C9 80 CMP #$80 ;} If not finished fading out:
$82:843E F0 04 BEQ $04 [$8444] ;/
$82:8440 C2 20 REP #$20
$82:8442 28 PLP
$82:8443 60 RTS ; Return
$82:8444 22 4B 83 80 JSL $80834B[$80:834B] ; Enable NMI
$82:8448 C2 20 REP #$20
$82:844A 22 9E 82 88 JSL $88829E[$88:829E] ; Wait until the end of a v-blank and clear (H)DMA enable flags
$82:844E 22 5F 98 80 JSL $80985F[$80:985F] ; Disable h/v-counter interrupts
$82:8452 9C 82 19 STZ $1982 [$7E:1982] ; Default layer blending configuration = 0
$82:8455 64 AB STZ $AB [$7E:00AB] ; Interrupt command = 0
$82:8457 E2 20 SEP #$20
$82:8459 64 6E STZ $6E [$7E:006E] ;\
$82:845B 64 71 STZ $71 [$7E:0071] ;} Disable colour math
$82:845D A9 10 LDA #$10
$82:845F 85 69 STA $69 [$7E:0069] ; Main screen layers = sprites
$82:8461 64 6B STZ $6B [$7E:006B] ; Disable subscreen layers
$82:8463 64 6C STZ $6C [$7E:006C] ;\
$82:8465 64 6D STZ $6D [$7E:006D] ;} Enable all layers in window area
$82:8467 A9 09 LDA #$09 ;\
$82:8469 85 55 STA $55 [$7E:0055] ;} Use mode 1 with BG3 priority and 8x8 tile sizes
$82:846B C2 20 REP #$20
$82:846D 9C 23 07 STZ $0723 [$7E:0723] ; Screen fade delay = 0
$82:8470 9C 25 07 STZ $0725 [$7E:0725] ; Screen fade counter = 0
$82:8473 9C 3F 09 STZ $093F [$7E:093F] ; Ceres status = 0
$82:8476 9C 43 09 STZ $0943 [$7E:0943] ; Timer status = inactive
$82:8479 A9 02 00 LDA #$0002 ;\
$82:847C 22 21 90 80 JSL $809021[$80:9021] ;} Queue sound 2, sound library 1, max queued sounds allowed = 15 (silence)
$82:8480 A9 71 00 LDA #$0071 ;\
$82:8483 22 A3 90 80 JSL $8090A3[$80:90A3] ;} Queue sound 71h, sound library 2, max queued sounds allowed = 15 (silence)
$82:8487 A9 01 00 LDA #$0001 ;\
$82:848A 22 25 91 80 JSL $809125[$80:9125] ;} Queue sound 1, sound library 3, max queued sounds allowed = 15 (silence)
$82:848E A9 0E 00 LDA #$000E ;\
$82:8491 22 33 82 80 JSL $808233[$80:8233] ;} If Zebes timebomb not set: go to BRANCH_NOT_ZEBES_TIMEBOMB
$82:8495 90 18 BCC $18 [$84AF] ;/
$82:8497 9C E2 0D STZ $0DE2 [$7E:0DE2] ; Game options menu index = 0
$82:849A 9C 27 07 STZ $0727 [$7E:0727] ; Menu index = 0
$82:849D A2 FE 00 LDX #$00FE ;\
;|
$82:84A0 9E 8D 1A STZ $1A8D,x ;|
$82:84A3 CA DEX ;} $1A8D..1B8C = 0 (?)
$82:84A4 CA DEX ;|
$82:84A5 10 F9 BPL $F9 [$84A0] ;/
$82:84A7 A9 19 00 LDA #$0019 ;\
$82:84AA 8D 98 09 STA $0998 [$7E:0998] ;} Game state = 19h (death sequence, black out)
$82:84AD 28 PLP
$82:84AE 60 RTS ; Return
; BRANCH_NOT_ZEBES_TIMEBOMB
$82:84AF A9 25 00 LDA #$0025 ;\
$82:84B2 8D 98 09 STA $0998 [$7E:0998] ;} Game state = 25h (Ceres goes boom with Samus)
$82:84B5 A9 1B C1 LDA #$C11B ;\
$82:84B8 8D 51 1F STA $1F51 [$7E:1F51] ;} Cinematic function = $C11B (Ceres goes boom)
$82:84BB 28 PLP
$82:84BC 60 RTS
}
;;; $84BD: Game state 26h (Samus escapes from Zebes) ;;;
{
$82:84BD 08 PHP
$82:84BE C2 30 REP #$30
$82:84C0 20 44 8B JSR $8B44 [$82:8B44] ; Main gameplay
$82:84C3 22 24 89 80 JSL $808924[$80:8924] ; Handle fading out
$82:84C7 E2 20 SEP #$20
$82:84C9 A5 51 LDA $51 [$7E:0051] ;\
$82:84CB C9 80 CMP #$80 ;} If not finished fading out:
$82:84CD F0 04 BEQ $04 [$84D3] ;/
$82:84CF C2 20 REP #$20 ; >_<;
$82:84D1 28 PLP
$82:84D2 60 RTS ; Return
$82:84D3 22 4B 83 80 JSL $80834B[$80:834B] ; Enable NMI
$82:84D7 C2 20 REP #$20
$82:84D9 22 9E 82 88 JSL $88829E[$88:829E] ; Wait until the end of a v-blank and clear (H)DMA enable flags
$82:84DD 22 5F 98 80 JSL $80985F[$80:985F] ; Disable h/v-counter interrupts
$82:84E1 9C 82 19 STZ $1982 [$7E:1982] ; Default layer blending configuration = 0
$82:84E4 E2 20 SEP #$20
$82:84E6 64 6E STZ $6E [$7E:006E] ;\
$82:84E8 64 71 STZ $71 [$7E:0071] ;} Disable colour math
$82:84EA A9 10 LDA #$10 ;\
$82:84EC 85 69 STA $69 [$7E:0069] ;} Main screen layers = sprites
$82:84EE 64 6B STZ $6B [$7E:006B] ; Disable subscreen layers
$82:84F0 64 6C STZ $6C [$7E:006C] ;\
$82:84F2 64 6D STZ $6D [$7E:006D] ;} Enable all layers in window area
$82:84F4 A9 09 LDA #$09 ;\
$82:84F6 85 55 STA $55 [$7E:0055] ;} Use mode 1 with BG3 priority and 8x8 tile sizes
$82:84F8 C2 20 REP #$20
$82:84FA 9C 23 07 STZ $0723 [$7E:0723] ; Screen fade delay = 0
$82:84FD 9C 25 07 STZ $0725 [$7E:0725] ; Screen fade counter = 0
$82:8500 A9 27 00 LDA #$0027 ;\
$82:8503 8D 98 09 STA $0998 [$7E:0998] ;} Game state = 27h (ending and credits)
$82:8506 A9 80 D4 LDA #$D480 ;\
$82:8509 8D 51 1F STA $1F51 [$7E:1F51] ;} Cinematic function = $D480 (ending)
$82:850C 9C 43 09 STZ $0943 [$7E:0943] ; Timer status = inactive
$82:850F A9 00 00 LDA #$0000 ;\
$82:8512 22 C1 8F 80 JSL $808FC1[$80:8FC1] ;} Queue music stop
$82:8516 A9 02 00 LDA #$0002 ;\
$82:8519 22 21 90 80 JSL $809021[$80:9021] ;} Queue sound 2, sound library 1, max queued sounds allowed = 15 (silence)
$82:851D A9 71 00 LDA #$0071 ;\
$82:8520 22 A3 90 80 JSL $8090A3[$80:90A3] ;} Queue sound 71h, sound library 2, max queued sounds allowed = 15 (silence)
$82:8524 A9 01 00 LDA #$0001 ;\
$82:8527 22 25 91 80 JSL $809125[$80:9125] ;} Queue sound 1, sound library 3, max queued sounds allowed = 15 (silence)
$82:852B 28 PLP
$82:852C 60 RTS
}
;;; $852D..893C: Demos ;;;
{
;;; $852D: Game state 29h (transition to demo) ;;;
{
$82:852D 08 PHP
$82:852E C2 30 REP #$30
$82:8530 20 44 8B JSR $8B44 [$82:8B44] ; Main gameplay
$82:8533 22 38 83 80 JSL $808338[$80:8338] ; Wait for NMI
$82:8537 22 B9 84 88 JSL $8884B9[$88:84B9] ; HDMA object handler (also handle music queue)
$82:853B EE 98 09 INC $0998 [$7E:0998] ; Game state = 2Ah (playing demo)
$82:853E E2 20 SEP #$20 ;\
$82:8540 A9 0F LDA #$0F ;} Set max brightness
$82:8542 85 51 STA $51 [$7E:0051] ;/
$82:8544 C2 20 REP #$20 ; >_<;
$82:8546 28 PLP
$82:8547 60 RTS
}
;;; $8548: Game state 2Ah (playing demo) ;;;
{
$82:8548 08 PHP
$82:8549 C2 30 REP #$30
$82:854B 20 44 8B JSR $8B44 [$82:8B44] ; Main gameplay
$82:854E A5 8F LDA $8F [$7E:008F] ;\
$82:8550 F0 08 BEQ $08 [$855A] ;} If newly pressed anything:
$82:8552 A9 01 00 LDA #$0001 ;\
$82:8555 8D EC 0D STA $0DEC [$7E:0DEC] ;} Demo control flags = 1 (pressed button to exit demos)
$82:8558 80 20 BRA $20 [$857A] ; Go to BRANCH_END_DEMOS
$82:855A CE 53 1F DEC $1F53 [$7E:1F53] ; Decrement demo timer
$82:855D F0 02 BEQ $02 [$8561] ;\
$82:855F 10 30 BPL $30 [$8591] ;} If [demo timer] > 0: return
$82:8561 9C EC 0D STZ $0DEC [$7E:0DEC] ; Demo control flags = 0
$82:8564 A2 5A 00 LDX #$005A ; X = 90
; LOOP
$82:8567 22 38 83 80 JSL $808338[$80:8338] ; Wait for NMI
$82:856B A5 8F LDA $8F [$7E:008F] ;\
$82:856D D0 05 BNE $05 [$8574] ;} If not newly pressed anything:
$82:856F CA DEX ; Decrement X
$82:8570 D0 F5 BNE $F5 [$8567] ; If [X] != 0: go to LOOP
$82:8572 80 06 BRA $06 [$857A] ; Go to BRANCH_END_DEMOS
$82:8574 A9 01 00 LDA #$0001 ;\
$82:8577 8D EC 0D STA $0DEC [$7E:0DEC] ;} Demo control flags = 1 (pressed button to exit demos)
; BRANCH_END_DEMOS
$82:857A EE 98 09 INC $0998 [$7E:0998] ; Game state = 2Bh (unload game data)
$82:857D 9C F5 05 STZ $05F5 [$7E:05F5] ; Enable sounds
$82:8580 E2 20 SEP #$20 ;\
$82:8582 A9 80 LDA #$80 ;|
$82:8584 85 51 STA $51 [$7E:0051] ;} Set forced blank
$82:8586 C2 20 REP #$20 ;/
$82:8588 A9 01 00 LDA #$0001 ;\
$82:858B 8D 23 07 STA $0723 [$7E:0723] ;} Screen fade delay = 1
$82:858E 8D 25 07 STA $0725 [$7E:0725] ; Screen fade counter = 1
$82:8591 28 PLP
$82:8592 60 RTS
}
;;; $8593: Game state 2Bh (unload game data) ;;;
{
$82:8593 08 PHP
$82:8594 C2 30 REP #$30
$82:8596 AD EC 0D LDA $0DEC [$7E:0DEC] ;\
$82:8599 C9 01 00 CMP #$0001 ;} If [demo control flags] != 1:
$82:859C F0 03 BEQ $03 [$85A1] ;/
$82:859E 20 37 86 JSR $8637 [$82:8637] ; Check for next demo
$82:85A1 22 4B 83 80 JSL $80834B[$80:834B] ; Enable NMI
$82:85A5 EE 98 09 INC $0998 [$7E:0998] ; Game state = 2Ch (transition from demo)
$82:85A8 9C 23 07 STZ $0723 [$7E:0723] ;\
$82:85AB 9C 25 07 STZ $0725 [$7E:0725] ;} Disable screen fade
$82:85AE 22 9E 82 88 JSL $88829E[$88:829E] ; Wait until the end of a v-blank and clear (H)DMA enable flags
$82:85B2 22 5F 98 80 JSL $80985F[$80:985F] ; Disable h/v-counter interrupts
$82:85B6 9C 82 19 STZ $1982 [$7E:1982] ; Default layer blending configuration = 0
$82:85B9 64 AB STZ $AB [$7E:00AB] ; Clear interrupt index
$82:85BB 64 A7 STZ $A7 [$7E:00A7] ; Clear next interrupt index
$82:85BD 22 CD C4 8D JSL $8DC4CD[$8D:C4CD] ; Disable glow
$82:85C1 22 D8 C4 8D JSL $8DC4D8[$8D:C4D8] ; Clear palette FX objects
$82:85C5 A9 1F 1C LDA #$1C1F ;\
$82:85C8 3A DEC A ;|
$82:85C9 3A DEC A ;|
$82:85CA 38 SEC ;|
$82:85CB E9 8D 19 SBC #$198D ;|
$82:85CE AA TAX ;} Clear $198D..1C1E (non-gameplay RAM)
;|
$82:85CF 9E 8D 19 STZ $198D,x[$7E:1C1D] ;|
$82:85D2 CA DEX ;|
$82:85D3 CA DEX ;|
$82:85D4 10 F9 BPL $F9 [$85CF] ;/
$82:85D6 A9 98 09 LDA #$0998 ;\
$82:85D9 3A DEC A ;|
$82:85DA 3A DEC A ;|
$82:85DB 38 SEC ;|
$82:85DC E9 7C 07 SBC #$077C ;|
$82:85DF AA TAX ;} Clear $077C..0997 (main gameplay RAM)
;|
$82:85E0 9E 7C 07 STZ $077C,x[$7E:0996] ;|
$82:85E3 CA DEX ;|
$82:85E4 CA DEX ;|
$82:85E5 10 F9 BPL $F9 [$85E0] ;/
$82:85E7 E2 20 SEP #$20
$82:85E9 64 6E STZ $6E [$7E:006E] ;\
$82:85EB 64 71 STZ $71 [$7E:0071] ;} Disable colour math
$82:85ED A9 10 LDA #$10 ;\
$82:85EF 85 69 STA $69 [$7E:0069] ;} Main screen layers = sprites
$82:85F1 64 6B STZ $6B [$7E:006B] ; Disable subscreen layers
$82:85F3 64 6C STZ $6C [$7E:006C] ;\
$82:85F5 64 6D STZ $6D [$7E:006D] ;} Enable all layers in window area
$82:85F7 C2 20 REP #$20 ; >_<;
$82:85F9 28 PLP
$82:85FA 60 RTS
}
;;; $85FB: Game state 2Ch (transition from demo) ;;;
{
$82:85FB 08 PHP
$82:85FC C2 30 REP #$30
$82:85FE A9 01 00 LDA #$0001 ;\
$82:8601 8D 98 09 STA $0998 [$7E:0998] ;} Game state = 1 (title sequence)
$82:8604 AD EC 0D LDA $0DEC [$7E:0DEC] ;\
$82:8607 30 26 BMI $26 [$862F] ;} If [demo control flags] & 8000h != 0 (demo set has another scene remaining): go to BRANCH_NEXT_DEMO_SCENE
$82:8609 D0 12 BNE $12 [$861D] ; If [demo control flags] = 0 (didn't press button to exit demos):
$82:860B A9 00 00 LDA #$0000 ;\
$82:860E 22 C1 8F 80 JSL $808FC1[$80:8FC1] ;} Queue music stop
$82:8612 9C F5 05 STZ $05F5 [$7E:05F5] ; Enable sounds
$82:8615 A9 68 9B LDA #$9B68 ;\
$82:8618 8D 51 1F STA $1F51 [$7E:1F51] ;} Cinematic function = $9B68 (title sequence)
$82:861B 28 PLP
$82:861C 60 RTS ; Return
$82:861D 22 87 9B 8B JSL $8B9B87[$8B:9B87] ; Load title sequence graphics
$82:8621 A9 02 00 LDA #$0002 ;\
$82:8624 8D 53 1A STA $1A53 [$7E:1A53] ;} Demo timer = 2
$82:8627 A9 47 9A LDA #$9A47 ;\
$82:862A 8D 51 1F STA $1F51 [$7E:1F51] ;} Cinematic function = RTS
$82:862D 28 PLP
$82:862E 60 RTS ; Return
; BRANCH_NEXT_DEMO_SCENE
$82:862F A9 28 00 LDA #$0028 ;\
$82:8632 8D 98 09 STA $0998 [$7E:0998] ;} Game state = 28h (load demo game data)
$82:8635 28 PLP
$82:8636 60 RTS
}
;;; $8637: Check for next demo ;;;
{
$82:8637 08 PHP
$82:8638 C2 30 REP #$30
$82:863A AD 57 1F LDA $1F57 [$7E:1F57] ;\
$82:863D 0A ASL A ;|
$82:863E 0A ASL A ;|
$82:863F 0A ASL A ;|
$82:8640 6D 57 1F ADC $1F57 [$7E:1F57] ;|
$82:8643 0A ASL A ;|
$82:8644 85 12 STA $12 [$7E:0012] ;|
$82:8646 AD 55 1F LDA $1F55 [$7E:1F55] ;} A = [[$876C + [demo set] * 2] + [demo scene] * 12h]
$82:8649 0A ASL A ;|
$82:864A AA TAX ;|
$82:864B BD 6C 87 LDA $876C,x[$82:876C] ;|
$82:864E 18 CLC ;|
$82:864F 65 12 ADC $12 [$7E:0012] ;|
$82:8651 AA TAX ;|
$82:8652 BD 00 00 LDA $0000,x[$82:8786] ;/
$82:8655 C9 FF FF CMP #$FFFF ;\
$82:8658 D0 17 BNE $17 [$8671] ;} If [A] != FFFFh: go to BRANCH_NEXT_DEMO_SCENE
$82:865A 9C EC 0D STZ $0DEC [$7E:0DEC] ; Demo control flags = 0
$82:865D AD 55 1F LDA $1F55 [$7E:1F55] ;\
$82:8660 1A INC A ;|
$82:8661 CD 59 1F CMP $1F59 [$7E:1F59] ;|
$82:8664 90 03 BCC $03 [$8669] ;} Demo set = (demo set + 1) % [number of demo sets]
$82:8666 A9 00 00 LDA #$0000 ;|
;|
$82:8669 8D 55 1F STA $1F55 [$7E:1F55] ;/
$82:866C 9C 57 1F STZ $1F57 [$7E:1F57] ; Demo scene = 0
$82:866F 28 PLP
$82:8670 60 RTS ; Return
; BRANCH_NEXT_DEMO_SCENE
$82:8671 A9 00 80 LDA #$8000 ;\
$82:8674 8D EC 0D STA $0DEC [$7E:0DEC] ;} Demo control flags = 8000h (demo set has another scene remaining)
$82:8677 28 PLP
$82:8678 60 RTS
}
;;; $8679: Load demo room data ;;;
{
$82:8679 08 PHP
$82:867A C2 30 REP #$30
$82:867C 9C 8D 07 STZ $078D [$7E:078D] ; Door pointer = 0
$82:867F AD 57 1F LDA $1F57 [$7E:1F57] ;\
$82:8682 0A ASL A ;|
$82:8683 0A ASL A ;|
$82:8684 0A ASL A ;|
$82:8685 6D 57 1F ADC $1F57 [$7E:1F57] ;|
$82:8688 0A ASL A ;|
$82:8689 85 12 STA $12 [$7E:0012] ;|
$82:868B AD 55 1F LDA $1F55 [$7E:1F55] ;} X = [$876C + [demo set] * 2] + [demo scene] * 12h
$82:868E 0A ASL A ;|
$82:868F AA TAX ;|
$82:8690 BD 6C 87 LDA $876C,x[$82:876C] ;|
$82:8693 18 CLC ;|
$82:8694 65 12 ADC $12 [$7E:0012] ;|
$82:8696 AA TAX ;/
$82:8697 BD 00 00 LDA $0000,x[$82:8774] ;\
$82:869A 8D 9B 07 STA $079B [$7E:079B] ;} Room pointer = [[X]]
$82:869D BD 02 00 LDA $0002,x[$82:8776] ;\
$82:86A0 8D 8D 07 STA $078D [$7E:078D] ;} Door pointer = [[X] + 2]
$82:86A3 BD 04 00 LDA $0004,x[$82:8778] ;\
$82:86A6 8D 8F 07 STA $078F [$7E:078F] ;} Door BTS = [[X] + 4]
$82:86A9 BD 06 00 LDA $0006,x[$82:877A] ;\
$82:86AC 8D 11 09 STA $0911 [$7E:0911] ;} Layer 1 X position = BG1 X offset = [[X] + 6]
$82:86AF 8D 1D 09 STA $091D [$7E:091D] ;/
$82:86B2 BD 08 00 LDA $0008,x[$82:877C] ;\
$82:86B5 8D 15 09 STA $0915 [$7E:0915] ;} Layer 1 Y position = BG1 Y offset = [[X] + 8]
$82:86B8 8D 1F 09 STA $091F [$7E:091F] ;/
$82:86BB BD 0A 00 LDA $000A,x[$82:877E] ;\
$82:86BE 18 CLC ;|
$82:86BF 6D 15 09 ADC $0915 [$7E:0915] ;} Samus previous Y position = Samus Y position = [layer 1 Y position] + [[X] + Ah]
$82:86C2 8D FA 0A STA $0AFA [$7E:0AFA] ;|
$82:86C5 8D 14 0B STA $0B14 [$7E:0B14] ;/
$82:86C8 AD 11 09 LDA $0911 [$7E:0911] ;\
$82:86CB 18 CLC ;|
$82:86CC 69 80 00 ADC #$0080 ;|
$82:86CF 18 CLC ;} Samus previous X position = Samus X position = [layer 1 X position] + 80h + [[X] + Ch]
$82:86D0 7D 0C 00 ADC $000C,x[$82:8780] ;|
$82:86D3 8D F6 0A STA $0AF6 [$7E:0AF6] ;|
$82:86D6 8D 10 0B STA $0B10 [$7E:0B10] ;/
$82:86D9 BD 0E 00 LDA $000E,x[$82:8782] ;\
$82:86DC 8D 53 1F STA $1F53 [$7E:1F53] ;} Demo timer = [[X] + Eh]
$82:86DF 8B PHB ;\
$82:86E0 E2 20 SEP #$20 ;|
$82:86E2 A9 8F LDA #$8F ;|
$82:86E4 48 PHA ;|
$82:86E5 AB PLB ;|
$82:86E6 AE 9B 07 LDX $079B [$8F:079B] ;} Set area from room header
$82:86E9 BD 01 00 LDA $0001,x[$8F:91F9] ;|
$82:86EC 8D 9F 07 STA $079F [$8F:079F] ;|
$82:86EF C2 20 REP #$20 ;|
$82:86F1 AB PLB ;/
$82:86F2 64 B1 STZ $B1 [$7E:00B1] ; BG1 X scroll = 0
$82:86F4 64 B3 STZ $B3 [$7E:00B3] ; BG1 Y scroll = 0
$82:86F6 EE 57 1F INC $1F57 [$7E:1F57] ; Increment demo scene
$82:86F9 A2 00 00 LDX #$0000 ;\
;|
$82:86FC A9 FF FF LDA #$FFFF ;|
$82:86FF 9F 30 D8 7E STA $7ED830,x[$7E:D830];|
$82:8703 9F 70 D8 7E STA $7ED870,x[$7E:D870];|
$82:8707 9F F0 D8 7E STA $7ED8F0,x[$7E:D8F0];|
$82:870B 9F 08 D9 7E STA $7ED908,x[$7E:D908];|
$82:870F 9F F8 D8 7E STA $7ED8F8,x[$7E:D8F8];|
$82:8713 9F 00 D9 7E STA $7ED900,x[$7E:D900];|
$82:8717 A9 00 00 LDA #$0000 ;|
$82:871A 9F B0 D8 7E STA $7ED8B0,x[$7E:D8B0];|
$82:871E 9F 20 D8 7E STA $7ED820,x[$7E:D820];|
$82:8722 9F 28 D8 7E STA $7ED828,x[$7E:D828];|
$82:8726 E8 INX ;} Set all item / map station / save station / debug elevator bits
$82:8727 E8 INX ;} Clear all door / event / boss bits
$82:8728 E0 08 00 CPX #$0008 ;|
$82:872B 30 CF BMI $CF [$86FC] ;|
;|
$82:872D A9 FF FF LDA #$FFFF ;|
$82:8730 9F 30 D8 7E STA $7ED830,x[$7E:D838];|
$82:8734 9F 70 D8 7E STA $7ED870,x[$7E:D878];|
$82:8738 A9 00 00 LDA #$0000 ;|
$82:873B 9F B0 D8 7E STA $7ED8B0,x[$7E:D8B8];|
$82:873F E8 INX ;|
$82:8740 E8 INX ;|
$82:8741 E0 40 00 CPX #$0040 ;|
$82:8744 30 E7 BMI $E7 [$872D] ;/
$82:8746 A9 00 00 LDA #$0000 ;\
$82:8749 A2 00 00 LDX #$0000 ;|
;|
$82:874C 9F 52 CD 7E STA $7ECD52,x[$7E:CD52];|
$82:8750 E8 INX ;} Clear map data (not including Ceres or debug area)
$82:8751 E8 INX ;|
$82:8752 E0 00 06 CPX #$0600 ;|
$82:8755 30 F5 BMI $F5 [$874C] ;/
$82:8757 A9 00 00 LDA #$0000
$82:875A 8D D4 09 STA $09D4 [$7E:09D4] ; Max reserve health = 0
$82:875D 8D D6 09 STA $09D6 [$7E:09D6] ; Reserve health = 0
$82:8760 8D C0 09 STA $09C0 [$7E:09C0] ; Reserve health mode = not obtained
$82:8763 8F 14 D9 7E STA $7ED914[$7E:D914] ; Loading game state = 0 (intro)
$82:8767 8D F7 05 STA $05F7 [$7E:05F7] ; Enable mini-map
$82:876A 28 PLP
$82:876B 60 RTS
}
;;; $876C: Demo room data ;;;
{
; Pointers to demo room data
$82:876C dw 8774, 87E2, 8850, 88BE
; ___________________________________________________ Room pointer
; | _____________________________________________ Door pointer
; | | _______________________________________ Door slot
; | | | _________________________________ Screen X position
; | | | | ___________________________ Screen Y position
; | | | | | _____________________ Samus Y offset from top of screen
; | | | | | | _______________ Samus X offset from centre of screen
; | | | | | | | _________ Length of demo
; | | | | | | | | ___ Pointer to code
; | | | | | | | | |
$82:8774 dw 91F8, 896A, 0001, 0400, 0400, 0040, 0001, 04D3, 8925, ; Landing site
9F11, 8EAA, 0001, 0000, 0000, 006B, FFD2, 0151, 8924, ; Missile door
9D9C, 8DC6, 0000, 0100, 0000, 00BB, FFE0, 017A, 8924, ; Pre Spore Spawn hall
B106, 970E, 0000, 0700, 0000, 008B, 0048, 01A4, 8924, ; Speed booster
AFFB, 9792, 0001, 0000, 0000, 008B, FFC2, 01BC, 8924, ; Grapple beam
9D19, 8E7A, 0000, 0200, 0600, 0099, 0027, 0265, 891A, ; Pseudo screw attack
FFFF
$82:87E2 dw A408, A36C, 0000, 0100, 0100, 008B, 0056, 01FD, 8924, ; Ice beam
9C5E, 8CCA, 0003, 0200, 0000, 008B, 0049, 019A, 8924, ; Fireflea room
9E52, 8DEA, 0003, 0500, 0300, 00AB, FFE2, 0117, 8924, ; Brinstar diagonal room
AF14, 967E, 0002, 0300, 0000, 008B, 004B, 03CA, 8924, ; Lower Norfair entrance
9879, 8982, 0003, 0000, 0000, 00BB, FFF1, 00D5, 8924, ; Screw attack
9CB3, 8DD2, 0001, 0400, 0200, 0080, 0005, 0317, 8924, ; Dachora
FFFF
$82:8850 dw CC6F, A21C, 0003, 0200, 0000, 0060, 0004, 02EF, 8924, ; Pre Phantoon hall
91F8, 896A, 0001, 0300, 0400, 00B0, 0000, 00C7, 8925, ; Shinespark
A56B, 919E, 0001, 0000, 0100, 008B, FFD2, 02D3, 8924, ; Eye door
A322, 90EA, 0000, 0000, 0700, 008B, FFAA, 0164, 8924, ; Red Brinstar -> Crateria elevator
A59F, 91B6, 0001, 0000, 0100, 008B, FFBF, 013F, 892B, ; Kraid
A66A, 91F2, 0001, 0000, 0000, 008B, FFB1, 0197, 8932, ; Tourian entrance
FFFF
$82:88BE dw 91F8, 890A, 0000, 0600, 0200, 0080, 0030, 0100, 8925, ; Gauntlet entrance
D0B9, A474, 0000, 0200, 0000, 00AB, 0000, 0332, 8924, ; Advanced grapple beam
91F8, 890A, 0000, 0600, 0200, 007B, 0020, 0185, 8925, ; IBJ
9AD9, 8D42, 0001, 0000, 0400, 008B, FFB7, 018A, 8924, ; SBA
91F8, 890A, 0000, 0600, 0200, 008B, 0004, 0200, 8925, ; Crystal flash
FFFF
}
;;; $891A: Demo room code - charge beam room: scroll 21h = red ;;;
{
$82:891A E2 20 SEP #$20
$82:891C A9 00 LDA #$00
$82:891E 8F 41 CD 7E STA $7ECD41[$7E:CD41]
$82:8922 C2 20 REP #$20
$82:8924 60 RTS
}
;;; $8925: Demo room code - landing site: BG2 tilemap size = 32x64 ;;;
{
$82:8925 A9 4A 00 LDA #$004A
$82:8928 85 59 STA $59 [$7E:0059]
$82:892A 60 RTS
}
;;; $892B: Demo room code - Kraid - Kraid function timer = 60 ;;;
{
$82:892B A9 3C 00 LDA #$003C
$82:892E 8D B2 0F STA $0FB2 [$7E:0FB2]
$82:8931 60 RTS
}
;;; $8932: Demo room code - Tourian entrance - Brinstar boss bits = Kraid is dead ;;;
{
$82:8932 E2 20 SEP #$20
$82:8934 A9 01 LDA #$01
$82:8936 8F 29 D8 7E STA $7ED829[$7E:D829]
$82:893A C2 20 REP #$20
$82:893C 60 RTS
}
}
;;; $893D: Main game loop ;;;