-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBank $B3.asm
3931 lines (3369 loc) · 218 KB
/
Bank $B3.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..8686: Common to all enemy banks ;;;
{
; See bank $A0
}
;;; $8687..878A: Unused spinning turtle eye ;;;
{
;;; $8687: Palette - enemy $F153 (unused spinning turtle eye) ;;;
{
$B3:8687 dw 3800, 4FE9, 4266, 3D85, 20A3, 52FC, 41F7, 30D2, 240E, 325F, 31DB, 3156, 30D2, 302C, 7FBD, 0C05
}
;;; $86A7: Instruction list - initial ;;;
{
$B3:86A7 dx 000A,8714,
000A,871B,
000A,8722,
000A,8729,
000A,8730,
000A,8737,
000A,873E,
000A,8745,
80ED,86A7 ; Go to $86A7
}
;;; $86CB: Unused. Instruction list ;;;
{
$B3:86CB dx 0008,874C,
0008,8753,
0008,875A,
80ED,86CB ; Go to $86CB
}
;;; $86DB: Unused. Instruction list ;;;
{
$B3:86DB dx 0008,8761,
0008,8768,
0008,876F,
80ED,86DB ; Go to $86DB
}
;;; $86EB: Unused. Instruction list ;;;
{
$B3:86EB dx 0008,8776,
0008,877D,
0008,8784,
80ED,86EB ; Go to $86EB
}
;;; $86FB: Initialisation AI - enemy $F153 (unused spinning turtle eye) ;;;
{
$B3:86FB AE 54 0E LDX $0E54 [$7E:0E54]
$B3:86FE BD 86 0F LDA $0F86,x ;\
$B3:8701 09 00 20 ORA #$2000 ;} Set enemy to process instructions
$B3:8704 9D 86 0F STA $0F86,x ;/
$B3:8707 A9 A7 86 LDA #$86A7 ;\
$B3:870A 9D 92 0F STA $0F92,x ;} Enemy instruction list pointer = $86A7
$B3:870D 6B RTL
}
;;; $870E: Main AI - enemy $F153 (unused spinning turtle eye) ;;;
{
$B3:870E AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8711 6B RTL
}
;;; $8712: RTL ;;;
{
$B3:8712 6B RTL
}
;;; $8713: RTL ;;;
{
$B3:8713 6B RTL
}
;;; $8714: Unused spinning turtle eye spritemaps ;;;
{
$B3:8714 dx 0001, 01F8,F8,3300
$B3:871B dx 0001, 01F8,F8,3301
$B3:8722 dx 0001, 01F8,F8,3302
$B3:8729 dx 0001, 01F8,F8,3303
$B3:8730 dx 0001, 01F8,F8,F300
$B3:8737 dx 0001, 01F8,F8,F301
$B3:873E dx 0001, 01F8,F8,F302
$B3:8745 dx 0001, 01F8,F8,F303
$B3:874C dx 0001, 01F8,F8,3304
$B3:8753 dx 0001, 01F8,F8,3305
$B3:875A dx 0001, 01F8,F8,3306
$B3:8761 dx 0001, 01F8,F8,3307
$B3:8768 dx 0001, 01F8,F8,3308
$B3:876F dx 0001, 01F8,F8,3309
$B3:8776 dx 0001, 01F8,F8,330A
$B3:877D dx 0001, 01F8,F8,330B
$B3:8784 dx 0001, 01F8,F8,330C
}
}
;;; $878B..8AC0: Zeb / zebbo ;;;
{
;;; $878B: Palette - enemy $F193 (zeb) ;;;
{
$B3:878B dw 3800, 021D, 0015, 0008, 0003, 00BD, 0013, 000E, 000B, 7F5A, 7EC0, 6DE0, 54E0, 03E0, 02A0, 0140
}
;;; $87AB: Instruction list - facing left - rising ;;;
{
$B3:87AB dx 0002,89B7,
0002,89BE,
0002,89C5,
0002,89CC,
0002,89D3,
0002,89CC,
0002,89C5,
0002,89BE,
80ED,87AB ; Go to $87AB
}
;;; $87CF: Instruction list - facing left - shooting ;;;
{
$B3:87CF dx 0001,89B7,
0001,89BE,
0001,89CC,
0001,89D3,
0001,89CC,
0001,89BE,
80ED,87CF ; Go to $87CF
}
;;; $87EB: Instruction list - facing right - rising ;;;
{
$B3:87EB dx 0002,89DA,
0002,89E1,
0002,89E8,
0002,89EF,
0002,89F6,
0002,89EF,
0002,89E8,
0002,89E1,
80ED,87EB ; Go to $87EB
}
;;; $880F: Instruction list - facing right - shooting ;;;
{
$B3:880F dx 0001,89DA,
0001,89E1,
0001,89EF,
0001,89F6,
0001,89EF,
0001,89E1,
80ED,880F ; Go to $880F
}
;;; $882B: Instruction list pointers - zeb ;;;
{
$B3:882B dw 87AB, 87CF, 87EB, 880F
}
;;; $8833: Instruction list pointers - zebbo ;;;
{
$B3:8833 dw 8A1D, 8A31, 8A45, 8A59
}
;;; $883B: Initialisation AI - enemy $F193/$F1D3 (zeb / zebbo) ;;;
{
$B3:883B AE 54 0E LDX $0E54 [$7E:0E54]
$B3:883E BD 7A 0F LDA $0F7A,x[$7E:11BA] ;\
$B3:8841 9D AA 0F STA $0FAA,x[$7E:11EA] ;} Enemy spawn X position = [enemy X position]
$B3:8844 BD 7E 0F LDA $0F7E,x[$7E:11BE] ;\
$B3:8847 9D AC 0F STA $0FAC,x[$7E:11EC] ;} Enemy spawn Y position = [enemy Y position]
$B3:884A 38 SEC ;\
$B3:884B E9 10 00 SBC #$0010 ;} Enemy target Y position = [enemy Y position] - 10h
$B3:884E 9F 00 78 7E STA $7E7800,x[$7E:7A40];/
$B3:8852 A9 80 88 LDA #$8880 ;\
$B3:8855 9D B2 0F STA $0FB2,x[$7E:11F2] ;} Enemy function = $8880
$B3:8858 A9 30 00 LDA #$0030 ;\
$B3:885B 9D AE 0F STA $0FAE,x[$7E:11EE] ;} Enemy spawn delay timer = 30h <-- this doesn't need to be initialised here
$B3:885E A9 00 00 LDA #$0000 ;\
$B3:8861 9D B0 0F STA $0FB0,x[$7E:11F0] ;} Enemy instruction list table index = 0
$B3:8864 9F 02 78 7E STA $7E7802,x[$7E:7A42]; Enemy previous instruction list table index = 0
$B3:8868 A9 AB 87 LDA #$87AB ;\
$B3:886B 9D 92 0F STA $0F92,x[$7E:11D2] ;} Enemy instruction list pointer = $87AB
$B3:886E BD B4 0F LDA $0FB4,x[$7E:11F4] ;\
$B3:8871 F0 06 BEQ $06 [$8879] ;} If [enemy parameter 1] != 0 (green bug):
$B3:8873 A9 1D 8A LDA #$8A1D ;\
$B3:8876 9D 92 0F STA $0F92,x[$7E:1092] ;} Enemy instruction list pointer = $8A1D
$B3:8879 6B RTL
}
;;; $887A: Main AI - enemy $F193/$F1D3 (zeb / zebbo) ;;;
{
$B3:887A AE 54 0E LDX $0E54 [$7E:0E54]
$B3:887D 7C B2 0F JMP ($0FB2,x)[$B3:8880]
}
;;; $8880: Zeb/zebbo function - wait until on screen ;;;
{
$B3:8880 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8883 22 70 AD A0 JSL $A0AD70[$A0:AD70] ;\
$B3:8887 D0 06 BNE $06 [$888F] ;} If enemy centre is on screen:
$B3:8889 A9 90 88 LDA #$8890 ;\
$B3:888C 9D B2 0F STA $0FB2,x[$7E:11F2] ;} Enemy function = $8890
$B3:888F 6B RTL
}
;;; $8890: Zeb/zebbo function - wait for Samus to get near ;;;
{
$B3:8890 22 DD AE A0 JSL $A0AEDD[$A0:AEDD] ;\
$B3:8894 10 23 BPL $23 [$88B9] ;|
$B3:8896 C9 A0 FF CMP #$FFA0 ;} If not 0 < [enemy Y position] - [Samus Y position] <= 60h: return
$B3:8899 30 1E BMI $1E [$88B9] ;/
$B3:889B 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\
$B3:889F A8 TAY ;|
$B3:88A0 3E A8 0F ROL $0FA8,x[$7E:11E8] ;} Enemy direction = [Samus X position] - [enemy X position] & 8000h
$B3:88A3 2A ROL A ;|
$B3:88A4 7E A8 0F ROR $0FA8,x[$7E:11E8] ;/
$B3:88A7 BD 7A 0F LDA $0F7A,x[$7E:11BA] ;\
$B3:88AA 38 SEC ;|
$B3:88AB ED F6 0A SBC $0AF6 [$7E:0AF6] ;|
$B3:88AE 10 04 BPL $04 [$88B4] ;|
$B3:88B0 49 FF FF EOR #$FFFF ;} If |[enemy X position] - [Samus X position]| >= 40h:
$B3:88B3 1A INC A ;|
;|
$B3:88B4 C9 40 00 CMP #$0040 ;|
$B3:88B7 90 01 BCC $01 [$88BA] ;/
$B3:88B9 6B RTL ; Return
$B3:88BA A9 E3 88 LDA #$88E3 ;\
$B3:88BD 9D B2 0F STA $0FB2,x[$7E:11F2] ;} Enemy function = $88E3
$B3:88C0 BD 86 0F LDA $0F86,x[$7E:11C6] ;\
$B3:88C3 29 FF FE AND #$FEFF ;} Set enemy as visible
$B3:88C6 9D 86 0F STA $0F86,x[$7E:11C6] ;/
$B3:88C9 A9 00 00 LDA #$0000 ;\
$B3:88CC 9D 90 0F STA $0F90,x[$7E:11D0] ;} Enemy timer = 0
$B3:88CF 3C A8 0F BIT $0FA8,x[$7E:11E8] ;\
$B3:88D2 30 05 BMI $05 [$88D9] ;} If [enemy direction] = right:
$B3:88D4 A9 02 00 LDA #$0002 ; Enemy instruction list table index = 2
$B3:88D7 80 03 BRA $03 [$88DC]
; Else ([enemy direction] = left):
$B3:88D9 A9 00 00 LDA #$0000 ; Enemy instruction list table index = 0
$B3:88DC 9D B0 0F STA $0FB0,x[$7E:11F0]
$B3:88DF 20 8B 89 JSR $898B [$B3:898B] ; Set zeb/zebbo instruction list
$B3:88E2 6B RTL
}
;;; $88E3: Zeb/zebbo function - rising ;;;
{
$B3:88E3 A9 FF FF LDA #$FFFF ;\
$B3:88E6 18 CLC ;|
$B3:88E7 7D 80 0F ADC $0F80,x[$7E:11C0] ;|
$B3:88EA 9D 80 0F STA $0F80,x[$7E:11C0] ;} Enemy Y position -= 1.0001h
$B3:88ED A9 FE FF LDA #$FFFE ;|
$B3:88F0 7D 7E 0F ADC $0F7E,x[$7E:11BE] ;|
$B3:88F3 9D 7E 0F STA $0F7E,x[$7E:11BE] ;/
$B3:88F6 BF 00 78 7E LDA $7E7800,x[$7E:7A40];\
$B3:88FA DD 7E 0F CMP $0F7E,x[$7E:11BE] ;} If [enemy Y position] > [enemy target Y position]: return
$B3:88FD 30 1C BMI $1C [$891B] ;/
$B3:88FF BD 7E 0F LDA $0F7E,x[$7E:11BE] ;\
$B3:8902 CD FA 0A CMP $0AFA [$7E:0AFA] ;} If [enemy Y position] >= [Samus Y position]:
$B3:8905 90 02 BCC $02 [$8909] ;/
$B3:8907 80 12 BRA $12 [$891B] ; Return
$B3:8909 BD B0 0F LDA $0FB0,x[$7E:11F0] ;\
$B3:890C 09 01 00 ORA #$0001 ;} Enemy instruction list table index |= 1
$B3:890F 9D B0 0F STA $0FB0,x[$7E:11F0] ;/
$B3:8912 20 8B 89 JSR $898B [$B3:898B] ; Set zeb/zebbo instruction list
$B3:8915 A9 1C 89 LDA #$891C ;\
$B3:8918 9D B2 0F STA $0FB2,x[$7E:11F2] ;} Enemy function = $891C
$B3:891B 6B RTL
}
;;; $891C: Zeb/zebbo function - shooting ;;;
{
$B3:891C 3C A8 0F BIT $0FA8,x[$7E:11E8] ;\
$B3:891F 10 15 BPL $15 [$8936] ;} If [enemy direction] = left:
$B3:8921 BD 7C 0F LDA $0F7C,x[$7E:11BC]
$B3:8924 38 SEC
$B3:8925 E9 00 00 SBC #$0000
$B3:8928 9D 7C 0F STA $0F7C,x[$7E:11BC]
$B3:892B BD 7A 0F LDA $0F7A,x[$7E:11BA] ;\
$B3:892E E9 02 00 SBC #$0002 ;} Enemy X position -= 2
$B3:8931 9D 7A 0F STA $0F7A,x[$7E:11BA] ;/
$B3:8934 80 13 BRA $13 [$8949]
$B3:8936 A9 00 00 LDA #$0000 ; Else ([enemy direction] = right):
$B3:8939 18 CLC
$B3:893A 7D 7C 0F ADC $0F7C,x[$7E:11BC]
$B3:893D 9D 7C 0F STA $0F7C,x[$7E:11BC]
$B3:8940 A9 02 00 LDA #$0002 ;\
$B3:8943 7D 7A 0F ADC $0F7A,x[$7E:11BA] ;} Enemy X position += 2
$B3:8946 9D 7A 0F STA $0F7A,x[$7E:11BA] ;/
$B3:8949 22 8E C1 A0 JSL $A0C18E[$A0:C18E] ;\
$B3:894D B0 01 BCS $01 [$8950] ;} If enemy is horizontally on-screen:
$B3:894F 6B RTL ; Return
$B3:8950 BD AA 0F LDA $0FAA,x[$7E:11EA] ;\
$B3:8953 9D 7A 0F STA $0F7A,x[$7E:11BA] ;} Enemy X position = [enemy spawn X position]
$B3:8956 9E 7C 0F STZ $0F7C,x[$7E:11BC] ; Enemy X subposition = 0
$B3:8959 BD AC 0F LDA $0FAC,x[$7E:11EC] ;\
$B3:895C 9D 7E 0F STA $0F7E,x[$7E:11BE] ;} Enemy Y position = [enemy spawn Y position]
$B3:895F 9D 80 0F STA $0F80,x[$7E:11C0] ; Enemy Y subposition = [enemy Y position] (>_<;)
$B3:8962 9E B0 0F STZ $0FB0,x[$7E:11F0] ; Enemy instruction list table index = 0
$B3:8965 20 8B 89 JSR $898B [$B3:898B] ; Set zeb/zebbo instruction list
$B3:8968 BD 86 0F LDA $0F86,x[$7E:11C6] ;\
$B3:896B 09 00 01 ORA #$0100 ;} Set enemy as invisible
$B3:896E 9D 86 0F STA $0F86,x[$7E:11C6] ;/
$B3:8971 A9 30 00 LDA #$0030 ;\
$B3:8974 9D AE 0F STA $0FAE,x[$7E:11EE] ;} Enemy spawn delay timer = 30h
$B3:8977 A9 7E 89 LDA #$897E ;\
$B3:897A 9D B2 0F STA $0FB2,x[$7E:11F2] ;} Enemy function = $897E
$B3:897D 6B RTL
}
;;; $897E: Zeb/zebbo function - spawn delay ;;;
{
$B3:897E DE AE 0F DEC $0FAE,x[$7E:11EE] ; Decrement enemy spawn delay timer
$B3:8981 F0 01 BEQ $01 [$8984] ; If [enemy spawn delay timer] != 0:
$B3:8983 6B RTL ; Return
$B3:8984 A9 90 88 LDA #$8890 ;\
$B3:8987 9D B2 0F STA $0FB2,x[$7E:11F2] ;} Enemy function = $8890
$B3:898A 6B RTL
}
;;; $898B: Set zeb/zebbo instruction list ;;;
{
$B3:898B AE 54 0E LDX $0E54 [$7E:0E54]
$B3:898E BD B0 0F LDA $0FB0,x[$7E:11F0] ;\
$B3:8991 DF 02 78 7E CMP $7E7802,x[$7E:7A42];} If [enemy previous instruction list table index] = [enemy instruction list table index]: return
$B3:8995 F0 1F BEQ $1F [$89B6] ;/
$B3:8997 9F 02 78 7E STA $7E7802,x[$7E:7A42]; Enemy previous instruction list table index = [enemy instruction list table index]
$B3:899B 0A ASL A ;\
$B3:899C A8 TAY ;} Y = [enemy instruction list table index] * 2
$B3:899D BD B4 0F LDA $0FB4,x[$7E:11F4] ;\
$B3:89A0 D0 05 BNE $05 [$89A7] ;} If [enemy parameter 1] = 0 (red bug):
$B3:89A2 B9 2B 88 LDA $882B,y[$B3:882F] ; Enemy instruction list pointer = [$882B + [Y]]
$B3:89A5 80 03 BRA $03 [$89AA]
; Else ([enemy parameter 1] != 0 (green bug)):
$B3:89A7 B9 33 88 LDA $8833,y[$B3:8835] ; Enemy instruction list pointer = [$8833 + [Y]]
$B3:89AA 9D 92 0F STA $0F92,x[$7E:11D2]
$B3:89AD A9 01 00 LDA #$0001 ;\
$B3:89B0 9D 94 0F STA $0F94,x[$7E:11D4] ;} Enemy instruction timer = 1
$B3:89B3 9E 90 0F STZ $0F90,x[$7E:11D0] ; Enemy timer = 0
$B3:89B6 60 RTS
}
;;; $89B7: Spritemaps ;;;
{
$B3:89B7 dx 0001, 81F8,F8,2100
$B3:89BE dx 0001, 81F8,F8,2102
$B3:89C5 dx 0001, 81F8,F8,2104
$B3:89CC dx 0001, 81F8,F8,2106
$B3:89D3 dx 0001, 81F8,F8,2108
$B3:89DA dx 0001, 81F8,F8,6100
$B3:89E1 dx 0001, 81F8,F8,6102
$B3:89E8 dx 0001, 81F8,F8,6104
$B3:89EF dx 0001, 81F8,F8,6106
$B3:89F6 dx 0001, 81F8,F8,6108
}
;;; $89FD: Palette - enemy $F1D3 (zebbo) ;;;
{
$B3:89FD dw 3800, 3F95, 2E8B, 0120, 0060, 3AEE, 2249, 11A4, 0962, 39BB, 30F5, 2C6E, 2827, 7F93, 6ECE, 6229
}
;;; $8A1D: Instruction list - facing left - rising ;;;
{
$B3:8A1D dx 0002,8A82,
0001,8A89,
0002,8A90,
0001,8A89,
80ED,8A1D ; Go to $8A1D
}
;;; $8A31: Instruction list - facing left - shooting ;;;
{
$B3:8A31 dx 0003,8A6D,
0003,8A74,
0003,8A7B,
0003,8A74,
80ED,8A31 ; Go to $8A31
}
;;; $8A45: Instruction list - facing right - rising ;;;
{
$B3:8A45 dx 0002,8AAC,
0001,8AB3,
0002,8ABA,
0001,8AB3,
80ED,8A45 ; Go to $8A45
}
;;; $8A59: Instruction list - facing right - shooting ;;;
{
$B3:8A59 dx 0003,8A97,
0003,8A9E,
0003,8AA5,
0003,8A9E,
80ED,8A59 ; Go to $8A59
}
;;; $8A6D: Spritemaps ;;;
{
$B3:8A6D dx 0001, 81F8,F8,2100
$B3:8A74 dx 0001, 81F8,F8,2102
$B3:8A7B dx 0001, 81F8,F8,2104
$B3:8A82 dx 0001, 81F8,F8,2106
$B3:8A89 dx 0001, 81F8,F8,2108
$B3:8A90 dx 0001, 81F8,F8,210A
$B3:8A97 dx 0001, 81F8,F8,6100
$B3:8A9E dx 0001, 81F8,F8,6102
$B3:8AA5 dx 0001, 81F8,F8,6104
$B3:8AAC dx 0001, 81F8,F8,6106
$B3:8AB3 dx 0001, 81F8,F8,6108
$B3:8ABA dx 0001, 81F8,F8,610A
}
}
;;; $8AC1..8EDB: Gamet ;;;
{
;;; $8AC1: Palette - enemy $F213 (gamet) ;;;
{
$B3:8AC1 dw 3800, 021D, 0015, 0008, 0003, 015F, 0076, 0050, 000B, 7FFF, 56E0, 3180, 18C0, 43FF, 42DC, 4176
}
;;; $8AE1: Instruction list - facing left - rising ;;;
{
$B3:8AE1 dx 0002,8E96,
0002,8E9D,
0002,8EA4,
0002,8EAB,
0002,8EB2,
0002,8EAB,
0002,8EA4,
0002,8E9D,
80ED,8AE1 ; Go to $8AE1
}
;;; $8B05: Instruction list - facing left - shooting ;;;
{
$B3:8B05 dx 0001,8E96,
0001,8E9D,
0001,8EAB,
0001,8EB2,
0001,8EAB,
0001,8E9D,
80ED,8B05 ; Go to $8B05
}
;;; $8B21: Instruction list - facing right - rising ;;;
{
$B3:8B21 dx 0002,8EB9,
0002,8EC0,
0002,8EC7,
0002,8ECE,
0002,8ED5,
0002,8ECE,
0002,8EC7,
0002,8EC0,
80ED,8B21 ; Go to $8B21
}
;;; $8B45: Instruction list - facing right - shooting ;;;
{
$B3:8B45 dx 0001,8EB9,
0001,8EC0,
0001,8ECE,
0001,8ED5,
0001,8ECE,
0001,8EC0,
80ED,8B45 ; Go to $8B45
}
;;; $8B61: Initialisation AI - enemy $F213 (gamet) ;;;
{
$B3:8B61 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8B64 BD 7A 0F LDA $0F7A,x[$7E:0F7A] ;\
$B3:8B67 9D AE 0F STA $0FAE,x[$7E:0FAE] ;} Enemy spawn X position = [enemy X position]
$B3:8B6A BD 7E 0F LDA $0F7E,x[$7E:0F7E] ;\
$B3:8B6D 9D B0 0F STA $0FB0,x[$7E:0FB0] ;} Enemy spawn Y position = [enemy Y position]
$B3:8B70 BD 86 0F LDA $0F86,x[$7E:0F86] ;\
$B3:8B73 09 00 01 ORA #$0100 ;} Set enemy as invisible
$B3:8B76 9D 86 0F STA $0F86,x[$7E:0F86] ;/
$B3:8B79 BD B7 0F LDA $0FB7,x[$7E:0FB7] ;\
$B3:8B7C 29 FF 00 AND #$00FF ;|
$B3:8B7F 0A ASL A ;|
$B3:8B80 0A ASL A ;} Enemy X speed table index = [enemy parameter 2 high] * 8
$B3:8B81 0A ASL A ;|
$B3:8B82 9D AA 0F STA $0FAA,x[$7E:0FAA] ;/
$B3:8B85 9E AC 0F STZ $0FAC,x[$7E:0FAC] ; Enemy shoot delay timer = 0
$B3:8B88 A9 01 00 LDA #$0001 ;\
$B3:8B8B 9D 94 0F STA $0F94,x[$7E:0F94] ;} Enemy instruction timer = 1
$B3:8B8E 9E 90 0F STZ $0F90,x[$7E:0F90] ; Enemy timer = 0
$B3:8B91 A9 E1 8A LDA #$8AE1 ;\
$B3:8B94 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $8AE1
$B3:8B97 A9 CD 8B LDA #$8BCD ;\
$B3:8B9A 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $8BCD
$B3:8B9D 6B RTL
}
;;; $8B9E: Main AI - enemy $F213 (gamet) ;;;
{
$B3:8B9E AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8BA1 FC A8 0F JSR ($0FA8,x)[$B3:8BCD]; Execute [enemy function]
$B3:8BA4 20 A8 8B JSR $8BA8 [$B3:8BA8] ; Reset enemy if off-screen
$B3:8BA7 6B RTL
}
;;; $8BA8: Reset enemy if off-screen ;;;
{
$B3:8BA8 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8BAB 22 70 AD A0 JSL $A0AD70[$A0:AD70] ;\
$B3:8BAF F0 1B BEQ $1B [$8BCC] ;} If enemy centre is off-screen:
$B3:8BB1 BD 86 0F LDA $0F86,x[$7E:0F86] ;\
$B3:8BB4 09 00 01 ORA #$0100 ;} Set enemy as invisible
$B3:8BB7 9D 86 0F STA $0F86,x[$7E:0F86] ;/
$B3:8BBA A9 CD 8B LDA #$8BCD ;\
$B3:8BBD 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $8BCD
$B3:8BC0 BD AE 0F LDA $0FAE,x[$7E:0FAE] ;\
$B3:8BC3 9D 7A 0F STA $0F7A,x[$7E:0F7A] ;} Enemy X position = [enemy spawn X position]
$B3:8BC6 BD B0 0F LDA $0FB0,x[$7E:0FB0] ;\
$B3:8BC9 9D 7E 0F STA $0F7E,x[$7E:0F7E] ;} Enemy Y position = [enemy spawn Y position]
$B3:8BCC 60 RTS
}
;;; $8BCD: Gamet function - wait until everyone's ready ;;;
{
$B3:8BCD AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8BD0 BD B6 0F LDA $0FB6,x[$7E:0FB6] ;\
$B3:8BD3 29 FF 00 AND #$00FF ;} If [enemy parameter 2 low] != 0:
$B3:8BD6 F0 26 BEQ $26 [$8BFE] ;/
$B3:8BD8 BD E8 0F LDA $0FE8,x[$7E:0FE8] ;\
$B3:8BDB C9 CD 8B CMP #$8BCD ;} If [enemy ([X] + 1) function = $8BCD:
$B3:8BDE D0 1E BNE $1E [$8BFE] ;/
$B3:8BE0 BD 28 10 LDA $1028,x[$7E:1028] ;\
$B3:8BE3 C9 CD 8B CMP #$8BCD ;} If [enemy ([X] + 2) function = $8BCD:
$B3:8BE6 D0 16 BNE $16 [$8BFE] ;/
$B3:8BE8 BD 68 10 LDA $1068,x[$7E:1068] ;\
$B3:8BEB C9 CD 8B CMP #$8BCD ;} If [enemy ([X] + 3) function = $8BCD:
$B3:8BEE D0 0E BNE $0E [$8BFE] ;/
$B3:8BF0 BD A8 10 LDA $10A8,x[$7E:10A8] ;\
$B3:8BF3 C9 CD 8B CMP #$8BCD ;} If [enemy ([X] + 4) function = $8BCD:
$B3:8BF6 D0 06 BNE $06 [$8BFE] ;/
$B3:8BF8 A9 FF 8B LDA #$8BFF ;\
$B3:8BFB 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $8BFF
$B3:8BFE 60 RTS
}
;;; $8BFF: Gamet function - wait for Samus to get near ;;;
{
$B3:8BFF AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8C02 BD B6 0F LDA $0FB6,x[$7E:0FB6] ;\
$B3:8C05 29 FF 00 AND #$00FF ;|
$B3:8C08 22 0B AF A0 JSL $A0AF0B[$A0:AF0B] ;} If Samus is not within [enemy parameter 2 low] pixel columns of enemy: return
$B3:8C0C F0 43 BEQ $43 [$8C51] ;/
$B3:8C0E BD 7E 0F LDA $0F7E,x[$7E:0F7E] ;\
$B3:8C11 CD FA 0A CMP $0AFA [$7E:0AFA] ;} If [enemy Y position] < [Samus Y position]: return
$B3:8C14 30 3B BMI $3B [$8C51] ;/
$B3:8C16 FE AC 0F INC $0FAC,x[$7E:0FAC] ; Increment enemy shoot delay timer
$B3:8C19 A9 01 00 LDA #$0001 ;\
$B3:8C1C 9D 94 0F STA $0F94,x[$7E:0F94] ;} Enemy instruction timer = 1
$B3:8C1F 9E 90 0F STZ $0F90,x[$7E:0F90] ; Enemy timer = 0
$B3:8C22 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\
$B3:8C26 10 14 BPL $14 [$8C3C] ;} If [Samus X position] < [enemy X position]:
$B3:8C28 A9 E1 8A LDA #$8AE1 ;\
$B3:8C2B 9D 92 0F STA $0F92,x[$7E:0FD2] ;} Enemy instruction list pointer = $8AE1
$B3:8C2E 9D D2 0F STA $0FD2,x[$7E:1012] ; Enemy ([X] + 1) instruction list pointer = $8AE1
$B3:8C31 9D 12 10 STA $1012,x[$7E:1052] ; Enemy ([X] + 2) instruction list pointer = $8AE1
$B3:8C34 9D 52 10 STA $1052,x[$7E:1092] ; Enemy ([X] + 3) instruction list pointer = $8AE1
$B3:8C37 9D 92 10 STA $1092,x[$7E:10D2] ; Enemy ([X] + 4) instruction list pointer = $8AE1
$B3:8C3A 80 12 BRA $12 [$8C4E]
$B3:8C3C A9 21 8B LDA #$8B21 ;\ ([Samus X position] >= [enemy X position]):
$B3:8C3F 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $8B21
$B3:8C42 9D D2 0F STA $0FD2,x[$7E:0FD2] ; Enemy ([X] + 1) instruction list pointer = $8B21
$B3:8C45 9D 12 10 STA $1012,x[$7E:1012] ; Enemy ([X] + 2) instruction list pointer = $8B21
$B3:8C48 9D 52 10 STA $1052,x[$7E:1052] ; Enemy ([X] + 3) instruction list pointer = $8B21
$B3:8C4B 9D 92 10 STA $1092,x[$7E:1092] ; Enemy ([X] + 4) instruction list pointer = $8B21
$B3:8C4E 20 52 8C JSR $8C52 [$B3:8C52] ; Set up gamet formation
$B3:8C51 60 RTS
}
;;; $8C52: Set up Gamet formation ;;;
{
$B3:8C52 A9 A6 8C LDA #$8CA6 ;\
$B3:8C55 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $8CA6
$B3:8C58 9D E8 0F STA $0FE8,x[$7E:0FE8] ; Enemy ([X] + 1) function = $8CA6
$B3:8C5B 9D 28 10 STA $1028,x[$7E:1028] ; Enemy ([X] + 2) function = $8CA6
$B3:8C5E 9D 68 10 STA $1068,x[$7E:1068] ; Enemy ([X] + 3) function = $8CA6
$B3:8C61 9D A8 10 STA $10A8,x[$7E:10A8] ; Enemy ([X] + 4) function = $8CA6
$B3:8C64 A9 68 00 LDA #$0068 ;\
$B3:8C67 9F 04 78 7E STA $7E7804,x[$7E:7804];} Enemy shoot delay = 68h
$B3:8C6B A9 60 00 LDA #$0060 ;\
$B3:8C6E 9F 44 78 7E STA $7E7844,x[$7E:7844];} Enemy ([X] + 1) shoot delay = 60h
$B3:8C72 A9 58 00 LDA #$0058 ;\
$B3:8C75 9F 84 78 7E STA $7E7884,x[$7E:7884];} Enemy ([X] + 2) shoot delay = 58h
$B3:8C79 A9 70 00 LDA #$0070 ;\
$B3:8C7C 9F C4 78 7E STA $7E78C4,x[$7E:78C4];} Enemy ([X] + 3) shoot delay = 70h
$B3:8C80 A9 78 00 LDA #$0078 ;\
$B3:8C83 9F 04 79 7E STA $7E7904,x[$7E:7904];} Enemy ([X] + 4) shoot delay = 78h
$B3:8C87 A9 FF 8C LDA #$8CFF ;\
$B3:8C8A 9D B2 0F STA $0FB2,x[$7E:0FB2] ;} Enemy formation function = $8CFF
$B3:8C8D A9 0C 8D LDA #$8D0C ;\
$B3:8C90 9D F2 0F STA $0FF2,x[$7E:0FF2] ;} Enemy ([X] + 1) formation function = $8D0C
$B3:8C93 A9 4E 8D LDA #$8D4E ;\
$B3:8C96 9D 32 10 STA $1032,x[$7E:1032] ;} Enemy ([X] + 2) formation function = $8D4E
$B3:8C99 A9 90 8D LDA #$8D90 ;\
$B3:8C9C 9D 72 10 STA $1072,x[$7E:1072] ;} Enemy ([X] + 3) formation function = $8D90
$B3:8C9F A9 D2 8D LDA #$8DD2 ;\
$B3:8CA2 9D B2 10 STA $10B2,x[$7E:10B2] ;} Enemy ([X] + 4) formation function = $8DD2
$B3:8CA5 60 RTS
}
;;; $8CA6: Gamet function - rising ;;;
{
$B3:8CA6 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8CA9 BD 86 0F LDA $0F86,x[$7E:0FC6] ;\
$B3:8CAC 29 FF FE AND #$FEFF ;} Set enemy as visible
$B3:8CAF 9D 86 0F STA $0F86,x[$7E:0FC6] ;/
$B3:8CB2 A9 80 00 LDA #$0080 ;\
$B3:8CB5 A8 TAY ;} Y = 80h (linear speed table index)
$B3:8CB6 BD 80 0F LDA $0F80,x[$7E:0FC0] ;\
$B3:8CB9 18 CLC ;|
$B3:8CBA 79 8D 81 ADC $818D,y[$B3:820D] ;|
$B3:8CBD 90 03 BCC $03 [$8CC2] ;|
$B3:8CBF FE 7E 0F INC $0F7E,x ;|
;} Enemy Y position += [$8187 + [Y] + 4].[$8187 + [Y] + 6] (negated speed)
$B3:8CC2 9D 80 0F STA $0F80,x[$7E:0FC0] ;|
$B3:8CC5 BD 7E 0F LDA $0F7E,x[$7E:0FBE] ;|
$B3:8CC8 18 CLC ;|
$B3:8CC9 79 8B 81 ADC $818B,y[$B3:820B] ;|
$B3:8CCC 9D 7E 0F STA $0F7E,x[$7E:0FBE] ;/
$B3:8CCF CD FA 0A CMP $0AFA [$7E:0AFA] ;\
$B3:8CD2 10 2A BPL $2A [$8CFE] ;} If [enemy Y position] >= [Samus Y position]: return
$B3:8CD4 BD B2 0F LDA $0FB2,x[$7E:1032] ;\
$B3:8CD7 9D A8 0F STA $0FA8,x[$7E:1028] ;} Enemy function = [enemy formation function]
$B3:8CDA BD 7E 0F LDA $0F7E,x[$7E:0FFE] ;\
$B3:8CDD 9F 02 78 7E STA $7E7802,x[$7E:7882];} Enemy formation centre Y position = [enemy Y position]
$B3:8CE1 A9 01 00 LDA #$0001 ;\
$B3:8CE4 9D 94 0F STA $0F94,x[$7E:1014] ;} Enemy instruction timer = 1
$B3:8CE7 9E 90 0F STZ $0F90,x[$7E:1010] ; Enemy timer = 0
$B3:8CEA 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\
$B3:8CEE 10 08 BPL $08 [$8CF8] ;} If [Samus X position] < [enemy X position]:
$B3:8CF0 A9 E1 8A LDA #$8AE1 ;\
$B3:8CF3 9D 92 0F STA $0F92,x[$7E:1012] ;} Enemy instruction list pointer = $8AE1
$B3:8CF6 80 06 BRA $06 [$8CFE]
$B3:8CF8 A9 21 8B LDA #$8B21 ;\ Else ([Samus X position] >= [enemy X position]):
$B3:8CFB 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $8B21
$B3:8CFE 60 RTS
}
;;; $8CFF: Gamet function - move to formation - centre ;;;
{
$B3:8CFF AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8D02 FE AC 0F INC $0FAC,x[$7E:0FEC] ; Increment enemy shoot delay timer
$B3:8D05 A9 5A 8E LDA #$8E5A ;\
$B3:8D08 9D A8 0F STA $0FA8,x[$7E:0FE8] ;} Enemy function = $8E5A
$B3:8D0B 60 RTS
}
;;; $8D0C: Gamet function - move to formation - upper middle ;;;
{
$B3:8D0C AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8D0F FE AC 0F INC $0FAC,x[$7E:102C] ; Increment enemy shoot delay timer
$B3:8D12 A9 80 00 LDA #$0080 ;\
$B3:8D15 A8 TAY ;} Y = 80h (linear speed table index)
$B3:8D16 BD 80 0F LDA $0F80,x[$7E:1000] ;\
$B3:8D19 18 CLC ;|
$B3:8D1A 79 8D 81 ADC $818D,y[$B3:820D] ;|
$B3:8D1D 90 03 BCC $03 [$8D22] ;|
$B3:8D1F FE 7E 0F INC $0F7E,x ;|
;} Enemy Y position += [$8187 + [Y] + 4].[$8187 + [Y] + 6] (negated speed)
$B3:8D22 9D 80 0F STA $0F80,x[$7E:1000] ;|
$B3:8D25 BD 7E 0F LDA $0F7E,x[$7E:0FFE] ;|
$B3:8D28 18 CLC ;|
$B3:8D29 79 8B 81 ADC $818B,y[$B3:820B] ;|
$B3:8D2C 9D 7E 0F STA $0F7E,x[$7E:0FFE] ;/
$B3:8D2F 18 CLC ;\
$B3:8D30 69 10 00 ADC #$0010 ;|
$B3:8D33 DF 02 78 7E CMP $7E7802,x[$7E:7882];} If [enemy Y position] < [enemy formation centre Y position] - 10h:
$B3:8D37 10 14 BPL $14 [$8D4D] ;/
$B3:8D39 BF 02 78 7E LDA $7E7802,x[$7E:7882];\
$B3:8D3D 38 SEC ;|
$B3:8D3E E9 10 00 SBC #$0010 ;} Enemy Y position = [enemy formation centre Y position] - 10h
$B3:8D41 9D 7E 0F STA $0F7E,x[$7E:0FFE] ;/
$B3:8D44 9E 80 0F STZ $0F80,x[$7E:1000] ; Enemy Y subposition = 0
$B3:8D47 A9 5A 8E LDA #$8E5A ;\
$B3:8D4A 9D A8 0F STA $0FA8,x[$7E:1028] ;} Enemy function = $8E5A
$B3:8D4D 60 RTS
}
;;; $8D4E: Gamet function - move to formation - top ;;;
{
$B3:8D4E AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8D51 FE AC 0F INC $0FAC,x[$7E:106C] ; Increment enemy shoot delay timer
$B3:8D54 A9 80 00 LDA #$0080 ;\
$B3:8D57 A8 TAY ;} Y = 80h (linear speed table index)
$B3:8D58 BD 80 0F LDA $0F80,x[$7E:1040] ;\
$B3:8D5B 18 CLC ;|
$B3:8D5C 79 8D 81 ADC $818D,y[$B3:820D] ;|
$B3:8D5F 90 03 BCC $03 [$8D64] ;|
$B3:8D61 FE 7E 0F INC $0F7E,x ;|
;} Enemy Y position += [$8187 + [Y] + 4].[$8187 + [Y] + 6] (negated speed)
$B3:8D64 9D 80 0F STA $0F80,x[$7E:1040] ;|
$B3:8D67 BD 7E 0F LDA $0F7E,x[$7E:103E] ;|
$B3:8D6A 18 CLC ;|
$B3:8D6B 79 8B 81 ADC $818B,y[$B3:820B] ;|
$B3:8D6E 9D 7E 0F STA $0F7E,x[$7E:103E] ;/
$B3:8D71 18 CLC ;\
$B3:8D72 69 20 00 ADC #$0020 ;|
$B3:8D75 DF 02 78 7E CMP $7E7802,x[$7E:78C2];} If [enemy Y position] < [enemy formation centre Y position] - 20h:
$B3:8D79 10 14 BPL $14 [$8D8F] ;/
$B3:8D7B BF 02 78 7E LDA $7E7802,x[$7E:78C2];\
$B3:8D7F 38 SEC ;|
$B3:8D80 E9 20 00 SBC #$0020 ;} Enemy Y position = [enemy formation centre Y position] - 20h
$B3:8D83 9D 7E 0F STA $0F7E,x[$7E:103E] ;/
$B3:8D86 9E 80 0F STZ $0F80,x[$7E:1040] ; Enemy Y subposition = 0
$B3:8D89 A9 5A 8E LDA #$8E5A ;\
$B3:8D8C 9D A8 0F STA $0FA8,x[$7E:1068] ;} Enemy function = $8E5A
$B3:8D8F 60 RTS
}
;;; $8D90: Gamet function - move to formation - lower middle ;;;
{
$B3:8D90 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8D93 FE AC 0F INC $0FAC,x[$7E:10AC] ; Increment enemy shoot delay timer
$B3:8D96 A9 80 00 LDA #$0080 ;\
$B3:8D99 A8 TAY ;} Y = 80h (linear speed table index)
$B3:8D9A BD 80 0F LDA $0F80,x[$7E:1080] ;\
$B3:8D9D 18 CLC ;|
$B3:8D9E 79 89 81 ADC $8189,y[$B3:8209] ;|
$B3:8DA1 90 03 BCC $03 [$8DA6] ;|
$B3:8DA3 FE 7E 0F INC $0F7E,x ;|
;} Enemy Y position += [$8187 + [Y]].[$8187 + [Y] + 2] (speed)
$B3:8DA6 9D 80 0F STA $0F80,x[$7E:1080] ;|
$B3:8DA9 BD 7E 0F LDA $0F7E,x[$7E:107E] ;|
$B3:8DAC 18 CLC ;|
$B3:8DAD 79 87 81 ADC $8187,y[$B3:8207] ;|
$B3:8DB0 9D 7E 0F STA $0F7E,x[$7E:107E] ;/
$B3:8DB3 38 SEC ;\
$B3:8DB4 E9 10 00 SBC #$0010 ;|
$B3:8DB7 DF 02 78 7E CMP $7E7802,x[$7E:7902];} If [enemy Y position] >= [enemy formation centre Y position] + 10h:
$B3:8DBB 30 14 BMI $14 [$8DD1] ;/
$B3:8DBD BF 02 78 7E LDA $7E7802,x[$7E:7902];\
$B3:8DC1 18 CLC ;|
$B3:8DC2 69 10 00 ADC #$0010 ;} Enemy Y position = [enemy formation centre Y position] + 10h
$B3:8DC5 9D 7E 0F STA $0F7E,x[$7E:107E] ;/
$B3:8DC8 9E 80 0F STZ $0F80,x[$7E:1080] ; Enemy Y subposition = 0
$B3:8DCB A9 5A 8E LDA #$8E5A ;\
$B3:8DCE 9D A8 0F STA $0FA8,x[$7E:10A8] ;} Enemy function = $8E5A
$B3:8DD1 60 RTS
}
;;; $8DD2: Gamet function - move to formation - bottom ;;;
{
$B3:8DD2 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8DD5 FE AC 0F INC $0FAC,x[$7E:10EC] ; Increment enemy shoot delay timer
$B3:8DD8 A9 80 00 LDA #$0080 ;\
$B3:8DDB A8 TAY ;} Y = 80h (linear speed table index)
$B3:8DDC BD 80 0F LDA $0F80,x[$7E:10C0] ;\
$B3:8DDF 18 CLC ;|
$B3:8DE0 79 89 81 ADC $8189,y[$B3:8209] ;|
$B3:8DE3 90 03 BCC $03 [$8DE8] ;|
$B3:8DE5 FE 7E 0F INC $0F7E,x ;|
;} Enemy Y position += [$8187 + [Y]].[$8187 + [Y] + 2] (speed)
$B3:8DE8 9D 80 0F STA $0F80,x[$7E:10C0] ;|
$B3:8DEB BD 7E 0F LDA $0F7E,x[$7E:10BE] ;|
$B3:8DEE 18 CLC ;|
$B3:8DEF 79 87 81 ADC $8187,y[$B3:8207] ;|
$B3:8DF2 9D 7E 0F STA $0F7E,x[$7E:10BE] ;/
$B3:8DF5 38 SEC ;\
$B3:8DF6 E9 20 00 SBC #$0020 ;|
$B3:8DF9 DF 02 78 7E CMP $7E7802,x[$7E:7942];} If [enemy Y position] >= [enemy formation centre Y position] + 20h:
$B3:8DFD 30 14 BMI $14 [$8E13] ;/
$B3:8DFF BF 02 78 7E LDA $7E7802,x[$7E:7942];\
$B3:8E03 18 CLC ;|
$B3:8E04 69 20 00 ADC #$0020 ;} Enemy Y position = [enemy formation centre Y position] + 20h
$B3:8E07 9D 7E 0F STA $0F7E,x[$7E:10BE] ;/
$B3:8E0A 9E 80 0F STZ $0F80,x[$7E:10C0] ; Enemy Y subposition = 0
$B3:8E0D A9 5A 8E LDA #$8E5A ;\
$B3:8E10 9D A8 0F STA $0FA8,x[$7E:10E8] ;} Enemy function = $8E5A
$B3:8E13 60 RTS
}
;;; $8E14: Gamet function - shooting left ;;;
{
$B3:8E14 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8E17 BD AA 0F LDA $0FAA,x[$7E:106A] ;\
$B3:8E1A A8 TAY ;} Y = [enemy X speed table index] (linear speed table index)
$B3:8E1B BD 7C 0F LDA $0F7C,x[$7E:103C] ;\
$B3:8E1E 18 CLC ;|
$B3:8E1F 79 8D 81 ADC $818D,y[$B3:838D] ;|
$B3:8E22 90 03 BCC $03 [$8E27] ;|
$B3:8E24 FE 7A 0F INC $0F7A,x ;|
;} Enemy X position += [$8187 + [Y] + 4].[$8187 + [Y] + 6] (negated speed)
$B3:8E27 9D 7C 0F STA $0F7C,x[$7E:103C] ;|
$B3:8E2A BD 7A 0F LDA $0F7A,x[$7E:103A] ;|
$B3:8E2D 18 CLC ;|
$B3:8E2E 79 8B 81 ADC $818B,y[$B3:838B] ;|
$B3:8E31 9D 7A 0F STA $0F7A,x[$7E:103A] ;/
$B3:8E34 60 RTS
}
;;; $8E35: Gamet function - shooting right ;;;
{
$B3:8E35 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8E38 BD AA 0F LDA $0FAA,x[$7E:106A] ;\
$B3:8E3B A8 TAY ;} Y = [enemy X speed table index] (linear speed table index)
$B3:8E3C BD 7C 0F LDA $0F7C,x[$7E:103C] ;\
$B3:8E3F 18 CLC ;|
$B3:8E40 79 89 81 ADC $8189,y[$B3:8309] ;|
$B3:8E43 90 03 BCC $03 [$8E48] ;|
$B3:8E45 FE 7A 0F INC $0F7A,x ;|
;} Enemy X position += [$8187 + [Y]].[$8187 + [Y] + 2] (speed)
$B3:8E48 9D 7C 0F STA $0F7C,x[$7E:103C] ;|
$B3:8E4B BD 7A 0F LDA $0F7A,x[$7E:103A] ;|
$B3:8E4E 18 CLC ;|
$B3:8E4F 79 87 81 ADC $8187,y[$B3:8307] ;|
$B3:8E52 9D 7A 0F STA $0F7A,x[$7E:103A] ;/
$B3:8E55 60 RTS
}
;;; $8E56: Unused. RTS ;;;
{
$B3:8E56 AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8E59 60 RTS
}
;;; $8E5A: Gamet function - shoot delay ;;;
{
$B3:8E5A AE 54 0E LDX $0E54 [$7E:0E54]
$B3:8E5D FE AC 0F INC $0FAC,x[$7E:0FEC] ; Increment enemy shoot delay timer
$B3:8E60 BD AC 0F LDA $0FAC,x[$7E:0FEC] ;\
$B3:8E63 DF 04 78 7E CMP $7E7804,x[$7E:7844];} If [enemy shoot delay timer] >= [enemy $7E:7804]:
$B3:8E67 30 2A BMI $2A [$8E93] ;/
$B3:8E69 9E AC 0F STZ $0FAC,x[$7E:106C] ; Enemy shoot delay timer = 0
$B3:8E6C A9 01 00 LDA #$0001 ;\
$B3:8E6F 9D 94 0F STA $0F94,x[$7E:1054] ;} Enemy instruction timer = 1
$B3:8E72 9E 90 0F STZ $0F90,x[$7E:1050] ; Enemy timer = 0
$B3:8E75 A9 14 8E LDA #$8E14 ;\
$B3:8E78 9D A8 0F STA $0FA8,x[$7E:1068] ;} Enemy function = $8E14
$B3:8E7B A9 05 8B LDA #$8B05 ;\
$B3:8E7E 9D 92 0F STA $0F92,x[$7E:1052] ;} Enemy instruction list pointer = $8B05
$B3:8E81 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\
$B3:8E85 30 0C BMI $0C [$8E93] ;} If [Samus X position] >= [enemy X position]:
$B3:8E87 A9 35 8E LDA #$8E35 ;\
$B3:8E8A 9D A8 0F STA $0FA8,x[$7E:1068] ;} Enemy function = $8E35
$B3:8E8D A9 45 8B LDA #$8B45 ;\
$B3:8E90 9D 92 0F STA $0F92,x[$7E:1052] ;} Enemy instruction list pointer = $8B45
$B3:8E93 60 RTS
}
;;; $8E94: RTL ;;;
{
$B3:8E94 6B RTL
}
;;; $8E95: RTL ;;;
{
$B3:8E95 6B RTL
}
;;; $8E96: Spritemaps ;;;
{
$B3:8E96 dx 0001, 81F8,F8,2100
$B3:8E9D dx 0001, 81F8,F8,2102
$B3:8EA4 dx 0001, 81F8,F8,2104
$B3:8EAB dx 0001, 81F8,F8,2106
$B3:8EB2 dx 0001, 81F8,F8,2108
$B3:8EB9 dx 0001, 81F8,F8,6100
$B3:8EC0 dx 0001, 81F8,F8,6102
$B3:8EC7 dx 0001, 81F8,F8,6104
$B3:8ECE dx 0001, 81F8,F8,6106
$B3:8ED5 dx 0001, 81F8,F8,6108
}
}
;;; $8EDC..9318: Geega ;;;
{
;;; $8EDC: Palette - enemy $F253 (geega) ;;;
{
$B3:8EDC dw 3800, 57FF, 42F7, 158C, 00A5, 4F5A, 36B5, 2610, 1DCE, 3FE0, 2EE0, 2200, 1100, 7E5B, 552F, 2887
}
;;; $8EFC: Instruction list - facing left - rising ;;;
{
$B3:8EFC dx 0004,92AD,
0004,92B4,
0004,92BB,
0004,92B4,
80ED,8EFC ; Go to $8EFC
}
;;; $8F10: Instruction list - facing left - shooting ;;;
{
$B3:8F10 dx 0001,92C2,
0001,92C9,
0001,92D0,
0001,92C9,
80ED,8F10 ; Go to $8F10
}
;;; $8F24: Instruction list - facing right - rising ;;;
{
$B3:8F24 dx 0004,92D7,
0004,92DE,
0004,92E5,
0004,92DE,
80ED,8F24 ; Go to $8F24
}
;;; $8F38: Instruction list - facing right - shooting ;;;
{
$B3:8F38 dx 0001,92EC,
0001,92F3,
0001,92FA,
0001,92F3,
80ED,8F38 ; Go to $8F38