-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBank $A8.asm
10768 lines (9294 loc) · 470 KB
/
Bank $A8.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..8F8B: Evir ;;;
{
;;; $8687: Palette - enemy $E63F/$E67F (evir) ;;;
{
$A8:8687 dw 3800, 57FF, 42F7, 0929, 00A5, 4F5A, 36B5, 2610, 158C, 03FF, 02B9, 0170, 0069, 0BB1, 1EA9, 0145
}
;;; $86A7..878E: Instruction lists ;;;
{
;;; $86A7: Instruction list - evir body - facing left ;;;
{
$A8:86A7 dw 000A,8B59,
000A,8B88,
000A,8BB7,
000A,8BE6,
000A,8C15,
000A,8C44,
80ED,86A7 ; Go to $86A7
}
;;; $86C3: Instruction list - evir arms - facing left ;;;
{
$A8:86C3 dw 000A,8CA2,
000A,8CBD,
000A,8CD8,
000A,8CF3,
000A,8CA2,
000A,8CBD,
000A,8CD8,
000A,8CF3,
000A,8CA2,
000A,8CBD,
000A,8CD8,
000A,8CF3,
000A,8CA2,
000A,8CBD,
000A,8CD8,
000A,8CF3,
0030,8D13,
80ED,86C3 ; Go to $86C3
}
;;; $870B: Instruction list - evir body - facing right ;;;
{
$A8:870B dw 000A,8D81,
000A,8DB0,
000A,8DDF,
000A,8E0E,
000A,8E3D,
000A,8E6C,
80ED,870B ; Go to $870B
}
;;; $8727: Instruction list - evir arms - facing right ;;;
{
$A8:8727 dw 000A,8ECA,
000A,8EE5,
000A,8F00,
000A,8F1B,
000A,8ECA,
000A,8EE5,
000A,8F00,
000A,8F1B,
000A,8ECA,
000A,8EE5,
000A,8F00,
000A,8F1B,
000A,8ECA,
000A,8EE5,
000A,8F00,
000A,8F1B,
0030,8F3B,
80ED,8727 ; Go to $8727
}
;;; $876F: Instruction list - evir projectile - normal ;;;
{
$A8:876F dw 0001,8D7A,
812F ; Sleep
}
;;; $8775: Instruction list - evir projectile - regenerating ;;;
{
$A8:8775 dw 879B, ; Set initial regeneration X offset
8123,0008, ; Timer = 8
878F ; Queue evir spit sound effect
$A8:877D dw 0008,8D64,
87B6, ; Advance regeneration X offset
8110,877D, ; Decrement timer and go to $877D if non-zero
0010,8D7A,
87CB, ; Finish regeneration
812F ; Sleep
}
}
;;; $878F..DF: Instructions ;;;
{
;;; $878F: Instruction - queue evir spit sound effect ;;;
{
$A8:878F DA PHX
$A8:8790 5A PHY
$A8:8791 A9 5E 00 LDA #$005E ;\
$A8:8794 22 CB 90 80 JSL $8090CB[$80:90CB] ;} Queue sound 5Eh, sound library 2, max queued sounds allowed = 6 (evir spit)
$A8:8798 7A PLY
$A8:8799 FA PLX
$A8:879A 6B RTL
}
;;; $879B: Instruction - set initial regeneration X offset ;;;
{
$A8:879B AE 54 0E LDX $0E54 [$7E:0E54]
$A8:879E BF 82 77 7E LDA $7E7782,x[$7E:7802];\
$A8:87A2 C9 0B 87 CMP #$870B ;} If [enemy ([X] - 2) instruction list] != $870B: (facing left)
$A8:87A5 F0 08 BEQ $08 [$87AF] ;/
$A8:87A7 A9 08 00 LDA #$0008 ;\
$A8:87AA 9D B2 0F STA $0FB2,x[$7E:10F2] ;} Enemy regeneration X offset = 8
$A8:87AD 80 06 BRA $06 [$87B5]
$A8:87AF A9 F8 FF LDA #$FFF8 ;\ Else ([enemy ([X] - 2) instruction list] = $870B (facing right)):
$A8:87B2 9D B2 0F STA $0FB2,x[$7E:1032] ;} Enemy regeneration X offset = -8
$A8:87B5 6B RTL
}
;;; $87B6: Instruction - advance regeneration X offset ;;;
{
$A8:87B6 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:87B9 BF 82 77 7E LDA $7E7782,x[$7E:7802];\
$A8:87BD C9 0B 87 CMP #$870B ;} If [enemy ([X] - 2) instruction list] != $870B: (facing left)
$A8:87C0 F0 05 BEQ $05 [$87C7] ;/
$A8:87C2 DE B2 0F DEC $0FB2,x[$7E:10F2] ; Enemy regeneration X offset -= 1
$A8:87C5 80 03 BRA $03 [$87CA]
; Else ([enemy ([X] - 2) instruction list] = $870B (facing right)):
$A8:87C7 FE B2 0F INC $0FB2,x[$7E:1032] ; Enemy regeneration X offset += 1
$A8:87CA 6B RTL
}
;;; $87CB: Instruction - finish regeneration ;;;
{
$A8:87CB AE 54 0E LDX $0E54 [$7E:0E54]
$A8:87CE A9 00 00 LDA #$0000 ;\
$A8:87D1 9F 18 78 7E STA $7E7818,x[$7E:7898];} Enemy regenerating flag = 0
$A8:87D5 9F 16 78 7E STA $7E7816,x[$7E:7896]; Enemy moving flag = 0
$A8:87D9 A9 34 8A LDA #$8A34 ;\
$A8:87DC 9D AC 0F STA $0FAC,x[$7E:102C] ;} Enemy function = $8A34 (idle)
$A8:87DF 6B RTL
}
}
;;; $87E0: Initialisation AI - enemy $E63F (evir) ;;;
{
$A8:87E0 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:87E3 BD B4 0F LDA $0FB4,x[$7E:0FB4] ;\
$A8:87E6 D0 35 BNE $35 [$881D] ;} If [enemy parameter 1] = 0:
$A8:87E8 20 38 88 JSR $8838 [$A8:8838] ; Set evir facing direction
$A8:87EB BD B6 0F LDA $0FB6,x[$7E:0FB6] ;\
$A8:87EE 29 FF 00 AND #$00FF ;|
$A8:87F1 0A ASL A ;|
$A8:87F2 0A ASL A ;} Y = [enemy parameter 2 low] * 8 (linear speed table index)
$A8:87F3 0A ASL A ;|
$A8:87F4 A8 TAY ;/
$A8:87F5 B9 87 81 LDA $8187,y[$A8:81C7] ;\
$A8:87F8 9F 08 78 7E STA $7E7808,x[$7E:7808];|
$A8:87FC B9 89 81 LDA $8189,y[$A8:81C9] ;} Enemy down velocity = [$8187 + [Y]].[$8187 + [Y] + 2]
$A8:87FF 9F 06 78 7E STA $7E7806,x[$7E:7806];/
$A8:8803 B9 8B 81 LDA $818B,y[$A8:81CB] ;\
$A8:8806 9F 0C 78 7E STA $7E780C,x[$7E:780C];|
$A8:880A B9 8D 81 LDA $818D,y[$A8:81CD] ;} Enemy up velocity = [$8187 + [Y] + 4].[$8187 + [Y] + 6]
$A8:880D 9F 0A 78 7E STA $7E780A,x[$7E:780A];/
$A8:8811 B9 B7 0F LDA $0FB7,y[$7E:0FF7] ;\
$A8:8814 29 FF 00 AND #$00FF ;|
$A8:8817 4A LSR A ;} Enemy movement timer = [enemy parameter 2 high] / 2
$A8:8818 9D B0 0F STA $0FB0,x[$7E:0FB0] ;/
$A8:881B 80 09 BRA $09 [$8826]
; Else ([enemy parameter 1] != 0):
$A8:881D 20 66 88 JSR $8866 [$A8:8866] ; Handle evir arms
$A8:8820 A9 04 00 LDA #$0004 ;\
$A8:8823 9D 9A 0F STA $0F9A,x[$7E:0FDA] ;} Enemy layer = 4
$A8:8826 A9 00 00 LDA #$0000 ;\
$A8:8829 9F 00 78 7E STA $7E7800,x[$7E:7800];} Enemy movement direction = up
$A8:882D 9F 02 78 7E STA $7E7802,x[$7E:7802]; Enemy instruction list = 0
$A8:8831 A9 22 89 LDA #$8922 ;\
$A8:8834 9D AC 0F STA $0FAC,x[$7E:0FAC] ;} Enemy function = $8922 (handle body/arms)
$A8:8837 6B RTL
}
;;; $8838: Set evir facing direction ;;;
{
$A8:8838 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:883B 22 E5 AE A0 JSL $A0AEE5[$A0:AEE5] ;\
$A8:883F 10 08 BPL $08 [$8849] ;} If [Samus X position] < [enemy X position]:
$A8:8841 A9 00 00 LDA #$0000 ;\
$A8:8844 9D AA 0F STA $0FAA,x[$7E:0FAA] ;} Enemy facing direction = left
$A8:8847 80 06 BRA $06 [$884F]
$A8:8849 A9 01 00 LDA #$0001 ;\ Else ([Samus X position] >= [enemy X position])
$A8:884C 9D AA 0F STA $0FAA,x[$7E:0FAA] ;} Enemy facing direction = right
$A8:884F A9 A7 86 LDA #$86A7 ;\
$A8:8852 9F 04 78 7E STA $7E7804,x[$7E:7804];} Enemy new instruction list = $86A7
$A8:8856 BD AA 0F LDA $0FAA,x[$7E:0FAA] ;\
$A8:8859 F0 07 BEQ $07 [$8862] ;} If [enemy facing direction] != left:
$A8:885B A9 0B 87 LDA #$870B ;\
$A8:885E 9F 04 78 7E STA $7E7804,x[$7E:7804];} Enemy new instruction list = $870B
$A8:8862 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:8865 60 RTS
}
;;; $8866: Handle evir arms ;;;
{
$A8:8866 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8869 BD 6A 0F LDA $0F6A,x[$7E:0FAA] ;\
$A8:886C 9D AA 0F STA $0FAA,x[$7E:0FEA] ;} Enemy facing direction = [enemy ([X] - 1) facing direction]
$A8:886F D0 20 BNE $20 [$8891] ; If [enemy facing direction] = left:
$A8:8871 BD 3A 0F LDA $0F3A,x[$7E:0F7A] ;\
$A8:8874 38 SEC ;|
$A8:8875 E9 04 00 SBC #$0004 ;} Enemy X position = [enemy ([X] - 1) X position] - 4
$A8:8878 9D 7A 0F STA $0F7A,x[$7E:0FBA] ;/
$A8:887B BD 3E 0F LDA $0F3E,x[$7E:0F7E] ;\
$A8:887E 18 CLC ;|
$A8:887F 69 0A 00 ADC #$000A ;} Enemy Y position = [enemy ([X] - 1) Y position] + Ah
$A8:8882 9D 7E 0F STA $0F7E,x[$7E:0FBE] ;/
$A8:8885 A9 C3 86 LDA #$86C3 ;\
$A8:8888 9F 04 78 7E STA $7E7804,x[$7E:7844];} Enemy new instruction list = $86C3
$A8:888C 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:888F 80 1E BRA $1E [$88AF]
$A8:8891 BD 3A 0F LDA $0F3A,x[$7E:0F7A] ;\ Else ([enemy facing direction] = right):
$A8:8894 18 CLC ;|
$A8:8895 69 04 00 ADC #$0004 ;} Enemy X position = [enemy ([X] - 1) X position] + 4
$A8:8898 9D 7A 0F STA $0F7A,x[$7E:0FBA] ;/
$A8:889B BD 3E 0F LDA $0F3E,x[$7E:0F7E] ;\
$A8:889E 18 CLC ;|
$A8:889F 69 0A 00 ADC #$000A ;} Enemy Y position = [enemy ([X] - 1) Y position] + Ah
$A8:88A2 9D 7E 0F STA $0F7E,x[$7E:0FBE] ;/
$A8:88A5 A9 27 87 LDA #$8727 ;\
$A8:88A8 9F 04 78 7E STA $7E7804,x[$7E:7844];} Enemy new instruction list = $8727
$A8:88AC 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:88AF 60 RTS
}
;;; $88B0: Initialisation AI - enemy $E67F (evir projectile) ;;;
{
$A8:88B0 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:88B3 A9 6F 87 LDA #$876F ;\
$A8:88B6 9F 04 78 7E STA $7E7804,x[$7E:7884];} Enemy new instruction list = $876F
$A8:88BA 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:88BD BD 16 0F LDA $0F16,x[$7E:0F96] ;\
$A8:88C0 9D 96 0F STA $0F96,x[$7E:1016] ;} Enemy palette index = [enemy ([X] - 2) palette index]
$A8:88C3 BD 18 0F LDA $0F18,x[$7E:0F98] ;\
$A8:88C6 9D 98 0F STA $0F98,x[$7E:1018] ;} Enemy VRAM tiles index = [enemy ([X] - 2) VRAM tiles index]
$A8:88C9 20 E5 88 JSR $88E5 [$A8:88E5] ; Reset evir projectile position
$A8:88CC A9 00 00 LDA #$0000 ;\
$A8:88CF 9F 02 78 7E STA $7E7802,x[$7E:7882];} Enemy instruction list = 0
$A8:88D3 9F 18 78 7E STA $7E7818,x[$7E:7898]; Enemy regenerating flag = 0
$A8:88D7 9F 16 78 7E STA $7E7816,x[$7E:7896]; Enemy moving flag = 0
$A8:88DB 9D B2 0F STA $0FB2,x[$7E:1032] ; Enemy regeneration X offset = 0
$A8:88DE A9 34 8A LDA #$8A34 ;\
$A8:88E1 9D AC 0F STA $0FAC,x[$7E:102C] ;} Enemy function = $8A34 (idle)
$A8:88E4 6B RTL
}
;;; $88E5: Reset evir projectile position ;;;
{
$A8:88E5 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:88E8 BD 2A 0F LDA $0F2A,x[$7E:0FAA] ;\
$A8:88EB 9D AA 0F STA $0FAA,x[$7E:102A] ;} Enemy facing direction = [enemy ([X] - 2) facing direction]
$A8:88EE D0 16 BNE $16 [$8906] ; If [enemy facing direction] = up:
$A8:88F0 BD FA 0E LDA $0EFA,x[$7E:0F7A] ;\
$A8:88F3 38 SEC ;|
$A8:88F4 E9 04 00 SBC #$0004 ;} Enemy X position = [enemy ([X] - 2) X position] - 4
$A8:88F7 9D 7A 0F STA $0F7A,x[$7E:0FFA] ;/
$A8:88FA BD FE 0E LDA $0EFE,x[$7E:0F7E] ;\
$A8:88FD 18 CLC ;|
$A8:88FE 69 12 00 ADC #$0012 ;} Enemy Y position = [enemy ([X] - 2) Y position] + 12h
$A8:8901 9D 7E 0F STA $0F7E,x[$7E:0FFE] ;/
$A8:8904 80 14 BRA $14 [$891A]
$A8:8906 BD FA 0E LDA $0EFA,x[$7E:0F7A] ;\ Else ([enemy facing direction] != up):
$A8:8909 18 CLC ;|
$A8:890A 69 04 00 ADC #$0004 ;} Enemy X position = [enemy ([X] - 2) X position] + 4
$A8:890D 9D 7A 0F STA $0F7A,x[$7E:0FFA] ;/
$A8:8910 BD FE 0E LDA $0EFE,x[$7E:0F7E] ;\
$A8:8913 18 CLC ;|
$A8:8914 69 12 00 ADC #$0012 ;} Enemy Y position = [enemy ([X] - 2) Y position] + 12h
$A8:8917 9D 7E 0F STA $0F7E,x[$7E:0FFE] ;/
$A8:891A 60 RTS
}
;;; $891B: Main AI - enemy $E63F (evir) ;;;
{
$A8:891B AE 54 0E LDX $0E54 [$7E:0E54]
$A8:891E FC AC 0F JSR ($0FAC,x)[$A8:8922]; Execute [enemy function]
$A8:8921 6B RTL
}
;;; $8922: Evir function - handle body/arms ;;;
{
$A8:8922 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8925 BD B4 0F LDA $0FB4,x[$7E:0FB4] ;\
$A8:8928 D0 05 BNE $05 [$892F] ;} If [enemy parameter 1] = 0:
$A8:892A 20 33 89 JSR $8933 [$A8:8933] ; Handle evir body
$A8:892D 80 03 BRA $03 [$8932] ; Return
$A8:892F 20 97 89 JSR $8997 [$A8:8997] ; Handle evir arms
$A8:8932 60 RTS
}
;;; $8933: Handle evir body ;;;
{
$A8:8933 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8936 BF 98 78 7E LDA $7E7898,x[$7E:7898];\
$A8:893A D0 03 BNE $03 [$893F] ;} If [enemy ([X] + 2) regenerating flag] = 0:
$A8:893C 20 38 88 JSR $8838 [$A8:8838] ; Set evir facing direction
$A8:893F BF 00 78 7E LDA $7E7800,x[$7E:7800];\
$A8:8943 D0 1D BNE $1D [$8962] ;} If [enemy movement direction] = up:
$A8:8945 BD 7E 0F LDA $0F7E,x[$7E:0F7E] ;\
$A8:8948 18 CLC ;|
$A8:8949 7F 0C 78 7E ADC $7E780C,x[$7E:780C];|
$A8:894D 9D 7E 0F STA $0F7E,x[$7E:0F7E] ;|
$A8:8950 BD 80 0F LDA $0F80,x[$7E:0F80] ;|
$A8:8953 18 CLC ;} Enemy Y position += [enemy up velocity]
$A8:8954 7F 0A 78 7E ADC $7E780A,x[$7E:780A];|
$A8:8958 90 03 BCC $03 [$895D] ;|
$A8:895A FE 7E 0F INC $0F7E,x ;|
;|
$A8:895D 9D 80 0F STA $0F80,x[$7E:0F80] ;/
$A8:8960 80 1B BRA $1B [$897D]
$A8:8962 BD 7E 0F LDA $0F7E,x[$7E:0F7E] ;\ Else ([enemy movement direction] != up):
$A8:8965 18 CLC ;|
$A8:8966 7F 08 78 7E ADC $7E7808,x[$7E:7808];|
$A8:896A 9D 7E 0F STA $0F7E,x[$7E:0F7E] ;|
$A8:896D BD 80 0F LDA $0F80,x[$7E:0F80] ;|
$A8:8970 18 CLC ;} Enemy Y position += [enemy down velocity]
$A8:8971 7F 06 78 7E ADC $7E7806,x[$7E:7806];|
$A8:8975 90 03 BCC $03 [$897A] ;|
$A8:8977 FE 7E 0F INC $0F7E,x[$7E:0F7E] ;|
;|
$A8:897A 9D 80 0F STA $0F80,x[$7E:0F80] ;/
$A8:897D DE B0 0F DEC $0FB0,x[$7E:0FB0] ; Decrement enemy movement timer
$A8:8980 10 14 BPL $14 [$8996] ; If [enemy movement timer] < 0:
$A8:8982 BD B7 0F LDA $0FB7,x[$7E:0FB7] ;\
$A8:8985 29 FF 00 AND #$00FF ;} Enemy movement timer = [enemy parameter 2 high]
$A8:8988 9D B0 0F STA $0FB0,x[$7E:0FB0] ;/
$A8:898B BF 00 78 7E LDA $7E7800,x[$7E:7800];\
$A8:898F 49 01 00 EOR #$0001 ;} Enemy movement direction ^= 1
$A8:8992 9F 00 78 7E STA $7E7800,x[$7E:7800];/
$A8:8996 60 RTS
}
;;; $8997: Handle evir arms ;;;
{
$A8:8997 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:899A 20 66 88 JSR $8866 [$A8:8866] ; Handle evir arms
$A8:899D 60 RTS
}
;;; $899E: Main AI - enemy $E67F (evir projectile) ;;;
{
$A8:899E AE 54 0E LDX $0E54 [$7E:0E54]
$A8:89A1 BD 9E 0F LDA $0F9E,x[$7E:101E] ;\
$A8:89A4 D0 2A BNE $2A [$89D0] ;} If [enemy frozen timer] != 0: go to BRANCH_MERGE
$A8:89A6 BF 16 78 7E LDA $7E7816,x[$7E:7896];\
$A8:89AA F0 0F BEQ $0F [$89BB] ;} If [enemy moving flag] != 0:
$A8:89AC BD AA 0F LDA $0FAA,x[$7E:102A] ; >_<;
$A8:89AF A9 6F 87 LDA #$876F ;\
$A8:89B2 9F 04 78 7E STA $7E7804,x[$7E:7884];} Enemy new instruction list = $876F
$A8:89B6 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:89B9 80 15 BRA $15 [$89D0] ; Go to BRANCH_MERGE
$A8:89BB BF 18 78 7E LDA $7E7818,x[$7E:7898];\
$A8:89BF F0 0C BEQ $0C [$89CD] ;} If [enemy regenerating flag] != 0:
$A8:89C1 A9 75 87 LDA #$8775 ;\
$A8:89C4 9F 04 78 7E STA $7E7804,x[$7E:7884];} Enemy new instruction list = $8775
$A8:89C8 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:89CB 80 03 BRA $03 [$89D0] ; Go to BRANCH_MERGE
$A8:89CD 20 D4 89 JSR $89D4 [$A8:89D4] ; Shoot evir projectile at Samus
; BRANCH_MERGE
$A8:89D0 FC AC 0F JSR ($0FAC,x)[$A8:8A34]; Execute [enemy function]
$A8:89D3 6B RTL
}
;;; $89D4: Shoot evir projectile at Samus ;;;
{
$A8:89D4 AD 54 0E LDA $0E54 [$7E:0E54] ;\
$A8:89D7 38 SEC ;|
$A8:89D8 E9 80 00 SBC #$0080 ;|
$A8:89DB AA TAX ;} If Samus is within 80h pixel columns of enemy ([X] - 2):
$A8:89DC A9 80 00 LDA #$0080 ;|
$A8:89DF 22 0B AF A0 JSL $A0AF0B[$A0:AF0B] ;|
$A8:89E3 F0 4E BEQ $4E [$8A33] ;/
$A8:89E5 A9 04 00 LDA #$0004 ;\
$A8:89E8 8D 32 0E STA $0E32 [$7E:0E32] ;} $0E32 = 4 (speed)
$A8:89EB 22 66 C0 A0 JSL $A0C066[$A0:C066] ; A = angle of Samus from enemy
$A8:89EF 38 SEC ;\
$A8:89F0 E9 40 00 SBC #$0040 ;|
$A8:89F3 29 FF 00 AND #$00FF ;|
$A8:89F6 49 FF FF EOR #$FFFF ;} $16 = 40h - [A] (angle using the common maths convention)
$A8:89F9 1A INC A ;|
$A8:89FA 85 16 STA $16 [$7E:0016] ;/
$A8:89FC 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;\
$A8:8A00 9F 0E 78 7E STA $7E780E,x[$7E:788E];|
$A8:8A04 AD 38 0E LDA $0E38 [$7E:0E38] ;} Enemy X velocity = 4 * cos([$16] * pi / 80h)
$A8:8A07 9F 10 78 7E STA $7E7810,x[$7E:7890];/
$A8:8A0B A5 16 LDA $16 [$7E:0016] ;\
$A8:8A0D 22 C6 B0 A0 JSL $A0B0C6[$A0:B0C6] ;|
$A8:8A11 9F 12 78 7E STA $7E7812,x[$7E:7892];} Enemy Y velocity = 4 * -sin([$16] * pi / 80h)
$A8:8A15 AD 38 0E LDA $0E38 [$7E:0E38] ;|
$A8:8A18 9F 14 78 7E STA $7E7814,x[$7E:7894];/
$A8:8A1C A9 6F 87 LDA #$876F ;\
$A8:8A1F 9F 04 78 7E STA $7E7804,x[$7E:7884];} Enemy new instruction list = $876F
$A8:8A23 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:8A26 A9 01 00 LDA #$0001 ;\
$A8:8A29 9F 16 78 7E STA $7E7816,x[$7E:7896];} Enemy moving flag = 1
$A8:8A2D A9 3B 8A LDA #$8A3B ;\
$A8:8A30 9D AC 0F STA $0FAC,x[$7E:102C] ;} Enemy function = $8A3B (moving)
$A8:8A33 60 RTS
}
;;; $8A34: Evir projectile function - idle ;;;
{
$A8:8A34 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8A37 20 E5 88 JSR $88E5 [$A8:88E5] ; Reset evir projectile position
$A8:8A3A 60 RTS
}
;;; $8A3B: Evir projectile function - moving ;;;
{
$A8:8A3B AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8A3E 20 B1 8A JSR $8AB1 [$A8:8AB1] ; Start evir projectile regenerating if far off-screen
$A8:8A41 BD 7A 0F LDA $0F7A,x[$7E:0FFA] ;\
$A8:8A44 18 CLC ;|
$A8:8A45 7F 0E 78 7E ADC $7E780E,x[$7E:788E];|
$A8:8A49 9D 7A 0F STA $0F7A,x[$7E:0FFA] ;|
$A8:8A4C BD 7C 0F LDA $0F7C,x[$7E:0FFC] ;|
$A8:8A4F 18 CLC ;} Enemy X position += [enemy X velocity]
$A8:8A50 7F 10 78 7E ADC $7E7810,x[$7E:7890];|
$A8:8A54 90 03 BCC $03 [$8A59] ;|
$A8:8A56 FE 7A 0F INC $0F7A,x[$7E:0FFA] ;|
;|
$A8:8A59 9D 7C 0F STA $0F7C,x[$7E:0FFC] ;/
$A8:8A5C BD 7E 0F LDA $0F7E,x[$7E:0FFE] ;\
$A8:8A5F 18 CLC ;|
$A8:8A60 7F 12 78 7E ADC $7E7812,x[$7E:7892];|
$A8:8A64 9D 7E 0F STA $0F7E,x[$7E:0FFE] ;|
$A8:8A67 BD 80 0F LDA $0F80,x[$7E:1000] ;|
$A8:8A6A 18 CLC ;} Enemy Y position += [enemy Y velocity]
$A8:8A6B 7F 14 78 7E ADC $7E7814,x[$7E:7894];|
$A8:8A6F 90 03 BCC $03 [$8A74] ;|
$A8:8A71 FE 7E 0F INC $0F7E,x[$7E:0FFE] ;|
;|
$A8:8A74 9D 80 0F STA $0F80,x[$7E:1000] ;/
$A8:8A77 60 RTS
}
;;; $8A78: Evir projectile function - regenerating ;;;
{
$A8:8A78 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8A7B BD 1E 0F LDA $0F1E,x[$7E:0F9E] ;\
$A8:8A7E D0 30 BNE $30 [$8AB0] ;} If [enemy ([X] - 2) frozen timer] != 0: return
$A8:8A80 BF 18 78 7E LDA $7E7818,x[$7E:7898];\
$A8:8A84 D0 1D BNE $1D [$8AA3] ;} If [enemy regenerating flag] = 0:
$A8:8A86 A9 6F 87 LDA #$876F ;\
$A8:8A89 9F 04 78 7E STA $7E7804,x ;} Enemy new instruction list = $876F
$A8:8A8D 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:8A90 A9 00 00 LDA #$0000 ;\
$A8:8A93 9F 18 78 7E STA $7E7818,x ;} Enemy regenerating flag = 0
$A8:8A97 9F 16 78 7E STA $7E7816,x ; Enemy moving flag = 0
$A8:8A9B A9 34 8A LDA #$8A34 ;\
$A8:8A9E 9D AC 0F STA $0FAC,x ;} Enemy function = $8A34 (idle)
$A8:8AA1 80 0D BRA $0D [$8AB0] ; Return
$A8:8AA3 20 E5 88 JSR $88E5 [$A8:88E5] ; Reset evir projectile position
$A8:8AA6 BD 7A 0F LDA $0F7A,x[$7E:0FFA] ;\
$A8:8AA9 18 CLC ;|
$A8:8AAA 7D B2 0F ADC $0FB2,x[$7E:1032] ;} Enemy X position += [enemy regeneration X offset]
$A8:8AAD 9D 7A 0F STA $0F7A,x[$7E:0FFA] ;/
$A8:8AB0 60 RTS
}
;;; $8AB1: Start evir projectile regenerating if far off-screen ;;;
{
$A8:8AB1 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8AB4 A9 00 01 LDA #$0100 ;\
$A8:8AB7 22 A3 AD A0 JSL $A0ADA3[$A0:ADA3] ;} If enemy centre is over 100h pixels off-screen:
$A8:8ABB F0 2A BEQ $2A [$8AE7] ;/
$A8:8ABD BD 1E 0F LDA $0F1E,x[$7E:0F9E] ;\
$A8:8AC0 D0 25 BNE $25 [$8AE7] ;} If [enemy ([X] - 2) frozen timer] = 0:
$A8:8AC2 A9 00 00 LDA #$0000 ;\
$A8:8AC5 9F 16 78 7E STA $7E7816,x[$7E:7896];} Enemy moving flag = 0
$A8:8AC9 A9 01 00 LDA #$0001 ;\
$A8:8ACC 9F 18 78 7E STA $7E7818,x[$7E:7898];} Enemy regenerating flag = 1
$A8:8AD0 A9 78 8A LDA #$8A78 ;\
$A8:8AD3 9D AC 0F STA $0FAC,x[$7E:102C] ;} Enemy function = $8A78 (regenerating)
$A8:8AD6 A9 01 00 LDA #$0001 ;\
$A8:8AD9 9F 18 78 7E STA $7E7818,x[$7E:7898];} >_<;
$A8:8ADD A9 75 87 LDA #$8775 ;\
$A8:8AE0 9F 04 78 7E STA $7E7804,x[$7E:7884];} Enemy new instruction list = $8775
$A8:8AE4 20 E8 8A JSR $8AE8 [$A8:8AE8] ; Set evir instruction list
$A8:8AE7 60 RTS
}
;;; $8AE8: Set evir instruction list ;;;
{
$A8:8AE8 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8AEB BF 04 78 7E LDA $7E7804,x[$7E:7804];\
$A8:8AEF DF 02 78 7E CMP $7E7802,x[$7E:7802];} If [enemy instruction list] != [enemy new instruction list]:
$A8:8AF3 F0 10 BEQ $10 [$8B05] ;/
$A8:8AF5 9D 92 0F STA $0F92,x[$7E:0F92] ; Enemy instruction list pointer = [enemy new instruction list]
$A8:8AF8 9F 02 78 7E STA $7E7802,x[$7E:7802]; Enemy instruction list = [enemy new instruction list]
$A8:8AFC A9 01 00 LDA #$0001 ;\
$A8:8AFF 9D 94 0F STA $0F94,x[$7E:0F94] ;} Enemy instruction timer = 1
$A8:8B02 9E 90 0F STZ $0F90,x[$7E:0F90] ; Enemy timer = 0
$A8:8B05 60 RTS
}
;;; $8B06: Enemy shot - enemy $E63F (evir) ;;;
{
$A8:8B06 22 23 80 A8 JSL $A88023[$A8:8023] ; Normal enemy touch AI
$A8:8B0A 80 0A BRA $0A [$8B16] ; Go to evir shared contact reaction
}
;;; $8B0C: Power bomb reaction - enemy $E63F (evir) ;;;
{
$A8:8B0C 22 37 80 A8 JSL $A88037[$A8:8037] ; Normal enemy power bomb AI
$A8:8B10 80 04 BRA $04 [$8B16] ; Go to evir shared contact reaction
}
;;; $8B12: Enemy touch - enemy $E63F (evir) ;;;
{
$A8:8B12 22 3D A6 A0 JSL $A0A63D[$A0:A63D] ; Normal enemy shot AI
}
;;; $8B16: Evir shared contact reaction ;;;
{
$A8:8B16 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:8B19 BD 8C 0F LDA $0F8C,x[$7E:104C] ;\
$A8:8B1C D0 12 BNE $12 [$8B30] ;} If [enemy health] = 0:
$A8:8B1E BD C6 0F LDA $0FC6,x ;\
$A8:8B21 09 00 02 ORA #$0200 ;} Mark enemy ([X] + 1) for deletion
$A8:8B24 9D C6 0F STA $0FC6,x ;/
$A8:8B27 BD 06 10 LDA $1006,x ;\
$A8:8B2A 09 00 02 ORA #$0200 ;} Mark enemy ([X] + 2) for deletion
$A8:8B2D 9D 06 10 STA $1006,x ;/
$A8:8B30 BD 9E 0F LDA $0F9E,x[$7E:105E] ;\
$A8:8B33 F0 23 BEQ $23 [$8B58] ;} If [enemy frozen timer] = 0: return
$A8:8B35 9D DE 0F STA $0FDE,x[$7E:109E] ; Enemy ([X] + 1) frozen timer = [enemy frozen timer]
$A8:8B38 BD CA 0F LDA $0FCA,x[$7E:108A] ;\
$A8:8B3B 09 04 00 ORA #$0004 ;} Set enemy ([X] + 1) frozen AI
$A8:8B3E 9D CA 0F STA $0FCA,x[$7E:108A] ;/
$A8:8B41 BD 2C 10 LDA $102C,x[$7E:10EC] ;\
$A8:8B44 C9 3B 8A CMP #$8A3B ;} If [enemy ([X] + 2) function] = $8A3B (moving): return
$A8:8B47 F0 0F BEQ $0F [$8B58] ;/
$A8:8B49 BD 0A 10 LDA $100A,x[$7E:118A] ;\
$A8:8B4C 09 04 00 ORA #$0004 ;} Set enemy ([X] + 2) frozen AI
$A8:8B4F 9D 0A 10 STA $100A,x[$7E:118A] ;/
$A8:8B52 BD 9E 0F LDA $0F9E,x[$7E:111E] ;\
$A8:8B55 9D 1E 10 STA $101E,x[$7E:119E] ;} Enemy ([X] + 2) frozen timer = [enemy frozen timer]
$A8:8B58 6B RTL
}
;;; $8B59: Evir spritemaps ;;;
{
$A8:8B59 dx 0009, 81FE,FB,2106, 81EE,FB,2104, 81FE,EB,2102, 81EE,EB,2100, 8002,FB,2108, 8001,01,2108, 81FF,07,210C, 01FE,10,2126, 01FE,08,2125
$A8:8B88 dx 0009, 81FE,FB,2106, 81EE,FB,2104, 81FE,EB,2102, 81EE,EB,2100, 8002,FC,2108, 8001,02,2108, 81FF,07,210C, 01FE,10,2126, 01FE,08,2125
$A8:8BB7 dx 0009, 81FE,FB,2106, 81EE,FB,2104, 81FE,EB,2102, 81EE,EB,2100, 8002,FD,2108, 8001,03,2108, 81FF,08,210C, 01FE,11,2126, 01FE,09,2125
$A8:8BE6 dx 0009, 81FE,FB,2106, 81EE,FB,2104, 81FE,EB,2102, 81EE,EB,2100, 8002,FD,2108, 8001,04,2108, 81FF,09,210C, 01FE,12,2126, 01FE,0A,2125
$A8:8C15 dx 0009, 81FE,FB,2106, 81EE,FB,2104, 81FE,EB,2102, 81EE,EB,2100, 8002,FD,2108, 8001,04,2108, 81FF,0A,210C, 01FE,11,2126, 01FE,09,2125
$A8:8C44 dx 0009, 81FE,FB,2106, 81EE,FB,2104, 81FE,EB,2102, 81EE,EB,2100, 8002,FC,2108, 8001,03,2108, 81FF,09,210C, 01FE,10,2126, 01FE,08,2125
$A8:8C73 dx 0009, 81FE,FB,2106, 81EE,FB,2104, 81FE,EB,2102, 81EE,EB,2100, 8002,FB,2108, 8001,01,2108, 81FF,07,210C, 01FE,10,2126, 01FE,08,2125 ; Unused
$A8:8CA2 dx 0005, 0000,F8,2123, 01F8,F8,2122, 0002,FC,2124, 01FE,F4,2121, 01F6,F4,2120
$A8:8CBD dx 0005, 01FE,F4,2123, 01F6,F4,2122, 0000,F8,2124, 0002,FC,2123, 01FA,FC,2122
$A8:8CD8 dx 0005, 01FE,F4,2124, 01F8,F8,2122, 0000,F8,2123, 0002,FC,2121, 01FA,FC,2120
$A8:8CF3 dx 0006, 01FE,F4,2123, 01F6,F4,2122, 01F8,F8,2120, 0000,F8,2121, 0002,FC,2123, 01FA,FC,2122
$A8:8D13 dx 0003, 01FE,F4,2124, 0000,F8,2124, 0002,FC,2124
$A8:8D24 dx 0006, 01FE,F4,2123, 01F6,F4,2122, 01F8,F8,2122, 0000,F8,2123, 0002,FC,2123, 01FA,FC,2122 ; Unused
$A8:8D44 dx 0006, 01FE,F4,2121, 01F6,F4,2120, 0000,F8,2121, 01F8,F8,2120, 0002,FC,2121, 01FA,FC,2120 ; Unused
$A8:8D64 dx 0004, 0000,00,A128, 01F8,00,A127, 0000,F8,2128, 01F8,F8,2127
$A8:8D7A dx 0001, 81F8,F8,210E
$A8:8D81 dx 0009, 81F2,FB,6106, 8002,FB,6104, 81F2,EB,6102, 8002,EB,6100, 81EE,FB,6108, 81EF,01,6108, 81F1,07,610C, 01FA,10,6126, 01FA,08,6125
$A8:8DB0 dx 0009, 81F2,FB,6106, 8002,FB,6104, 81F2,EB,6102, 8002,EB,6100, 81EE,FC,6108, 81EF,02,6108, 81F1,07,610C, 01FA,10,6126, 01FA,08,6125
$A8:8DDF dx 0009, 81F2,FB,6106, 8002,FB,6104, 81F2,EB,6102, 8002,EB,6100, 81EE,FD,6108, 81EF,03,6108, 81F1,08,610C, 01FA,11,6126, 01FA,09,6125
$A8:8E0E dx 0009, 81F2,FB,6106, 8002,FB,6104, 81F2,EB,6102, 8002,EB,6100, 81EE,FD,6108, 81EF,04,6108, 81F1,09,610C, 01FA,12,6126, 01FA,0A,6125
$A8:8E3D dx 0009, 81F2,FB,6106, 8002,FB,6104, 81F2,EB,6102, 8002,EB,6100, 81EE,FD,6108, 81EF,04,6108, 81F1,0A,610C, 01FA,11,6126, 01FA,09,6125
$A8:8E6C dx 0009, 81F2,FB,6106, 8002,FB,6104, 81F2,EB,6102, 8002,EB,6100, 81EE,FC,6108, 81EF,03,6108, 81F1,09,610C, 01FA,10,6126, 01FA,08,6125
$A8:8E9B dx 0009, 81F2,FB,6106, 8002,FB,6104, 81F2,EB,6102, 8002,EB,6100, 81EE,FB,6108, 81EF,01,6108, 81F1,07,610C, 01FA,10,6126, 01FA,08,6125 ; Unused
$A8:8ECA dx 0005, 01F8,F8,6123, 0000,F8,6122, 01FA,F4,6121, 0002,F4,6120, 01F6,FC,6124
$A8:8EE5 dx 0005, 01FA,F4,6123, 0002,F4,6122, 01F8,F8,6124, 01F6,FC,6123, 01FE,FC,6122
$A8:8F00 dx 0005, 01FA,F4,6124, 01F8,F8,6123, 0000,F8,6122, 01F6,FC,6121, 01FE,FC,6120
$A8:8F1B dx 0006, 01FA,F4,6123, 0002,F4,6122, 0000,F8,6120, 01F8,F8,6121, 01F6,FC,6123, 01FE,FC,6122
$A8:8F3B dx 0003, 01F6,FC,6124, 01F8,F8,6124, 01FA,F4,6124
$A8:8F4C dx 0006, 01FA,F4,6123, 0002,F4,6122, 01F8,F8,6123, 0000,F8,6122, 01F6,FC,6123, 01FE,FC,6122 ; Unused
$A8:8F6C dx 0006, 01FA,F4,6121, 0002,F4,6120, 0000,F8,6120, 01F8,F8,6121, 01F6,FC,6121, 01FE,FC,6120 ; Unused
}
}
;;; $8F8C..9378: Morph ball eye ;;;
{
;;; $8F8C: Palette - enemy $E6BF (morph ball eye) ;;;
{
$A8:8F8C dw 3800, 72B2, 71C7, 2461, 1840, 7A8E, 660B, 4D03, 4900, 7FE0, 7E80, 44E0, 2C20, 0000, 0000, 0000
}
;;; $8FAC..904F: Instruction lists ;;;
{
;;; $8FAC: Instruction list - eye - active ;;;
{
; Indexed by [enemy angle] / 10h * 4, set every frame
$A8:8FAC dx 000A,9210,
000A,9210,
000A,9217,
000A,921E,
000A,9225,
000A,922C,
000A,9233,
000A,923A,
000A,9209,
000A,9202,
000A,91FB,
000A,91F4,
000A,91ED,
000A,91E6,
000A,91DF,
000A,91DF,
80ED,8FAC ; Go to $8FAC
}
;;; $8FF0: Instruction list - eye - facing right - deactivating ;;;
{
$A8:8FF0 dw 0008,9257,
0030,91F4,
0005,9257
}
;;; $8FFC: Instruction list - eye - facing right - closed ;;;
{
$A8:8FFC dw 0030,9241,
812F ; Sleep
}
;;; $9002: Instruction list - eye - facing left - deactivating ;;;
{
$A8:9002 dw 0008,9283,
0030,9225,
0005,9283
}
;;; $900E: Instruction list - eye - facing left - closed ;;;
{
$A8:900E dw 0030,926D,
812F ; Sleep
}
;;; $9014: Instruction list - eye - activating - facing right ;;;
{
$A8:9014 dx 0020,9241,
0005,9257,
0030,91F4,
0008,9257,
812F ; Sleep
}
;;; $9026: Instruction list - eye - activating - facing left ;;;
{
$A8:9026 dx 0020,926D,
0005,9283,
0030,9225,
0008,9283,
812F ; Sleep
}
;;; $9038: Instruction list - mount - facing right ;;;
{
$A8:9038 dx 0001,9299,
812F ; Sleep
}
;;; $903E: Instruction list - mount - facing down ;;;
{
$A8:903E dx 0001,92A5,
812F ; Sleep
}
;;; $9044: Instruction list - mount - facing left ;;;
{
$A8:9044 dx 0001,92B1,
812F ; Sleep
}
;;; $904A: Instruction list - mount - facing up ;;;
{
$A8:904A dx 0001,92BD,
812F ; Sleep
}
}
;;; $9050: Morph ball eye proximities ;;;
{
$A8:9050 dw 0080 ; X proximity to activate
$A8:9052 dw 00B0 ; X proximity to deactivate
$A8:9054 dw 0080 ; Y proximity to activate
$A8:9056 dw 0080 ; Y proximity to deactivate
}
;;; $9058: Initialisation AI - enemy $E6BF (morph ball eye) ;;;
{
$A8:9058 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:905B BD 86 0F LDA $0F86,x[$7E:0F86] ;\
$A8:905E 09 00 20 ORA #$2000 ;} Set enemy to process instructions
$A8:9061 9D 86 0F STA $0F86,x[$7E:0F86] ;/
$A8:9064 A9 4D 80 LDA #$804D ;\
$A8:9067 9D 8E 0F STA $0F8E,x[$7E:0F8E] ;} Enemy spritemap pointer = $804D (no effect)
$A8:906A A9 01 00 LDA #$0001 ;\
$A8:906D 9D 94 0F STA $0F94,x[$7E:0F94] ;} Enemy instruction timer = 1
$A8:9070 9E 90 0F STZ $0F90,x[$7E:0F90] ; Enemy timer = 0
$A8:9073 BD B6 0F LDA $0FB6,x[$7E:0FB6] ;\
$A8:9076 30 1E BMI $1E [$9096] ;} If [enemy parameter 2] & 8000h != 0: go to BRANCH_MOUNT
$A8:9078 A9 F1 90 LDA #$90F1 ;\
$A8:907B 9D B2 0F STA $0FB2,x[$7E:0FF2] ;} Enemy function = $90F1 (wait for Samus to get near)
$A8:907E BD B4 0F LDA $0FB4,x[$7E:0FF4] ;\
$A8:9081 89 01 00 BIT #$0001 ;} If [enemy parameter 1] & 1 != 0:
$A8:9084 F0 08 BEQ $08 [$908E] ;/
$A8:9086 A9 0E 90 LDA #$900E ;\
$A8:9089 9D 92 0F STA $0F92,x[$7E:0FD2] ;} Enemy instruction list pointer = $900E (eye - facing left - closed)
$A8:908C 80 3B BRA $3B [$90C9] ; Return
$A8:908E A9 FC 8F LDA #$8FFC ;\ Else ([enemy parameter 1] & 1 = 0):
$A8:9091 9D 92 0F STA $0F92,x[$7E:0FD2] ;} Enemy instruction list pointer = $8FFC (eye - facing right - closed)
$A8:9094 80 33 BRA $33 [$90C9] ; Return
; BRANCH_MOUNT
$A8:9096 29 0F 00 AND #$000F ;\
$A8:9099 0A ASL A ;} Y = ([enemy parameter 2] & Fh) * 2
$A8:909A A8 TAY ;/
$A8:909B BD 7A 0F LDA $0F7A,x[$7E:0F7A] ;\
$A8:909E 18 CLC ;|
$A8:909F 79 CA 90 ADC $90CA,y[$A8:90CA] ;} Enemy X position += [$90CA + [Y]]
$A8:90A2 9D 7A 0F STA $0F7A,x[$7E:0F7A] ;/
$A8:90A5 BD 7E 0F LDA $0F7E,x[$7E:0F7E] ;\
$A8:90A8 18 CLC ;|
$A8:90A9 79 D2 90 ADC $90D2,y[$A8:90D2] ;} Enemy Y position += [$90D2 + [Y]]
$A8:90AC 9D 7E 0F STA $0F7E,x[$7E:0F7E] ;/
$A8:90AF A9 DC 91 LDA #$91DC ;\
$A8:90B2 9D B2 0F STA $0FB2,x[$7E:0FB2] ;} Enemy function = RTL
$A8:90B5 B9 DA 90 LDA $90DA,y[$A8:90DA] ;\
$A8:90B8 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = [$90DA + [Y]]
$A8:90BB A2 FE 01 LDX #$01FE ;\
;|
$A8:90BE A9 FF 00 LDA #$00FF ;|
$A8:90C1 9F 00 91 7E STA $7E9100,x[$7E:92FE];} Morph ball eye beam window 1 HDMA data table = FFh,00h
$A8:90C5 CA DEX ;|
$A8:90C6 CA DEX ;|
$A8:90C7 10 F5 BPL $F5 [$90BE] ;/
$A8:90C9 6B RTL
$A8:90CA dw FFF8, 0008, 0000, 0000 ; X offsets
$A8:90D2 dw 0000, 0000, FFF8, 0008 ; Y offsets
$A8:90DA dw 9044, 9038, 904A, 903E ; Instruction list pointers
}
;;; $90E2: Main AI - enemy $E6BF (morph ball eye) ;;;
{
$A8:90E2 AE 54 0E LDX $0E54 [$7E:0E54]
$A8:90E5 AD A4 09 LDA $09A4 [$7E:09A4] ;\
$A8:90E8 89 04 00 BIT #$0004 ;} If collected morph ball:
$A8:90EB F0 03 BEQ $03 [$90F0] ;/
$A8:90ED 7C B2 0F JMP ($0FB2,x)[$A8:91DC]; Go to [enemy function]
$A8:90F0 6B RTL
}
;;; $90F1: Morph ball eye function - wait for Samus to get near ;;;
{
$A8:90F1 AD 54 90 LDA $9054 [$A8:9054] ;\
$A8:90F4 22 ED AE A0 JSL $A0AEED[$A0:AEED] ;|
$A8:90F8 A8 TAY ;} If Samus is not within 80h pixels rows of enemy: return
$A8:90F9 F0 32 BEQ $32 [$912D] ;/
$A8:90FB AD 50 90 LDA $9050 [$A8:9050] ;\
$A8:90FE 22 0B AF A0 JSL $A0AF0B[$A0:AF0B] ;|
$A8:9102 A8 TAY ;} If Samus is not within 80h pixel columns of enemy: return
$A8:9103 F0 28 BEQ $28 [$912D] ;/
$A8:9105 A9 20 00 LDA #$0020 ;\
$A8:9108 9D B0 0F STA $0FB0,x[$7E:0FF0] ;} Enemy function timer = 20h
$A8:910B A9 01 00 LDA #$0001 ;\
$A8:910E 9D 94 0F STA $0F94,x[$7E:0FD4] ;} Enemy instruction timer = 1
$A8:9111 BD B4 0F LDA $0FB4,x[$7E:0FF4] ;\
$A8:9114 89 01 00 BIT #$0001 ;} If [enemy parameter 1] & 1 != 0:
$A8:9117 F0 08 BEQ $08 [$9121] ;/
$A8:9119 A9 26 90 LDA #$9026 ;\
$A8:911C 9D 92 0F STA $0F92,x[$7E:0FD2] ;} Enemy instruction list pointer = $9026 (activating - facing left)
$A8:911F 80 06 BRA $06 [$9127]
$A8:9121 A9 14 90 LDA #$9014 ;\ Else ([enemy parameter 1] & 1 = 0):
$A8:9124 9D 92 0F STA $0F92,x[$7E:0FD2] ;} Enemy instruction list pointer = $9014 (activating - facing right)
$A8:9127 A9 2E 91 LDA #$912E ;\
$A8:912A 9D B2 0F STA $0FB2,x[$7E:0FF2] ;} Enemy function = $912E
$A8:912D 6B RTL
}
;;; $912E: Morph ball eye function - activating ;;;
{
$A8:912E DE B0 0F DEC $0FB0,x[$7E:0FF0] ; Decrement enemy function timer
$A8:9131 F0 02 BEQ $02 [$9135] ;\
$A8:9133 10 2A BPL $2A [$915F] ;} If [enemy function timer] > 0: return
$A8:9135 A9 17 00 LDA #$0017 ;\
$A8:9138 22 CB 90 80 JSL $8090CB[$80:90CB] ;} Queue sound 17h, sound library 2, max queued sounds allowed = 6 (morph ball eye's ray)
$A8:913C 22 D9 E8 88 JSL $88E8D9[$88:E8D9] ; Spawn morph ball eye beam HDMA object
$A8:9140 A9 60 91 LDA #$9160 ;\
$A8:9143 9D B2 0F STA $0FB2,x[$7E:0FF2] ;} Enemy function = $9160
$A8:9146 AD F6 0A LDA $0AF6 [$7E:0AF6] ;\
$A8:9149 38 SEC ;|
$A8:914A FD 7A 0F SBC $0F7A,x[$7E:0FBA] ;|
$A8:914D 85 12 STA $12 [$7E:0012] ;|
$A8:914F AD FA 0A LDA $0AFA [$7E:0AFA] ;|
$A8:9152 38 SEC ;} Enemy angle = angle from enemy to Samus
$A8:9153 FD 7E 0F SBC $0F7E,x[$7E:0FBE] ;|
$A8:9156 85 14 STA $14 [$7E:0014] ;|
$A8:9158 22 AE C0 A0 JSL $A0C0AE[$A0:C0AE] ;|
$A8:915C 9D AE 0F STA $0FAE,x[$7E:0FEE] ;/
$A8:915F 6B RTL
}
;;; $9160: Morph ball eye function - active ;;;
{
$A8:9160 AD 56 90 LDA $9056 [$A8:9056] ;\
$A8:9163 22 ED AE A0 JSL $A0AEED[$A0:AEED] ;|
$A8:9167 A8 TAY ;} If Samus is within 80h pixels rows of enemy:
$A8:9168 F0 0A BEQ $0A [$9174] ;/
$A8:916A AD 52 90 LDA $9052 [$A8:9052] ;\
$A8:916D 22 0B AF A0 JSL $A0AF0B[$A0:AF0B] ;|
$A8:9171 A8 TAY ;} If Samus is within 80h pixel columns of enemy: go to BRANCH_IN_PROXIMITY
$A8:9172 D0 2E BNE $2E [$91A2] ;/
$A8:9174 A9 71 00 LDA #$0071 ;\
$A8:9177 22 CB 90 80 JSL $8090CB[$80:90CB] ;} Queue sound 71h, sound library 2, max queued sounds allowed = 6 (silence)
$A8:917B 9E AC 0F STZ $0FAC,x[$7E:0FEC] ; Enemy activated flag = 0 (this is set to 1 by the HDMA object)
$A8:917E A9 20 00 LDA #$0020 ;\
$A8:9181 9D B0 0F STA $0FB0,x[$7E:0FF0] ;} Enemy function timer = 20h
$A8:9184 BD B4 0F LDA $0FB4,x[$7E:0FF4] ;\
$A8:9187 89 01 00 BIT #$0001 ;} If [enemy parameter 1] & 1 != 0:
$A8:918A F0 08 BEQ $08 [$9194] ;/
$A8:918C A9 02 90 LDA #$9002 ;\
$A8:918F 9D 92 0F STA $0F92,x[$7E:0FD2] ;} Enemy instruction list pointer = $9002 (facing left - deactivating)
$A8:9192 80 06 BRA $06 [$919A]
$A8:9194 A9 F0 8F LDA #$8FF0 ;\ Else ([enemy parameter 1] & 1 = 0):
$A8:9197 9D 92 0F STA $0F92,x[$7E:0FD2] ;} Enemy instruction list pointer = $8FF0 (facing right - deactivating)
$A8:919A A9 CE 91 LDA #$91CE ;\
$A8:919D 9D B2 0F STA $0FB2,x[$7E:0FF2] ;} Enemy function = $91CE
$A8:91A0 80 25 BRA $25 [$91C7] ; Go to BRANCH_MERGE
; BRANCH_IN_PROXIMITY
$A8:91A2 AD F6 0A LDA $0AF6 [$7E:0AF6] ;\
$A8:91A5 38 SEC ;|
$A8:91A6 FD 7A 0F SBC $0F7A,x[$7E:0FBA] ;|
$A8:91A9 85 12 STA $12 [$7E:0012] ;|
$A8:91AB AD FA 0A LDA $0AFA [$7E:0AFA] ;|
$A8:91AE 38 SEC ;} Enemy angle = angle from enemy to Samus
$A8:91AF FD 7E 0F SBC $0F7E,x[$7E:0FBE] ;|
$A8:91B2 85 14 STA $14 [$7E:0014] ;|
$A8:91B4 22 AE C0 A0 JSL $A0C0AE[$A0:C0AE] ;|
$A8:91B8 9D AE 0F STA $0FAE,x[$7E:0FEE] ;/
$A8:91BB 29 F0 00 AND #$00F0 ;\
$A8:91BE 4A LSR A ;|
$A8:91BF 4A LSR A ;|
$A8:91C0 18 CLC ;} Enemy instruction list pointer = $8FAC + [enemy angle] / 10h * 4
$A8:91C1 69 AC 8F ADC #$8FAC ;|
$A8:91C4 9D 92 0F STA $0F92,x[$7E:0FD2] ;/
; BRANCH_MERGE
$A8:91C7 A9 01 00 LDA #$0001 ;\
$A8:91CA 9D 94 0F STA $0F94,x[$7E:0FD4] ;} Enemy instruction timer = 1
$A8:91CD 6B RTL
}
;;; $91CE: Morph ball eye function - deactivating ;;;
{
$A8:91CE DE B0 0F DEC $0FB0,x[$7E:0FF0] ; Decrement enemy function timer
$A8:91D1 F0 02 BEQ $02 [$91D5] ;\
$A8:91D3 10 06 BPL $06 [$91DB] ;} If [enemy function timer] > 0: return
$A8:91D5 A9 F1 90 LDA #$90F1 ;\
$A8:91D8 9D B2 0F STA $0FB2,x[$7E:0FF2] ;} Enemy function = $90F1 (wait for Samus to get near)
$A8:91DB 6B RTL
}
;;; $91DC: RTL ;;;
{
$A8:91DC 6B RTL
}
;;; $91DD: RTL ;;;
{
$A8:91DD 6B RTL
}
;;; $91DE: RTL ;;;
{
$A8:91DE 6B RTL
}
;;; $91DF: Morph ball eye spritemaps ;;;
{
$A8:91DF dx 0001, 81F8,F8,2100
$A8:91E6 dx 0001, 81F8,F8,2102
$A8:91ED dx 0001, 81F8,F8,2104
$A8:91F4 dx 0001, 81F8,F8,2106
$A8:91FB dx 0001, 81F8,F8,2108
$A8:9202 dx 0001, 81F8,F8,210A
$A8:9209 dx 0001, 81F8,F8,210C
$A8:9210 dx 0001, 81F8,F8,6100
$A8:9217 dx 0001, 81F8,F8,6102
$A8:921E dx 0001, 81F8,F8,6104
$A8:9225 dx 0001, 81F8,F8,6106
$A8:922C dx 0001, 81F8,F8,6108