]> github.com/historicalsource and other repositories - asteroids-7800.git/blob - FSM.S
Initial import.
[asteroids-7800.git] / FSM.S
1 *           1830    040784\r
2 *\r
3 ** FSM.S **\r
4 ** ASTEROIDS FOR THE ATARI 3600 **\r
5 ** THIS FILE CONTAINS THE FINITE STATE MACHINE FOR ASTEROIDS. **\r
6 ** GAME SEQUENCER TO HANDLE INDIVIDUAL PLAYER'S EVENT TIMING. **\r
7 \r
8 \r
9 FSM:\r
10         LDX     PLAYER          ;PLAYER MUST CONTAIN CURRENT PLAYER\r
11         LDA     STATE,X         ;CURRENT STATE OF PLAYER\r
12         BEQ     CKCOMPLY        ;CHECK IF COMP PLAY\r
13         BPL     DECTIMER        ;IF IN ACTIVE STATE THEN TAKE ACTION\r
14         RTS                     ;IF MINUS, RTS (I GUESS)\r
15 \r
16 DECTIMER:\r
17         DEC     TIMER,X         ;DECREMENT EVENT TIMER\r
18         CMP     #BIRTH          ;BIRTH STATE?\r
19         BEQ     BIRTHD\r
20         CMP     #HYPER          ;HYPERSPACE STATE?\r
21         BNE     ZCKCOMP\r
22         JMP     HYPERD\r
23 ZCKCOMP:\r
24         CMP     #COMPOVER       ;COMP PLAY OVER?\r
25         BNE     ZCKDTH\r
26         JMP     COVERD\r
27 ZCKDTH:\r
28         CMP     #DEATH          ;DEATH STATE?\r
29         BNE     FSMRTS\r
30         JMP     DEATHD\r
31 FSMRTS:\r
32         RTS\r
33 \r
34 CKCOMPLY:\r
35         LDA     COMPFLAG        ;CHECK IF ANYBODY DIED YET\r
36         BEQ     FSMRTS\r
37         JSR     CMPSCOR         ;COMPARE SCORES\r
38         BMI     FSMRTS\r
39         CMP     PLAYER          ;HISCORE = FIRST TO DIE?\r
40         BNE     FSMRTS          ;YES, CONTINUE PLAY\r
41         TAX\r
42         LDA     #COMPOVER\r
43         STA     STATE,X         ;STATE IS REZ OUT VICTOR\r
44         LDA     #$FF\r
45         STA     COMPFLAG\r
46         LDA     #0\r
47         STA     MENLEFT,X       ;NO MORE LIVES\r
48         LDA     #$0D\r
49         STA     FLASH\r
50         LDA     #$0\r
51         JSR     DOTUNE          ;VICTOR REZOUT SOUND\r
52         RTS\r
53 \r
54 CMPSCOR:\r
55         LDX     #0              ;COMPARE SCORES\r
56 CMPSLOOP:\r
57         LDA     SCORE,X         ;FIRST SCORE\r
58         CMP     SCORE2,X        ;SECOND SCORE\r
59         BCC     P2BIGGR         ;SCORE < SCORE2\r
60         BEQ     BUMPX\r
61         BCS     P1BIGGR         ;SCORE > SCORE2\r
62 BUMPX:\r
63         INX                     ;LOOK AT NEXT BYTE\r
64         CPX     #5\r
65         BNE     CMPSLOOP\r
66         LDA     #$FF            ;SCORE = SCORE2\r
67         RTS\r
68 P2BIGGR:\r
69         LDA     #1\r
70         RTS\r
71 P1BIGGR:\r
72         LDA     #0\r
73         RTS\r
74 \r
75 ** BIRTH DISPACHER - HANDLES TIMING OF BIRTH EVENTS. **\r
76 BIRTHD:\r
77         LDY     OFFPLAY2        ;IF PLAYER IS NOT THERE, DON'T\r
78         LDA     STATUS+24,Y     ; DO REZ TWINKLE\r
79         BMI     ZNOREZ\r
80 \r
81         ;DO REZ TWINKLE\r
82         LDA     #$05            ;DEFAULT LUME FOR AUTOPLAY\r
83         LDY     GAMSTATE\r
84         CPY     #PLAYST\r
85         BNE     ZREZGO          ;IF NOT IN PLAY STATE, DO AUTO REZ\r
86         LDA     FRMCNT          ;USE FRAME COUNT LO BITS FOR LUME\r
87         ASL\r
88 ZREZGO:\r
89         JSR     PAINTSHP        ;PAINT THE SHIP, BODY AND DEJAG COLORS\r
90         LDX     PLAYER\r
91 ZNOREZ:\r
92         LDA     TIMER,X         ;CHECK TIMER TO DISPATCH\r
93         CMP     #PMSGT          ;TIME TO PUT UP PLAYER MESSAGE?\r
94         BEQ     PMSG            ; YES, PUT IT UP\r
95         CMP     #PMSGOFFT       ;TIME TO TAKE DOWN MESSAGE?\r
96         BEQ     PMSGOFF         ; YES, TAKE IT DOWN\r
97         CMP     #RESINT         ;TIME TO RES IN?\r
98         BEQ     RESIN           ; YES, RES IN.  IF LATER THAN RESINT,\r
99         BCC     OPTENTER        ; CHECK FOR OPTIONAL ENTER (JSTICK)\r
100         RTS                     ;OTHERWISE, JUST RTS\r
101 \r
102 * ROUTINE TO PUT UP THE PLAYER X MESSAGE IF NEEDED. *\r
103 PMSG:\r
104         LDA     MODE            ;NO MESSAGES IN TEAM MODES\r
105         CMP     #1\r
106         BPL     ZPLRTS\r
107         JSR     SETMSG\r
108 ZPLRTS:\r
109         RTS\r
110 \r
111 * ROUTINE TO TURN PLAYER X MESSAGE OFF. *\r
112 PMSGOFF:\r
113         LDA     #$FF            ;TURN OFF HIGH MESSAGE\r
114         STA     STATUS+34\r
115         RTS\r
116 \r
117 \r
118 * ROUTINE TO ENTER THE SHIP IF DESIRED OR NEEDED. *\r
119 OPTENTER:\r
120 \r
121         LDA     GAMSTATE        ;DO ONLY IF GAMEPLAY STATE\r
122         CMP     #PLAYST\r
123         BNE     ZCKTIMM\r
124 \r
125         ;FIRST CHECK TO SEE IF PLAYER IS FORCING SHIP IN\r
126         LDA     FIREBUT1,X      ;FIRE BUTTON\r
127         AND     HYPBUT1,X       ;HYPERSPACE BUTTON\r
128         BPL     ENTSHIP         ; IS PRESSED! ENTER HIM\r
129         LDA     SWCHA           ;JOYSTICK\r
130         EOR     #$FF            ; (INVERTED)\r
131         AND     JOYTBL,X        ; (LOOK AT ONLY CORRECT PLAYER'S BITS)\r
132         BNE     ENTSHIP         ; IS HIT! ENTER HIM\r
133 \r
134         ;NOW CHECK IF IT IS TIME, AND IS SAFE.\r
135 ZCKTIMM:\r
136         LDA     TIMER,X         ;CHECK TIMER\r
137         CMP     #ENTERT\r
138         BCS     ENTRTS          ;NOT TIME YET, DON'T BOTHER\r
139 \r
140         LDA     OFFPLAY2        ;CHECK SAFTEY\r
141         CLC\r
142         ADC     #24\r
143         TAX\r
144         JSR     ISSAFE          ;CHECK IF AREA SAFE TO ENTER\r
145         BEQ     ENTSHIP         ;YES, CONTINUE\r
146 \r
147         ;NOT SAFE, HOLD TIMER HERE INDEFINITELY\r
148         LDX     PLAYER\r
149         INC     TIMER,X\r
150 ENTRTS:\r
151         RTS\r
152 \r
153 ENTSHIP:\r
154         LDA     #2              ;KILL TWINKLING\r
155         JSR     KILLTUNE\r
156         LDA     #$3             ;ADD BUZZING IN\r
157         JSR     DOTUNE\r
158 \r
159         LDA     PLAYER          ;CHANGE BODY COLOR\r
160         ASL\r
161         ASL\r
162         TAX\r
163         LDA     COLORS+2,X\r
164         STA     SOFTCOLR+2,X\r
165         LDA     COLORS+3,X\r
166         STA     SOFTCOLR+3,X\r
167 \r
168         LDX     PLAYER\r
169         LDA     #1              ;DEBOUNCE ENTER/FIRE BUTTON\r
170         STA     FIRESTAT,X\r
171 \r
172         LDA     #OK             ;SET STATE AS OK\r
173         STA     STATE,X\r
174         RTS\r
175 \r
176 ** ROUTINE TO RESIN AND TWINKLE SHIP AT ENTERING. **\r
177 RESIN:\r
178         LDA     STATUS+25       ;CHECK STATUS OF UFO\r
179         BMI     ZGONOW          ;DON'T BRING SHIP IN IF UFO\r
180         INC     TIMER,X\r
181         RTS\r
182 \r
183 ZGONOW:\r
184         LDA     GAMSTATE        ;DON'T DECREMENT IF AUTOPLAY\r
185         CMP     #AUTOST\r
186         BEQ     ZNODECM\r
187         LDA     MODE            ;CHECK TO DEC FROM COMMON POOL\r
188         CMP     #1\r
189         BNE     ZNOPOOL\r
190         LDA     MENLEFTC        ;CHECK: IF NO MENLEFT, JUST HANG OUT\r
191         CMP     #1              ; AND WAIT; PERHAPS OTHER PLAYER WILL\r
192         BCS     ZYESMEN         ; BRING HIM IN A LIFE.\r
193         INC     TIMER,X         ; (HOLD TIMER AT THIS POINT IN TIME)\r
194         RTS\r
195 \r
196 ZYESMEN:\r
197         LDX     #2              ;2 = COMMON POOL\r
198 ZNOPOOL:\r
199         DEC     MENLEFT,X       ;DEC FROM PLAYERS LIVES\r
200         JSR     UPDATMEN\r
201 \r
202 ZNODECM:\r
203         LDA     #2              ;TWINKLING SOUND\r
204         JSR     DOTUNE\r
205 \r
206 \r
207 ZINITPOS:\r
208         LDX     OFFPLAY2        ;INITIALIZE THE SHIP'S POSITION\r
209         LDA     #0\r
210         STA     XVELH+24,X\r
211         STA     YVELH+24,X\r
212         STA     XVELL+24,X\r
213         STA     YVELL+24,X\r
214         STA     GOATMILK        ;??\r
215         LDA     MODE\r
216         CMP     #1\r
217         BMI     ZCENTERS\r
218         LDY     PLAYER\r
219         LDA     INITSX,Y        ;GET X POS VALUE FOR PLAYER\r
220         BPL     ZSTORSX         ;BPL = JMP HERE.\r
221 ZCENTERS:\r
222         LDA     #$50\r
223 ZSTORSX:\r
224         STA     XPOSH+24,X\r
225         CLC\r
226         ADC     DELTAX+3        ;COULD SQUEEZE A BYTE HERE: USE IMMED.\r
227         STA     COLXPOSH+24,X\r
228         LDA     #$50\r
229         STA     YPOSH+24,X\r
230         CLC\r
231         ADC     DELTAY+3        ;COULD SQUEEZE HERE TOO.\r
232         STA     COLYPOSH+24,X\r
233 \r
234         LDX     PLAYER          ;STORE FIRST ANIMATION\r
235         LDA     SHIPDIR,X\r
236         LSR\r
237         LSR\r
238         LSR\r
239         AND     #$FE\r
240         CLC\r
241         ADC     #SHIP1 & 255\r
242         LDX     OFFPLAY2\r
243         STA     ACYC+24,X\r
244 \r
245         LDA     #SHIP           ;STORE STATUS AS SHIP\r
246         STA     STATUS+24,X\r
247 \r
248         RTS\r
249 \r
250 \r
251 INITSX:\r
252         .DC.B   $30,$70         ;XPOS VALUES FOR INITIAL SHIP POS\r
253 JOYTBL:\r
254         .DC.B   $F0,$0F         ;JSTICK MASKS, INDEXED BY PLAYER.\r
255 \r
256 \r
257 ** HYPER SPACE DISPACHER - HANDLES TIMING OF HYPER SPACE EVENTS. **\r
258 HYPERD:\r
259         LDA     TIMER,X         ;CURRENT PLAYERS EVENT TIMER\r
260         CMP     #HYPERT         ;TIME TO JUMP HYPERSPACE?\r
261         BEQ     HYPERGO         ; YES, DO IT.\r
262         CMP     #HYPENDT        ;TIME TO END HYPERSPACE\r
263         BEQ     HYPEND          ; YES, DO IT.\r
264         RTS                     ;OTHERWISE, JUST RTS\r
265 \r
266 * ROUTINE TO HANDLE THE JUMP TO HYPERSPACE. *\r
267 HYPERGO:\r
268         LDA     #$01            ;SOUND\r
269         JSR     DOTUNE\r
270 \r
271         LDX     OFFPLAY2        ;NULL OUT SHIP\r
272         LDA     #$FF\r
273         STA     STATUS+24,X\r
274 \r
275         LDA     #0              ;NULL VELOCITY\r
276         STA     XVELL+24,X\r
277         STA     XVELH+24,X\r
278         STA     YVELL+24,X\r
279         STA     YVELH+24,X\r
280 \r
281         RTS\r
282 \r
283 \r
284 * ROUTINE TO HANDLE THE RETURN FROM HYPERSPACE. *\r
285 HYPEND:\r
286         LDA     #24\r
287         CLC\r
288         ADC     OFFPLAY2\r
289         TAX\r
290         JSR     NEWRAND         ;GET NEW SHIP POSITION\r
291         LSR                     ; AVOID EXTREME SIDES\r
292         ADC     #$D             ; (BETWEEN $D AND $8C)\r
293         STA     XPOSH,X\r
294         JSR     NEWRAND         ;GET Y POSITION; AVOID TOP AND BOTTOM\r
295         LSR\r
296         ADC     #$10            ; (BETWEEN $10 AND $90)\r
297         STA     YPOSH,X\r
298         JSR     ISSAFE          ;SAFE TO ENTER\r
299         BEQ     GOBIGRED        ;YOU BET\r
300         LDX     PLAYER          ;SORRY CHARLIE\r
301         INC     TIMER,X\r
302         RTS\r
303 GOBIGRED:\r
304         JSR     NEWRAND         ;GET RANDOM VALUE\r
305         CMP     #50             ;SOMETIMES LET THE SHIP EXPLODE\r
306         BCS     NOBLOW          ;OTHERWISE SET NEW POSITION\r
307 \r
308         ;EXPLODE HIM!\r
309         LDA     #24             ;WITHOUT THIS X = 'FF' SOMETIMES\r
310         CLC\r
311         ADC     OFFPLAY2\r
312         TAX\r
313         LDA     #$A3            ;BOOM !! SET HIGH BIT OF STATUS\r
314         STA     STATUS,X\r
315         LDA     ELBOUND+3       ;SET ANIMATION STAMP\r
316         STA     ACYC,X\r
317         LDA     #5              ;START SHIP EXPLOSION SOUND\r
318         JSR     DOTUNE\r
319         LDX     PLAYER\r
320 BLOW:\r
321         LDA     #DEATH          ;SET STATE\r
322         LDX     PLAYER\r
323         STA     STATE,X\r
324         LDA     #DIET+$28       ;ENTER TIMELINE AT TOP\r
325         STA     TIMER,X\r
326         RTS\r
327 \r
328 NOBLOW:\r
329         LDA     #3              ;BUZZ SOUND\r
330         JSR     DOTUNE\r
331         LDA     #SHIP           ;RESTORE SHIP\r
332         LDX     TEMP\r
333         STA     STATUS,X\r
334         LDX     PLAYER\r
335         LDA     #OK             ;RETURN STATE TO OK.\r
336         STA     STATE,X\r
337         RTS\r
338 \r
339 \r
340 ** COMP PLAY OVER DISPACHER - HANDLES TAKING SHIP OUT. **\r
341 COVERD:\r
342 *       LDX     PLAYER\r
343         LDA     FLASH\r
344         INC     FLASH\r
345         CMP     #$20\r
346         BEQ     ZTAB\r
347         CMP     #$2E\r
348         BNE     CCONTIN         ;ALL DONE\r
349         JMP     BLOW            ;JUMP INTO HYPER CODE\r
350 CCONTIN:\r
351         BIT     BPLOP\r
352         BEQ     DOPAINT\r
353         EOR     #$1F\r
354 DOPAINT:\r
355         JSR     PAINTSHP\r
356         RTS\r
357 ZTAB:\r
358         LDX     OFFPLAY2        ;NUKE SHIP\r
359         LDA     #$FF\r
360         STA     STATUS+24,X\r
361         RTS\r
362 \r
363 ** DEATH DISPACHER - HANDLES TIMING OF DEATH SEQUENCE. **\r
364 DEATHD:\r
365         LDA     TIMER,X         ;CURRENT PLAYERS EVENT TIMER\r
366         CMP     #DIET           ;TOP OF DEATH TIMELINE?\r
367         BEQ     DIE             ; YES, GO TO DIE HANDLER\r
368         CMP     #SWITCHT        ;TIME TO SWITCH PLAYER?\r
369         BNE     ZCKPOT\r
370         JMP     SWITCH          ; YES, SWITCH.\r
371 ZCKPOT:\r
372         CMP     #POMSGT ;TIME TO DISPLAY PLAYERX OVER?\r
373         BNE     ZCOKE\r
374         JMP     POMSG           ; YES, DO IT.\r
375 ZCOKE:\r
376         CMP     #POMSGOFT       ;TIME TO TURN OFF MESSAGE?\r
377         BEQ     POMSGOFF        ; YES, DO IT.\r
378         CMP     #GOVERT         ;TIME TO DISPLAY GAME OVER MESSAGE?\r
379         BEQ     GOVER           ; YES, DO IT.\r
380         CMP     #NEWGAMET       ;END OF DEATH TIMELINE?\r
381         BNE     DEATHRTS\r
382                                 ;YES, SET UP FOR HIGH SCORE CART\r
383         JSR     CLEARTUN        ;GET RID OF ANY TUNES\r
384         JSR     NULLOBJS        ;GET RID OF ANY OBJECTS\r
385         JSR     HSCDOENT\r
386         JMP     DOTITLE\r
387 DEATHRTS:\r
388         RTS\r
389 \r
390 \r
391 * ROUTINE TO TAKE DOWN THE ABOVE *\r
392 POMSGOFF:\r
393         LDA     #$FF            ;NULL OUT BOTH MESSAGES\r
394         STA     STATUS+34\r
395         STA     STATUS+35\r
396 \r
397         TXA                     ;CHECK OTHER PLAYER FOR GAME OVER COND.\r
398         EOR     #$01            ; HERE'S HOW IT WORKS: ONLY ONE PLAYER\r
399         TAY                     ; ACTUALLY MAKES IT TO THE GAME OVER\r
400         LDA     #DEAD           ; MESSAGE TIME.  SO, THE FIRST PLAYER\r
401         CMP     STATE,Y         ; TO MAKE IT TO POMSGOFF BECOMES DEAD\r
402         BEQ     DEATHRTS        ; THE OTHER LIVES ON TO GET TO GOVER!\r
403         STA     STATE,X         ;MAKE PLAYER DEAD, SINCE OTHER IS LIVE.\r
404         LDA     MODE            ;IN TWO PLAYER MODE, SWITCH DATA NOW\r
405         BNE     DEATHRTS        ; SO WE DON'T GET STUCK PLAYING\r
406         JMP     SWITCH          ; A DEAD PLAYER (FSM WON'T RUN ON HIM)\r
407         RTS\r
408 \r
409 * ROUTINE TO PUT UP GAME OVER MESSAGE *\r
410 GOVER:\r
411         LDX     #2              ;GAME OVER MESSAGE\r
412         JSR     SETMSG\r
413         JSR     HIGHSCOR\r
414         RTS\r
415 \r
416 * ROUTINE TO HANDLE DEATH OF A SHIP. *\r
417 * ALL DEATHS GO HERE.  THIS ROUTINE FIGURES OUT WHERE WE SHOULD BE GOING. *\r
418 DIE:\r
419         JSR     INITHUMP        ;REINIT THUMP RATE\r
420 \r
421         LDA     #$11            ;KILL THRUST SOUND\r
422         JSR     KILLTUNE\r
423         LDX     PLAYER          ;RESTORE X, TRASHED BY KILLTUNE\r
424 \r
425         ;HANDLE MODES DIFFERENTLY\r
426         LDY     MODE\r
427         LDA     MENLEFTC        ;LOAD TEAMPLAY MENLEFT AS DEFAULT\r
428         CPY     #1\r
429         BEQ     ZDIEMN1         ;IF NOT TEAMPLAY MODE\r
430         LDA     MENLEFT,X       ; USE CURRENT MENLEFT\r
431 ZDIEMN1:\r
432         CMP     #1              ;IF WE HAVE NO MEN LEFT\r
433         BCC     NOMENLFT        ; HANDLE THIS SITUATION\r
434         CPY     #0              ;ELSE IF NOT TWO PLAYER MODE\r
435         BNE     GIVEBRTH        ; SIMPLY TRY TO GIVE BIRTH.\r
436 \r
437         TXA                     ;ELSE TWO PLAYER MODE:\r
438         EOR     #$01            ; CHECK OTHER PLAYER'S MENLEFT.\r
439         TAX\r
440         LDA     MENLEFT,X\r
441         CMP     #1              ; IF HE HAS MEN LEFT THEN\r
442         BCS     DEATHRTS        ;  SIMPLY RTS. SWITCH WILL DO THE TRICK\r
443         JMP     GIVBRTH2        ; ELES SKIP THE SWITCH.  GIVE BIRTH NOW\r
444 \r
445 NOMENLFT:\r
446         CPY     #$FF            ;ELSE, IF ONE PLAYER MODE\r
447         BEQ     DIEGOVER        ; DIE WITH SIMPLE GAMEOVER (NO PMSG)\r
448         CPY     #$1             ;ELSE, IF NOT IN TEAM PLAY MODE\r
449         BNE     DIEPOVER        ; DIE WITH PLAYER OVER MESSAGE\r
450         TXA                     ;ELSE CHECK OTHER PLAYER'S STATE\r
451         EOR     #$01            ; TO SEE WHETHER TO END THE GAME\r
452         TAX\r
453         LDA     STATE,X\r
454         CMP     #BIRTH          ; IF OTHER PLAYER IS NOT IN BIRTH\r
455         BNE     GIVEBRTH        ;  THEN TRY TO GIVE BIRTH.\r
456         LDA     OFFPLAY2        ; OTHERWISE,\r
457         EOR     #$08            ;  (TOGGLE OFFPLAY2)\r
458         TAY\r
459         LDA     STATUS+24,Y     ;  IF HE IS NOT YET BORN, THEN\r
460         CMP     #SHIP           ;  FORGET IT BUD.  AIN'T NO LIVES LEFT\r
461         BEQ     GIVEBRTH        ;  FOR EITHER OF THEM.\r
462         LDA     #DEAD           ;   NUKE OTHER PLAYER OUT OF BIRTHST\r
463         STA     STATE,X         ;   TO PREVENT A NEW RACK FROM STARTING\r
464 DIEGOVER:\r
465         LDA     #GOVERT+3       ;DIE WITH GAME OVER MESSAGE ONLY\r
466         BNE     ZDIEOVER        ; BNE = JMP\r
467 \r
468 DIEPOVER:\r
469         LDA     #POMSGT+3       ;DIE WITH PLAYER N GAME OVER MESSAGE\r
470 ZDIEOVER:\r
471         LDX     PLAYER\r
472         STA     TIMER,X\r
473         RTS\r
474 \r
475 GIVEBRTH:\r
476         LDX     PLAYER\r
477         LDA     #BIRTH          ;GIVE BIRTH\r
478         STA     STATE,X\r
479         LDA     #RESINT+3       ;AT TIMER RESIN+3\r
480         STA     TIMER,X\r
481         RTS\r
482 \r
483 * ROUTINE TO PUT UP PLAYERX GAME OVER MESSAGE *\r
484 POMSG:\r
485         LDX     PLAYER          ;PLAYERX MESSAGE\r
486         LDA     COMPFLAG\r
487         BMI     PVICTOR\r
488         BEQ     PPLAYER\r
489         JSR     CMPSCOR         ;COMPARE SCORES\r
490         TAX\r
491         BPL     PVICTOR\r
492 ;           TIE SCORE\r
493         LDA     GOATMILK        ;CHECK FLAG\r
494         BNE     PUNTTHIS        ;SHIP TO SHIP\r
495         LDX     PLAYER          ;NO, PUT MESSAGE FOR THIS GUY\r
496         BPL     PVICTOR         ; = JMP\r
497 PUNTTHIS:\r
498         LDA     #$FF            ;RETURN W/OUT MSG IF EQUAL\r
499         STA     STATUS+34       ;TAKE MSG DOWN BEFORE SEEN\r
500         STA     STATUS+35\r
501         RTS\r
502 \r
503 PPLAYER:\r
504         JSR     SETMSG\r
505         LDX     #2\r
506 DOMSG:\r
507         JSR     SETMSG\r
508         LDX     MODE\r
509         CPX     #2\r
510         BNE     ZPORTS\r
511         STX     COMPFLAG\r
512 ZPORTS:\r
513         RTS\r
514 \r
515 PVICTOR:\r
516         JSR     SETMSG          ;X HAS PLAYER\r
517         LDX     #3\r
518         BPL     DOMSG           ;BPL  =  JMP\r
519 \r
520 * ROUTINE TO SWITCH THE TWO DATA SETS WHEN NEEDED. *\r
521 SWITCH:\r
522         TXA                     ;TOGGLE CURRENT PLAYER # AND OFFSET\r
523         EOR     #$01\r
524         TAX\r
525         STA     PLAYER\r
526         BEQ     ZSTOFFP2\r
527         LDA     #8\r
528 ZSTOFFP2:\r
529         STA     OFFPLAY2\r
530 \r
531         LDA     #$FF            ;NULL OUT SPACE OBJECTS\r
532         LDX     #7              ; (31-23=8 OBJECTS)\r
533 SWCHNULL:\r
534         STA     STATUS+24,X\r
535         DEX\r
536         BPL     SWCHNULL\r
537 \r
538         LDA     #0\r
539         STA     RACKDLY         ;NO DELAY AFTER SWITCH\r
540         LDA     #$50\r
541         STA     RTIMER          ;RESET UFO FREQUENCY AND TIMER\r
542         LDA     #$92\r
543         STA     SDELAY\r
544         STA     EDELAY\r
545         JSR     CLEARTUN        ;KILL TUNES, ESP. UFO\r
546 \r
547         LDY     #23\r
548 SWCHLOOP:\r
549         LDX     STATUS,Y\r
550         LDA     STATUS2,Y\r
551         STA     STATUS,Y\r
552         TXA\r
553         STA     STATUS2,Y\r
554 *\r
555         LDX     ACYC,Y\r
556         LDA     ACYC2,Y\r
557         STA     ACYC,Y\r
558         TXA\r
559         STA     ACYC2,Y\r
560 *\r
561         LDX     PALS,Y\r
562         LDA     PALS2,Y\r
563         STA     PALS,Y\r
564         TXA\r
565         STA     PALS2,Y\r
566 *\r
567         LDX     XVELH,Y\r
568         LDA     XVELH2,Y\r
569         STA     XVELH,Y\r
570         TXA\r
571         STA     XVELH2,Y\r
572 *\r
573         LDX     YVELH,Y\r
574         LDA     YVELH2,Y\r
575         STA     YVELH,Y\r
576         TXA\r
577         STA     YVELH2,Y\r
578 *\r
579         LDX     XVELL,Y\r
580         LDA     XVELL2,Y\r
581         STA     XVELL,Y\r
582         TXA\r
583         STA     XVELL2,Y\r
584 *\r
585         LDX     YVELL,Y\r
586         LDA     YVELL2,Y\r
587         STA     YVELL,Y\r
588         TXA\r
589         STA     YVELL2,Y\r
590 *\r
591         LDX     XPOSH,Y\r
592         LDA     XPOSH2,Y\r
593         STA     XPOSH,Y\r
594         TXA\r
595         STA     XPOSH2,Y\r
596 *\r
597         LDX     YPOSH,Y\r
598         LDA     YPOSH2,Y\r
599         STA     YPOSH,Y\r
600         TXA\r
601         STA     YPOSH2,Y\r
602 \r
603         DEY\r
604         BPL     SWCHLOOP\r
605 \r
606 GIVBRTH2:\r
607         LDX     PLAYER          ;GIVE BIRTH, TWO PLAYER STYLE (PMSG)\r
608         LDA     #BIRTH          ;GIVE BIRTH\r
609         STA     STATE,X\r
610         LDA     #PMSGT+$20      ;AT TIMER PMSGT+20\r
611         STA     TIMER,X\r
612 \r
613         RTS\r