-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBank $A2.asm
10425 lines (8876 loc) · 438 KB
/
Bank $A2.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..8911: Boyon ;;;
{
;;; $8687: Palette - enemy $CEBF (boyon) ;;;
{
$A2:8687 dw 3800, 4BBE, 06B9, 00EA, 0065, 173A, 0276, 01F2, 014D, 0000, 0000, 0000, 0000, 0000, 0000, 0000
}
;;; $86A7..DE: Instruction lists - boyon ;;;
{
;;; $86A7: Instruction list - idle ;;;
{
$A2:86A7 dx 817D, ; Disable off-screen processing
88C5 ; Nothing
$A2:86AB dx 000A,88DA,
000A,88E1,
000A,88E8,
000A,88E1,
80ED,86AB ; Go to $86AB
}
;;; $86BF: Instruction list - bouncing ;;;
{
$A2:86BF dx 8173, ; Enable off-screen processing
88C6 ; Start bounce
$A2:86C3 dx 0005,88EF,
0005,88F6,
0005,88FD,
0005,8904,
0005,88FD,
0005,88F6,
80ED,86C3 ; Go to $86C3
}
}
;;; $86DF: Boyon data ;;;
{
; Speed multipliers. Indexed by [enemy parameter 1 low] * 2
$A2:86DF dw 0001, 0002, 0004, 0008, 000A, 000D, 0010, 0014
; Jump heights. Unit 1/100h px. Indexed by [enemy parameter 1 high] * 2
$A2:86EF dw 3000, 4000, 5000, 6000, 7000, 8000, 9000, A000, B000
; Speed table. k (k+1) / 2 (sum of 0..k)
$A2:8701 db 00, 01, 03, 06, 0A, 0F, 15, 1C, 24, 2D, 37, 42, 4E, 5B, 69, 78, 88, 99, AB, BE, D2, E7, FD
; Bounce movement functions
$A2:8718 dw 8801, 8850
}
;;; $871C: Initialisation AI - enemy $CEBF (boyon) ;;;
{
$A2:871C AE 54 0E LDX $0E54 [$7E:0E54]
$A2:871F A9 4D 80 LDA #$804D ;\
$A2:8722 9D 8E 0F STA $0F8E,x[$7E:0F8E] ;} Enemy spritemap pointer = $804D (no effect)
$A2:8725 20 9F 88 JSR $889F [$A2:889F] ; Set boyon idle instruction list
$A2:8728 A9 01 00 LDA #$0001 ;\
$A2:872B 9F 02 78 7E STA $7E7802,x[$7E:7802];} Enemy bounce movement index = rising
$A2:872F BD B4 0F LDA $0FB4,x[$7E:0FB4] ;\
$A2:8732 29 FF 00 AND #$00FF ;|
$A2:8735 0A ASL A ;|
$A2:8736 A8 TAY ;} Enemy speed multiplier = [$86DF + [enemy parameter 1 low] * 2]
$A2:8737 B9 DF 86 LDA $86DF,y[$A2:86E5] ;|
$A2:873A 9D A8 0F STA $0FA8,x[$7E:0FA8] ;/
$A2:873D BD B5 0F LDA $0FB5,x[$7E:0FB5] ;\
$A2:8740 29 FF 00 AND #$00FF ;|
$A2:8743 0A ASL A ;|
$A2:8744 A8 TAY ;} Enemy jump height = [$86EF + [enemy parameter 1 high] * 2]
$A2:8745 B9 EF 86 LDA $86EF,y[$A2:86EF] ;|
$A2:8748 9D AC 0F STA $0FAC,x[$7E:0FAC] ;/
$A2:874B 9E AE 0F STZ $0FAE,x[$7E:0FAE] ; Enemy distance accumulator = 0
$A2:874E 9E B0 0F STZ $0FB0,x[$7E:0FB0] ; Enemy speed table index = 0
$A2:8751 9E B2 0F STZ $0FB2,x[$7E:0FB2] ; Enemy bouncing flag = 0
$A2:8754 6B RTL
}
;;; $8755: Calculate initial bounce speed ;;;
{
$A2:8755 08 PHP
; LOOP
$A2:8756 BC B0 0F LDY $0FB0,x[$7E:0FB0] ;\
$A2:8759 E2 20 SEP #$20 ;} A = [$8701 + [enemy speed table index]]
$A2:875B B9 01 87 LDA $8701,y[$A2:8701] ;/
$A2:875E C0 17 00 CPY #$0017 ;\
$A2:8761 30 02 BMI $02 [$8765] ;} If [enemy speed table index] >= 17h:
$A2:8763 A9 FF LDA #$FF ; A = FFh
$A2:8765 8D 02 42 STA $4202 ;\
$A2:8768 BD A8 0F LDA $0FA8,x[$7E:0FA8] ;|
$A2:876B 8D 03 42 STA $4203 ;|
$A2:876E EA NOP ;|
$A2:876F EA NOP ;} Enemy speed = [A] * [enemy speed multiplier]
$A2:8770 EA NOP ;|
$A2:8771 C2 20 REP #$20 ;|
$A2:8773 AD 16 42 LDA $4216 ;|
$A2:8776 9D AA 0F STA $0FAA,x[$7E:0FAA] ;/
$A2:8779 18 CLC ;\
$A2:877A 7D AE 0F ADC $0FAE,x[$7E:0FAE] ;} Enemy distance accumulator += [enemy speed]
$A2:877D 9D AE 0F STA $0FAE,x[$7E:0FAE] ;/
$A2:8780 FE B0 0F INC $0FB0,x[$7E:0FB0] ; Increment speed table index
$A2:8783 DD AC 0F CMP $0FAC,x[$7E:0FAC] ;\
$A2:8786 30 CE BMI $CE [$8756] ;} If [enemy distance accumulator] < [enemy jump height]: go to LOOP
$A2:8788 BD B0 0F LDA $0FB0,x[$7E:0FB0] ;\
$A2:878B 9F 00 78 7E STA $7E7800,x[$7E:7800];} Enemy initial bounce speed table index = [enemy speed table index]
$A2:878F A9 01 00 LDA #$0001 ;\
$A2:8792 9F 04 78 7E STA $7E7804,x[$7E:7804];} Enemy bounce disable flag = 1
$A2:8796 9F 08 78 7E STA $7E7808,x[$7E:7808]; Enemy idle disable flag = 1
$A2:879A 28 PLP
$A2:879B 60 RTS
}
;;; $879C: Main AI - enemy $CEBF (boyon) ;;;
{
$A2:879C AE 54 0E LDX $0E54 [$7E:0E54]
$A2:879F BF 0A 78 7E LDA $7E780A,x[$7E:780A];\
$A2:87A3 D0 0B BNE $0B [$87B0] ;} If [enemy bounce speed calculated flag] = 0:
$A2:87A5 20 55 87 JSR $8755 [$A2:8755] ; Calculate initial bounce speed
$A2:87A8 A9 01 00 LDA #$0001 ;\
$A2:87AB 9F 0A 78 7E STA $7E780A,x[$7E:780A];} Enemy bounce speed calculated flag = 1
$A2:87AF 6B RTL ; Return
$A2:87B0 BD A8 0F LDA $0FA8,x[$7E:0FA8] ;\
$A2:87B3 9F 06 78 7E STA $7E7806,x[$7E:7806];} Enemy speed multiplier mirror = [enemy speed multiplier] (not meaningfully used)
$A2:87B7 20 94 88 JSR $8894 [$A2:8894] ;\
$A2:87BA D0 18 BNE $18 [$87D4] ;} If Samus is in proximity: go to BRANCH_IN_PROXIMITY
$A2:87BC BF 04 78 7E LDA $7E7804,x[$7E:7804];\
$A2:87C0 F0 2B BEQ $2B [$87ED] ;} If [enemy bounce disable flag] = 0: go to BRANCH_BOUNCING
$A2:87C2 BF 08 78 7E LDA $7E7808,x[$7E:7808];\
$A2:87C6 D0 38 BNE $38 [$8800] ;} If [enemy idle disable flag] != 0: return
$A2:87C8 A9 01 00 LDA #$0001 ;\
$A2:87CB 9F 08 78 7E STA $7E7808,x[$7E:7808];} Enemy idle disable flag = 1
$A2:87CF 20 9F 88 JSR $889F [$A2:889F] ; Set boyon idle instruction list
$A2:87D2 80 2C BRA $2C [$8800] ; Return
; BRANCH_IN_PROXIMITY
$A2:87D4 A9 00 00 LDA #$0000 ;\
$A2:87D7 9F 04 78 7E STA $7E7804,x[$7E:7844];} Enemy bounce disable flag = 0
$A2:87DB 9F 08 78 7E STA $7E7808,x[$7E:7848]; Enemy idle disable flag = 0
$A2:87DF BD B2 0F LDA $0FB2,x[$7E:0FF2] ;\
$A2:87E2 D0 09 BNE $09 [$87ED] ;} If [enemy bouncing flag] = 0:
$A2:87E4 A9 01 00 LDA #$0001 ;\
$A2:87E7 9D B2 0F STA $0FB2,x[$7E:0FF2] ;} Enemy bouncing flag = 1
$A2:87EA 20 B2 88 JSR $88B2 [$A2:88B2] ; Set boyon bouncing instruction list
; BRANCH_BOUNCING
$A2:87ED AE 54 0E LDX $0E54 [$7E:0E54]
$A2:87F0 BF 06 78 7E LDA $7E7806,x[$7E:7846];\
$A2:87F4 9D A8 0F STA $0FA8,x[$7E:0FE8] ;} Enemy speed multiplier = [enemy speed multiplier mirror]
$A2:87F7 BF 02 78 7E LDA $7E7802,x[$7E:7842];\
$A2:87FB 0A ASL A ;|
$A2:87FC AA TAX ;} Execute [$8718 + [enemy bounce movement index] * 2]
$A2:87FD FC 18 87 JSR ($8718,x)[$A2:8850];/
$A2:8800 6B RTL
}
;;; $8801: Boyon bounce movement - falling ;;;
{
$A2:8801 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8804 FE B0 0F INC $0FB0,x[$7E:0FF0] ; Increment enemy speed table index
$A2:8807 BC B0 0F LDY $0FB0,x[$7E:0FF0] ;\
$A2:880A E2 20 SEP #$20 ;} A = [$8701 + [enemy speed table index]]
$A2:880C B9 01 87 LDA $8701,y[$A2:8701] ;/
$A2:880F C0 17 00 CPY #$0017 ;\
$A2:8812 30 02 BMI $02 [$8816] ;} If [enemy speed table index] >= 17h:
$A2:8814 A9 FF LDA #$FF ; A = FFh
$A2:8816 8D 02 42 STA $4202 ;\
$A2:8819 BD A8 0F LDA $0FA8,x[$7E:0FE8] ;|
$A2:881C 8D 03 42 STA $4203 ;|
$A2:881F EA NOP ;|
$A2:8820 EA NOP ;} Enemy speed = [A] * [enemy speed multiplier]
$A2:8821 EA NOP ;|
$A2:8822 C2 20 REP #$20 ;|
$A2:8824 AD 16 42 LDA $4216 ;|
$A2:8827 9D AA 0F STA $0FAA,x[$7E:0FEA] ;/
$A2:882A EB XBA ;\
$A2:882B 29 FF 00 AND #$00FF ;|
$A2:882E 18 CLC ;} Enemy Y position += [enemy speed] / 100h
$A2:882F 7D 7E 0F ADC $0F7E,x[$7E:0FBE] ;|
$A2:8832 9D 7E 0F STA $0F7E,x[$7E:0FBE] ;/
$A2:8835 BD B0 0F LDA $0FB0,x[$7E:0FF0] ;\
$A2:8838 DF 00 78 7E CMP $7E7800,x[$7E:7840];} If [enemy speed table index] >= [enemy initial bounce speed table index]:
$A2:883C 30 11 BMI $11 [$884F] ;/
$A2:883E A9 01 00 LDA #$0001 ;\
$A2:8841 9F 02 78 7E STA $7E7802,x[$7E:7842];} Enemy bounce movement index = rising
$A2:8845 A9 01 00 LDA #$0001 ; >_<;
$A2:8848 9F 04 78 7E STA $7E7804,x[$7E:7844]; Enemy bounce disable flag = 1
$A2:884C 9E B2 0F STZ $0FB2,x[$7E:0FF2] ; Enemy bouncing flag = 0
$A2:884F 60 RTS
}
;;; $8850: Boyon bounce movement - rising ;;;
{
$A2:8850 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8853 BC B0 0F LDY $0FB0,x[$7E:0FF0] ;\
$A2:8856 E2 20 SEP #$20 ;} A = [$8701 + [enemy speed table index]]
$A2:8858 B9 01 87 LDA $8701,y[$A2:8716] ;/
$A2:885B C0 17 00 CPY #$0017 ;\
$A2:885E 30 02 BMI $02 [$8862] ;} If [enemy speed table index] >= 17h:
$A2:8860 A9 FF LDA #$FF ; A = FFh
$A2:8862 8D 02 42 STA $4202 ;\
$A2:8865 BD A8 0F LDA $0FA8,x[$7E:0FE8] ;|
$A2:8868 8D 03 42 STA $4203 ;|
$A2:886B EA NOP ;|
$A2:886C EA NOP ;} Enemy speed = [A] * [enemy speed multiplier]
$A2:886D EA NOP ;|
$A2:886E C2 20 REP #$20 ;|
$A2:8870 AD 16 42 LDA $4216 ;|
$A2:8873 9D AA 0F STA $0FAA,x[$7E:0FEA] ;/
$A2:8876 EB XBA ;\
$A2:8877 29 FF 00 AND #$00FF ;|
$A2:887A 49 FF FF EOR #$FFFF ;|
$A2:887D 1A INC A ;} Enemy Y position -= [enemy speed] / 100h
$A2:887E 18 CLC ;|
$A2:887F 7D 7E 0F ADC $0F7E,x[$7E:0FBE] ;|
$A2:8882 9D 7E 0F STA $0F7E,x[$7E:0FBE] ;/
$A2:8885 DE B0 0F DEC $0FB0,x[$7E:0FF0] ; Decrement enemy speed table index
$A2:8888 30 02 BMI $02 [$888C] ; If [enemy speed table index] >= 0:
$A2:888A 80 07 BRA $07 [$8893] ; Return
$A2:888C A9 00 00 LDA #$0000 ;\
$A2:888F 9F 02 78 7E STA $7E7802,x[$7E:7842];} Enemy bounce movement index = falling
$A2:8893 60 RTS
}
;;; $8894: Check if Samus is in proximity ;;;
{
;; Returns:
;; Zero: Clear if Samus is in proximity, set otherwise
$A2:8894 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8897 BD B6 0F LDA $0FB6,x[$7E:0FB6] ;\
$A2:889A 22 0B AF A0 JSL $A0AF0B[$A0:AF0B] ;} A = (1 if Samus within [enemy parameter 2] pixel columns of enemy, else 0)
$A2:889E 60 RTS
}
;;; $889F: Set boyon idle instruction list ;;;
{
$A2:889F AE 54 0E LDX $0E54 [$7E:0E54]
$A2:88A2 A9 A7 86 LDA #$86A7 ;\
$A2:88A5 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $86A7 (idle)
$A2:88A8 A9 01 00 LDA #$0001 ;\
$A2:88AB 9D 94 0F STA $0F94,x[$7E:0F94] ;} Enemy instruction timer = 1
$A2:88AE 9E 90 0F STZ $0F90,x[$7E:0F90] ; Enemy timer = 0
$A2:88B1 60 RTS
}
;;; $88B2: Set boyon bouncing instruction list ;;;
{
$A2:88B2 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:88B5 A9 BF 86 LDA #$86BF ;\
$A2:88B8 9D 92 0F STA $0F92,x[$7E:0FD2] ;} Enemy instruction list pointer = $86BF (bouncing)
$A2:88BB A9 01 00 LDA #$0001 ;\
$A2:88BE 9D 94 0F STA $0F94,x[$7E:0FD4] ;} Enemy instruction timer = 1
$A2:88C1 9E 90 0F STZ $0F90,x[$7E:0FD0] ; Enemy timer = 0
$A2:88C4 60 RTS
}
;;; $88C5: RTL. Instruction - nothing ;;;
{
$A2:88C5 6B RTL
}
;;; $88C6: Instruction - start bounce ;;;
{
$A2:88C6 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:88C9 A9 00 00 LDA #$0000 ;\
$A2:88CC 9F 04 78 7E STA $7E7804,x[$7E:7844];} Enemy bounce disable flag = 0
$A2:88D0 A9 0E 00 LDA #$000E ;\
$A2:88D3 22 CB 90 80 JSL $8090CB[$80:90CB] ;} Queue sound Eh, sound library 2, max queued sounds allowed = 6 (splashed out of water)
$A2:88D7 6B RTL
}
;;; $88D8: RTL ;;;
{
$A2:88D8 6B RTL
}
;;; $88D9: RTL ;;;
{
$A2:88D9 6B RTL
}
;;; $88DA: Spritemaps - boyon ;;;
{
$A2:88DA dx 0001, C3F8,F8,2100
$A2:88E1 dx 0001, C3F8,F8,2102
$A2:88E8 dx 0001, C3F8,F8,2104
$A2:88EF dx 0001, C3F8,F8,2106
$A2:88F6 dx 0001, C3F8,F8,2108
$A2:88FD dx 0001, C3F8,F8,210A
$A2:8904 dx 0001, C3F8,F8,210C
$A2:890B dx 0001, C3F8,F8,210E ; Unused
}
}
;;; $8912..8B5F: Mini-Crocomire ;;;
{
;;; $8912: Palette - enemy $CEFF (mini-Crocomire) ;;;
{
$A2:8912 dw 3800, 3DB3, 292E, 1486, 1840, 3D92, 38CA, 1C61, 24A7, 24A7, 2063, 1840, 0800, 0000, 0000, 0000
}
;;; $8932..7D: Instruction lists - mini-Crocomire ;;;
{
;;; $8932: Instruction list - moving left ;;;
{
$A2:8932 dw 8990 ; Set moving left
$A2:8934 dw 0008,8ACA,
0010,8AD6,
0008,8AE7,
0008,8AF3,
80ED,8934 ; Go to $8934
}
;;; $8948: Instruction list - attacking left ;;;
{
$A2:8948 dw 0010,8AE7,
897E,0000, ; Spawn leftwards mini-Crocomire projectile
0010,8AFF,
80ED,8932 ; Go to $8932
}
;;; $8958: Instruction list - moving right ;;;
{
$A2:8958 dw 899D ; Set moving right
$A2:895A dw 0008,8B15,
0010,8B21,
0008,8B32,
0008,8B3E,
80ED,895A ; Go to $895A
}
;;; $896E: Instruction list - attacking right ;;;
{
$A2:896E dw 0010,8B32,
897E,0001, ; Spawn rightwards mini-Crocomire projectile
0010,8B4A,
80ED,8958 ; Go to $8958
}
}
;;; $897E: Instruction - spawn mini-Crocomire projectile with direction [[Y]] ;;;
{
$A2:897E 5A PHY
$A2:897F B9 00 00 LDA $0000,y ; A = [[Y]] (direction)
$A2:8982 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8985 A0 F2 DB LDY #$DBF2 ;\
$A2:8988 22 27 80 86 JSL $868027[$86:8027] ;} Spawn mini-Crocomire projectile enemy projectile
$A2:898C 7A PLY
$A2:898D C8 INY ;\
$A2:898E C8 INY ;} Y += 2
$A2:898F 6B RTL
}
;;; $8990: Instruction - set moving left ;;;
{
$A2:8990 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8993 A9 43 8A LDA #$8A43 ;\
$A2:8996 9D B2 0F STA $0FB2,x ;} Enemy function = $8A43 (moving left)
$A2:8999 9E B0 0F STZ $0FB0,x ; Enemy direction = left
$A2:899C 6B RTL
}
;;; $899D: Instruction - set moving right ;;;
{
$A2:899D AE 54 0E LDX $0E54 [$7E:0E54]
$A2:89A0 A9 5C 8A LDA #$8A5C ;\
$A2:89A3 9D B2 0F STA $0FB2,x ;} Enemy function = $8A5C (moving right)
$A2:89A6 A9 01 00 LDA #$0001 ; Enemy direction = right
$A2:89A9 9D B0 0F STA $0FB0,x
$A2:89AC 6B RTL
}
;;; $89AD: Initialisation AI - enemy $CEFF (mini-Crocomire) ;;;
{
$A2:89AD AE 54 0E LDX $0E54 [$7E:0E54]
$A2:89B0 A9 4D 80 LDA #$804D ;\
$A2:89B3 9D 8E 0F STA $0F8E,x ;} Enemy spritemap pointer = $804D (no effect)
$A2:89B6 BD B6 0F LDA $0FB6,x ;\
$A2:89B9 0A ASL A ;|
$A2:89BA 0A ASL A ;} Y = [enemy parameter 2] * 8 (linear speed table index)
$A2:89BB 0A ASL A ;|
$A2:89BC A8 TAY ;/
$A2:89BD B9 87 81 LDA $8187,y ;\
$A2:89C0 9D AA 0F STA $0FAA,x ;|
$A2:89C3 B9 89 81 LDA $8189,y ;} Enemy right velocity = [$8187 + [Y]].[$8187 + [Y] + 2]
$A2:89C6 9D A8 0F STA $0FA8,x ;/
$A2:89C9 B9 8B 81 LDA $818B,y ;\
$A2:89CC 9D AE 0F STA $0FAE,x ;|
$A2:89CF B9 8D 81 LDA $818D,y ;} Enemy left velocity = [$8187 + [Y] + 4].[$8187 + [Y] + 6]
$A2:89D2 9D AC 0F STA $0FAC,x ;/
$A2:89D5 20 F7 89 JSR $89F7 [$A2:89F7] ; Set mini-Crocomire moving left instruction list
$A2:89D8 A9 43 8A LDA #$8A43 ;\
$A2:89DB 9D B2 0F STA $0FB2,x ;} Enemy function = $8A43 (moving left)
$A2:89DE BD B4 0F LDA $0FB4,x ;\
$A2:89E1 9D B0 0F STA $0FB0,x ;} Enemy direction = [enemy parameter 1]
$A2:89E4 F0 09 BEQ $09 [$89EF] ; If [enemy direction] != left:
$A2:89E6 20 1D 8A JSR $8A1D [$A2:8A1D] ; Set mini-Crocomire moving right instruction list
$A2:89E9 A9 5C 8A LDA #$8A5C ;\
$A2:89EC 9D B2 0F STA $0FB2,x ;} Enemy function = $8A5C (moving right)
$A2:89EF 6B RTL
}
;;; $89F0: Main AI - enemy $CEFF (mini-Crocomire) ;;;
{
$A2:89F0 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:89F3 FC B2 0F JSR ($0FB2,x) ; Execute [enemy function]
$A2:89F6 6B RTL
}
;;; $89F7: Set mini-Crocomire moving left instruction list ;;;
{
$A2:89F7 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:89FA A9 01 00 LDA #$0001 ;\
$A2:89FD 9D 94 0F STA $0F94,x ;} Enemy instruction timer = 1
$A2:8A00 9E 90 0F STZ $0F90,x ; Enemy timer = 0
$A2:8A03 A9 32 89 LDA #$8932 ;\
$A2:8A06 9D 92 0F STA $0F92,x ;} Enemy instruction list pointer = $8932
$A2:8A09 60 RTS
}
;;; $8A0A: Set mini-Crocomire attacking left instruction list ;;;
{
$A2:8A0A AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8A0D A9 01 00 LDA #$0001 ;\
$A2:8A10 9D 94 0F STA $0F94,x ;} Enemy instruction timer = 1
$A2:8A13 9E 90 0F STZ $0F90,x ; Enemy timer = 0
$A2:8A16 A9 48 89 LDA #$8948 ;\
$A2:8A19 9D 92 0F STA $0F92,x ;} Enemy instruction list pointer = $8948
$A2:8A1C 60 RTS
}
;;; $8A1D: Set mini-Crocomire moving right instruction list ;;;
{
$A2:8A1D AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8A20 A9 01 00 LDA #$0001 ;\
$A2:8A23 9D 94 0F STA $0F94,x ;} Enemy instruction timer = 1
$A2:8A26 9E 90 0F STZ $0F90,x ; Enemy timer = 0
$A2:8A29 A9 58 89 LDA #$8958 ;\
$A2:8A2C 9D 92 0F STA $0F92,x ;} Enemy instruction list pointer = $8958
$A2:8A2F 60 RTS
}
;;; $8A30: Set mini-Crocomire attacking right instruction list ;;;
{
$A2:8A30 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8A33 A9 01 00 LDA #$0001 ;\
$A2:8A36 9D 94 0F STA $0F94,x ;} Enemy instruction timer = 1
$A2:8A39 9E 90 0F STZ $0F90,x ; Enemy timer = 0
$A2:8A3C A9 6E 89 LDA #$896E ;\
$A2:8A3F 9D 92 0F STA $0F92,x ;} Enemy instruction list pointer = $896E
$A2:8A42 60 RTS
}
;;; $8A43: Mini-Crocomire function - moving left ;;;
{
$A2:8A43 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8A46 BD AE 0F LDA $0FAE,x ;\
$A2:8A49 85 14 STA $14 [$7E:0014] ;|
$A2:8A4B BD AC 0F LDA $0FAC,x ;} $14.$12 = [enemy left subvelocity]
$A2:8A4E 85 12 STA $12 [$7E:0012] ;/
$A2:8A50 20 76 8A JSR $8A76 [$A2:8A76] ; Mini-Crocomire movement
$A2:8A53 20 A7 8A JSR $8AA7 [$A2:8AA7] ; Decide whether to attack
$A2:8A56 90 03 BCC $03 [$8A5B] ; If decided attack:
$A2:8A58 20 0A 8A JSR $8A0A [$A2:8A0A] ; Set mini-Crocomire attacking left instruction list
$A2:8A5B 60 RTS
}
;;; $8A5C: Mini-Crocomire function - moving right ;;;
{
$A2:8A5C AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8A5F BD AA 0F LDA $0FAA,x ;\
$A2:8A62 85 14 STA $14 [$7E:0014] ;|
$A2:8A64 BD A8 0F LDA $0FA8,x ;} $14.$12 = [enemy right subvelocity]
$A2:8A67 85 12 STA $12 [$7E:0012] ;/
$A2:8A69 20 76 8A JSR $8A76 [$A2:8A76] ; Mini-Crocomire movement
$A2:8A6C 20 A7 8A JSR $8AA7 [$A2:8AA7] ; Decide whether to attack
$A2:8A6F 90 03 BCC $03 [$8A74] ; If decided attack:
$A2:8A71 20 30 8A JSR $8A30 [$A2:8A30] ; Set mini-Crocomire attacking left instruction list
$A2:8A74 60 RTS
}
;;; $8A75: RTS ;;;
{
$A2:8A75 60 RTS
}
;;; $8A76: Mini-Crocomire movement ;;;
{
;; Parameters:
;; $14.$12: X velocity
$A2:8A76 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8A79 22 AB C6 A0 JSL $A0C6AB[$A0:C6AB] ; Move enemy right by [$14].[$12]
$A2:8A7D 90 05 BCC $05 [$8A84] ; If collided with wall:
$A2:8A7F 20 95 8A JSR $8A95 [$A2:8A95] ; Turn mini-Crocomire around
$A2:8A82 80 10 BRA $10 [$8A94] ; Return
$A2:8A84 A9 02 00 LDA #$0002 ;\
$A2:8A87 85 14 STA $14 [$7E:0014] ;} $14.$12 = 2.0
$A2:8A89 64 12 STZ $12 [$7E:0012] ;/
$A2:8A8B 22 76 BC A0 JSL $A0BC76[$A0:BC76] ; Check for vertical "solid" block collision
$A2:8A8F B0 03 BCS $03 [$8A94] ; If no collision:
$A2:8A91 20 95 8A JSR $8A95 [$A2:8A95] ; Turn mini-Crocomire around
$A2:8A94 60 RTS
}
;;; $8A95: Turn mini-Crocomire around ;;;
{
$A2:8A95 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8A98 20 F7 89 JSR $89F7 [$A2:89F7] ; Set mini-Crocomire moving left instruction list
$A2:8A9B BD B0 0F LDA $0FB0,x ;\
$A2:8A9E 49 01 00 EOR #$0001 ;} If [enemy direction] != right:
$A2:8AA1 F0 03 BEQ $03 [$8AA6] ;/
$A2:8AA3 20 1D 8A JSR $8A1D [$A2:8A1D] ; Set mini-Crocomire moving right instruction list
$A2:8AA6 60 RTS
}
;;; $8AA7: Decide whether to attack ;;;
{
;; Returns:
;; Carry: Set if decided attack, clear otherwise
$A2:8AA7 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8AAA 22 11 81 80 JSL $808111[$80:8111] ; Generate random number
$A2:8AAE AD E5 05 LDA $05E5 [$7E:05E5] ;\
$A2:8AB1 18 CLC ;|
$A2:8AB2 7D A4 0F ADC $0FA4,x ;|
$A2:8AB5 29 FF 00 AND #$00FF ;} If ([random number] + [enemy frame counter]) % 100h >= 2: return carry clear
$A2:8AB8 C9 02 00 CMP #$0002 ;|
$A2:8ABB 10 09 BPL $09 [$8AC6] ;/
$A2:8ABD A9 75 8A LDA #$8A75 ;\
$A2:8AC0 9D B2 0F STA $0FB2,x ;} Enemy function = RTS
$A2:8AC3 38 SEC ;\
$A2:8AC4 80 01 BRA $01 [$8AC7] ;} Return carry set
$A2:8AC6 18 CLC
$A2:8AC7 60 RTS
}
;;; $8AC8: RTL ;;;
{
$A2:8AC8 6B RTL
}
;;; $8AC9: RTL ;;;
{
$A2:8AC9 6B RTL
}
;;; $8ACA: Spritemaps - mini-Crocomire ;;;
{
$A2:8ACA dx 0002, C3FE,F8,2101, C3F6,F8,2100
$A2:8AD6 dx 0003, 01FE,F0,210F, C3FE,F8,2104, C3F6,F8,2103
$A2:8AE7 dx 0002, C3F6,F8,2106, C3FE,F8,2101
$A2:8AF3 dx 0002, C3FE,F8,2101, C3F6,F8,2108
$A2:8AFF dx 0004, 01FE,F0,210E, 01F6,F0,210D, C3FE,F8,210B, C3F6,F8,210A
$A2:8B15 dx 0002, C3F2,F8,6101, C3FA,F8,6100
$A2:8B21 dx 0003, 01FA,F0,610F, C3F2,F8,6104, C3FA,F8,6103
$A2:8B32 dx 0002, C3FA,F8,6106, C3F2,F8,6101
$A2:8B3E dx 0002, C3F2,F8,6101, C3FA,F8,6108
$A2:8B4A dx 0004, 01FA,F0,610E, 0002,F0,610D, C3F2,F8,610B, C3FA,F8,610A
}
}
;;; $8B60..998C: Tatori ;;;
{
;;; $8B60: Palette - enemy $CF3F/$CF7F (tatori) ;;;
{
$A2:8B60 dw 3800, 4B9C, 3694, 08E7, 0884, 42F7, 2A52, 19AD, 1129, 7FFF, 033B, 0216, 0113, 7FFF, 03FF, 000D
}
;;; $8B80..8D4F: Instruction lists - tatori ;;;
{
;;; $8B80: Instruction list - mini-tatori - crawling left ;;;
{
$A2:8B80 dx 9381, ; Crawl
000A,94D9,
000A,94E0,
9381, ; Crawl
000A,94E7,
000A,94EE,
9381, ; Crawl
000A,94D9,
000A,94E0,
9381, ; Crawl
000A,94E7,
000A,94EE,
9381, ; Crawl
000A,94D9,
000A,94E0,
9381, ; Crawl
000A,9501,
000A,950D,
9381, ; Crawl
000A,94D9,
000A,94F5,
9381, ; Crawl
000A,9501,
000A,950D,
9412 ; Loop or turn around if moved too far
}
;;; $8BD2: Instruction list - mini-tatori - spinning ;;;
{
$A2:8BD2 dx 0001,9519,
94D1, ; Queue tatori spinning sound effect
0004,9519,
0005,9520,
0005,9527,
0005,952E,
94C7, ; Enemy function = spinning - stoppable
80ED,8BD2 ; Go to $8BD2
}
;;; $8BEE: Unused. Instruction list ;;;
{
$A2:8BEE dx 0010,95E5,
0010,961E,
0010,9657,
0010,9690,
80ED,8BEE ; Go to $8BEE
}
;;; $8C02: Instruction list - tatori - spinning ;;;
{
$A2:8C02 dx 0001,9535,
94D1, ; Queue tatori spinning sound effect
0004,9535,
0005,96E9,
0005,96C9,
0005,96E9,
80ED,8C02 ; Go to $8C02
}
;;; $8C1C: Instruction list - tatori - facing left - enter shell ;;;
{
$A2:8C1C dx 0020,95E5,
0005,959D,
0005,9555,
9451, ; Rise to hover rightwards, go to $8C02 (spinning)
7FFF,9535,
812F ; Sleep
}
;;; $8C30: Instruction list - mini-tatori - facing left - hiding ;;;
{
$A2:8C30 dx 0005,94F5,
0005,9501,
0040,9519,
9485, ; Leave shell
7FFF,9519,
812F ; Sleep
}
;;; $8C44: Instruction list - tatori - asleep ;;;
{
$A2:8C44 dx 7FFF,9535,
812F ; Sleep
}
;;; $8C4A: Instruction list - tatori - facing left - leave shell ;;;
{
$A2:8C4A dx 0010,9535,
0005,9555,
0005,959D,
0060,95E5,
9447, ; Enter shell
7FFF,95E5,
812F ; Sleep
}
;;; $8C62: Instruction list - mini-tatori - facing left - leave shell ;;;
{
$A2:8C62 dx 0005,9501,
002F,94F5,
94A1, ; Left shell
002F,94F5,
812F ; Sleep
}
;;; $8C72: Instruction list - mini-tatori - crawling right ;;;
{
$A2:8C72 dx 9381, ; Crawl
000A,9733,
000A,973A,
9381, ; Crawl
000A,9741,
000A,9748,
9381, ; Crawl
000A,9733,
000A,973A,
9381, ; Crawl
000A,9741,
000A,9748,
9381, ; Crawl
000A,9733,
000A,973A,
9381, ; Crawl
000A,975B,
000A,9767,
9381, ; Crawl
000A,9733,
000A,974F,
9381, ; Crawl
000A,975B,
000A,9767,
9412 ; Loop or turn around if moved too far
}
;;; $8CC4: Unused. Instruction list ;;;
{
$A2:8CC4 dx 0005,9773,
0005,977A,
0005,9781,
0005,9788,
80ED,8CC4 ; Go to $8CC4
}
;;; $8CD8: Unused. Instruction list ;;;
{
$A2:8CD8 dx 0010,983F,
0010,9878,
0010,98B1,
0010,98EA,
80ED,8CD8 ; Go to $8CD8
}
;;; $8CEC: Unused. Instruction list ;;;
{
$A2:8CEC dx 0005,978F,
0005,9943,
0005,9923,
0005,9943,
80ED,8CEC ; Go to $8CEC
}
;;; $8D00: Instruction list - tatori - facing right - enter shell ;;;
{
$A2:8D00 dx 0001,983F,
0005,97F7,
0005,97AF,
946B, ; Rise to hover leftwards, go to $8C02 (spinning)
7FFF,978F,
812F ; Sleep
}
;;; $8D14: Instruction list - mini-tatori - facing right - hiding ;;;
{
$A2:8D14 dx 0005,974F,
0005,975B,
0040,9773,
9485, ; Leave shell
7FFF,9773,
812F ; Sleep
}
;;; $8D28: Instruction list - tatori - facing right - leave shell ;;;
{
$A2:8D28 dx 0010,978F,
0005,97AF,
0005,97F7,
0060,983F,
9447, ; Enter shell
7FFF,983F,
812F ; Sleep
}
;;; $8D40: Instruction list - mini-tatori - facing right - leave shell ;;;
{
$A2:8D40 dx 0005,9501,
002F,94F5,
94A1, ; Left shell
002F,94F5,
812F ; Sleep
}
}
;;; $8D50: Tatori data ;;;
{
$A2:8D50 dw 0030 ; Max mini-tatori travel distance
$A2:8D52 dw 0001 ; 1. Used as value to set asleep flag to
$A2:8D54 dw 0020 ; Unknown. Used as value for a bugged store operation
; Hovering X acceleration
; Subacceleration, acceleration
$A2:8D56 dw F000,FFFF, ; Moving left
1000,0000 ; Moving right
$A2:8D5E dw 0003 ; Max hovering X speed
$A2:8D60 dw 01E8 ; Peak Y position
$A2:8D62 dw 0007 ; Rising to peak speed
$A2:8D64 dw 001E ; Hovering at peak duration
$A2:8D66 dw 0004 ; Max falling Y speed
$A2:8D68 dw FFFD ; Mini-tatori max spinning left velocity
$A2:8D6A dw 0003 ; Mini-tatori max spinning right velocity
}
;;; $8D6C: Initialisation AI - enemy $CF3F (tatori) ;;;
{
$A2:8D6C AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8D6F BD 86 0F LDA $0F86,x[$7E:0F86] ;\
$A2:8D72 09 00 20 ORA #$2000 ;} Set enemy to process instructions
$A2:8D75 9D 86 0F STA $0F86,x[$7E:0F86] ;/
$A2:8D78 A9 4D 80 LDA #$804D ;\
$A2:8D7B 9D 8E 0F STA $0F8E,x[$7E:0F8E] ;} Enemy spritemap pointer = $804D (no effect)
$A2:8D7E A9 01 00 LDA #$0001 ;\
$A2:8D81 9D 94 0F STA $0F94,x[$7E:0F94] ;} Enemy instruction timer = 1
$A2:8D84 9E 90 0F STZ $0F90,x[$7E:0F90] ; Enemy timer = 0
$A2:8D87 9E 84 0F STZ $0F84,x[$7E:0F84] ; Enemy Y radius = 0
$A2:8D8A A9 44 8C LDA #$8C44 ;\
$A2:8D8D 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $8C44 (asleep)
$A2:8D90 A9 D8 8D LDA #$8DD8 ;\
$A2:8D93 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $8DD8 (initial)
$A2:8D96 AD 52 8D LDA $8D52 [$A2:8D52] ;\
$A2:8D99 9D B2 0F STA $0FB2,x[$7E:0FB2] ;} Enemy asleep flag = 1
$A2:8D9C 6B RTL
}
;;; $8D9D: Initialisation AI - enemy $CF7F (mini-tatori) ;;;
{
$A2:8D9D AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8DA0 BD 7A 0F LDA $0F7A,x[$7E:0FBA] ;\
$A2:8DA3 9D AC 0F STA $0FAC,x[$7E:0FEC] ;} Enemy spawn X position = [enemy X position]
$A2:8DA6 BD 7E 0F LDA $0F7E,x[$7E:0FBE] ;\
$A2:8DA9 38 SEC ;|
$A2:8DAA FD 84 0F SBC $0F84,x[$7E:0FC4] ;} Enemy spawn top boundary = [enemy Y position] - [enemy Y radius]
$A2:8DAD 9D AE 0F STA $0FAE,x[$7E:0FEE] ;/
$A2:8DB0 A9 42 91 LDA #$9142 ;\
$A2:8DB3 9D A8 0F STA $0FA8,x[$7E:0FE8] ;} Enemy function = $9142 (crawling - not carrying Samus)
$A2:8DB6 A9 01 00 LDA #$0001 ;\
$A2:8DB9 9D 94 0F STA $0F94,x[$7E:0FD4] ;} Enemy instruction timer = 1
$A2:8DBC 9E 90 0F STZ $0F90,x[$7E:0FD0] ; Enemy timer = 0
$A2:8DBF A0 80 8B LDY #$8B80 ; Enemy instruction list pointer = $8B80 (crawling left)
$A2:8DC2 BD B4 0F LDA $0FB4,x[$7E:0FF4] ;\
$A2:8DC5 9D B0 0F STA $0FB0,x[$7E:0FF0] ;} Enemy X velocity = [enemy parameter 1]
$A2:8DC8 30 03 BMI $03 [$8DCD] ; If [enemy X velocity] >= 0:
$A2:8DCA A0 72 8C LDY #$8C72 ; Enemy instruction list pointer = $8C72 (crawling right)
$A2:8DCD 98 TYA
$A2:8DCE 9D 92 0F STA $0F92,x[$7E:0FD2]
$A2:8DD1 6B RTL
}
;;; $8DD2: Main AI - enemy $CF3F (tatori) ;;;
{
$A2:8DD2 AE 54 0E LDX $0E54 [$7E:0E54]
$A2:8DD5 7C A8 0F JMP ($0FA8,x)[$A2:8DD8]; Go to [enemy function]
}
;;; $8DD8..912D: Tatori functions ;;;
{
;;; $8DD8: Tatori function - initial ;;;
{
$A2:8DD8 BD 96 0F LDA $0F96,x[$7E:0F96] ;\
$A2:8DDB 9D D6 0F STA $0FD6,x[$7E:0FD6] ;} Enemy ([X] + 1) palette index = [enemy palette index]
$A2:8DDE 9D 16 10 STA $1016,x[$7E:1016] ; Enemy ([X] + 2) palette index = [enemy palette index]
$A2:8DE1 9D 56 10 STA $1056,x[$7E:1056] ; Enemy ([X] + 3) palette index = [enemy palette index]
$A2:8DE4 9D 96 10 STA $1096,x[$7E:1096] ; Enemy ([X] + 4) palette index = [enemy palette index]
$A2:8DE7 BD 98 0F LDA $0F98,x[$7E:0F98] ;\
$A2:8DEA 9D D8 0F STA $0FD8,x[$7E:0FD8] ;} Enemy ([X] + 1) VRAM tiles index = [enemy VRAM tiles index]
$A2:8DED 9D 18 10 STA $1018,x[$7E:1018] ; Enemy ([X] + 2) VRAM tiles index = [enemy VRAM tiles index]
$A2:8DF0 9D 58 10 STA $1058,x[$7E:1058] ; Enemy ([X] + 3) VRAM tiles index = [enemy VRAM tiles index]
$A2:8DF3 9D 98 10 STA $1098,x[$7E:1098] ; Enemy ([X] + 4) VRAM tiles index = [enemy VRAM tiles index]
$A2:8DF6 8A TXA ;\
$A2:8DF7 9D EA 0F STA $0FEA,x[$7E:0FEA] ;} Enemy ([X] + 1) tatori index = [X]
$A2:8DFA 9D 2A 10 STA $102A,x[$7E:102A] ; Enemy ([X] + 2) tatori index = [X]
$A2:8DFD 9D 6A 10 STA $106A,x[$7E:106A] ; Enemy ([X] + 3) tatori index = [X]
$A2:8E00 9D AA 10 STA $10AA,x[$7E:10AA] ; Enemy ([X] + 4) tatori index = [X]
$A2:8E03 A9 0A 8E LDA #$8E0A ;\
$A2:8E06 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $8E0A (asleep)
$A2:8E09 6B RTL
}
;;; $8E0A: Tatori function - asleep ;;;
{
$A2:8E0A BD B2 0F LDA $0FB2,x[$7E:0FB2] ;\
$A2:8E0D D0 10 BNE $10 [$8E1F] ;} If [enemy asleep flag] = 0:
$A2:8E0F A9 E0 8E LDA #$8EE0 ;\
$A2:8E12 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $8EE0 (leave shell)
$A2:8E15 BD 86 0F LDA $0F86,x[$7E:0F86] ;\
$A2:8E18 29 FF FB AND #$FBFF ;} Set enemy as tangible
$A2:8E1B 9D 86 0F STA $0F86,x[$7E:0F86] ;/
$A2:8E1E 6B RTL ; Return
$A2:8E1F 9E 84 0F STZ $0F84,x[$7E:0F84] ; Enemy Y radius = 0
$A2:8E22 BD 7A 0F LDA $0F7A,x[$7E:0F7A] ;\
$A2:8E25 38 SEC ;} A = [enemy X position] - [Samus X position]
$A2:8E26 ED F6 0A SBC $0AF6 [$7E:0AF6] ;/
$A2:8E29 08 PHP ;\
$A2:8E2A 10 04 BPL $04 [$8E30] ;|
$A2:8E2C 49 FF FF EOR #$FFFF ;|
$A2:8E2F 1A INC A ;|
;} If |[enemy X position] - [Samus X position]| >= 18h: return
$A2:8E30 C9 18 00 CMP #$0018 ;|
$A2:8E33 10 49 BPL $49 [$8E7E] ;|
$A2:8E35 28 PLP ;/
$A2:8E36 10 04 BPL $04 [$8E3C] ; If [enemy X position] < [Samus X position]:
$A2:8E38 18 CLC ;\
$A2:8E39 69 18 00 ADC #$0018 ;} A = 18h + [Samus X position] - [enemy X position]
$A2:8E3C 0A ASL A ;\
$A2:8E3D AA TAX ;|
$A2:8E3E BD 80 8E LDA $8E80,x[$A2:8EAC] ;|
$A2:8E41 AE 54 0E LDX $0E54 [$7E:0E54] ;} Enemy Y radius = -[$8E80 + [A] * 2]
$A2:8E44 49 FF FF EOR #$FFFF ;|
$A2:8E47 1A INC A ;|
$A2:8E48 9D 84 0F STA $0F84,x[$7E:0F84] ;/
$A2:8E4B BD 86 0F LDA $0F86,x[$7E:0F86] ;\
$A2:8E4E 09 00 80 ORA #$8000 ;} Set enemy hitbox solid to Samus
$A2:8E51 9D 86 0F STA $0F86,x[$7E:0F86] ;/
$A2:8E54 22 E7 AB A0 JSL $A0ABE7[$A0:ABE7] ;\
$A2:8E58 29 FF FF AND #$FFFF ;} If enemy is touching Samus from below:
$A2:8E5B F0 20 BEQ $20 [$8E7D] ;/
$A2:8E5D BD 7E 0F LDA $0F7E,x ;\
$A2:8E60 38 SEC ;|
$A2:8E61 FD 84 0F SBC $0F84,x ;|
$A2:8E64 85 12 STA $12 [$7E:0012] ;|
$A2:8E66 AD FA 0A LDA $0AFA [$7E:0AFA] ;} A = (Samus bottom boundary) + 1 - (enemy top boundary)
$A2:8E69 18 CLC ;|
$A2:8E6A 6D 00 0B ADC $0B00 [$7E:0B00] ;|