]> github.com/historicalsource and other repositories - asteroids-7800.git/blob - COLLIDE.S
Initial import.
[asteroids-7800.git] / COLLIDE.S
1 *         1515    030784\r
2 *\r
3 *\r
4 ** COLLIDE.S **\r
5 ** ASTEROIDS FOR THE ATARI 3600 **\r
6 ** THIS FILE CONTAINS THE COLLISION HANDLING ROUTINE. **\r
7 **\r
8 **        INDEXING - ROCKS               0 THRU 23\r
9 **                   SHIP                24\r
10 **                   UFO                 25\r
11 **                   UFOSHOT             26 THRU 27\r
12 **                   SHIPSHOT            28 THRU 31\r
13 **                   SHIP2               32\r
14 **\r
15 **        STATUS - LO NYBBLE - OBJECT TYPE - 0 - SMALL ROCK\r
16 **                                           1 - MEDIUM ROCK\r
17 **                                           2 - LARGE ROCK\r
18 **                                           3 - SHIP\r
19 **                                           4 - SMALL UFO\r
20 **                                           5 - LARGE UFO\r
21 **                                           6 - SHOT\r
22 **                                           7 - SHIP'S PARTS (+MISC JUNK)\r
23 **                 HI NYBBLE - OBJECT SIZE - INDEX INTO SIZE TABLES\r
24 **                                           (UNUSED, I BELIEVE)\r
25 **\r
26 **                  < 0 - NULL OBJECT\r
27 **\r
28 **        USES TEMP LOCATIONS AS FOLLOWS:\r
29 **                TEMP                   DX (REUSED LATER)\r
30 **                TEMP+1                 DY\r
31 **                TEMP+2                 DX+DY (MANHATTAN DISTANCE)\r
32 **                TEMP+3,TEMP+4          SAVE AREA FOR INDEX REGISTERS X & Y\r
33 **                TEMP+5,TEMP+6          SAVE AREA FOR 'TYPE NYBBLES'\r
34 **                                       (IE, LO NYBBLE OF STATUS BYTE)\r
35 **                TEMP+7                 ROCK TYPE, IN THE EVENT OF AN EXPLOSION\r
36 **                TEMP+8,TEMP+9          SHORT TERM SCRATCH TEMP\r
37 **                TEMP+10                SHIP'S DIRECTION INDEX\r
38 **\r
39 ********************************************************************************\r
40 \r
41 \r
42 COLLIDE:\r
43         LDA     RUBFLAG         ;DECREMENT RUBBER SHIP FLAG IF NEEDED\r
44         BMI     ZNODERUB\r
45         DEC     RUBFLAG\r
46 ZNODERUB:\r
47         LDX     #32             ;START CHECKING WITH SHIP2\r
48 COLNXTX:\r
49         LDA     STATUS,X        ;IF OBJECT X DOESN'T EXIST THEN\r
50         BMI     DECX            ;GO ON TO NEXT X\r
51 \r
52         LDY     COLTAB-24,X     ;FETCH FIRST OBJECT TO CHECK\r
53 COLNXTY:\r
54         LDA     STATUS,Y        ;IF OBJECT Y DOESN'T EXIST THEN\r
55         BMI     DECY            ;GO ON TO NEXT Y\r
56 \r
57         STX     TEMP+3          ;SAVE X AND Y\r
58         STY     TEMP+4\r
59 \r
60         JMP     COLCHK          ;CHECK FOR COLLISION\r
61 \r
62 RESTORE:\r
63         LDX     TEMP+3  ;RESTORE X AND Y\r
64         LDY     TEMP+4\r
65 \r
66 DECY:\r
67         DEY\r
68         BPL     COLNXTY\r
69 DECX:\r
70         DEX\r
71         CPX     #24\r
72         BPL     COLNXTX\r
73 COLRTS:\r
74         RTS\r
75 \r
76 \r
77 \r
78 * CHECK FOR AN ACTUAL COLLISION BETWEEN OBJECTS WHOSE INDICES ARE IN X AND Y.\r
79 COLCHK:\r
80         LDA     COLXPOSH,X      ;COMPUTE DX\r
81         SEC\r
82         SBC     COLXPOSH,Y\r
83         BCS     DXPOS           ;TAKE ABSOLUTE VALUE\r
84         EOR     #$FF\r
85 ;       CLC                     ;CARRY MUST ALREADY BE CLR (BCS ABOVE)\r
86         ADC     #1\r
87 \r
88 DXPOS:\r
89         CMP     #XPOSMAX-13     ;CHECK FOR WRAPAROUND (WIDEST OBJ=12)\r
90         BCC     DXOK            ;NO WRAP\r
91         CPX     #25             ;DON'T X-WRAP THE UFO\r
92         BEQ     DXOK\r
93         CPY     #25\r
94         BEQ     DXOK\r
95         SEC\r
96         SBC     #XPOSMAX+1      ;USE WRAPPED DISTANCE\r
97         EOR     #$FF\r
98 ;       CLC                     ;CARRY IS CLEAR FROM SBC (IE, BORROW)\r
99         ADC     #1\r
100 \r
101 DXOK:\r
102         CMP     #10             ;FURTHEST COLLISION HAS DX OF ONLY 10\r
103         BCS     NOCOL           ; IF >= 11, NO COLLISION.\r
104         STA     TEMP\r
105 \r
106         LDA     COLYPOSH,X      ;COMPUTE DY\r
107         SEC\r
108         SBC     COLYPOSH,Y\r
109         BCS     DYPOS           ;TAKE ABSOLUTE VALUE\r
110         EOR     #$FF\r
111 ;       CLC             ;CARRY MUST ALREADY BE CLR (BCS ABOVE)\r
112         ADC     #1\r
113 \r
114 DYPOS:\r
115         CMP     #YPOSMAX-17     ;CHECK FOR WRAPAROUND (TALLEST OBJ=16)\r
116         BCC     DYOK            ;NO WRAP\r
117         SBC     #YPOSMAX+1      ;USE WRAPPED DISTANCE\r
118         EOR     #$FF\r
119 ;       CLC             ;CARRY IS CLEAR FROM SBC (IE, BORROW)\r
120         ADC     #1\r
121 \r
122 DYOK:\r
123         CMP     #14             ;FURTHEST COLLISION HAS DY OF ONLY 14\r
124         BCS     NOCOL           ; IF >= 15, NO COLLISION.\r
125         STA     TEMP+1\r
126 \r
127 * AT THIS POINT, WE MUST DO CLOSER INSPECTION, SINCE THE OBJECTS ARE CLOSE.\r
128         CLC                     ;COMPUTE MANHATTAN DISTANCE (DX+DY)\r
129         ADC     TEMP\r
130         STA     TEMP+2\r
131 \r
132         LDA     STATUS,X        ;TEMP+5 <- TYPE OF OBJECT X\r
133         AND     #$0F\r
134         STA     TEMP+5\r
135 \r
136         LDA     STATUS,Y        ;TEMP+6 <- TYPE OF OBJECT Y\r
137         AND     #$0F\r
138         STA     TEMP+6\r
139 \r
140         STY     TEMP+9          ;SAVE Y, WE NEED AN INDEX REGISTER!\r
141 \r
142         TAY\r
143         LDA     OBJDIAG,Y       ;GET WIDTH OF SECOND OBJECT\r
144         LDY     TEMP+5\r
145         ADC     OBJDIAG,Y       ;ADD IN WIDTH OF FIRST OBJECT\r
146         CMP     TEMP+2          ;COMPARE WITH MANHATTAN DISTANCE\r
147         BMI     NOCOL1          ;TOO FAR AWAY, NO COLLISION.\r
148 \r
149         LDA     OBJWID,Y        ;DO MORE PRECISE XTENT CHECKING\r
150         LDY     TEMP+6\r
151         CLC\r
152         ADC     OBJWID,Y\r
153         CMP     TEMP\r
154         BCC     NOCOL1          ;TOO FAR TO THE SIDE: NO COLLISION\r
155 \r
156         LDA     OBJHEIT,Y       ;DO MORE PRECISE YTENT CHECKING\r
157         LDY     TEMP+5\r
158         CLC\r
159         ADC     OBJHEIT,Y\r
160         CMP     TEMP+1\r
161         BCS     YESCOL  ;WE HAVE A COLLISION.\r
162 \r
163 \r
164 NOCOL1:\r
165         LDY     TEMP+9  ;RESTORE Y\r
166 NOCOL:\r
167         CPY     #40             ;DECREMENT INDICES WITHOUT RESTORING\r
168         BEQ     COLSETX         ; IF WE ARE DOING SPECIAL CHECKING\r
169         BCS     DECY1\r
170         CPX     #40\r
171         BEQ     RESTORE1\r
172         CPX     #37\r
173         BCC     RESTORE1\r
174         BCS     DECX1           ;(UNCONDITIONAL)\r
175 \r
176 COLSETX:\r
177         CPX     #37             ;SET X AND Y TO LOOP OVER SHIP'S PARTS\r
178         BCC     RESTORE1\r
179         BCS     COLSETY         ;(UNCONDITIONAL)\r
180 \r
181 COLSETY:\r
182         LDY     #43             ;RESET Y FOR NEXT ROUND\r
183 DECX1:\r
184         DEX\r
185         JMP     COLCHK\r
186 DECY1:\r
187         DEY\r
188         JMP     COLCHK\r
189 \r
190 \r
191 * COME HERE IN THE EVENT OF A POSSIBLE COLLISION.\r
192 YESCOL:\r
193         ;COMPUTE LOWEST P2 BULLET OR SHIP FOR THIS MODE.  IN TEAM MODES\r
194         ;WE SHARE BULLETS.  RESULT IS LEFT IN TEMP FOR LATER.\r
195         LDA     #32             ;ASSUME 30 AND 31 ARE NOT P2'S\r
196         LDY     MODE\r
197         CPY     #1\r
198         BMI     NOTEAMSC        ;NOT TEAMPLAY, DON'T SPLIT BULLETS\r
199         LDA     #30             ;30 AND 31 ARE P2'S\r
200 NOTEAMSC:\r
201         STA     TEMP\r
202 \r
203         LDY     TEMP+9          ;RESTORE Y\r
204 \r
205 * PERFORM ACTIONS DEPENDENT UPON THE SPECIAL CASE OBJECTS\r
206         CPX     #32\r
207         BEQ     COLP2X          ;FIRST OBJECT IS P2 SHIP\r
208         CPX     #24\r
209         BEQ     COLP1X          ;FIRST OBJECT IS P1 SHIP\r
210         CPY     #24\r
211         BEQ     COLP1Y          ;SECOND OBJECT IS P1 SHIP\r
212 \r
213         LDX     TEMP+3          ;RESTORE X AND Y\r
214         LDY     TEMP+4\r
215         JSR     DOCOL           ;DO THE COLLISION\r
216         JMP     DECX            ;AND THE NEXT ITERATION\r
217 RESTORE1:\r
218         JMP     RESTORE         ;AND CONTINUE\r
219 \r
220 \r
221 COLP2X:\r
222         LDA     STATE+1         ;DON'T COLLIDE IF SHIP ISN'T OK\r
223         BNE     RESTORE1\r
224 \r
225         LDA     MODE            ;IN COMPETITIVE, P1'S SHOTS KILL P2\r
226         CMP     #2\r
227         BEQ     COLP2XGO\r
228         CPY     #28             ; (P1'S SHOTS ARE 28 AND 29)\r
229         BCS     RESTORE1        ;OTHERWISE, IGNORE THEM\r
230 COLP2XGO:\r
231         LDX     #39             ;POINT TO SHIP2'S PARTS\r
232         JSR     P2SETUP         ;SET UP FOR SPECIAL P2 CHECKING\r
233         CPY     #24             ;IS IT SHIP1 VS SHIP2?\r
234         BNE     COLNOP1Y        ;NOPE\r
235         LDA     MODE\r
236         CMP     #2              ;IN COMPETITIVE PLAY, DON'T BOUNCE,\r
237         BEQ     COLP1Y          ; COLLIDE!\r
238 \r
239         LDA     STATE           ;IF SHIP NOT OK, DON'T COLLIDE\r
240         BNE     RESTORE1\r
241         JMP     RUBBERS         ;LET'S GO BOUNCY BOUNCY...\r
242 \r
243 COLP1Y:\r
244         LDA     STATE           ;DON'T COLLIDE IF SHIP ISN'T OK\r
245         BNE     RESTORE1\r
246 \r
247         CPX     #28             ;ANYTHING LESS THAN 28 IS HARMFUL\r
248         BCC     COLP1YGO\r
249 \r
250         ;IN TEAM PLAY, IGNORE THE COLLISION: THEY ARE FRIENDS\r
251         LDA     MODE\r
252         CMP     #1\r
253         BEQ     RESTORE1\r
254 \r
255         CPX     TEMP            ;CHECK AGAINST P2'S BULLETS.\r
256         BCC     RESTORE1        ; IF < TEMP, IT IS SAFE\r
257 \r
258         ;NOT SAFE: CHECK SHIP'S PARTS\r
259 COLP1YGO:\r
260         LDY     #43             ;POINT TO SHIP1'S PARTS\r
261 COLP1GO:\r
262         JSR     P1SETUP         ;SET THEM UP\r
263 COLNOP1Y:\r
264         JMP     COLCHK          ;AND CONTINUE\r
265 \r
266 \r
267 COLP1X:\r
268         LDA     STATE           ;DON'T COLLIDE IF SHIP ISN'T OK\r
269         BNE     RESTORE1\r
270 \r
271         LDX     #43             ;POINT TO SHIP1'S PARTS\r
272         BNE     COLP1GO         ;CONTINUE AS ABOVE (UNCONDITIONAL)\r
273 \r
274 \r
275 * P1SETUP: SET UP STATUS ENTRIES FOR THE PARTS OF THE SHIP TO CHECK\r
276 P1SETUP:\r
277         STX     TEMP+8\r
278         LDA     SHIPDIR         ;GENERATE SHIP DIRECTION INDEX\r
279         LSR\r
280         LSR\r
281         LSR\r
282         LSR\r
283         TAX\r
284         LDA     SHNOSEX,X\r
285         CLC\r
286         ADC     XPOSH+24\r
287         STA     COLXPOSH+40\r
288         LDA     SHNOSEY,X\r
289         ADC     YPOSH+24\r
290         STA     COLYPOSH+40\r
291 \r
292         LDA     SHRTAILX,X\r
293 ;       CLC\r
294         ADC     XPOSH+24\r
295         STA     COLXPOSH+41\r
296         LDA     SHRTAILY,X\r
297         ADC     YPOSH+24\r
298         STA     COLYPOSH+41\r
299 \r
300         LDA     SHLTAILX,X\r
301 ;       CLC\r
302         ADC     XPOSH+24\r
303         STA     COLXPOSH+42\r
304         LDA     SHLTAILY,X\r
305         ADC     YPOSH+24\r
306         STA     COLYPOSH+42\r
307 \r
308         LDA     COLXPOSH+24\r
309         STA     COLXPOSH+43\r
310         LDA     COLYPOSH+24\r
311         STA     COLYPOSH+43\r
312 \r
313         LDX     TEMP+8\r
314         RTS\r
315 \r
316 * P2SETUP: SET UP STATUS ENTRIES FOR THE PARTS OF THE SHIP TO CHECK\r
317 P2SETUP:\r
318         STX     TEMP+8\r
319         LDA     SHIPDIR+1       ;GENERATE SHIP DIRECTION INDEX\r
320         LSR\r
321         LSR\r
322         LSR\r
323         LSR\r
324         TAX\r
325         LDA     SHNOSEX,X\r
326         CLC\r
327         ADC     XPOSH+32\r
328         STA     COLXPOSH+36\r
329         LDA     SHNOSEY,X\r
330         ADC     YPOSH+32\r
331         STA     COLYPOSH+36\r
332 \r
333         LDA     SHRTAILX,X\r
334 ;       CLC\r
335         ADC     XPOSH+32\r
336         STA     COLXPOSH+37\r
337         LDA     SHRTAILY,X\r
338         ADC     YPOSH+32\r
339         STA     COLYPOSH+37\r
340 \r
341         LDA     SHLTAILX,X\r
342 ;       CLC\r
343         ADC     XPOSH+32\r
344         STA     COLXPOSH+38\r
345         LDA     SHLTAILY,X\r
346         ADC     YPOSH+32\r
347         STA     COLYPOSH+38\r
348 \r
349         LDA     COLXPOSH+32\r
350         STA     COLXPOSH+39\r
351         LDA     COLYPOSH+32\r
352         STA     COLYPOSH+39\r
353 \r
354         LDX     TEMP+8\r
355         RTS\r
356 \r
357 * DOCOL1: PERFORM CERTAIN COMMON ACTIONS ON AN OBJECT EXPLODING.\r
358 * ON ENTRANCE, X IS THE INDEX OF OBJECT COLLIDING.  ON EXIT, TEMP+6 HAS THE\r
359 * 'TYPE NYBBLE'.  OH, AND BY THE WAY, X AND Y ARE TRASHED.\r
360 DOCOL1:\r
361         STX     TEMP+8          ;SAVE X\r
362         LDA     STATUS,X\r
363         ORA     #$80            ;TAG THIS OBJECT AS "EXPLODING"\r
364         STA     STATUS,X\r
365         AND     #$0F            ;COMPUTE OBJECT TYPE (AGAIN)\r
366         STA     TEMP+6          ;STORE IT\r
367 \r
368         CMP     #6\r
369         BCS     NOEXPSND        ;OBJECTS >= 6 MAKE NO EXPLOSION SOUNDS\r
370         CMP     #4\r
371         BCS     COLUFO          ;UFO COLLIDING: HANDLE IT\r
372         CMP     #3\r
373         BCS     COLSHIP         ;SHIP COLLIDING: HANDLE IT\r
374 \r
375 ;       CLC                     ;CARRY IS CLEAR\r
376         ADC     #$0A            ;ADD OFFSET OF ROCK TUNES\r
377         PHA                     ;THIS IS 'ROCKSND'\r
378         LDA     #$0A            ; (KILL OFF ANY CURRENT ROCK SOUNDS)\r
379         JSR     KILLTUNE\r
380         LDA     #$0B\r
381         JSR     KILLTUNE\r
382         LDA     #$0C\r
383         JSR     KILLTUNE\r
384         PLA\r
385 \r
386 CONT:\r
387         JSR     DOTUNE\r
388         LDX     TEMP+8          ;RESTORE X, TRASHED BY DOTUNE\r
389 NOEXPSND:\r
390         LDY     TEMP+6          ;GET TYPE NYBBLE\r
391         LDA     ELBOUND,Y       ;SET UP EXPLOSION ANIMATION\r
392         STA     ACYC,X\r
393         RTS\r
394 \r
395 COLUFO:\r
396         TAX\r
397         SEC\r
398         SBC     #2              ;COMPUTE INDEX INTO LVLINC\r
399         JSR     INCLVL          ;MAKE IT HARDER NOW\r
400         CPX     #4              ;ONLY MR. BILL CHANGES ACCURACY\r
401         BNE     ZNOBILAC\r
402         LDA     UFOACC\r
403         CMP     #4              ;DON'T GO BELOW 3\r
404         BCC     ZNOBILAC\r
405         DEC     UFOACC          ;TIGHTEN UP MR. BILL'S ACCURACY\r
406 ZNOBILAC:\r
407         TXA                     ;DO TUNES: CANCEL THEME AND PLAY EXPL.\r
408         CLC\r
409         ADC     #2              ;EXPLOSION = TYPE + 2\r
410         PHA                     ;PUSH IT FOR LATER\r
411         ADC     #2              ;THEME = TYPE + 4\r
412         JSR     KILLTUNE\r
413         PLA                     ;PULL EXPLOSION SOUND\r
414         BPL     CONT            ;BPL = JMP\r
415 \r
416 COLSHIP:\r
417         LDA     TEMP+8          ;FIGURE OUT WHICH SHIP DIED\r
418         LDX     #0              ;DEFAULT TO SHIP 1\r
419         CMP     #32             ;FIGURE OUT WHICH SHIP DIED\r
420         BNE     NOP2DIE\r
421         INX                     ;INCREMENT TO SHIP 2\r
422 NOP2DIE:\r
423         LDA     #DEATH          ;INDUCE A FATAL DEATH\r
424         STA     STATE,X\r
425         LDA     #DIET+$28       ;AT TIMER 'DIE TIME' + $28\r
426         STA     TIMER,X\r
427 \r
428         LDA     #$05            ;SHIP EXPLOSION = 05\r
429         BPL     CONT            ;BPL = JMP\r
430 \r
431 * WE HAVE A COLLISION, FOLKS!  DO WHAT NEEDS TO BE DONE (EXPLODING, SCORING)\r
432 DOCOL:\r
433 ;DEBUGGING PATCH\r
434 ;         LDA     #$0A  ;USE SMALL ROCK EXPLOSION SOUND\r
435 ;         JSR     DOTUNE\r
436 ;         LDX     TEMP+3\r
437 ;         LDY     TEMP+4\r
438 ;         RTS\r
439 \r
440 * FIRST DO TUNES AND EXPLOSION ANIMATIONS\r
441 ;       LDX     TEMP+3\r
442         JSR     DOCOL1\r
443         LDA     TEMP+6          ;TRANSFER TYPE NYBBLE\r
444         STA     TEMP+5          ; TO PROPER PLACE\r
445 \r
446         LDX     TEMP+4\r
447         JSR     DOCOL1\r
448 \r
449 * NOW DO SCORING\r
450         LDX     TEMP+6          ;SCORE ONE OBJECT\r
451         LDY     TEMP+3\r
452         JSR     DOSCOR\r
453         LDX     TEMP+5          ;SCORE OTHER OBJECT\r
454         LDY     TEMP+4\r
455         JSR     DOSCOR\r
456 \r
457         CPY     #24             ;SEE IF WE HAVE ANY EXPLODING ROCKS\r
458         BCC     ROCKEXPL\r
459         LDX     TEMP+3          ;RESTORE X\r
460         RTS\r
461 \r
462 * SCORE OBJECT OF TYPE X ACCORDINGLY AS IT WERE SHOT BY OBJECT Y\r
463 * I.E., IF Y CONTAINS INDEX OF PLAYER ONE'S SHOT, SCORE A HIT ON AN 'X' TO\r
464 * PLAYER ONE.\r
465 DOSCOR:\r
466         CPY     TEMP            ;CHECK P2'S BULLETS OR SHIP\r
467         BPL     SCORP2          ;CREDIT OBJECT TO P2'S SCORE\r
468         CPY     #28             ;CHECK P1'S BULLETS\r
469         BPL     SCORPL          ;CREDIT OBJECT TO CURRENT PLAYER\r
470         CPY     #24             ;CHECK P1'S SHIP\r
471         BNE     SCORERTS        ;NONE OF THE ABOVE: RTS\r
472         CPX     #3              ;IS IT A SHIP THAT #24 IS HITTING?\r
473         BNE     SCORPL          ;NO.  JUST SCORE IT.\r
474         LDA     #17             ;SOUR THE GOATMILK\r
475         STA     GOATMILK\r
476 ;       RTS             ;RTS IF YOU DON'T WANT TO SCORE THESE.\r
477 \r
478 SCORPL:\r
479         LDA     PLAYER          ;SCORE IT TO THE CURRENT PLAYER\r
480 SCORIT:\r
481         STA     SCORER          ;MARK THE SCORER\r
482         JSR     ADDPOINT        ;RACK 'EM UP\r
483 SCORERTS:\r
484         RTS\r
485 \r
486 SCORP2:\r
487         LDA     #1              ;SCORE FOR P2 REGARDLESS OF PLAYER\r
488         BPL     SCORIT          ;BPL = JMP\r
489 \r
490 \r
491 * HANDLE EXPLODING (="SPLITTING") ROCKS.\r
492 ROCKEXPL:\r
493         LDA     STATUS,Y        ;CHECK THE EXPLODING ROCK\r
494         SEC\r
495         SBC     #$91            ;WIDTH IS LO NYBBLE. IF =1, THEN SMALL\r
496         BMI     SPLITRTS        ;THIS IS CLEVER.  B2-91=21, ETC...\r
497         STA     TEMP+7          ;SAVE IT FOR NEWROCK TO USE...\r
498 \r
499         LDA     #$50            ;RESET 5.2 SEC UFO COUNTER\r
500         STA     RTIMER\r
501 \r
502         ;CREATE ONE, TWO, OR THREE NEW ROCKS, BASED ON DIFF.\r
503         LDA     DIFF            ;UNLESS AT A WHIPPY LEVEL THEN ONE\r
504         BEQ     ONEROCK\r
505         CMP     #3              ;AT EXPERT LEVEL, MAYBE > 2 ROCKS!\r
506         BCC     TWOROCKS\r
507         LDA     RANDPTR0        ;USE PTR AS RANDOM (NEWRAND SCREWS Y)\r
508         AND     #$03\r
509         BNE     TWOROCKS\r
510         JSR     NEWROCK         ;CREATE EACH NEW ROCK IF POSSIBLE;\r
511 TWOROCKS:\r
512         JSR     NEWROCK ;NEWROCK RETURNS "EMPTY HANDED" IF NOT.\r
513 ONEROCK:\r
514         JSR     NEWROCK\r
515 \r
516         LDX     TEMP+3          ;RESTORE X, TRASHED IN NEWROCK\r
517 SPLITRTS:\r
518         RTS\r
519 \r
520 NEWROCK:\r
521         LDX     #23             ;FIND A FREE ROCK SLOT\r
522 ROCKLOOP:\r
523         LDA     STATUS,X\r
524         CMP     #$FF\r
525         BEQ     THISROCK\r
526         DEX\r
527         BPL     ROCKLOOP\r
528         RTS\r
529 \r
530 THISROCK:\r
531         LDA     XPOSL,Y         ;INITIALIZE NEW ROCK (X) FROM OLD (Y)\r
532         STA     XPOSL,X\r
533         LDA     XPOSH,Y\r
534         STA     XPOSH,X\r
535         LDA     YPOSL,Y\r
536         STA     YPOSL,X\r
537         LDA     YPOSH,Y\r
538         STA     YPOSH,X\r
539         LDA     COLXPOSH,Y      ;THESE AREN'T QUITE RIGHT, BUT CLOSE.\r
540         STA     COLXPOSH,X\r
541         LDA     COLYPOSH,Y\r
542         STA     COLYPOSH,X\r
543         LDA     PALS,Y          ;ADJUST WIDTH TO SMALLER ROCK SIZE\r
544         CLC\r
545         ADC     #1\r
546         STA     PALS,X\r
547 \r
548         LDA     TEMP+7          ;GIVE IT THE PROPER ROCK TYPE STATUS\r
549         STA     STATUS,X\r
550         AND     #$0F            ;SET FIRST ANIMATION FRAME\r
551         TAY\r
552         LDA     ROCKCYC,Y\r
553         STA     ACYC,X\r
554         JSR     RANDVEL         ;SET UP RANDOM VELOCITIES.\r
555         LDX     PLAYER\r
556         INC     ROCKTOT,X       ;THERE IS NOW ONE MORE ROCK!\r
557         LDY     TEMP+4          ;RESTORE Y, TRASHED ABOVE\r
558         RTS\r
559 \r
560 ;RUBBER SHIPS\r
561 RUBBERS:\r
562         LDA     RUBFLAG         ;HAVE WE BEEN HERE BEFORE?\r
563         BPL     ZNORUB          ;YUP.  DON'T BOUNCE BACK\r
564 \r
565         LDA     XVELH+24\r
566         CMP     #$80            ;SIGNED 16 BIT DIVIDE BY TWO\r
567         ROR\r
568         PHA\r
569         LDA     XVELL+24\r
570         ROR\r
571         PHA\r
572         LDA     XVELH+32\r
573         CMP     #$80\r
574         ROR\r
575         STA     XVELH+24\r
576         LDA     XVELL+32\r
577         ROR\r
578         STA     XVELL+24\r
579         PLA\r
580         STA     XVELL+32\r
581         PLA\r
582         STA     XVELH+32\r
583 \r
584         LDA     YVELH+24\r
585         CMP     #$80\r
586         ROR\r
587         PHA\r
588         LDA     YVELL+24\r
589         ROR\r
590         PHA\r
591         LDA     YVELH+32\r
592         CMP     #$80\r
593         ROR\r
594         STA     YVELH+24\r
595         LDA     YVELL+32\r
596         ROR\r
597         STA     YVELL+24\r
598         PLA\r
599         STA     YVELL+32\r
600         PLA\r
601         STA     YVELH+32\r
602 \r
603 ZNORUB:\r
604         LDA     #1              ;PREVENT A SECOND BOUNCE\r
605         STA     RUBFLAG\r
606         JMP     RESTORE\r
607 \r
608 * TABLE OF STARTING VALUES FOR 'Y' IN COLLIDE LOOP: ESSENTIALLY, THESE ARE\r
609 * THE HIGHEST NUMBERED OBJECTS WE MUST COMPARE TO FOR A GIVEN X.\r
610 * THESE ARE OFFSET BY 24, SINCE THE LOWEST X WE CHECK IS 24 (SHIP1)\r
611 *\r
612 COLTAB:\r
613         .DC.B   23,24,24,24,25,25,25,25,29\r
614 \r
615 * WIDTH TABLES FOR COLLISION PURPOSES\r
616 OBJWID:\r
617         .DC.B    2,4,5,3,2,4,1,1;X-EXTENTS (XTENTS)\r
618 OBJHEIT:\r
619         .DC.B    3,6,8,6,2,3,1,1;Y-EXTENTS (YTENTS)\r
620 OBJDIAG:\r
621         .DC.B    3,6,9,6,2,3,2,1;DIAGONALS\r
622 \r
623 * OFFSET (INTO THE STAMP) OF SHARP POINTS OF THE SHIP\r
624 SHLTAILX:\r
625         .DC.B    1,0,0,1,1,2,3,4,5,5,6,5,5,4,3,2\r
626 SHLTAILY:\r
627         .DC.B    5,7,9,11,12,13,14,14,13,11,9,7,6,5,4,4\r
628 SHRTAILX:\r
629         .DC.B    5,4,3,2,1,1,0,0,1,2,3,4,5,5,6,5\r
630 SHRTAILY:\r
631         .DC.B    5,4,4,5,6,7,9,11,13,14,14,13,12,11,9,7\r