-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathWSMAIN.MAC
3997 lines (3887 loc) · 78.5 KB
/
WSMAIN.MAC
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
.TITLE WSMAIN GAME PLAY
.INCLUDE WSCOMN ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;===
A$UVP ==0 ;UNIT VECTOR POINTER
A$BIC ==2 ;BLOCK INDEX COUNTER, LO BANK
A$TYP ==3 ;TYPE (O.DEAD; 3.EXPLODING
A$PIC ==4 ;PICTURE #
A$DIE ==5 ;PROCESS OF DIEING
A$GLW ==6 ;PROCESS OF GLOWING
A$HTA ==7 ;HITS AVAILABLE BEFORE DIEING
A$DMC ==8 ;CUNENT DAMAGE COUNT
A$ROL ==9 ;FORCE ROLL OF SHIP
A$AIM ==10. ;AIMED AT PLAYER
A$TRGT ==11. ;=O.GO FOR HOME BASE; =-1.PLAYER
;A$SPD ==12. ;UPDATE RATE IN DEEP SPACE
A$CHPC ==13. ;PC FOR CURRENT CHOREOG
A$CHOP ==15. ;OP CODE
A$CHTM ==16. ;TIMER
A$CHTW ==17. ;TWIRL FLAGS
A$CHMV ==18. ;TW+1, MOVE FLAGS
A$CHCN ==19. ;CONTROL MASK, UNTIL STRUCTURE
A$CHST ==21. ;STATUS TESTED BY CONTROL
A$CHRT ==23. ;RETURN PC, SUBROUTINE
A$IZE ==25. ;# OF BYTES PER RECORD
A$EQ ==3 ;# OF ALIEN RECORDS IN SEQUENCE
;---
C$AH ==1 ;NEARBY ALIEN HAS BEEN HIT
C$AD ==2 ;/PLEASE DELETE/NEARBY ALIEN HAS DIED
C$AS ==4 ;ALIEN HAS PLAYER IN SITES
C$AV ==8 ;ALIEN HAS PLAYER IN FRONT VIEW
C$R1 ==10 ;
C$R2 ==20 ;
C$AG ==40 ;ALIEN HAS FIRED A GUN
;
C$PN ==400 ;PLAYER IS NEAR THE ALIEN
C$PS ==800 ;PLAYER HAS ALIEN IN SITES
C$PV ==1000 ;PLAYER HAS ALIEN IN VIEW
C$PM ==2000 ;PLAYER IS MIDDLIN NEAR TO ALIEN
;---
G$UVP ==0 ;MATH BOX POINTER
G$BIC ==2 ;MATH BOX BIC, LO BANK
G$TYP ==3 ;DESCRIPTOR OF GUN TYPE
G$MOV ==4 ;MOVE ROUTINE
G$TMR ==5 ;TIMER
G$IZE ==6
G$EQ ==6
;---
;---
M$AX ==-10+0
M$AY ==-10+0+2
M$AZ ==-10+0+0+4
M$BX ==-10+0+8
M$BY ==-10+0+8+2
M$BZ ==-10+0+8+4
M$CX ==-10+0+10
M$CY ==-10+0+10+2
M$CZ ==-10+0+10+4
M$TX ==-10+18+0
M$TY ==-10+18+2
M$TZ ==-10+18+4
M$VX ==-10+6
M$VY ==-10+6+8
M$VZ ==-10+6+10
;---
;RHEOSTAT
;*** IRQ/MAINLINE INTERACTIONS !!!!
RH$LO ==0 ;LO VALUE-MINIMUM
RH$LT ==1 ;LO VALUE ON TRIAL
RH$SP ==2 ;SPREAD MULTIPLIER
RH$ST ==3 ;SPREAD CHANGE TIMER
RH$NML ==4 ;NORMALZIED POT VALUE
RH$POS ==5 ;SITE POSITION
RH$RAT ==7 ;RATE OF TURN
RH$RSD ==8 ;MAGIC TIC RESIDUE
RH$IZ ==9 ;SIZE OF BLOCK
;===
;(TC)
.GLOBL AUXBIT
.GLOBL $BCCNT,$CNCT,$$CRDT,$INTCT
.GLOBL EEINDX,NVTSTR
.GLOBL FIREBT,THMBT
.GLOBL GN.SWE
.GLOBL GTIME
.GLOBL IN.SW0,IN.SW2
.GLOBL INITLS,SAVINT,HSCORS,SAVSCR
.GLOBL MOOTIM
.GLOBL MUSTIM
.GLOBL MS.CPY,MS.CPZ,MS.FLI,MS.FLZ,MS.SCR,MS.SCZ
.GLOBL MS.CRD,MS.FRE,MS.GVR,MS.INS,MS.STR
.GLOBL MS.DS1,MS.DSZ,MS.HS1,MS.HSZ,MS.NXT,MS.TWR,MS.RWD
.GLOBL MS.BRE,MS.BON,MS.EXH,MS.ATP,MS.GO1
.GLOBL MS.BSE,MS.MSD,MS.DSD
.GLOBL MS.ACW,MS.SFB,MS.STF
.GLOBL MS.OPT,MS.USE
.GLOBL MSYOFF
.GLOBL NAREA
.GLOBL NXTMES,LSTMES
.GLOBL OPTS0,OPTS1
.GLOBL PH.COL,PH.TIM,PH.YOF
.GLOBL PT.LIV
.GLOBL RESETS
.GLOBL RHEOP,RHEOY
.GLOBL STRTBT
.GLOBL TESTBT
.GLOBL TEMP
.GLOBL TIMER
.GLOBL UPDFLG
.GLOBL VGCOLR,VGRTSL
.GLOBL VGCBLU,VGCGRN,VGCPRP,VGCRED,VGCTRQ,VGCWHT,VGCYLW
.GLOBL VJBMIN
.GLOBL ALLOFF
.GLOBL EEACC,EEACCT,EECKSM,EEOPT,EEOPT1,EEOPT3,TMPEE3,EEINI0
.GLOBL MESSON
.GLOBL GETINT,SETINT
.GLOBL RESET
.GLOBL SUMMIT
.GLOBL UPDATE
.GLOBL VWHSCR
.GLOBL VWMESS,DOMESS
.GLOBL DOMES2,VWMES2
;===
;D-PAGE RAM
.GLOBL AM.PTR
.GLOBB BJ.CX,BJ.CY,BJ.DMC
.GLOBB BS.EFL,BS.ELC,BS.RPT
.GLOBL BS.PFL
.GLOBB BT.SUP
.GLOBB CL.ADS,CL.AP
.GLOBB DT.SCL,DT.STP
.GLOBB FRAME,FRAMEL
.GLOBB GD.ACT,GD.ROL,GD.SEQ
.GLOBB GN.SWE,GN.SWN,GN.SWO
.GLOBB GS.GLW,GS.HIT,GS.OLD
.GLOBB GMSYNC
.GLOBB LZ.CX,LZ.CY,LZ.EDG,LZ.ON
.GLOBB LZ.HIT
.GLOBB PHASE
.GLOBB PT.DLY
.GLOBB R.FIRE,R.THMB
.GLOBB SI.CX,SI.CY,SI.RSX,SI.RSY
.GLOBB ST.BRT,ST.UX
.GLOBL ST.UY,ST.UZ
.GLOBB S.GAS,S.GLW,S.ROL,S.SC21,S.SC43,S.SC65,S.SC87
.GLOBB S2.PRM
.GLOBB VGSYNC
.GLOBB VG.CX,VG.CY,VG.RSX,VG.RSY
.GLOBB VG.LON
.GLOBB WV.LIV,WV.LVL
.GLOBL BS.WAV,SP.WAV,GD.WAV
;----
;RAM
.GLOBL ALIEN,ALIENZ
.GLOBL BCD,BIN
.GLOBL COINSPK
.GLOBL GM.BMP,GM.DIF,GM.WAV,GM.DWAV
.GLOBL GUN,GUNZ
.GLOBL GD.TWL
.GLOBL Q.ATP,Q.FRC,Q.GHIT,Q.PBB,Q.PBD,Q.RTHV,Q.SHK
.GLOBL Q.KTW,Q.BSH
.GLOBL RHEOP,RHEOR,RHEOY
.GLOBL SC.FWV,SC.ADD,SC.ADT
.GLOBL TWRMULT
.GLOBL WV.HRD
.GLOBL XP.PHS
;---
;OUTSIDE ROUTINES
.GLOBL AUDCR,AUDPB,AUDPS,AUDPS,AUDRY,AUDTH
.GLOBL BGBNNR,VWBNNR,VWSPMS
.GLOBL CHKHIS
.GLOBL CPU,CPURET,NWNSHP
.GLOBL EETEMP,EEUTIM
.GLOBL DOBASE,GNBASE,NWBASE,VWBASE
.GLOBL VWFRC
.GLOBL ADCGAS,DO1GAS,VWGAS
.GLOBL BG1GLW,DO1QGLW,DO1GLW,DONGLW,KPGLOW,VWGLW
.GLOBL IGRND,VWGRND
.GLOBL MVGUN,VWGUN
.GLOBL CLGLZ,CLBLZ,CLSLZ,TSTLAZ,VWLAZ
.GLOBL ADASHP,ADBOBJ,OBJCEN,OBJDRW,OBJBPNT,TD$GND,TD$RTH
.GLOBL PMBEN,PMCNT,PMDES,PMEND,PMREB,PMRRP,PMTH5,PM4TH
.GLOBL PMTHB,PMDAR
.GLOBL MGOWT
.GLOBL MVPTGN,VWPTGN
.GLOBL S1PT,S1RL,S1YW
.GLOBL SCRSHL,SCRWAV,SCRPORT
.GLOBL SPKLET,SPKRED,SPKSIZ,SPKTHI,SPKTRU,SPKUSE,SPKSTR
.GLOBL SPKREM,SPKALW,SPKFOA,SPKIMO
.GLOBL SPKFOR,SPKHAV,SPKSTA,SPKYAU
.GLOBL SPKR2N,SPKSKP,SPKELE,SPKGRE
.GLOBL TD$RTH
.GLOBL UNITV,IS1UV,IS2UV
.GLOBL VWSITC,VWSITE
.GLOBL VW6DIG,VW8DIG,VWBYTE,VWNIBL
.GLOBL IXPLD,DOXPLD,VWXPLD
.GLOBL BGXPLN,VWXPLN
.GLOBL VWSTAR,VWSTRG
;----
;MATH BOX
.GLOBL MBRAM
.GLOBL M$CNCT
.GLOBL M$PERS,M$PSB2,M$PTCH
.GLOBL M$ROLL
.GLOBL M$S1BC
.GLOBL M$U1BC
.GLOBL M$YAW
.GLOBL M.AL,M$ALBC
.GLOBL M.BIC,M.BICH,M.BICL,M.BUSY
.GLOBL M.COS,M.C40,M.C80
.GLOBL M.DVD,M.DVN
.GLOBL M.GN,M$GNBC
.GLOBL M.HLF
.GLOBL M.ONE
.GLOBL M.PCGO
.GLOBL M.SCL,M.SIN,M.SINH,M.STAD,M.STAZ,M.S1
.GLOBL M.U1
.GLOBL M.XP,M.XPS,M.XT
.GLOBL M.YP,M.YPS,M.YT
.GLOBL M.ZP,M.ZPS,M.ZRO,M.ZT
;---
;VECTOR GENERATOR
.GLOBL VG$CW
.GLOBL VGBFSZ
.GLOBL VGCNTR
.GLOBL VGCGRN,VGCOPC,VGCBLU
.GLOBL VGLIML,VGLIMR
.GLOBL VGOFFY
.GLOBL VGRAM,FAKEVG,VGPSROM,VGRROM
.GLOBL VGRW1,VGRW3,VGRW5,VGRW6,VGRW7
.GLOBL VGSCAL
.GLOBL VJHALF
.GLOBL VJMFL
.GLOBL VJINIT,VJTITLE,VGVARB
.GLOBL VJBCIR,VJBDSH,VJBFRM,VJBMIN,VJBNSD,VJBTRN
.GLOBL VJUB1,VJUB2,VJUB3,VJUB4,VJLB1,VJLB2,VJLB3,VJLB4
;---
;HARDWARE
.GLOBL DPRAM
.GLOBL LFIRBT
.GLOBL P.RND1,P.RND2,P.IRND
.GLOBL POTSAV
.GLOBL STACK
;----
;SHIFT ROUTINES
.IRP .A,<3,4>
.GLOBL ASRD'.A
.ENDR
.IRP .A,<4,5,7,8>
.GLOBL LSLD'.A
.ENDR
;===
.MACRO .PAGG ;GLOBAL PAGE NUMBERS
.PAGEG M ;MAINLINE
.ENDM
;===
.CSECT MAIN
;===
.PAGG
.SBTTL MAINLINE
WAITFRAME:: ;---
;
LDX #0 ;TALK TO DEV SYS
LDD #0F800 ;PATCH TO 0BD TO TURN ON (JSR)
LDA #DPRAM/100
TFR A,DPR
;---
LSR GMSYNC ;PROCESS GAME FRAMES IN TIMELY FASHION
BCC WAITFRAME
;---
CMPS #STACK
IFNE ;?SOME FRAME NEEDS A DELAY?
RTS ;THEN LET IT CONTINUE
ENDIF
;---
LDA PT.DLY
IFEQ ;?FAR ENUF INTO POWER ON?
;PREVENT STARTUP BLANK STARES
LDA IN.SW2 ;LOOK AT FREEZE SWITCH (BT7 OPTION BANK 1)
ANDA #BT7 ;FREEZE?
IFEQ ;?SWITCH ON? THEN FREEZE
LDA VG.LON ;USE LEFT FIRE BIT FOR SINGLE STEPPING
BITA #LFIRBT
BEQ WAITFRAME ;B NO LEFT EDGE, SO LOOP FOREVER (ALMOST)
;ELSE SINGLE STEP JUST THIS TIME
ANDA #-1-LFIRBT ;CLEAR OUT THIS BIT ONLY, RIGHT STILL FIRES
STA VG.LON ;JUST TESTING, SO IGNORE SEI/CLI
ENDIF
ENDIF
;---
JSR IFRAME ;INIT GAME FRAME
BEGIN ;WAIT FOR VG BUFFER
LDA VGSYNC ;NON-NEGATIVE VALUE INDICATES BUFFER READY
PLEND
;---
MAIN:: ;---
LDA PHASE ;EXECUTE PHASE
CMPA #PH$EQ
30$: BHS 30$ ;DIE ON BAD PHASE
LSLA
LDX #TPHASE
JSR @A(X)
;---
BRA WAITFRAME ;NEXT MAIN FRAME
;---
.MACRO P. .1,.2 ;PHASES
PH$'.1' ==PH$EQ
.IF NB,'.2'
.WORD PHI'.1'
PH$EQ =PH$EQ+1
.ENDC ; NB,'.2'
.WORD PHE'.1'
PH$EQ =PH$EQ+1
.ENDM
PH$EQ=0
;---
TPHASE: ;GAME PHASE TABLE
P. RES ;RESET
;---
P. STS,I ;STATISTICS
P. OPT,I ;OPTION SWITCH
;
P. BNR,I ;BANNER
P. INS,I ;FLIGHT INSTRUCTIONS
P. SCR,I ;SCORING PAGE
P. HIS,I ;HI SCORE TABLE DISPLAY
;
P. SDS,I ;SELECT A DEATH STAR
P. ENT,I ;ENTER INITIALS
;---
P. DX1,I ;DEATH STAR EXPLOSION, FIRST PHASE
P. DX2,I ;DEATH STAR EXPLOSION, SECOND PHASE
P. DX3,I ;DEATH STAR EXPLOSION, THIRD PHASE
;---
P. CN1,I ;FIRST COIN
P. SG1,I ;START GAME PART 1
P. SG2,I ;START GAME PART 2
P. BGN,I ;BEGIN ACT
;
P. SP1,I ;SPACE WAVE 1
P. SP2,I ;SPACE WAVE 2
P. S0G,I ;SPACE TO GROUND TRANSITION
P. S1G,I ; NEXT PART
P. S0B,I ;SPACE TO BASE TRENCH TRANSITION
;
P. GD,I ;GROUND PHASE
P. G0B,I ;GROUND TO BASE TRENCH TRANSITION
P. G1B,I ; NEXT PART
;
P. BS,I ;BASE STAR
P. B0B,I ;BASE TRENCH REPEAT TRANSITION
;
P. NXT,I ;NEXT ACT
P. S0D,I ;SPACE TO DIE, TRANSITION
P. G0D,I ;GROUND TO DIE, TRANSITION
P. B0D,I ;BASE TRENCH TO DIE, TRANSITION
P. EGM,I ;END GAME
.PAGG
IFRAME:
INC FRAME+1
IFEQ ;?OVERFLOW?
INC FRAME ;KEEP TRACK
IFEQ ;?OVERFLOWED HI BYTE ALSO?
LDA #80 ;?WORD OVERFLOW?
STA FRAME ;THEN STICK
ENDIF
ENDIF
;---
LDA $$CRDT
IFEQ
STA COINSPK ;0 ==> START OVER AGAIN
ELSE ;ELSE GOT SOME COINS
LDA COINSPK
IFEQ ;?FIRST TIME?
JSR SPKFOR ;'THE FORCE WILL BE WITH YOU'
LDA $$CRDT
STA COINSPK ;REMEMBER WHY WE SPOKE
ELSE ;ELSE NOT FIRST TIME
LDA COINSPK
CMPA $$CRDT
IFLO ;?GOT SOME NEW CREDIT AGAIN?
JSR SPKALW ;'ALWAYS'
LDA #0FF
STA COINSPK ;SAY NO MORE TILL COINS GONE
ENDIF
ENDIF
ENDIF
;---
JSR VGTOSITE ;PULL VG(IRQ) CURSOR COORDS INTO SI.*
;---
;GET EDGE OF SWITCHES-- LFIRE,RFIRE,AUX,TEST,COINS
LDA GN.SWN ;PREVIOUS NEW VALUE
STA GN.SWO ;IS CURRENT OLD VALUE
LDA R.THMB
ANDA #THMBT ;ISOLATE THUMB BITS
PSHS A ;TEMP
LDA R.FIRE ;GET THIS NEWEST VALUE
ANDA #-1-THMBT ;OPEN UP SPACE FOR THUMBS
ORA 0(S)+ ;ORA WITH POP
ANDA #FIREBT!THMBT!AUXBIT ;ONLY CONCERNED WITH GUN CONTROLS
STA GN.SWN ;AND SAY SO
EORA GN.SWO ;CATCH ANY CHANGES
ANDA GN.SWO ;FROM AN OLD '1'
STA GN.SWE ;1==>FALLING EDGE (WENT ON)
;---
RTS
;---
IVGEN1:
LDA VGSYNC
LDB #VGRAM&0FF+VGVARB
TFR D,Y ;Y-->VG BUFFER
IVGEN: ;---
LDD #VJINIT ;INIT VECTOR GENERATOR
STD (Y)++
;---
RTS
;===
DOWNVG:: ;DOWNLOAD FAKEVGROM TO VGRAM
LDX #FAKEVG ;ROM ADDRESS OF VG INSTRUCTIONS
LDU #VGPSROM ;ADDRESS OF WHERE THEY BELONG
BEGIN
LDD (X)++
STD (U)++
CMPU #VGRROM ;STOP AT VG REAL ROM
HSEND
RTS
;===
VGDONE:
LDD #VGCNTR ;CENTER
STD (Y)++
LDD #2020
STD (Y)++ ;ASK FOR HALT
STD (Y)+ ;FORCE HALT, POINT TO LAST ADDRESS USED
TFR Y,D ;CHECK FOR OVERFLOW
SUBA VGSYNC ;END-BEGIN
SUBA #VGBFSZ/100 ;CMP WITH MAX SIZE
IFHS ;?OVERFLOW?
;;; SWI ;DIE--OVER RUN VG RAM
JSR DOWNVG ;RELOAD RAM COPY OF PSUEDOVGRAM
LDD #2020
STD VGBFSZ+VGRAM-2
STD VGBFSZ+VGRAM-4
STD 2*VGBFSZ+VGRAM-2
STD 2*VGBFSZ+VGRAM-4
ENDIF ;---
LDA #0FF ;FINISHED WITH BUFFER
STA VGSYNC ;MINUS INDICATES DONE WITH BUFFER
RTS
IPARM:
JSR IPGEN ;INIT PARAMETERS, GENERAL
JSR NW1SHP ;INIT PLAYERS SHIP
RTS
;---
IPGEN: ;INIT GENERAL PARMS
LDA P.RND1
CMPA P.RND1
IFEQ ;?# GENERATOR STUCK?
STA P.IRND ;INIT POLY COUNTER
LDA #80 ;START IT RUNNING
STA P.IRND
ENDIF
;
LDA #80
STA ST.BRT ;STAR BRITENESS
LDX #ALIEN
LDU #M.AL
LDB #M$ALBC
30$: ;---
STU A$UVP(X)
STB A$BIC(X)
LEAU 20(U)
ADDB #4
LEAX A$IZE(X)
CMPX #ALIENZ
BLO 30$
LDX #GUN
LDU #M.GN
LDB #M$GNBC
40$: ;---
STU G$UVP(X)
STB G$BIC(X)
CLR G$TYP(X)
LEAU 8(U)
ADDB #1
LEAX G$IZE(X)
CMPX #GUNZ
BLO 40$
JSR NWNSHP
LDB #TD$RTH ;ADD DARTH TO THE LIST
JSR ADBOBJ
LDB #TD$GND ;ALSO GROUND OBJECT
JSR ADBOBJ
;---
RTS
IMATH:
;---
LDD #0
STD M.ZRO
;---
LDD #4000
STD M.ONE ;CONSTANT '1'
LDD #0E000 ;CONSTANT DIVIDE BY 2
STD M.HLF
LDD #0080 ;ROUNDING CONSTANTS
STD M.C80 ;0080
LDD #0040
STD M.C40 ;0040
;---
LDD #21F ;SIN,COS ANGLES
STD M.SINH ;FOR .895 DEGREES
LDD #3FF7
STD M.COS
LDD #4000 ;SCALE
STD M.SCL
;---
LDD #200
STD M.DVN ;RECIPROCAL PERSPECTIVE
;---
RTS
ISTAR:
LDA #80
STA ST.BRT ;INITIAL BRITENESS
;---
LDX #M.STAD
10$: ;---
LDA P.RND2 ;REVERSE OF INITING ORDER FOR RANDOMNESS
LDB P.RND1 ;TRY TO POPULATE EVENLY
STD 0(X)
MUL
LDA P.RND2
STD 2(X)
MUL
LDA P.RND2
STD 4(X)
LEAX 8(X)
CMPX #M.STAZ
BLO 10$
RTS
;===
ISTARG:
LDX #M.STAD
10$: ;---
LDA P.RND2 ;REVERSE OF INITING ORDER FOR RANDOMNESS
LDB P.RND1 ;TRY TO POPULATE EVENLY
STD 0(X)
MUL
LDA P.RND2
STD 2(X)
CLRD
STD 4(X)
LEAX 8(X)
CMPX #M.STAZ
BLO 10$
RTS
;===
STRTCK: ;CHECK FOR START SWITCH AND SELF TEST ( STATS )
; THIS ROUTINE SHOULD ONLY BE CALLED DURING ATTRACT PHASES
LDB SI.RSX ;SITE POSITION X
CMPB #0A0 ;EXTREME LEFT?
IFLE ;YES, MAY GO TO INSTRUCTION PHASE
LDA #PH$INS+1
CMPA PHASE ;ALREADY THERE?
IFNE ;NO, THEN GO THERE
DECA ;INITIALIZER FRO THE PHASE
STA PHASE
ENDIF
ELSE
CMPB #60 ;EXTREME RIGHT?
IFGE ;YES, THEN MAYBE WE'LL GO TO HIGH SCORE TABLE
LDA #PH$HIS+1
CMPA PHASE ;ALREADY THERE?
IFNE ;NOPE, OK DOIT
DECA ;INITIALIZER
STA PHASE
ENDIF
ENDIF
ENDIF
LDA OPTS0+1 ;LOW NIBBLE OF COIN OPTIONS
ANDA #03 ;COIN MODE
IFEQ ;FREE PLAY
LDA #01 ;GIVE FREE CREDIT ( NO 2 COIN MINIMUM )
STA $$CRDT
ENDIF
LDA $$CRDT ;AVOID TEMPTATION TO DECA
IFNE ;MAYBE WE'LL START A GAME
LDA GN.SWE ;SWITCH EDGES
ANDA #STRTBT ;START SWITCH(ES)?
IFNE ;YES, OH BOY!!
LDA #PH$SG1 ;START THE GAME
STA PHASE
DEC $$CRDT
ENDIF
ENDIF
TSTCK: LDA IN.SW0 ;CHECK FOR SELF-TEST SWITCH
ANDA #TESTBT
IFEQ ;GO TO STATS PHASE
LDA #PH$STS
STA PHASE
ENDIF
RTS
;===
.PAGG
.SBTTL PHASES
.SBTTL RESET
PHERES:
SEI ;***
LDX #POTSAV
JSR EETEMP ;GET POT VALUES FROM EEROM
;
LDX #TEMP
JSR 100$
STA RHEOP+RH$LO
;
LDX #TEMP+1
JSR 100$
STA RHEOP+RH$SP
LDX #TEMP+2
JSR 100$
STA RHEOY+RH$LO
;
LDX #TEMP+3
JSR 100$
STA RHEOY+RH$SP
;---
CLI ;***
;---
LDA #PH$HIS
STA PHASE
LDA #0FF ;DON'T PLAY MUSIC ON POWER UP
STA MUSTIM
JSR IMATH
JSR IPARM
JSR DOWNVG ;SETUP VG PSUEDO-ROM
JSR ISTAR
JSR ALLOFF ;TURN ALL MESSAGES OFF
LDA #0
STA S.SC87
STA S.SC65
STA S.SC43
STA S.SC21
STA GS.GLW
STA GS.HIT
JSR SETINT ;SET UP HI SCORES AND INITIALS (HI KIDS!)
LDA #0FF
STA UPDFLG ;NO HIGH SCORES YET
STA MOOTIM ;ALLOW COIN ROUTINE TO INIT ITSELF
RTS
;===
100$: ;ADJUST THE POTS
LDA #40 ;ADJUST VALUES
CMPA (X)
IFHI
SUBA (X)
LSRA
LSRA
LSRA
INCA
ADDA (X)
ENDIF
RTS
;===
.PAGG
.SBTTL INSTRUCTION PAGE
PHIINS:
LDD #0000 ;WAS 380 FOR SCROLLING
STD PH.YOF ;PHASE Y OFFSET
LDD #0200
STD PH.TIM
LDA #MS.FLI ;"FLIGHT INSTRUCTIONS..."
STA NXTMES
LDA #MS.FLZ+1
STA LSTMES
LDD #VGCOLR+<VGCRED*100>;RED
STD PH.COL
JSR ALLOFF ;TURN OFF ALL MESSAGES
INC PHASE
RTS
PHEINS:
JSR IVGEN1 ;SETUP VECTOR GENERATOR AND Y AS POINTER
JSR VWMES ;SCORE AND STUFF
JSR VWCOIN ;"INSERT COIN", ETC.
JSR VWPAGE ;VIEW INSTRUCTION OR SCORING SCREEN
JSR VWSTAR ;SHOW THEM STARS
JSR VGDONE ;DONE WITH THE VG IN THIS PHASE
JSR SMVINS ;MOVE THE STARS FOR INSTRUCTION SCREEN
LDD PH.TIM ;DONE?
IFMI ;YES, THEN GO ON TO THE NEXT PHASE
INC PHASE
ENDIF
JSR STRTCK ;CHECK FOR START SWITCH
RTS
.PAGG
.SBTTL SCORING PAGE
PHISCR:
LDD #03C0 ;FOR SCROLLING
STD PH.YOF
LDD #0200
STD PH.TIM
LDA #MS.SCR ;"SCORING"
STA NXTMES
LDA #MS.SCZ+1
STA LSTMES
LDD #VGCOLR+<VGCPRP*100>;PURPLE
STD PH.COL
JSR ALLOFF
INC PHASE
RTS
PHESCR:
JSR IVGEN1 ;SETUP VECTOR GENERATOR AND Y AS POINTER
JSR VWMES ;SCORE AND STUFF
JSR VWCOIN ;"INSERT COIN", ETC.
JSR VWPAGE ;VIEW INSTRUCTION OR SCORING SCREEN
JSR VWSTAR ;SHOW THEM STARS
JSR VGDONE ;DONE WITH THE VG IN THIS PHASE
JSR SMVSCR ;MOVE THE STARS FOR SCORING SCREEN
LDD PH.TIM ;DONE?
IFMI ;YES, THEN GO ON TO THE NEXT PHASE
INC PHASE
ENDIF
JSR STRTCK ;CHECK FOR START SWITCH
RTS
VWPAGE:
LDD PH.TIM ;UPDATE PHASE TIMER ( DOWNDATE ??? )
SUBD #0001
STD PH.TIM
ANDB #07 ;READY TO START NEXT LINE?
IFEQ ;YES
LDA NXTMES
IFPL ;A NEGATIVE VALUE MEANS NO MORE LINES
JSR MESSON
ENDIF
;---
LDA NXTMES
CMPA #MS.FLI+3 ;SHIELD STRENGTH MESSAGE
IFEQ ;INSERT CORRECT STRENGTH
LDA OPTS1+1 ;LOW NIBBLE OF 2ND OPTION SWITCH BANK
ANDA #03
ADDA #MS.FLZ+1 ;SHOULD GIVE STRENGTH FROM 6 TO 9
JSR MESSON
ENDIF
;---
LDA NXTMES ;INC NEXT MESSAGE
ADDA #1
CMPA LSTMES ;NO MORE FOR THIS PHASE?
IFHS ;THAT'S ALL FOLKS
LDA #80 ;FLAG IT AS NO MORE
ENDIF
STA NXTMES
ENDIF
;---
LDD PH.YOF ;UPDATE MESSAGE Y OFFSET ( SCROLL )
SUBD #0008
IFMI ;TOO FAR
LDD #0000
ENDIF
STD PH.YOF
LDD PH.TIM
CMPD #0C0
IFLO ;START FADING MESSAGES OUT
LDB PH.COL+1 ;DECREMENT Z
SUBB #01
CMPB #10 ;DIM ENOUGH AT 10 DON'T WASTE TIME GOING TO 0
IFLO
LDD #0000
STD PH.TIM ;PHASE OVER
ENDIF
STB PH.COL+1
ENDIF
LDD PH.YOFF
STD MSYOFF
LDD PH.COL ;COLOR AND BRIGHTNESS
STD (Y)++
JSR VWMES2 ;VIEW MESAGES (NO COLOR COMMAND )
RTS
VWCOIN:
LDA $$CRDT ;DO THE FIRST OF TWO LINES
IFEQ ;NO CREDIT--FLASH "GAME OVER"+"INSERT COINS"
LDA FRAME+1
ANDA #10 ;PICK A RATE FOR FLASH
IFEQ
LDB #MS.INS ;"INSERT COINS" ON
ELSE
LDB #MS.GVR ;"GAME OVER" ON
ENDIF
JSR DOMESS
ELSE ;ELSE WE HAVE ENUF CREDIT
;WE GOT THEIR MONEY SO TELL THEM TO...
LDB #MS.STR ;"PRESS FIRE TO START"
JSR DOMESS
ENDIF
;---
;NOW DO SECOND OF TWO LINES
LDA $$CRDT
IFEQ ;?NO CREDITS YET?
LDA $CNCT
IFNE ;?ANY PARTIAL CREDITS?
LDA FRAMEL
ANDA #10
BEQ 30$ ;B INSERT COINS GOES WITH COIN COST
BRA 50$ ;B GAME OVER GOES WITH # OF CREDITS
ELSE ;ELSE NO PARTIAL CREDITS
30$: ;---
;NOW TELL THEM HOW MUCH ITS GONNA COST
LDB OPTS0+1 ;LOW NIBBLE OF COIN OPTIONS
ANDB #03 ;0=FREE,1=2 PLAYS/COIN,2=1PLAY/COIN,3=2COINS/PLAY
ADDB #MS.FRE ;GET CORRECT MESSAGE NUMBER
JSR DOMESS ;DOIT
ENDIF
ELSE ;ELSE WE HAVE SOME CREDITS
50$: ;---
LDA $$CRDT ;SHOW HOW MANY "CREDITS" THEY HAVE
ADDA $CNCT
CMPA #1
IFEQ ;?GOT HALF OR ONE CREDITS?
LDB #MS.CRD+1 ;THEN SAY SINGULAR CREDIT
ELSE ;ELSE USE PLURAL
LDB #MS.CRD
ENDIF
JSR DOMESS
;
LDD #1B0
ANDA #1F
STD (Y)++
LDD #-80
TST $CNCT
IFNE ;?HAVE A PARTIAL CREDIT?
SUBD #24. ;THEN BACK UP, PREPARE FOR HALF SIGN
ENDIF
ANDA #1F
STD (Y)++
LDA $$CRDT ;00-12 HEX
CMPA #0A
IFHS ;CONVERT 0A-12 TO 10-18
ADDA #06
ENDIF
LDB #02 ;SUPPRESS BOTH DIGITS
STB BT.SUP
JSR VWBYTE ;SHOW THEM
LDA $CNCT
IFNE ;?STILL HAVE A PARTIAL CREDIT?
LDD #VJHALF ;THEN SAY SO
STD (Y)++
ENDIF
LDD #VGCNTR ;ALWAYS DO A CENTER AFTER YOU'RE DONE
STD (Y)++
ENDIF
RTS
;===
.PAGG
.SBTTL HIGH SCORE DISPLAY
PHIHIS:
LDD #0000
STD PH.YOF
STD MSYOFF
LDD #0100
STD PH.TIM
LDD #VGCOLR+<VGCBLU*100>
STD PH.COL
JSR ALLOFF
JSR IMATH ;RESTORE MATH BOX
JSR IPARM
LDU #M.U1 ;STARS ASSUME UV1 MATRIX
JSR UNITV ;SETUP FACING FORWARD
;
JSR CHKHIS ;CHECK HI SCORE FOR REASONABLENESS
;
INC PHASE
RTS
PHEHIS:
JSR IVGEN1 ;SETUP VG AND Y AS POINTER
JSR CPYRGHT ;SHOW COPYRIGHT MESSAGE
;***COPYRIGHT FIRST FOR SECURITY CHECK
JSR VWSTAR ;SHOW THOSE STARS
JSR VWMES ;SCORE AND STUFF
JSR VWCOIN ;"GAME OVER", ETC.
LDD PH.TIM ;FADER?
CMPD #0050
IFLO ;YEP, DIM IT DOWN
LDB PH.COL+1
SUBB #01
CMPB #0F0
IFHS ;PROBABLY WRAPPED
LDB #00
ENDIF
STB PH.COL+1
ENDIF
LDD PH.COL ;PUT THE COLOR OUT
STD (Y)++
JSR VWHSCR ;PUT THE HIGH SCORES ON THE SCREEN
JSR VWMESS ;SHOW MESSAGES
JSR VGDONE ;ALL DONE WITH THE VG THIS PHASE
JSR SMVHIS ;MOVE THE STARS APPROPRIATLY FOR HIGH SCORES
LDD PH.TIM ;UPDATE TIMER
SUBD #0001
STD PH.TIM
IFMI ;THATS LONG ENOUGH
LDA #PH$BNR ;SHOW 'EM THE BANNER
STA PHASE
ENDIF
JSR STRTCK ;CHECK FOR START OR STATS
RTS
;===
CPYRGHT:
LDB #MS.CPY ;COPYRIGHT MESSAGES
JSR DOMESS ;MESSAGE AND SETS COLOR
LDB #MS.CPY+1
JSR DOMESS
LDB #MS.CPY+2
JSR DOMESS
LDB #MS.CPZ ;LAST ONE
JSR DOMESS
RTS
.PAGG
.SBTTL STATISTICS DISPLAY
PHISTS:
JSR ALLOFF
LDD #0000 ;NO Y OFFSET FOR MESSAGES
STD PH.YOF
STD MSYOFF
INC PHASE
RTS
PHESTS:
JSR IVGEN1 ;SETUP VG
JSR EEACC ;DISPLAY STATS AND ACCOUNTING INFO
JSR VWMESS
JSR VGDONE
;---
LDA GN.SWE ;CHECK FOR AUX SWITCH
ANDA #AUXBIT
IFNE ;GOTO NEXT PHASE
LDA #PH$OPT ;OPTIONS PAGE
STA PHASE
ENDIF
LDA IN.SW0 ;CHECK FOR SELF TEST SWITCH
ANDA #TESTBT
IFNE ;SWITCH OFF, GO BACK TO ATTRACT MODE
LDA #PH$BNR ;BANNER PHASE
STA PHASE
ENDIF
RTS
PHIOPT:
JSR ALLOFF ;TURN OFF ALL MESSAGES
LDA #0A ;HIGH LITE INDEX STARTS WITH MESSAGE
STA EEINDX
LDA #00
STA RESETS ;START WITH A CLEAN SHEET
STA NVTSTR ;NOVRAM TEST RESULTS ( 0 MEANS NO TEST DONE )
LDA #NAREA
JSR SUMMIT ;CHECK FOR PROPER CHECKSUM
IFNE ;?BAD CHECKSUM?
LDA #NAREA
JSR EEINI0 ;THEN RE-INIT IT
ENDIF
INC PHASE
RTS
PHEOPT:
JSR IVGEN1 ;SETUP VG
JSR EEOPT ;DISPLAY ALL OPTIONS
LDD #VGCOLR+<VGCWHT*100>;HILITE COLOR
STD (Y)++
LDB #MS.OPT+1 ;BASE MESSAGE NUMBER
ADDB EEINDX
JSR DOMES2 ;OUTPUT OPTION MESSAGE IN HILITE
LDA EEINDX ;HILITE THIS OPTION'S VALUE
JSR EEOPT3 ;OUTPUT OPTION VALUE
JSR EEOPT1 ;MAKE CHANGES TO OPTIONS
JSR VWMESS