-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBacterion.asm
2843 lines (2304 loc) · 70.6 KB
/
Bacterion.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
*****************************
* BACTERION! *
* THE PLAGUE OF 2369 *
* BY *
* KYLE PEACOCK *
* WITH *
* TOM HUDSON *
* *
* ANALOG COMPUTING MAGAZINE *
* ALL RIGHTS RESERVED *
*****************************
* ATARI MEMORY USAGE
CASINI EQU $0002 ;RESTART VECTOR
DOSVEC EQU $000A ;RESTART VECTOR
DOSINI EQU $000C ;RESTART VECTOR
SDMCTL EQU $022F ;DMA ENABLE SHADOW
PMBASE EQU $D407 ;PM BASE REG.
GRACTL EQU $D01D ;GRAPHICS CONTROL
GPRIOR EQU $026F ;PRIORITY CONTROL
AUDC1 EQU $D201 ;AUDIO CHANNELS
AUDC2 EQU $D203
AUDC3 EQU $D205
AUDC4 EQU $D207
AUDF1 EQU $D200 ;AUDIO FREQUENCIES
AUDF2 EQU $D202
AUDF3 EQU $D204
AUDF4 EQU $D206
AUDCTL EQU $D208 ;AUDIO CONTROL
HITCLR EQU $D01E ;CLEAR COLLISIONS
WSYNC EQU $D40A ;WAIT FOR HOR SYNC.
RANDOM EQU $D20A ;RANDOM #s
PCOLR0 EQU $02C0 ;COLOR OF PLR/MIS
COLPF0 EQU $D016 ;PLAYFIELD COLOR #0
COLOR0 EQU $02C4 ;COLOR REGISTERS
COLOR4 EQU $02C8 ;BACKGROUND COLOR
NMIEN EQU $D40E ;NMI INTER. ENABLE
CH EQU $02FC ;LAST KEY PRESSED
SKSTAT EQU $D20F ;KEYBOARD STATUS
RTCLOK EQU $12 ;INTERNAL CLOCK
VDSLST EQU $0200 ;DLI VECTOR
SDLSTL EQU $0230 ;DLIST VECTOR
HPOSP0 EQU $D000 ;HOR. POS. PLR 0
HPOSP1 EQU $D001 ;HOR. POS. PLR 1
HPOSP2 EQU $D002 ;HOR. POS. PLR 2
HPOSP3 EQU $D003 ;HOR. POS. PLR 3
HPOSM0 EQU $D004 ;HOR. POS. MISS 0
HPOSM1 EQU $D005 ;HOR. POS. MISS 1
HPOSM2 EQU $D006 ;HOR. POS. MISS 2
HPOSM3 EQU $D007 ;HOR. POS. MISS 3
ATRACT EQU $4D ;ATTRACT MODE FLAG
CONSOL EQU $D01F ;CONSOLE BUTTONS
STICK0 EQU $0278 ;JOYSTICK PORT 0
P0PL EQU $D00C ;PLR/PLR COLLISIONS
M0PL EQU $D008 ;MIS/PLR COLLISIONS
P0PF EQU $D004 ;PLR/PLF COLLISIONS
TRIG0 EQU $D010 ;JOYSTICK BUTTON 0
* ATARI HARDWARE REGISTERS
SETVBV EQU $E45C ;SET SYS. TIMERS
SYSVBV EQU $E45F ;1st STAGE VBLANK
XITVBV EQU $E462 ;X-IT VBLANK
SIOINV EQU $E465 ;SIO INIT
* PLAYER/MISSILE DATA AREA
PLAYBS EQU $0000
MISS EQU PLAYBS+0768
PLAY0 EQU PLAYBS+1024
PLAY1 EQU PLAYBS+1280
PLAY2 EQU PLAYBS+1536
PLAY3 EQU PLAYBS+1792
* DISPLAY DATA AREA
DLIST EQU $1F00
DISP EQU $2010
DISP2 EQU $3000
* ZERO PAGE VARIABLES
ORG $80
LO DS 1
HI DS 1
BALO DS 1
BAHI DS 1
DRWLO DS 1
DRWHI DS 1
PLLO DS 1
PLHI DS 1
* VARIABLES
* PRIMARY USE IN 'PLOTTER' ROUTINE.
PLOTX DS 1 ;PLOT X-COORD.
PLOTY DS 1 ;PLOT Y-COORD.
COLOR DS 1 ;POINT COLOR.
DRAWX DS 1 ;DRAWTO X-COORD.
DRAWY DS 1 ;DRAWTO Y-COORD.
ACCX DS 1 ;X ACCUM.
ACCY DS 1 ;Y ACCUM.
DELTAX DS 1 ;DRAW WORK AREA.
DELTAY DS 1 ;DRAW WORK AREA.
INCX DS 1 ;DRAW X INCREMENT.
INCY DS 1 ;DRAW Y INCREMENT.
COUNTR DS 1 ;DRAWTO COUNTER.
ENDPT DS 1 ;DRAWTO ENDPOINT.
HOLD DS 1 ;WORK AREA.
XWORK DS 1
YWORK DS 1
YOFSET DS 1 ;PLOT Y OFFSET.
SHAPIX DS 1 ;OBJECT #.
SHAPCT DS 1 ;OBJECT SHAPE COUNTER.
XI DS 1 ;OBJECT X INCREMENT.
YI DS 1 ;OBJECT Y INCREMENT.
LENGTH DS 1 ;OBJECT (TAKE A GUESS!)
* PRIMARY USE IN 'TEST' ROUTINE.
VSTOP DS 1 ;STOP VBLANK FLAG.
LSOUND DS 1 ;LASER SOUND FLAG.
XSOUND DS 1 ;DETONATION SOUND FLAG.
CSOUND DS 1 ;CANNON SOUND FLAG.
FREQ DS 1 ;PULSE SOUND FREQUENCY.
DEMO DS 1 ;GAME UNDERWAY FLAG.
STRUCT DS 1 ;CELL STRUCTURE #.
NOPLAY DS 1 ;# OF PLAYERS.
SDELAY DS 2 ;PULSE SOUND DELAY.
LISTPT DS 1 ;DISPLAY LIST POINTER.
SCORE1 DS 2 ;LO-BYTE OF SCORES.
SCORE2 DS 2 ;MD-BYTE OF SCORES.
SCORE3 DS 2 ;HI-BYTE OF SCORES.
TSCR1 DS 3 ;TOTAL SCORE BYTES.
CELNUM DS 1 ;CELL # BEING DRAWN.
CELREF DS 1 ;CELL # BEING REFRESHED
* PRIMARY USE IN 'STRAT' ROUTINE.
GEVNUM DS 1 ;ATTACKING BACTERION! #
FRANGE DS 1 ;ATTACK PLAYER RADIUS.
GEVESC DS 1 ;# OF ESCAPED VESSELS.
TOTCEL DS 1 ;# OF CELLS REMAINING.
TURNT DS 1 ;BACTERION! TURN TIMERS
FIRETM DS 1 ;RAM COPY OF 'GEVFRE'
* PRIMARY USE IN 'SHOOT' ROUTINE
FDELAY DS 2 ;DELAY BETWEEN SHOTS.
NOBULL DS 2 ;# OF BULLETS FIRED.
NOKILL DS 2 ;# OF VESSELS KILLED.
* PRIMARY USE IN 'TEST' ROUTINE
CELLMV DS 20 ;CELL MOVING FLAGs.
CELLNX DS 20 ;CELL NEW X-COORD.
CELLOX DS 20 ;CELL OLD X-COORD.
ORG $1CB5
CELLNY DS 20 ;CELL NEW Y-COORD.
CELLOY DS 20 ;CELL OLD Y-COORD.
GEVCEL DS 20 ;CELL # BEING HEISTED.
* PRIMARY USE IN 'STRAT' ROUTINE
GEVFRE DS 20 ;BACTERION! FIRE TIMERS
MOVET DS 20 ;BACTERION! MOVE TIMERS
GEVDES DS 20 ;DESIRED DIRECTION.
GEVDIR DS 20 ;ACTUAL DIRECTION.
ATTACK DS 20 ;ATTACKING PLAYER FLAG.
ESCAPE DS 20 ;Y-COORD FOR ESCAPING.
STOP DS 20 ;BACTERION! ICED FLAG.
GEVX DS 20 ;BACTERION! X-COORD.
GEVY DS 20 ;BACTERION! Y-COORD.
TARX DS 20 ;BACTERION! TARGET-X.
TARY DS 20 ;BACTERION! TARGET-Y.
LSRDIR DS 20 ;LASER FIRING DIRECTION
LSRTME DS 20 ;LASER LIFE TIMER.
LASERX DS 20 ;LASER X-COORD.
LASERY DS 20 ;LASER Y-COORD.
* PRIMARY USE IN 'DRAW' ROUTINE.
TYPE DS 20 ;VESSEL TYPE.
PHASE DS 20 ;VESSEL PHASE.
TYPES DS 1 ;ATTACKING TYPE.
* PRIMARY USE IN 'SHOOT' ROUTINE.
SPEED DS 20 ;SPEED A PLAYER MOVES.
CSPEED DS 20 ;RAM COPY OF 'SPEED'
BULLET DS 20 ;BULLET OWNER (0 OR 1)
TITLE 'BACTERION! MASTER ASSEMBLY'
INCLUDE D:GEV.TXT
ORG $2800
LOC $0800
TITLE 'ONE SHOT INITIALIZER'
PROC
* RELOCATE CODE
MOVEIT JSR SIOINV ;INIT SOUNDS.
LDA #$22 ;INITIALIZE
STA SDMCTL ;DMA CONTROL.
LDA #HIGH $2800 ;SET ORIGIN
STA HI ;ADDR. IN
LDA #LOW $2800 ;2-BYTE
STA LO ;POINTER.
LDA #HIGH $0800 ;SET DESTIN-
STA BAHI ;ATION IN 2-
LDA #LOW $0800 ;BYTE
STA BALO ;POINTER.
LDY #$00 ;RESET Y-REG.
MOVELP LDA (LO),Y ;MOVE A 256
STA (BALO),Y ;BYTE BLOCK
INY ;USING Y-REG.
BNE MOVELP ;
INC HI ;NEXT 256-
INC BAHI ;BYTE BLOCK.
LDA HI ;
CMP #$40 ;DONE YET?
BNE MOVELP ;NO-KEEPITUP.
LDA #HIGH TEST ;SNAG ALL
STA DOSINI+1 ;RESET
STA CASINI+1 ;VECTORS
STA DOSVEC+1 ;SO AS TO
LDA #LOW TEST ;GAIN
STA DOSINI ;COMPLETE
STA CASINI ;CONTROL OF
STA DOSVEC ;THE SYSTEM.
JMP TEST ;ALL DONE. START!
* BUILD GAME BOARD DISPLAY LIST
INIT LDX #$00 ;RESET X-REG.
LDA #$0E ;DLIST OPCODE.
BDLOOP STA DLIST,X ;STORE IT.
DEX ;DONE YET?
BNE BDLOOP ;NO! GO BACK!
LDA #$70 ;
STA DLIST+0 ;INSTALL
STA DLIST+1 ;REMAINDER OF
LDA #$F0 ;SPECIAL
STA DLIST+2 ;DISPLAY
LDA #$4E ;LIST OP-
STA DLIST+3 ;CODES & OP-
STA DLIST+107 ;ERANDS INTO
LDA #HIGH DISP ;DISPLAY
STA DLIST+5 ;LIST
LDA #LOW DISP ;
STA DLIST+4 ;
LDA #HIGH DISP2 ;
STA DLIST+109 ;
LDA #LOW DISP2 ;
STA DLIST+108 ;
LDA #$41 ;
STA DLIST+200 ;
LDA #$8E ;
STA DLIST+199 ;
LDA #HIGH DLIST ;
STA DLIST+202 ;
LDA #LOW DLIST ;
STA DLIST+201 ;
* PLAYER/MISSILE INITIALIZATION
LDA #$3E ;
STA SDMCTL ;DMA ENABLE.
LDA #HIGH PLAYBS ;PM BASE
STA PMBASE ;ADDRESS.
LDA #$03 ;GRAPHICS
STA GRACTL ;CONTROL.
LDA #$10 ;PRIORITY
STA GPRIOR ;REGISTERS.
LDA #$00 ;CLEAR OUT
TAX ;PLAYER 0
:PMSET STA PLAY0,X ;& PLAYER 1
STA PLAY1,X ;
DEX ;ALL DONE?
BNE :PMSET ;NO! CONT.
* CLEAR OUT PLAYERS' SCOREs
LDX #$02
LDA #$00 ;FILL WITH 0
:CLRS2 STA SCORE1,X
STA SCORE2+1,X
STA TSCR1,X
DEX ;ALL DONE?
BPL :CLRS2 ;NO! CONTINUE
* CLEAR PLAYFIELD AREA
LDA #LOW DISP ;I'LL LET
STA LO ;YOU GUYS
LDA #HIGH DISP ;FIGURE OUT
STA HI ;WHAT'S GOING
LDX #0 ;ON HERE!
CDLP LDA LO
STA LOTBL,X ;I'M SO LAZY!
LDA HI
STA HITBL,X
LDA #0
LDY #39
CDLP2 STA (LO),Y
DEY
BPL CDLP2
INX
CPX #192
BEQ DOIT
LDA LO
CLC
ADC #40
STA LO
LDA HI
ADC #0
STA HI
JMP CDLP
* SET UP ATOMIC PILE CELLS
DOIT LDX STRUCT
LDY STRBSE,X
LDX #9
STX TOTCEL
SETCEL LDA :ICELX,Y ;X-COORDS
STA CELLOX,X
STA CELLNX,X
LDA :ICELY,Y ;Y-COORDS
STA CELLOY,X
STA CELLNY,X
LDA #$00
STA CELLMV,X ;CELLS NOT MOV-
INY ;ING STAGUS.
DEX
BPL SETCEL
* SET UP PLAYERS PROBEs
LDX #$00 ;FLIP TO GAME
STX LISTPT ;BOARD SCREEN
STX GEVX+0 ;X-COORD.
STX GEVX+1 ;X-COORD.
JSR SETPLR ;SET IT UP NOW.
LDA NOPLAY ;1 PLAYER GAME?
BEQ SETTYP ;YES! SKIP #2
INX ;NO! SET UP PLR 2.
JSR SETPLR ;SET IT UP NOW.
* ATTACKING BACTERION! TYPE
SETTYP LDA #$01 ;SLOWEST TYPE
STA TYPES ;ATTACKS FIRST.
STA TYPE+2
STA TYPE+3
STA TYPE+4
* BACTERION! INITIAL A.I. SPEEDS
LDX #$05
SETMDB LDA IMOVDB,X ;MOVEMENT SPEED
STA MOVEDB,X
LDA ITURDB,X ;TURN SPEED
STA TURNDB,X
LDA IFIRDB,X ;FIRE SPEED
STA FREBSE,X
DEX
BPL SETMDB
JMP INIT2
* INITIALIZE GIVEN PLAYER
SETPLR LDA #$00 ;PLAYER NO LONG-
STA STOP,X ;ER DEAD OR EXP-
STA TYPE,X ;LODING.
LDA #$01 ;SET UP FOR
STA SPEED,X ;COASTING SPEED.
STA CSPEED,X ;
LDA PLRPHS,X ;CORRECT TYPE
STA PHASE,X ;OF VESSEL
STA GEVDIR,X ;PHASE
LDA PLRX,X ;PROPER X-COORD.
STA GEVX,X ;
LDA #128 ;PROPER Y-COORD.
STA GEVY,X ;
RTS ;ALL DONE...
PLRX DB 44,195 ;INITIAL X-COORDS
PLRPHS DB 12,4 ;INITIAL DIRECTIONS
* BACTERION! INITIAL TURNING DATABASE
ITURDB DB 52,44,36,28,20,12
* BACTERION! INITIAL MOVING DATABASE
IMOVDB DB 13,11,09,07,05,03
* BACTERION! INITIAL FIRING TIMES
IFIRDB DB 70,65,60,55,50,45
* OFFSET DATABASE TO CELL FORMATIONS
STRBSE DB 0,10,20
* CELLS INITIAL X-COORDS
:ICELX DB 68,80,92,62,74
DB 86,98,68,80,92
DB 79,79,79,79,73
DB 85,67,91,61,97
DB 79,71,87,79,79
DB 79,79,71,87,79
* CELLS INITIAL Y-COORDS
:ICELY DB 93,93,93,96,96
DB 96,96,99,99,99
DB 76,82,88,94,98
DB 98,102,102,106,106
DB 86,90,90,94,94
DB 94,94,98,98,102
TITLE 'BACTERION! MULTI-INITIALIZER'
INIT2 PROC
* ALLOW THINGS TO SETTLE DOWN
LDX #$01 ;STOP VERTICAL
STX VSTOP ;BLANK ROUTINE
* INITIALIZE SOUNDS
DEX ;
TXA ;
STA AUDC3 ;TURN OFF SOUND
STA AUDC4 ;REGISTERS & INIT
STA AUDCTL ;SOUND CHANNELS.
* CLEAR PLAYER MISSILE AREA
:ER1 STA MISS,X ;BACTERION! #1.
STA PLAY2,X ;BACTERION! #2.
STA PLAY3,X ;BACTERION! #3.
STA HITCLR ;CLEAR COLLISIONS
DEX
BNE :ER1
* ENEMY BACTERION!s X, Y, & DIRECTION
LDX #$04 ;HANDLE ALL.
SETGEV LDA TYPES ;GET TYPE OF ATT-
STA TYPE,X ;ACKING BACTERION.
JSR PICKX ;RANDOM X-COORD.
STA GEVX,X ;STORE IT.
LDA RANDOM ;RANDOM NUMBER.
BPL :PLUS1 ;BRANCH IF > 0.
LDA #21 ;INITIAL Y-COORD.
BNE :PLUS2 ;BRANCH!
:PLUS1 LDA #228 ;INITIAL Y-COORD.
:PLUS2 STA GEVY,X ;STORE IT.
JSR PICKDR ;RANDOM DIRECTION.
* ENEMY BACTERION!Rs TARGET CELL
SEL LDA #$00 ;CLEAR
STA TRY ;COUNTERS,
STA GEVESC ;# OF ESCAPEES,
STA STOP,X ;DEATH STATUS,
STA GEVCEL,X ;TARGET CELL,
STA LSRDIR,X ;LASER FLAG,
STA GEVFRE,X ;FIRE TIME FLAG,
STA ESCAPE,X ;ESCAPE Y-COORD.
LDA RAND0 ;GET RANDOM #
CMP #$D8 ;GREATER THAN $D8
BCS SELIT ;YES, BRANCH!
SEL0 LDA #$0A ;RANDOM # SEED
JSR RAND0 ;GET RANDOM CELL #
TAY ;STORE IN Y-REG.
STX :XHOLD ;SAVE X-REG.
CPICK0 LDA ESCAPE,X ;ESCAPE Y-COORD
BEQ CPICK1 ;EQUAL 0?
TYA ;NO! MOVE Y TO A
CMP GEVCEL,X ;IS THIS CELL
BEQ SEL1 ;SPOKEN FOR?
CPICK1 INX ;NO! MOVE ON
CPX #$05 ;TO NEXT
BNE CPICK0 ;BACTERION!
LDX :XHOLD ;RESTORE X-REG.
* HEIST THIS CELL (IN Y-REG.)
LDA CELLNY,Y ;CELL Y-COORD.
CMP #194 ;OFF SCREEN?
BCS SEL1 ;YES! TRY AGAIN.
LDA #$02 ;RANDOM # SEED.
JSR RAND0 ;GET RANDOM #.
STY :YHOLD ;SAVE Y-REG.
TAY ;MOVE # TO ACC.
LDA ESCDT,Y ;GET PROPER ES-
STA ESCAPE,X ;CAPE Y-COORD.
LDA CELDT,Y ;GET OFFSET FOR
LDY :YHOLD ;LOCKING ON TO
CLC ;TOP OR BOTTOM
ADC CELLNY,Y ;OF CELL & STORE
STA TARY,X ;IN TARGET-Y.
LDA CELLNX,Y ;GET X-COORD OF
CLC ;CELL & STORE
ADC #44 ;IN TARGET-X.
STA TARX,X ;
TYA ;MAKE THIS CELL
STA GEVCEL,X ;SPOKEN FOR.
JMP SEL2 ;HANDLE NEXT.
SEL1 LDX :XHOLD ;RESTORE X-REG.
DEC TRY ;DEC. COUNTERS
BNE SEL0 ;& BRANCH!
* CAN'T FIND A CELL, ATTACK PLAYERs
SELIT LDY NOPLAY ;# OF PLAYERS.
INY ;ADD ONE.
TYA ;RANDOM # SEED.
JSR RAND0 ;GET RANDOM #.
TAY ;MOVE TO Y-REG.
LDA GEVX,Y ;PLAYER'S X-COORD.
STA TARX,X ;USE AS TARGET-X.
LDA GEVY,Y ;PLAYER'S Y-COORD.
STA TARY,X ;USE AS TARGET-Y.
SEL2 DEX ;HANDLE NEXT
CPX #$01 ;BACTERION! (IF
BEQ :NEXT ;WE AREN'T DONE.)
JMP SETGEV ;JUMP TO IT!
* SET UP RANGE OF ATTACK
:NEXT LDA #40
STA FRANGE
* SET UP FIRING TIME
LDX TYPES ;ATTACK TYPE.
LDA FREBSE-1,X ;GET DATA FROM
STA FIRETM ;FIRING DB.
CMP #$05 ;IS IT < 5?
BCC PROJT1 ;NO! BRANCH!
SEC ;YES! SUBTRACT
SBC #$03 ;3 & STORE
STA FREBSE-1,X ;IT IN DB.
* CLEAR PROJECTILE WORK AREA
PROJT1 LDX #12 ;HANDLE ALL.
LDA #$FF ;INACTIVE STATUS.
CLRPRO STA BULLET,X ;OWNER.
STA CELLNX+5,X ;X-COORD.
STA CELLNY+5,X ;Y-COORD.
STA CELLMV+5,X ;MOVING.
DEX ;HANDLE NEXT
CPX #$04 ;(IF ANY).
BNE CLRPRO ;
* SET UP COLOR DATABASES
LDX #$03 ;COUNTER.
:SET1 LDA RANDOM ;RANDOM #.
AND #$F0 ;ZAP LO-NIBBLE.
ORA #$0A ;& W/DECIMAL 10.
STA PCOLR0,X ;STORE IT.
LDA RANDOM ;RANDOM #.
AND #$F0 ;ZAP LO-NIBBLE.
ORA :FIELD,X ;OR W/PLAYFIELD.
STA COLOR0,X ;STORE IT.
DEX ;HANDLE NEXT.
BPL :SET1 ;BRANCH!
LDA #$00 ;CLEAR.
STA NOBULL+0 ;# OF BULLETS
STA NOKILL+0 ;FIRED & # OF
STA NOBULL+1 ;BACTERIONS!
STA NOKILL+1 ;VAPORIZED.
STA VSTOP ;START VBLANK.
RTS ;BUG OFF!!!
* BACTERION! FIRE TIME DATABASE
FREBSE DB 0,0,0,0,0,0
* OFFSETS TO TOP & BOTTOM OF CELL
CELDT DB 21,36
* Y-COORDS FOR ESCAPING BACTERION!
ESCDT DB 10,245
* COLOR LUM. FOR PLAYERS PLAYFIELDS
:PLAYC DB $0C,$0C,$0A,$0A
:FIELD DB $0C,$08,$08,$0A
* PICK A RANDOM X-COORD.
PICKX LDA #100
JSR RAND0
CLC
ADC #75
RTS
* PICK A RANDOM DIRECTION (0-15)
PICKDR LDA #16
JSR RAND0
STA GEVDIR,X
RTS
* PICK A RANDOM # (0 UP TO ACC.)
RAND0 STA HOLDME
LDA RANDOM
RAND01 CMP HOLDME
BCC RANOUT
LSR A
LSR A
JMP RAND01
RANOUT RTS
HOLDME DB 0 ;TEMP STORAGE.
TRY DB 0 ;COUNTER.
:XHOLD DB 0 ;X-REG TEMP STORAGE.
:YHOLD DB 0 ;Y-REG TEMP STORAGE.
TITLE 'GET THE GAME GOING...'
TEST PROC
LDA #$00 ;TURN OFF
STA AUDC1 ;SOUND
STA AUDC2 ;REGISTERS.
JSR :SETP0 ;SET UP TITLE
JSR ADITUP ;SCREEN SCORES
LDA #$01 ;& SHOW TITLE
STA LISTPT ;SCREEN.
STA VSTOP ;
LDA #$06 ;SET UP VERT-
LDX #HIGH VBL ;ICAL BLANK
LDY #LOW VBL ;ROUTINES.
JSR SETVBV ;
LDA #$07 ;SET UP DEF.
LDX #HIGH DBL ;VERTICAL
LDY #LOW DBL ;BLANK
JSR SETVBV ;ROUTINES.
LDA #$C0 ;SET UP DLI
STA NMIEN ;ROUTINES.
:DEMOX JSR SHUTUP
LDA DEMO ;WAIT FOR PUSH
CMP #$01 ;OF START KEY.
BNE :DEMOX ;
INC DEMO ;
JSR INIT ;INITIALIZE...
* START OF NEW GAME
SAVE0 LDA DEMO ;CHANGE STATUS
CMP #$02 ;OF 'DEMO'
BNE TEST ;VARIABLE
* GAME PAUSED?
LDA CH ;IS SPACEBAR
CMP #$21 ;PRESSED?
BNE :REFCL ;YES. IS BAR
LDA SKSTAT ;STILL BEING
AND #$04 ;PRESSED?
BEQ :REFCL ;YES-CONTINUE.
JSR ADITUP ;ADD UP SCORES
LDA TOTCEL ;HOLD # OF
PHA ;CELLS LEFT.
LDA #$0A ;MAKE WEIRD
STA TOTCEL ;SOUND.
LDA #$01 ;SWITCH TO
STA LISTPT ;TITLE SCREEN.
STA VSTOP
STA CH ;WAIT FOR
JSR SHUTUP ;SPACEBAR.
:WAIT1 LDA CH ;IS SPACEBAR
CMP #$21 ;PRESSED? NO,
BNE :WAIT1 ;SO WAIT.
:WAIT2 LDA SKSTAT ;YES. IS BAR
AND #$04 ;STILL BEING
BEQ :WAIT2 ;PRESSED?
PLA ;RESTORE # OF
STA TOTCEL ;CELLS LEFT.
LDA #$00 ;SWITCH BACK
STA LISTPT ;TO PLAYFIELD
STA VSTOP ;& CONTINUE...
STA CH
* REFRESH CELLS (ONE PER PASS)
:REFCL DEC CELREF ;OUT OF CELLS
BPL GETCEL ;TO REFRESH?
LDA #$09 ;YES. START
STA CELREF ;AGAIN...
GETCEL LDX CELREF ;GET CELL # TO
LDA CELLMV,X ;REFRESH & SEE
BNE GOTCEL ;IF IT MOVES.
LDA CELLOX,X ;CELL X-COORD
STA PLOTX ;
LDA CELLOY,X ;CELL Y-COORD
STA PLOTY ;
LDA #1 ;SPEC. COLOR
STA COLOR ;
LDA #0 ;SPEC. OBJECT
JSR OBJECT ;DRAW IT...
* DRAW MOVING CELLS (ALL AT ONCE)
GOTCEL LDA #$09 ;SET UP CELL #
STA CELNUM ;TO DRAW.
SAVE1 LDX CELNUM ;GET CELL #.
LDA CELLMV,X ;IS IT BEING
BEQ SAVE2 ;CARRIED OFF?
JSR SHOCEL ;YES. DRAW IT.
SAVE2 DEC CELNUM ;MOVE ON TO
BPL SAVE1 ;NEXT CELL.
* DRAW & ERASE BACTERION! LASERS
LDA #$04 ;CHECK ALL
STA LSRCNT ;VESSELS.
LASER3 LDX LSRCNT ;IS THIS VES-
LDA LSRDIR,X ;SEL FIRING?
BEQ NXTLSR ;NO. CONTINUE.
BMI LASER5 ;YES. ERASE?
ORA #$80 ;SET UP LASER
STA LSRDIR,X ;TO BE ERASED.
LDA #$02 ;SPECIFY COLOR
STA COLOR ;OF LASER.
LDA GEVX,X ;GET X-COORD
SEC ;OF FIRING
SBC #44 ;VESSEL & USE
STA LASERX,X ;AS LASER
STA PLOTX ;X-COORD.
LDA GEVY,X ;GET Y-COORD
SEC ;OF FIRING
SBC #$1C ;VESSEL & USE
CMP #192 ;AS LASER
BCS LASER6 ;Y-COORD. DO
STA LASERY,X ;NOT FIRE IF
STA PLOTY ;NOT ON-SCREEN
LDA LSRDIR,X ;ELSE, DRAW
AND #$7F ;FIRING LASER
JSR OBJECT ;(DEATH RAY).
JMP NXTLSR ;HANDLE NEXT.
LASER5 DEC LSRTME,X ;TIME TO
BPL NXTLSR ;ERASE LASER?
LDA LASERX,X ;YES. GET X
STA PLOTX ;COORD & Y
LDA LASERY,X ;COORD FOR
STA PLOTY ;ERASING.
LDA #$00 ;SPECIFY COLOR
STA COLOR ;AS BACKGROUND.
LDA LSRDIR,X ;NOW ERASE
AND #$7F ;LASER.
JSR OBJECT ;
LDX LSRCNT ;TURN OFF
LASER6 LDA #$00 ;LASER FOR
STA LSRDIR,X ;THIS VESSEL.
NXTLSR DEC LSRCNT ;HANDLED ALL
LDA LSRCNT ;LASERS? IF
CMP #$01 ;SO, QUIT.
BNE LASER3 ;ELSE GO BACK.
* DRAW & ERASE PROJECTILES
LDX #17 ;HANDLE ALL.
PROJ5 LDA CELLMV,X ;IS THIS BULLET
BEQ PROJ6 ;ACTIVE?
LDA CELLOX,X ;YES. GET X
STA PLOTX ;COORD.
LDA CELLOY,X ;GET Y-COORD.
STA PLOTY ;OF BULLET.
LDA #$00 ;SET UP TO ERASE
STA CELLMV,X ;THIS BULLET.
STA COLOR ;SPECIFY COLOR.
STX :XHOLD ;SAVE X-REG.
JSR PLOTPT ;ERASE IT NOW!
LDX :XHOLD ;RESTORE X-REG.
LDA CELLNX,X ;GET NEW BULLET
STA CELLOX,X ;X-COORD & PRE-
STA PLOTX ;PARE TO PLOT.
LDA CELLNY,X ;GET NEW BULLET
STA CELLOY,X ;Y-COORD & PRE-
STA PLOTY ;PARE TO PLOT.
LDA #$03 ;SPECIFY COLOR
STA COLOR ;OF NEW BULLET.
STX :XHOLD ;SAVE X-REG.
JSR PLOTPT ;DRAW NEW BULLET
LDX :XHOLD ;RESTORE X-REG.
PROJ6 DEX ;MOVE ON TO NEXT
CPX #$09 ;BULLET. IF NONE
BNE PROJ5 ;LEFT, QUIT.
* ALL CELLS GONE?
GAME3 LDA TOTCEL ;TOTAL # OF
BPL GAME1 ;CELLS < 0?
JSR SHUTUP ;YES. SOUND OFF.
LDA #$01 ;STOP ALL SCREEN
STA VSTOP ;ACTION.
STA RTCLOK+2 ;SET UP TO
LDX RTCLOK+1 ;PAUSE FOR
INX ;SOME TIME.
HALT CPX RTCLOK+1 ;IS PAUSE DONE?
BNE HALT ;NO. WAIT.
JMP TEST ;YES. RESTART.
*BACTERION!s DESTROYED OR OFF SCREEN?
GAME1 LDA GEVESC ;IS NUMBER OF
CMP #$03 ;ESCAPED VESSELS
BEQ GAMEE ;EQUAL TO THREE?
JMP SAVE0 ;NO, GO BACK.
GAMEE JSR ADITUP ;ADD UP SCORES.
INC TYPES ;SET UP NEXT TYPE
LDA TYPES ;OF ATTACKING
CMP #$07 ;BACTERION.
BCC GAME2 ;
LDA RANDOM ;GET RANDOM
AND #$F0 ;BACKGROUND
STA COLOR4 ;COLOR.
* FLIP TO TITLE SCREEN
LDA #$01 ;STOP ALL SCREEN
STA VSTOP ;ACTION & FLIP
STA LISTPT ;TO TITLE SCREEN
JSR SHUTUP ;SOUNDS OFF.
LDA TOTCEL ;SAVE TOTAL #
PHA ;OF CELLS LEFT.
LDA #$0A ;MAKE WEIRD
STA TOTCEL ;TITLE SOUND.
STA RTCLOK+2 ;PAUSE FOR A
LDX RTCLOK+1 ;WHILE.
INX ;
:PAUSE CPX RTCLOK+1 ;PAUSE TIME UP?
BNE :PAUSE ;NO. WAIT.
PLA ;RESTORE TOTAL #
STA TOTCEL ;OF CELLS LEFT.
LDA #$00 ;FLIP TO GAME
STA LISTPT ;SCREEN & BEGIN
STA VSTOP ;SCREEN ACTION.
STA CH
STA XSOUND
STA CSOUND
STA LSOUND
* SPEED UP BACTERION! MOVE/TURN RATES
LDX #$05 ;UPDATE ALL.
FAST1 LDA MOVEDB,X ;IS MOVE RATE AT
CMP #$02 ;LOWEST LEVEL?
BCC FAST2 ;YES, CONTINUE.
DEC MOVEDB,X ;NO. DECREMENT.
FAST2 LDA TURNDB,X ;IS TURN RATE AT
CMP #$08 ;LOWEST LEVEL?
BCC FAST3 ;YES, CONTINUE.
SEC ;NO. DECREMENT.
SBC #$04 ;
STA TURNDB,X ;
FAST3 DEX ;UPDATE NEXT.
BPL FAST1 ;
LDA #$01 ;MAKE ATTACKING
GAME2 STA TYPES ;BACTERION! THE
STA TYPE+2 ;SLOWEST TYPE
STA TYPE+3 ;FOR BEGINNING
STA TYPE+4 ;OF NEW WAVE.
* SET UP FOR NEXT ATTACK
JSR INIT2 ;INITIALIZE...
JMP SAVE0 ;BEGIN AGAIN.
* VERTICAL BLANK ROUTINE
VBL CLD ;CLEAR DECIMAL
LDA LISTPT ;RESEED
ASL A ;DISPLAY LIST
TAX ;VECTORS ACC-
LDA :LSTDB+0,X ;ORDING TO
STA SDLSTL+0 ;'LISTPT'
LDA :LSTDB+1,X ;VARIABLE.
STA SDLSTL+1 ;DO THE SAME
LDA :DLIDB+0,X ;THING FOR
STA VDSLST+0 ;DLI VECTORS.
LDA :DLIDB+1,X ;
STA VDSLST+1 ;
LDA #$00 ;MAKE ALL PLAYER/
STA HPOSP0 ;MISSILE X-COORDS
STA HPOSP1 ;EQUAL TO ZERO.
STA HPOSP2 ;THIS PROVIDES A
STA HPOSP3 ;NICE BORDER AT
STA HPOSM0 ;THE SCREEN TOP.
STA HPOSM1 ;THE DLIs HANDLE
STA HPOSM2 ;PROPER PLACEMENT
STA HPOSM3 ;OF X-COORDS.
LDA VSTOP ;IS SCREEN ACTION
BNE XITVBL ;HALTED?
* KILL ATTRACT MODE
STA ATRACT
* FLASH CELLS
LDA COLOR0 ;KEEP SAME LUM.
CLC ;BUT UPDATE
ADC #$10 ;COLOR.
STA COLOR0 ;
* BACTERION! ATTACK STRATEGY
LDA #$04 ;ALL VESSELS
STA GEVNUM ;ATTACK!
VBL2 JSR STRAT ;NASTY ROUTINE!
DEC GEVNUM ;NEXT VESSEL
LDA GEVNUM ;ATTACKS!
CMP #$01 ;ALL DONE?
BNE VBL2 ;IF NOT, CONT.
* TURN ENEMY BACTERION!s
JSR TURN
* MOVE ENEMY BACTERION!s
JSR MOVE
XITVBL JMP SYSVBV
* DEF. VERTICAL BLANK
DBL CLD ;CLEAR DECIMAL
* READ CONSOLE BUTTONS
JSR BUTTON
* PULSE SOUND
JSR PULSE
LDA VSTOP ;ALL SCREEN
BNE XITDBL ;ACTION HALTED?
* READ JOYSTICKS & MOVE PLAYERS