-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPlanetary Defense.asm
2002 lines (2002 loc) · 51.1 KB
/
Planetary Defense.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
;
; File: PLANET1.M65
;
.OPT NO LIST
; ------------------
; ANALOG Computing's
; PLANETARY DEFENSE
; ------------------
;
; by Charles Bachand
; and Tom Hudson
;
; Written with OSS MAC/65
;
; ------------------
; Hardware Registers
; ------------------
;
HPOSP0 = $D000 ;P0 horizontal
HPOSM0 = $D004 ;M0 horizontal
P0PF = $D004 ;P0-PField coll.
M0PL = $D008 ;M0-PLayer coll.
GRAFP0 = $D00D ;PM graphics
COLPF0 = $D016 ;PF color 0
GRACTL = $D01D ;graphic control
HITCLR = $D01E ;clear hit reg
CONSOL = $D01F ;console buttons
AUDF1 = $D200 ;frequency 1
AUDC1 = $D201 ;volume 1
AUDCTL = $D208 ;audio control
RANDOM = $D20A ;random numbers
DMACTL = $D400 ;DMA control
PMBASE = $D407 ;PM base address
WSYNC = $D40A ;wait hor. sync
NMIEN = $D40E ;interrupt reg.
ATRACT = $4D ;attract flag
;
; ------------------------
; Operating System Vectors
; ------------------------
;
SETVBV = $E45C ;set v.blank
XITVBV = $E462 ;exit v.blank
SIOINV = $E465 ;serial I/O init
;
; ----------------
; Shadow Registers
; ----------------
;
VDSLST = $0200 ;DLI vector
SDMCTL = $022F ;DMA control
SDLSTL = $0230 ;DList pointer
GPRIOR = $026F ;gr. priority
PADDL0 = $0270 ;paddle 0
PADDL1 = $0271 ;paddle 1
STICK0 = $0278 ;joystick 0
PTRIG0 = $027C ;paddle trig 0
PTRIG1 = $027D ;paddle trig 1
STRIG0 = $0284 ;stick trig 0
PCOLR0 = $02C0 ;player colors
COLOR0 = $02C4 ;playfield "
CH = $02FC ;keyboard char
;
; -------------------
; Page Zero Registers
; -------------------
;
*= $80 ;top of page 0
;
INDEX *= *+2 ;temp index
INDX1 *= *+2 ;temp index
INDX2 *= *+2 ;temp index
COUNT *= *+1 ;temp register
TEMP *= *+1 ;temp register
SATEMP *= *+1 ;temp register
SCNT *= *+1 ;orbit index
LO *= *+1 ;plot low byte
HI *= *+1 ;plot high byte
DEADTM *= *+1 ;death timer
EXPTIM *= *+1 ;explosion timer
BOMTIM *= *+1 ;bomb timer
SATPIX *= *+1 ;sat. pic cntr
CURX *= *+1 ;cursor x
CURY *= *+1 ;cursor y
FROMX *= *+1 ;vector from X
FROMY *= *+1 ;vector from Y
TOX *= *+1 ;vector to X
TOY *= *+1 ;vector to Y
SATX *= *+1 ;satellite x
SATY *= *+1 ;satellite y
XHOLD *= *+1 ;x reg hold area
LASTRG *= *+1 ;last trigger
LEVEL *= *+1 ;level number
BLEVEL *= *+1 ;binary level #
LIVES *= *+1 ;lives left
SCORE *= *+3 ;score digits
SCOADD *= *+3 ;score inc.
SHOBYT *= *+1 ;digit hold
SHCOLR *= *+1 ;digit color
SATLIV *= *+1 ;satellite flag
BOMVL *= *+1 ;bomb value low
BOMVH *= *+1 ;bomb value high
SAUVAL *= *+1 ;saucer value
GAMCTL *= *+1 ;game ctrl flag
DLICNT *= *+1 ;DLI counter
SAUCER *= *+1 ;saucer flag
SAUTIM *= *+1 ;image timer
SAUCHN *= *+1 ;saucer chance
BOMBWT *= *+1 ;bomb wait time
BOMCOL *= *+1 ;bomb collis flg
DEVICE *= *+1 ;koala pad sw
PLNCOL *= *+1 ;planet color
PAUSED *= *+1 ;pause flag
AVG *= *+2 ;average
PTR *= *+2 ;queue pointer
SSSCNT *= *+1 ;saucer snd cnt
EXSCNT *= *+1 ;expl. snd count
ESSCNT *= *+1 ;enemy shot snd
PSSCNT *= *+1 ;player shot snd
TITLE *= *+1 ;title scrn flag
PENFLG *= *+1 ;pen up/dwn flg
EXPCNT *= *+1 ;explosion counter
NEWX *= *+1 ;explosion x
NEWY *= *+1 ;explosion y
PLOTCLR *= *+1 ;plot/erase flag
COUNTR *= *+1 ;explosion index
PLOTX *= *+1 ;plot x coord
PLOTY *= *+1 ;plot y coord
HIHLD *= *+1 ;plot work area
LOHLD *= *+1 ;plot work area
BOMBS *= *+1 ;bombs to come
BOMTI *= *+1 ;bomb speeds
VXINC *= *+1 ;vector x hold
VYINC *= *+1 ;vector y hold
LR *= *+1 ;vector left/right hold
UD *= *+1 ;vector up/down hold
DELTAX *= *+1 ;vector work area
DELTAY *= *+1 ;vector work area
XQ *= *+5 ;x queue
YQ *= *+5 ;y queue
SL *= *+5 ;samples lo
SH *= *+5 ;samples hi
;
; ----------------------------
; Screen + Player/Missile Area
; ----------------------------
;
SCRN = $3000 ;screen area
PPOS = SCRN+1935 ;planet pos
;
PM = $00
MISL = PM+$0300 ;missiles
PLR0 = MISL+$0100 ;player 0
PLR1 = PLR0+$0100 ;player 1
PLR2 = PLR1+$0100 ;player 2
PLR3 = PLR2+$0100 ;player 3
;
ORBX = $1E00 ;orbit X
ORBY = $1F00 ;orbit Y
;
; -------------
; Start of game
; -------------
;
*= $2000
;
; ------------------
; Intro Display List
; ------------------
;
TLDL .BYTE $70,$70,$70,$70
.BYTE $70,$70,$70,$70
.BYTE $70,$46
.WORD MAGMSG
.BYTE $70,7,$70,6
.BYTE $10,6,$70,$70
.BYTE 6,$20,6,$40
.BYTE 6,$41
.WORD TLDL
;
; ------------------
; Intro Message Text
; ------------------
;
MAGMSG .SBYTE " ANALOG CO"
.SBYTE "MPUTING'S "
.SBYTE +$40," PLANETARY"
.SBYTE +$40," DEFENSE "
.SBYTE +$80," BY CHARLE"
.SBYTE +$80,"S BACHAND "
.SBYTE +$C0," AND TOM"
.SBYTE +$C0," HUDSON "
.SBYTE +$40," KOALA PAD"
.SBYTE +$40," - SELECT "
.SBYTE +$C0," JOYSTICK "
.SBYTE +$C0,"--- START "
.SBYTE " OR PRESS"
.SBYTE " TRIGGER "
;
; -----------------
; Game Display List
; -----------------
;
GLIST .BYTE $70,$70,$46
.WORD SCOLIN
.BYTE $4D
.WORD SCRN
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$8D
.BYTE $8D,$8D,$8D,$41
.WORD GLIST
;
; ------------------------
; Display the Intro Screen
; ------------------------
;
PLANET CLD ;clear decimal
LDA #$00 ;get zero
STA NMIEN ;display off
LDX #$7F ;set index
CLPG0 STA $80,X ;clr top page 0
DEX ;dec pointer
BNE CLPG0 ;done? No.
INC TITLE ;title on flag
LDA #$FF ;get $FF
STA LIVES ;set dead
STA GAMCTL ;game control
STA ESSCNT ;no enemy shots
STA PSSCNT ;no player shots
JSR SNDOFF ;no sound on 123
STA AUDC1+6 ;turn off snd 4
LDA #$C4 ;medium green
STA COLOR0 ;score color
LDA #$84 ;medium blue
STA COLOR0+1 ;text color
LDA #$0A ;bright white
STA COLOR0+2 ;shot color
LDA #$98 ;light blue
STA COLOR0+3 ;text color
LDA # <DLI ;set DLI vector
STA VDSLST ;low byte
LDA # >DLI ;set DLI vector
STA VDSLST+1 ;high byte
LDA #$C0 ;enable Display
STA NMIEN ;List Interrupts
LDA #$32 ;PM DMA off
STA DMACTL ;DMA control
STA SDMCTL ;and shadow reg
LDA #0 ;get zero
STA GRACTL ;graphics ctrl
STA AUDCTL ;reset audio
LDX #4 ;5 PM registers
NOPM STA GRAFP0,X ;clr register
DEX ;dec index
BPL NOPM ;done? No.
JSR SIOINV ;init sound
LDA # <TLDL ;DL addr low
STA SDLSTL ;DL pntr low
LDA # >TLDL ;DL addr high
STA SDLSTL+1 ;DL pntr high
LDX # >VBLANK ;vblank high
LDY # <VBLANK ;vblank low
LDA #7 ;deferred
JSR SETVBV ;set vblank
LDA #60 ;one second
STA DEADTM ;dead time
;
; --------------------------
; Check console and triggers
; --------------------------
;
START LDA DEADTM ;look dead time
BNE START ;alive? No.
CCHK LDA PTRIG0 ;paddle trig 0
EOR PTRIG1 ;mask w/PTRIG1
BNE PDEV ;pushed? Yes.
LDA STRIG0 ;stick trig
BEQ PDEV ;pushed? Yes.
LDA CONSOL ;get console
AND #3 ;do START/SELECT
CMP #3 ;test buttons
BEQ CCHK ;any pushed? No.
AND #1 ;mask off START
PDEV STA DEVICE ;device switch
RELWT LDA #10 ;1/6 second
STA DEADTM ;dead time
RELWT2 LDA DEADTM ;debounce!
BNE RELWT2 ;time up? No.
LDA CONSOL ;get console
CMP #7 ;keys released?
BNE RELWT ;No. loop until
;
; ---------------------------
; Clear PM Area and Playfield
; ---------------------------
;
LDA # >SCRN ;scrn addr high
STA INDEX+1 ;pointer high
LDA #0 ;get zero
STA INDEX ;pointer low
LDX #15 ;16 pages 0..15
TAY ;use as index
CL0 STA (INDEX),Y ;clear ram
INY ;next byte
BNE CL0 ;page done? No.
INC INDEX+1 ;next page
DEX ;page counter
BPL CL0 ;scrn done? No.
LDX #0 ;now clear P/m
CLPM STA MISL,X ;clear missiles
STA PLR0,X ;clear plyr 0
STA PLR1,X ;clear plyr 1
STA PLR2,X ;clear plyr 2
STA PLR3,X ;clear plyr 3
DEX ;done 256 bytes?
BNE CLPM ;no, loop back!
LDA # <GLIST ;Point to the
STA SDLSTL ;game display
LDA # >GLIST ;list to show
STA SDLSTL+1 ;the playfield.
LDA # >PM ;PM address high
STA PMBASE ;into hardware
LDA #$3E ;enable single
STA SDMCTL ;line resolution
STA DMACTL ;DMA control
LDA #3 ;enable player
STA GRACTL ;and missile DMA
LDA #$11 ;set up
STA GPRIOR ;P/M priority
LDA #0 ;get zero
STA TITLE ;title off
;
; ---------------
; Draw The Planet
; ---------------
;
LDA # <PPOS ;planet pos high
STA INDX1 ;pointer #1 low
STA INDX2 ;pointer #2 low
LDA # >PPOS ;planet pos high
STA INDX1+1 ;pointer #1 high
STA INDX2+1 ;pointer #2 high
LDX #0 ;table pointer
DP0 LDY #0 ;index pointer
DP1 LDA DPTBL,X ;table value
BNE DP2 ;done? No.
JMP SETUP ;continue
DP2 BMI DPRPT ;repeat? Yes.
STA (INDX1),Y ;put values
STA (INDX2),Y ;onto screen
INY ;inc index pntr
INX ;inc table pntr
JMP DP1 ;continue
;
; -------------------
; Repeat Byte Handler
; -------------------
;
DPRPT ASL A ;shift byte
STA TEMP ;new line flag
ASL A ;NL bit -> carry
ASL A ;color -> carry
LDA #$55 ;color 1 bits
BCS FILL1 ;color 1? Yes.
LDA #0 ;get background
FILL1 PHA ;save color byte
LDA DPTBL,X ;table value
AND #$0F ;mask 4 bits
STA COUNT ;save as count
PLA ;restore color
FILL2 STA (INDX1),Y ;put bytes
STA (INDX2),Y ;onto screen
INY ;inc index
DEC COUNT ;dec byte count
BNE FILL2 ;done? No.
INX ;inc table index
LDA TEMP ;get flag
BPL DP1 ;new line? No.
SEC ;set carry
LDA INDX1 ;Yes. get low
SBC #40 ;subtract 40
STA INDX1 ;new low
BCS DPN1 ;overflow? No.
DEC INDX1+1 ;decrement high
DPN1 CLC ;clear carry
LDA INDX2 ;get low
ADC #40 ;add 40
STA INDX2 ;new low
BCC DP0 ;overflow? No.
INC INDX2+1 ;increment high
JMP DP0 ;continue
;
; ----------------
; Planet Draw Data
; ----------------
;
DPTBL .BYTE $EA,$EA,$EA,$EA
.BYTE $EA,$15,$A8,$54
.BYTE $C1,$15,$A8,$54
.BYTE $C1,$05,$A8,$50
.BYTE $C1,$05,$A8,$50
.BYTE $C1,$01,$A8,$40
.BYTE $C1,$81,$E8,$81
.BYTE $15,$A6,$54,$C1
.BYTE $81,$05,$A6,$50
.BYTE $C1,$81,$01,$A6
.BYTE $40,$C1,$82,$E6
.BYTE $82,$05,$A4,$50
.BYTE $C1,$83,$E4,$84
.BYTE $E2,0
;
; -------------------------
; Setup Orbiter Coordinates
; -------------------------
;
SETUP LDX #64 ;do 65 bytes
LDY #0 ;quad 2/4 offset
SU1 CLC ;clear carry
LDA #96 ;center Y
ADC OYTBL,X ;add offset Y
STA ORBY+$40,Y ;quad-2 Y
STA ORBY+$80,X ;quad-3 Y
LDA #80 ;center X
ADC OXTBL,X ;add offset X
STA ORBX,X ;quad-1 X
STA ORBX+$40,Y ;quad-2 X
SEC ;set carry
LDA #80 ;center X
SBC OXTBL,X ;sub offset X
STA ORBX+$80,X ;quad-3 X
STA ORBX+$C0,Y ;quad-4 X
LDA #96 ;center Y
SBC OYTBL,X ;sub offset Y
STA ORBY,X ;quad-1 Y
STA ORBY+$C0,Y ;quad-4 Y
INY ;quad 2/4 offset
DEX ;quad 1/3 offset
BPL SU1 ;done? No.
JMP INIT ;continue
;
; ---------------------------
; Orbiter X,Y Coordinate Data
; ---------------------------
;
OXTBL .BYTE 0,1,2,2,3
.BYTE 4,5,5,6,7
.BYTE 8,9,9,10,11
.BYTE 12,12,13,14,14
.BYTE 15,16,16,17,18
.BYTE 18,19,20,20,21
.BYTE 21,22,23,23,24
.BYTE 24,25,25,26,26
.BYTE 27,27,27,28,28
.BYTE 29,29,29,30,30
.BYTE 30,30,31,31,31
.BYTE 31,31,32,32,32
.BYTE 32,32,32,32,32
;
OYTBL .BYTE 54,54,54,54,54
.BYTE 54,54,54,53,53
.BYTE 53,52,52,52,51
.BYTE 51,50,50,49,49
.BYTE 48,47,47,46,45
.BYTE 44,44,43,42,41
.BYTE 40,39,38,38,37
.BYTE 36,35,33,32,31
.BYTE 30,29,28,27,26
.BYTE 24,23,22,21,20
.BYTE 18,17,16,15,13
.BYTE 12,11,9,8,7
.BYTE 5,4,3,1,0
;
; ----------------------
; Display list interrupt
; ----------------------
;
DLI PHA ;save Acc
TXA ;X --> Acc
PHA ;save X register
INC DLICNT ;inc counter
LDA DLICNT ;get counter
AND #$07 ;only 3 bits
TAX ;use as index
LDA DLIBRT,X ;planet bright
ORA PLNCOL ;planet color
STA WSYNC ;start of scan
STA COLPF0 ;color planet
LDA #$8C ;bright blue
STA COLPF0+1 ;shot color
PLA ;restore X
TAX ;Acc --> X
PLA ;restore Acc
RTI ;return
;
DLIBRT .BYTE 0,2,4,6 ;planet
.BYTE 8,6,4,2 ;brightness
;
; ----------------------
; Vertical blank routine
; ----------------------
;
VBLANK CLD ;clear decimal
LDX SAUCER ;saucer flag as
LDA P3COLR,X ;index 0 or 1
STA PCOLR0+3 ;saucer color
LDA #5 ;get 5
STA DLICNT ;reset DLI count
LDA #$C0 ;enable
STA NMIEN ;DLI's
LDA CH ;keyboard char
CMP #$21 ;space bar?
BNE PCHK ;No. skip it
LDA PAUSED ;pause flag
EOR #$FF ;invert it
STA PAUSED ;save pause flag
LDA #$FF ;get $FF
STA CH ;reset keyboard
PCHK LDA PAUSED ;pause flag
BEQ NOPAU ;paused? No.
LDA #0 ;get zero
LDX #7 ;do 8 bytes
NOSND STA AUDF1,X ;zero sound
DEX ;dec index
BPL NOSND ;done? No.
JMP XITVBV ;exit VBLANK
NOPAU LDA TITLE ;title flag
BNE NOCYC ;title? Yes.
LDA COLOR0+2 ;No. get color
CLC ;clear carry
ADC #$10 ;next color
STA COLOR0+2 ;explosion col.
NOCYC LDA EXSCNT ;explosion cnt
BEQ NOPAU2 ;any? No.
LSR A ;count/2
LSR A ;count/4
STA AUDC1+6 ;explo volume
LDA #40 ;explosion
STA AUDF1+6 ;explo frequency
DEC EXSCNT ;dec count
NOPAU2 LDA GAMCTL ;game control
BPL CURSOR ;cursor? Yes.
JMP TIMERS ;No. skip
;
; --------------
; Cursor handler
; --------------
;
CURSOR LDY CURY ;get y pos
LDX #5 ;clear 6 bytes
ERACUR LDA #$0F ;now clear out
AND MISL-3,Y ;old cursor
STA MISL-3,Y ;graphics,
INY ;next Y position
DEX ;dec count
BPL ERACUR ;loop until done
LDA STICK0 ;read joystick
LDX CURX ;get X value
LDY CURY ;get Y value
LSR A ;shift right
BCS NOTN ;North? No.
DEY ;move cursor up
DEY ;two scan lines
NOTN LSR A ;shift right
BCS NOTS ;South? No.
INY ;cursor down
INY ;two scan lines
NOTS LSR A ;shift right
BCS NOTW ;West? No.
DEX ;cursor left
NOTW LSR A ;shift right
BCS NOTE ;East? No.
INX ;cursor right
NOTE CPX #48 ;too far left?
BCC BADX ;Yes. skip next
CPX #208 ;too far right?
BCS BADX ;Yes. skip next
STX CURX ;No. it's ok!
BADX CPY #32 ;too far up?
BCC BADY ;Yes. skip next
CPY #224 ;too far down?
BCS BADY ;Yes. skip next
STY CURY ;No. it's ok!
BADY LDA DEVICE ;KOALA switch
BEQ NKOALA ;KOALA PAD?
JSR KOALA ;Yes. do it
NKOALA LDA PENFLG ;koala pen flg
BNE TIMERS ;pen up? Yes.
LDX #5 ;6 bytes...
LDY CURY ;get cursor Y
SHOCUR LDA CURPIC,X ;cursor pic
ORA MISL-3,Y ;mask missiles
STA MISL-3,Y ;store missiles
INY ;next scan line
DEX ;dec count
BPL SHOCUR ;done? No.
LDX CURX ;get x position,
DEX ;1 less for...
STX HPOSM0+3 ;missile 3
INX ;2 more for...
INX ;missile 2
STX HPOSM0+2 ;save position
;
; -----------------------
; Handle timers and orbit
; -----------------------
;
TIMERS LDA BOMBWT ;bomb wait cnt
BEQ NOBWT ;wait over? Yes.
DEC BOMBWT ;dec count
NOBWT LDA DEADTM ;death timer
BEQ NOTIM0 ;zero? yes.
DEC DEADTM ;decrement it!
NOTIM0 LDA EXPTIM ;exp timer
BEQ NOTIM1 ;zero? Yes.
DEC EXPTIM ;decrement it!
NOTIM1 LDA BOMTIM ;get bomb time
BEQ NOTIM2 ;zero? Yes.
DEC BOMTIM ;dec bomb time
NOTIM2 LDA GAMCTL ;game control
BPL NOTOVR ;game over? No.
JMP XITVBV ;exit VBLANK
NOTOVR LDA SATLIV ;get satellite
BEQ NOSAT ;alive? No.
INC SCNT ;inc count
LDY SCNT ;orbit index
CLC ;clear carry
LDA ORBX,Y ;get X coord
STA SATX ;save Pfield x
ADC #47 ;X offset
STA HPOSM0+1 ;horizontal pos
ADC #2 ;+2 offset for
STA HPOSM0 ;right side
LDA ORBY,Y ;get Y coord
LSR A ;divide by 2
STA SATY ;for playfield
ROL A ;restore for PM
ADC #36 ;screen offset
TAX ;use as index
INC SATPIX ;next sat. image
LDA SATPIX ;get number
AND #$08 ;use bit 3
TAY ;use as index
LDA #8 ;do 8 bytes
STA SATEMP ;save count
SSAT LDA MISL,X ;missile graphic
AND #$F0 ;mask off 1,2
ORA SATSH,Y ;add sat shape
STA MISL,X ;put player #1
DEX ;dec position
INY ;dec index
DEC SATEMP ;dec count
BNE SSAT ;done? No.
NOSAT LDA SAUCER ;saucer flag
BEQ SOUNDS ;saucer? No.
LDY BOMBY+3 ;saucer Y pos
DEY ;-1
DEY ;-2
LDX #9 ;10 scan lines
SSAULP CPY #32 ;above top?
BCC NXTSP ;Yes. skip it
CPY #223 ;below bottom?
BCS NXTSP ;Yes. skip it
LDA SAUPIC,X ;saucer image
STA PLR3,Y ;store player 3
NXTSP DEY ;next scan line
DEX ;dec index
BPL SSAULP ;done? No.
LDA BOMBX+3 ;saucer X pos
STA HPOSP0+3 ;move it
INC SAUTIM ;saucer time
LDA SAUTIM ;get counter
LSR A ;/2
AND #$03 ;use only 0..3
TAX ;as X index
LDA SAUMID,X ;saucer middle
STA SAUPIC+4 ;put in
STA SAUPIC+5 ;saucer image
SOUNDS LDX PSSCNT ;shot sound
BPL DOS1 ;shot? Yes.
LDA #0 ;No. get zero
STA AUDC1 ;volume for shot
BEQ TRYS2 ;skip next
DOS1 LDA #$A6 ;shot sound vol
STA AUDC1 ;set hardware
LDA PLSHOT,X ;shot sound
STA AUDF1 ;frequency
DEC PSSCNT ;dec shot snd
TRYS2 LDX ESSCNT ;enemy shots
BPL DOS2 ;shots? Yes.
LDA #0 ;No. get zero
STA AUDC1+2 ;into volume
BEQ TRYS3 ;skip rest
DOS2 LDA #$A6 ;shot sound vol
STA AUDC1+2 ;set hardware
LDA ENSHOT,X ;shot sound
STA AUDF1+2 ;frequency
DEC ESSCNT ;dec shot snd
TRYS3 LDA SAUCER ;saucer flag
BEQ NOS3 ;saucer? No.
LDA BOMBY+3 ;saucer Y pos
CMP #36 ;above top?
BCC NOS3 ;Yes. skip
CMP #231 ;below bottom?
BCC DOS3 ;No. make sound
NOS3 LDA #0 ;get zero
STA AUDC1+4 ;no saucer snd
BEQ VBDONE ;skip next
DOS3 INC SSSCNT ;inc saucer cnt
LDX SSSCNT ;saucer count
CPX #12 ;at limit?
BMI SETS3 ;No. skip next
LDX #0 ;get zero
STX SSSCNT ;zero saucer cnt
SETS3 LDA #$A8 ;saucer volume
STA AUDC1+4 ;set hardware
LDA SAUSND,X ;saucer sound
STA AUDF1+4 ;set hardware
VBDONE JMP XITVBV ;continue
;
; ---------------------
; Satellite shape table
; ---------------------
;
SATSH .BYTE 0,0,0,$0A
.BYTE $04,$0A,0,0
.BYTE 0,0,0,$04
.BYTE $0A,$04,0,0
;
;
; File: D:PLANET2.M65
;
; ----------------
; Initialize Misc.
; ----------------
;
INIT LDA #0 ;zero out..
STA SCORE ;score byte 0
STA SCORE+1 ;score byte 1
STA SCORE+2 ;score byte 2
STA DEADTM ;dead timer
STA PAUSED ;pause flag
STA EXPCNT ;expl. counter
STA SAUCER ;no saucer
STA BLEVEL ;bomb level
LDX #11 ;no bombs!
CLRACT STA BOMACT,X ;deactivate
DEX ;next bomb
BPL CLRACT ;done? No.
LDX #19 ;zero score line
INISLN LDA SCOINI,X ;get byte
STA SCOLIN,X ;put score line
DEX ;next byte
BPL INISLN ;done? No.
LDA #$01 ;get one
STA LEVEL ;game level
STA SATLIV ;live satellite
LDA #4 ;get 4
STA LIVES ;number of lives
LDA #$0C ;set explosion
STA COLOR0+2 ;brightness
LDA #$34 ;medium red
STA PCOLR0 ;bomb 0 color
STA PCOLR0+1 ;bomb 1 color
STA PCOLR0+2 ;bomb 2 color
LDA #127 ;center screen X
STA CURX ;cursor X pos
LDA #129 ;center screen Y
STA CURY ;cursor Y pos
LDA #1 ;get one
STA GAMCTL ;game control
JSR SHOSCO ;display score
LDA #$54 ;graphic-LF of
STA SCRN+1939 ;planet center
LDA #$15 ;graphic-RT of
STA SCRN+1940 ;planet center
STA HITCLR ;reset collision
;
; ----------------------
; Set up level variables
; ----------------------
;
SETLVL JSR SHOLVL ;show level
LDX BLEVEL ;bomb level
LDA INIBOM,X ;bombs / level
STA BOMBS ;bomb count
LDA INIBS,X ;bomb speed
STA BOMTI ;bomb timer
LDA INISC,X ;% chance of
STA SAUCHN ;saucer in level
LDA INIPC,X ;planet color
CMP #$FF ;level >14?
BNE SAVEPC ;No. skip next
LDA RANDOM ;random color
AND #$F0 ;mask off lum.
SAVEPC STA PLNCOL ;planet color
LDA INIBVL,X ;bomb value low
STA BOMVL ;save it
LDA INIBVH,X ;bomb value hi
STA BOMVH ;save it
LDA INISV,X ;saucer value
STA SAUVAL ;save that too
CPX #11 ;at level 11?
BEQ SAMLVL ;Yes. skip next
INC BLEVEL ;inc bomb level
SAMLVL SED ;decimal mode
LDA LEVEL ;game level #
CLC ;clear carry
ADC #1 ;add one
STA LEVEL ;save game level
CLD ;clear decimal
;
; -----------------
; Main program loop
; -----------------
;
LOOP LDA PAUSED ;game paused?
BNE LOOP ;Yes. loop here
LDA #0 ;get zero
STA ATRACT ;attract mode
LDA GAMCTL ;game done?
BPL CKCORE ;No. check core
LDA EXPCNT ;Yes. expl count
BNE CKCORE ;count done? No.
JMP ENDGAM ;The End!
;
; --------------------------
; Check planet core for hit!
; --------------------------
;
CKCORE LDA SCRN+1939 ;center LF
AND #$03 ;RT color clock
CMP #$03 ;explosion colr?
BEQ PLDEAD ;Yes. go dead
LDA SCRN+1940 ;center RT
AND #$C0 ;LF color clock
CMP #$C0 ;explosion colr?
BNE PLANOK ;No. skip next
;
; ---------------
; Planet is Dead!
; ---------------
;
PLDEAD LDA #0 ;get zero
STA BOMBS ;zero bombs
STA SATLIV ;satelite dead
LDA #$FF ;get #$FF
STA LIVES ;no lives left
STA GAMCTL ;game control
JSR SNDOFF ;no sound
;
; -------------
; Check console
; -------------
;
PLANOK LDA CONSOL ;get console
CMP #7 ;any pressed?
BEQ NORST ;No. skip next
JMP PLANET ;restart game!
;
; -----------------
; Projectile firing
; -----------------
;
NORST JSR BOMINI ;try new bomb
LDA SATLIV ;satellite stat
BEQ NOTRIG ;alive? No.
LDA STRIG0 ;get trigger
CMP LASTRG ;same as last VB
BEQ NOTRIG ;Yes. skip next
STA LASTRG ;No. save trig
CMP #0 ;pressed?
BNE NOTRIG ;No. skip next
JSR PROINI ;strt projectile
NOTRIG JSR BOMADV ;advance bombs
LDA EXPTIM ;do explosion?
BNE NOEXP ;no!
JSR CHKSAT ;satellite ok?
JSR CHKHIT ;any hits?
JSR EXPHAN ;handle expl.
JSR PROADV ;advance shots
LDA SAUCER ;saucer flag
BEQ RESTIM ;saucer? No.
JSR SSHOOT ;Yes. let shoot
RESTIM LDA #1 ;get one
STA EXPTIM ;reset timer
NOEXP LDA BOMBS ;# bombs to go
BNE LOOP ;any left? Yes.
LDA GAMCTL ;game control
BMI LOOP ;dead? Yes.
LDA BOMACT ;bomb 0 status
ORA BOMACT+1 ;bomb 1 status
ORA BOMACT+2 ;bomb 2 status
ORA BOMACT+3 ;bomb 3 status
BEQ JSL ;any bombs? No.
JMP LOOP ;Yes. continue
JSL JMP SETLVL ;setup new level
;
; ------------------------
; Initiate a new explosion
; ------------------------
;
NEWEXP LDA #64 ;1.07 seconds
STA EXSCNT ;expl sound cnt
INC EXPCNT ;one more expl
LDY EXPCNT ;use as index
LDA NEWX ;put X coord
STA XPOS,Y ;into X table
LDA NEWY ;put Y coord
STA YPOS,Y ;into Y table
LDA #0 ;init to zero
STA CNT,Y ;explosion image
RT1 RTS ;return
;
; ------------------------------
; Main explosion handler routine
; ------------------------------
;
EXPHAN LDA #0 ;init to zero
STA COUNTR ;zero counter
RUNLP INC COUNTR ;nxt explosion
LDA EXPCNT ;get explosion #
CMP COUNTR ;any more expl?
BMI RT1 ;No. return
LDX COUNTR ;get index
LDA #0 ;init plotclr
STA PLOTCLR ;0 = plot block
LDA CNT,X ;expl counter
CMP #37 ;all drawn?
BMI DOPLOT ;No. do it
INC PLOTCLR ;1 = erase block
SEC ;set carry
SBC #37 ;erase cycle
CMP #37 ;erase done?
BMI DOPLOT ;No. erase block
TXA ;move index
TAY ;to Y register
;
; ---------------------------
; Repack explosion table, get
; rid of finished explosions
; ---------------------------
;
REPACK INX ;next explosion
CPX EXPCNT ;done?
BEQ RPK2 ;No. repack more
BPL RPKEND ;Yes. exit
RPK2 LDA XPOS,X ;get X position
STA XPOS,Y ;move back X
LDA YPOS,X ;get Y position
STA YPOS,Y ;move back Y
LDA CNT,X ;get count
STA CNT,Y ;move back count
INY ;inc index
BNE REPACK ;next repack
RPKEND DEC EXPCNT ;dec pointers
DEC COUNTR ;due to repack
JMP RUNLP ;continue
DOPLOT INC CNT,X ;inc pointer
TAY ;exp phase in Y
LDA XPOS,X ;get X-coord
CLC ;clear carry
ADC COORD1,Y ;add X offset
STA PLOTX ;save it
CMP #160 ;off screen?
BCS RUNLP ;Yes. don't plot
LDA YPOS,X ;get Y-coord
ADC COORD2,Y ;add Y offset
STA PLOTY ;save it
CMP #96 ;off screen?
BCS RUNLP ;Yes. don't plot
JSR PLOT ;get plot addr
LDA PLOTCLR ;erase it?
BNE CLEARIT ;Yes. clear it
LDA PLOTBL,X ;get plot bits
ORA (LO),Y ;alter display
PUTIT STA (LO),Y ;and replot it!
JMP RUNLP ;exit
CLEARIT LDA ERABIT,X ;erase bits
AND (LO),Y ;turn off pixel