First commit
[asteroids.git] / A35131.1A
1         .TITLE ASTROD (21503)\r
2         .ASECT\r
3         .ENABLE AMA\r
4         .RADIX 16\r
5 ;***********************************************\r
6 ;*\r
7 ;*DATE INITIATED:               23-FEB-79\r
8 ;*\r
9 ;*PROJECT CHARGE #:             21503\r
10 ;*\r
11 ;*DISK #:                       32 (BACKUP B46)\r
12 ;*\r
13 ;*HARDWARE REQUIREMENTS:        VECTOR HARDWARE WITH PAGE SELECT ON 2\r
14 ;*\r
15 ;*\r
16 ;*MEMORY REQUIREMENTS:          VECTOR RAM:  4000-47FF (2K)\r
17 ;*                              VECTOR ROM:  5000-57FF (2K)\r
18 ;*                              PROGRAM ROM: 6800-7FFF (6K)\r
19 ;*                              SCRATCH:     PAGE 0\r
20 ;*                              STACK:       PAGE 1\r
21 ;*                              PLAYER1:     PAGE 2\r
22 ;;*                             PLAYER2:     PAGE 3\r
23 ;*\r
24 ;*INTERRUPTS:                   NMI (4 MS)\r
25 ;*\r
26 ;*ASSEMBLY COMMAND STRING:      R MAC65\r
27 ;*                              ASTROD/A/C\r
28 ;*\r
29 ;*LINK COMMAND:                 OUTPUT(S)=DX1:ASTVEC,ASTROD,ASTMSG,ASTNMI,VECUT,ASTTST\r
30 ;*\r
31 ;*PROGRAM DESCRIPTION:          THIRD PERSON VIEW OF A SPACE SHIP\r
32 ;*                              WITH ASTEROIDS THROUGHOUT SPACE.\r
33 ;*                              LARGE ASTEROIDS BREAK UP WHEN\r
34 ;*                              HIT AND SMALLER ASTEROIDS DISINTEGRATE\r
35 ;*                              WHEN HIT. A LARGE AND SMALL\r
36 ;*                              SAUCER ALSO APPEAR TO SHOOT AT\r
37 ;*                              THE SHIP\r
38 ;*\r
39 ;*CONTROLS:                     ROTATE LEFT, ROTATE RIGHT, THRUST, FIRE\r
40 ;*                              AND HYPERSPACE BUTTONS\r
41 ;*\r
42 ;*******************************************************\r
43         .SBTTL ************************\r
44         .SBTTL *\r
45         .SBTTL *PROGRAMMER: ED LOGG\r
46         .SBTTL *\r
47         .SBTTL ************************\r
48         .PAGE\r
49         .SBTTL GLOBAL SYMBOL DECLARATIONS\r
50 ;\r
51 ;ENTRY POINTS\r
52 ;\r
53         .GLOBL START\r
54 ;\r
55 ;\r
56 ;EXTERNAL ENTRY POINTS\r
57 ;\r
58         .GLOBL VGHALT,VGVCTR,VGRTSL,VGMSGA              ;UTILITY ROUTINES(SEE VECUT.MAC)\r
59         .GLOBL VGJMPL,VGJSRL,VGLABS\r
60         .GLOBL VGADD,VGWAIT\r
61         .GLOBL VGHEX,VGHEXZ,VGSABS,VGDOT\r
62         .GLOBL SHIPS,ROCKS,EXPPIC,SAUCER        ;PICTURES OF SHIP AND ASTEROIDS\r
63         .GLOBL VGMSG                            ;MESSAGE PROCESSOR\r
64         .GLOBL PWRON                            ;ENTRY POINTS FOR ASTTST.MAC\r
65         .GLOBL EXPSHP,EXPDIR                    ;EXPLODING SHIP PICTURES\r
66         .GLOBL ASTMSG                           ;COPYRIGHT MESSAGE\r
67         .GLOBL SINCOS,SHIP17\r
68 ;\r
69 ;ZERO PAGE GLOBALS\r
70 ;\r
71         .GLOBL VGSIZE,XCOMP,TEMP1,VGLIST,VGBRIT\r
72         .GLOBL SYNC,LOUT1,TEMP3,UPDFLG,SND3,FRAME,TEMP2,TEMP4\r
73         .GLOBL $CCTIM,$$CRDT,$CMODE,$PSTSL,$LMTIM,$CNCT,$CNSTT,$INTCT\r
74 \r
75 \r
76         .INCLUDE ASTDEC\r
77 \r
78 \r
79         .SBTTL PAGE 0 DECLARATIONS\r
80         \r
81 VGSIZE: .BLKB 1                 ;SCALING SIZE (0,10,20,...,F0)\r
82 VGBRIT: .BLKB 1                 ;VECTOR BRIGHTNESS (0=OFF, F0=MAX, 10INC)\r
83 VGLIST: .BLKB 2                 ;VECTOR LIST POINTER\r
84 XCOMP:  .BLKB 4                 ;X COMPONENT FOR VECTORS\r
85 TEMP1:  .BLKB 2                 ;SCRATCH\r
86 TEMP2:  .BLKB 2\r
87 TEMP3:  .BLKB 8                 ;8 CKSUMS IN SELF TEST\r
88 TEMP4:  .BLKB 3\r
89 PLAYR:  .BLKB 1                 ;PLAYER NUMBER (0 OR 1)\r
90 PLAYR2: .BLKB 1                 ;PLAYER NUMBER *2 (0 OR 2)\r
91 LPLAYR: .BLKB 2                 ;THE VALUE OF NPLAYR FOR LAST GAME\r
92 NPLAYR: .BLKB 1                 ;NUMBER OF PLAYERS (1 OR 2)(0=END OF GAME)(-1=UPDATE HIGH SCORES)\r
93 HSCORE: .BLKB 2*10.             ;HIGH SCORES (LSB,MSB)\r
94 UPDINT: .BLKB 1                 ;0,1, OR 2 TO INDICATE WHICH INITIAL IS BEING SELECTED\r
95 UPDFLG: .BLKB 2                 ;POSITIVE MEANS THIS PLAYER HAS SET NEW HIGH SCORE\r
96 INITL:  .BLKB 3*10.             ;INITIALS FOR HIGH SCORE (FIRST,SECOND,THRID)\r
97 SCORE:  .BLKB 2*2               ;PLAYER 1 AND 2 SCORES (LSB1,MSB1,LSB2,MSB2)\r
98 NHITS:  .BLKB 1                 ;STARTING NUMBER OF HITS PER PLAYER\r
99 HITS:   .BLKB 2                 ;NUMBER OF HITS REMAINING (=0 FOR ATTRACT MODE)\r
100 RENTRY: .BLKB 1                 ;BLOW UP ON REENTRY IF NEGATIVE (NON-ZERO\r
101                                 ;IF HE JUST HYPERSPACED)\r
102 GDELAY: .BLKB 1                 ;DELAY BEFORE STARTING GAME\r
103 SYNC:   .BLKB 1                 ;FRAME COUNTER SYNC\r
104 FRAME:  .BLKB 2                 ;FRAME COUNTER\r
105 $INTCT: .BLKB 1                 ;INTERRUPT COUNTER\r
106 POLYL:  .BLKB 1                 ;POLY COUNTER VALUES\r
107 POLYH:  .BLKB 1 \r
108 ANGLE:  .BLKB 2                 ;ANGLE OF ROTATION OF SHIP AND SAUCER\r
109 LASTSW: .BLKB 1                 ;LAST SWITCH READING\r
110 XINCL:  .BLKB 1                 ;SHIPS LSB FOR X INCREMENT\r
111 YINCL:  .BLKB 1                 ;SHIPS LSB FOR Y INCREMENT\r
112 SND1:   .BLKB 1                 ;NEGATIVE TO START SHIPS FIRE SOUND ELSE LENGTH OF SOUND\r
113 SND2:   .BLKB 1                 ;NEGATIVE TO START SAUCER FIRE SOUND ELSE LENGTH OF SOUND\r
114 SND3:   .BLKB 1                 ;LENGTH OF TONE SOUND\r
115 LEXPSND:.BLKB 1                 ;LAST VALUE FOR EXPLOSION SOUND (SEE EXPSND)\r
116 LSND1:  .BLKB 1                 ;LAST VALUE FOR SHIP FIRE SOUND (SEE SHPFIR)\r
117 LSND2:  .BLKB 1                 ;LAST VALUE FOR SAUCER FIRE SOUND (SEE SCRFIR)\r
118 LTHUMP: .BLKB 1                 ;LAST VALUE FOR THUMP SOUND (SEE THUMP)\r
119 THUMP1: .BLKB 1                 ;LENGTH OF THUMP SOUNDS\r
120 THUMP2: .BLKB 1                 ;LENGTH BETWEEN THUMP SOUNDS\r
121 LOUT1:  .BLKB 1                 ;LAST VALUE OF OUTPUT LATCH\r
122 $$CRDT: .BLKB 1                 ;COIN ROUTINE DEFINITION (SEE COIN65.MAC)       \r
123 \r
124 $CMODE: .BLKB 1\r
125 $LMTIM: .BLKB 1\r
126 $CNCT:  .BLKB 1\r
127 $CCTIM: .BLKB 3\r
128 $PSTSL: .BLKB 3\r
129 $CNSTT: .BLKB 3\r
130 SHIPX:  .BLKB 2*6               ;EXPLOSION PICTURE X POSITION (LSB,MSB)\r
131 SHIPY:  .BLKB 2*6               ;       "       "  Y    "       "\r
132 \r
133 \r
134         .SBTTL PAGE 2 AND 3 DECLARATIONS\r
135 \r
136         .=200\r
137 OBJ:    .BLKB NOBJ+8            ;ZERO IF OBJECT NOT ACTIVE- OTHERWISE PICTURE NUMBER\r
138                                 ;BITS 0-2=SIZE, 1=SMALL, 2=MEDIUM, 4=LARGE\r
139                                 ;BITS 3-6=PICTURE NUMBER\r
140 XINC:   .BLKB NOBJ+8            ;X INCREMENT FOR UPDATING POSITION(S8999.BBB)\r
141 YINC:   .BLKB NOBJ+8            ;Y INCREMENT FOR UPDATING POSITION(S9999.BBB)\r
142 OBJXH:  .BLKB NOBJ+8            ;X POSITION OF OBJECT (HIGH ORDER)(00099999)\r
143 OBJYH:  .BLKB NOBJ+8            ;Y POSITION OF OBJECT (HIGH ORDER)(00099999)\r
144 OBJXL:  .BLKB NOBJ+8            ;X POSITION OF OBJECT (LOW ORDER)(99999.BBB)\r
145 OBJYL:  .BLKB NOBJ+8            ;Y POSITION OF OBJECT (LOW ORDER)(99999.BBB)\r
146 SROCKS: .BLKB 1                 ;NUMBER OF ROCKS TO START WITH\r
147 NROCKS: .BLKB 1                 ;CURRENT NUMBER OF ROCKS\r
148 EDELAY: .BLKB 1                 ;DELAY BEFORE ENEMY ENTRY OR FIRING\r
149 SEDLAY: .BLKB 1                 ;STARTING ENEMY DELAY\r
150 RTIMER: .BLKB 1                 ;ROCK TIME - IF 0 SEND IN SAUCER ANYWAY\r
151 SDELAY: .BLKB 1                 ;DELAY COUNT BEFORE ADDING SHIP (80=SHIP JUST DESTROYED)\r
152 RDELAY: .BLKB 1                 ;DELAY COUNT BEFORE ADDING ROCKS\r
153 THUMP3: .BLKB 1                 ;STARTING VALUE FOR THUMP2\r
154 DIFCTY: .BLKB 1                 ;DIFFICULTY VALUE FOR STARTING SAUCERS\r
155         .PAGE\r
156         .SBTTL MAIN LINE LOOP\r
157         .=6800\r
158 ;       JMP PWRON\r
159 START:  JSR INIT1               ;TURN OFF SOUNDS\r
160         JSR INIT                ;INITIALIZE PLAYER 1 FOR START OF GAME\r
161 START1: JSR NEWAST              ;START UP NEW ASTEROIDS\r
162 START2: LDA A,STSTSW            ;NOTE NMI NOT ACTIVE IF STSTSW ON\r
163 5$:     BMI 5$                  ;IN SELF TEST-WANT FOR WATCHDOG TO RESET SOUNDS\r
164         LSR SYNC\r
165         BCC START2                      ;WAIT FOR START OF FRAME\r
166 10$:    LDA A,HALT\r
167         BMI 10$                 ;WAIT FOR BEAM TO HALT\r
168         LDA A,VECRAM+1          ;SWITCH VECTOR BUFFERS\r
169         EOR I,02\r
170         STA A,VECRAM+1          ;CHANGE JMPL TO STARTING BUFFER\r
171         STA A,GOADD             ;START VECTOR GENERATOR\r
172         STA A,WTDOG\r
173         INC FRAME               ;INCREMENT FRAME COUNTER\r
174         BNE 11$                 ;NO OVERFLOW\r
175         INC FRAME+1\r
176 11$:    LDX I,VECRAM/100\r
177         AND I,02\r
178         BNE 12$                 ;USE LOWER BUFFER\r
179         LDX I,VECRAM/100+04     ;USE UPPER BUFFER\r
180 12$:    LDA I,VECRAM&0FF+2\r
181         STA VGLIST\r
182         STX VGLIST+1            ;RESET VECTOR LIST POINTER\r
183         JSR CHKST               ;CHECK FOR START\r
184         BCS START               ;START NEW GAME\r
185         JSR UPDATE              ;UPDATE HIGH SCORE TABLES\r
186         JSR GETINT              ;GET INITIALS FOR ANY NEW HIGH SCORE\r
187         BPL 20$                 ;UPDATE IN PROGRESS\r
188         JSR SCORES              ;DISPLAY HIGH SCORES\r
189         BCS 20$                 ;WE ARE DISPLAYING SCORE TABLE\r
190         LDA GDELAY              ;(NOT ENOUGH TIME FOR ASTEROIDS AND SCORE TABLES)\r
191         BNE 15$                 ;STARTING A NEW PLAYER\r
192         JSR FIRE                ;FIRE SHIPS TORPEDOS\r
193         JSR HYPER               ;CHECK FOR HYPERSPACE\r
194         JSR MOVE                ;MOVE SHIP BY CONTROLS\r
195         JSR ENEMY               ;LAUNCH ENEMY SAUCER AND TORPEDOS\r
196 15$:    JSR MOTION              ;MOVE OBJECTS\r
197         JSR COLIDE              ;CHECK FOR COLLISIONS\r
198 20$:    JSR PARAMS              ;DISPLAY SCORE AND OTHER PARAMETERS\r
199         JSR SOUNDS              ;GENERATE SOUNDS\r
200         LDA I,1023./8\r
201         TAX\r
202         JSR VGSABS              ;POSITION BEAM FOR MINIMUM CURRENT DRAW\r
203         JSR RAND                ;KEEP RANDOM NUMBERS COMING\r
204         JSR VGHALT              ;ADD HALT TO VECTOR LIST\r
205         LDA RDELAY\r
206         BEQ 30$                 ;NO DELAY TO DECREMENT\r
207         DEC RDELAY\r
208 30$:    ORA NROCKS\r
209         BNE START2                      ;LOOP FOR NEXT PASS\r
210         BEQ START1              ;START NEW SET OF ASTEROIDS\r
211 \f       .SBTTL CHKST-CHECK FOR START/END OF GAME\r
212 ;CHKST  -CHECK FOR START/END OF GAME\r
213 ;\r
214 ;EXIT   (C)=SET IF STARTING A NEW GAME\r
215 CHKST:  LDA NPLAYR\r
216         BEQ 10$                 ;GAME NOT IN PROGRESS\r
217         LDA GDELAY\r
218         BNE 60$                 ;STAY READY MODE\r
219         JMP CHKST1              ;WE ARE NOT IN PLAYER READY MODE\r
220 \r
221 60$:    DEC GDELAY\r
222         JSR CHKST2              ;DISPLAY PLAYER NUMBER MESSAGE\r
223 30$:    CLC\r
224         RTS\r
225         \r
226 35$:    LDA I,2\r
227         STA $$CRDT              ;FREE PLAY CREDIT\r
228         BNE 15$                 ;ALWAYS\r
229         \r
230 10$:    LDA UPDFLG\r
231         AND UPDFLG+1\r
232         BPL 30$                 ;IF UPDATING INITIALS\r
233         LDA $CMODE              ;IF FREE PLAY\r
234         AND I,03\r
235         BEQ 35$\r
236         CLC\r
237         ADC I,07\r
238         TAY\r
239         JSR VGMSG               ;GAME COST MESSAGE\r
240 15$:    LAH ASTMSG\r
241         LXL ASTMSG\r
242         JSR VGJSRL              ;PUT OUT "ASTEROIDS BY ATARI"\r
243         LDY $$CRDT\r
244         BEQ 30$                 ;NO CREDIT-NO PLAY\r
245         LDX I,01\r
246         LDA A,STRT1\r
247         BMI 20$                 ;ONE PLAYER START\r
248         CPY I,02\r
249         BCC 40$                 ;ONLY 1 CREDIT\r
250         LDA A,STRT2\r
251         BPL 40$                 ;NO START YET\r
252         LDA LOUT1               ;LAST VALUE TO OUT1\r
253         ORA I,04                ;SWITCH PAGE 2\r
254         STA LOUT1\r
255         STA A,OUT1\r
256         JSR INIT                ;REINITIALIZE MEMORY\r
257         JSR NEWAST              ;NEW ASTEROIDS\r
258         JSR NEWSHP              ;PUT SHIP IN MIDDLE\r
259         LDA NHITS\r
260         STA HITS+1\r
261         LDX I,02\r
262         DEC $$CRDT              ;ONE CREDIT LESS\r
263 20$:    STX NPLAYR              ;NUMBER OF PLAYERS\r
264         DEC $$CRDT              ;ONE CREDIT LESS\r
265         LDA LOUT1\r
266         AND I,0F8               ;BE SURE WE ARE ON THE RIGHT SIDE\r
267         EOR NPLAYR              ;LEAVE LITE ON FOR RIGHT GAME\r
268         STA LOUT1\r
269         STA A,OUT1              ;SET BANK FOR PLAYER 1\r
270         JSR NEWSHP              ;PUT SHIP IN MIDDLE\r
271         LDA I,01\r
272         STA SDELAY\r
273         STA SDELAY+100\r
274         LDA I,92                ;ENOUGH FOR 3 LARGE SAUCERS\r
275         STA SEDLAY              ;STARTING ENEMY DELAY\r
276         STA SEDLAY+100\r
277         STA EDELAY+100\r
278         STA EDELAY              ;DELAY ENTRY OF SHIP\r
279         LDA I,7F\r
280         STA RDELAY              ;DELAY FOR ROCKS\r
281         STA RDELAY+100\r
282         LDA I,05                ;INITIALIZE GAME DIFFICULTY\r
283         STA DIFCTY\r
284         STA DIFCTY+100\r
285         LDA I,-1\r
286         STA UPDFLG\r
287         STA UPDFLG+1\r
288         LDA I,80\r
289         STA GDELAY\r
290         ASL                     ;LDA I,0 SETS CARRY TOO\r
291         STA PLAYR\r
292         STA PLAYR2\r
293         LDA NHITS\r
294         STA HITS                ;NUMBER OF HITS ALLOWED\r
295         LDA I,04\r
296         STA LTHUMP              ;INITIALIZE THUMP SOUND AND COUNTERS\r
297         STA THUMP2\r
298         LDA I,30\r
299         STA THUMP3\r
300         STA THUMP3+100          ;RESET STARTING THUMP SOUND\r
301         STA A,NRESET            ;RESET NOISE GENERATOR\r
302         RTS\r
303         \r
304 40$:    LDA FRAME\r
305         AND I,20\r
306         BNE 41$                 ;NOT TIME TO DISPLAY MESSAGE\r
307         LDY I,6\r
308         JSR VGMSG               ;DISPLAY "PUSH START" MESSAGE\r
309 41$:    LDA FRAME\r
310         AND I,0F\r
311         BNE 45$                 ;DO NOT CHANGE LITE\r
312         LDA I,01\r
313         CMP $$CRDT              ;SET CARRY IF $$CRDT=1\r
314         ADC I,01                ;A=2 IF $$CRDT > 1 ELSE 3\r
315         EOR I,01                ;A=3 IF $$CRDT > 1 ELSE 2\r
316         EOR LOUT1\r
317         STA LOUT1               ;SET NMI WRITE TO OUT1\r
318 45$:    CLC\r
319         RTS\r
320 \r
321 CHKST1: LDA Z,FRAME\r
322         AND I,3F\r
323         BNE 70$                 ;ONLY EVERY 1 SECOND\r
324         LDA THUMP3\r
325         CMP I,08\r
326         BEQ 70$                 ;AT FASTEST RATE NOW\r
327         DEC THUMP3\r
328 70$:    LDX PLAYR\r
329         LDA X,HITS\r
330         BNE 60$                 ;IF HE STILL IN GAME\r
331         LDA OBJ+NOBJ+4\r
332         ORA OBJ+NOBJ+5\r
333         ORA OBJ+NOBJ+6\r
334         ORA OBJ+NOBJ+7\r
335         BNE 60$                 ;TORPEDO STILL ALIVE\r
336         LDY I,7\r
337         JSR VGMSG               ;GAME OVER MESSAGE\r
338         LDA NPLAYR\r
339         CMP I,02\r
340         BCC 60$                 ;1 PLAYER GAME\r
341         JSR CHKST2              ;DISPLAY PLAYER NUMBER\r
342 60$:    LDA OBJ+NOBJ\r
343         BNE 80$                 ;IF SHIP ALIVE OR EXPLODING\r
344         LDA SDELAY\r
345         CMP I,80\r
346         BNE 80$                 ;SHIP RETURNING TO LIFE\r
347         LDA I,10\r
348         STA SDELAY              ;RESET DELAY BEFORE ENTERING SHIP\r
349         LDX NPLAYR\r
350         LDA HITS\r
351         ORA HITS+1\r
352         BEQ 90$                 ;GAME IS ALL OVER\r
353         JSR RSAUCR              ;RESET SAUCER VALUES\r
354         DEX\r
355         BEQ 80$                 ;ONE PLAYER NO MESSAGE NEEDED\r
356         LDA I,80\r
357         STA GDELAY              ;DELAY BEFORE STARTING PLAYER\r
358         LDA PLAYR\r
359         EOR I,01\r
360         TAX                     ;1 TO 0 AND 0 TO 1\r
361         LDA X,HITS\r
362         BEQ 80$                 ;NO HITS FOR THIS PLAYER\r
363         STX PLAYR               ;SET PLAYER NUMBER\r
364         LDA I,04\r
365         EOR LOUT1\r
366         STA LOUT1\r
367         STA A,OUT1              ;SET BANK FOR PLAYER\r
368         TXA\r
369         ASL\r
370         STA PLAYR2\r
371 80$:    CLC\r
372         RTS\r
373 \r
374 90$:    STX LPLAYR              ;SAVE NUMBER OF PLAYERS IN THIS GAME\r
375         LDA I,-1\r
376         STA NPLAYR              ;FLAG TO UPDATE HIGH SCORES\r
377         JSR INIT1               ;TURN OFF SOUNDS\r
378         LDA I,03\r
379         ORA LOUT1               ;TURN OFF LIGHTS\r
380         STA LOUT1               ;LET NMI WRITE TO OUT1\r
381         CLC\r
382         RTS\r
383         \r
384 CHKST2: LDY I,1\r
385         JSR VGMSG               ;DISPLAY "PLAYER" MESSAGE\r
386         LDY PLAYR\r
387         INY\r
388         TYA                     ;1 OR 2\r
389         JSR VGHEX               ;DISPLAY PLAYER NUMBER\r
390         RTS\r
391         \r
392 CKSUM2: .BYTE 23        ;6800-6BFF\r
393 \r
394 \r
395         .SBTTL COLLIDE-COLLISION DETECTOR\r
396 COLIDE: LDX I,07\r
397 10$:    LDA X,OBJ+NOBJ\r
398         BEQ 13$                 ;IF INACTIVE TORPEDO\r
399         BPL 15$\r
400 13$:    DEX\r
401         BPL 10$\r
402         RTS\r
403         \r
404 15$:    LDY I,NOBJ+1\r
405         CPX I,04\r
406         BCS 20$                 ;NOT SAUCER OR SHIP OR SAUCERS TORPEDOES\r
407         DEY                     ;BYPASS SAUCER TO SAUCER COLISION\r
408         TXA\r
409         BNE 20$                 ;SHIP DOESN'T COLIDE WITH SHIP\r
410 19$:    DEY\r
411         BMI 13$                 ;END OF LOOP\r
412 20$:    LDA Y,OBJ\r
413         BEQ 19$                 ;IF INACTIVE\r
414         BMI 19$                 ;IF AN EXPLOSION\r
415         STA TEMP2\r
416         LDA Y,OBJXL             ;TEST X DIRECTION\r
417         SEC\r
418         SBC X,OBJXL+NOBJ\r
419         STA TEMP1\r
420         LDA Y,OBJXH\r
421         SBC X,OBJXH+NOBJ\r
422         LSR\r
423         ROR TEMP1\r
424         ASL\r
425         BEQ 25$                 ;IF WITHIN 64.\r
426         BPL 40$                 ;TOO FAR AWAY\r
427         EOR I,0FE\r
428         BNE 40$                 ;TOO FAR AWAY\r
429         LDA TEMP1\r
430         EOR I,0FF\r
431         STA TEMP1               ;DISTANCE FROM TORPEDO\r
432 25$:    LDA Y,OBJYL\r
433         SEC\r
434         SBC X,OBJYL+NOBJ\r
435         STA TEMP1+1\r
436         LDA Y,OBJYH\r
437         SBC X,OBJYH+NOBJ\r
438         LSR\r
439         ROR TEMP1+1\r
440         ASL\r
441         BEQ 35$                 ;IF WITHIN 64.\r
442         BPL 40$                 ;TOO FAR AWAY\r
443         EOR I,0FE\r
444         BNE 40$                 ;TOO FAR AWAY\r
445         LDA TEMP1+1\r
446         EOR I,0FF\r
447         STA TEMP1+1             ;DISTANCE-1 FROM TORPEDO\r
448 35$:    LDA I,42.\r
449         LSR TEMP2\r
450         BCS 37$                 ;SMALL SIZE\r
451         LDA I,72.\r
452         LSR TEMP2\r
453         BCS 37$                 ;MEDIUM SIZE\r
454         LDA I,132.              ;LARGE SIZE\r
455 37$:    CPX I,01\r
456         BCS 36$                 ;NOT THE SHIP\r
457         ADC I,28.               ;CARRY CLEAR\r
458 36$:    BNE 38$                 ;NOT THE SAUCER\r
459         ADC I,18.               ;FOR SMALL SAUCER\r
460         LDX OBJ+NOBJ+1\r
461         DEX\r
462         BEQ 34$                 ;IF SMALL SAUCER\r
463         ADC I,18.\r
464 34$:    LDX I,01                ;RESTORE X\r
465 38$:    CMP TEMP1\r
466         BCC 40$                 ;NO HIT\r
467         CMP TEMP1+1\r
468         BCC 40$                 ;NO HIT\r
469         STA TEMP2\r
470         LSR                     \r
471         CLC\r
472         ADC TEMP2\r
473         STA TEMP2               ;3/2 DISTANCE (NO CARRY IF LESS THAN 172.)\r
474         LDA TEMP1+1             ;CARRY IS CLEAR\r
475         ADC TEMP1\r
476         BCS 40$                 ;NUMBERS TOO LARGE\r
477         CMP TEMP2\r
478         BCS 40$                 ;CHOP OFF CORNERS-A MISS ON OBJECT\r
479         JSR DSTRCT\r
480 39$:    JMP 13$\r
481         \r
482 40$:    DEY\r
483         BMI 39$                 ;NEXT TORPEDO, SAUCER OR SHIP\r
484         JMP 20$                 ;NEXT ROCK\r
485         \r
486         \r
487 \r
488 \r
489         .SBTTL CPYPOS - COPY ATTRIBUTES OF ROCK\r
490 ;CPYPOS - COPY ATTRIBUTES OF ROCK\r
491 ;\r
492 ;ENTRY  (X)=NEW ROCK INDEX\r
493 ;       (Y)=OLD ROCK INDEX\r
494 CPYPOS: LDA Y,OBJ               ;COPY PICTURE\r
495         AND I,07\r
496         STA TEMP1               ;SAVE SIZE\r
497         JSR RAND                ;RANDOM NUMBER\r
498         AND I,18                ;PICTURE NUMBER\r
499         ORA TEMP1\r
500         STA X,OBJ\r
501         LDA Y,OBJXL             ;COPY POSITION\r
502         STA X,OBJXL\r
503         LDA Y,OBJXH\r
504         STA X,OBJXH\r
505         LDA Y,OBJYL\r
506         STA X,OBJYL\r
507         LDA Y,OBJYH\r
508         STA X,OBJYH\r
509         LDA Y,XINC              ;COPY VELOCITY\r
510         STA X,XINC\r
511         LDA Y,YINC\r
512         STA X,YINC\r
513         RTS\r
514         \r
515         \r
516         .SBTTL CPYVEC-COPY AND MODIFY VECTORS\r
517 ;CPYVEC-COPY AND MODIFY VECTORS (UP TO ONE PAGE WORTH)\r
518 ;\r
519 ;ENTRY  (TEMP1)=MASK FOR X SIGN (0 OR 4)\r
520 ;       (TEMP1+1)=MASK FOR Y SIGN (0 OR 4)\r
521 ;       (TEMP4+2)=VALUE TO BE ADDED TO INTENSITY (0,10,20...)\r
522 ;       (A)=LSB OF VECTOR TABLE TO COPY\r
523 ;       (X)=MSB OF VECTOR TABLE TO COPY\r
524 ;EXIT   (VGLIST,VGLIST+1)=UPDATED VECTOR LIST POINTER\r
525 ;       (TEMP2,TEMP2+1)=ADDRESS OF VECTOR TABLE\r
526 ;       (Y)=INDEX-1 INTO PICTURE (AT RTSL-1)\r
527 ;USES   (TEMP2,TEMP2+1),A,Y\r
528 CPYVEC: STA TEMP2\r
529         STX TEMP2+1             ;SETUP INDIRECT POINTER\r
530         LDY I,0\r
531 COPY:   INY\r
532         LDA NY,TEMP2\r
533         EOR TEMP1+1             ;MASK SIGN TO MATCH Y\r
534         STA NY,VGLIST\r
535         DEY\r
536         CMP I,0F0\r
537         BCS 20$                 ;IF AN ALPH INSTRUCTION\r
538         CMP I,0A0\r
539         BCS 30$                 ;NOT A VECTOR INSTRUCTION-QUIT\r
540         LDA NY,TEMP2            ;COPY REST\r
541         STA NY,VGLIST\r
542         INY\r
543         INY\r
544         LDA NY,TEMP2\r
545         STA NY,VGLIST\r
546         INY\r
547         LDA NY,TEMP2\r
548         EOR TEMP1               ;MASK SIGN TO MATCH X\r
549         ADC TEMP4+2             ;CHANGE INTENSITY\r
550         STA NY,VGLIST\r
551 15$:    INY\r
552         BNE COPY                ;ALWAYS (I HOPE)\r
553 \r
554 30$:    DEY                     ;USE INDEX\r
555         JMP VGADD               ;UPDATE VECTOR LIST POINTER\r
556         \r
557 20$:    LDA NY,TEMP2            ;ALPH INSTRUCTION\r
558         EOR TEMP1               ;MASK FOR X SIGN\r
559         CLC\r
560         ADC TEMP4+2             ;CHANGE INTENSITY\r
561         STA NY,VGLIST\r
562         INY\r
563         BNE 15$                 ;ALWAYS\r
564         \r
565         .SBTTL DSTRCT-DESTRUCTION DURING COLLISION\r
566 ;DSTRCT-DESTRUCTION DURING COLLISION\r
567 ;\r
568 ;ENTRY  (X)=SHIP, SAUCER OR TORPEDO INDEX-NOBJ\r
569 ;       (Y)=ROCK, SHIP OR SAUCER INDEX\r
570 ;\r
571 DSTRCT: CPX I,01\r
572         BNE 60$                 ;NOT SAUCER HITTING SHIP OR ROCKS\r
573         CPY I,NOBJ\r
574         BNE 62$                 ;SAUCER HIT ROCK\r
575         LDX I,0\r
576         LDY I,NOBJ+1            ;SHIP HIT SAUCER\r
577 60$:    TXA\r
578         BNE 63$                 ;IF NOT SHIP HIT A ROCK\r
579         LDA I,081\r
580         STA SDELAY              ;DELAY RESTARTING SHIP\r
581         LDX PLAYR\r
582         DEC X,HITS              ;DECREASE NUMBER OF LIVES\r
583         LDX I,0\r
584 62$:    LDA I,0A0\r
585         STA X,OBJ+NOBJ          ;EXPLOSION TIMER\r
586         LDA I,0\r
587         STA X,XINC+NOBJ         ;STOP SHIP\r
588         STA X,YINC+NOBJ\r
589         CPY I,NOBJ\r
590         BCC 65$                 ;SHIP OR SAUCER HITTING ROCK\r
591         BCS 80$                 ;SHIP & SAUCER COLLIDE\r
592 \r
593 63$:    LDA I,0\r
594         STA X,OBJ+NOBJ          ;CLEAR TORPEDO\r
595         CPY I,NOBJ\r
596         BEQ 75$                 ;HIT SHIP WITH TORPEDO\r
597         BCS 80$                 ;HIT SAUCER WITH TORPEDO\r
598 65$:    JSR SPLIT               ;SPLIT UP ROCKS\r
599 70$:    LDA Y,OBJ\r
600         AND I,03                ;SIZE 0=SMALL,1=MEDUIM,2=LARGE\r
601         EOR I,02                ;2=SMALL,3=MEDUIM,0=LARGE\r
602         LSR\r
603         ROR\r
604         ROR\r
605         ORA I,3F                ;LENGTH OF EXPLOSION\r
606         STA LEXPSND\r
607         LDA I,0A0               ;TIMER FOR EXPLOSION\r
608         STA Y,OBJ               ;STOP OBJECTS MOTION\r
609         LDA I,0\r
610         STA Y,XINC\r
611         STA Y,YINC\r
612 90$:    RTS\r
613         \r
614 75$:    TXA\r
615         LDX PLAYR\r
616         DEC X,HITS              ;DECREASE NUMBER OF LIVES\r
617         TAX                     ;RESTORE X\r
618         LDA I,081               ;DELAY BEFORE REENTERING SHIP\r
619         STA SDELAY\r
620         BNE 70$                 ;ALWAYS\r
621         \r
622 80$:    LDA SEDLAY\r
623         STA EDELAY              ;DELAY BEFORE ENTERING SAUCER\r
624         LDA NPLAYR\r
625         BEQ 70$                 ;IF IN ATTRACT\r
626         STX TEMP3               ;SAVE X\r
627         LDX PLAYR2\r
628         LDA OBJ+NOBJ+1\r
629         LSR\r
630         LDA I,99                ;1000 FOR SMALL\r
631         BCS 85$                 ;IF SMALL SAUCER\r
632         LDA I,20                ;200 POINTS FOR LARGE SAUCER\r
633 85$:    JSR POINTS              ;ADD 1000 PTS AND CHECK FOR 10K\r
634         LDX TEMP3               ;RESTORE X\r
635         JMP 70$\r
636         \r
637         .SBTTL ENEMY-LAUNCH EMEMY SAUCER\r
638 ;ENEMY  -LAUNCH ENEMY SAUCER\r
639 ;\r
640 ENEMY:  LDA FRAME\r
641         AND I,03\r
642         BEQ 1$                  ;EVERY FOURTH FRAME\r
643 50$:    RTS\r
644         \r
645 1$:     LDA OBJ+NOBJ+1\r
646         BMI 50$                 ;IF EXPLODING\r
647         BEQ 15$                 ;IF NOT ALIVE YET\r
648         JMP EFIRE               ;FIRE ENEMY TORPEDOES\r
649         \r
650 15$:    LDA NPLAYR\r
651         BEQ 6$                  ;IF IN ATTRACT SEND IN SAUCER\r
652         LDA OBJ+NOBJ\r
653         BEQ 50$                 ;IF YOU ARE NOT VISIBLE\r
654         BMI 50$                 ;IF EXPLODING\r
655 6$:     LDA RTIMER\r
656         BEQ 2$                  ;IF TIMER ALREADY\r
657         DEC RTIMER              ;DECREMENT ZERO TIMER\r
658 2$:     DEC EDELAY\r
659         BNE 50$                 ;NO TIME YET\r
660         LDA I,18.\r
661         STA EDELAY              ;DELAY BEFORE SHOOTING OR ENTERING\r
662         LDA RTIMER\r
663         BEQ 5$                  ;IF NO ROCKS HIT ENTER SAUCER\r
664         LDA NROCKS\r
665         BEQ 50$                 ;IF NO ROCKS\r
666         CMP DIFCTY\r
667         BCS 50$                 ;TOO MANY ROCKS\r
668 5$:     LDA SEDLAY\r
669         SEC\r
670         SBC I,06\r
671         CMP I,20\r
672         BCC 8$                  ;IF BELOW MINIMUM\r
673         STA SEDLAY\r
674 8$:     LDA I,0\r
675         STA A,OBJXL+NOBJ+1\r
676         STA A,OBJXH+NOBJ+1\r
677         JSR RAND                ;RANDOM NUMBER\r
678         LSR\r
679         ROR A,OBJYL+NOBJ+1\r
680         LSR\r
681         ROR A,OBJYL+NOBJ+1\r
682         LSR\r
683         ROR A,OBJYL+NOBJ+1\r
684         CMP I,18\r
685         BCC 10$                 ;MUST BE 0 TO 767\r
686         AND I,17\r
687 10$:    STA A,OBJYH+NOBJ+1      ;STARTING VERTICAL POSITION\r
688         LDX I,10\r
689         BIT POLYH\r
690         BVS 20$                 ;PICK DIRECTION\r
691         LDA I,1F\r
692         STA A,OBJXH+NOBJ+1\r
693         LDA I,0FF\r
694         STA A,OBJXL+NOBJ+1      ;START ON RIGHT SIDE\r
695         LDX I,-10\r
696 20$:    STX XINC+NOBJ+1\r
697         LDX I,02\r
698         LDA SEDLAY\r
699         BMI 40$                 ;KEEP IT LARGE FOR FIRST FEW APPEARANCES\r
700         LDY PLAYR2\r
701         LDA Y,SCORE+1\r
702         CMP I,30\r
703         BCS 38$                 ;IF SCORE LARGER, KEEP SMALL SAUCER\r
704         JSR RAND\r
705         STA TEMP1\r
706         LDA SEDLAY\r
707         LSR                     ;START AT 1/4 LARGE SAUCER\r
708         CMP TEMP1\r
709         BCS 40$                 ;KEEP LARGE SAUCER\r
710 38$:    DEX                     ;SMALL SAUCER\r
711 40$:    STX OBJ+NOBJ+1          ;USE MEDUIM SIZE PICTURE\r
712         RTS\r
713 \r
714         \r
715         .SBTTL EFIRE-ENEMY FIRE CONTROL\r
716 ;EFIRE-ENEMY FIRE CONTROL\r
717 ;\r
718 EFIRE:  LDA FRAME\r
719         ASL\r
720         BNE 10$                 ;NOT TIME TO CHANGE DIRECTION\r
721         JSR RAND\r
722         AND I,03\r
723         TAX\r
724         LDA X,99$\r
725         STA YINC+NOBJ+1\r
726 10$:    LDA NPLAYR\r
727         BEQ 30$                 ;IF IN ATTRACT\r
728         LDA SDELAY\r
729         BNE 40$                 ;DONT FIRE IF YOU ARE DEAD\r
730 30$:    DEC EDELAY\r
731         BEQ 50$                 ;NOT TIME TO SHOOT\r
732 40$:    RTS\r
733         \r
734 50$:    LDA I,10.\r
735         STA EDELAY              ;DELAY BEFORE NEXT SHOT\r
736         LDA OBJ+NOBJ+1\r
737         LSR\r
738         BEQ 80$                 ;IF SMALL SAUCER\r
739         JSR RAND\r
740         JMP 96$                 ;FIRE IN RANDOM DIRECTION\r
741 \r
742 80$:    LDA XINC+NOBJ+1\r
743         CMP I,80\r
744         ROR\r
745         STA TEMP2+1\r
746         LDA A,OBJXL+NOBJ        ;GET X DISTANCE TO SHIP\r
747         SEC\r
748         SBC A,OBJXL+NOBJ+1\r
749         STA TEMP2\r
750         LDA A,OBJXH+NOBJ\r
751         SBC A,OBJXH+NOBJ+1\r
752         ASL TEMP2\r
753         ROL\r
754         ASL TEMP2\r
755         ROL                     ;-7F TO +7F\r
756         SEC                     ;REMEMBER TORPEDO VELOCITY DEPENDS ON\r
757         SBC TEMP2+1             ;SAUCER SPEED\r
758         TAX\r
759         LDA YINC+NOBJ+1\r
760         CMP I,80\r
761         ROR\r
762         STA TEMP2+1\r
763         LDA A,OBJYL+NOBJ\r
764         SEC\r
765         SBC A,OBJYL+NOBJ+1\r
766         STA TEMP2\r
767         LDA A,OBJYH+NOBJ\r
768         SBC A,OBJYH+NOBJ+1\r
769         ASL TEMP2\r
770         ROL\r
771         ASL TEMP2\r
772         ROL                     ;-5F TO +5F\r
773         SEC\r
774         SBC TEMP2+1             ;REMEMBER TO ACCOUNT FOR OUR MOTION\r
775         TAY                     ;-60 TO +60\r
776         JSR ATAN                ;ARCTAN (Y/X)\r
777         STA ANGLE+1\r
778         JSR RAND                ;RANDOM NUMBER\r
779         LDX PLAYR2\r
780         LDY X,SCORE+1\r
781         CPY I,35\r
782         LDX I,0\r
783         BCC 90$                 ;IF NOT TO LIMIT YET\r
784         INX\r
785 90$:    AND X,97$\r
786         BPL 95$                 ;NO SIGN EXTENSION\r
787         ORA X,98$\r
788 95$:    ADC ANGLE+1             ;DONT BE TOO GOOD-JUST CLOSE\r
789 96$:    STA ANGLE+1             ;ANGLE TO AIM\r
790         LDY I,03                ;START LOOKING HERE\r
791         LDX I,01                ;FIRE FOR SAUCER\r
792         STX TEMP3+1             ;3 SAUCER TORPEDOS\r
793         JMP FIRE1               ;FIRE A TORPEDO\r
794         \r
795 97$:    .BYTE 8F,87             ;(GOOD,REAL GOOD) SMALL SAUCER\r
796 98$:    .BYTE 70,78\r
797 99$:    .BYTE -10,0,0,10        ;DIFFERENT SAUCER VELOCITIES\r
798 \f       .SBTTL FIRE-FIRE SHIPS TORPEDOS\r
799 ;FIRE-  FIRE SHIP TORPEDOS\r
800 ;\r
801 FIRE:   LDA NPLAYR\r
802         BEQ FIRE2               ;IN ATTRACT\r
803         ASL A,FIRESW            ;FULLY DECODED FOR R/W\r
804         ROR LASTSW\r
805         BIT LASTSW\r
806         BPL FIRE2               ;IF NOT ON\r
807         BVS FIRE2               ;IF NOT OFF BEFORE\r
808         LDA SDELAY\r
809         BNE FIRE2               ;SHIP NOT VISIBLE YET\r
810         TAX                     ;LDX I,0\r
811         LDA I,03\r
812         STA TEMP3+1             ;STOPPING INDEX FOR SHIP\r
813         LDY I,7                 ;NUMBER OF TORPEDOS ALLOWED\r
814 FIRE1:  LDA Y,OBJ+NOBJ\r
815         BEQ FIRE3               ;WE FOUND INACTIVE ONE\r
816         DEY\r
817         CPY TEMP3+1\r
818         BNE FIRE1\r\r
819 FIRE2:  RTS                     ;FIND INACTIVE TORPEDO TO USE\r
820         \r
821 FIRE3:  STX TEMP3\r
822         LDA I,12\r
823         STA Y,OBJ+NOBJ          ;SET TIMER FOR LENGTH OF LIFE\r
824         LDA X,ANGLE\r
825         JSR COS                 ;COS(ANGLE)-SHIPS SPEED=X CHANGE TO TORPEDO\r
826         LDX TEMP3\r
827         CMP I,80                ;DIVIDE BY 2\r
828         ROR                     ;SS999.BBB\r
829         STA TEMP1+1\r
830         CLC\r
831         ADC X,XINC+NOBJ\r
832         BMI 23$                 ;IF NEGATVE\r
833         CMP I,70\r
834         BCC 30$                 ;IF MAX NOT EXCEEDED\r
835         LDA I,6F\r
836         BNE 30$                 ;ALWAYS\r
837         \r
838 23$:    CMP I,-6F\r
839         BCS 30$                 ;IF MIN NOT EXCEEDED\r
840         LDA I,-6F\r
841 30$:    STA Y,XINC+NOBJ ;SET X SPEED\r
842         LDA X,ANGLE\r
843         JSR SIN                 ;SIN (ANGLE)\r
844         LDX TEMP3\r
845         CMP I,80                ;DIVIDE BY 2\r
846         ROR                     ;SSAAA.BBB\r
847         STA TEMP2+1\r
848         CLC\r
849         ADC X,YINC+NOBJ\r
850         BMI 33$                 ;IF NEGATIVE\r
851         CMP I,70\r
852         BCC 40$                 ;IF IN RANGE\r
853         LDA I,6F                ;SET MAX\r
854         BNE 40$                 ;ALWAYS\r
855         \r
856 33$:    CMP I,-6F\r
857         BCS 40$                 ;IF IN RANGE\r
858         LDA I,-6F\r
859 40$:    STA Y,YINC+NOBJ\r
860         LDX I,0\r
861         LDA TEMP1+1             ;SCALE TO PUT TORP AT NOSE OF SHIP\r
862         BPL 45$                 ;SIGN EXTENSION\r
863         DEX                     ;LDX I,0FF\r
864 45$:    STX TEMP1\r
865         LDX TEMP3\r
866         CMP I,80\r
867         ROR\r
868         CLC\r
869         ADC TEMP1+1             ;MULTIPLY BY 3/2\r
870         CLC\r
871         ADC X,OBJXL+NOBJ                ;ADD SHIPS POSITION TO GET STARTING POSITION\r
872         STA Y,OBJXL+NOBJ\r
873         LDA TEMP1\r
874         ADC X,OBJXH+NOBJ\r
875         STA Y,OBJXH+NOBJ\r
876         LDX I,0\r
877         LDA TEMP2+1             ;SCALE AGAIN TO PUT AT NOSE\r
878         BPL 50$                 ;SIGN EXTENSION\r
879         DEX                     ;LDX I,0FF\r
880 50$:    STX TEMP2\r
881         LDX TEMP3\r
882         CMP I,80\r
883         ROR\r
884         CLC\r
885         ADC TEMP2+1             ;MULTIPLY BY 3/2\r
886         CLC\r
887         ADC X,OBJYL+NOBJ                ;ADD SHIPS POSITION TO GET STARTING POSITION\r
888         STA Y,OBJYL+NOBJ\r
889         LDA TEMP2\r
890         ADC X,OBJYH+NOBJ\r
891         STA Y,OBJYH+NOBJ\r
892         LDA I,80\r
893         STA X,SND1              ;START FIRE SOUND FOR SHIP OR SAUCER\r
894         RTS\r
895         \r
896 CKSUM3: .BYTE 0DC               ;6C00-6FFF\r
897         \r
898         \r
899         .SBTTL GETINT-GET PLAYERS INITIALS FOR HIGH SCORE\r
900 ;GETINT-GET PLAYERS INITIALS FOR HIGH SCORE\r
901 ;\r
902 GETINT: LDA UPDFLG\r
903         AND UPDFLG+1\r
904         BPL 10$                 ;GET PLAYERS INITIALS\r
905         RTS\r
906         \r
907 10$:    LDA LPLAYR\r
908         LSR\r
909         BEQ 25$                 ;IF LAST GAME WAS 1 PLAYER GAME\r
910         LDY I,1\r
911         JSR VGMSG               ;DISPLAY MESSAGE 1\r
912         LDY I,02\r
913         LDX UPDFLG+1\r
914         BPL 20$                 ;IF PLAYER 2\r
915         DEY                     ;LDY I,01\r
916 20$:    STY PLAYR\r
917         LDA FRAME\r
918         AND I,10\r
919         BNE 25$                 ;FLASH PLAYER NUMBER\r
920         TYA\r
921         JSR VGHEX               ;DISPLAY PLAYER NUMBER\r
922 25$:    LDY I,2\r
923         JSR VGMSG               ;DISPLAY MESSAGE 2 - INSTRUCTIONS\r
924         LDY I,3\r
925         JSR VGMSG\r
926         LDY I,4\r
927         JSR VGMSG\r
928         LDY I,5\r
929         JSR VGMSG\r
930         LDA I,20\r
931         STA VGSIZE              ;USE LARGER CHARACTER FOR INITIALS\r
932         LDA I,400./4\r
933         LDX I,228./4\r
934         JSR VGSABS              ;POSITION BEAM\r
935         LDA I,70\r
936         JSR VGWAIT              ;WAIT FOR BEAM\r
937         LSR PLAYR               ;0 OR 1=PLAYER NUMBER-FOR FLASHING SCORE\r
938         LDX PLAYR\r
939         LDY X,UPDFLG\r
940         STY TEMP2\r
941         TYA\r
942         CLC\r
943         ADC UPDINT\r
944         STA TEMP2+1             ;INDEX FOR THE INITIAL WE ARE WORKING ON\r
945         JSR INITAL              ;DISPLAY INITIAL\r
946         LDY TEMP2\r
947         INY\r
948         JSR INITAL              ;DISPLAY INITIAL\r
949         LDY TEMP2\r
950         INY\r
951         INY\r
952         JSR INITAL              ;DISPLAY THIRD INITIAL\r
953 50$:    LDA A,HYPSW\r
954         ROL\r
955         ROL LASTSW              ;SWITCH DEBOUNCE\r
956         LDA LASTSW\r
957         AND I,1F\r
958         CMP I,07\r
959         BNE 60$                 ;NOT A VALID SWITCH\r
960         INC UPDINT              ;ADVANCE TO NEXT LETTER\r
961         LDA UPDINT\r
962         CMP I,03\r
963         BCC 55$                 ;IF WE ARE NOT DONE\r
964         LDX PLAYR\r
965         LDA I,-1\r
966         STA X,UPDFLG            ;CLEAR UPDATING FLAG\r
967         LDX I,0\r
968         STX UPDINT              ;START NEXT PLAYER\r
969         INX                     ;PREVENT TIMEOUT IF BOTH PLAYERS SET HIGH SCORE\r
970         STX FRAME+1             ;BRING UP HIGH SCORE TABLE NEXT\r
971         RTS\r
972         \r
973 55$:    INC TEMP2+1\r
974         LDX TEMP2+1\r
975         LDA I,0F0               ;ABOUT 64 SECONDS\r
976         STA FRAME+1             ;RESET TIMEOUT\r
977         LDA I,11.\r
978         STA X,INITL             ;SET INITIAL TO A\r
979 60$:    LDA FRAME+1\r
980         BNE 65$                 ;NO TIMEOUT\r
981         LDA I,-1\r
982         STA UPDFLG\r
983         STA UPDFLG+1            ;STOP INITIALS\r
984         BMI 90$                 ;ALWAYS\r
985 \r
986 65$:    LDA FRAME\r
987         AND I,07\r
988         BNE 90$                 ;EVERY 8TH FRAME\r
989         LDA A,ROTL\r
990         BPL 70$                 ;NOT ROTATING LEFT\r
991         LDA I,01\r
992         BNE 75$                 ;ADD 1 TO LETTER NUMBER\r
993         \r
994 70$:    LDA A,ROTR\r
995         BPL 90$                 ;NOT ROTATING RIGHT\r
996         LDA I,-1\r
997 75$:    LDX TEMP2+1\r
998         CLC\r
999         ADC X,INITL             ;CHANGE INITIAL\r
1000         BMI 78$                 ;BEFORE A BLANK MUST BE Z\r
1001         CMP I,11.\r
1002         BCS 80$                 ;IF GREATER THAN A\r
1003         CMP I,01\r
1004         BEQ 77$                 ;AFTER BLANK COMES A\r
1005         LDA I,0                 ;BEFORE A COMES A BLANK\r
1006         BEQ 85$\r
1007 \r
1008 77$:    LDA I,11.               ;A\r
1009         BNE 85$                 ;ALWAYS\r
1010 \r
1011 78$:    LDA I,36.               ;MAKE IT A Z\r
1012 80$:    CMP I,37.\r
1013         BCC 85$                 ;LESS THAN Z\r
1014         LDA I,0\r
1015 85$:    STA X,INITL\r
1016 90$:    LDA I,0                 ;MUST BE POSITIVE ON RETURN\r
1017         RTS\r
1018 \r
1019 \r
1020         .SBTTL HYPER - HYPERSPACE BUTTON PROCESSING\r
1021 ;HYPER - HYPERSPACE BUTTON PROCESSING\r
1022 ;\r
1023 HYPER:  LDA NPLAYR\r
1024         BEQ 90$                 ;IF IN ATTRACT\r
1025         LDA OBJ+NOBJ\r
1026         BMI 90$                 ;IF EXPLODING\r
1027         LDA SDELAY\r
1028         BNE 90$                 ;NOT ON SCREEN YET\r
1029         LDA A,HYPSW\r
1030         BPL 90$                 ;HYPERSWITCH NOT ON\r
1031         LDA I,0\r
1032         STA OBJ+NOBJ            ;CLEAR PICTURE\r
1033         STA XINC+NOBJ           ;STOP SHIP\r
1034         STA YINC+NOBJ\r
1035         LDA I,30\r
1036         STA SDELAY              ;DELAY BEFORE ADDING SHIP\r
1037         JSR RAND\r
1038         AND I,1F\r
1039         CMP I,1D                ;STAY AWAY FROM THE EDGE\r
1040         BCC 2$\r
1041         LDA I,1C\r
1042 2$:     CMP I,03\r
1043         BCS 4$                  ;STAY AWAY FROM THE EDGE\r
1044         LDA I,03\r
1045 4$:     STA A,OBJXH+NOBJ\r
1046         LDX I,5\r
1047 5$:     JSR RAND                ;5 CALLS TO RAND TO GET RANDOM NUMBER\r
1048         DEX\r
1049         BNE 5$\r
1050         AND I,1F\r
1051         INX                     ;LDX I,1\r
1052         CMP I,18\r
1053         BCC 10$                 ;IF IN RANGE\r
1054         AND I,07                ;DESTRUCTION PROPORTIONAL TO NROCKS\r
1055         ASL\r
1056         ADC I,04                ;CARRY WAS CLEAR (4 TO 12)\r
1057         CMP NROCKS\r
1058         BCC 10$                 ;LET HIM LIVE\r
1059         LDX I,80                ;FLAG FOR DISTRUCT\r
1060 10$:    CMP I,15\r
1061         BCC 12$                 ;STAY AWAY FROM TOP\r
1062         LDA I,14\r
1063 12$:    CMP I,03\r
1064         BCS 20$                 ;STAY AWAY FROM BOTTOM\r
1065         LDA I,03\r
1066 20$:    STA A,OBJYH+NOBJ        ;NEW Y POSITION\r
1067         STX RENTRY              ;FLAG HYPERSPACE\r
1068 90$:    RTS\r
1069         \r
1070         \r
1071         .SBTTL INIT-INITIALIZATION\r
1072 INIT:   LDA I,02                ;STARTING NUMBER OF ROCKS-2 (ADDS 2 IN START LOOP)\r
1073         STA SROCKS\r
1074         LDX I,03\r
1075         LSR OPTN3\r
1076         BCS 10$                 ;IF HARD GAME\r
1077         INX                     ;IF EASY GAME\r
1078 10$:    STX NHITS\r
1079         LDA I,0\r
1080         LDX I,04\r
1081 30$:    STA X,OBJ+NOBJ\r
1082         STA X,OBJ+NOBJ+4\r
1083         STA X,SCORE-1           ;CLEAR SCORE\r
1084         DEX\r
1085         BPL 30$                 ;CLEAR TORPEDOS AND SAUCER\r
1086         STA NROCKS              ;CLEAR NUMBER OF ROCKS\r
1087         RTS\r
1088 \r
1089 \r
1090 ;INIT1 - INITIALIZE ALL SOUNDS\r
1091 ;\r
1092 INIT1:  LDA I,0                 ;STOP ALL SOUNDS\r
1093         STA A,EXPSND\r
1094         STA A,THUMP\r
1095         STA A,SCRSND\r
1096         STA A,SCRFIR\r
1097         STA A,SHPSND\r
1098         STA A,SHPFIR\r
1099         STA A,TONE\r
1100         STA LEXPSND             ;TURN OF SOUNDS IN SOFTWARE TOO\r
1101         STA SND1\r
1102         STA SND2\r
1103         STA SND3\r
1104         RTS\r
1105         \r
1106         \r
1107         .SBTTL INITAL-DISPLAY AN INITIAL ON THE SCREEN\r
1108 ;INITIAL-DISPLAY INITIAL ON SCREEN\r
1109 ;ENTRY  (Y)=INDEX INTO INITL TABLE\r
1110 INITAL: LDA Y,INITL             ;INITIAL\r
1111         ASL                     ;INDEX INTO VGMSGA TABLE\r
1112         TAY\r
1113         BNE VGCHAR              ;IF NOT A BLANK\r
1114         LDA UPDFLG\r
1115         AND UPDFLG+1\r
1116         BMI VGCHAR              ;NOT UPDATING INITIALS\r
1117         LDA I,72                ;ASSUMES .BRITE=7\r
1118         LDX I,0F8               ;VCTR 8,0,7\r
1119         JSR VGADD2              ;UNDERLINE\r
1120         LDA I,01\r
1121         LDX I,0F8               ;VCTR 4,0,0\r
1122 ;       JMP VGADD2\r
1123 \r
1124 \r
1125 ;VGADD2-ADD 2 WORDS TO VECTOR LIST\r
1126 ;\r
1127 ;ENTRY  (A)=FIRST BYTE\r
1128 ;       (X)=SECOND BYTE\r
1129 ;EXIT   (VGLIST,VGLIST+1)=NEW VECTOR LIST POINTER\r
1130 ;USES   A,Y\r
1131 VGADD2: LDY I,0\r
1132         STA NY,VGLIST\r
1133         INY\r
1134         TXA\r
1135         STA NY,VGLIST\r
1136         JMP VGADD               ;UPDATE VECTOR POINTER\r
1137         \r
1138 ;VGCHAR-DISPLAY A CHARACTER\r
1139 ;\r
1140 ;ENTRY  (Y)=INDEX OF CHARACTER (0=BLANK,2=0,4=1,ETC)\r
1141 ;USES   A,X,Y\r
1142 VGCHAR: LDA AY,VGMSGA\r
1143         LDX AY,VGMSGA+1\r
1144         JMP VGADD2              ;ADD TO VECTOR LIST\r
1145 \r
1146 \r
1147         .SBTTL LIVES - DRAW A SHIP FOR EACH LIFE YOU HAVE LEFT\r
1148 ;LIVES - DRAW A SHIP FOR EACH LIFE YOU HAVE LEFT\r
1149 ;\r
1150 ;ENTRY  (A)=X POSITION FOR START OF PICTURES\r
1151 ;       (CC)=ZERO IF (Y)=0\r
1152 ;       (Y)=NUMBER OF LIFES\r
1153 LIVES:  BEQ 99$                 ;NO LIVES LEFT\r
1154         STY TEMP1\r
1155         LDX I,852./4            ;Y POSITION FOR PICTURES\r
1156         LDY I,0E0               ;1/4 SIZE PICTURE\r
1157         STY VGSIZE\r
1158         JSR VGSABS              ;POSITION BEAM AND RESET SCALE FACTOR\r
1159 10$:    LXL SHIP17              ;LSB OF SHIP PICTURE ROUTINE\r
1160         LAH SHIP17\r
1161         JSR VGJSRL              ;JSRL TO PICTURE\r
1162         DEC TEMP1\r
1163         BNE 10$                 ;IF MORE LIVES LEFT\r
1164 99$:    RTS\r
1165 \r
1166 \r
1167         .SBTTL MOTION - MOTION UPDATE ROUTINE\r
1168 ;MOTION-MOTION UPDATE ROUTINE\r
1169 ;\r
1170 ;THIS ROUTINE ALSO UPDATES THE EXPLOSION INDEX TO SEQUENCE\r
1171 ;THRU THE PICTURES.\r
1172 MOTION: LDX I,NOBJ+7            ;NUMBER OF OBJECTS TO MOVE\r
1173 10$:    LDA X,OBJ\r
1174         BNE 12$                 ;ACTIVE OBJECT\r
1175 13$:    DEX\r
1176         BPL 10$                 ;MORE OBJECTS\r
1177         RTS\r
1178         \r
1179 12$:    BPL 14$                 ;IF OBJECT ACTIVE\r
1180         JSR COMP                ;TIME REMAINING (0 TO 60)\r
1181         LSR\r
1182         LSR\r
1183         LSR\r
1184         LSR\r
1185         CPX I,NOBJ\r
1186         BNE 16$                 ;NOT THE SHIP\r
1187         LDA FRAME\r
1188         AND I,01                ;ADD 1 EVERYOTHER FRAME\r
1189         LSR\r
1190         BEQ 42$                 ;ALWAYS\r
1191 \r
1192 16$:    SEC                     ;1+ VALUE /16\r
1193 42$:    ADC X,OBJ               ;NEW EXPLOSION PICTURE\r
1194         BMI 11$                 ;STILL INACTIVE\r
1195         CPX I,NOBJ\r
1196         BEQ 18$                 ;IF THE SHIP\r
1197         BCS 40$                 ;IF THE SAUCER\r
1198         DEC NROCKS\r
1199         BNE 17$                 ;IF MORE ROCKS REMAIN\r
1200         LDY I,7F                ;DELAY BEFORE STARTING\r
1201         STY RDELAY\r
1202 17$:    LDA I,0\r
1203         STA X,OBJ               ;RESET PICTURE\r
1204         BEQ 13$\r
1205         \r
1206 18$:    JSR NEWSHP              ;RESET SHIP\r
1207         JMP 17$\r
1208 \r
1209 40$:    LDA SEDLAY\r
1210         STA EDELAY              ;DELAY BEFORE REENTERING\r
1211         BNE 17$                 ;ALWAYS\r
1212         \r
1213 11$:    STA X,OBJ\r
1214         AND I,0F0               ;A0 TO 0F0\r
1215         CLC\r
1216         ADC I,10                ;B0 TO 0\r
1217         CPX I,NOBJ\r
1218         BNE 41$                 ;NOT THE SHIP\r
1219         LDA I,0                 ;NO SCALING FOR SHIP EXPLOSION\r
1220 41$:    TAY\r
1221         LDA X,OBJXL\r
1222         STA XCOMP\r
1223         LDA X,OBJXH\r
1224         STA XCOMP+1\r
1225         LDA X,OBJYL\r
1226         STA XCOMP+2\r
1227         LDA X,OBJYH\r
1228         STA XCOMP+3\r
1229         JMP 30$\r
1230         \r
1231 14$:    CLC\r
1232         LDY I,0\r
1233         LDA X,XINC\r
1234         BPL 15$                 ;SIGN EXTENSION\r
1235         DEY\r
1236 15$:    ADC X,OBJXL\r
1237         STA X,OBJXL\r
1238         STA XCOMP\r
1239         TYA\r
1240         ADC X,OBJXH\r
1241         CMP I,20\r
1242         BCC 19$                 ;IF 0 TO 1023\r
1243         AND I,1F\r
1244         CPX I,NOBJ+1\r
1245         BNE 19$                 ;NOT THE SAUCER\r
1246         JSR RSAUCR              ;RESET SAUCER VALUES\r
1247         JMP 13$                 ;ALWAYS\r
1248 \r
1249 19$:    STA X,OBJXH\r
1250         STA XCOMP+1\r
1251         CLC\r
1252         LDY I,0\r
1253         LDA X,YINC\r
1254         BPL 20$                 ;SIGN EXTENSION\r
1255         LDY I,0FF\r
1256 20$:    ADC X,OBJYL\r
1257         STA X,OBJYL\r
1258         STA XCOMP+2\r
1259         TYA\r
1260         ADC X,OBJYH             ;0 TO 767 PLEASE\r
1261         CMP I,18\r
1262         BCC 25$                 ;ALREADY 0 TO 767\r
1263         BEQ 24$                 ;IF 768 UP\r
1264         LDA I,17\r
1265         BNE 25$\r
1266 \r
1267 24$:    LDA I,0\r
1268 25$:    STA X,OBJYH\r
1269         STA XCOMP+3\r
1270         LDA X,OBJ\r
1271         LDY I,0E0               ;1/4 SIZE PICTURE\r
1272         LSR\r
1273         BCS 30$                 ;SMALLEST SIZE\r
1274         LDY I,0F0               ;1/2 SIZE PICTOR\r
1275         LSR\r
1276         BCS 30$                 ;MEDIUM SIZE\r
1277         LDY I,0                 ;FULL SIZE\r
1278 30$:    JSR PICTUR              ;DISPLAY PICTURE\r
1279         JMP 13$\r
1280         \r
1281 RSAUCR: LDA SEDLAY\r
1282         STA EDELAY              ;DELAY BEFORE RESTARTING\r
1283         LDA I,0\r
1284         STA OBJ+NOBJ+1          ;CLEAR SAUCER\r
1285         STA XINC+NOBJ+1         ;STOP SPEED FOR NEWAST\r
1286         STA YINC+NOBJ+1\r
1287         RTS\r
1288 \f       .SBTTL MOVE-MOVE SHIP\r
1289 ;MOVE-MOVE SHIP\r
1290 ;\r
1291 MOVE:   LDA NPLAYR\r
1292         BEQ 90$                 ;IN ATTRACT MODE\r
1293         LDA OBJ+NOBJ\r
1294         BMI 90$                 ;IF EXPLODING\r
1295         LDA SDELAY\r
1296         BEQ 5$                  ;SHIP IS VISIBLE\r
1297         DEC SDELAY              ;DECREMENT COUNT\r
1298         BNE 90$                 ;NOT DONE YET\r
1299         LDY RENTRY\r
1300         BMI 93$                 ;IF BLOW UP OR RE-ENTRY\r
1301         BNE 92$                 ;IF RETURNING FROM HYPERSPACE\r
1302         JSR NEARBY              ;CHECK FOR AREA FREE OF ROCKS\r
1303         BNE 97$                 ;IF SOMETHING CLOSE BY\r
1304         LDY OBJ+NOBJ+1\r
1305         BEQ 92$                 ;IF SAUCER NOT VISIBLE\r
1306         LDY I,02\r
1307         STY SDELAY              ;DELAY SOME MORE\r
1308         RTS\r
1309         \r
1310 92$:    LDA I,01\r
1311         STA OBJ+NOBJ            ;USE 1/4 SIZE PICTURE\r
1312         BNE 97$\r
1313 \r
1314 93$:    LDA I,0A0\r
1315         STA OBJ+NOBJ            ;BLOW UP\r
1316         LDX I,3E\r
1317         STX LEXPSND             ;SOUND OF EXPLOSION\r
1318         LDX PLAYR\r
1319         DEC X,HITS\r
1320         LDA I,081\r
1321         STA SDELAY              ;DELAY BEFORE ENTRY\r
1322 97$:    LDA I,0\r
1323         STA RENTRY              ;CLEAR HYPERSPACE FLAG\r
1324 90$:    RTS\r
1325         \r
1326 5$:     LDA A,ROTL\r
1327         BPL 10$                 ;NO ROTATE LEFT\r
1328         LDA I,03\r
1329         BNE 15$                 ;ALWAYS\r
1330         \r
1331 10$:    LDA A,ROTR\r
1332         BPL 20$                 ;NO ROTATE RIGHT\r
1333         LDA I,-3\r
1334 15$:    CLC\r
1335         ADC ANGLE\r
1336         STA ANGLE               ;NEW ROTATION ANGLE\r
1337 20$:    LDA FRAME\r
1338         LSR\r
1339         BCS 90$                 ;EVERY OTHER FRAME CHECK THRUST\r
1340 MOVE1:  LDA A,THRUST\r
1341         BPL 80$                 ;NO THRUST\r
1342         LDA I,80\r
1343         STA A,SHPSND            ;SOUND FOR THRUST\r
1344         LDY I,0\r
1345         LDA ANGLE\r
1346         JSR COS                 ;COS(ANGLE)=(CHANGE IN XINC)*4\r
1347         BPL 25$                 ;SIGN EXTENSION\r
1348         DEY                     ;LDY I,-1\r
1349 25$:    ASL\r
1350         CLC\r
1351         ADC XINCL               ;ADD TO SHIPS VELOCITY\r
1352         TAX\r
1353         TYA\r
1354         ADC XINC+NOBJ\r
1355         JSR MOVE2               ;CHECK FOR RANGE\r
1356         STA XINC+NOBJ\r
1357         STX XINCL\r
1358         LDY I,0\r
1359         LDA ANGLE\r
1360         JSR SIN                 ;SIN(ANGLE)\r
1361         BPL 50$                 ;SIGN EXTEND\r
1362         DEY                     ;LDY I,0FF\r
1363 50$:    ASL\r
1364         CLC\r
1365         ADC YINCL\r
1366         TAX\r
1367         TYA\r
1368         ADC YINC+NOBJ\r
1369         JSR MOVE2               ;CHECK FOR RANGE\r
1370         STA YINC+NOBJ\r
1371         STX YINCL\r
1372         RTS\r
1373 \r
1374 80$:    LDA I,0\r
1375         STA A,SHPSND            ;TURN OFF THRUST SOUND\r
1376         LDA XINC+NOBJ\r
1377         ORA XINCL\r
1378         BEQ 87$                 ;IF X=0\r
1379         LDA XINC+NOBJ\r
1380         ASL                     ;ASSUMES SPEED IS (-3F TO 3F)\r
1381         LDX I,0FF               ;SIGN EXTENSION\r
1382         CLC\r
1383         EOR I,0FF\r
1384         BMI 86$                 ;IF IT WAS POSITIVE\r
1385         INX                     ;LDX I,0\r
1386         SEC                     ;1+ X/128 FOR FRICTION\r
1387 86$:    ADC XINCL\r
1388         STA XINCL\r
1389         TXA\r
1390         ADC XINC+NOBJ\r
1391         STA XINC+NOBJ\r
1392 87$:    LDA YINCL\r
1393         ORA YINC+NOBJ\r
1394         BEQ 89$                 ;IF Y=0\r
1395         LDA YINC+NOBJ\r
1396         ASL\r
1397         LDX I,0FF               ;SIGN EXTENSION\r
1398         CLC\r
1399         EOR I,0FF\r
1400         BMI 88$                 ;IF WAS POSITIVE\r
1401         SEC                     ;1+Y/128\r
1402         INX                     ;LDX I,0\r
1403 88$:    ADC YINCL\r
1404         STA YINCL\r
1405         TXA\r
1406         ADC YINC+NOBJ\r
1407         STA YINC+NOBJ\r
1408 89$:    RTS\r
1409 \r
1410 MOVE2:  BMI 30$                 ;IF OUT OF RANGE\r
1411         CMP I,40\r
1412         BCC 35$                 ;IF IN RANGE\r
1413         LDX I,0FF               ;MAX\r
1414         LDA I,3F\r
1415         RTS\r
1416 \r
1417 30$:    CMP I,-3F\r
1418         BCS 35$                 ;IF IN RANGE\r
1419         LDX I,01                ;-3FFF=C001\r
1420         LDA I,0C0               ;SET MAX NEGATIVE\r
1421 35$:    RTS\r
1422 \r
1423 \r
1424         .SBTTL NEARBY - CHECK FOR ROCKS NEARBY\r
1425 ;NEARBY - CHECK FOR ROCKS NEAR SHIP\r
1426 ;\r
1427 ;EXIT   (CC)=0 IF AREA FREE OF ROCKS\r
1428 ;       (SDELAY)>0 IF ROCK NEAR SHIP\r
1429 NEARBY: LDX I,NOBJ+1\r
1430 10$:    LDA X,OBJ\r
1431         BEQ 40$                 ;OBJECT NOT ALIVE\r
1432         LDA X,OBJXH\r
1433         SEC\r
1434         SBC OBJXH+NOBJ\r
1435         CMP I,04\r
1436         BCC 20$                 ;IF CLOSE ENOUGH\r
1437         CMP I,-4\r
1438         BCC 40$                 ;TOO FAR AWAY\r
1439 20$:    LDA X,OBJYH\r
1440         SEC\r
1441         SBC OBJYH+NOBJ\r
1442         CMP I,04\r
1443         BCC 50$                 ;TOO CLOSE\r
1444         CMP I,-4\r
1445         BCS 50$                 ;TOO CLOSE\r
1446 40$:    DEX\r
1447         BPL 10$                 ;LOOP THRU ALL OBJECTS\r
1448         INX                     ;ZERO FLAG ON EXIT\r
1449         RTS\r
1450 \r
1451 50$:    INC SDELAY              ;DELAY BEFORE ENTERING SHIP\r
1452         RTS                     ;SETS NON-ZERO FLAG\r
1453         \r
1454 CKSUM4: .BYTE 99                ;7000-73FF\r
1455         \r
1456 \r
1457         .SBTTL NEWAST - START UP NEW ASTEROIDS\r
1458 ;NEWAST-START NEW ASTEROIDS\r
1459 ;\r
1460 NEWAST: LDX I,NOBJ-1\r
1461         LDA RDELAY\r
1462         BNE 65$                 ;DELAY FIRST - CLEAR OLD ROCKS IF ANY\r
1463         LDA OBJ+NOBJ+1\r
1464         BNE 90$                 ;NOT WHILE SAUCER IS THERE\r
1465         STA XINC+NOBJ+1         ;CLEAR SPEED OF SAUCER\r
1466         STA YINC+NOBJ+1\r
1467         INC DIFCTY\r
1468         LDA DIFCTY\r
1469         CMP I,11.\r
1470         BCC 2$                  ;NOT TOO DIFFICULT\r
1471         DEC DIFCTY\r
1472 2$:     LDA SROCKS\r
1473         CLC\r
1474         ADC I,02\r
1475         CMP I,11.\r
1476         BCC 5$                  ;MAX NUMBER OF OBJECTS\r
1477         LDA I,11.               ;LEAVE ONE OPEN PICTURE\r
1478 5$:     STA NROCKS              ;NUMBER OF ROCKS ACTIVE\r
1479         STA SROCKS\r
1480         STA TEMP1\r
1481         LDY I,NOBJ+1\r
1482 10$:    JSR RAND                ;RANDOM NUMBER\r
1483         AND I,18                ;PICTURE NUMBER\r
1484         ORA I,04                ;SIZE OF OBJECT\r
1485         STA X,OBJ               ;SET PICTURE\r
1486         JSR NEWVEL              ;GET NEW VELOCITY\r
1487         JSR RAND                ;RANDOM NUMBER\r
1488         LSR\r
1489         AND I,1F\r
1490         BCC 50$                 ;START ON X ARIS\r
1491         CMP I,18                ;START ON Y AXIS\r
1492         BCC 35$                 ;IF 0 TO 767\r
1493         AND I,17                ;384 TO 512\r
1494 35$:    STA X,OBJYH\r
1495         LDA I,0\r
1496         STA X,OBJXH\r
1497         STA X,OBJXL\r
1498         BEQ 60$                 ;ALWAYS\r
1499         \r
1500 50$:    STA X,OBJXH\r
1501         LDA I,0\r
1502         STA X,OBJYH\r
1503         STA X,OBJYL\r
1504 60$:    DEX\r
1505         DEC TEMP1\r
1506         BNE 10$                 ;LOOP FOR EACH NEW ROCK\r
1507         LDA I,7F\r
1508         STA EDELAY              ;SAUCER SHOULD WAIT\r
1509         LDA I,30\r
1510         STA THUMP3              ;RESET THUMP SOUND\r
1511 65$:    LDA I,0\r
1512 70$:    STA X,OBJ               ;CLEAR REST OF OBJECTS\r
1513         DEX\r
1514         BPL 70$                 ;ASSUMES SROCKS < NOBJ\r
1515 90$:    RTS\r
1516         \r
1517         \r
1518 ;NEWSHP-POSITION SHIP FOR START\r
1519 ;\r
1520 NEWSHP: LDA I,0\r
1521         STA A,OBJXL+NOBJ        ;POSITION IN MIDDLE\r
1522         STA A,OBJYL+NOBJ\r
1523         STA XINC+NOBJ           ;WITH NO VELOCITY\r
1524         STA YINC+NOBJ\r
1525         LDA I,10\r
1526         STA A,OBJXH+NOBJ\r
1527         LDA I,0C\r
1528         STA A,OBJYH+NOBJ\r
1529         RTS\r
1530 \r
1531 \r
1532         .SBTTL NEWVEL - NEW RANDOM VELOCITY USING OLD\r
1533 ;NEWVEL - NEW RANDOM VELOCITY FOR NEW VELOCITY\r
1534 ;\r
1535 ;ENTRY  (X)=INDEX FOR NEW VELOCITY\r
1536 ;       (Y)=INDEX OF OLD VELOCITY\r
1537 ;\r
1538 NEWVEL: JSR RAND                ;RANDOM NUMBER\r
1539         AND I,8F\r
1540         BPL 10$                 ;IF POSITIVE NUMBER 0 TO 3\r
1541         ORA I,0F0               ;-1 TO -4\r
1542 10$:    CLC\r
1543         ADC Y,XINC\r
1544         JSR NEWVE1              ;CHECK RANGE OF VELOCITIES\r
1545         STA X,XINC\r
1546         JSR RAND                ;NUMBERS WILL NOT BE RANDOM IF UNLESS\r
1547         JSR RAND                ;WE SHIFT AT LEAST 4 BITS\r
1548         JSR RAND\r
1549         JSR RAND                ;RANDOM NUMBER\r
1550         AND I,8F\r
1551         BPL 40$                 ;POSITIVE NUMBER 0 TO 3\r
1552         ORA I,0F0               ;NEGATIVE -1 TO -4\r
1553 40$:    CLC\r
1554         ADC Y,YINC\r
1555         JSR NEWVE1              ;CHECK RANGE OF VELOCITY\r
1556         STA X,YINC\r
1557         RTS\r
1558 \r
1559 NEWVE1: BPL 20$                 ;POSITIVE RESULT\r
1560         CMP I,-1F\r
1561         BCS 15$                 ;WITHIN RANGE\r
1562         LDA I,-1F\r
1563 15$:    CMP I,-5\r
1564         BCC 30$                 ;NOT TOO CLOSE TO ZERO\r
1565         LDA I,-6                ;AT LEAST 1/2\r
1566         RTS\r
1567 \r
1568 20$:    CMP I,06\r
1569         BCS 25$                 ;NOT TOO CLOSE TO ZERO\r
1570         LDA I,06\r
1571 25$:    CMP I,20\r
1572         BCC 30$                 ;WITHIN RANGE\r
1573         LDA I,1F\r
1574 30$:    RTS\r
1575         \r
1576         \r
1577         .SBTTL PARAMS-DISPLAY PARAMETERS\r
1578 ;PARAMS-DISPLAY PARAMETERS\r
1579 ;\r
1580 PARAMS: LDA I,10\r
1581         STA VGSIZE              ;STANDARD SIZE CHARACTER\r
1582         LDA I,0\r
1583         TAX\r
1584         JSR VGSABS              ;PREVENT SPORT KILL FROM BLANKING OVER PICTURE\r
1585         LDA I,60\r
1586         JSR VGWAIT\r
1587         LDA I,100./4\r
1588         LDX I,876./4\r
1589         JSR VGSABS              ;POSITION BEAM\r
1590         LDA I,60\r
1591         JSR VGWAIT              ;WAIT FOR BEAM\r
1592         LDX I,0\r
1593         LDA NPLAYR\r
1594         CMP I,02\r
1595         BNE 10$                 ;IF NOT 2 PLAYER GAME\r
1596         LDA PLAYR\r
1597         BNE 10$                 ;IF PLAYER 2 UP\r
1598         LDX I,20                ;INTENSITY CHANGE FOR VECTORS\r
1599         LDA OBJ+NOBJ\r
1600         ORA RENTRY\r
1601         BNE 10$                 ;IF HE HAS APPEARED\r
1602         LDA SDELAY\r
1603         BMI 10$                 ;HE HAS DIED\r
1604         LDA FRAME\r
1605         AND I,10\r
1606         BEQ 20$                 ;FLASH SCORE\r
1607 10$:    LDA I,SCORE\r
1608         LDY I,02\r
1609         SEC\r
1610         JSR DIGITS              ;DISPLAY PLAYER 1 SCORE\r
1611         LDA I,0\r
1612         JSR HEX                 ;ADD EXTRA ZERO TO SCORE\r
1613 20$:    LDA I,160./4\r
1614         LDY HITS\r
1615         JSR LIVES               ;DISPLAY NUMBER OF LIFES\r
1616         LDA I,00\r
1617         STA VGSIZE              ;SMALL CHARACTERS\r
1618         LDA I,480./4\r
1619         LDX I,876./4\r
1620         JSR VGSABS              ;POSITION BEAM\r
1621         LDA I,50                \r
1622         JSR VGWAIT              ;WAIT FOR BEAM\r
1623         LDA I,HSCORE\r
1624         LDY I,02\r
1625         SEC\r
1626         JSR DIGITS              ;DISPLAY HIGH SCORE\r
1627         LDA I,0\r
1628         JSR VGHEX               ;ADD A ZERO TO SCORE\r
1629         LDA I,10\r
1630         STA VGSIZE              ;MEDIUM SIZE CHARACTERS\r
1631         LDA I,768./4\r
1632         LDX I,876./4\r
1633         JSR VGSABS              ;POSITION BEAM\r
1634         LDA I,50\r
1635         JSR VGWAIT              ;WAIT FOR BEAM\r
1636         LDX I,0\r
1637         LDA NPLAYR\r
1638         CMP I,01\r
1639         BEQ 90$                 ;NO PLAYER 2 IN 1 PLAYER GAME\r
1640         BCC 30$                 ;IF IN ATTRACT\r
1641         LDA PLAYR\r
1642         BEQ 30$                 ;NOT PLAYER 2 UP\r
1643         LDX I,20                ;INTENSITY CHANGE FOR DIGITS\r
1644         LDA OBJ+NOBJ\r
1645         ORA RENTRY\r
1646         BNE 30$                 ;IF HE HAS APPEARED\r
1647         LDA SDELAY\r
1648         BMI 30$                 ;HE HAS DIED\r
1649         LDA FRAME\r
1650         AND I,10\r
1651         BEQ 40$                 ;FLASH SCORE\r
1652 30$:    LDA I,SCORE+2\r
1653         LDY I,02\r
1654         SEC                     ;ZERO SUPPRESS\r
1655         JSR DIGITS              ;DISPLAY SCORE FOR PLAYER 2\r
1656         LDA I,0\r
1657         JSR HEX                 ;ADD A ZERO TO SCORE\r
1658 40$:    LDA I,828./4\r
1659         LDY HITS+1\r
1660         JMP LIVES               ;DISPLAY NUMBER OF LIVES\r
1661 \r
1662 90$:    RTS\r
1663 \r
1664         .SBTTL PICTUR-DISPLAY OBJECT PICTURE\r
1665 ;PICTUR-DISPLAY OBJECT PICTURE\r
1666 ;\r
1667 ;ENTRY (Y)=SCALING FACTOR TO BE USED\r
1668 ;       (XCOMP,XCOMP+3)=OBJECT POSITION\r
1669 PICTUR: STY VGSIZE              ;SET SCALING FACTOR\r
1670         STX TEMP3               ;SAVE X\r
1671         LDA XCOMP+1             ;PUT VALUES INTO RIGHT FORMAT\r
1672         LSR\r
1673         ROR XCOMP\r
1674         LSR\r
1675         ROR XCOMP\r
1676         LSR\r
1677         ROR XCOMP\r
1678         STA XCOMP+1\r
1679         LDA XCOMP+3\r
1680         CLC\r
1681         ADC I,04                ;ADD 128-RANGE IS 127<Y<897\r
1682         LSR\r
1683         ROR XCOMP+2\r
1684         LSR\r
1685         ROR XCOMP+2\r
1686         LSR\r
1687         ROR XCOMP+2\r
1688         STA XCOMP+3\r
1689         LDX I,XCOMP\r
1690         JSR VGLABS              ;POSITION PIECE\r
1691         LDA I,70                ;WE WANT WAIT OF 7\r
1692         SEC\r
1693         SBC VGSIZE              ;SCALE FACTOR EFFECT WAIT TOO\r
1694         CMP I,0A0\r
1695         BCC 30$                 ;IF 0 TO 90\r
1696         LDA I,90\r
1697         JSR VGWAIT              ;TWO WAITS ARE NEEDED\r
1698         LDA I,90                ;SET MAX TO PREVENT TEARING\r
1699 30$:    JSR VGWAIT              ;WAIT FOR BEAMS\r
1700         LDX TEMP3\r
1701         LDA X,OBJ\r
1702         BPL 35$                 ;IF NOT EXPLODING\r
1703         CPX I,NOBJ\r
1704         BEQ 33$                 ;IF THE SHIP\r
1705         AND I,0C\r
1706         LSR                     ;0, 2, 4 OR 6\r
1707         TAY\r
1708         LDA AY,EXPPIC\r
1709         LDX AY,EXPPIC+1\r
1710         BNE 78$                 ;ALWAYS\r
1711         \r
1712 33$:    JSR SHPEXP              ;EXPLODE SHIP\r
1713         LDX TEMP3               ;RESTORE X\r
1714         RTS\r
1715 \r
1716 35$:    CPX I,NOBJ\r
1717         BEQ 50$                 ;IF THE SHIP\r
1718         CPX I,NOBJ+1\r
1719         BEQ 60$                 ;IF SAUCER\r
1720         BCS 70$                 ;IF A TORPEDO (DOT)\r
1721         AND I,18                ;PICTURE NUMBER\r
1722         LSR\r
1723         LSR\r
1724         TAY\r
1725         LDA AY,ROCKS\r
1726         LDX AY,ROCKS+1\r
1727 78$:    JSR VGADD2              ;ADD JSRL OF PICTURE TO VECTOR LIST\r
1728         LDX TEMP3               ;RESTORE X\r
1729         RTS\r
1730         \r
1731 50$:    JSR SHPPIC              ;DISPLAY SHIP PICTURE\r
1732         LDX TEMP3\r
1733         RTS\r
1734 \r
1735 60$:    LDA A,SAUCER\r
1736         LDX A,SAUCER+1\r
1737         BNE 78$                 ;ALWAYS\r
1738         \r
1739 70$:    LDA I,70\r
1740         LDX I,0F0\r
1741         JSR VGDOT               ;PUT A DOT THERE\r
1742         LDX TEMP3\r
1743         LDA FRAME\r
1744         AND I,03\r
1745         BNE 75$                 ;EVERY FOURTH FRAME\r
1746         DEC X,OBJ               ;DECREMENT ACTIVE COUNT\r
1747 75$:    RTS\r
1748         \r
1749         \r
1750         .SBTTL POINTS-ADD POINTS TO SCORE\r
1751 ;POINTS-ADD POINTS TO SCORE\r
1752 ;\r
1753 ;ENTRY  (CC)=CARRY AND DECIMAL MODE SET\r
1754 ;       (X)=PLAYER NUMBER\r
1755 ;       (A)=POINTS TO ADD\r
1756 POINTS: SED\r
1757         ADC X,SCORE\r
1758         STA X,SCORE\r
1759         BCC 19$                 ;NO EXTRA 1000\r
1760         LDA X,SCORE+1\r
1761         ADC I,0\r
1762         STA X,SCORE+1\r
1763         AND I,0F\r
1764         BNE 19$                 ;EVERY 1000 GIVE A NEW LIFE\r
1765         LDA I,0B0\r
1766         STA SND3                ;SET OFF TONE\r
1767         LDX PLAYR\r
1768         INC X,HITS              ;ONE MORE LIFE\r
1769 19$:    CLD\r
1770         RTS\r
1771         \r
1772         \r
1773         .SBTTL SCORES-DISPLAY HIGH SCORE TABLE\r
1774 ;SCORES-DISPLAY HIGH SCORE TABLE\r
1775 ;\r
1776 ;(CC)=CARRY SET IF DISPLAYING TABLE\r
1777 SCORES: LDA NPLAYR      \r
1778         BEQ 10$                 ;IF END OF GAME\r
1779 90$:    CLC\r
1780         RTS\r
1781         \r
1782 10$:    LDA FRAME+1\r
1783         AND I,04\r
1784         BNE 90$                 ;NOT TIME TO DISPLAY TABLE\r
1785         LDA HSCORE\r
1786         ORA HSCORE+1\r
1787         BEQ 90$                 ;IF NO HIGH SCORES\r
1788         LDY I,0\r
1789         JSR VGMSG               ;DISPLAY "HIGH SCORE" MESSAGE\r
1790         LDX I,0                 ;INDEX FOR HIGH SCORE TABLE\r
1791         STX TEMP3+3             ;INDEX FOR TABLE OF INITIALS\r
1792         LDA I,01\r
1793         STA VGSIZE              ;CHARACTER SIZE\r
1794         LDA I,668./4\r
1795         STA TEMP3+1             ;STARTING Y FOR EACH LINE\r
1796         LDA I,10\r
1797         STA VGSIZE              ;SET CHARACTER SIZE\r
1798 20$:    LDA X,HSCORE\r
1799         ORA X,HSCORE+1\r
1800         BEQ 80$                 ;A ZERO ENDS LIST\r
1801         STX TEMP3+2             ;SAVE INDEX\r
1802         LDA I,380./4\r
1803         LDX TEMP3+1\r
1804         JSR VGSABS              ;POSITION FOR START OF LINE\r
1805         LDA I,40\r
1806         JSR VGWAIT              ;WAIT FOR BEAM TO STOP\r
1807         LDA TEMP3+2             ;0,2,4,...,18\r
1808         LSR                     ;CARRY IS CLEAR\r
1809         SED\r
1810         ADC I,01\r
1811         CLD\r
1812         STA TEMP3\r
1813         LDA I,TEMP3             ;ADDRESS OF NUM\r
1814         SEC\r
1815         LDY I,01                ;2 DIGITS ONLY\r
1816         LDX I,0\r
1817         JSR DIGITS              ;DISPLAY PLACE NUMBER (1 TO 10)\r
1818         LDA I,40\r
1819         TAX\r
1820         JSR VGDOT               ;PUT A PEROID\r
1821         LDY I,0\r
1822         JSR VGCHAR              ;DISPLAY A BLANK\r
1823         LDA TEMP3+2\r
1824         CLC\r
1825         ADC I,HSCORE\r
1826         LDY I,02\r
1827         SEC\r
1828         LDX I,0\r
1829         JSR DIGITS              ;DISPLAY SCORE\r
1830         LDA I,0\r
1831         JSR VGHEX               ;ADD A ZERO TO SCORE\r
1832         LDY I,0\r
1833         JSR VGCHAR              ;ADD A BLANK AFTER SCORE\r
1834         LDY TEMP3+3\r
1835         JSR INITAL              ;FIRST INITIAL\r
1836         INC TEMP3+3\r
1837         LDY TEMP3+3\r
1838         JSR INITAL              ;SECOND INITIAL\r
1839         INC TEMP3+3\r
1840         LDY TEMP3+3\r
1841         JSR INITAL              ;THIRD INITIAL\r
1842         INC TEMP3+3             ;SET INDEX FOR NEXT PLAYER\r
1843         LDA TEMP3+1\r
1844         SEC\r
1845         SBC I,32./4\r
1846         STA TEMP3+1             ;STARTING Y FOR NEXT LINE\r
1847         LDX TEMP3+2\r
1848         INX\r
1849         INX\r
1850         CPX I,2*10.\r
1851         BCC 20$                 ;IF MORE PLAYERS TO GO\r
1852 80$:    SEC\r
1853         RTS\r
1854 \r
1855 \r
1856         .SBTTL SEARCH - SEARCH FOR FREE ROCK ENTRY\r
1857 ;SEARCH - SEARCH FOR FREE ROCK ENTRY\r
1858 ;\r
1859 ;EXIT   (CC)=POSITIVE IF ENTRY EXISTS\r
1860 ;       (X)=FREE ENTRY INDEX IF POSSIBLE\r
1861 ;\r
1862 SEARCH: LDX I,NOBJ-1\r
1863 SEARC1: LDA X,OBJ\r
1864         BEQ 20$                 ;FOUND ONE\r
1865         DEX\r
1866         BPL SEARC1              ;LOOP TIL EXHAUSTED\r
1867 20$:    RTS\r
1868         \r
1869         \r
1870         .SBTTL SHPEXP-SHIP EXPLODING PICTURES\r
1871 ;SHPEXP-SHP EXPLODING PICTURES\r
1872 ;\r
1873 SHPEXP: LDA OBJ+NOBJ\r
1874         CMP I,0A2\r
1875         BCS 20$                 ;IF NOT THE FIRST EXPLOSION\r
1876         LDX I,10.               ;2*NUMBER OF PIECES -2\r
1877 10$:    LDA X,EXPDIR            ;INITIALIZE POSITIONS OF PIECES\r
1878         LSR                     ;DIVIDE BY 16\r
1879         LSR\r
1880         LSR\r
1881         LSR\r
1882         CLC\r
1883         ADC I,0F8\r
1884         EOR I,0F8               ;SIGN EXTEND\r
1885         STA X,SHIPX+1\r
1886         LDA X,EXPDIR+1\r
1887         LSR                     ;DIVIDE BY 16\r
1888         LSR\r
1889         LSR\r
1890         LSR\r
1891         CLC\r
1892         ADC I,0F8\r
1893         EOR I,0F8               ;SIGN EXTEND\r
1894         STA X,SHIPY+1\r
1895         DEX\r
1896         DEX\r
1897         BPL 10$                 ;LOOP FOR ALL PIECES\r
1898 20$:    LDA OBJ+NOBJ\r
1899         EOR I,0FF               ;0 TO 5F\r
1900         AND I,70\r
1901         LSR\r
1902         LSR\r
1903         LSR                     ;0 TO A\r
1904         TAX                     ;STARTING INDEX\r
1905 25$:    STX TEMP1+1\r
1906         LDY I,0\r
1907         LDA AX,EXPDIR\r
1908         BPL 27$\r
1909         DEY                     ;SIGN EXTENSION (Y=0FF)\r
1910 27$:    CLC\r
1911         ADC ZX,SHIPX\r
1912         STA ZX,SHIPX            ;LSB\r
1913         TYA\r
1914         ADC ZX,SHIPX+1\r
1915         STA ZX,SHIPX+1          ;MSB-ACTUAL COUNT OF X-Y LINES\r
1916         STA XCOMP\r
1917         STY XCOMP+1\r
1918         LDY I,0\r
1919         LDA AX,EXPDIR+1\r
1920         BPL 28$\r
1921         DEY                     ;SIGN EXTENSION (Y=0FF)\r
1922 28$:    CLC\r
1923         ADC ZX,SHIPY\r
1924         STA ZX,SHIPY\r
1925         TYA\r
1926         ADC ZX,SHIPY+1\r
1927         STA ZX,SHIPY+1\r
1928         STA XCOMP+2\r
1929         STY XCOMP+3\r
1930         LDA VGLIST\r
1931         STA TEMP2\r
1932         LDA VGLIST+1\r
1933         STA TEMP2+1\r
1934         JSR VGVCTR              ;DRAW VECTOR TO START OF SHIP PIECE\r
1935         LDY TEMP1+1\r
1936         LDA AY,EXPSHP\r
1937         LDX AY,EXPSHP+1\r
1938         JSR VGADD2              ;ADD SHIP PIECE TO VECTOR LIST\r
1939         LDY TEMP1+1\r
1940         LDA AY,EXPSHP+1\r
1941         EOR I,04                ;REVERSE SIGN\r
1942         TAX\r
1943         LDA AY,EXPSHP\r
1944         AND I,0F                ;NO INTENSITY\r
1945         EOR I,04                ;REVERSE SIGN\r
1946         JSR VGADD2\r
1947         LDY I,0FF\r
1948 30$:    INY\r
1949         LDA NY,TEMP2\r
1950         STA NY,VGLIST           ;REVERSE VECTOR BACK TO MIDDLE\r
1951         INY\r
1952         LDA NY,TEMP2\r
1953         EOR I,04                ;REVERSE SIGN\r
1954         STA NY,VGLIST\r
1955         CPY I,03\r
1956         BCC 30$\r
1957         JSR VGADD               ;UPDATE VGUST\r
1958         LDX TEMP1+1\r
1959         DEX\r
1960         DEX\r
1961         BPL 25$                 ;LOOP THRU ALL PIECES\r
1962         RTS\r
1963         \r
1964         .SBTTL SHPPIC-DISPLAY SHIP PICTURE\r
1965 ;SHPPIC-DISPLAY SHIP PICTURE\r
1966 ;\r
1967 ;ENTRY  (ANGLE)=SHIP ROTATION (0 TO FF)\r
1968 ;EXIT   (VGLIST,VGLIST+1)=UPDATED VECTOR LIST POINTER\r
1969 ;USES   A,X,Y,(TEMP1,TEMP1+1),(TEMP2,TEMP2+1)\r
1970 SHPPIC: LDX I,0\r
1971         STX TEMP4+2             ;NO CHANGE IN BRITENESS\r
1972         LDY I,0                 ;FLAG X=X AND Y=Y\r
1973         LDA ANGLE\r
1974         BPL 10$                 ;IF IN VECTORS 0,1,2 OR 3\r
1975         LDY I,04                ;Y=-Y\r
1976         TXA                     ;LDA I,0\r
1977         SEC\r
1978         SBC ANGLE               ;256.-ANGLE=NEW ANGLE\r
1979 10$:    STA TEMP1               ;0 TO 80\r
1980         BIT TEMP1\r
1981         BMI 15$                 ;IF ANGLE=80\r
1982         BVC 20$                 ;IF IN SECTORS 0 OR 1\r
1983 15$:    LDX I,04                ;X=-X\r
1984         LDA I,80\r
1985         SEC\r
1986         SBC TEMP1               ;128.-ANGLE=NEW ANGLE\r
1987 20$:    STX TEMP1\r
1988         STY TEMP1+1             ;SAVE MASKS FOR CPYVEC\r
1989         LSR                     ;ROTATION/2=PICTURE NUMBER*2\r
1990         AND I,0FE               ;MUST BE EVEN\r
1991         TAY\r
1992         LDA AY,SHIPS\r
1993         LDX AY,SHIPS+1          ;GET PICTURE ADDRESS\r
1994         JSR CPYVEC              ;COPY VECTOR AND CHECK SIGNS AND X/Y\r
1995         LDA A,THRUST\r
1996         BPL 1$                  ;IF NO THRUST\r
1997         LDA FRAME\r
1998         AND I,04\r
1999         BEQ 1$                  ;FLICKER AT 15 HZ\r
2000         INY\r
2001         INY\r
2002         SEC                     ;SKIP OVER RTSL\r
2003         LDX TEMP2+1\r
2004         TYA\r
2005         ADC TEMP2               ;ADD 3+ INDEX TO GET START OF FLAME\r
2006         BCC 30$                 ;NO PAGE CROSSING\r
2007         INX\r
2008 30$:    JSR CPYVEC              ;SHOW FLAME\r
2009 1$:     RTS\r
2010         \r
2011         \r
2012         .SBTTL SOUNDS-GENERATE SOUNDS\r
2013 ;SOUNDS-GENERATE SOUNDS\r
2014 ;\r
2015 SOUNDS: LDA NPLAYR\r
2016         BNE 10$                 ;NOT IN ATTRACT\r
2017         RTS\r
2018         \r
2019 10$:    LDX I,0\r
2020         LDA OBJ+NOBJ+1\r
2021         BMI 20$                 ;SAUCER EXPLODING\r
2022         BEQ 20$                 ;NO SAUCER\r
2023         ROR\r
2024         ROR\r
2025         ROR\r
2026         STA A,SCRSEL            ;SAUCER SELECT\r
2027         LDX I,80\r
2028 20$:    STX A,SCRSND            ;SOUND SAUCER\r
2029         LDX I,01                ;INDEX=SAUCER FIRING SOUND\r
2030         JSR SOUND1              ;GET VALUE FOR SAUCER FIRING SOUND\r
2031         STA A,SCRFIR\r
2032         DEX                     ;LDX I,0\r
2033         JSR SOUND1              ;GET VALUE FOR SHIP FIRING SOUND\r
2034         STA A,SHPFIR\r
2035         LDA OBJ+NOBJ\r
2036         CMP I,01\r
2037         BEQ 25$                 ;IF SHIP IS ALIVE\r
2038         TXA                     ;LDA I,0\r
2039         STA A,SHPSND            ;TURN OFF THRUST\r
2040 25$:    LDA NROCKS\r
2041         BEQ 27$                 ;IF NOT ROCKS\r
2042         LDA OBJ+NOBJ            ;NO THUMP\r
2043         BMI 27$                 ;SHIP IS DESTROYED\r
2044         ORA RENTRY\r
2045         BEQ 27$                 ;SHIP NOT ON SCREEN YET\r
2046         LDA THUMP1\r
2047         BEQ 30$                 ;IF THUMP SOUND IS OFF\r
2048         DEC THUMP1\r
2049         BNE 50$                 ;LEAVE SOUND ON\r
2050 27$:    LDA LTHUMP\r
2051         AND I,0F                ;TURN OFF THUMP SOUND\r
2052         STA LTHUMP\r
2053         STA A,THUMP\r
2054         LDA THUMP3\r
2055         STA THUMP2              ;AT LEAST 8 FRAMES BEFORE ITS ON AGAIN\r
2056         BPL 50$                 ;ALWAYS\r
2057 \r
2058 30$:    DEC THUMP2\r
2059         BNE 50$                 ;LEAVE SOUND OFF\r
2060         LDA I,04\r
2061         STA THUMP1              ;NUMBER FRAMES FOR SOUND TO BE ON\r
2062         LDA LTHUMP\r
2063         EOR I,14                ;TURN ON SOUND AND CHANGE ITS TONE\r
2064         STA LTHUMP\r
2065         STA A,THUMP\r
2066 50$:    LDA LEXPSND\r
2067         TAX\r
2068         AND I,3F\r
2069         BEQ 60$                 ;IF NO EXPLOSION VOLUME\r
2070         DEX\r
2071 60$:    STX LEXPSND\r
2072         STX A,EXPSND            ;SET SOUND FREQUENCY/LEVEL\r
2073         RTS\r
2074         \r
2075         \r
2076 ;SOUND1-GET VALUE FOR SOUND\r
2077 ;\r
2078 ;EXIT (A)=80 TO TURN ON SOUND, POSITIVE TO TURN IT OFF\r
2079 SOUND1: LDA X,LSND1\r
2080         BMI 50$                 ;IF SOUND IS ON\r
2081         LDA X,SND1\r
2082         BPL 70$                 ;NOT SUPPOSED TO START\r
2083         LDA I,10\r
2084         STA X,SND1              ;LENGTH OF SOUND\r
2085 10$:    LDA I,80                ;TURN ON SOUND\r
2086         BMI 80$                 ;ALWAYS\r
2087         \r
2088 50$:    LDA X,SND1\r
2089         BEQ 70$                 ;OOPS-TURN IT OFF SOMEONE GOOFED\r
2090         BMI 70$                 ;IF SOUND ON AND MUST START A NEW\r
2091         DEC X,SND1\r
2092         BNE 10$                 ;NOT AT END OF COUNTDOWN        \r
2093 70$:    LDA I,0\r
2094 80$:    STA X,LSND1             ;TURN SOUND OFF\r
2095         RTS\r
2096 \r
2097 \r
2098         .SBTTL SPLIT - SPLIT ROCK INTO FRAGMENTS\r
2099 ;SPLIT - SPLIT ROCK INTO FRAGMENTS\r
2100 ;\r
2101 ;ENTRY  (Y)=INDEX OF OBJECT BEING SPLIT\r
2102 ;       (X)=INDEX OF SHIP, SAUCER OR TORPEDO\r
2103 SPLIT:  STX TEMP3               ;SAVE X\r
2104         LDA I,50\r
2105         STA RTIMER              ;RESET TIMER IF ROCK HAS BEEN HIT\r
2106         LDA Y,OBJ\r
2107         AND I,78                ;SAVE PICTURE\r
2108         STA TEMP3+1\r
2109         LDA Y,OBJ\r
2110         AND I,07\r
2111         LSR\r
2112         TAX\r
2113         BEQ 10$                 ;EMPTY NOW\r
2114         ORA TEMP3+1\r
2115 10$:    STA Y,OBJ               ;NEW PICTURE & SIZE\r
2116         LDA NPLAYR\r
2117         BEQ 20$                 ;WE ARE IN ATTRACT\r
2118         LDA TEMP3\r
2119         BEQ 15$                 ;SHIP DOES IT\r
2120         CMP I,04\r
2121         BCC 20$                 ;NO POINTS IF SAUCER DOES IT\r
2122 15$:    LDA X,99$               ;SCORE FOR HIT\r
2123         LDX PLAYR2\r
2124         CLC\r
2125         JSR POINTS              ;ADD POINTS AND CHECK FOR 10K\r
2126 20$:    LDX Y,OBJ\r
2127         BEQ 90$                 ;DISAPPEARED\r
2128         JSR SEARCH              ;SEARCH FOR NEW ENTRY\r
2129         BMI 90$                 ;NO MORE ENTRIES\r
2130         INC NROCKS\r
2131         JSR CPYPOS              ;COPY POSITION FOR NEW ENTRY\r
2132         JSR NEWVEL              ;NEW VELOCITY\r
2133         LDA X,XINC\r
2134         AND I,1F\r
2135         ASL\r
2136         EOR X,OBJXL\r
2137         STA X,OBJXL             ;PREVENT OVERLAPING ROCKS\r
2138         JSR SEARC1              ;LOOK FOR NEW ENTRY\r
2139         BMI 90$                 ;NO MORE ROOM\r
2140         INC NROCKS\r
2141         JSR CPYPOS              ;COPY POSITION & PICTURE + VELOCITY\r
2142         JSR NEWVEL              ;NEW VELOCITY USING OLD\r
2143         LDA X,YINC\r
2144         AND I,1F\r
2145         ASL\r
2146         EOR X,OBJYL\r
2147         STA X,OBJYL\r
2148 90$:    LDX TEMP3\r
2149         RTS\r
2150 \r
2151 99$:    .BYTE 10,5,2            ;SCORES FOR HITTING SMALL, MEDIUM & LARGE ROCKS\r
2152         \r
2153         \r
2154         .SBTTL UPDATE-UPDATE HIGH SCORE TABLE\r
2155 ;UPDATE-UPDATE HIGH SCORE TABLE\r
2156 ;\r
2157 UPDATE: LDA NPLAYR\r
2158         BPL 90$                 ;FRAME AFTER END OF GAME (A=-1)\r
2159         LDX I,02                ;INDEX FOR PLAYER SCORE\r
2160         STA FRAME+1             ;PUT UP HIGH SCORE TABLE NEXT\r
2161         STA UPDFLG\r
2162         STA UPDFLG+1            ;CLEAR FLAGS\r
2163 18$:    LDY I,0                 ;INDEX INTO HIGH SCORE TABLE\r
2164 20$:    LDA Y,HSCORE\r
2165         CMP X,SCORE             ;SETS CARRY\r
2166         LDA Y,HSCORE+1\r
2167         SBC X,SCORE+1\r
2168         BCC 30$                 ;NEW HIGH SCORE\r
2169 25$:    INY\r
2170         INY\r
2171         CPY I,2*10.\r
2172         BCC 20$                 ;LOOP FOR 10 EXTRIES\r
2173 28$:    DEX\r
2174         DEX\r
2175         BPL 18$                 ;NEXT PLAYER\r
2176         LDA UPDFLG+1\r
2177         BMI 29$                 ;NO PLAYER 2 HIGH SCORE\r
2178         CMP UPDFLG\r
2179         BCC 29$                 ;IF PLAYER 2 SCORE IS BETTER THAN PLAYER 1\r
2180         ADC I,02                ;ADD 3\r
2181         CMP I,3*10.\r
2182         BCC 27$                 ;IF NOT OUT OF TABLE NOW\r
2183         LDA I,-1\r
2184 27$:    STA UPDFLG+1            ;NEW INDEX\r
2185 29$:    LDA I,0\r
2186         STA NPLAYR              ;FLAG DONE WITH UPDATE\r
2187         STA UPDINT              ;STARTING WITH FIRST INITIAL\r
2188 90$:    RTS\r
2189         \r
2190 30$:    STX TEMP2               ;SAVE INDEX\r
2191         STY TEMP2+1\r
2192         TXA\r
2193         LSR\r
2194         TAX                     ;0 OR 1\r
2195         TYA\r
2196         LSR                     ;CLEARS CARRY\r
2197         ADC TEMP2+1     \r
2198         STA TEMP3               ;INDEX FOR INITIAL TABLE\r
2199         STA X,UPDFLG            ;FLAG TO GET PLAYERS INITIALS\r
2200         LDX I,3*10.-3\r
2201         LDY I,2*10.-2\r
2202 40$:    CPX TEMP3\r
2203         BEQ 45$                 ;IF END OF COPY\r
2204         LDA X,INITL-3           ;COPY INITIALS DOWN\r
2205         STA X,INITL\r
2206         LDA X,INITL-2\r
2207         STA X,INITL+1\r
2208         LDA X,INITL-1\r
2209         STA X,INITL+2\r
2210         LDA Y,HSCORE-2                  ;COPY HIGH SCORES\r
2211         STA Y,HSCORE\r
2212         LDA Y,HSCORE-1\r
2213         STA Y,HSCORE+1\r
2214         DEY\r
2215         DEY\r
2216         DEX\r
2217         DEX\r
2218         DEX\r
2219         BNE 40$                 ;LOOP UNTIL X=0 OR DONE\r
2220 45$:    LDA I,11.\r
2221         STA X,INITL             ;START LETTERS AT A\r
2222         LDA I,0                 ;CLEARS SECOND AND THIRD INITIALS\r
2223         STA X,INITL+1\r
2224         STA X,INITL+2\r
2225         LDA I,0F0               ;1 MINUTE AT 60HZ\r
2226         STA FRAME+1             ;PREPARE TO TIMEOUT GETTING INITIALS\r
2227         LDX TEMP2               ;LOOP FOR NEXT PLAYER\r
2228         LDY TEMP2+1             ;MOVE HIGH SCORE IN\r
2229         LDA X,SCORE+1\r
2230         STA Y,HSCORE+1\r
2231         LDA X,SCORE\r
2232         STA Y,HSCORE\r
2233         LDY I,0\r
2234         BEQ 28$                 ;ALWAYS\r
2235         \r
2236 CKSUM5: .BYTE 77                ;7400-77FF\r
2237         .PAGE\r
2238         .PAGE\r
2239 ;ATAN-ARCTANGENT\r
2240 ;\r
2241 ;ENTRY  (X)=X PART OF ARCTAN (Y/X) (SIGNED NUMBER)\r
2242 ;       (Y)=Y PART (SIGNED NUMBER)\r
2243 ;EXIT   (A)=ARCTAN RESULT (0 TO FF, 40=90 DEGREES)\r
2244 ;USES   A,X,Y,(TEMP2,TEMP2+1)\r
2245 ATAN:   TYA\r
2246         BPL ATAN1               ;IF Y>-0\r
2247         JSR COMP                ;+Y=-Y\r
2248         JSR ATAN1               ;ATAN (-Y/X)\r
2249         JMP COMP                ;ARCTAN(Y/X)=-ARCTAN(-Y/X)\r
2250                 \r
2251 ATAN1:  TAY                     ;DIVISOR\r
2252         TXA\r
2253         BPL ATAN2               ;IF X=-0\r
2254         JSR COMP                ;X=-X\r
2255         JSR ATAN2               ;ATAN(Y/-X)\r
2256         EOR I,80                ;ARCTAN(Y/X)=80-ARTCAN(Y/-X)\r
2257 ;       JMP COMP\r
2258         \r
2259         \r
2260 ;COMP-COMPLEMENT ACCUMULATOR\r
2261 ;\r
2262 ;ENTRY  (A)=VALUE TO BE COMPLEMENTED\r
2263 ;EXIT   (A)=ANSWER\r
2264 ;USES   A\r
2265 COMP:   EOR I,0FF\r
2266         CLC\r
2267         ADC I,01\r
2268         RTS\r
2269 \r
2270 ATAN2:  STA TEMP2+1             ;DIVISOR (X)\r
2271         TYA                     ;DIVIDEND (Y)\r
2272         CMP TEMP2+1\r
2273         BEQ 10$                 ;IF Y=X\r
2274         BCC ATAN3               ;IF Y<X USE ARCTAN ON 45 DEGREE SECTOR\r
2275         LDY TEMP2+1\r
2276         STA TEMP2+1\r
2277         TYA\r
2278         JSR ATAN3               ;ARCTAN (X/Y)\r
2279         SEC\r
2280         SBC I,40\r
2281         JMP COMP                ;ARCTAN (Y/X)=40-ARCTAN(X/Y)\r
2282                 \r
2283 10$:    LDA I,20                ;45 DEGRESS\r
2284         RTS\r
2285         \r
2286 ATAN3:  JSR DIVIDE              ;4 BIT DIVIDE\r
2287         LDA X,ATANA             ;TABLE LOOKUP\r
2288         RTS\r
2289         \r
2290 ATANA:  .BYTE 0,2,5,7           ;0-3\r
2291         .BYTE 10.,12.,15.,17.   ;4-7\r
2292         .BYTE 19.,21.,23.,25.   ;8-B\r
2293         .BYTE 26.,28.,29.,31.   ;C-F\r
2294         \r
2295 ;DIGITS - DISPLAY 2Y DIGIT NUMBERS\r
2296 ;\r
2297 ;ENTRY  (C) = CARRY SET FOR ZERO SUPPRESSION\r
2298 ;       (A) = ADDRESS OF (Y) ZERO PAGE LOCATIONS CONTAINING NUMBER (LSB TO MSB)\r
2299 ;       (X) = CHANGE IN INTENSITY (0,10,20,...)\r
2300 ;       (Y) = NUMBER OF ZERO PAGE LOCATIONS TO USE (1 TO 256).\r
2301 ;USES   A,X,Y (TEMP4,TEMP4+2)\r
2302 DIGITS: PHP                     ;SAVE INPU PARAMEERS\r
2303         STX TEMP4+2\r
2304         DEY\r
2305         STY TEMP4+1\r
2306         CLC\r
2307         ADC TEMP4+1\r
2308         STA TEMP4               ;MSB OF DIGITS\r
2309         PLP\r
2310         TAX\r
2311 10$:    PHP\r
2312         LDA X,0\r
2313         LSR\r
2314         LSR\r
2315         LSR\r
2316         LSR\r
2317         PLP\r
2318         JSR HEXZ                ;FIRST DIGIT\r
2319         LDA TEMP4+1\r
2320         BNE 20$\r
2321         CLC                     ;DISPLAY LAST DIGIT (EVEN 0)\r
2322 20$:    LDX TEMP4\r
2323         LDA X,0\r
2324         JSR HEXZ                ;SECOND DIGIT\r
2325         DEC TEMP4\r
2326         LDX TEMP4\r
2327         DEC TEMP4+1\r
2328         BPL 10$                 ;LOOP FOR EACH SET OF DIGITS\r
2329         RTS\r
2330         \r
2331         \r
2332 ;DIVIDE-4 BIT RESULT DIVIDE\r
2333 ;\r
2334 ;ENTRY (A)=DIVIDEND (UNSIGNED)\r
2335 ;      (TEMP2+1)=DIVISOR (UNSIGNED)\r
2336 ;EXIT   (X)=QUOTUNT (4 BITS)\r
2337 DIVIDE: LDY I,0\r
2338         STY TEMP2               ;CLEAR LSB\r
2339         LDY I,4                 ;4 BITS OF RESOLUTION\r
2340 10$:    ROL TEMP2               ;SHIFT IN BIT OF ANSWER\r
2341         ROL\r
2342         CMP TEMP2+1\r
2343         BCC 20$                 ;NOT LARGE ENOUGH\r
2344         SBC TEMP2+1             ;LEAVES CARRY SET\r
2345 20$:    DEY\r
2346         BNE 10$\r
2347         LDA TEMP2\r
2348         ROL                     ;SHIFT IN LAST BIT\r
2349         AND I,0F                ;4 BITS OF RESULTS\r
2350         TAX\r
2351         RTS\r
2352 \r
2353 \r
2354 ;HEXZ - DISPLAY DIGITS WITH ZERO SUPPRESSION\r
2355 ;\r
2356 ;ENTRY  (A)=LOWER 4 BITS ARE TO BE DISPLAYED\r
2357 ;       (TEMP4+2)=INTENSITY CHANGE\r
2358 ;       (C)=CLEAR IF NO ZERO SUPPRESSION\r
2359 ;EXIT   (C)=CLEAR IF NO ZERO SUPPRESSION\r
2360 HEXZ:   BCC HEX                 ;NO ZERO-SUPPRESSION\r
2361         AND I,0F\r
2362         BEQ HEX1                ;USE BLANK\r
2363 HEX:    LDX TEMP4+2\r
2364         BEQ HEX1                ;USE JSRL TO CHARACTER ROUTINES\r
2365         AND I,0F\r
2366         CLC\r
2367         ADC I,01                ;SKIP OVER BLANK IN\r
2368         PHP                     ;SAVE CARRY\r
2369         ASL\r
2370         TAY\r
2371         LDA AY,VGMSGA\r
2372         ASL\r
2373         STA TEMP2\r
2374         LDA AY,VGMSGA+1\r
2375         ROL\r
2376         AND I,1F\r
2377         ORA I,40                ;ADDRESS IS 4000-5FFF\r
2378         STA TEMP2+1\r
2379         LDY I,0\r
2380         STY TEMP1\r
2381         STY TEMP1+1\r
2382         JSR COPY                ;COPY VECTORS WITH INTENSITY CHANGE\r
2383         PLP\r
2384         RTS\r
2385 \r
2386 HEX1:   JMP VGHEXZ\r
2387 \r
2388         \r
2389 ;RAND-RANDOM NUMBER GENERATOR\r
2390 ;\r
2391 ;EXIT   (A)=RANDOM NUMBER\r
2392 ;\r
2393 RAND:   ASL POLYL\r
2394         ROL POLYH\r
2395         BPL 1$\r
2396         INC POLYL\r
2397 1$:     LDA POLYL               ;CHANGE BIT 0 DISPENDING ON BIT 1\r
2398         BIT 9$\r
2399         BEQ 2$\r
2400         EOR I,01\r
2401         STA POLYL\r
2402 2$:     ORA POLYH               ;BEWARE THE 0 CASE\r
2403         BNE 3$\r
2404         INC POLYL\r
2405 3$:     LDA POLYL\r
2406         RTS\r
2407 \r
2408 9$:     .BYTE 2\r
2409         \r
2410         \r
2411 ;COS-COSINE\r
2412 ;ENTRY  =ANGLE (0 TO FF)\r
2413 ;EXIT   (A)=COSINE(-127,127)\r
2414 COS:    CLC                     ;COS(A)=SIN(A+PI/2)\r
2415         ADC I,40\r
2416 ;       JMP SIN\r
2417         \r
2418         \r
2419 ;SIN-SINE\r
2420 ;\r
2421 ;ENTRY  (A)=ANGLE (0 TO FF REPRESENTS 0 TO 360 DEGREES)\r
2422 ;       (CC)=MINUS/PLUS FLAG SET CORRECTLY\r
2423 ;EXIT   (A)=SINE (-127 TO +127)\r
2424 ;USES   A,X\r
2425 SIN:    BPL SIN1                ;IF PI > ANGLE >-0\r
2426         AND I,7F\r
2427         JSR SIN1                ;SIN(A) WHEN PI > A >= 0\r
2428         JMP COMP                ;SIN(PI+A)=-SIN(A)\r
2429 \r
2430 SIN1:   CMP I,41\r
2431         BCC 10$                 ;PI/2 >- ANGLE >- 0\r
2432         EOR I,7F                ;SIN(PI/2+A)=SIN(PI/2-A)\r
2433         ADC I,0                 ;ADD 1\r
2434 10$:    TAX\r
2435         LDA AX,SINCOS\r
2436         RTS\r
2437 \r
2438         .END\r
2439 \r
2440 \r
2441 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0