-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathLivewire.asm
More file actions
2161 lines (2034 loc) · 50.9 KB
/
Livewire.asm
File metadata and controls
2161 lines (2034 loc) · 50.9 KB
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
; ===========================
; LIVEWIRE
; ===========================
; ===========================
; WRITTEN BY: TOM HUDSON
; A.N.A.L.O.G. COMPUTING #12
; ===========================
; ---------------
; PAGE ZERO USAGE
; ---------------
ORG $80
LO DS 1
HI DS 1
PLOTX DS 1 ;PLOT X VALUE
PLOTY DS 1 ;PLOT Y VALUE
COLOR DS 1 ;PLOT COLOR
DRAWX DS 1 ;DRAWTO X
DRAWY DS 1 ;DRAWTO Y
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 ;DRAW ENDPOINT
HOLD DS 1 ;WORK AREA
XWORK DS 1
YWORK DS 1
GRID DS 1 ;GRID # WORK
OFFSET DS 1 ;GRID OFFSET
PMTIME DS 1 ;PLAYER MOVE TIMER
PLRGRD DS 1 ;PLAYER GRID#
PLRY DS 1 ;PLAYER Y POS.
GRIDNO DS 1 ;GRID #
LAST DS 1 ;GRID...
NEXT DS 1 ;DIVIDE...
STEP DS 1 ;WORK...
DEST DS 1 ;AREAS
VBXHLD DS 1 ;X HOLD
PFTIME DS 1 ;PLAYER FIRE TIMER
ENDVAL DS 1 ;WORK AREA
MISNUM DS 1 ;MISSILE #
PRFLIP DS 1 ;PROJ. FLIP FLAG
PRADVT DS 1 ;PROJ. MOVE TIMER
PRADV1 DS 1 ;PROJ. TIMER
TIMER DS 1 ;GENERAL TIMER
INTRFG DS 1 ;INTRO FLAG
BCDLVL DS 1 ;LEVEL #
SHCOLR DS 1 ;CHAR. COLOR
SHOBYT DS 1 ;CHAR. BYTE POS.
YOFSET DS 1 ;PLOT Y OFFSET
OBTIM1 DS 1 ;OBJECT MOVE TIMER
OBJNUM DS 1 ;OBJECT #
SHAPIX DS 1 ;OBJ. SHAPE INDEX
LENGTH DS 1 ;OBJ. LENGTH
XI DS 1 ;OBJ. X INCREMENT
YI DS 1 ;OBJ. Y INCREMENT
SHAPCT DS 1 ;OBJ. SHAPE CNT.
HLDGRD DS 1 ;OBJ. GRID WORK
PAUFLG DS 1 ;PAUSE FLAG
ZAP DS 1 ;ZAP FLAG
SAVEX DS 1 ;WORK AREA
SAVEY DS 1 ;WORK AREA
FLASHY DS 1 ;OBJ. FLASH POS.
FLTIME DS 1 ;FLASH TIME
SP1IX DS 1 ;PLAYER...
SP2IX DS 1 ;SHAPE...
SP3IX DS 1 ;INDEX...
SPIX DS 1 ;AREAS
PLTBYT DS 1 ;PLYR. IMAGE BYTE
PSCNT DS 1 ;PLYR. SHAPE COUNT
KILPLR DS 1 ;KILL PLYR FLAG
PAVAIL DS 1 ;# PROJ. AVAILABLE
TRANTM DS 1 ;TRANSIENT TIMER
DESTLO DS 1 ;DESTINATION...
DESTHI DS 1 ;ADDRESS
SHFLIP DS 1 ;SHORT FLIP FLAG
DESTNM DS 1 ;SHORT PLYR #
CPYST DS 1 ;SHORT IMAGE START
DMAC1 DS 1 ;DMA CTRL WORK
GRAC1 DS 1 ;GRAPHICS CTRL WK.
GRIDIX DS 1 ;GRID INDEX
LIVES DS 1 ;LIVES LEFT
GRDADJ DS 1 ;GRID...
GRDWK DS 1 ;DRAW...
GRDWK2 DS 1 ;WORK...
GRDNUM DS 1 ;AREAS
OBJSPD DS 1 ;OBJ. SPEED
JOYPAD DS 1 ;STICK/PADDLE
CPYCNT DS 1 ;SHORT COPY CNT.
BONUS DS 1 ;BONUS VALUE
FIRSOU DS 1 ;FIRE SOUND COUNT
OBDSOU DS 1 ;OBJ. DEATH SOUND
MOVSOU DS 1 ;PLYR MOVE SOUND
PRYHLD DS 4 ;PROJ. Y HOLDS
SCORE DS 3 ;SCORE
SCOADD DS 3 ;SCORE ADD VALUE
MISCAD DS 1 ;MISC. SCORE ADD
NUMOBJ DS 5 ;OBJECTS LEFT
DIFF DS 1 ;DIFFICULTY ADJUST
OBJPRS DS 6 ;OBJ PRESENT FLAGS
; --------------------
; MISCELLANEOUS MEMORY
; --------------------
PMAREA = $0000 ;P/M AREA
MISSLS = PMAREA+768
PL0 = PMAREA+1024
PL1 = PMAREA+1280
PL2 = PMAREA+1536
PL3 = PMAREA+1792
DISP = $0800 ;DISPLAY
; --------------
; SYSTEM EQUATES
; --------------
VDSLST = $200 ;DLI VECTOR
WSYNC = $D40A ;WAIT/SYNC
PTRIG0 = $27C ;PADDLE TRIG.
POT0 = $270 ;PADDLE 0
KEY = $2FC ;KEYBOARD
CONSOL = $D01F ;CONSOLE BUTTONS
PMBASE = $D407 ;P/M BASE ADDR
RANDOM = $D20A ;RANDOM #
SETVBV = $E45C ;VBLANK SET
XITVBV = $E462 ;VBLANK EXIT
COLBK = $2C8 ;COLORS
COLPF0 = $2C4
COLPF1 = $2C5
COLPF2 = $2C6
COLPF3 = $2C7
AUDC1 = $D201 ;AUDIO CONTROL
AUDC2 = $D203
AUDC3 = $D205
AUDC4 = $D207
AUDF1 = $D200 ;AUDIO FREQUENCY
AUDF2 = $D202
AUDF3 = $D204
AUDF4 = $D206
AUDCTL = $D208 ;MAIN AUDIO CTRL.
PRIOR = $026F ;PRIORITY
ATTRAC = $4D ;ATTRACT MODE
DMACTL = $22F ;DMA CONTROL
DLISTL = $230 ;DISP. LIST
GRACTL = $D01D ;GRAPHICS CTRL.
NMIEN = $D40E ;INTERRUPT ENABLE
COLPM0 = $2C0 ;PLAYER COLORS
COLPM1 = $2C1
COLPM2 = $2C2
COLPM3 = $2C3
HPOSP0 = $D000 ;PLAYER POSITIONS
HPOSP1 = $D001
HPOSP2 = $D002
HPOSP3 = $D003
HPOSM0 = $D004 ;MISSILE POSITIONS
HITCLR = $D01E ;COLLISION CLEAR
P0PL = $D00C ;PL0 TO PLAYER COLL.
STICK = $278 ;JOYSTICK
STRIG = $284 ;STICK TRIGGER
ORG $2000
; ----------------------
; MAIN GAME DISPLAY LIST
; ----------------------
DLIST DB $70,$F0,$70,$4E
DW DISP
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E
DB $4E
DW DISP+$800
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E,$E
DB $E,$E,$E,$E,$E,$E,$E
DB $80,$00
DB $47
DW INFOLN
DB $41
DW DLIST
; -------------------------
; TITLE SCREEN DISPLAY LIST
; -------------------------
TITLDL DB $70,$70,$70,$70,$70,$70
DB $70,$47
DW LASTSC
DB $70,$70,$46
DW MAGMSG
DB $70,$47
DW TITLE
DB $30,$46
DW AUTHOR
DB $70,$70,$30,$46
CONTRL DW JOYMSG
DB $41
DW TITLDL
; -----------------------
; DISPLAY LIST INTERRUPTS
; -----------------------
DLI1 PHA ;SAVE ACCUM
LDA GRAC1 ;GET GR. CTRL
STA WSYNC ;WAIT FOR SYNC
STA GRACTL ;STORE IT
LDA DMAC1 ;GET AND SAVE
STA $D400 ;DMA CTRL
LDA #DLI2&255 ;POINT...
STA VDSLST ;TO...
LDA #DLI2/256 ;NEXT...
STA VDSLST+1 ;DLI!
PLA ;GET ACCUM
RTI ;AND EXIT!
DLI2 PHA ;SAVE ACCUM
LDA #$0A ;GET WHITE
STA WSYNC ;WAIT FOR SYNC
STA $D016 ;PUT IN COLOR 0
LDA #$74 ;PUT BLUE...
STA $D017 ;IN COLOR 1
LDA #$28 ;PUT ORANGE...
STA $D018 ;IN COLOR 2
LDA #$3D ;SET UP...
STA $D400 ;DMA CTRL
PLA ;GET ACCUM.
RTI ;AND EXIT
; ---------------
; SCREEN MESSAGES
; ---------------
INFOLN DB 0,0,0,0,0,0,0,0
DB 0,0,$6C,$76,$6C,0,0,0
MAGMSG DB $21,$2E,$21,$2C,$2F,$27
DB 0,$23,$2F,$2D,$30,$35
DB $34,$29,$2E,$27
TITLE DB 0,0,0,0,$6C,$69,$76,$65
DB $77,$69,$72,$65,0,0,0,0
AUTHOR DB 0,$A2,$B9,0,0,$B4,$AF
DB $AD,0,$A8,$B5,$A4,$B3
DB $AF,$AE,0
JOYMSG DB 0,0,0,0,$EA,$EF,$F9,$F3
DB $F4,$E9,$E3,$EB,0,0,0,0
PADMSG DB 0,0,0,0,0,$F0,$E1,$E4
DB $E4,$EC,$E5,0,0,0,0,0
LASTSC DB 0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0
; ----------
; PROG START
; ----------
LIVE CLD
JSR $E465 ;INIT SOUND
LDA #0 ;CLEAR PAGE 0
LDX #127
CPAGE0 STA $80,X
DEX
BPL CPAGE0
LDA #1 ;INIT...
STA BCDLVL ;LEVEL #
STA INTRFG ;SET INTRO FLAG
LDA #JOYMSG&255 ;DEFAULT...
STA CONTRL ;CONTROL...
LDA #JOYMSG/256 ;IS...
STA CONTRL+1 ;STICK!
LDA #0 ;INIT...
STA DMACTL ;DMA
STA NMIEN ;INTERRUPTS
STA AUDCTL ;AUDIO
STA HITCLR ;COLLISION
STA COLBK ;BACKGND COLOR
LDX #3 ;CLEAR SHORTS
CLRSHO STA SHORTF,X
DEX
BPL CLRSHO
LDX #5 ;ZERO OBJECT...
CLRDED STA OBDEAD,X ;CLR DEAD TABLE
DEX
BPL CLRDED
LDX #2 ;ZERO SCORE
CLRSCO STA SCORE,X
STA SCOADD,X
DEX
BPL CLRSCO
LDX #7
CLRPRJ STA PROJAC,X ;CLEAR PROJ.
DEX
BPL CLRPRJ
LDX #5
MOVSCO LDA INFOLN,X ;COPY SCORE...
STA LASTSC+5,X ;TO LAST...
DEX ;SCORE LINE
BPL MOVSCO
LDA #29 ;SET ALL...
LDX #5 ;OBJECTS TO...
INIOBS STA OBJSEG,X ;SEGMENT # 29
DEX
BPL INIOBS
JSR SHOSCO ;SHOW SCORE
JSR SNDOFF ;NO SOUNDS
LDA #6 ;6 PROJECTILES
STA PAVAIL ;AVAILABLE
LDA #2 ;SET...
STA BONUS ;BONUS=20000
STA LIVES ;2 EXTRA LIVES
JSR SHOLIV ;SHOW LIVES LEFT
LDA #5 ;SET UP...
STA SP2IX ;PLAYER...
LDA #10 ;SHAPE...
STA SP3IX ;INDEXES
LDA #TITLDL&255 ;POINT TO...
STA DLISTL ;TITLE...
LDA #TITLDL/256 ;DISPLAY...
STA DLISTL+1 ;LIST
LDY #VBI&255 ;POINT TO...
LDX #VBI/256 ;VERTICAL...
LDA #7 ;BLANK...
JSR SETVBV ;INTERRUPT
LDA #PMAREA/256 ;SET UP P/M...
STA PMBASE ;BASE ADDRESS
JSR PMCLR ;CLEAR P/M
LDA #$74 ;PUT BLUE...
STA COLPF0 ;IN COLOR 0
LDA #$C4 ;PUT GREEN...
STA COLPF1 ;IN COLOR 1
LDA #$0A ;PUT WHITE...
STA COLPF2 ;IN COLOR 2
LDA #$34 ;PUT RED...
STA COLPF3 ;IN COLOR 3
LDA #$3D ;SET UP...
STA DMACTL ;DMA,
LDA #3 ;GRAPHICS,
STA GRACTL ;AND
LDA #$C0 ;INTERRUPT...
STA NMIEN ;ENABLE
LDA #$11 ;SET P/M...
STA PRIOR ;PRIORITY
LDA #$0F ;PUT WHITE...
STA COLPM1 ;IN PLAYER 1,
STA COLPM2 ;PLAYER 2
STA COLPM3 ;AND 3
LDA #$16 ;PUT YELLOW...
STA COLPM0 ;IN PLAYER 0
; ------------
; INTRO SCREEN
; ------------
INTRO LDA CONSOL ;START KEY...
AND #1 ;PRESSED?
BNE CKSEL ;NO!
GOCHEK LDA CONSOL ;START KEY...
AND #1 ;RELEASED?
BEQ GOCHEK ;NO, WAIT.
JMP DIGIN ;GO DIG IN!!
CKSEL LDA CONSOL ;SELECT KEY...
AND #2 ;PRESSED?
BNE INTRO ;NAW, LOOP BACK.
LDA JOYPAD ;TOGGLE...
CLC ;STICK/PADDLE...
ADC #1 ;INDICATOR...
AND #1
STA JOYPAD
TAX
LDA JPLO,X ;AND SHOW...
STA CONTRL ;CONTROLLER...
LDA JPHI,X ;MESSAGE...
STA CONTRL+1 ;ON SCREEN!
LDA #30 ;30 JIFFY...
JSR WAIT ;WAIT!
JMP INTRO ;AND LOOP.
; ---------------------------
; HERE'S WHERE PROGRAM STARTS
; ---------------------------
DIGIN LDA #DLIST&255 ;POINT TO...
STA DLISTL ;GAME...
LDA #DLIST/256 ;DISPLAY...
STA DLISTL+1 ;LIST
LDA #0 ;NO LONGER IN...
STA INTRFG ;INTRO
FOREVR LDA #1 ;WE WANT...
STA COLOR ;COLOR 1
STA ZAP ;RESET ZAP.
JSR CLRSC ;CLEAR SCREEN
LDA GRIDIX ;GET GRID#
AND #7 ;FIND WHICH...
TAX ;GRID SHAPE...
LDA GRDTBL,X ;TO DRAW...
STA GRDNUM ;AND STORE
JSR SHOLVL ;SHOW LEVEL#
JSR DRGRID ;DRAW GRID!
CONWT LDA PAUFLG ;WE PAUSED?
BNE CONWT ;YUP, LOOP.
LDA KILPLR ;PLAYER DEAD?
BEQ PLIVE ;NOPE!
JSR DECLIV ;ONE LESS LIFE!
PLIVE STA ATTRAC ;CANCEL ATTRACT!
LDA FLTIME ;FLASH GOING?
BNE NOFEND ;YES! STORE...
STA HPOSP1 ;FLASH POSITION!
NOFEND LDA OBTIM1 ;OBJECTS MOVING?
BNE NOOHAN ;NOT YET!
LDA OBJSPD ;RESET MOVE...
STA OBTIM1 ;TIMER
; ----------------------
; COPY OBJECT KILL TABLE
; ----------------------
LDX #5 ;THIS SECTION
COPDED LDA OBDEAD,X ;COPIES THE
STA OBDED2,X ;OBJECT KILL
LDA #0 ;TABLE WHICH IS
STA OBDEAD,X ;SET UP BY THE
DEX ;PROJECTILE
BPL COPDED ;HANDLER
LDA MISCAD ;MISC.SCORE?
BEQ NOMSCO ;NO!
STA SCOADD+1 ;SET SCORE ADD...
JSR ADDSCO ;AND ADD IT!
LDA #0 ;THEN RESET THE
STA MISCAD ;ADD VALUE.
NOMSCO LDX #5 ;THIS SECTION
LDA #0 ;TALLIES ALL
CKOBLV ORA OBJPRS,X ;OBJECTS THAT
DEX ;ARE ALIVE
BPL CKOBLV
LDX #4 ;NOW TALLY
CKOBWT ORA NUMOBJ,X ;ALL OBJECTS
DEX ;THAT ARE NOT
BPL CKOBWT ;ON GRID YET
CMP #0 ;ANY OBJECTS?
BEQ LVLEND ;NO, END OF LEVEL!
LDX #5 ;IS OBJECT
GENNOL LDA OBJPRS,X ;PRESENT?
BNE NXTOGN ;YES, TRY NEXT.
TRYTYP LDA RANDOM ;LET'S TRY TO
AND #7 ;START UP A
CMP #5 ;NEW OBJECT
BCS TRYTYP ;GET A TYPE
TAY ;ANY OF THAT
LDA NUMOBJ,Y ;TYPE WAITING?
BEQ NXTOGN ;NO, TRY NEXT
SEC ;DECREMENT #
SBC #1 ;OF OBJECTS
STA NUMOBJ,Y ;WAITING.
TYA ;THEN SET
STA OBJTYP,X ;OBJECT TYPE.
NEWGRD LDA RANDOM ;GET A RANDOM
AND #$0F ;SUB-GRID
CMP #15 ;NUMBER
BEQ NEWGRD
STA OBJGRD,X ;AND SAVE IT
LDA #30 ;PUT OBJECT AT
STA OBJSEG,X ;FAR END OF GRID
LDA #1 ;SET UP...
STA OBJINC,X ;OBJ. INCREMENT
STA OBJPRS,X ;OBJECT PRESENT
NXTOGN DEX ;LOOP BACK TO DO
BPL GENNOL ;NEXT OBJECT
JSR OBJHAN ;HANDLE OBJECTS
JSR SHOHAN ;HANDLE SHORTS
NOOHAN LDA CONSOL ;ANY CONSOLE
CMP #7 ;KEYS PRESSED?
BEQ JCONWT ;NOPE!
JMP LIVE ;YES, RESTART GAME
JCONWT JMP CONWT ;INDIRECT JUMP
LVLEND LDA GRIDIX ;ARE WE ON
CMP #63 ;GRID #63?
BEQ NOGRDI ;YES, DON'T INC!
CLC ;INCREMENT
ADC #1 ;GRID #
STA GRIDIX ;AND SAVE IT.
AND #7 ;ADD 2 TO
BNE NODIFI ;DIFFICULTY IF
INC DIFF ;ON A MULTIPLE
INC DIFF ;OF 8 GRIDS.
NODIFI SED ;INCREMENT
LDA BCDLVL ;BCD LEVEL #
CLC
ADC #1
STA BCDLVL
CLD ;NOW GO TO
NOGRDI JMP FOREVR ;DRAW NEW GRID.
; --------------
; OBJECT HANDLER
; --------------
OBJHAN LDA OBJNUM ;INCREMENT
CLC ;OBJECT #
ADC #1
CMP #6 ;DONE?
BNE STONUM ;NO, CONTINUE.
LDA #$FF ;RESET
STA OBJNUM ;OBJECT #
RTS ;AND EXIT.
STONUM STA OBJNUM ;SAVE OBJ #
OBHLP1 LDX OBJNUM ;GET OBJ #
LDA OBJPRS,X ;OBJ PRESENT?
BEQ OBJHAN ;NO!
OBLIVE LDA OBJSEG,X ;WITHIN 2 UNITS
CMP #2 ;OF RIM?
BCC NOOBFI ;YES, DON'T FIRE
LDA RANDOM ;RANDOM CHANCE
AND #$0F ;OF SHOOTING
BNE NOOBFI ;DON'T SHOOT
LDA PROJAC ;PROJ. 0 ACTIVE?
BNE TRYPR1 ;YES, IGNORE!
LDY #0 ;FORCE BRANCH
BEQ STOBFI ;TO STORE IT
TRYPR1 LDA PROJAC+1 ;PROJ. 1 ACTIVE?
BNE NOOBFI ;YES, NO FIRE
LDY #1 ;SET INDEX
STOBFI LDA OBJSEG,X ;INITIALIZE
LSR A ;PROJECTILE
STA PROJSG,Y ;SEGMENT #
LDA OBJGRD,X ;AND
STA PROGRD,Y ;SUB-GRID #
ASL A ;MULTIPLY
ASL A ;BY
ASL A ;16
ASL A ;AND
STA PROJGN,Y ;SAVE INDEX!
LDA #$FF ;SET INCREMENT
STA PROINC,Y ;(TOWARD RIM)
LDA #21 ;START THE
STA FIRSOU ;FIRE SOUND
LDA #1 ;AND
STA PROJAC,Y ;PROJECTILE
NOOBFI LDA #0 ;SET COLOR 0
STA COLOR ;TO ERASE OBJECT
JSR DRWOBJ ;AND ERASE IT
LDX OBJNUM
LDA OBDED2,X ;OBJ DEAD?
BEQ NOOKIL ;YES! START
JSR FLASH ;DEATH FLASH
LDX OBJNUM
LDY OBJTYP,X ;GET OBJECT TYPE
LDA POINT1,Y ;GET POINTS
STA SCOADD+1 ;AND READY
LDA POINT2,Y ;THE SCORE
STA SCOADD+2 ;ADD VALUE
JSR ADDSCO ;ADD TO SCORE!
LDX OBJNUM
JMP KILOBJ ;THEN KILL OBJ.
NOOKIL LDA OBJSEG,X ;INCREMENT
SEC ;OBJECT'S
SBC OBJINC,X ;SEGMENT
STA OBJSEG,X ;POSITION
BMI KILOBJ ;PAST RIM!
CMP #30 ;TYPE 3 PAST END?
BNE NOTOT3 ;NOPE!
INC NUMOBJ+2 ;START TYPE 2
BNE KILOBJ ;FORCE BRANCH
NOTOT3 CMP #10 ;AT TYPE 3 TURN?
BNE OBHLP2 ;NO!
LDA OBJTYP,X ;IS IT
CMP #3 ;TYPE 3?
BNE OBHLP2 ;NO!
LDA #$FF ;REVERSE OBJECT
STA OBJINC,X ;INCREMENT
OBHLP2 LDA OBJTYP,X ;IS OBJECT
CMP #2 ;TYPE 2?
BNE SETHUE ;NO, SET COLOR
LDA RANDOM ;GET RANDOM
AND #1 ;DIRECTION
TAY ;FOR TYPE 2
LDA OBJGRD,X ;AND
CLC ;ADD OR
ADC ADDSB1,Y ;SUBTRACT 1
CMP #15 ;PAST LIMIT?
BCS SETHUE ;YES!
STA OBJGRD,X ;SAVE NEW POS.
SETHUE LDA OBJTYP,X ;GET OBJ. TYPE
TAX ;AND GET
LDA OBJHUE,X ;COLOR #
STA COLOR ;SAVE IT
JSR DRWOBJ ;AND DRAW OBJECT!
JMP OBJHAN ;DO NEXT ONE
KILOBJ LDA #0 ;OBJECT IS NO
STA OBJPRS,X ;LONGER ALIVE
LDA #21 ;SET UP
STA OBDSOU ;DEATH SOUND
LDA OBJSEG,X ;CHECK
BPL JOBHAN ;FOR A
LDA OBJGRD,X ;COLLISION
CMP PLRGRD ;WITH PLAYER
BNE CKSHOR ;NO HIT
LDA #1 ;HIT,
STA KILPLR ;KILL PLAYER!
BNE JOBHAN ;NEXT OBJECT
CKSHOR LDA OBJTYP,X ;OBJECT
CMP #1 ;TYPE 1?
BNE JOBHAN ;NOPE!
LDY #3 ;TRY SHORT:
TRYSHO LDA SHORTF,Y ;SHORT AVAILABLE?
BEQ INISHO ;YUP!
DEY ;KEEP...
BPL TRYSHO ;TRYING!
BMI JOBHAN ;NO SHORT AVAIL!
INISHO LDA OBJGRD,X ;MULTIPLY THE
ASL A ;OBJECT'S
ASL A ;SUB-GRID #
ASL A ;BY 16...
ASL A
CLC
ADC #8 ;AND ADD 8 FOR
STA SHORTX,Y ;THE SHORT INDEX
LDA #1 ;SHORT IS
STA SHORTF,Y ;ALIVE!
LDA RANDOM ;RANDOMIZE...
AND #1 ;SHORT...
STA SHORTD,Y ;DIRECTION
LDA RANDOM ;AND THAT...
AND #$3F ;DIRECTION'S...
STA SHORTT,Y ;TIME!
JOBHAN JMP OBJHAN ;NEXT OBJECT
DRWOBJ LDX OBJNUM ;GET OBJECT #
LDA OBJGRD,X ;GET SUB-GRID #
ASL A ;MULTIPLY
ASL A ;BY 16...
ASL A
ASL A
STA HLDGRD ;AND SAVE.
LDA OBJSEG,X ;DIVIDE
LSR A ;SEGMENT BY 2
BCS ODDSEG ;PROCESS ODD #
CLC ;IT'S EVEN, ADD
ADC HLDGRD ;GRID INDEX
TAY ;PUT IN Y REG.
LDA SEGX,Y ;GET OBJECT'S
STA PLOTX ;X POSITION
STA SAVEX ;AND SAVE
LDA SEGY,Y ;GET OBJECT'S
STA PLOTY ;Y POSITION
STA SAVEY ;AND SAVE
JMP ODDSKP ;SKIP ODD ROUTINE
ODDSEG CLC ;IT'S ODD, ADD
ADC HLDGRD ;GRID INDEX
TAY ;PUT IN Y REG.
LDA SEGX,Y ;GET OBJECT'S
CLC ;X POS, ADD
ADC SEGX+1,Y ;NEXT X POS.
ROR A ;GET AVERAGE
STA PLOTX ;PUT IN PLOT X
STA SAVEX ;AND SAVE
LDA SEGY,Y ;GET OBJECT'S
CLC ;Y POS, ADD
ADC SEGY+1,Y ;NEXT Y POS.
ROR A ;GET AVERAGE
STA PLOTY ;PUT IN PLOT Y
STA SAVEY ;AND SAVE
ODDSKP LDA #30 ;NOW CALCULATE
SEC ;THE OBJECT'S
SBC OBJSEG,X ;SIZE BASED ON
LSR A ;ITS POSITION
AND #$FE ;ON THE GRID
ASL A
ASL A
TAY ;PUT INDEX IN Y
LDX #0 ;NOW COPY PART
COPYSZ LDA SIZTBL,Y ;OF THE SIZE
STA SIZEWK,X ;TABLE TO A
INY ;SIZE WORK AREA
INX ;THIS TABLE HOLDS
CPX #8 ;8 SIZE VALUES
BNE COPYSZ ;BASED ON DIST.
LDX OBJNUM ;GET OBJECT #
LDA OBJTYP,X ;AND ITS TYPE
ASL A ;AND MULTIPLY
ASL A ;BY 8 FOR AN
ASL A ;INDEX INTO
STA SHAPIX ;THE SHAPE TABLE
LDA #8 ;MAX 8 LINES IN
STA SHAPCT ;EACH OBJECT
DOBLP LDX SHAPIX ;GET LINE#
LDA OBJDIR,X ;& ITS DIRECTION
TAY ;A NEGATIVE #
BMI ENDOBJ ;INDICATES END
LDA PXINC,Y ;GET X INCREMENT
STA XI ;OF LINE,
LDA PYINC,Y ;Y INCREMENT
STA YI ;OF LINE,
LDA OBJLEN,X ;ABSOLUTE LENGTH
TAY ;OF LINE THEN
LDA SIZEWK,Y ;SCALED LENGTH
STA LENGTH ;AND STORE!
PLOTOB LDA PLOTX ;THIS SECTION
CLC ;ADJUSTS THE
ADC XI ;X AND Y PLOT
STA PLOTX ;VALUES...
LDA PLOTY
CLC
ADC YI
STA PLOTY
LDA SHAPIX ;DON'T PLOT
BEQ NOPLT1 ;FIRST LINE!
JSR PLOTCL ;PLOT POINT
NOPLT1 LDA PLOTY ;INCREMENT Y
CLC ;AGAIN TO ADJUST
ADC YI ;FOR GR. 7+
STA PLOTY ;ASPECT RATIO
LDA SHAPIX ;DON'T PLOT
BEQ NOPLT2 ;FIRST LINE
JSR PLOTCL ;PLOT POINT
NOPLT2 DEC LENGTH ;END OF LINE?
BPL PLOTOB ;NOPE!
INC SHAPIX ;NEXT LINE
DEC SHAPCT ;LAST LINE?
BNE DOBLP ;NOT YET!
ENDOBJ RTS ;ALL DONE!
; -------------
; SHORT HANDLER
; -------------
SHOHAN LDX #3 ;MAX. 4 SHORTS
SHHANL LDA SHORTF,X ;SHORT ALIVE?
BEQ HANNXS ;NO, DO NEXT
LDY SHORTD,X ;GET SHORT DIR.
LDA SHORTX,X ;GET X POS.
CLC ;AND ADJUST
ADC ADDSUB,Y ;POSITION
CMP #240 ;ON GRID?
BCS RESSHD ;NO! DON'T MOVE
STA SHORTX,X ;OK, SAVE POS.
DEC SHORTT,X ;DIRECTION CHANGE?
BPL HANNXS ;NO!
RESSHD LDA RANDOM ;GET A RANDOM
AND #$3F ;DIRECTION TIME
STA SHORTT,X ;0-63 & SAVE
AND #1 ;RANDOM DIRECTION
STA SHORTD,X ;0-1 & SAVE
HANNXS DEX ;MORE SHORTS?
BPL SHHANL ;YUP!
RTS ;ALL DONE!
; ------------
; ADD TO SCORE
; ------------
ADDSCO LDY #0 ;GET ZERO
SED ;SET DECIMAL MODE
LDA SCORE+2 ;THIS SECTION
CLC ;INCREMENTS
ADC SCOADD+2 ;THE 3-DIGIT
STA SCORE+2 ;SCORE USING
STY SCOADD+2 ;THE 3-DIGIT
LDA SCORE+1 ;SCORE ADD
ADC SCOADD+1 ;AREA, THEN
STA SCORE+1 ;ZEROS OUT
STY SCOADD+1 ;THE
LDA SCORE ;SCORE ADD
ADC SCOADD ;AREA USING
STA SCORE ;THE
STY SCOADD ;Y REGISTER.
CLD ;CLR DECIMAL MODE
JSR SHOSCO ;SHOW SCORE
LDA SCORE ;IS SCORE AT
CMP BONUS ;BONUS LEVEL?
BNE NOBONS ;SORRY!
JSR INCLIV ;BONUS, ADD LIFE!
SED ;SET DECIMAL
LDA BONUS ;GET OLD BONUS
CLC ;ADD 20000
ADC #2 ;TO IT
CLD ;CLR DECIMAL
STA BONUS ;AND SAVE BONUS
NOBONS RTS ;FINIS!
; ----------
; SHOW SCORE
; ----------
SHOSCO LDA #$10 ;SET UP COLOR
STA SHCOLR ;BYTE FOR SHOW
LDX #0 ;ZERO X
LDY #0 ;& Y REGS
SSCOLP LDA SCORE,Y ;GET SCORE BYTE
JSR SHOBCD ;SHOW IT
INX ;INCREMENT SHOW
INX ;POS. BY 2
INY ;NEXT SCORE BYTE
CPY #3 ;DONE?
BNE SSCOLP ;NOT YET!
RTS ;ALL DONE!
; ---------------
; INCREMENT LIVES
; ---------------
INCLIV LDA LIVES ;DO WE HAVE
CMP #5 ;5 LIVES NOW?
BEQ NOMOLV ;YUP, NO INC!
INC LIVES ;ONE MORE LIFE
JSR SHOLIV ;SHOW IT
NOMOLV RTS ;AND EXIT!
; ---------------
; DECREMENT LIVES
; ---------------
DECLIV JSR SNDOFF ;NO SOUND
; ---------------------------
; WAIT FOR PROJECTILES TO END
; ---------------------------
WAITPD LDX #7 ;8 PROJECTILES
LDA #0 ;ZERO TALLY
CKPRLV ORA PROJAC,X ;CHECK ALL
DEX ;PROJECTILES
BNE CKPRLV ;FOR ACTIVITY
CMP #0 ;ANY ACTIVE?
BNE WAITPD ;YES! WAIT MORE!
; -----------
; STOP SHORTS
; -----------
LDX #3 ;4 SHORTS (0-3)
STPSHO STA SHORTF,X ;TURN OFF
DEX ;ALL OF 'EM
BPL STPSHO ;LOOP UNTIL DONE
; --------------------------
; PUT OBJECTS AT END OF GRID
; --------------------------
LDA #0 ;ERASE
STA COLOR ;COLOR
LDA #5 ;ERASE ALL 6
STA OBJNUM ;OBJECTS
ERSOBJ JSR DRWOBJ ;ERASE IT!
LDX OBJNUM ;GET OBJECT #
LDA #30 ;PLACE AT
STA OBJSEG,X ;SEG #30
LDA #1 ;SET UP MOVE
STA OBJINC,X ;INCREMENT
RNDOBG LDA RANDOM ;GET RANDOM
AND #$0F ;SUB-GRID #
CMP #$0F ;0-14
BEQ RNDOBG
STA OBJGRD,X
DEC OBJNUM ;MORE OBJECTS?
BPL ERSOBJ ;YEAH, DO 'EM
LDA #$0F ;SHOW PLAYER
STA COLPM0 ;DEATH HERE
STA AUDC1 ;START SOUND
MOREWT LDA RANDOM ;SET RANDOM
AND #$1F ;DEATH SOUND
STA AUDF1 ;FREQUENCY
LDA #6 ;WAIT 0.1 SEC
JSR WAIT
DEC COLPM0 ;DEC BRIGHTNESS
LDA COLPM0 ;NOW SET
STA AUDC1 ;DEATH VOLUME
BNE MOREWT ;MORE WAIT
LDA LIVES ;MORE LIVES?
BEQ DEAD ;NO MORE LIFE!
DEC LIVES ;ONE LESS LIFE
JSR SHOLIV ;SHOW IT
LDA #60 ;WAIT 1 SEC
JSR WAIT
LDA #0 ;RESET PLAYER
STA KILPLR ;KILL FLAG
LDA #$16 ;AND
STA COLPM0 ;PLAYER COLOR
RTS ;AND EXIT!
DEAD PLA ;ALL DEAD, PULL
PLA ;RETURN ADDR.
JMP LIVE ;AND RESTART GAME
; ----------
; SHOW LIVES
; ----------
SHOLIV LDA #$90 ;SELECT DISPLAY
STA SHCOLR ;COLOR
LDA LIVES ;GET LIVES
LDX #7 ;7TH CHAR ON LINE
JSR SHOBCD ;SHOW IT!
RTS ;AND EXIT
; ----------
; SHOW LEVEL
; ----------
SHOLVL LDY #$50 ;SELECT DISPLAY
STY SHCOLR ;COLOR
LDA BCDLVL ;GET LEVEL#
LDX #14 ;14TH CHAR
; ----------------
; BCD CHAR DISPLAY
; ----------------
SHOBCD STA SHOBYT ;SAVE CHARACTER
AND #$0F ;GET NUM 1
ORA SHCOLR ;ADD COLOR
STA INFOLN+1,X ;SHOW IT
LDA SHOBYT ;GET CHAR.
LSR A ;SHIFT RIGHT
LSR A ;TO GET
LSR A ;NUM 2
LSR A
ORA SHCOLR ;ADD COLOR
STA INFOLN,X ;SHOW IT
RTS ;AND EXIT!
; ----------------------
; FLASH OBJECT WHEN DEAD
; ----------------------
FLASH LDY FLASHY ;GET Y POS.
LDA #0 ;GET READY TO
LDX #14 ;CLEAR OLD FLASH
CLFLSH STA PL1,Y ;ZERO OUT EACH
INY ;BYTE OF FLASH
DEX ;DONE YET?
BNE CLFLSH ;NO, LOOP.
LDA SAVEX ;GET OBJECT'S
CLC ;X POS. AND
ADC #61 ;ADD 61 FOR
STA HPOSP1 ;FLASH HORIZ.
LDA SAVEY ;GET Y POS AND
CLC ;ADD 26 FOR
ADC #26 ;FLASH VERT.
TAY ;POSITION
STY FLASHY ;AND SAVE
LDX #13 ;FLASH = 14 BYTES
SEFLSH LDA FLBYTE,X ;GET IMAGE
STA PL1,Y ;PUT IN PLAYER 1
INY ;NEXT P/M BYTE
DEX ;NEXT IMAGE BYTE
BPL SEFLSH ;LOOP.
LDA #1 ;SET FLASH
STA FLTIME ;DURATION
RTS ;ALL DONE!
; ----------
; TIME DELAY
; ----------
WAIT STA TIMER ;SET TIMER
WAITLP LDA TIMER ;TIMER = 0?
BNE WAITLP ;NOPE!
RTS ;TIMER FINISHED!
; ---------------
; TURN SOUNDS OFF
; ---------------
SNDOFF LDA #0 ;ZERO OUT:
STA FIRSOU ;FIRE SOUND
STA OBDSOU ;OBJ DEATH SOUND
STA MOVSOU ;PLYR MOVE SOUND
LDX #7 ;ZERO ALL:
SNDOF2 STA AUDF1,X ;AUDIO REGISTERS
DEX
BPL SNDOF2
RTS ;AND EXIT
; ---------
; DRAW GRID
; ---------