forked from videogamepreservation/mspacman-7800
-
Notifications
You must be signed in to change notification settings - Fork 1
/
MONSTER.S
1020 lines (893 loc) · 28.6 KB
/
MONSTER.S
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
*
* MONSTER.S BASIC MONSTER CODE FOR MS PAC-MAN
*
* SETMON, SET THE NEXT INTERUPT
SETMON
LDA RTLOCAL+1
CLC
ADC #WAITMON
STA MONWAIT
RTS
* MAIN LOOP FOR MONSTER ALGORITM, JUST CALL DOMONSTR WITH X=3->0
MONSTER JSR MONTUNE
JSR MONBEFOR
CLC
LDX #3
MONSTRLP JSR MONLOOP ; TOP OF MONSTER LOOP
DEX
BPL MONSTRLP
JMP MONAFTER
* MAKE SURE THE MONSTER TUNE IS PLAYING
MONTUNE LDA #$0A
CMP TUNINDEX ;MAKE SURE IT ISN'T PLAYING
BEQ MTOUT
CMP TUNINDEX+1
BEQ MTOUT
JSR DOTUNE ;JUST TRY TO PUT IT OUT
MTOUT RTS
* MONBEFOR -STUFF AT TOP OF MONSTER LOOP
*
MONBEFOR JSR SETMON
JSR INCMSPED
LDA ISBLUE
JSR CHKBLUE ;SEE IF TIME TO DO SOMETHING WITH BLUE
LDA BLUWAIT ;DO NOT CHECK FOR REVERSAL IF BLUE
BNE MOREMON
NOTBLUE
INC NORMTIME+1
BNE CHKREV
INC NORMTIME
CHKREV
LDA NORMTIME
CMP REVWAIT
BCC MOREMON
LDA NORMTIME+1
CMP REVWAIT+1
BCC MOREMON
LDA REVWAIT
CMP #$FF
BEQ MOREMON
JMP MONFLIP
MOREMON
MONLPEND RTS
* MONAFTER -STUFF AT BOTTOM OF MONSTER LOOP
*
MONAFTER
JSR PMINTR
JMP RELEASE
* MONLOOP - MONSTER PROCESSING LOOP
* IN: X IS THE MONSTER NUMBER
* OUT:
* USES: EVERYTHING EXCEPT X
MONLOOP JSR CHKMON ; TOP OF MONSTER LOOP
BEQ MONLPEND ;JUST AN RTS
LDA M0STATE,X ; CHECK THE MONSTER STATE
CMP #MSTLVPEN
BMI MONSTR1
JMP MMVPEN ; IT'S IN THE PEN, SO SPCL CASE IT
MONSTR1
LDA M0OFF,X ;MAKE SURE WE ARE AT THE CENTER
CMP #3
BNE MONSTRMV
LDA M0HPOS,X
AND #3
CMP #1
BNE MONSTRMV
LDA M0FLIP,X ;SEE IF MONSTER IS TO BE FLIPPED
BEQ MONSTRZZ
LDA M0DIR,X
EOR #$02
STA M0DIR,X
LDA #$00
STA M0FLIP,X
BEQ MONSTRMV ;DO NOT CHECK FOR TURN IF FLIPPED
MONSTRZZ LDA M0TUNNEL,X ;SEE IF IN TUNNEL, IF SO JUST MOVE
BNE MONSTRMV
JSR MNCHKDIR ; FIND OUT IF WE ARE AT INTERSECT
CMP #0
BNE MONSTRMV ;IF WE ARE NOT, JUST MOVE
JSR MONNEWDR ;GET NEW DIRECTION
MONSTRMV JMP MOVEMON ; MOVE THE MONSTER
* WE NEED A NEW DIRECTION FOR THIS MONSTER
MONNEWDR LDA M0STATE,X ;LOOK AT THE STATE AGAIN
CMP #MSTNORM
BNE MONSTR2
LDA M0BLUE,X ; SEE IF IS IS BLUE
BEQ MONSTR3
JMP MMVBLUE
MONSTR3 LDA BORED ; SEE IF IT'S BORED
BEQ MONSTR5
JMP MMVBORED
MONSTR5 JMP MMVINTER ; ELSE IT'S INTERESTED
MONSTR2 JMP MMVEYES ; IT'S EYES
* MMVBLUE - BLUE MONSTER MOVEMENT
* IN: X IS MONSTER NUMBER, TEMP12-15 IS INTERSECTION STATE
* OUT:
* USE: EVERYTHING EXCEPT X
MMVBLUE JSR RAND
AND #3
TAY
LDA TEMP12,Y
BNE MMVBLUE
TYA
STA M0DIR,X
RTS
* MMVEYES - EYES MONSTER MOVEMENT
* IN: X IS MONSTER NUMBER, TEMP12-15 IS INTERSECTION STATE
* OUT:
* USE: EVERYTHING EXCEPT X
MMVEYES LDA #$0A
STA TEMP7
LDA #$0F
STA TEMP8
JMP STWHCHWY
* MMVBORED - BORED MONSTER MOVEMENT
* IN: X CONTAINS MONSTER NUMBER, TEMP12-15 CONTAISN INTERSECT STATE
* OUT: M0DIR,X IS SET TO NEW DIRECTION
* USES: EVERYTHING EXCEPT X
MMVBORED TXA
CMP #02
BEQ MMVBORD1
BPL MMVBORD2
MMVBORD3 JSR RAND ; RED AND PINK
AND #3
TAY
LDA TEMP12,Y
BNE MMVBORD3
TYA
STA M0DIR,X
RTS
MMVBORD1 LDA #$1C
STA TEMP7
LDA #$1A
STA TEMP8
JMP MMVBORD4
MMVBORD2 ;GOLD
LDA #$1C
STA TEMP7
LDA #$01
STA TEMP8
MMVBORD4 JMP STWHCHWY
* MMVINTER - INTERESTED MONSTER MOVEMENT
* IN: X HAS MONSTER NUMBER, TEMP12-15 HAS INTERSECTION STATE
* OUT: M0DIR,X IS SET TO NEW DIRECTION
* USED: EVERYTHING EXCEPT X
MMVINTER TXA
CMP #2
BEQ MMVINTR1
BPL MMVINTR3
CMP #1
BEQ MMVINTR2
LDA M0STATE+3 ;SEE IF GOLD GUY IN NORMAL STATE
CMP #MSTNORM ; IF NOT, RED GUY MOVES NORMAL
BNE REDSPD2
LDA #$F0
SEC
SBC DOTSEATN
CMP REDTHRSH+1
BCS REDSPD1
LDA #SPDRED2
STA M0SPEED ;RED GUY MOVING FASTEST
JMP REDSPD3
REDSPD1
CMP REDTHRSH
BCS REDSPD2
LDA #SPDRED1 ;RED GUY MOVING FASTER
STA M0SPEED
JMP REDSPD3
REDSPD2
LDA #SPDNORM ;RED GUY MOVING NORMAL SPEED
STA M0SPEED
REDSPD3
LDA PZONE ; RED
STA TEMP7
LDA PCOL
STA TEMP8
JMP MMVINTR4
MMVINTR2
LDY PDIR ; PINK
LDA PZONE
CLC
ADC DIROFFZ4,Y
STA TEMP7
LDA PCOL
CLC
ADC DIROFFC4,Y
STA TEMP8
JMP MMVINTR4
MMVINTR1 LDY PDIR ;BLUE - GOAL ON OTHER SIDE OF MS FROM R
LDA DIROFFZ2,Y ;START WITH THE OFFSET TO LOOK AHEAD
CLC
ADC PZONE ;ADD TO MS PAC'S ZONE
ASL A
SEC
SBC M0ZONE ;SUBTRACT RED MONSTER'S ZONE
STA TEMP7 ;= ADJ MS - (DELTA BETWEEN MS AND RED)
LDA DIROFFC2,Y ;START WITH THE OFFSET TO LOOK AHEAD
CLC
ADC PCOL ;ADD TO MS PAC'S COLUMN
ASL A
SEC
SBC M0COL ;SUBTRACT RED MONSTER'S COLUMN
STA TEMP8 ;= ADJ MS - (DELTA BETWEEN MS AND RED)
JMP MMVINTR4
MMVINTR3
LDA PZONE ; GOLD
STA TEMP7
LDA PCOL
STA TEMP8
SEC
SBC M0COL,X
STA TEMP0
BPL GOLD1
LDA #0
SEC
SBC TEMP0
GOLD1 STA TEMP1 ; TEMP1 = ABS(PCOL-MCOL)
LDA PZONE
SEC
SBC M0ZONE,X
STA TEMP0
BPL GOLD2
LDA #0
SEC
SBC TEMP0
GOLD2 CLC ; A = ABS(PZONE-MZONE)
ADC TEMP1
CMP #8 ; IF ABS(PCOL-MCOL)+ABS(PZONE-MZONE)>8
BPL MMVINTR4
LDA #$15
STA TEMP7
LDA #$06
STA TEMP8
MMVINTR4 JMP STWHCHWY
* STWHCHWY - SET UP FOR MONSTER'S WHCHWAY CALL
* IN: MONSTER VALUE IN X, INTERSECTION STATE IN TEMP12-15
* OUT: ALL PARAMETERS FOR WHCHWAY EXCEPT GOALZONE AND GOALCOL
* USES: ALL EXCEPT X
STWHCHWY LDA M0ZONE,X
STA TEMP4
LDA M0COL,X
STA TEMP5
LDA M0DIR,X
STA TEMP6
JSR WHCHWAY
STA M0DIR,X
RTS
* MMVPEN - MONSTER PEN MOVEMENT STUFF
* IN: X IS MONSTER NUMBER
* USE:
MMVPEN LDA M0SLOW,X ;SLOW THEM DOWN IN PEN
EOR #$01
STA M0SLOW,X
BNE MMVPBODY
RTS
MMVPBODY LDA M0STATE,X
CMP #MSTATPEN ; SEE IF HE'S JUST HANGING ARROUND
BNE MMVPEN1
LDA M0VPOS,X ; SEE WHERE IT IS
CMP #$48 ; IF IT IS AT THE TOP
BCS MMVPEN4
LDA #DDOWN ; THEN MOVE IT DOWN
STA M0DIR,X
JMP MMVPEN3
MMVPEN4 CMP #$4E ; IF ITS AT THE BOTTOM
BCC MMVPEN5
LDA #DUP ; THEM MOVE IT UP
STA M0DIR,X
MMVPEN5 JMP MMVPEN3 ; THEN GET OUT
MMVPEN1 CMP #MSTINPEN ; SEE IF HE WANTS TO GET IN
BNE MMVPEN2
LDA M0VPOS,X ; SEE IF ITS IN YET
CMP #$4E
BCC MMVPEN6
LDA HOMEDIR,X ; MOVE IT TOWATRDS IT'S HOME SLOT
STA M0DIR,X
LDA M0HPOS,X
CMP IMHPOS,X
BNE MMVPEN6
LDA #MSTATPEN
STA M0STATE,X
LDA #DUP
STA M0DIR,X
JSR MONSTAMP ;MAKE IT LOOK NORMAL
TXA
BNE MMVPEN7
JSR GETOUT
MMVPEN7
JMP MMVPEN3
MMVPEN2 ; HE IS TRYING TO GET OUT
LDA M0HPOS,X
CMP #$37+LEFTSIDE
BNE MMVPEN6
LDA #DUP
STA M0DIR,X
LDA M0VPOS,X ; SEE OF HE'S OUT YET
CMP #$3A ;SZY-4C????
BCS MMVPEN3
LDA #DLEFT ;SET IT'S DIRECTION
LDY M0BLUE,X
BEQ MMVPENDR
LDA #DRIGHT
MMVPENDR STA M0DIR,X
LDA #MSTNORM
STA M0STATE,X ; IF HE IS THEN ALL IS BACK TO NORMAL
MMVPEN3
MMVPEN6
* MOVEMON - MONSTER MOVEMENT STUFF
* IN: X IS MONSTER NUMBER
* USE:
MOVEMON JSR ADJSTMON ;FIRST, ADJUST THE POSITION
LDA M0TUNNEL,X
BNE MVTUNNEL ;DIFFERENT CODE FOR TUNNEL MOVEMENT
LDA M0HPOS,X ;SEE IF MOVING INTO TUNNEL
CMP #RGHTEDGE
BCC MVZZJMP0
STA M0TUNNEL,X
MVZZJMP0 CMP #LEFTEDGE
BCS MVZZJMP1
STA M0TUNNEL,X
MVZZJMP1 JSR DISPMON ;UPDATE THE MONSTER DISPLAY
JMP CHKPEN
MVTUNNEL LDA M0DIR,X ;MOVEMENT THROUGH TUNNEL
BEQ MVTRIGHT
LDA M0HPOS,X ;MOVING LEFT
CMP #LEFTWRAP ;SEE IF WRAP TIME
BCS MVTLJMP0
CLC
ADC #WRAPSIZE
STA M0HPOS,X
MVTLJMP0 CMP #RGHTEDGE
BCS MVTLJMP1
CMP #80
BCC MVTLJMP1
LDA #$00
STA M0TUNNEL,X
MVTLJMP1 JMP WRTMON ;WRITE IT AND LEAVE
MVTRIGHT LDA M0HPOS,X ;MOVING RIGHT
CMP #RGHTWRAP ;SEE IF WRAP TIME
BCC MVTRJMP0
SEC
SBC #WRAPSIZE
STA M0HPOS,X
MVTRJMP0 CMP #LEFTEDGE
BCC MVTRJMP1
CMP #80
BCS MVTRJMP1
LDA #$00
STA M0TUNNEL,X
MVTRJMP1 JMP WRTMON ;WRITE IT, THEN WE'RE DONE
* ADJUST THE POSITION OF THE MONSTER
ADJSTMON LDA M0DISP,X ;FIRST, ANIMATE THE MONSTER
EOR #$10
STA M0DISP,X
LDY M0DIR,X ;NOW, MOVE IT
LDA M0HPOS,X
JSR HPOSADJ ;ADJUST HORIZONTALLY
STA M0HPOS,X
STX TEMP0
LDA M0OFF,X
STA TEMP1
LDA M0VPOS,X
LDX TEMP1
JSR VPOSADJ ;ADJUST VERTICALLY
LDX TEMP0
STA M0VPOS,X
RTS
* SPECIAL CODE FOR GETTING EYES INTO PEN
CHKPEN
LDA M0STATE,X
CMP #MSTEYES
BNE MMOVEND ; IF IT'S NOT EYES ITS NOT INTERESTED
LDA #$13 ;SEE IF EYE TUNE PLAYING
CMP TUNINDEX
BEQ CPJMP0
CMP TUNINDEX+1
BEQ CPJMP0
JSR DOTUNE ;MAKE IT PLAY
CPJMP0 LDA #$39 ; NOW SEE IF ITS AT THE ENTRY POINT
CMP M0VPOS,X
BNE MMOVEND
LDA #$37+LEFTSIDE
CMP M0HPOS,X
BNE MMOVEND
LDA #MSTINPEN
STA M0STATE,X ; IT IS NOW GOING INTO PEN
LDA #DDOWN
STA M0DIR,X
LDA M0STATE+0
CMP #MSTEYES
BEQ MMOVEND
LDA M0STATE+1
CMP #MSTEYES
BEQ MMOVEND
LDA M0STATE+2
CMP #MSTEYES
BEQ MMOVEND
LDA M0STATE+3
CMP #MSTEYES
BEQ MMOVEND
LDA #$13
JSR KILLTUNE
MMOVEND RTS
* THIS ROUTINE ADJUSTS THE CURRENT COLUMN, ZONE, AND OFFSET, THEN FALLS THROUGH
* TO WRTMON
DISPMON LDA M0HPOS,X ;ADJUST COLUMN
JSR HTOC
STA M0COL,X
LDA M0VPOS,X ;ADJUST ZONE AND OFFSET
JSR VTOZO
STA M0OFF,X
INY
TYA
STA M0ZONE,X
;NOW - FALL THROUGH TO WRTMON
* WRTMON - WRITE THE MONSTER ON THE SCREEN
* IN X IS MONSTER NUMBER
* USES
WRTMON LDA M0HPOS,X ;UPDATE HPOS
SEC
SBC #3
STA HPLIST+2,X
LDY M0ZONE,X ;UPDATE ZONE
DEY
TYA
STA VZLIST+2,X
LDA M0DISP,X ;FIND WHICH STAMP TO USE
AND #$10 ;FIRST, SET A TO 4 OR 0 DEPENDING
LSR A ; ON WHICH ANIMATION CURRENTLY IN
LSR A
ORA M0DIR,X ;SET BOTTOM BITS TO DIRECTION
ORA M0BLUE,X ;NORMAL, BLUE, OR EYES
TAY ;THIS IS OUR INDEX
LDA MONSTMPH,Y ;SET THE STAMP
STA SHLIST+2,X
LDA MONSTMPL,Y
STA SLLIST+2,X
LDA #$01
STA DOLIST+2,X ;TELL LOADER TO GET IT
RTS
* EYESTAMP - FILL IN STAMP FOR EYES
* IN: X IS MONSTER NUMBER
* OUT:
* USE: TEMP0,Y
EYESTAMP LDA #$10 ;SET 'M0BLUE' TO EYES
STA M0BLUE,X
TXA
ASL A
ASL A
TAY
LDA #WHITE ;ADJUST COLOR
STA P3C2,Y
RTS
* BLUSTAMP - FILL IN STAMP FOR BLUR MONSTERS
* IN: X IS MONSTER NUMBER
* OUT:
* USE: TEMP0,Y
BLUSTAMP LDA #$08 ;SET 'M0BLUE' TO BLUE
STA M0BLUE,X
TXA
ASL A
ASL A
TAY
LDA #DKBLUE ;ADJUST COLOR
STA P3C1,Y
LDA #LTPINK
STA P3C2,Y
RTS
* MONSTAMP - FILL IN STAMP FOR MONSTER
* IN: X IS MONSTER NUMBER
* OUT:
* USE: TEMP0,Y
MONSTAMP LDA #$00 ;SET 'M0BLUE' TO NORMAL MONSTER
STA M0BLUE,X
TXA
ASL A
ASL A
TAY
LDA IMCOLOR,X ;ADJUST COLOR
STA P3C1,Y
LDA #WHITE
STA P3C2,Y
LDA #BLUE
STA P3C3,Y
RTS
* SCORSTMP - FILL IN SCORE FOR MONSTER
* IN: X IS MONSTER NUMBER
* OUT:
* USE: TEMP0,Y
SCORSTMP
LDY GREEDCNT
LDA MSCRTBLH,Y
STA SHLIST+2,X
LDA MSCRTBLL,Y
STA SLLIST+2,X
LDA #$01
STA DOLIST+2,X
TXA
ASL A
ASL A
TAY
LDA #LTGREEN ;ADJUST COLOR
STA P3C2,Y
RTS
* INITMON - INITIALIZE MONSTER DATA
* USES:
*
INITMON
LDX #3
INITMNLP
LDA IMVPOS,X
STA M0VPOS,X
LDA IMHPOS,X
STA M0HPOS,X
LDA IMDIR,X
STA M0DIR,X
LDA #0
STA M0DISP,X
STA M0SPEED,X
STA M0TUNNEL,X
STA M0FLIP,X
STA M0SLOW,X
LDA IMSTATE,X
STA M0STATE,X
JSR MONSTAMP
JSR DISPMON
DEX
BPL INITMNLP
LDA #1
STA BORED
LDA #0
STA ISBLUE
STA NORMTIME
STA NORMTIME+1
STA EATNDOTS
STA TRELEASE
JSR SETMON
LDA LEVEL
CMP #2
BPL INITREL1
LDA #$00
STA M1REL
LDA #$1A
STA M2REL
LDA #$34
STA M3REL
JMP INITBLTM
INITREL1
CMP #3
BPL INITREL2
LDA #$00
STA M1REL
STA M2REL
LDA #$20
STA M3REL
JMP INITBLTM
INITREL2
LDA #$00
STA M1REL
STA M2REL
STA M3REL
INITBLTM ;NOW SET UP BLUE TIME
LDA LEVEL
CMP #20
BMI BLUTIM
LDA #19
BLUTIM TAX
LDA BTIME,X
STA BLUETIME
RTS
* STATE CHANGE ROUTINES *
* GETOUT DOES THE STATE CHANGE TO GET OUT OF THE PEN)
* IN: A IS MONSTER NUMBER
* USES:
GETOUT
TAX
LDA #MSTLVPEN
STA M0STATE,X
LDA OUTDIR,X
STA M0DIR,X
RTS
* TURNBLUE TURNS A MONSTER BLUE
* USES
TURNBLUE
LDX #3
TRNBLULP
LDA M0STATE,X
CMP #MSTEYES
BEQ TRNBLUND
CMP #MSTINPEN
BEQ TRNBLUND
LDA #SPDBLUE
STA M0SPEED,X
JSR BLUSTAMP
LDA M0STATE,X
BNE TRNBLUND
INC M0FLIP,X
JSR WRTMON
TRNBLUND DEX
BPL TRNBLULP
LDA #1
STA ISBLUE
LDA #0
STA GREEDCNT
LDA BLUETIME
STA BLUWAIT
LDA #$0D ;MAKE ENERGIZED SOUND
JSR DOTUNE
RTS
* TURNNORM TURNS A MONSTER NORMAL
* USES
TURNNORM
FOO LDX #3
TRNNRMLP
LDA M0STATE,X
CMP #MSTEYES
BEQ TRNNRMND
LDA M0STATE,X
CMP #MSTINPEN
BEQ TRNNRMND
LDA #SPDNORM
STA M0SPEED,X
JSR MONSTAMP
JSR WRTMON
TRNNRMND DEX
BPL TRNNRMLP
LDA #0
STA ISBLUE
STA BLUWAIT
JSR KILLBSND
RTS
* TURNEYES TURNS A MONSTER INTO EYES
* IN X IS A MONETR NUMBER
* USES
TURNEYES
LDA #$00 ;TURN FLIP OFF, JUST IN CASE
STA M0FLIP,X
LDA #MSTEYES
STA M0STATE,X
LDA #SPDNORM
STA M0SPEED,X
JSR EYESTAMP
JMP WRTMON
* MONFLIP DOES THE MONSTER FLIP
* USES
MONFLIP LDX #3
FLIPLOOP LDA M0STATE,X
BNE FLIPEND
INC M0FLIP,X
FLIPEND DEX
BPL FLIPLOOP
LDA #0
STA BORED
LDA REVWAIT+2
STA REVWAIT
LDA REVWAIT+3
STA REVWAIT+1
LDA #$FF
STA REVWAIT+2
STA REVWAIT+3
RTS
*
* RELEASE -CHECK FOR MONSTER RELEASES FORM PEN
*
RELEASE
LDA LEVEL ; FIRST CHECK FOR TIMED RELEASE
CMP #5
BMI TIMEREL1
LDA TRELEASE
CMP #$B4
BCC PINKREL
JMP DOREL
TIMEREL1
LDA TRELEASE
CMP #$F0
BCC PINKREL
DOREL ;TIME TO RELEASE SOMEONE
LDA #0
STA TRELEASE
LDA M0STATE+1
CMP #MSTATPEN
BNE WHCHREL1
LDA #1
JSR GETOUT
JMP PINKREL
WHCHREL1
LDA M0STATE+2
CMP #MSTATPEN
BNE WHCHREL2
LDA #2
JSR GETOUT
JMP PINKREL
WHCHREL2
LDA M0STATE+3
CMP #MSTATPEN
BNE PINKREL
LDA #3
JSR GETOUT
JMP PINKREL
PINKREL
LDA M0STATE+1
CMP #MSTATPEN
BNE BLUEREL
LDA DEATHFLG
BEQ PINKREL1
LDA EATNDOTS
CMP #6
BNE BLUEREL
LDA #1
JSR GETOUT
JMP BLUEREL
PINKREL1 LDA PINKDOTS
CMP M1REL
BCC BLUEREL
LDA #1
JSR GETOUT
BLUEREL
LDA M0STATE+2
CMP #MSTATPEN
BNE GOLDREL
LDA DEATHFLG
BEQ BLUEREL1
LDA EATNDOTS
CMP #15
BNE GOLDREL
LDA #2
JSR GETOUT
JMP GOLDREL
BLUEREL1 LDA BLUEDOTS
CMP M2REL
BCC GOLDREL
LDA #2
JSR GETOUT
GOLDREL
LDA M0STATE+3
CMP #MSTATPEN
BNE RELOUT
LDA DEATHFLG
BEQ GOLDREL1
LDA EATNDOTS
CMP #28
BNE RELOUT
LDA #0
STA DEATHFLG
STA EATNDOTS
JMP RELOUT
GOLDREL1
LDA GOLDDOTS
CMP M3REL
BCC RELOUT
LDA #3
JSR GETOUT
RELOUT
RTS
*
* FLASHON
FLASHON LDA #DKBLUE ;FLASH COLOR
STA TEMP17
LDA #LTPINK
STA TEMP18
JMP FLASHMON
*
* FLASHOFF
FLASHOFF LDA #WHITE ;FLASH COLOR
STA TEMP17
LDA #PINK
STA TEMP18
* THIS ROUTINE FLASHES A MONSTER
FLASHMON LDX #3 ;DO FOR EACH MONSTER
FLSHLOOP LDA M0BLUE,X
CMP #$08
BNE FLASHEND
LDA M0STATE,X
CMP #MSTINPEN
BEQ FLASHEND
TXA
ASL A
ASL A
TAY
LDA TEMP17 ;BLUE MONSTER - FLASH COLOR
STA P3C1,Y
LDA TEMP18
STA P3C2,Y
FLASHEND DEX
BPL FLSHLOOP
RTS
* CHKBLUE
*
CHKBLUE LDA RTLOCAL+1 ;ONLY EXECUTE EVERY OTHER TIME
AND #$01
BEQ CKBOUT
LDA BLUWAIT ;IF BLUWAIT <> 0, WE ARE BLUE
BEQ CKBOUT
DEC BLUWAIT
BEQ CKBNORM
LDY #$04 ;SEE IF TIME TO FLASH
CKBLOOP CMP ONFLASH,Y
BEQ CKBONFL
CMP OFFFLASH,Y
BEQ CKBOFFFL
DEY
BPL CKBLOOP
CKBOUT RTS
CKBNORM JMP TURNNORM ;TURN MONSTER NORMAL
CKBONFL JMP FLASHON ;FLASH MONSTER ON
CKBOFFFL JMP FLASHOFF ;FLASH MONSTER OFF
OFFFLASH DB $07,$13,$1F,$2B,$37 ;TIMES MONSTERS FLASH PINK
ONFLASH DB $0D,$19,$25,$31,$3D ;TIMES MONSTERS FLASH BLUE
* TIGHT LOOP FOR MOVING EYES DURRING SCORE DISPLAY
TIGHT
STX TEMP16
LDX #3
TIGHTLP ; TOP OF TIGHT LOOP
LDA M0STATE,X
CMP #MSTEYES
BEQ DOTIGHT
CMP #MSTINPEN
BNE TIGHTEND
JSR MMVPEN
JMP TIGHTEND
DOTIGHT
JSR MNCHKDIR ; FIND OUT IF WE ARE AT INTERSECT
CMP #0
BNE TIGHTMV ; WE ARE NOT, SO JUST MOVE
LDA M0OFF,X ; AND MAKE SURE WE ARE AT THE CENTER
CMP #3
BNE TIGHTMV
LDA M0HPOS,X
AND #3
CMP #1
BNE TIGHTMV
JSR MMVEYES ; IT'S EYES
TIGHTMV JSR MOVEMON ; MOVE THE MONSTER
TIGHTEND
DEX
BPL TIGHTLP
LDX TEMP16
RTS
* THIS ROUTINE IS SIMPLY ONE TO CHECK IF A MONSTER IS IN AN INTERSECTION
MNCHKDIR LDA M0ZONE,X
STA TEMP4
LDA M0COL,X
STA TEMP5
LDA M0DIR,X
STA TEMP6
JMP CHECKDIR
* THIS ROUTINE GETS RID OF THE ENERGIZED SOUND
KILLBSND LDA #$0D ;3 TUNES - D, E, AND F - TO KILL
JSR KILLTUNE
LDA #$0E
JSR KILLTUNE
LDA #$0F
JMP KILLTUNE
IMVPOS DB $39,$4B,$4B,$4B
IMHPOS DB $37+LEFTSIDE,$37+LEFTSIDE,$2F+LEFTSIDE,$3F+LEFTSIDE
IMDIR DB DLEFT,DUP,DDOWN,DDOWN
IMSTATE DB MSTNORM,MSTATPEN,MSTATPEN,MSTATPEN
IMCOLOR DB PINK,LTPINK,LTBLUE,GOLD
HOMEDIR DB DUP,DUP,DLEFT,DRIGHT
OUTDIR DB DUP,DUP,DRIGHT,DLEFT
DIROFFZ4 DB $00,$04,$00,$FC
DIROFFC4 DB $04,$00,$FC,$00
DIROFFZ2 DB $00,$02,$00,$FE
DIROFFC2 DB $02,$00,$FE,$00
BTIME DB $C0,$B4,$96,$78,$5A,$3C,$96,$3C,$3C,$1E
DB $96,$3C,$1E,$1E,$5A,$1E,$1E,$01,$1E,$01