-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBank $8B.asm
15246 lines (13573 loc) · 685 KB
/
Bank $8B.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: Set up PPU for title sequence ;;;
{
; No idea why pause menu variables are being cleared here
$8B:8000 08 PHP
$8B:8001 E2 30 SEP #$30
$8B:8003 A9 80 LDA #$80 ;\
$8B:8005 8D 00 21 STA $2100 ;} Enable forced blank, brightness = 0
$8B:8008 85 51 STA $51 [$7E:0051] ;/
$8B:800A A9 03 LDA #$03 ;\
$8B:800C 8D 01 21 STA $2101 ;} Sprite tiles base address = $6000, sprite sizes = 8x8 / 16x16
$8B:800F 85 52 STA $52 [$7E:0052] ;/
$8B:8011 A9 07 LDA #$07 ;\
$8B:8013 8D 05 21 STA $2105 ;} BG mode = 7
$8B:8016 85 55 STA $55 [$7E:0055] ;/
$8B:8018 A9 80 LDA #$80 ;\
$8B:801A 8D 1A 21 STA $211A ;} Set mode 7 BG map overflowing tiles as transparent, no screen flip
$8B:801D 85 5F STA $5F [$7E:005F] ;/
$8B:801F A9 00 LDA #$00 ;\
$8B:8021 85 58 STA $58 [$7E:0058] ;} BG1 tilemap base address = $0000, size = 32x32
$8B:8023 8D 07 21 STA $2107 ;/
$8B:8026 64 59 STZ $59 [$7E:0059] ;\
$8B:8028 9C 08 21 STZ $2108 ;} BG2 tilemap base address = $0000, size = 32x32
$8B:802B 64 5A STZ $5A [$7E:005A] ;\
$8B:802D 9C 09 21 STZ $2109 ;} BG3 tilemap base address = $0000, size = 32x32
$8B:8030 64 5C STZ $5C [$7E:005C] ;\
$8B:8032 9C 0A 21 STZ $210A ;} BG4 tilemap base address = $0000, size = 32x32
$8B:8035 64 5D STZ $5D [$7E:005D] ;\
$8B:8037 9C 0B 21 STZ $210B ;|
$8B:803A 64 5E STZ $5E [$7E:005E] ;} BG tiles base address = $0000
$8B:803C 9C 0C 21 STZ $210C ;/
$8B:803F A9 10 LDA #$10 ;\
$8B:8041 8D 2C 21 STA $212C ;} Main screen layers = sprites
$8B:8044 85 69 STA $69 [$7E:0069] ;/
$8B:8046 9C 2D 21 STZ $212D ;\
$8B:8049 64 6B STZ $6B [$7E:006B] ;} Disable all subscreen layers
$8B:804B 9C 2E 21 STZ $212E ;\
$8B:804E 64 6C STZ $6C [$7E:006C] ;} Enable all layers in window area main screen
$8B:8050 9C 15 21 STZ $2115 ; VRAM address increment mode = 8-bit access
$8B:8053 9C 30 21 STZ $2130 ;\
$8B:8056 64 6E STZ $6E [$7E:006E] ;|
$8B:8058 9C 31 21 STZ $2131 ;} Disable colour math
$8B:805B 64 71 STZ $71 [$7E:0071] ;/
$8B:805D A9 E0 LDA #$E0 ;\
$8B:805F 8D 32 21 STA $2132 ;} Colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:8062 A9 00 LDA #$00 ;\
$8B:8064 8D 33 21 STA $2133 ;} Use standard NTSC resolution
$8B:8067 85 77 STA $77 [$7E:0077] ;/
$8B:8069 C2 30 REP #$30
$8B:806B A9 00 00 LDA #$0000 ;\
$8B:806E A2 00 30 LDX #$3000 ;|
$8B:8071 A0 FE 07 LDY #$07FE ;} $7E:3000..37FD = 0
$8B:8074 22 F6 83 80 JSL $8083F6[$80:83F6] ;/
$8B:8078 9C 90 05 STZ $0590 [$7E:0590] ; OAM data index = 0
$8B:807B 9C 9E 09 STZ $099E [$7E:099E] ; Menu option index = 0
$8B:807E 9C 23 07 STZ $0723 [$7E:0723] ; Screen fade delay = 0
$8B:8081 9C 25 07 STZ $0725 [$7E:0725] ; Screen fade counter = 0
$8B:8084 9C 29 07 STZ $0729 [$7E:0729] ;\
$8B:8087 9C 2B 07 STZ $072B [$7E:072B] ;|
$8B:808A 9C 2D 07 STZ $072D [$7E:072D] ;} $0729..32 = 0 (some pause menu animation timers)
$8B:808D 9C 2F 07 STZ $072F [$7E:072F] ;|
$8B:8090 9C 31 07 STZ $0731 [$7E:0731] ;/
$8B:8093 9C 3D 07 STZ $073D [$7E:073D] ;\
$8B:8096 9C 3F 07 STZ $073F [$7E:073F] ;|
$8B:8099 9C 41 07 STZ $0741 [$7E:0741] ;} $073D..46 = 0 (some pause menu animation frames)
$8B:809C 9C 43 07 STZ $0743 [$7E:0743] ;|
$8B:809F 9C 45 07 STZ $0745 [$7E:0745] ;/
$8B:80A2 9C 51 07 STZ $0751 [$7E:0751] ;\
$8B:80A5 9C 53 07 STZ $0753 [$7E:0753] ;|
$8B:80A8 9C 55 07 STZ $0755 [$7E:0755] ;} $0751..5A = 0 (some pause menu animation modes)
$8B:80AB 9C 57 07 STZ $0757 [$7E:0757] ;|
$8B:80AE 9C 59 07 STZ $0759 [$7E:0759] ;/
$8B:80B1 9C D6 09 STZ $09D6 [$7E:09D6] ; Samus reserve health = 0
$8B:80B4 9C D8 09 STZ $09D8 [$7E:09D8] ; Samus reserve missiles = 0
$8B:80B7 9C 8D 19 STZ $198D [$7E:198D] ; Mode 7 transformation angle = 0
$8B:80BA A9 00 01 LDA #$0100 ;\
$8B:80BD 8D 8F 19 STA $198F [$7E:198F] ;} Mode 7 transformation zoom level = 100h
$8B:80C0 9C 91 19 STZ $1991 [$7E:1991] ;\
$8B:80C3 9C 93 19 STZ $1993 [$7E:1993] ;} Cinematic BG1 X position = 0.0
$8B:80C6 9C 95 19 STZ $1995 [$7E:1995] ;\
$8B:80C9 9C 97 19 STZ $1997 [$7E:1997] ;} Cinematic BG1 Y position = 0.0
$8B:80CC 9C 99 19 STZ $1999 [$7E:1999] ;\
$8B:80CF 9C 9B 19 STZ $199B [$7E:199B] ;} Cinematic BG1 X speed = 0.0
$8B:80D2 9C 9D 19 STZ $199D [$7E:199D] ;\
$8B:80D5 9C 9F 19 STZ $199F [$7E:199F] ;} Cinematic BG1 Y speed = 0.0
$8B:80D8 28 PLP
$8B:80D9 60 RTS
}
;;; $80DA: Set up PPU for intro ;;;
{
$8B:80DA 08 PHP
$8B:80DB E2 30 SEP #$30
$8B:80DD A9 80 LDA #$80 ;\
$8B:80DF 8D 00 21 STA $2100 ;} Enable forced blank, brightness = 0
$8B:80E2 85 51 STA $51 [$7E:0051] ;/
$8B:80E4 A9 03 LDA #$03 ;\
$8B:80E6 8D 01 21 STA $2101 ;} Sprite tiles base address = $6000, sprite sizes = 8x8 / 16x16
$8B:80E9 85 52 STA $52 [$7E:0052] ;/
$8B:80EB A9 09 LDA #$09 ;\
$8B:80ED 8D 05 21 STA $2105 ;} BG mode = 1 with BG3 priority, BG tile sizes = 8x8
$8B:80F0 85 55 STA $55 [$7E:0055] ;/
$8B:80F2 A9 00 LDA #$00 ;\
$8B:80F4 8D 1A 21 STA $211A ;} Set mode 7 BG map to wrap within 128x128 tile area, no screen flip
$8B:80F7 85 5F STA $5F [$7E:005F] ;/
$8B:80F9 A9 50 LDA #$50 ;\
$8B:80FB 85 58 STA $58 [$7E:0058] ;} BG1 tilemap base address = $5000, size = 32x32
$8B:80FD 8D 07 21 STA $2107 ;/
$8B:8100 A9 48 LDA #$48 ;\
$8B:8102 85 59 STA $59 [$7E:0059] ;} BG2 tilemap base address = $4800, size = 32x32
$8B:8104 8D 08 21 STA $2108 ;/
$8B:8107 A9 4C LDA #$4C ;\
$8B:8109 85 5A STA $5A [$7E:005A] ;} BG3 tilemap base address = $4C00, size = 32x32
$8B:810B 8D 09 21 STA $2109 ;/
$8B:810E 64 5C STZ $5C [$7E:005C] ;\
$8B:8110 9C 0A 21 STZ $210A ;} BG4 tilemap base address = $0000, size = 32x32
$8B:8113 64 5D STZ $5D [$7E:005D] ;\
$8B:8115 9C 0B 21 STZ $210B ;|
$8B:8118 A9 04 LDA #$04 ;} BG1/2/4 tiles base address = $0000, BG3 tiles base address = $4000
$8B:811A 85 5E STA $5E [$7E:005E] ;|
$8B:811C 8D 0C 21 STA $210C ;/
$8B:811F A9 04 LDA #$04 ;\
$8B:8121 8D 2C 21 STA $212C ;} Main screen layers = BG3
$8B:8124 85 69 STA $69 [$7E:0069] ;/
$8B:8126 9C 2D 21 STZ $212D ;\
$8B:8129 64 6B STZ $6B [$7E:006B] ;} Disable all subscreen layers
$8B:812B 9C 2E 21 STZ $212E ;\
$8B:812E 64 6C STZ $6C [$7E:006C] ;} Enable all layers in window area main screen
$8B:8130 9C 15 21 STZ $2115 ; VRAM address increment mode = 8-bit access
$8B:8133 9C 30 21 STZ $2130 ;\
$8B:8136 64 6E STZ $6E [$7E:006E] ;|
$8B:8138 9C 31 21 STZ $2131 ;} Disable PPU colour math
$8B:813B 64 71 STZ $71 [$7E:0071] ;/
$8B:813D A9 E0 LDA #$E0 ;\
$8B:813F 8D 32 21 STA $2132 ;} PPU colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:8142 A9 00 LDA #$00 ;\
$8B:8144 8D 33 21 STA $2133 ;} Use standard NTSC resolution
$8B:8147 85 77 STA $77 [$7E:0077] ;/
$8B:8149 64 6F STZ $6F [$7E:006F] ;\
$8B:814B 64 72 STZ $72 [$7E:0072] ;} Disable colour math
$8B:814D A9 20 LDA #$20 ;\
$8B:814F 85 74 STA $74 [$7E:0074] ;|
$8B:8151 A9 40 LDA #$40 ;|
$8B:8153 85 75 STA $75 [$7E:0075] ;} Colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:8155 A9 80 LDA #$80 ;|
$8B:8157 85 76 STA $76 [$7E:0076] ;/
$8B:8159 64 57 STZ $57 [$7E:0057] ; Disable mosaic
$8B:815B C2 30 REP #$30
$8B:815D A9 2F 00 LDA #$002F ;\
$8B:8160 A2 00 30 LDX #$3000 ;|
$8B:8163 A0 FE 07 LDY #$07FE ;} $7E:3000..37FD = 0
$8B:8166 22 F6 83 80 JSL $8083F6[$80:83F6] ;/
$8B:816A 9C 90 05 STZ $0590 [$7E:0590] ; OAM data index = 0
$8B:816D 9C 8D 19 STZ $198D [$7E:198D] ; Mode 7 transformation angle = 0
$8B:8170 A9 00 01 LDA #$0100 ;\
$8B:8173 8D 8F 19 STA $198F [$7E:198F] ;} Mode 7 transformation zoom level = 100h
$8B:8176 9C 91 19 STZ $1991 [$7E:1991] ;\
$8B:8179 9C 93 19 STZ $1993 [$7E:1993] ;} Cinematic BG1 X position = 0.0
$8B:817C 9C 95 19 STZ $1995 [$7E:1995] ;\
$8B:817F 9C 97 19 STZ $1997 [$7E:1997] ;} Cinematic BG1 Y position = 0.0
$8B:8182 9C 99 19 STZ $1999 [$7E:1999] ;\
$8B:8185 9C 9B 19 STZ $199B [$7E:199B] ;} Cinematic BG1 X speed = 0.0
$8B:8188 9C 9D 19 STZ $199D [$7E:199D] ;\
$8B:818B 9C 9F 19 STZ $199F [$7E:199F] ;} Cinematic BG1 Y speed = 0.0
$8B:818E 9C 82 19 STZ $1982 [$7E:1982] ; Default layer blending configuration = 0
$8B:8191 64 B5 STZ $B5 [$7E:00B5] ; BG2 X scroll = 0
$8B:8193 64 B7 STZ $B7 [$7E:00B7] ; BG2 Y scroll = 0
$8B:8195 64 B9 STZ $B9 [$7E:00B9] ; BG3 X scroll = 0
$8B:8197 64 BB STZ $BB [$7E:00BB] ; BG3 Y scroll = 0
$8B:8199 28 PLP
$8B:819A 60 RTS
}
;;; $819B: Set up PPU for Ceres cutscene ;;;
{
$8B:819B 08 PHP
$8B:819C E2 30 SEP #$30
$8B:819E A9 80 LDA #$80 ;\
$8B:81A0 8D 00 21 STA $2100 ;} Enable forced blank, brightness = 0
$8B:81A3 85 51 STA $51 [$7E:0051] ;/
$8B:81A5 A9 03 LDA #$03 ;\
$8B:81A7 8D 01 21 STA $2101 ;} Sprite tiles base address = $6000, sprite sizes = 8x8 / 16x16
$8B:81AA 85 52 STA $52 [$7E:0052] ;/
$8B:81AC A9 07 LDA #$07 ;\
$8B:81AE 8D 05 21 STA $2105 ;} BG mode = 7
$8B:81B1 85 55 STA $55 [$7E:0055] ;/
$8B:81B3 A9 80 LDA #$80 ;\
$8B:81B5 8D 1A 21 STA $211A ;} Set mode 7 BG map overflowing tiles as transparent, no screen flip
$8B:81B8 85 5F STA $5F [$7E:005F] ;/
$8B:81BA A9 00 LDA #$00 ;\
$8B:81BC 85 58 STA $58 [$7E:0058] ;} BG1 tilemap base address = $0000, size = 32x32
$8B:81BE 8D 07 21 STA $2107 ;/
$8B:81C1 64 59 STZ $59 [$7E:0059] ;\
$8B:81C3 9C 08 21 STZ $2108 ;} BG2 tilemap base address = $0000, size = 32x32
$8B:81C6 64 5A STZ $5A [$7E:005A] ;\
$8B:81C8 9C 09 21 STZ $2109 ;} BG3 tilemap base address = $0000, size = 32x32
$8B:81CB 64 5C STZ $5C [$7E:005C] ;\
$8B:81CD 9C 0A 21 STZ $210A ;} BG4 tilemap base address = $0000, size = 32x32
$8B:81D0 64 5D STZ $5D [$7E:005D] ;\
$8B:81D2 9C 0B 21 STZ $210B ;|
$8B:81D5 64 5E STZ $5E [$7E:005E] ;} BG tiles base address = $0000
$8B:81D7 9C 0C 21 STZ $210C ;/
$8B:81DA A9 11 LDA #$11 ;\
$8B:81DC 8D 2C 21 STA $212C ;} Main screen layers = BG1/sprites
$8B:81DF 85 69 STA $69 [$7E:0069] ;/
$8B:81E1 A9 00 LDA #$00 ;\
$8B:81E3 8D 2D 21 STA $212D ;} Disable all subscreen layers
$8B:81E6 85 6B STA $6B [$7E:006B] ;/
$8B:81E8 9C 2E 21 STZ $212E ;\
$8B:81EB 64 6C STZ $6C [$7E:006C] ;} Enable all layers in window area main screen
$8B:81ED 9C 15 21 STZ $2115 ; VRAM address increment mode = 8-bit access
$8B:81F0 9C 30 21 STZ $2130 ;\
$8B:81F3 64 6E STZ $6E [$7E:006E] ;|
$8B:81F5 9C 31 21 STZ $2131 ;|
$8B:81F8 64 71 STZ $71 [$7E:0071] ;|
$8B:81FA A9 E0 LDA #$E0 ;|
$8B:81FC 8D 32 21 STA $2132 ;|
$8B:81FF 64 6F STZ $6F [$7E:006F] ;|
$8B:8201 64 72 STZ $72 [$7E:0072] ;} Disable colour math, colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:8203 A9 20 LDA #$20 ;|
$8B:8205 85 74 STA $74 [$7E:0074] ;|
$8B:8207 A9 40 LDA #$40 ;|
$8B:8209 85 75 STA $75 [$7E:0075] ;|
$8B:820B A9 80 LDA #$80 ;|
$8B:820D 85 76 STA $76 [$7E:0076] ;/
$8B:820F 64 57 STZ $57 [$7E:0057] ; Disable mosaic
$8B:8211 C2 30 REP #$30
$8B:8213 9C 91 19 STZ $1991 [$7E:1991] ;\
$8B:8216 9C 93 19 STZ $1993 [$7E:1993] ;} Cinematic BG1 X position = 0.0
$8B:8219 9C 95 19 STZ $1995 [$7E:1995] ;\
$8B:821C 9C 97 19 STZ $1997 [$7E:1997] ;} Cinematic BG1 Y position = 0.0
$8B:821F 9C 99 19 STZ $1999 [$7E:1999] ;\
$8B:8222 9C 9B 19 STZ $199B [$7E:199B] ;} Cinematic BG1 X speed = 0.0
$8B:8225 9C 9D 19 STZ $199D [$7E:199D] ;\
$8B:8228 9C 9F 19 STZ $199F [$7E:199F] ;} Cinematic BG1 Y speed = 0.0
$8B:822B 9C 82 19 STZ $1982 [$7E:1982] ; Default layer blending configuration = 0
$8B:822E 28 PLP
$8B:822F 60 RTS
}
;;; $8230: Set up PPU for Samus goes to Zebes cutscene ;;;
{
$8B:8230 08 PHP
$8B:8231 E2 30 SEP #$30
$8B:8233 A9 80 LDA #$80 ;\
$8B:8235 8D 00 21 STA $2100 ;} Enable forced blank, brightness = 0
$8B:8238 85 51 STA $51 [$7E:0051] ;/
$8B:823A A9 03 LDA #$03 ;\
$8B:823C 8D 01 21 STA $2101 ;} Sprite tiles base address = $6000, sprite sizes = 8x8 / 16x16
$8B:823F 85 52 STA $52 [$7E:0052] ;/
$8B:8241 A9 01 LDA #$01 ;\
$8B:8243 8D 05 21 STA $2105 ;} BG mode = 1 without BG3 priority, BG tile sizes = 8x8
$8B:8246 85 55 STA $55 [$7E:0055] ;/
$8B:8248 A9 00 LDA #$00 ;\
$8B:824A 8D 1A 21 STA $211A ;} Set mode 7 BG map to wrap within 128x128 tile area, no screen flip
$8B:824D 85 5F STA $5F [$7E:005F] ;/
$8B:824F A9 5C LDA #$5C ;\
$8B:8251 85 58 STA $58 [$7E:0058] ;} BG1 tilemap base address = $5C00, size = 32x32
$8B:8253 8D 07 21 STA $2107 ;/
$8B:8256 64 59 STZ $59 [$7E:0059] ;\
$8B:8258 9C 08 21 STZ $2108 ;} BG2 tilemap base address = $0000, size = 32x32
$8B:825B 64 5A STZ $5A [$7E:005A] ;\
$8B:825D 9C 09 21 STZ $2109 ;} BG3 tilemap base address = $0000, size = 32x32
$8B:8260 64 5C STZ $5C [$7E:005C] ;\
$8B:8262 9C 0A 21 STZ $210A ;} BG4 tilemap base address = $0000, size = 32x32
$8B:8265 A9 06 LDA #$06 ;\
$8B:8267 85 5D STA $5D [$7E:005D] ;|
$8B:8269 8D 0B 21 STA $210B ;} BG1 tiles base address = $6000, BG2/3/4 tiles base address = $0000
$8B:826C 64 5E STZ $5E [$7E:005E] ;|
$8B:826E 9C 0C 21 STZ $210C ;/
$8B:8271 A9 11 LDA #$11 ;\
$8B:8273 8D 2C 21 STA $212C ;} Main screen layers = BG1/sprites
$8B:8276 85 69 STA $69 [$7E:0069] ;/
$8B:8278 9C 2D 21 STZ $212D ;\
$8B:827B 64 6B STZ $6B [$7E:006B] ;} Disable all subscreen layers
$8B:827D 64 60 STZ $60 [$7E:0060] ;\
$8B:827F 64 61 STZ $61 [$7E:0061] ;} Disable all window masks
$8B:8281 64 62 STZ $62 [$7E:0062] ;/
$8B:8283 64 6C STZ $6C [$7E:006C] ;\
$8B:8285 64 6D STZ $6D [$7E:006D] ;} Enable all layers in window area
$8B:8287 64 6F STZ $6F [$7E:006F] ;\
$8B:8289 64 72 STZ $72 [$7E:0072] ;} Disable colour math
$8B:828B C2 30 REP #$30
$8B:828D 64 B1 STZ $B1 [$7E:00B1] ; BG1 X scroll = 0
$8B:828F 64 B3 STZ $B3 [$7E:00B3] ; BG1 Y scroll = 0
$8B:8291 28 PLP
$8B:8292 60 RTS
}
;;; $8293: Set up PPU for Zebes destruction ;;;
{
$8B:8293 08 PHP
$8B:8294 E2 30 SEP #$30
$8B:8296 A9 80 LDA #$80 ;\
$8B:8298 8D 00 21 STA $2100 ;} Enable forced blank, brightness = 0
$8B:829B 85 51 STA $51 [$7E:0051] ;/
$8B:829D A9 A3 LDA #$A3 ;\
$8B:829F 8D 01 21 STA $2101 ;} Sprite tiles base address = $6000, sprite sizes = 32x32 / 64x64
$8B:82A2 85 52 STA $52 [$7E:0052] ;/
$8B:82A4 A9 07 LDA #$07 ;\
$8B:82A6 8D 05 21 STA $2105 ;} BG mode = 7
$8B:82A9 85 55 STA $55 [$7E:0055] ;/
$8B:82AB A9 00 LDA #$00 ;\
$8B:82AD 8D 1A 21 STA $211A ;} Set mode 7 BG map to wrap within 128x128 tile area, no screen flip
$8B:82B0 85 5F STA $5F [$7E:005F] ;/
$8B:82B2 A9 00 LDA #$00 ;\
$8B:82B4 85 58 STA $58 [$7E:0058] ;} BG1 tilemap base address = $0000, size = 32x32
$8B:82B6 8D 07 21 STA $2107 ;/
$8B:82B9 64 59 STZ $59 [$7E:0059] ;\
$8B:82BB 9C 08 21 STZ $2108 ;} BG2 tilemap base address = $0000, size = 32x32
$8B:82BE 64 5A STZ $5A [$7E:005A] ;\
$8B:82C0 9C 09 21 STZ $2109 ;} BG3 tilemap base address = $0000, size = 32x32
$8B:82C3 64 5C STZ $5C [$7E:005C] ;\
$8B:82C5 9C 0A 21 STZ $210A ;} BG4 tilemap base address = $0000, size = 32x32
$8B:82C8 64 5D STZ $5D [$7E:005D] ;\
$8B:82CA 9C 0B 21 STZ $210B ;|
$8B:82CD 64 5E STZ $5E [$7E:005E] ;} BG tiles base addresses = $0000
$8B:82CF 9C 0C 21 STZ $210C ;/
$8B:82D2 A9 11 LDA #$11 ;\
$8B:82D4 8D 2C 21 STA $212C ;} Main screen layers = BG1/sprites
$8B:82D7 85 69 STA $69 [$7E:0069] ;/
$8B:82D9 9C 2D 21 STZ $212D ;\
$8B:82DC 64 6B STZ $6B [$7E:006B] ;} Disable all subscreen layers
$8B:82DE 9C 2E 21 STZ $212E ;\
$8B:82E1 64 6C STZ $6C [$7E:006C] ;} Enable all layers in window area main screen
$8B:82E3 9C 15 21 STZ $2115 ; VRAM address increment mode = 8-bit access
$8B:82E6 9C 30 21 STZ $2130 ;\
$8B:82E9 64 6E STZ $6E [$7E:006E] ;|
$8B:82EB 9C 31 21 STZ $2131 ;|
$8B:82EE 64 71 STZ $71 [$7E:0071] ;} Disable colour math
$8B:82F0 64 6F STZ $6F [$7E:006F] ;|
$8B:82F2 64 72 STZ $72 [$7E:0072] ;/
$8B:82F4 A9 E0 LDA #$E0 ;\
$8B:82F6 8D 32 21 STA $2132 ;} PPU colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:82F9 A9 00 LDA #$00 ;\
$8B:82FB 8D 33 21 STA $2133 ;} Use standard NTSC resolution
$8B:82FE 85 77 STA $77 [$7E:0077] ;/
$8B:8300 A9 20 LDA #$20 ;\
$8B:8302 85 74 STA $74 [$7E:0074] ;|
$8B:8304 A9 40 LDA #$40 ;|
$8B:8306 85 75 STA $75 [$7E:0075] ;} Colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:8308 A9 80 LDA #$80 ;|
$8B:830A 85 76 STA $76 [$7E:0076] ;/
$8B:830C C2 30 REP #$30
$8B:830E 9C 90 05 STZ $0590 [$7E:0590] ; OAM data index = 0
$8B:8311 9C 23 07 STZ $0723 [$7E:0723] ; Screen fade delay = 0
$8B:8314 9C 25 07 STZ $0725 [$7E:0725] ; Screen fade counter = 0
$8B:8317 9C 8D 19 STZ $198D [$7E:198D] ; Mode 7 transformation angle = 0
$8B:831A A9 00 01 LDA #$0100 ;\
$8B:831D 8D 8F 19 STA $198F [$7E:198F] ;} Mode 7 transformation zoom level = 100h
$8B:8320 9C 91 19 STZ $1991 [$7E:1991] ;\
$8B:8323 9C 93 19 STZ $1993 [$7E:1993] ;} Cinematic BG1 X position = 0.0
$8B:8326 9C 95 19 STZ $1995 [$7E:1995] ;\
$8B:8329 9C 97 19 STZ $1997 [$7E:1997] ;} Cinematic BG1 Y position = 0.0
$8B:832C 9C 99 19 STZ $1999 [$7E:1999] ;\
$8B:832F 9C 9B 19 STZ $199B [$7E:199B] ;} Cinematic BG1 X speed = 0.0
$8B:8332 9C 9D 19 STZ $199D [$7E:199D] ;\
$8B:8335 9C 9F 19 STZ $199F [$7E:199F] ;} Cinematic BG1 Y speed = 0.0
$8B:8338 28 PLP
$8B:8339 60 RTS
}
;;; $833A: Unused. Set up PPU for Zebes destruction space view ;;;
{
; Corresponds to the PPU setup done at $DA64 as part of
; $DA1A: Cinematic function - ending - Zebes destruction scene 2 - cross-fade to space view
$8B:833A 08 PHP
$8B:833B E2 30 SEP #$30
$8B:833D A9 80 LDA #$80 ;\
$8B:833F 8D 00 21 STA $2100 ;} Enable forced blank, brightness = 0
$8B:8342 85 51 STA $51 [$7E:0051] ;/
$8B:8344 A9 02 LDA #$02 ;\
$8B:8346 8D 01 21 STA $2101 ;} Sprite tiles base address = $4000, sprite sizes = 8x8 / 16x16
$8B:8349 85 52 STA $52 [$7E:0052] ;/
$8B:834B A9 01 LDA #$01 ;\
$8B:834D 8D 05 21 STA $2105 ;} BG mode = 1 without BG3 priority, BG tile sizes = 8x8
$8B:8350 85 55 STA $55 [$7E:0055] ;/
$8B:8352 9C 1A 21 STZ $211A ;\
$8B:8355 64 5F STZ $5F [$7E:005F] ;} Set mode 7 BG map to wrap within 128x128 tile area, no screen flip
$8B:8357 A9 70 LDA #$70 ;\
$8B:8359 85 58 STA $58 [$7E:0058] ;} BG1 tilemap base address = $7000, size = 32x32
$8B:835B 8D 07 21 STA $2107 ;/
$8B:835E A9 78 LDA #$78 ;\
$8B:8360 85 59 STA $59 [$7E:0059] ;} BG2 tilemap base address = $7800, size = 32x32
$8B:8362 8D 08 21 STA $2108 ;/
$8B:8365 64 5A STZ $5A [$7E:005A] ;\
$8B:8367 9C 09 21 STZ $2109 ;} BG3 tilemap base address = $0000, size = 32x32
$8B:836A 64 5C STZ $5C [$7E:005C] ;\
$8B:836C 9C 0A 21 STZ $210A ;} BG4 tilemap base address = $0000, size = 32x32
$8B:836F A9 44 LDA #$44 ;\
$8B:8371 85 5D STA $5D [$7E:005D] ;|
$8B:8373 8D 0B 21 STA $210B ;} BG1/2 tiles base address = $4000, BG3/4 tiles base address = $0000
$8B:8376 64 5E STZ $5E [$7E:005E] ;|
$8B:8378 9C 0C 21 STZ $210C ;/
$8B:837B A9 10 LDA #$10 ;\
$8B:837D 8D 2C 21 STA $212C ;} Main screen layers = sprites
$8B:8380 85 69 STA $69 [$7E:0069] ;/
$8B:8382 9C 2D 21 STZ $212D ;\
$8B:8385 64 6B STZ $6B [$7E:006B] ;} Disable all subscreen layers
$8B:8387 9C 2E 21 STZ $212E ;\
$8B:838A 64 6C STZ $6C [$7E:006C] ;} Enable all layers in window area main screen
$8B:838C 9C 15 21 STZ $2115 ; VRAM address increment mode = 8-bit access
$8B:838F 9C 30 21 STZ $2130 ;\
$8B:8392 64 6E STZ $6E [$7E:006E] ;|
$8B:8394 9C 31 21 STZ $2131 ;|
$8B:8397 64 71 STZ $71 [$7E:0071] ;|
$8B:8399 A9 E0 LDA #$E0 ;|
$8B:839B 8D 32 21 STA $2132 ;|
$8B:839E 64 6F STZ $6F [$7E:006F] ;|
$8B:83A0 64 72 STZ $72 [$7E:0072] ;} Disable colour math, colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:83A2 A9 20 LDA #$20 ;|
$8B:83A4 85 74 STA $74 [$7E:0074] ;|
$8B:83A6 A9 40 LDA #$40 ;|
$8B:83A8 85 75 STA $75 [$7E:0075] ;|
$8B:83AA A9 80 LDA #$80 ;|
$8B:83AC 85 76 STA $76 [$7E:0076] ;/
$8B:83AE 64 57 STZ $57 [$7E:0057] ; Disable mosaic
$8B:83B0 C2 30 REP #$30
$8B:83B2 9C 91 19 STZ $1991 [$7E:1991] ;\
$8B:83B5 9C 93 19 STZ $1993 [$7E:1993] ;} Cinematic BG1 X position = 0.0
$8B:83B8 9C 95 19 STZ $1995 [$7E:1995] ;\
$8B:83BB 9C 97 19 STZ $1997 [$7E:1997] ;} Cinematic BG1 Y position = 0.0
$8B:83BE 9C 99 19 STZ $1999 [$7E:1999] ;\
$8B:83C1 9C 9B 19 STZ $199B [$7E:199B] ;} Cinematic BG1 X speed = 0.0
$8B:83C4 9C 9D 19 STZ $199D [$7E:199D] ;\
$8B:83C7 9C 9F 19 STZ $199F [$7E:199F] ;} Cinematic BG1 Y speed = 0.0
$8B:83CA 9C 82 19 STZ $1982 [$7E:1982] ; Default layer blending configuration = 0
$8B:83CD 64 B5 STZ $B5 [$7E:00B5] ; BG2 X scroll = 0
$8B:83CF 64 B7 STZ $B7 [$7E:00B7] ; BG2 Y scroll = 0
$8B:83D1 28 PLP
$8B:83D2 60 RTS
}
;;; $83D3: Set up PPU for credits ;;;
{
$8B:83D3 08 PHP
$8B:83D4 E2 30 SEP #$30
$8B:83D6 A9 80 LDA #$80 ;\
$8B:83D8 8D 00 21 STA $2100 ;} Enable forced blank, brightness = 0
$8B:83DB 85 51 STA $51 [$7E:0051] ;/
$8B:83DD A9 00 LDA #$00 ;\
$8B:83DF 8D 01 21 STA $2101 ;} Sprite tiles base address = $0000, sprite sizes = 8x8 / 16x16
$8B:83E2 85 52 STA $52 [$7E:0052] ;/
$8B:83E4 A9 01 LDA #$01 ;\
$8B:83E6 8D 05 21 STA $2105 ;} BG mode = 1 without BG3 priority, BG tile sizes = 8x8
$8B:83E9 85 55 STA $55 [$7E:0055] ;/
$8B:83EB A9 00 LDA #$00 ;\
$8B:83ED 8D 1A 21 STA $211A ;} Set mode 7 BG map to wrap within 128x128 tile area, no screen flip
$8B:83F0 85 5F STA $5F [$7E:005F] ;/
$8B:83F2 A9 48 LDA #$48 ;\
$8B:83F4 85 58 STA $58 [$7E:0058] ;} BG1 tilemap base address = $4800, size = 32x32
$8B:83F6 8D 07 21 STA $2107 ;/
$8B:83F9 A9 4C LDA #$4C ;\
$8B:83FB 85 59 STA $59 [$7E:0059] ;} BG2 tilemap base address = $4C00, size = 32x32
$8B:83FD 8D 08 21 STA $2108 ;/
$8B:8400 A9 24 LDA #$24 ;\
$8B:8402 85 5A STA $5A [$7E:005A] ;} BG3 tilemap base address = $2400, size = 32x32
$8B:8404 8D 09 21 STA $2109 ;/
$8B:8407 64 5C STZ $5C [$7E:005C] ;\
$8B:8409 9C 0A 21 STZ $210A ;} BG4 tilemap base address = $0000, size = 32x32
$8B:840C A9 54 LDA #$54 ;\
$8B:840E 85 5D STA $5D [$7E:005D] ;} BG1 tiles base address = $4000, BG2 tiles base address = $5000
$8B:8410 8D 0B 21 STA $210B ;/
$8B:8413 A9 02 LDA #$02 ;\
$8B:8415 85 5E STA $5E [$7E:005E] ;} BG3 tiles base address = $2000, BG4 tiles base address = $0000
$8B:8417 8D 0C 21 STA $210C ;/
$8B:841A A9 01 LDA #$01 ;\
$8B:841C 8D 2C 21 STA $212C ;} Main screen layers = BG1
$8B:841F 85 69 STA $69 [$7E:0069] ;/
$8B:8421 9C 2D 21 STZ $212D ;\
$8B:8424 64 6B STZ $6B [$7E:006B] ;} Disable all subscreen layers
$8B:8426 64 60 STZ $60 [$7E:0060] ;\
$8B:8428 64 61 STZ $61 [$7E:0061] ;} Disable all window masks
$8B:842A 64 62 STZ $62 [$7E:0062] ;/
$8B:842C 64 6C STZ $6C [$7E:006C] ;\
$8B:842E 64 6D STZ $6D [$7E:006D] ;} Enable all layers in window area
$8B:8430 64 6F STZ $6F [$7E:006F] ;\
$8B:8432 64 72 STZ $72 [$7E:0072] ;} Disable colour math
$8B:8434 A9 20 LDA #$20 ;\
$8B:8436 85 74 STA $74 [$7E:0074] ;|
$8B:8438 A9 40 LDA #$40 ;|
$8B:843A 85 75 STA $75 [$7E:0075] ;} Colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:843C A9 80 LDA #$80 ;|
$8B:843E 85 76 STA $76 [$7E:0076] ;/
$8B:8440 C2 30 REP #$30
$8B:8442 9C 90 05 STZ $0590 [$7E:0590] ; OAM data index = 0
$8B:8445 A9 00 01 LDA #$0100 ;\
$8B:8448 8D 1B 21 STA $211B ;|
$8B:844B 85 78 STA $78 [$7E:0078] ;|
$8B:844D 9C 1C 21 STZ $211C ;|
$8B:8450 64 7A STZ $7A [$7E:007A] ;} Mode 7 transformation matrix = identity
$8B:8452 9C 1D 21 STZ $211D ;|
$8B:8455 64 7C STZ $7C [$7E:007C] ;|
$8B:8457 8D 1E 21 STA $211E ;|
$8B:845A 85 7E STA $7E [$7E:007E] ;/
$8B:845C A9 80 00 LDA #$0080 ;\
$8B:845F 8D 1F 21 STA $211F ;|
$8B:8462 85 80 STA $80 [$7E:0080] ;} Mode 7 transformation origin = (80h, 80h)
$8B:8464 8D 20 21 STA $2120 ;|
$8B:8467 85 82 STA $82 [$7E:0082] ;/
$8B:8469 9C 8D 19 STZ $198D [$7E:198D] ; Mode 7 transformation angle = 0
$8B:846C A9 01 00 LDA #$0001 ;\
$8B:846F 8D 8F 19 STA $198F [$7E:198F] ;} Mode 7 transformation zoom level = 1
$8B:8472 64 B1 STZ $B1 [$7E:00B1] ; BG1 X scroll = 0
$8B:8474 64 B3 STZ $B3 [$7E:00B3] ; BG1 Y scroll = 0
$8B:8476 64 B5 STZ $B5 [$7E:00B5] ; BG2 X scroll = 0
$8B:8478 64 B7 STZ $B7 [$7E:00B7] ; BG2 Y scroll = 0
$8B:847A 9C 91 19 STZ $1991 [$7E:1991] ;\
$8B:847D 9C 93 19 STZ $1993 [$7E:1993] ;} Cinematic BG1 X position = 0.0
$8B:8480 9C 95 19 STZ $1995 [$7E:1995] ;\
$8B:8483 9C 97 19 STZ $1997 [$7E:1997] ;} Cinematic BG1 Y position = 0.0
$8B:8486 28 PLP
$8B:8487 60 RTS
}
;;; $8488: Unused. Debug. Modify mode 7 transformation and BG1 position with controller ;;;
{
$8B:8488 08 PHP
$8B:8489 C2 30 REP #$30
$8B:848B A5 8B LDA $8B [$7E:008B] ;\
$8B:848D 89 00 02 BIT #$0200 ;} If pressing left:
$8B:8490 F0 0A BEQ $0A [$849C] ;/
$8B:8492 AD 93 19 LDA $1993 [$7E:1993] ;\
$8B:8495 18 CLC ;|
$8B:8496 69 02 00 ADC #$0002 ;} Cinematic BG1 X position += 2
$8B:8499 8D 93 19 STA $1993 [$7E:1993] ;/
$8B:849C A5 8B LDA $8B [$7E:008B] ;\
$8B:849E 89 00 01 BIT #$0100 ;} If pressing right:
$8B:84A1 F0 0A BEQ $0A [$84AD] ;/
$8B:84A3 AD 93 19 LDA $1993 [$7E:1993] ;\
$8B:84A6 38 SEC ;|
$8B:84A7 E9 02 00 SBC #$0002 ;} Cinematic BG1 X position -= 2
$8B:84AA 8D 93 19 STA $1993 [$7E:1993] ;/
$8B:84AD A5 8B LDA $8B [$7E:008B] ;\
$8B:84AF 89 00 08 BIT #$0800 ;} If pressing up:
$8B:84B2 F0 0A BEQ $0A [$84BE] ;/
$8B:84B4 AD 97 19 LDA $1997 [$7E:1997] ;\
$8B:84B7 18 CLC ;|
$8B:84B8 69 02 00 ADC #$0002 ;} Cinematic BG1 Y position += 2
$8B:84BB 8D 97 19 STA $1997 [$7E:1997] ;/
$8B:84BE A5 8B LDA $8B [$7E:008B] ;\
$8B:84C0 89 00 04 BIT #$0400 ;} If pressing down:
$8B:84C3 F0 0A BEQ $0A [$84CF] ;/
$8B:84C5 AD 97 19 LDA $1997 [$7E:1997] ;\
$8B:84C8 38 SEC ;|
$8B:84C9 E9 02 00 SBC #$0002 ;} Cinematic BG1 Y position -= 2
$8B:84CC 8D 97 19 STA $1997 [$7E:1997] ;/
$8B:84CF A5 8B LDA $8B [$7E:008B] ;\
$8B:84D1 89 10 00 BIT #$0010 ;} If not pressing R:
$8B:84D4 D0 11 BNE $11 [$84E7] ;/
$8B:84D6 89 20 00 BIT #$0020 ;\
$8B:84D9 F0 16 BEQ $16 [$84F1] ;} If pressing L:
$8B:84DB AD 8D 19 LDA $198D [$7E:198D] ;\
$8B:84DE 3A DEC A ;|
$8B:84DF 29 FF 00 AND #$00FF ;} Mode 7 transformation angle = ([mode 7 transformation angle] - 1) % 100h
$8B:84E2 8D 8D 19 STA $198D [$7E:198D] ;/
$8B:84E5 80 0A BRA $0A [$84F1]
$8B:84E7 AD 8D 19 LDA $198D [$7E:198D] ;\ Else (pressing R):
$8B:84EA 1A INC A ;|
$8B:84EB 29 FF 00 AND #$00FF ;} Mode 7 transformation angle = ([mode 7 transformation angle] + 1) % 100h
$8B:84EE 8D 8D 19 STA $198D [$7E:198D] ;/
$8B:84F1 A5 8B LDA $8B [$7E:008B] ;\
$8B:84F3 89 00 80 BIT #$8000 ;} If pressing B: go to BRANCH_ZOOM_OUT
$8B:84F6 D0 07 BNE $07 [$84FF] ;/
$8B:84F8 89 40 00 BIT #$0040 ;\
$8B:84FB D0 10 BNE $10 [$850D] ;} If pressing X: go to BRANCH_ZOOM_IN
$8B:84FD 28 PLP
$8B:84FE 60 RTS ; Return
; BRANCH_ZOOM_OUT
$8B:84FF AD 8F 19 LDA $198F [$7E:198F] ;\
$8B:8502 C9 00 70 CMP #$7000 ;|
$8B:8505 10 0F BPL $0F [$8516] ;} Mode 7 transformation zoom level = min(7000h, [mode 7 transformation zoom level] + 1)
$8B:8507 1A INC A ;|
$8B:8508 8D 8F 19 STA $198F [$7E:198F] ;/
$8B:850B 80 09 BRA $09 [$8516] ; Return
; BRANCH_ZOOM_IN
$8B:850D AD 8F 19 LDA $198F [$7E:198F] ;\
$8B:8510 F0 04 BEQ $04 [$8516] ;|
$8B:8512 3A DEC A ;} Mode 7 transformation zoom level = max(0, [mode 7 transformation zoom level] - 1)
$8B:8513 8D 8F 19 STA $198F [$7E:198F] ;/
$8B:8516 28 PLP
$8B:8517 60 RTS
}
;;; $8518: Handle mode 7 transformation matrix and BG1 position - no rotation ;;;
{
$8B:8518 08 PHP
$8B:8519 C2 30 REP #$30
$8B:851B AD 8F 19 LDA $198F [$7E:198F] ;\
$8B:851E 85 78 STA $78 [$7E:0078] ;} Mode 7 transformation matrix parameter A/D = [mode 7 transformation zoom level]
$8B:8520 85 7E STA $7E [$7E:007E] ;/
$8B:8522 64 7A STZ $7A [$7E:007A] ;\
$8B:8524 64 7C STZ $7C [$7E:007C] ;} Mode 7 transformation matrix parameter B/C = 0
$8B:8526 AD 93 19 LDA $1993 [$7E:1993] ;\
$8B:8529 85 B1 STA $B1 [$7E:00B1] ;} BG1 X scroll = [cinematic BG1 X position]
$8B:852B AD 97 19 LDA $1997 [$7E:1997] ;\
$8B:852E 85 B3 STA $B3 [$7E:00B3] ;} BG1 Y scroll = [cinematic BG1 Y position]
$8B:8530 28 PLP
$8B:8531 60 RTS
}
;;; $8532: Handle mode 7 transformation matrix and BG1 position ;;;
{
$8B:8532 08 PHP
$8B:8533 C2 30 REP #$30
$8B:8535 AD 8D 19 LDA $198D [$7E:198D] ;\
$8B:8538 18 CLC ;|
$8B:8539 69 40 00 ADC #$0040 ;|
$8B:853C 29 FF 00 AND #$00FF ;|
$8B:853F 0A ASL A ;} $26 = cos([mode 7 transformation angle] * pi / 80h) * 100h
$8B:8540 AA TAX ;|
$8B:8541 BF 43 B4 A0 LDA $A0B443,x[$A0:B4C3];|
$8B:8545 85 26 STA $26 [$7E:0026] ;/
$8B:8547 AD 8F 19 LDA $198F [$7E:198F] ;\
$8B:854A 85 28 STA $28 [$7E:0028] ;} $28 = [mode 7 transformation zoom level]
$8B:854C 20 8F 85 JSR $858F [$8B:858F] ; $2A.$2C = ±[$26] * ±[$28] / 10000h
$8B:854F E2 20 SEP #$20 ;\
$8B:8551 A5 2A LDA $2A [$7E:002A] ;|
$8B:8553 EB XBA ;|
$8B:8554 A5 2D LDA $2D [$7E:002D] ;} Mode 7 transformation matrix parameter A/D = [$2A].[$2C] * 100h
$8B:8556 C2 20 REP #$20 ;|
$8B:8558 85 78 STA $78 [$7E:0078] ;|
$8B:855A 85 7E STA $7E [$7E:007E] ;/
$8B:855C AD 8D 19 LDA $198D [$7E:198D] ;\
$8B:855F 29 FF 00 AND #$00FF ;|
$8B:8562 0A ASL A ;|
$8B:8563 AA TAX ;} $26 = sin([mode 7 transformation angle] * pi / 80h) * 100h
$8B:8564 BF 43 B4 A0 LDA $A0B443,x[$A0:B443];|
$8B:8568 85 26 STA $26 [$7E:0026] ;/
$8B:856A AD 8F 19 LDA $198F [$7E:198F] ;\
$8B:856D 85 28 STA $28 [$7E:0028] ;} $28 = [mode 7 transformation zoom level]
$8B:856F 20 8F 85 JSR $858F [$8B:858F] ; $2A.$2C = ±[$26] * ±[$28] / 10000h
$8B:8572 E2 20 SEP #$20 ;\
$8B:8574 A5 2A LDA $2A [$7E:002A] ;|
$8B:8576 EB XBA ;|
$8B:8577 A5 2D LDA $2D [$7E:002D] ;} Mode 7 transformation matrix parameter B = [$2A].[$2C] * 100h
$8B:8579 C2 20 REP #$20 ;|
$8B:857B 85 7A STA $7A [$7E:007A] ;/
$8B:857D 49 FF FF EOR #$FFFF ;\
$8B:8580 1A INC A ;} Mode 7 transformation matrix parameter C = -[mode 7 transformation matrix parameter B]
$8B:8581 85 7C STA $7C [$7E:007C] ;/
$8B:8583 AD 93 19 LDA $1993 [$7E:1993] ;\
$8B:8586 85 B1 STA $B1 [$7E:00B1] ;} BG1 X scroll = [cinematic BG1 X position]
$8B:8588 AD 97 19 LDA $1997 [$7E:1997] ;\
$8B:858B 85 B3 STA $B3 [$7E:00B3] ;} BG1 Y scroll = [cinematic BG1 Y position]
$8B:858D 28 PLP
$8B:858E 60 RTS
}
;;; $858F: $2A.$2C = ±[$26] * ±[$28] / 10000h (16-bit signed multiplication) ;;;
{
;; Parameters:
;; $26: Multiplicand
;; $28: Multiplicand
;; Returns:
;; $2A.$2C: Product / 10000h
$8B:858F 08 PHP
$8B:8590 C2 30 REP #$30
$8B:8592 A5 26 LDA $26 [$7E:0026] ;\
$8B:8594 10 4F BPL $4F [$85E5] ;} If [$26] >= 0: go to BRANCH_LEFT_POSITIVE
$8B:8596 49 FF FF EOR #$FFFF ;\
$8B:8599 1A INC A ;} $26 = -[$26]
$8B:859A 85 26 STA $26 [$7E:0026] ;/
$8B:859C A5 28 LDA $28 [$7E:0028] ;\
$8B:859E 30 1A BMI $1A [$85BA] ;} If [$28] >= 0:
$8B:85A0 20 EE 85 JSR $85EE [$8B:85EE] ; $2A.$2C = [$26] * [$28] / 10000h
$8B:85A3 A5 2C LDA $2C [$7E:002C] ;\
$8B:85A5 49 FF FF EOR #$FFFF ;|
$8B:85A8 18 CLC ;|
$8B:85A9 69 01 00 ADC #$0001 ;|
$8B:85AC 85 2C STA $2C [$7E:002C] ;} $2A.$2C = -[$2A].[$2C]
$8B:85AE A5 2A LDA $2A [$7E:002A] ;|
$8B:85B0 49 FF FF EOR #$FFFF ;|
$8B:85B3 69 00 00 ADC #$0000 ;|
$8B:85B6 85 2A STA $2A [$7E:002A] ;/
$8B:85B8 28 PLP
$8B:85B9 60 RTS ; Return
$8B:85BA 49 FF FF EOR #$FFFF ;\
$8B:85BD 1A INC A ;} $28 = -[$28]
$8B:85BE 85 28 STA $28 [$7E:0028] ;/
$8B:85C0 20 EE 85 JSR $85EE [$8B:85EE] ; $2A.$2C = [$26] * [$28] / 10000h
$8B:85C3 28 PLP
$8B:85C4 60 RTS ; Return
; BRANCH_LEFT_POSITIVE_RIGHT_NEGATIVE
$8B:85C5 49 FF FF EOR #$FFFF ;\
$8B:85C8 1A INC A ;} $28 = -[$28]
$8B:85C9 85 28 STA $28 [$7E:0028] ;/
$8B:85CB 20 EE 85 JSR $85EE [$8B:85EE] ; $2A.$2C = [$26] * [$28] / 10000h
$8B:85CE A5 2C LDA $2C [$7E:002C] ;\
$8B:85D0 49 FF FF EOR #$FFFF ;|
$8B:85D3 18 CLC ;|
$8B:85D4 69 01 00 ADC #$0001 ;|
$8B:85D7 85 2C STA $2C [$7E:002C] ;} $2A.$2C = -[$2A].[$2C]
$8B:85D9 A5 2A LDA $2A [$7E:002A] ;|
$8B:85DB 49 FF FF EOR #$FFFF ;|
$8B:85DE 69 00 00 ADC #$0000 ;|
$8B:85E1 85 2A STA $2A [$7E:002A] ;/
$8B:85E3 28 PLP
$8B:85E4 60 RTS ; Return
; BRANCH_LEFT_POSITIVE
$8B:85E5 A5 28 LDA $28 [$7E:0028] ;\
$8B:85E7 30 DC BMI $DC [$85C5] ;} If [$28] < 0: go to BRANCH_LEFT_POSITIVE_RIGHT_NEGATIVE
$8B:85E9 20 EE 85 JSR $85EE [$8B:85EE] ; $2A.$2C = [$26] * [$28] / 10000h
$8B:85EC 28 PLP
$8B:85ED 60 RTS
}
;;; $85EE: $2A.$2C = [$26] * [$28] / 10000h (16-bit unsigned multiplication) ;;;
{
;; Parameters:
;; $26: Multiplicand
;; $28: Multiplicand
;; Returns:
;; $2A.$2C: Product / 10000h
; Exactly 1204/1232 master cycles (88%/90% of a scanline).
; Compared to $80:82D6, this routine is a bit slower (144/172 master cycles slower),
; but produces correct results in all cases
; Let:
; $26 = a + b * 100h
; $28 = c + d * 100h
$8B:85EE 08 PHP
$8B:85EF E2 30 SEP #$30
$8B:85F1 A5 26 LDA $26 [$7E:0026] ;\
$8B:85F3 8D 02 42 STA $4202 ;|
$8B:85F6 A5 28 LDA $28 [$7E:0028] ;|
$8B:85F8 8D 03 42 STA $4203 ;|
$8B:85FB EA NOP ;|
$8B:85FC EA NOP ;} $2C = ac
$8B:85FD EA NOP ;|
$8B:85FE AD 16 42 LDA $4216 ;|
$8B:8601 85 2C STA $2C [$7E:002C] ;|
$8B:8603 AD 17 42 LDA $4217 ;|
$8B:8606 85 2D STA $2D [$7E:002D] ;/
$8B:8608 A5 27 LDA $27 [$7E:0027] ;\
$8B:860A 8D 02 42 STA $4202 ;|
$8B:860D A5 28 LDA $28 [$7E:0028] ;|
$8B:860F 8D 03 42 STA $4203 ;|
$8B:8612 EA NOP ;|
$8B:8613 EA NOP ;} $2E = bc
$8B:8614 EA NOP ;|
$8B:8615 AD 16 42 LDA $4216 ;|
$8B:8618 85 2E STA $2E [$7E:002E] ;|
$8B:861A AD 17 42 LDA $4217 ;|
$8B:861D 85 2F STA $2F [$7E:002F] ;/
$8B:861F A5 26 LDA $26 [$7E:0026] ;\
$8B:8621 8D 02 42 STA $4202 ;|
$8B:8624 A5 29 LDA $29 [$7E:0029] ;|
$8B:8626 8D 03 42 STA $4203 ;|
$8B:8629 EA NOP ;|
$8B:862A EA NOP ;} $30 = ad
$8B:862B EA NOP ;|
$8B:862C AD 16 42 LDA $4216 ;|
$8B:862F 85 30 STA $30 [$7E:0030] ;|
$8B:8631 AD 17 42 LDA $4217 ;|
$8B:8634 85 31 STA $31 [$7E:0031] ;/
$8B:8636 A5 27 LDA $27 [$7E:0027] ;\
$8B:8638 8D 02 42 STA $4202 ;|
$8B:863B A5 29 LDA $29 [$7E:0029] ;|
$8B:863D 8D 03 42 STA $4203 ;|
$8B:8640 EA NOP ;|
$8B:8641 EA NOP ;} $2A = bd
$8B:8642 EA NOP ;|
$8B:8643 C2 20 REP #$20 ;|
$8B:8645 AD 16 42 LDA $4216 ;|
$8B:8648 85 2A STA $2A [$7E:002A] ;/
$8B:864A A5 2E LDA $2E [$7E:002E] ;\
$8B:864C 18 CLC ;|
$8B:864D 65 30 ADC $30 [$7E:0030] ;|
$8B:864F 85 2E STA $2E [$7E:002E] ;|
$8B:8651 E2 20 SEP #$20 ;|
$8B:8653 A5 2E LDA $2E [$7E:002E] ;|
$8B:8655 18 CLC ;|
$8B:8656 65 2D ADC $2D [$7E:002D] ;} $2A.$2C += (bc + ad) / 100h
$8B:8658 85 2D STA $2D [$7E:002D] ;|
$8B:865A A5 2F LDA $2F [$7E:002F] ;|
$8B:865C 65 2A ADC $2A [$7E:002A] ;|
$8B:865E 85 2A STA $2A [$7E:002A] ;|
$8B:8660 90 02 BCC $02 [$8664] ;|
$8B:8662 E6 2B INC $2B [$7E:002B] ;/
$8B:8664 28 PLP
$8B:8665 60 RTS
}
;;; $8666: Handle fading in ;;;
{
$8B:8666 22 4D 89 80 JSL $80894D[$80:894D]
$8B:866A 60 RTS
}
;;; $866B: Activate title sequence blue light ;;;
{
$8B:866B 08 PHP
$8B:866C E2 20 SEP #$20
$8B:866E 64 6F STZ $6F [$7E:006F] ; Disable subscreen layers
$8B:8670 A9 81 LDA #$81 ;\
$8B:8672 85 72 STA $72 [$7E:0072] ;} Enable subtractive colour math on BG1
$8B:8674 A9 38 LDA #$38 ;\
$8B:8676 85 74 STA $74 [$7E:0074] ;|
$8B:8678 A9 58 LDA #$58 ;|
$8B:867A 85 75 STA $75 [$7E:0075] ;} Colour math subscreen backdrop colour = (18h, 18h, 0) (yellow)
$8B:867C A9 80 LDA #$80 ;|
$8B:867E 85 76 STA $76 [$7E:0076] ;/
$8B:8680 28 PLP
$8B:8681 60 RTS
}
;;; $8682: Deactivate title sequence blue light ;;;
{
$8B:8682 08 PHP
$8B:8683 E2 20 SEP #$20
$8B:8685 64 6F STZ $6F [$7E:006F] ;\
$8B:8687 64 72 STZ $72 [$7E:0072] ;} Disable colour math
$8B:8689 A9 20 LDA #$20 ;\
$8B:868B 85 74 STA $74 [$7E:0074] ;|
$8B:868D A9 40 LDA #$40 ;|
$8B:868F 85 75 STA $75 [$7E:0075] ;} Colour math subscreen backdrop colour = (0, 0, 0) (transparent)
$8B:8691 A9 80 LDA #$80 ;|
$8B:8693 85 76 STA $76 [$7E:0076] ;/
$8B:8695 28 PLP
$8B:8696 60 RTS
}
;;; $8697: Debug. Display version info ;;;
{
; Removing the RTS and the title screen shows:
; 'Ver.02.02.21.30 00' on NTSC
; 'Ver.03.30.10.00 00' on PAL
; Last byte there is the game header version number
; Also displays an 'S' if audio is disabled by $80:8008
$8B:8697 60 RTS
$8B:8698 08 PHP
$8B:8699 C2 30 REP #$30
$8B:869B AE 90 05 LDX $0590 [$7E:0590] ; X = [OAM stack pointer]
$8B:869E A0 00 00 LDY #$0000 ; Y = 0
; LOOP_VERSION_STRING
$8B:86A1 B9 64 87 LDA $8764,y ;\
$8B:86A4 29 FF 00 AND #$00FF ;} OAM entry X position = 80h + [Y] * 8
$8B:86A7 9D 70 03 STA $0370,x ;/
$8B:86AA A9 CC 00 LDA #$00CC ;\
$8B:86AD 9D 71 03 STA $0371,x ;} OAM entry Y position = CCh
$8B:86B0 5A PHY
$8B:86B1 B9 54 F7 LDA $F754,y ;\
$8B:86B4 29 FF 00 AND #$00FF ;} A = [$F754 + [Y]]
$8B:86B7 F0 23 BEQ $23 [$86DC] ; If [A] = 0: go to BRANCH_DONE
$8B:86B9 C9 2E 00 CMP #$002E ;\
$8B:86BC F0 0E BEQ $0E [$86CC] ;} If [A] != 2Eh:
$8B:86BE 38 SEC ;\
$8B:86BF E9 30 00 SBC #$0030 ;|
$8B:86C2 0A ASL A ;|
$8B:86C3 A8 TAY ;} OAM entry tile number and attributes = [$8780 + [A] - 30h]
$8B:86C4 B9 80 87 LDA $8780,y ;|
$8B:86C7 9D 72 03 STA $0372,x ;/
$8B:86CA 80 06 BRA $06 [$86D2]
$8B:86CC A9 F3 39 LDA #$39F3 ;\ Else ([$F754 + [Y]] = 2Eh):
$8B:86CF 9D 72 03 STA $0372,x ;} OAM entry tile number and attributes = 39F3h
$8B:86D2 7A PLY
$8B:86D3 8A TXA ;\
$8B:86D4 18 CLC ;|
$8B:86D5 69 04 00 ADC #$0004 ;} X += 4 (next OAM entry)
$8B:86D8 AA TAX ;/
$8B:86D9 C8 INY ; Increment Y
$8B:86DA 80 C5 BRA $C5 [$86A1] ; Go to LOOP_VERSION_STRING
; BRANCH_DONE
$8B:86DC 7A PLY
$8B:86DD 8E 90 05 STX $0590 [$7E:0590] ; OAM stack pointer = [X]
$8B:86E0 AF 08 80 80 LDA $808008[$80:8008] ;\
$8B:86E4 F0 18 BEQ $18 [$86FE] ;} If audio disabled:
$8B:86E6 A9 B4 00 LDA #$00B4 ;\
$8B:86E9 9D 70 03 STA $0370,x ;} OAM entry X position = B4h
$8B:86EC A9 C4 00 LDA #$00C4 ;\
$8B:86EF 9D 71 03 STA $0371,x ;} OAM entry Y position = C4h
$8B:86F2 A9 E2 39 LDA #$39E2 ;\
$8B:86F5 9D 72 03 STA $0372,x ;} OAM entry tile number and attributes = 39E2h
$8B:86F8 8A TXA ;\
$8B:86F9 18 CLC ;|
$8B:86FA 69 04 00 ADC #$0004 ;} X += 4 (next OAM entry)
$8B:86FD AA TAX ;/
$8B:86FE AF DB FF 00 LDA $00FFDB[$00:FFDB] ;\
$8B:8702 48 PHA ;|
$8B:8703 29 0F 00 AND #$000F ;|
$8B:8706 0A ASL A ;} $12 = ([version number] & Fh) * 2
$8B:8707 85 12 STA $12 [$7E:0012] ;|
$8B:8709 68 PLA ;/
$8B:870A 29 F0 00 AND #$00F0 ;\
$8B:870D 4A LSR A ;|
$8B:870E 4A LSR A ;} Y = ([version number] >> 4) * 2
$8B:870F 4A LSR A ;|
$8B:8710 A8 TAY ;/
$8B:8711 A9 E8 00 LDA #$00E8 ;\
$8B:8714 9D 70 03 STA $0370,x ;} OAM entry X position = E8h
$8B:8717 A9 CC 00 LDA #$00CC ;\
$8B:871A 9D 71 03 STA $0371,x ;} OAM entry Y position = CCh
$8B:871D B9 80 87 LDA $8780,y ;\
$8B:8720 9D 72 03 STA $0372,x ;} OAM entry tile number and attributes = [$8780 + [Y]]
$8B:8723 A9 F0 00 LDA #$00F0 ;\
$8B:8726 9D 74 03 STA $0374,x ;} OAM entry ([X] + 1) X position = F0h
$8B:8729 A9 CC 00 LDA #$00CC ;\
$8B:872C 9D 75 03 STA $0375,x ;} OAM entry ([X] + 1) Y position = CCh
$8B:872F A4 12 LDY $12 [$7E:0012] ;\
$8B:8731 B9 80 87 LDA $8780,y ;} OAM entry ([X] + 1) tile number and attributes = [$8780 + [$12]]
$8B:8734 9D 76 03 STA $0376,x ;/
$8B:8737 8A TXA ;\
$8B:8738 18 CLC ;|
$8B:8739 69 08 00 ADC #$0008 ;} X += 8 (+2 OAM entries)
$8B:873C AA TAX ;/
$8B:873D A0 00 00 LDY #$0000 ; Y = 0
; LOOP_VER
$8B:8740 B9 74 87 LDA $8774,y ;\
$8B:8743 9D 70 03 STA $0370,x ;} OAM entry X position = 74h - [Y] * 4
$8B:8746 A9 CC 00 LDA #$00CC ;\
$8B:8749 9D 71 03 STA $0371,x ;} OAM entry Y position = CCh
$8B:874C B9 7A 87 LDA $877A,y ;\
$8B:874F 9D 72 03 STA $0372,x ;} OAM entry tile number and attributes = [$877A + [Y]]
$8B:8752 8A TXA ;\
$8B:8753 18 CLC ;|
$8B:8754 69 04 00 ADC #$0004 ;} X += 4 (next OAM entry)
$8B:8757 AA TAX ;/
$8B:8758 C8 INY ;\
$8B:8759 C8 INY ;} Y += 2
$8B:875A C0 06 00 CPY #$0006 ;\
$8B:875D 30 E1 BMI $E1 [$8740] ;} If [Y] < 6: go to LOOP_VER
$8B:875F 8E 90 05 STX $0590 [$7E:0590] ; OAM stack pointer = [X]
$8B:8762 28 PLP
$8B:8763 60 RTS
; Version string OAM entry X positions
$8B:8764 db 80, 88, 90, 98, A0, A8, B0, B8, C0, C8, D0, D8, E0, E8, F0, F8
; 'Ver.' OAM entry X positions
$8B:8774 dw 0074, 006C, 0064
; 'Ver.' OAM entry tile numbers and attributes
$8B:877A dw 31F2, 31F1, 31F0
; Version string ('0123456789ABCDEF') OAM entry tile numbers and attributes
$8B:8780 dw 39F4, 39F5, 39F6, 39F7, 39F8, 39F9, 39FA, 39FB, 39FC, 39FD, 39D0, 39D1, 39D2, 39D3, 39D4, 39D5
}
;;; $87A0..8A51: Cinematic BG objects ;;;
{
;;; $87A0: Update 32x30 cinematic BG tilemap ;;;
{
; If not mode 7:
; Queue transfer of 780h bytes from $7E:3000 to VRAM [$19F5]
$8B:87A0 08 PHP
$8B:87A1 C2 30 REP #$30
$8B:87A3 A5 55 LDA $55 [$7E:0055]
$8B:87A5 29 FF 00 AND #$00FF
$8B:87A8 C9 07 00 CMP #$0007
$8B:87AB F0 24 BEQ $24 [$87D1]
$8B:87AD AE 30 03 LDX $0330 [$7E:0330]
$8B:87B0 A9 80 07 LDA #$0780
$8B:87B3 95 D0 STA $D0,x [$7E:00D0]
$8B:87B5 E8 INX
$8B:87B6 E8 INX
$8B:87B7 A9 00 30 LDA #$3000
$8B:87BA 95 D0 STA $D0,x [$7E:00D2]
$8B:87BC E8 INX
$8B:87BD E8 INX
$8B:87BE E2 20 SEP #$20