-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMaze War.asm
2529 lines (2529 loc) · 46.5 KB
/
Maze War.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
********************
* *
* 'MAZE WAR' *
* By *
* Mark Price *
* *
********************
;
;SYSTEM EQUATES
;--------------
;
ATRACT = $4D
AUDCTL = $D208
AUDC1 = $D201
AUDC2 = $D203
AUDC3 = $D205
AUDC4 = $D207
AUDF1 = $D200
CHBASE = $02F4
COLOR0 = $02C4
COLOR1 = $02C5
COLOR2 = $02C6
COLOR3 = $02C7
COLOR4 = $02C8
COLPF0 = $D016
COLPF1 = $D017
COLPF2 = $D018
COLPF3 = $D019
CONSOL = $D01F
DLIST = $0230
DMACTL = $022F
GPRIOR = $026F
GRACTL = $D01D
HPOSP0 = $D000
KEYCODES = $79
KEYIN = $02FC
NMIEN = $D40E
PCOLR0 = $02C0
PCOLR1 = $02C1
PCOLR2 = $02C2
PCOLR3 = $02C3
PMBASE = $D407
RANDOM = $D20A
RTCLOK = $14
SIZEP0 = $D008
SKCTL = $D20F
STICK0 = $0278
STRIG0 = $0284
VDSLST = $0200
CDTMF5 = $022E
SETVBV = $E45C
XITVBV = $E462
;
;PM GRAPHICS
;
*= $3800
;
PMAREA .DS $0400
PL0 .DS $0100
PL1 .DS $0100
PL2 .DS $0100
PL3 .DS $0100
;
;COLORS
;
PFCOL0 = $96
PFCOL1 = $2A
PFCOL2 = $00
PFCOL3 = $34
PLR0COL = $C8
PLR1COL = $86
PLR2COL = $58
PLR3COL = $28
;
;ZERO PAGE ALLOCATION
;--------------------
;
*= $80
;
;POINTERS
;
POINTR0 .DS 2 ;GENL PURPOSE
POINTER .DS 2
SCRPTR .DS 2 ;SCREEN POINTER
;
;VARIABLES
;
COUNTER .DS 3 ;AUTO DEMO COUNTER
ACTIVE .DS 1 ;NUMBER IN USE
NEAREST ; ZOMBIE MOVE CLOSE MAN'S #
COUNT .DS 1 ;GENL PURPOSE
DIGITNO ; SCORE KEEPING
CURLINE .DS 1 ;BOTSCRN LINE NO
HOLDIT .DS 1 ;GENL PURPOSE
PLYRS .DS 1 ;# OF PLAYERS
DIRSHFT ; BACKLASH DIRECTION REG
DX ; ZOMBIE MOVE X DIST
SAVEIT ; WINNER # SAVE
ZMBYS .DS 1 ;# OF ZOMBIES
DIST ; ZOMBIE MOVE CRNT SHORT DIST
DIREC .DS 1 ;BACKLASH DIRECTION
;
;DATA FOR EACH PLAYER
;
ACTFLAG .DS 4 ;WHAT HE'S DOING
DIR .DS 4 ;DIRECTION POINTING/MOVING
LOCHI .DS 4 ;ABSOLUTE MEM LOC HI
LOCLO .DS 4 ;ABSOLUTE MEM LOC LO
LOCX .DS 4 ;X LOCATION (0-19)
LOCY .DS 4 ;Y LOCATION (0-18)
MOVCLOK .DS 4 ;TIME TILL NEXT MOVE
MOVEST .DS 4 ;STATUS IN MOVE
MOVRATE .DS 4 ;MOVEMENT RATE
NXTSCR .DS 4 ;SCORE FOR NEXT KILL
SCRPND .DS 4 ;SCORE WAITING ADDITION
SHOTDIR .DS 4 ;SHOT MOVE DIRECTION
SHOTHI .DS 4 ;SHOT ABS MEM LOC HI
SHOTLO .DS 4 ;SHOT ABS MEM LOC LO
SHOTMST .DS 4 ;SHOT STATUS IN MOVE
SOUND .DS 4 ;SOUND HOLDING REGISTER
TYPE .DS 4 ;WIZARD=0, ZOMBIE=1
;
*= $2000
;
;CHARACTER SET DATA
;------------------
;
CHRSET .BYTE 0,0,0,0,0,0,0,0 ;SPACE
.BYTE 0,40,86,20,0,0,0,0 ;SHOTS
.BYTE 0,60,191,40,0,0,0,0
.BYTE 0,0,0,0,32,188,188,48
.BYTE 16,88,88,32
.BYTE 32,188,188,48
.BYTE 16,88,88,32,0,0,0,0
MASKL .BYTE 3,3,3,63,51
.BYTE 3,3,15 ;COALESCE MASKS
MASKR .BYTE 192,192,15,252
.BYTE 192,192,48,60
PL0CHR .BYTE 0,0,0,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,0
.BYTE 0,126,102,102,102
.BYTE 102,126,0 ;NUMBERS 0
.BYTE 0,24,24,24
.BYTE 24,24,24,0 ;1
.BYTE 0,126,6,126
.BYTE 96,102,126,0 ;2
.BYTE 0,126,6,30
.BYTE 6,102,126,0 ;3
.BYTE 0,96,108,108
.BYTE 126,12,12,0 ;4
.BYTE 0,126,96,126
.BYTE 6,102,126,0 ;5
.BYTE 0,126,96,126
.BYTE 102,102,126,0 ;6
.BYTE 0,126,6,12
.BYTE 24,24,24,0 ;7
.BYTE 0,126,102,126
.BYTE 102,102,126,0 ;8
.BYTE 0,126,102,126
.BYTE 6,102,126,0 ;9
.BYTE 0,0,24,24
.BYTE 0,24,24,0 ;COLON
.BYTE 141,54,108,73,44,210
.BYTE 182,75 ;EXPLOSION CHARS
.BYTE 0,0,0,0,44,210,182,75
.BYTE 141,54,108,73,0,0,0,0
.BYTE 0,0,0,2,10
.BYTE 43,175,60 ;TITLE CHAR
.BYTE 0,2,138,171
.BYTE 239,204,0,0 ;TITLE CHAR
OUTWALL .BYTE 94,91,94,85,229
.BYTE 181,229,85 ;OUTER WALL
.BYTE 0,24,60,102,102
.BYTE 126,102,231 ;LETTERS A
.BYTE 0,252,102,102
.BYTE 124,102,102,124 ;B
.BYTE 0,126,198,192
.BYTE 192,192,198,126 ;C
.BYTE 0,252,102,102
.BYTE 102,102,102,252 ;D
.BYTE 0,254,102,96
.BYTE 120,96,102,254 ;E
.BYTE 128,176,176,176,178
.BYTE 186,171,63 ;TITLE CHAR
.BYTE 0,126,198,192
.BYTE 206,198,198,126 ;G
.BYTE 2,10,42,174,170
.BYTE 254,194,0 ;TITLE CHAR
.BYTE 0,60,24,24
.BYTE 24,24,24,60 ;I
.BYTE 42,207,192,194,202
.BYTE 235,234,207 ;TITLE CHAR
.BYTE 0,206,216,240
.BYTE 252,204,204,206 ;K
.BYTE 0,240,96,96
.BYTE 96,96,102,254 ;L
.BYTE 0,99,119,127
.BYTE 107,99,99,99 ;M
.BYTE 0,198,102,118
.BYTE 126,126,110,230 ;N
.BYTE 0,124,198,198
.BYTE 198,198,198,124 ;O
.BYTE 0,252,102,102
.BYTE 124,96,96,240 ;P
.BYTE 168,235,175,190,240
.BYTE 192,168,255 ;TITLE CHAR
.BYTE 0,252,102,102
.BYTE 124,108,108,230 ;R
.BYTE 0,126,198,192
.BYTE 124,6,198,252 ;S
.BYTE 0,126,90,24
.BYTE 24,24,24,60 ;T
.BYTE 0,231,102,102
.BYTE 102,102,102,60 ;U
.BYTE 10,43,175,170
.BYTE 175,40,10,3 ;TITLE CHAR
.BYTE 0,99,99,99
.BYTE 107,127,119,99 ;W
.BYTE 0,192,0,0
.BYTE 192,0,0,192 ;TITLE CHAR
.BYTE 0,231,102,60
.BYTE 24,24,24,60 ;Y
.BYTE 0,254,204,24
.BYTE 48,96,198,254 ;Z
.BYTE 128,176,178,186,170
.BYTE 174,190,48 ;TITLE CHAR
.BYTE 0,2,10,235,175
.BYTE 190,250,195 ;TITLE CHAR
.BYTE 160,190,250,235,170
.BYTE 191,240,192 ;TITLE CHAR
.BYTE 136,186,186,187,186
.BYTE 187,187,51 ;TITLE CHAR
.BYTE 0,0,128,160,188
.BYTE 160,40,15 ;TITLE CHAR
STLCHR .BYTE 3,3,3,21,49
.BYTE 1,1,10 ;PLAYERS/ZOMBIES
STRCHR .BYTE 192,192,5,92
.BYTE 64,64,16,40
.BYTE 60,60,48,20,20,52,16,40
.BYTE 3,3,3,21,17,17,1,10
.BYTE 192,192,12,84
.BYTE 64,64,16,40
.BYTE 192,192,192,84
.BYTE 76,16,40,0
.BYTE 0,0,3,3,3,21,17,4
.BYTE 0,0,192,192
.BYTE 192,84,76,64
.BYTE 40,0,0,0,0,0,0,0
.BYTE 64,160,0,0,0,0,0,0
.BYTE 0,0,0,0,3,3,3,21
.BYTE 0,0,0,0,192,192,192,84
.BYTE 17,17,1,10,0,0,0,0
.BYTE 76,16,40,0,0,0,0,0
.BYTE 0,0,0,0,0,0,3,3
.BYTE 0,0,0,0,0,0,192,192
.BYTE 3,21,17,4,40,0,0,0
.BYTE 192,84,76,64,64,160,0,0
.BYTE 3,3,80,53,1,1,4,40
.BYTE 192,192,192,84
.BYTE 76,64,64,160
.BYTE 60,60,12,20,20,28,4,40
.BYTE 3,3,48,21,1,1,4,40
.BYTE 192,192,192,84
.BYTE 68,68,64,160
.BYTE 1,21,49,4,40,0,0,0
.BYTE 64,84,68,64,64,160,0,0
.BYTE 0,0,0,0,192,196,68,84
.BYTE 49,1,1,10,0,0,0,0
.BYTE 64,16,40,0,0,0,0,0
.BYTE 0,0,3,3,1,21,49,4
.BYTE 0,0,192,192,64,84,68,64
.BYTE 192,196,68,84
.BYTE 64,16,40,0
.BYTE 0,0,0,0,0,0,0,0
.BYTE 3,15,63,255,254,252
.BYTE 252,255 ;A.N.A.L.O.G.
.BYTE 255,255,255,128,0
.BYTE 0,0,255 ;CHARACTERS
.BYTE 255,255,255,15
.BYTE 15,15,15,207
.BYTE 0,192,192,192
.BYTE 192,192,192,192
.BYTE 255,255,255,255
.BYTE 255,254,254,255
.BYTE 240,248,252,254
.BYTE 63,31,15,7
.BYTE 7,15,15,15
.BYTE 15,143,207,239
.BYTE 128,192,192,192
.BYTE 192,192,192,192
.BYTE 248,252,252,252
.BYTE 252,254,255,255
.BYTE 0,0,0,0,0,0,0,128
.BYTE 63,255,255,255
.BYTE 254,252,252,254
.BYTE 255,255,255,128
.BYTE 0,0,0,0
.BYTE 255,255,255,15
.BYTE 15,15,15,15
.BYTE 255,255,255,128
.BYTE 0,0,0,15
.BYTE 255,255,255,0
.BYTE 0,0,0,255
.BYTE 0,192,192,0,0,0,0,0
.BYTE 255,255,255,255
.BYTE 255,255,255,63
.BYTE 255,255,192,224
.BYTE 240,248,248,240
.BYTE 239,207,15,15
.BYTE 15,12,12,7
.BYTE 192,192,192,192
.BYTE 192,192,192,128
.BYTE 131,193,224,224
.BYTE 224,224,224,128
.BYTE 255,255,255,127
.BYTE 63,28,12,7
.BYTE 192,224,240,248
.BYTE 252,255,255,255
.BYTE 0,0,0,0,0,255,252,255
.BYTE 0,0,0,0,0,128,192,128
.BYTE 0,128,192,224
.BYTE 240,255,255,255
.BYTE 15,15,15,15
.BYTE 15,252,252,255
.BYTE 7,131,192,224
.BYTE 240,255,255,255
.BYTE 255,255,15,15
.BYTE 15,252,252,255
.BYTE 170,254,254,170
.BYTE 239,239,170,254 ;WALLS
.BYTE 254,170,239,239
.BYTE 170,254,254,170
.BYTE 239,239,170,254
.BYTE 254,170,239,239
;
;PM IMAGE DATA
;-------------
;
;WIZARD/ZOMBIE "SUITS"
;
SUITS .BYTE 0,0,0,124,24,24,20,0
.BYTE 0,0,0,24,24,8,16,0
.BYTE 0,0,0,126,24,24,20,0
.BYTE 0,0,0,24,24,8,16,0
.BYTE 0,0,0,126,24,20,16,0
.BYTE 0,0,0,126,24,40,8,0
.BYTE 0,0,0,126,24,20,16,0
.BYTE 0,0,0,126,24,40,8,0
.BYTE 0,0,0,62,24,24,40,0
.BYTE 0,0,0,24,24,16,8,0
.BYTE 0,0,0,126,24,24,40,0
.BYTE 0,0,0,24,24,16,8,0
.BYTE 0,0,24,126,24,20,16,0
.BYTE 0,0,24,126,24,40,8,0
.BYTE 0,0,24,126,24,20,16,0
.BYTE 0,0,24,126,24,40,8
;
;WINNING PLAYER ALL IN PM
;
WINPLYR .BYTE 0,0,0,124,24,24,20,0
.BYTE 0,0,3,0,0,0,0,0
.BYTE 0,0,0,0,0,0,0,54
.BYTE 24,24,16,2,64,0,0,0
;
;EVAPORATION DATA
;
SMOKE .BYTE $1C,$66,$75,$1C
.BYTE $0C,$18,$0C,0
.BYTE $38,$6E,$D7,$FE
.BYTE $18,$10,$18,0
.BYTE $3C,$7E,$FF,$FF
.BYTE $DB,$18,$18,$18
.BYTE $3C,$7E,$FF,$FF
.BYTE $FF,$3C,$3C,$3C
.BYTE 0,$3C,$7E,$7E
.BYTE $7E,$3C,$3C,$7E
;
;COLOR DATA
;
COLTBL .BYTE $C8,$86,$58,$28
.BYTE $96,$2A,$00,$34
;
;
;******************
;** MAIN PROGRAM **
;******************
;
;INITIALIZATIONS
;---------------
;
INIT LDA KEYCODES ;CHECK ATASCII
ORA KEYCODES+1 ;CONVERT TABLE
BNE INITPLR ;IF SET, GO ON
LDA #$FE ;INIT TO $FEFE
STA KEYCODES
STA KEYCODES+1
;
INITPLR LDA #0 ;INIT PLAYERS
LDX #3
STWIDTH STA SIZEP0,X ;SET WIDTHS
DEX
BPL STWIDTH
STA AUDCTL
STA COLOR4 ;COLOR 4=BLACK
LDA # >PMAREA ;SET PMBASE,
STA PMBASE ; DMACTL, GRACTL,
LDA #$3E ; AND GPRIOR
STA DMACTL
LDA #$03
STA GRACTL
STA SKCTL ;INIT SOUND
LDA #$01
STA GPRIOR
LDA # >CHRSET ;SET CHRSET
STA CHBASE
LDA #$40 ;DISABLE DLI
STA NMIEN
LDA # <DLI ;SET DLI VECTOR
STA VDSLST
LDA # >DLI
STA VDSLST+1
;
;TITLES/GAME OVER ENTRY
;----------------------
;
RESTART LDA #$40 ;DISABLE DLI
STA NMIEN
LDA # <TITLDISP ;TURN ON THE
STA DLIST ;TITLE DISPLAY
LDA # >TITLDISP
STA DLIST+1
LDY #7 ;SET COLORS
SCOL LDA COLTBL,Y
STA PCOLR0,Y
DEY
BPL SCOL
LDA #0 ;CLR PM GRAPHICS
TAY
CLEARPM STA PL0,Y
STA PL1,Y
STA PL2,Y
STA PL3,Y
DEY
BNE CLEARPM
STA AUDC1 ;TURN OFF SOUND
STA AUDC2
STA AUDC3
STA AUDC4
STA COUNTER ;INITIALIZE DEMO
STA COUNTER+1 ;WAIT COUNTER
LDA #10 ;FOR 30 SECONDS
STA COUNTER+2
;
;SETUP TITLE WALKERS
;
LDA # <WLKLINE ;SET MEM LOCS
STA LOCLO
LDA # >WLKLINE
STA LOCHI
LDA # <WLKLINE+38
STA LOCLO+1
LDA # >WLKLINE+38
STA LOCHI+1
LDA #2 ;SET DIRECTIONS
STA DIR+1
LDA #0
STA DIR
STA ACTFLAG ;SET ACTIONS
STA ACTFLAG+1
STA MOVEST ;CLR MOVE STATUS
STA MOVEST+1
STA LOCX ;SET X-LOCATIONS
LDA #19
STA LOCX+1
LDA #15 ;AND Y-LOCATIONS
STA LOCY
STA LOCY+1
LDA #10 ;SET # OF STEPS
STA MOVCLOK
STA MOVCLOK+1
JSR STIMER
;
;TITLE SCREEN LOOP FOR SELECTIONS
;--------------------------------
;
SELOOP DEC COUNTER ;COUNTDOWN TO
BNE MVWLKRS ;AUTO DEMO START
DEC COUNTER+1
BNE MVWLKRS
DEC COUNTER+2
BEQ STDEMO ;=0 START UP DEMO
;
MVWLKRS LDA COUNTER ;MOVE WALKERS
BNE CHKKEYS ;EVERY 8TH PASS
LDA COUNTER+1
AND #$03 ;TURN OFF SOUND
BNE CHKKEYS ;EVERY 4TH PASS
STA AUDC1
STA AUDC2
LDA COUNTER+1
AND #$07
BNE CHKKEYS
LDX #1 ;TWO TO MOVE
MVWLKLP LDA MOVEST,X ;GET MOVE STATUS
BEQ STWLKMV ;ZERO? START NEW
JSR MOVEIM ;ELSE CONTINUE
JMP DNXWLKR ;DO NEXT
STWLKMV DEC MOVCLOK,X ;COUNT OFF STEP
BNE WKSMDIR ;IF >0, SKIP
LDA DIR,X ;REVERSE DIR
EOR #$02
STA DIR,X
LDA #9 ;RESET STEP CNT
STA MOVCLOK,X
WKSMDIR JSR INITMVE ;START NEW MOVE
DNXWLKR DEX ;DO NEXT WALKER
BPL MVWLKLP
;
CHKKEYS LDY KEYIN ;GET KBD INPUT
LDA #$FF ;CLR REG FOR NEXT
STA KEYIN
LDA (KEYCODES),Y ;ATASCII
CMP #49 ;"1".."9"?
BCC CKDEMO
CMP #59
BCS CKDEMO
AND #$1F ;YES, SET ZOMBIE
STA ZOMSPD ;SPEED AND
BNE GTCNSL ;CHECK CONSOL
CKDEMO CMP #'d ;CHECK FOR "D"
BNE GTCNSL ;NO, CHECK CONSOL
STDEMO LDA #0 ;YES, START DEMO
STA PLYRS ;PLAYERS=0
LDA #3 ;ZOMBIES=3
STA ZMBYS
JMP SETACT ;AND GO
SEJUMP JMP SELOOP
;
GTCNSL LDA STRIG0 ;START GAME IF
BEQ START ;STRIG 0 PRESSED
LDA CDTMF5 ;SYS TIMER FLAG
BNE SEJUMP ;BOUNCE OVER? NO
LDA CONSOL ;GET CONSOL KEY
CMP #6 ;IF START, DO IT
BEQ START
AND #$06
EOR #$06 ;INVERT THE REST
BEQ SEJUMP ;IF NONE OR BOTH
CMP #6 ;KEYS PRESSED,
BEQ SEJUMP ;LOOP BACK
CMP #2 ;SELECT PRESSED?
BEQ CNGPLYR ;CLANGE #PLYRS
;
INC ZOMBIES ;ADD 1 TO # OF
CLC ;ZOMBIES
LDA ZOMBIES ;IF TOTAL ZOMBIES
ADC PLAYERS ;AND PLAYERS <5,
CMP #$A5 ;WE'RE DONE
BCC WTCNSL
LDA #$50 ;ELSE, SET # OF
STA ZOMBIES ;ZOMBIES TO ZERO,
BNE WTCNSL ;WAIT FOR RELEASE
;
CNGPLYR INC PLAYERS ;ADD 1 TO # OF
LDA PLAYERS ;PLAYERS
CMP #$55 ;IF <5, CHECK ON
BCC CKZMBIE ;# OF ZOMBIES
LDA #$51 ;SET # PLAYERS TO
STA PLAYERS ;1 AND WAIT FOR
BNE WTCNSL ;CONSOL RELEASED
CKZMBIE CLC ;IF ZOMBIES PLUS
ADC ZOMBIES ;PLAYERS>5, WAIT
CMP #$A5 ;CONSOL RELEASE
BCC WTCNSL ;ELSE, DEC # OF
DEC ZOMBIES ;ZOMBIES
WTCNSL JSR STIMER
JMP SELOOP ;GOTO TOP OF LOOP
;
STIMER LDA #5 ;SET TIMER 5
LDY # <40 ;2/3 SEC DELAY
LDX # >40
JSR SETVBV
LDA #1 ;SET FLAG FOR
STA CDTMF5 ;TIMER #5
RTS
;
;GAME START SETUP
;----------------
;
START JSR STIMER
LDA PLAYERS ;SET PLYRS
AND #$0F
STA PLYRS
LDA ZOMBIES
AND #$0F
STA ZMBYS ;AND ZMBYS
CLC
ADC PLYRS
CMP #1 ;IF TOTAL=1,
BNE SETACT
STA ZMBYS ;SET ZOMBIES TO 1
LDA #2 ;AND UP TOTAL
SETACT STA ACTIVE ;SET # OF ACTIVE
DEC ACTIVE ;PARTICAPANTS
;
LDX #0 ;ERASE WALKERS
JSR ERASMAN
INX
JSR ERASMAN
;
;SETUP GAME SCREEN
;
LDA # <[MAZEDAT-$84]
STA POINTER
LDA # >[MAZEDAT-$84] ;SOURCE
STA POINTER+1
LDA # <[GAMESCR-$84]
STA SCRPTR
LDA # >[GAMESCR-$84] ;DEST
STA SCRPTR+1
LDX #1
LDY #$84
STSCRLP LDA (POINTER),Y ;GET A BYTE
STA (SCRPTR),Y ;SAVE IT ONCE
INC SCRPTR ;ADD 1 TO DEST
BNE STSCP2
INC SCRPTR+1
STSCP2 STA (SCRPTR),Y ;SAVE TWICE +
INY ;COPY THE NXT ONE
BNE STSCRLP
INC POINTER+1
INC SCRPTR+1
DEX
BPL STSCRLP
;
;ERASE SCREEN BOTTOM
;
LDA # <BOTSCRN
STA SCRPTR
LDA # >BOTSCRN
STA SCRPTR+1
LDY #79
LDA #0
ERASBOT STA (SCRPTR),Y
DEY
BPL ERASBOT
;
;SET SCREEN BOTTOM
;
LDA #0 ;SET COLOR COUNT
STA COUNT
LDA # <[BOTSCRN+4] ;INIT SCRN
STA SCRPTR
LDA # >[BOTSCRN+4] ;PNTR
STA SCRPTR+1
LDA PLYRS ;GET # OF PLAYERS
BEQ STZMTXT ;IF 0(DEMO), SKIP
STA HOLDIT ;SAVE IT
LDA # <PLRTXT ;SET PTR TO
STA POINTER ;"WIZARD" TEXT
LDA # >PLRTXT
STA POINTER+1
JSR SETBOTM ;AND SET 'EM
STZMTXT LDA ZMBYS GET # OF ZOMBIES
BEQ PUTMIN ;IF 0, SKIP
STA HOLDIT ;ELSE, SAVE IT
LDA # <ZOMTXT ;SET PTR TO
STA POINTER ;"ZOMBIE" TEXT
LDA # >ZOMTXT
STA POINTER+1
JSR SETBOTM ;AND SET 'EM
;
;INITIALIZE ACTIVE PARTICIPANTS
;
PUTMIN LDX ACTIVE ;SET ALL ACTIVE
SETALLP LDA #0 ;TYPE = PLAYER
STA TYPE,X
STA SCRPND,X ;0 SCORE TO ADD
STA ACTFLAG,X ;ACTION TO NONE
LDA #3 ;MOVE RATE =3
STA MOVRATE,X ;(PLR DEFAULT)
LDA #5 ;NEXT HIT SCORE=5
STA NXTSCR,X
JSR FNDSPOT ;SET 'IM ON SCRN
CPX PLYRS ;IF THIS IS A
BCC STNXPLR ;PLAYER, SKIP
LDA #$1B ;SET MOVE RATE
SBC ZOMSPD ;BY ZOMBIE SPEED
STA MOVRATE,X
LDA #1 ;TYPE = ZOMBIE
STA TYPE,X
STNXPLR DEX ;DO NEXT
BPL SETALLP
;
LDA PLYRS ;PLAYERS=0? THIS
BNE PUTINVB ;IS A DEMO, SET
LDA #3 ;PLYRS=3 TO FOOL
STA PLYRS ;ZOMBIES
;
PUTINVB JSR STGAMVB ;INSTALL GAME VBI
LDA # <GAME ;PUT UP GAME SCRN
STA DLIST
LDA # >GAME
STA DLIST+1
LDA #$C0 ;ENABLE DLI
STA NMIEN
;
;MAIN PROGRAM LOOP
;-----------------
;
STRTCN LDA CDTMF5 ;CHECK CONSOL
BNE CHKSCRS ;AFTER 2/3 SEC
LDA CONSOL ;IF CONSOL KEY
CMP #$07 ;NOT PRESSED,
BEQ CHKSCRS ;KEEP PLAYING
JSR VBIOFF ;TURN OFF VBI
EXITLP LDA CONSOL ;WAIT FOR CONSOL
CMP #$07 ;KEY AND STRIG 0
BNE EXITLP ;TO BE RELEASED
LDA STRIG0
BEQ EXITLP
JMP RESTART ;AND GOTO TITLES
;
CHKSCRS LDX ACTIVE ;GET # TO DO
UDSCORS LDA SCRPND,X ;GET # TO ADD
BEQ DONXSCR ;IF =0, DO NEXT
LDY SCRINDX,X ;GET BASE INDEX
CLC ;TO SCORE AND ADD
ADC SCORE,Y ;TO SCORE
STA SCORE,Y
LDA #0 ;CLR SCORE TO ADD
STA SCRPND,X
LDA #1 ;DIGIT # FOR END
STA DIGITNO ;GAME DETECTION
ADDSCR LDA SCORE,Y ;DONE?
BEQ DONXSCR ;YES, DO NEXT
CMP #$DA ;THIS DIGIT >10?
BCC SCUNDX ;NO, GO TO RIGHT
SBC #10 ;YES, SUBTRACT 10
STA SCORE,Y ;FROM THIS DIGIT
DEY ;POINT TO NEXT
DEC DIGITNO
BMI GAMEOVR ;OVER 100! END IT
LDA SCORE,Y ;GET NEW DIGIT
BNE SCDGTNZ ;IF BLANK,
LDA #$D0 ;SET TO ZERO
SCDGTNZ CLC ;ADD 1 TO IT
ADC #1
STA SCORE,Y ;SAVE IT
BNE ADDSCR ;AND LOOP
SCUNDX INY ;GO RIGHT 1 DIGIT
INC DIGITNO
BNE ADDSCR ;CHECK NEXT ONE
DONXSCR DEX ;TRY ADD TO
BPL UDSCORS ;NEXT SCORE
;
;CHECK FOR AND PAUSE GAME
;
LDA KEYIN ;CHECK KBD
CMP #255 ;ANY PRESSED?
BNE PAUSE ;GO TO TOP OF
JMP STRTCN ;MAIN LOOP
PAUSE JSR VBIOFF ;TURN OFF VBI
LDA #255 ;CLEAR KBD INPUT
STA KEYIN
LDA #0 ;TURN OFF SOUND
STA AUDC1
STA AUDC2
STA AUDC3
STA AUDC4
HLDPTRN LDA KEYIN ;AND WAIT FOR
CMP #255 ;A KEY TO BE
BEQ HLDPTRN ;PRESSED
JSR STGAMVB ;RE-SET GAME VBI
LDA #255 ;CLEAR KBD INPUT
STA KEYIN
JMP STRTCN ;GOTO TOP OF LOOP
;
;GAME END HANDLING ROUTINES
;--------------------------
;
GAMEOVR STX SAVEIT
JSR VBIOFF ;TURN OFF VBI
LDA #0 ;AND ALL SOUND
STA AUDC1
STA AUDC2
STA AUDC3
STA AUDC4
;
;SET WINNER MESSAGE
;
LDX SAVEIT
LDY #3 ;INDEX - TEXT SET
LDA SCRINDX,X ;SET POINTER TO
CLC ;WINNER'S SCORE
ADC # <SCORE-1
STA SCRPTR
LDA # >SCORE-1
STA SCRPTR+1
BCC STENDTX
INC SCRPTR+1
STENDTX LDA ENDTXT,Y ;AND SET IT
STA (SCRPTR),Y ;TO "WINS"
DEY
BPL STENDTX
;
;EVAPORATE ALL LOSERS
;
LDA #0 ;CLEAR
STA ACTFLAG,X ;WINNER ACTION
STX SAVEIT ;SAVE WINNER #
LDX ACTIVE ;GET # TO DO
STALLEV CPX SAVEIT ;IF =WINNER,
BEQ STNXTEV ;DO NEXT ONE
JSR ERASMAN ;ELSE ERASE 'IM
LDA #2 ;ACTION=EVAPORATE
STA ACTFLAG,X
LDA #9 ;MOVEST FOR EVAP
STA MOVEST,X
STNXTEV DEX ;DO THE NEXT ONE
BPL STALLEV
;
DOALLEV LDA RTCLOK
DOAL2 CMP RTCLOK
BEQ DOAL2
LDA #0 ;INIT END COUNT=0
STA COUNT
LDX ACTIVE ;LOOP FOR ALL
EVAPEM LDA COUNT ;ADD THIS ACTFLAG
CLC ;TO COUNT
ADC ACTFLAG,X ;(FOR END CHK)
STA COUNT
JSR EVAPRTE ;AND DO EVAP
DEX
BPL EVAPEM ;DO NEXT
LDA COUNT ;IF COUNT=ACTIVE,
CMP ACTIVE ;WE'RE DONE,
BNE DOALLEV ;OTHERWISE LOOP
;
;SET WINNER AS ALL PM
;
LDX SAVEIT ;GET WINNER #
JSR ERASMAN ;ERASE 'IM + SET
LDA PCOLR0,X ;1ST PM COLOR
STA PCOLR0 ;TO WINNING COLOR
LDA #PFCOL0 ;AND OTHERS TO
STA PCOLR1 ;NORMAL PF COLORS
LDA #PFCOL1
STA PCOLR2
LDA #PFCOL3
STA PCOLR3
LDA # <WINPLYR ;SET POINTER
STA POINTER ;TO ALL PM IMAGES
LDA # >WINPLYR
STA POINTER+1
LDA LOCY,X ;SET SCRPTR
ASL A ;TO LOC
ASL A
ASL A
CLC
ADC #$20
STA SCRPTR
LDA # >PL0
STA SCRPTR+1
LDA #3 ;COUNT THRU
STA COUNT ;ALL 3 PLYRS
SETWINR LDY #7 ;SET ONE COLOR
SETPRTS LDA (POINTER),Y
STA (SCRPTR),Y
DEY
BPL SETPRTS
LDA LOCX,X ;SET HORIZ LOC
ASL A ;TO XLOC*8+48
ASL A
ASL A
CLC
ADC #48
LDY COUNT
STA HPOSP0,Y
LDA POINTER ;POINT TO NEXT
CLC ;COLOR'S IMAGES
ADC #8
STA POINTER
BCC UDWNSCP
INC POINTER+1
UDWNSCP INC SCRPTR+1 ;POINT TO NEXT
DEC COUNT ;PLAYER
BPL SETWINR ;AND DO IT
;
;FADE ALL COLORS TO BLACK
;
LDA #16 ;SET COLOR LUM
STA COUNT ;LEVELS TO 16
FADEALL LDX #3 ;FADE COLRS=0..3
FADACOL LDA COLOR0,X ;GET THE COLOR
AND #$0F ;IF LUM <>0, CUT
BNE CUTCOLR ;IT DOWN
STA COLOR0,X ;SET TO BLACK
BEQ FADNXCL
CUTCOLR DEC COLOR0,X
FADNXCL LDY RTCLOK ;WAIT FOR A BIT
INY
INY
FADN2 CPY RTCLOK
BNE FADN2
DEX
BPL FADACOL ;FADE NEXT COLOR
DEC COUNT
BPL FADEALL ;AND DO NEXT LUM
;
;WAIT A BIT TO SHOW OFF SCORES
;
LDA #7
STA HOLDIT
WAIT0 LDX #$FF
WAIT1 LDY #$FF
WAIT2 LDA CONSOL ;END DELAY EARLY
CMP #7 ;IF A CONSOL KEY
BNE ENDGOBK ;HAS BEEN PRESSED
DEY
BNE WAIT2
DEX
BNE WAIT1
DEC HOLDIT
BPL WAIT0
ENDGOBK JMP RESTART ;GOTO TITLES
;
;MAIN PROGRAM SUBROUTINES
;------------------------
;
;SET SCREEN BOTTOM LINES (1 TYPE ONLY)
SETBOTM LDA #0 ;SET TYPE'S LINE
STA CURLINE ;COUNT TO 0
SETLNLP INC CURLINE ;ADD 1 TO LINE
LDX #6 ;GET LENGTH INDEX
LDY COUNT ;GET COLOR INDEX
SETALIN LDA (POINTER),Y ;SET TYPE
STA (SCRPTR),Y ;TEXT LINE
INY
DEX
BNE SETALIN
INY ;SET TYPE NUMBER
LDA CURLINE
ORA #$D0
STA (SCRPTR),Y
INY ;INIT SCORE FOR
INY ;'IM TO ZERO
INY
INY
LDA #$D0
STA (SCRPTR),Y
LDA COUNT ;ADD 6
CLC ;TO COLOR INDEX
ADC #6
STA COUNT
LDA SCRPTR ;POINT TO NEXT
CLC ;LINE
ADC #14
STA SCRPTR
BCC CHKDONL
INC SCRPTR+1
CHKDONL LDA CURLINE ;IF WE'VE GOT
CMP HOLDIT ;MORE LINES TO
BNE SETLNLP ;DO? DO 'EM
RTS ;RETURN
;
;INSTALL GAME VBI
;
STGAMVB LDY # <VBI
LDX # >VBI
BNE VBI1
;
;TURN OFF VBI
;
VBIOFF LDY # <XITVBV
LDX # >XITVBV
VBI1 LDA #7
JMP SETVBV
;
;****************************
;** VERTICAL BLANK ROUTINE **
;****************************
;(All of the game but scoring)
;
;MOVE OUTER WALL
;---------------
;
VBI LDA RTCLOK ;TIME TO MOVE?
AND #$07
BNE MOVGUYS ;NO, MOVE PLAYERS
LDX OUTWALL ;SAVE FIRST BYTE
LDY #1 ;OF WALL AND LOOP
MOVWALL LDA OUTWALL,Y ;CHANGING REST
ASL A ;GET BYTE + SHIFT