First commit
[nightdriver.git] / A06560.XX
1 ;       30-SEP-76\r
2 ;       04:50:00\r
3         .TITLE NIGHT DRIVER\r
4         .SBTTL PAGE ZERO EQUATES\r
5         .ASECT\r
6         .=110000\r
7 ;***************************************************\r
8 ;***    MISCELLANEOUS EQUATES FOR PAGE ZERO      ***  \r
9 ;***************************************************\r
10 ZLOW    =2\r
11 COINC   =0      ;CREDIT COUNTER\r
12 COINT   =1      ;COIN TIMER\r
13 SYNC    =2      ;INTERRUPT CONTROL\r
14 GAS     =3      ;NO\r
15 SKDCTL  =4      ;NO\r
16 STEER   =5      ;CURRENT STEERING VALUE\r
17 XSVE    =6\r
18 ORVH    =7      ;ORIGIN MSB'S\r
19 ZCNTRL  =10     ;CNTRL = 32 POSITIONS\r
20 ZXAX    =50     ;XAXIS = 32 POSITIONS\r
21 ZYAX    =110    ;YAXIS=32\r
22 PYA     =150    ;ADJUSTED Y POSITION\r
23 VELL    =151    ;VELOCITY\r
24 VELH    =152\r
25 STCL    =153    ;STEERING CONSTANT (VEL*STEER)\r
26 STCH    =154\r
27 PYAVL   =155    ;ADJUSTED POSITION*VELOCITY\r
28 PYAVH   =156\r
29 VELKL   =157    ;VELOCITY ADJUSTED BY K (VEL*K)\r
30 VELHL   =160\r
31 PRODL   =161    ;PRODUCT TERM USED BY MULTIPLY ROUTINE\r
32 PRODH   =162\r
33 ORL     =163    ;ORIGIN MIDDLE BYTE\r
34 ORH     =164    ;ORIGIN LSB\r
35 TURNL   =165    ;TURN DISTANCE COVERED\r
36 TURNH   =166\r
37 DIST    =167    ;TURN DISTANCE REQUIRED BY TRACK\r
38 FRMTME  =170    ;NUMBER OF FRAMES PER CLOCK TICK\r
39 TRNDX   =171    ;INDEX USED TO FETCH DATA FROM TRACK TABLE\r
40 CS      =172    ;COIEFFICIENT OF SHARPNESS OF TURN\r
41 OBJTML  =173    ;DISTANCE DRIVEN BETWEEN PYLONS (ALSO OBJTMH)\r
42 EPSCR   =174    ;EXTENDED PLAY SCORE\r
43 SMOKE   =175    ;SCREECH TIME AT FIRST AND SECOND GEAR\r
44 SECNDH  =176\r
45 R7      =177\r
46 TDISTL  =200    ;TOTAL TRACK DISTANCE COVERED FROM GAME START\r
47 TDISTM  =201\r
48 TDISTH  =202\r
49 TDSTVH  =203\r
50 MLTPLR  =204\r
51 R4      =204\r
52 MLTCDL  =205\r
53 R0      =205\r
54 MLTCDH  =206\r
55 R1      =206\r
56 OBJTMH  =207\r
57 R2      =210\r
58 R3      =211\r
59 CRVL    =212    ;TURNING COIEFFICIENT (CS*VELOCITY)\r
60 CRVH    =213\r
61 PYAVKL  =214    ;PYA*KP*VELOCITY\r
62 PYAVKH  =215\r
63 FRMCL   =216    ;TOTAL FRAME COUNT\r
64 FRMCH   =217\r
65 R5      =220\r
66 R6      =221    ;GAME TIME (STORED PACKED BCD)\r
67 ZHI     =221\r
68 GTML    =ZHI+1\r
69 GTMH    =ZHI+2\r
70 TRMAX   =ZHI+3  ;NUMBER OF ENTRIES IN TRACK TABLE\r
71 TRKADL  =ZHI+4  ;ADDRESS OF TRACK TABLE\r
72 TRKADH  =ZHI+5\r
73 OLDTK   =ZHI+6  ;TRACK CURRENTLY USING OR LAST TRACK USED\r
74 HML     =ZHI+7  ;HIGH SCORE (STORED BCD)\r
75 HMH     =ZHI+10\r
76 TPSPDL  =ZHI+13 ;PLAYER'S TOP SPEED (BCD)\r
77 TPSPDH  =ZHI+14\r
78 PRTSDL  =ZHI+17 ;PREVIOUS TOP SPEED (BCD)\r
79 PRTSDH  =ZHI+20\r
80 MILEL   =ZHI+21 ;PLAYER'S SCORE (BCD)\r
81 MILEM   =ZHI+22\r
82 TOPZ    =ZHI+23 ;TABLE OF PREVIOUS HIGH SCORES FOR ALL TRACKS (12 BYTES)\r
83 ZVHI    =ZHI+36\r
84 \r
85 \r
86 ;****************************************************\r
87 ;***                                              ***\r
88 ;***            GAME CONTROL CONSTANTS            ***\r
89 ;****************************************************\r
90 \r
91 PYMIN   =100    ;HORIZON\r
92 XMIN    =30     ;LEFT LIMIT OF SCREEN\r
93 CRLFT   =130    ;CRASH POINT ON LEFT SIDE\r
94 XMAX    =350    ;RIGHT LIMIT OF SCREEN\r
95 CRRHT   =250    ;CRASH POINT ON RIGHT SIDE\r
96 BOTTOM  =350    ;BOTTOM OF SCREEN\r
97 NOT     =12     ;NUMBER OF DISTANCE UNITS BETWEEN PYLONS\r
98 PRSPC   =10     ;DISTANCE BETWEEN PYLON PAIR AT ORIGIN\r
99 MINPIC  =34     ;SMALLEST PICTURE\r
100 \f       .SBTTL ADDRESS MAP EQUATES\r
101 ;****************************************************\r
102 ;***                                              ***\r
103 ;***            OBJECT CONTROL ADDRESSES          ***\r
104 ;***                                              ***\r
105 ;****************************************************\r
106 \r
107 \r
108 PLYFLD  =1000           ;PLAYFIELD (12)\r
109 XAXIS   =2000           ;H(16)\r
110 YAXIS   =2020           ;V(16)\r
111 PICTR   =2040           ;C(16)\r
112 WTCHDG  =2060\r
113 TIME    =3000           ;GAME OPT(2**7,2**6,2**5,2**4)\r
114 TESTSW  =3001           ;MSB(N); VBLANK (2**6)\r
115 EPSW    =3001           ;BONUS TIME ALLOWED (2**5); TRACK SET SELECT (2**4)\r
116 GEARS   =3002           ;GEARS (2**6,2**5,2**4)\r
117 STRNG   =3003           ;STEERING (2**7,2**6)\r
118 EASY    =3003           ;EASY/HARD (2**5); SPARE (2**4)\r
119 COINAS  =4000           ;COIN SW (MSB)\r
120 COINBS  =4001           ;COIN SW\r
121 STRTSW  =4002           ;START GAME SWITCH\r
122 ACCEL   =4003           ;ACCELERATOR\r
123 TRKSW   =4004           ;TRACK SELECT 4,5\r
124 POWER   =4006           ;LINE POWER\r
125 CYC56   =4007           ;50/60 MODE SWITCH\r
126 OUT1    =5000           ;MOTOR, SCREECH\r
127 OUT2    =6000           ;CRASH, SLMP, THUMPER\r
128 OUT3    =7000           ;SPARE OUTPUT\r
129 PFR     =100000         ;PLAYFIELD READ\r
130 STRST   =102000         ;STEERING RESET\r
131 \r
132 ;       PLAYFIELD ADDRESSES\r
133 \r
134 PHS     =15             ;PREVIOUS HIGH SCORE\r
135 YTPSPD  =134            ;PLAYERS SCORE\r
136 PPTP    =34             ;PREVIOUS TOP SPEED\r
137 PSCORE  =115            ;PLAYER'S TOP SPEED\r
138 \r
139 \r
140 ;**********************************************************\r
141 ;***                                                    ***\r
142 ;***                                                    ***\r
143 ;***                    FORMULAS                        ***\r
144 ;***     VEL=VEL +GTBL(GEAR.GAS.VEL) - DTBL(.GEAR)      ***\r
145 ;***                 VELK=(VEL)(KP)                     ***\r
146 ;***                 STC=(STEER)(VEL)                   ***\r
147 ;***                 PXO=PXO-(PYA)(VELK)+STC            ***\r
148 ;***                 PXE=PXE+(PYA)(VELK)+STC            ***\r
149 ;***                 PYA=PY-PYMIN-2.                    ***\r
150 ;***                 PY=PY+(PYA)(VEL)                   ***\r
151 ;***                                                    ***\r
152 ;**********************************************************\r
153 \f       .SBTTL MESSAGES\r
154 ORG     =.\r
155 \r
156 \r
157 MESS0:  .BYTE 101\r
158         .ASCIZ /YOUR@SCORE/\r
159         .BYTE 123\r
160         .ASCIZ /TOP@SPEED/\r
161         .BYTE 0\r
162 MESS1:  .BYTE 1\r
163         .ASCIZ /HIGH@SCORE/\r
164         .BYTE 23\r
165         .ASCIZ /TOP@SPEED/\r
166         .BYTE 0\r
167 MT:     .BYTE 70\r
168         .ASCIZ /TIME/\r
169         .BYTE 0\r
170 ATARI:  .BYTE 70\r
171         .BYTE 200,100,300,301,224,101,122,211,0,0\r
172 ROMM:   .BYTE 141\r
173         .ASCIZ /ROM@/\r
174         .BYTE 0\r
175 OFFRD:  .BYTE 112\r
176         .ASCIZ  /OFF@THE@ROAD/\r
177         .BYTE 145\r
178         .ASCIZ  /WAIT@FOR@THE@TOW@TRUCK/\r
179         .BYTE 0\r
180 \r
181 OPT:    .BYTE 101\r
182         .ASCIZ /OPTIONS=@/\r
183         .BYTE 0\r
184 \f       .SBTTL TEST PROGRAM\r
185 TEST:   LDX I,0                 ;TEST ALL FUNCTIONS OF GAME\r
186         LDY I,0                 ;FIRST TEST PAGE ZERO\r
187 ZLP:    STY ZX,0                ;WRITE PG ZERO ADDRESS INTO CELL\r
188         INX\r
189         INY                     ;FILL ALL OF PAGE ZERO\r
190         BNE ZLP\r
191 ZTST:   TXA                     ;NOW GO CHECK TO SEE IF PAGE ZERO WORKED\r
192         CMP ZX,0                ;PG ZERO CELL = PG ZERO ADDRESS\r
193         BEQ ZPOK                ;YES\r
194         EOR ZX,0                ;SET FAILIING BIT(S)\r
195         TAY                     ;SAVE IT (THEM)\r
196 ZPERR:  LDA I,40                ;NO. SIGNAL BAD PAGE ZERO\r
197         STA Z,SYNC\r
198         CLI                     ;ALLOW FOR INTERRUPT\r
199         JMP ZPERR               ;WAIT FOR INTERRUPT\r
200 ZPOK:   INX\r
201         BNE ZTST\r
202         LDX I,ZVHI-ZLOW+1\r
203         JSR CLRZVH              ;CLEAR PAGE ZERO\r
204 TESTS:  STA Z,COINC\r
205         STA Z,COINT\r
206         LDA I,17\r
207         STA A,OUT1              ;TURN OFF SOUNDS, MOTOR = LOW RPM\r
208         LDA I,3\r
209         STA A,OUT2\r
210         JSR BLKSC               ;BLANK SCREEN\r
211 TST0:   LDY I,0\r
212         STY Z,R7                ;PREPARE TO DO CHECKSUM\r
213         LDA I,RESET&377\r
214         STA Z,R2\r
215         LDA I,RESET&-400/400\r
216         STA Z,R3                ;STORE STARTING ADDRESS\r
217         LDA I,4\r
218         STA Z,R6\r
219         LDA I,5\r
220         STA Z,R4                ;COUNT OF 1K CHUNKS *2-1\r
221 CKSLP0: LDA I,0\r
222         STA Z,R5\r
223         LDX I,3\r
224 CKSLP1: LDA NY,R2               ;READ DATA FROM ROM\r
225         CLC\r
226         ADC Z,R5                ;ACCUMULATE CHECKSUM\r
227         STA Z,R5\r
228         INY                     ;CONTINUE FOR 256 BYTES\r
229         BNE CKSLP1\r
230         INC Z,R3\r
231         DEX                     ;CONTINUE FOR 4 BLOCKS OF 256 BYTES (1024 BYTES)\r
232         BPL CKSLP1\r
233         LDX Z,R4\r
234         LDA AX,CHKADR           ;GET HIGH ADDRESS BYTE OF ROM CHECKSUM\r
235         STA Z,R1\r
236         DEX\r
237         LDA AX,CHKADR           ;GET LOW ADDRESS\r
238         STA Z,R0\r
239         LDA Z,R5\r
240         CMP NY,R0               ;COMPARE ROM CHECKSUM WITH COMPUTED CHECKSUM\r
241         BEQ CKSLP2              ;GOOD\r
242         LDA Z,R6                ;NO GOOD\r
243         ORA Z,R7                ;FLAG ROM PAIR BAD\r
244         STA Z,R7                ;CONTINUE\r
245 CKSLP2: LSR Z,R6\r
246         STA A,WTCHDG\r
247         DEC Z,R4                ;CONTINUE FOR 3 GROUPS OF 1024 BYTES\r
248         DEC Z,R4\r
249         BPL CKSLP0\r
250         LDA I,20                ;CONFUSE VSYNC PROCESSOR TO NOT UNPACK SCORES\r
251         STA Z,FRMCL             ;AND TO BLANK GAME OVER/BONUS TIME.\r
252         BIT A,TESTSW            ;TEST MODE?\r
253         BMI SKPOBJ              ;NO\r
254         JSR STST2               ;YES, INTITALIZE ALL 16 MOVING OBJECTS TO TEST PATTERN.\r
255 SKPOBJ: LDA I,300\r
256         STA Z,SYNC              ;ENABLE VSYNC PROCESSING\r
257         JSR SYNWT               ;WAIT FOR SYNC\r
258         STA A,WTCHDG\r
259         LDX I,ROMM-MESS0-1      ;WRITE ROM\r
260         JSR MESLP\r
261 CKSLP4: LDA Z,R7                ;ANY CHECKSUM ERRORS?\r
262         BEQ CKSLP5              ;NO\r
263         ORA I,60                ;YES\r
264         STA A,PLYFLD+144        ;WRITE THE ROM ERROR CODE ON SCREEN.\r
265         BIT A,TESTSW            ;TEST MODE?\r
266         BPL CKSLP8              ;YES. CONTINUE TEST\r
267         JMP TST0                ;ELSE REPEAT CHECKSUM TEST.\r
268 CKSLP5: BIT A,TESTSW            ;TEST MODE?\r
269         BPL CKSLP7              ;YES.\r
270         JSR CLRZRO              ;NO. CLEAR PAGE ZERO\r
271         JMP BEGIN               ;BEGIN ATTRACT MODE\r
272 CKSLP7: LDA I,117\r
273         STA A,PLYFLD+144        ;WRITE 'O'\r
274         LDA I,113\r
275         STA A,PLYFLD+145        ;WRITE 'K'\r
276 CKSLP8: LDX I,OPT-MESS0-1\r
277         JSR MESLP               ;WRITE OPTIONS=ON THIRD LINE\r
278         LDX I,1\r
279         LDY I,0\r
280         JSR SYNWT\r
281         STA A,WTCHDG\r
282 ABC:    TXA\r
283         STA AY,PLYFLD           ;WRITE ABCD...Z ON TOP LINE\r
284         INY\r
285         INX\r
286         CPX I,27.\r
287         BMI ABC\r
288         LDX I,60\r
289         LDY I,40\r
290         JSR SYNWT\r
291         STA A,WTCHDG\r
292 N09:    TXA\r
293         STA AY,PLYFLD           ;WRITE 0-9 ON SECOND LINE\r
294         INY\r
295         INX\r
296         CPX I,72\r
297         BMI N09\r
298 PFTST:  JSR SYNWT\r
299         STA A,WTCHDG\r
300         LDA A,TIME\r
301         LSR\r
302         LSR\r
303         LSR\r
304         LSR\r
305         TAX\r
306         LDA AX,HEX\r
307         STA A,PLYFLD+110        ;WRITE TIME SWITCH ON THIRD LINE\r
308         LDA A,TESTSW            ;CONVERT DIP SWITCH READINGS TO BINARY\r
309         LSR\r
310         LSR\r
311         AND I,14\r
312         STA Z,R0\r
313         LDA A,EASY\r
314         AND I,60\r
315         ORA Z,R0\r
316         LSR\r
317         LSR\r
318         TAX\r
319         LDA AX,EPDCOD           ;CONVERT ORDER TO CONFORM TO SWITCH\r
320         STA Z,R0\r
321         LDX I,0\r
322 EPLP:   LSR Z,R0                ;PUT BIT INTO CARRY\r
323         LDA I,30                ;SET 1/2 OF ASCII FOR '0'\r
324         ROL                     ;DOUBLE IT AND SHIFT CARRY INTO LSB\r
325         STA AX,PLYFLD+113       ;WRITE SEQUENCE OF 4 BINARY DIGITS 0000-1111\r
326         INX\r
327         CPX I,4\r
328         BMI EPLP\r
329 CKSLP6: LDX I,5                 ;PREPARE FOR SOUND TEST\r
330         LDA I,23\r
331         STA A,OUT2              ;TURN ON LAMP\r
332         LDA I,200\r
333 SNDLP0: AND AX,COINAS\r
334         DEX\r
335         BPL SNDLP0\r
336         AND I,200               ;ANY SWITCHES CLOSED?\r
337         BMI SNDLP1              ;NO\r
338         LDA I,37                ;YES. TURN ON SCREECH\r
339         BNE SNDLP2\r
340 SNDLP1: LDA I,17                ;NO. TURN OFF SCREECH\r
341 SNDLP2: STA Z,R0\r
342         LDA A,GEARS\r
343         AND I,160\r
344         EOR I,160               ;ANY GEARS DOWN?\r
345         BEQ SNDLP3              ;NO\r
346         LDA I,20\r
347 SNDLP3: ORA Z,R0                ;TURN ON/OFF SCREECH SOUND\r
348         STA A,OUT1\r
349         LDA I,1\r
350         BIT A,STRNG             ;ANY STEERING\r
351         BPL STLPT0              ;NO\r
352         BVC STLPT1              ;RIGHT?\r
353         LDA I,377               ;LEFT\r
354 STLPT1: STA Z,R4\r
355         STA A,STRST             ;RESET STEERING BIT\r
356         LDA Z,ZXAX+37           ;INITIALIZE REGS. FOR OBJECT MOVE\r
357         CLC\r
358         ADC Z,R4\r
359         STA Z,R0\r
360         LDA Z,ZXAX+35\r
361         CLC\r
362         ADC Z,R4\r
363         STA Z,R1\r
364         JSR STST1               ;GO MOVE ALL OBJECTS RIGHT/LEFT\r
365 STLPT0: BIT A,TESTSW            ;STILL IN TEST MODE?\r
366         BMI JR                  ;NO\r
367         JMP PFTST               ;YES, REPEAT TEST\r
368 JR:     JMP RESET\r
369 \r
370 \r
371 STST2:  LDA I,60\r
372         STA Z,R1                ;X1 POSITION\r
373         LDA I,220\r
374         STA Z,R0                ;X2 POSITION\r
375 STST1:  LDA I,16.\r
376         STA Z,R4\r
377 STST3:  LDA I,60\r
378         STA Z,R3                ;Y POSITION\r
379         LDA I,240.              ;PICTURE DATA\r
380         STA Z,R2\r
381         LDX I,37                ;Z DATA INDEX\r
382 STST0:  LDA Z,R2\r
383         STA ZX,ZCNTRL           ;STORE PICTURE\r
384         LDA Z,R3\r
385         EOR I,377               ;FLIP Y POSITION\r
386         STA ZX,ZYAX             ;STORE Y POSITION\r
387         LDA Z,R0\r
388         STA ZX,ZXAX             ;STORE X POSITION\r
389         DEX\r
390         DEX\r
391         LDA Z,R2\r
392         CLC\r
393         ADC I,241.              ;UPDATE PICTURE\r
394         STA Z,R2\r
395         STA ZX,ZCNTRL           ;NEXT PICTURE\r
396         LDA Z,R1\r
397         STA ZX,ZXAX             ;NEXT X\r
398         LDA Z,R3\r
399         EOR I,377               ;FLIP Y POSITION\r
400         STA ZX,ZYAX             ;NEXT Y\r
401         LDA Z,R2\r
402         CLC\r
403         ADC I,241.              ;UPDATE PICTURE\r
404         STA Z,R2\r
405         LDA Z,R3\r
406         CLC\r
407         ADC I,16.\r
408         STA Z,R3                ;UPDATE Y\r
409         LDA Z,R0\r
410         CLC\r
411         ADC Z,R4\r
412         STA Z,R0                ;UPDATE X1\r
413         LDA Z,R1\r
414         CLC\r
415         ADC Z,R4\r
416         STA Z,R1                ;UPDATE X2\r
417         DEX\r
418         DEX\r
419         BPL STST0\r
420         RTS\r
421 \r
422 \r
423 HEX:    .ASCII /0123456789ABCDEF/                       ;CONVERSION FOR OPTION SWITCH\r
424 EPDCOD: .BYTE 0,2,1,3,4,6,5,7,8.,10.,9.,11.,12.,14.,13.,15.     ;CONVERSION FOR DIP SWITCH\r
425         .EVEN\r
426 TKADT:  .WORD EPTRK,PROTRK,NOTRK\r
427 TKMXT:  .BYTE EE-EB,ATRK-PROTRK,NE-NB\r
428 NB:\r
429 NOTRK:  .BYTE 0,127.,0,127.,40,177,0,127.,240,177\r
430 NE:\r
431 EB:\r
432 EPTRK:  .BYTE 0,127.,0,127.,30,127.,35,54.,230,72.\r
433         .BYTE 0,36.,240,72.,0,127,40,91.,0,108.\r
434         .BYTE 40,91.,0,63.,220,63.,0,36.,35,127\r
435         .BYTE 0,108.,245,127.,220,91.,40,127,30,127\r
436         .BYTE 32,82.,234,127.,220,91.,44,127,30,54.\r
437 EE:\r
438 PROTRK: .BYTE 0,127.,0,127.,40,100,0,70,240,60,0,30,44,50\r
439         .BYTE 14,40,50,30,245,50,0,70,45,20,210,40\r
440         .BYTE 245,100.,45,64.,0,32,245,100.\r
441 \r
442 ATRK:   .BYTE 0,127.,17,100,217,177,17,100\r
443 ATRKMX  =.-ATRK\r
444 DTBL:   .BYTE 6,5,4,3\r
445 GTBL:   .BYTE 161,21,161,21,141,21,142,21,123,21,64,21,45,41,5,41\r
446         .BYTE 5,41,364,41,363,61,362,61,341,61,340,101,340,101,320,101\r
447         .BYTE 337,62,337,62,317,42,317,22,317,2,276,3,276,3,276,363\r
448         .BYTE 256,363,256,363,255,363,235,363,235,343,235,343,234,343,234,342\r
449 \r
450 MOTOR:  .BYTE 377,377,317,377,237,377,155,377,074,377,032,377,010,357,007,337\r
451         .BYTE 006,317,005,277,004,256,003,235,002,215,002,174,002,153,002,132\r
452         .BYTE 002,131,002,110,002,067,002,067,002,046,002,045,002,044,002,044\r
453         .BYTE 002,043,002,042,002,042,002,042,002,042,002,042,002,042,002,042\r
454 GO:     .ASCIZ /GAME@OVER@/\r
455 EPMSG:  .ASCIZ /BONUS@TIME/\r
456 PZRERR: .ASCII /ERR@Z@/\r
457 PZE:    .ASCIZ /@@@@/\r
458 \r
459 IPIX:   .BYTE 53,52,70,125,34,34,34\r
460 IXD:    .BYTE 154,207,141,222,114,246\r
461         .BYTE 46,314,165,176,163,177,161,201\r
462 IYD:    .BYTE 115,134,167,252,100,102,105\r
463 \r
464 MPHL:   .BYTE 60,61,63,64,65,66,70,71\r
465         .REPT 112000-.\r
466         .BYTE 377\r
467         .ENDR\r
468 \fOIN:.SBTTL GAME\r
469 ;****************************************************\r
470 ;***                                              ***\r
471 ;***                    MAIN GAME                 ***\r
472 ;***                                              ***\r
473 ;****************************************************\r
474 ;\r
475 ; SYNC  0 = SYNC PROCESSED\r
476 ;       1 =\r
477 ;       2 =\r
478 ;       3 = BONUS SCORE REACHED\r
479 ;       4 = BONUS TIME\r
480 ;       5 = ERR 1\r
481 ;       6 = PROCESS SYNC\r
482 ;       7 = ATTRACT MODE\r
483 ;\r
484 \r
485 \r
486         .=112000                ;9400\r
487 \r
488 RESET:  SEI\r
489         LDX I,377\r
490         TXS\r
491         CLD\r
492         LDA I,VSYNC&377\r
493         STA A,177776            ;INTERRUPT VECTOR LOW=FFFE\r
494         LDA I,VSYNC&-400/400    \r
495         STA A,177777            ;INTERRUPT VECTOR HIGH=FFFF\r
496         JMP TEST\r
497 BEGIN:  JSR BLKSC\r
498         JSR PUTMSG\r
499         JSR MESLP\r
500         JMP ATTRCT\r
501 \r
502 CHK1K:  .BYTE 322,56            ;ROM CHECKSUM FOR 9400-97FF\r
503 \r
504 BLKSC:  LDX I,7                 ;BLANK SCREEN ROUTINE\r
505         LDY I,PLYFLD&377\r
506         STY Z,PRODL\r
507         LDA I,PLYFLD&-400/400\r
508         STA Z,PRODH\r
509 BLANK:  JSR SYNWT               ;PAUSE BETWEEN BLOCKS\r
510         STA A,WTCHDG            ;WATCH DOG\r
511         LDY I,15.               ;DO 16 BYTES AT A TIME\r
512 BLANK0: LDA I,0                 ;CLEAR PLAYFIELD RAM\r
513         STA NY,PRODL\r
514         DEY\r
515         BPL BLANK0\r
516         LDA I,16.\r
517         CLC\r
518         ADC Z,PRODL             ;UPDATE INDIRECT ADDRESS\r
519         STA Z,PRODL\r
520         DEX                     ;CONTINUE ACROSS 8 BLOCKS OF 16 BYTES\r
521         BPL BLANK\r
522         RTS                     ;EXIT\r
523 \r
524 PUTMSG: LDX I,377\r
525 MESLP:  INX\r
526         LDY AX,MESS0            ;GET SCREEN DESTINATION ADDRESS\r
527         BNE CONTM\r
528         RTS\r
529 CONTM:  JSR SYNWT\r
530         STA A,WTCHDG            ;WATCH DOG\r
531 MESLP1: INX\r
532         LDA AX,MESS0\r
533         BEQ MESLP\r
534         STA AY,PLYFLD-1\r
535         INY\r
536         BNE MESLP1\r
537 \r
538 ATTRCT: JSR CLRZRO\r
539         JSR SYNWT\r
540         STA A,WTCHDG\r
541         LDX I,MESS1-MESS0-1\r
542         JSR MESLP               ;WRITE TOP LINE\r
543         LDX I,ATARI-MESS0-1\r
544         JSR MESLP               ;WRITE ATARI\r
545         LDA I,300               ;SET ATTRACT MODE, PROCESS VSYNC\r
546         STA Z,SYNC\r
547         JSR INTZRO              ;SET OBJECT TABLES\r
548         LDA I,ATRK&-400/400             ;SET ATTRACT MODE TRACK.\r
549         STA Z,TRKADH\r
550         LDA I,ATRK&377\r
551         STA Z,TRKADL\r
552         LDA I,ATRKMX\r
553         STA Z,TRMAX\r
554         JMP MAIN                ;RUN GAME DURING ATTRACT MODE\r
555 \r
556 GMTIMD: .BYTE 30.,45.,60.,75.           ;FRAMES PER CLOCK TICK\r
557 CNINC:  .BYTE 4,2,2,1                   ;(CREDITS/COIN)*2\r
558 \r
559                                         ;EASY\r
560 SCRTBL: .BYTE 264,163,131,107           ;PRO (2.8,1.8,1.4,1.12)\r
561         .BYTE 264,163,131,107           ;EXPERT (2.8,1.8,1.4,1.12)\r
562         .BYTE 264,163,131,107           ;NOVICE (2.8,1.8,1.4,1.12)\r
563 \r
564 \r
565                                         ;HARD\r
566         .BYTE 237,150,112,100           ;PRO (2.45,1.63,1.22,1.00)\r
567         .BYTE 237,150,112,100           ;EXPERT (2.45,1.63,1.22,1.00)\r
568         .BYTE 237,150,112,100           ;NOVICE (2.45,1.63,1.22,1.00)\r
569 \fCOIN:  LDA A,TIME              ;FIND OUT HOW MANY CREDITS PER COIN\r
570         LSR\r
571         LSR\r
572         LSR\r
573         LSR\r
574         AND I,3\r
575         TAX\r
576         LDA AX,CNINC            ;GET CREDITS PER COIN\r
577         STA Z,R0                ;SAVE IT\r
578         LDA I,0                 ;CLEAR COIN TIMER\r
579         STA Z,R2\r
580         STA Z,R3\r
581 COINA0: LDA Z,COINT             ;TIMING COIN HIGH OR LOW\r
582         AND I,200               ;MSB SETS IF COIN HAS BEEN TIMED HIGH\r
583         STA Z,R1\r
584 COINA1: LDA A,COINAS\r
585         STA A,WTCHDG\r
586         EOR Z,R1                ;COIN SWITCH TIME OK?\r
587         BMI COINA3              ;NO\r
588         BIT Z,R1                ;PAST UP TIME?\r
589         BMI COINA2              ;YES. COUNT COIN\r
590         DEC Z,R2                ;DEBOUNCE TIME OUT?\r
591         BEQ COINA4              ;YES\r
592         JSR COINB               ;NO. DO COIN B\r
593         JMP COINA1\r
594 COINA4: LDA Z,COINT\r
595         EOR I,200               ;SET COIN TIMED OUT\r
596         STA Z,COINT\r
597 COINA3: LDA I,0                 ;CLEAR COIN TIMER\r
598         STA Z,R2\r
599         JSR COINB               ;ANY B COIN?\r
600         BCS COINA0              ;YES. CONTINUE TIMING\r
601         BCC CEND                ;NO. END\r
602 \r
603 COINA2: NOP                     ;COUNT COIN\r
604         LDA Z,COINT\r
605         AND I,177               ;DROP COIN DETECTED BIT\r
606         CLC\r
607         ADC Z,R0                ;GET CREDIT COUNT\r
608         STA Z,COINT\r
609         BPL COINA3\r
610 \r
611 COINB:  LDA Z,COINT\r
612         ASL\r
613         AND I,200               ;MSB SETS IF COIN HAS BEEN TIMED HIGH\r
614         STA Z,R4\r
615 COINB1: LDA A,COINBS            ;COIN SWITCH\r
616         EOR Z,R4                ;COIN SWITCH TIME OK\r
617         BMI COINB3              ;NO\r
618         BIT Z,R4                ;PASSED UP TIME?\r
619         BMI COINB2              ;YES COUNT COIN\r
620         DEC Z,R3                ;NO. DEBOUNCE TIME OUT?\r
621         BEQ COINB4              ;YES\r
622         SEC                     ;SIGNAL TIMING B COIN\r
623         RTS                     ;EXIT\r
624 COINB4: LDA Z,COINT             ;INDICATE DEBOUNCE OK\r
625         EOR I,100\r
626         STA Z,COINT\r
627 COINB3: LDA I,0                 ;CLEAR DEBOUNCE TIMER\r
628         STA Z,R3\r
629         CLC                     ;SIGNAL NO LONGER TIMING\r
630         RTS                     ;EXIT\r
631 COINB2: LDA Z,COINT\r
632         AND I,277               ;DROP COIN DETECTED BIT\r
633         CLC\r
634         ADC Z,R0                ;ACCUMULATE CREDIT\r
635         STA Z,COINT\r
636         BPL COINB3              ;EXIT\r
637 \r
638 \r
639 CEND:   LDA Z,COINT\r
640         AND I,77                ;ANY COINS COUNTED?\r
641         BEQ COINS               ;NOPE\r
642         BIT A,CYC56             ;YES. 50/60 CYCLE?\r
643         BPL CE1                 ;50 CYCLES\r
644 CE2:    BIT A,POWER             ;DOWN STROKE?\r
645         BPL CE2                 ;YES. WAIT FOR UP STROKE\r
646         STA A,WTCHDG\r
647         JSR LFC\r
648         BCC CE3\r
649         JMP COIN                ;YES\r
650 CE3:    BIT A,POWER             ;UP STROKE?\r
651         BMI CE3                 ;YES. WAIT FOR DOWN STROKE\r
652         STA A,WTCHDG\r
653 CE5:    LDX I,191.\r
654 CE4:    BIT A,POWER             ;OK?\r
655         BMI CE1                 ;60 CYCLES\r
656         JSR LFC                 ;SEE IF ANY MORE COINS ARE PRESENT\r
657         BCC CE6                 ;NO\r
658         JMP COIN                ;YES. PROCESS NEW COIN\r
659 CE6:    DEX\r
660         BNE CE4\r
661         STX Z,COINC             ;ZERO. COIN CREDIT\r
662         STX Z,COINT             ;POWER IS 50 CYCLES BUT OPTION IS 60 CYCLES\r
663 CE1:    LDA Z,COINT\r
664         AND I,77\r
665         CLC\r
666         ADC Z,COINC             ;ACCUMULATE CREDITS\r
667         STA Z,COINC\r
668         LDA Z,COINT             ;CLEAR COIN CREDITS\r
669         AND I,300\r
670         STA Z,COINT\r
671 COINS:  CLC\r
672         BIT Z,SYNC              ;ATTRACT MODE?\r
673         BMI COINS0              ;YES\r
674         RTS                     ;NO. EXIT\r
675 COINS0: LDA I,17\r
676         STA A,OUT1              ;LOW RPM, SCREECH\r
677         LDA I,376\r
678         BIT Z,COINC             ;ANY COINS\r
679         BNE COINS1              ;YES\r
680         LDA I,3                 ;NO\r
681         STA A,OUT2              ;TURN OFF START LAMP, CRASH\r
682         RTS\r
683 COINS1: LDA I,23                ;TURN ON SG LAMP\r
684         STA A,OUT2\r
685         BIT A,STRTSW            ;START BUTTON PUSHED?\r
686         BMI COINS2              ;NO\r
687         DEC Z,COINC             ;YES. SUBTRACT COIN CREDIT\r
688         DEC Z,COINC\r
689         LDX I,377               ;RESET STACK\r
690         TXS\r
691         JMP GAME                ;START GAME\r
692 COINS2: RTS\r
693 \r
694 LFC:    LDA A,COINBS            ;LOOK FOR COIN ROUTINE\r
695         LSR\r
696         CLC\r
697         ORA A,COINAS\r
698         AND I,300               ;GET BOTH COIN MECH STATUS\r
699         EOR I,300\r
700         STA Z,R0\r
701         LDA Z,COINT             ;DO THEY MATCH WHAT'S EXPECTED (COINT)?\r
702         AND I,300\r
703         EOR Z,R0\r
704         BEQ LFC0                ;YES\r
705         SEC                     ;NO. SIGNAL A CHANGE OF COIN MECH STATUS\r
706 LFC0:   RTS                     ;EXIT\r
707 \r
708 GTM:    LDA A,TIME              ;GET TIME OPTION\r
709         ROL\r
710         ROL\r
711         ROL                     ;PUT 2 MSB'S INTO 2 LSB'S\r
712         AND I,3                 ;MASK\r
713         TAX\r
714         ORA Z,OLDTK             ;ADD THE TRACK NUMBER\r
715         TAY\r
716         LDA I,40\r
717         BIT A,EASY              ;EASY SCORING SELECTED?\r
718         BNE EBT                 ;YES\r
719         TYA\r
720         CLC                     ;NO. BUMP TO DIFFICULT SCORE TABLE\r
721         ADC I,12.\r
722         TAY\r
723 EBT:    LDA AY,SCRTBL           ;GET SCORE WEIGHT\r
724         STA Z,EPSCR             ;STORE IT FOR THE DISPLAY ROUTINE\r
725         LDA AX,GMTIMD           ;GET FRAMES PER CLOCK TICK\r
726         STA Z,FRMTME\r
727         LDA I,00                ;INITIALIZE CLOCK TO 100 (BCD)\r
728         STA Z,GTML              ;LOW TIMER\r
729         LDA I,20\r
730         STA Z,GTMH              ;HIGH\r
731         RTS                     ;EXIT\r
732 \r
733 GAME:   LDA I,0\r
734         STA Z,SYNC\r
735         LDA I,1\r
736         STA A,OUT2              ;TURN OFF START LAMP, CRASH, ATTRACT MODE\r
737         JSR BLKSC               ;CLEAR PLAYFIELD\r
738         JSR PUTMSG              ;WRITE SCORE LABELS\r
739         LDX I,MT-MESS0-1\r
740         JSR MESLP               ;WRITE TIME\r
741         JSR CLRZRO              ;CLEAR PAGE ZERO\r
742         JSR INTZRO              ;SET OBJECT TABLES\r
743         LDA I,100\r
744         STA Z,SYNC              ;SIGNAL GAME TIME, PROCESS SYNC\r
745         JSR GETTRK              ;GET TRACK\r
746         JSR HISCR               ;DO HIGH SCORE SAVES\r
747         JSR GTM                 ;GET GAME TIME\r
748 MAIN:   JSR SYNWT\r
749         BIT A,TESTSW            ;TEST MODE?\r
750         BMI GM0\r
751         JMP TEST\r
752 GM0:    LDX I,0\r
753         LDA I,20\r
754         BIT Z,SYNC              ;ATTRACT MODE?\r
755         BPL LFG                 ;NO\r
756         LDA I,6                 ;YES, FORCE VEL=6\r
757         STA Z,VELH\r
758         STX Z,VELL\r
759         STX Z,STEER             ;FORCE STEER=0\r
760         JMP DNEVEL\r
761 LFG:    BIT A,GEARS             ;GEAR SWITCH CLOSED?\r
762         BEQ FG                  ;YES\r
763         INX                     ;NO\r
764         ASL                     ;ALL SWITCHES TESTED?\r
765         BPL LFG                 ;NO\r
766 FG:     STX Z,R3                ;SAVE GEAR NUMBER\r
767         LDA AX,DTBL             ;NOPE. GET DECELERATION CONSTANT\r
768         LDX I,VELL\r
769         LDY I,PRODL\r
770         JSR MULT                ;COMPUTE FRACTION OF VELOCITY\r
771         LDA Z,PRODH             ;GREATER THAN 1?\r
772         BEQ ACLOK               ;NO\r
773         LDA I,0                 ;YES\r
774         STA Z,PRODH             ;FORCE TO +0.25 ACCELERATION\r
775         LDA I,100\r
776         STA Z,PRODL\r
777 ACLOK:  LDA Z,PRODL\r
778         LSR\r
779         LSR\r
780         CMP I,20                ;ACCELERATION < 16?\r
781         BMI SNDOK               ;YES\r
782         LDA I,17                ;NO. FORCE TEMPORARILY TO 15.\r
783 SNDOK:  EOR I,17                ;INVERT\r
784         STA Z,R5                ;TEMPORARY MOTOR SOUND REGISTER\r
785         LSR Z,PRODL             ;HALVE THE ACCELERATION\r
786         JSR NEG                 ;NEGATE ACCELERATION\r
787         BIT A,ACCEL             ;ACCELERATOR PRESSED?\r
788         BPL SMACL               ;YEP\r
789         LDA Z,R5                ;NO. USE COMPUTED DECELERATION\r
790         STA A,OUT1              ;SET MOTOR SOUNDS\r
791         LDA I,0                 ;CLEAR SCRATCH SOUND TIMER\r
792         STA Z,SMOKE\r
793         JMP DOBRK               ;BRAKING EFFECT\r
794 SMACL:  LDA I,0\r
795         STA Z,PRODH\r
796         LDA Z,VELL              ;USE VELOCITY AS INDEX\r
797         ASL\r
798         LDA Z,VELH\r
799         ROL\r
800         CMP I,40                ;VELOCITY < 32\r
801         BMI VELOK               ;YES\r
802         LDA I,37                ;NO. FORCE IT TEMPORARILY TO 31\r
803 VELOK:  ASL\r
804         LSR Z,R3                ;ADJUST GEAR NUMBER\r
805         PHP                     ;SAVE THE CARRY\r
806         ORA Z,R3                ;ADD GEAR NUMBER\r
807         TAX\r
808         LDA AX,MOTOR            ;GET MOTOR SOUND. IF 2ND OR 4TH -\r
809         BCS MTL                 ;USE LOW HALF\r
810         LSR\r
811         LSR                     ;ELSE USE HIGH HALF (1ST OR 3RD)\r
812         LSR\r
813         LSR\r
814 MTL:    AND I,17\r
815         STA Z,R5\r
816         STA A,OUT1              ;TURN ON MOTOR\r
817         PLP                     ;GET THE CARRY\r
818         LDA AX,GTBL             ;GET ACCELERATION VALUE.  IF 2ND OR 4TH -\r
819         BCS VLO                 ;USE LOW SIDE\r
820         LSR\r
821         LSR                     ;ELSE USE HI SIDE (1ST OR 3RD)\r
822         LSR\r
823         LSR\r
824 VLO:    AND I,17                ;MASK IT\r
825         STA Z,R3                ;SAVE IT\r
826         AND I,10                ;+ OR -?\r
827         BEQ VPN                 ;+ LEAVE AS IS\r
828         LDA I,377\r
829         STA Z,PRODH             ;ELSE EXTEND SIGN AND\r
830         LDA I,0                 ;DOWN SHIFT\r
831         STA Z,R5\r
832         STA A,OUT1              ;FORCE MAXIMUM REV'S\r
833         LDA I,360\r
834 VPN:    ORA Z,R3\r
835         ASL                     ;DOUBLE ACCELERATION\r
836         STA Z,PRODL\r
837 DOBRK:  NOP\r
838         NOP\r
839         NOP\r
840 INCVEL: LDA Z,PRODL             ;ACCELERATION?\r
841         BEQ ZRACL               ;ZERO\r
842         BMI NACL                ;NEGATIVE\r
843         CMP I,8.                ;ACCEL > 8.?\r
844         BEQ NACL                ;NO\r
845         BCC NACL                ;NO\r
846         LDA Z,R5                ;MOTOR REG\r
847         ORA I,60                ;SET LOUD SCREECH\r
848         STA Z,R5\r
849         STA A,OUT1              ;LIGHT 'EM UP (SMOKE 'EM)\r
850         LDA I,20.               ;SMOKE 'EM TIMER\r
851         STA Z,SMOKE\r
852         BNE NACL\r
853 ZRACL:  LDA I,377               ;ACCEL=0.\r
854         BIT Z,VELH              ;VELOCITY > 1?\r
855         BNE NACL                ;YES\r
856         STA Z,PRODH             ;NO. FORCE ACCEL TO -1\r
857         STA Z,PRODL\r
858 NACL:   LDA Z,SMOKE             ;TIMER RUN OUT?\r
859         BEQ NACL1               ;YEP\r
860         DEC Z,SMOKE             ;NO. DECREMENT TIMER\r
861         LDA Z,R5\r
862         ORA I,40\r
863         STA A,OUT1              ;LIGHT 'EM UP\r
864 NACL1:  LDA Z,PRODL\r
865         CLC\r
866         ADC Z,VELL              ;UPDATE VELOCITY\r
867         STA Z,VELL\r
868         LDA Z,PRODH\r
869         ADC Z,VELH\r
870         STA Z,VELH\r
871         BPL DNEVEL\r
872         LDA I,0                 ;DON'T ALLOW VELOCITY TO GO NEGATIVE\r
873         STA Z,VELL\r
874         STA Z,VELH\r
875 DNEVEL: LDX I,VELL              ;SET ADDRESS OF MULTIPLICAND\r
876         LDY I,STCL              ;ADDRESS OF PRODUCT\r
877         LDA Z,STEER             ;STEERING PLUS?\r
878         BPL STRPL               ;YES\r
879         EOR I,377               ;NO\r
880         CLC                     ;NEGATE STEERING\r
881         ADC I,1\r
882         JSR MULT                ;COMPUTE 'STC' (MINUS)\r
883         JSR STCLMT              ;STC TOO BIG? ADJUST IF SO\r
884         JSR NEG                 ;NEGATE PRODUCT\r
885         JMP CMPCRV\r
886 \r
887 STCLMT: LDA I,4.\r
888         CMP Z,STCH              ;STC > 4?\r
889         BMI STCLM0              ;YES\r
890         RTS                     ;NO. RETURN\r
891 STCLM0: SEC\r
892         LDA Z,STCH\r
893         SBC I,4.                ;COMPUTE STC-4\r
894         CMP I,2                 ;DIFF > 2?\r
895         BMI STCLM1              ;NO\r
896         LDA Z,R5                ;YES. 4 WHEEL DRIFT\r
897         ORA I,60\r
898         STA Z,R5                ;SET SCREECH\r
899 STCLM1: LDA I,3\r
900         NOP\r
901         NOP\r
902         NOP\r
903         STA Z,STCH\r
904         LDA Z,R5\r
905         ORA I,20                ;2 OR 4 WHEEL DRIFT\r
906         STA A,OUT1\r
907         RTS\r
908 \r
909 STRPL:  JSR MULT\r
910         JSR STCLMT              ;STC TOO BIG? ADJUST IF SO\r
911 CMPCRV: LDY I,CRVL              ;ADDRESS OF PRODUCT\r
912         LDA Z,CS                ;GET MULTIPLIER\r
913         BPL CRSOK               ;POSITIVE RESULT\r
914         AND I,177\r
915         JSR MULT\r
916         JSR NEG                         ;NEGATIVE RESULT\r
917         JMP STRPL0\r
918 CRSOK:  JSR MULT                ;COMPUTE CRV\r
919 STRPL0: LDY I,VELKL\r
920         LDA I,140               ;SET ACC=KP (VELK)\r
921         JSR MULT                ;COMPUTE VEL*KP\r
922 \r
923 \r
924 ;BEGIN PYLON MOTION COMPUTATION\r
925 \r
926 MO:     LDX I,37                ;OBJECT INDEX\r
927 MOVOBJ: LDA ZX,ZCNTRL-1         ;GET CONTROL BYTE. OBJECT ACTIVE?\r
928         BMI OBJACT              ;YES.\r
929         JMP INAOBJ              ;NO. SKIP PROCESS OF OBJECT PAIR\r
930 OBJACT: STX Z,XSVE\r
931         LDA ZX,ZYAX             ;GET PY\r
932         SEC\r
933         SBC I,PYMIN-2.          ;NORMALIZE\r
934         STA Z,PYA\r
935         LDX I,VELKL             ;ADDRESS OF MULTIPLICAND\r
936         LDY I,PYAVKL            ;ADDRESS OF PRODUCT\r
937         JSR MULT                ;COMPUTE PYAVK\r
938         LDX I,VELL\r
939         LDY I,PYAVL\r
940         LDA Z,PYA\r
941         JSR MULT                ;COMPUTE PYAV\r
942         LDX Z,XSVE\r
943         LDA ZX,ZXAX-1           ;UPDATE X AXIS POSITION ODD SIDE\r
944         SEC\r
945         SBC Z,PYAVKL\r
946         STA ZX,ZXAX-1\r
947         LDA ZX,ZXAX\r
948         SBC Z,PYAVKH\r
949         STA ZX,ZXAX\r
950         LDA ZX,ZCNTRL-1\r
951         BIT Z,PYAVKH            ;PYAVKH + OR -?\r
952         BPL OLS1                ;PLUS\r
953         SBC I,3                 ;MINUS. SUBTRACT 3+ CARRY FROM ZCNTRL\r
954         JMP OLS3\r
955 OLS1:   SBC I,0                 ;ELSE SUBTRACT CARRY FROM XCNTRL\r
956 OLS3:   AND I,3                 ;MASK RESULT\r
957         STA Z,R2                ;SAVE IT\r
958         LDA ZX,ZCNTRL-1\r
959         AND I,374               ;MASK OLD VALUE\r
960         ORA Z,R2                ;ADD IN RESULT\r
961         STA ZX,ZCNTRL-1         ;UPDATE THE MSB'S OF X POSITION\r
962         CLC\r
963         LDA Z,STCL              ;ADD IN STEERING CONSTANTS ODD SIDE\r
964         ADC ZX,ZXAX-1\r
965         STA ZX,ZXAX-1\r
966         LDA Z,STCH\r
967         ADC ZX,ZXAX\r
968         STA ZX,ZXAX\r
969         LDA ZX,ZCNTRL-1         ;CARRY OVER 2 BITS INTO ZCNTRL-1\r
970         BIT Z,STCH\r
971         BPL OLS2\r
972         ADC I,3\r
973         JMP OLS4\r
974 OLS2:   ADC I,0\r
975 OLS4:   AND I,3\r
976         STA Z,R2\r
977         LDA ZX,ZCNTRL-1\r
978         AND I,374\r
979         ORA Z,R2\r
980         STA ZX,ZCNTRL-1\r
981         LDA ZX,ZXAX             ;CHECK LIMITS\r
982 XLOK:   CMP I,CRLFT             ;LEFT CRASH?\r
983         BCC CRLOK               ;NO\r
984         LDA I,3\r
985         AND ZX,ZCNTRL-1         ;ON SCREEN?\r
986         BNE CRLOK               ;NO\r
987         LDA I,100               ;YES. SET POSSIBLE CRASH\r
988         ORA ZX,ZCNTRL-1\r
989         STA ZX,ZCNTRL-1\r
990 CRLOK:  LDA ZX,ZXAX-3           ;GET X POSITION EVEN SIDE\r
991         CLC\r
992         ADC Z,PYAVKL            ;UPDATE X POSITION EVEN SIDE\r
993         STA ZX,ZXAX-3\r
994         LDA ZX,ZXAX-2\r
995         ADC Z,PYAVKH\r
996         STA ZX,ZXAX-2\r
997         LDA ZX,ZCNTRL-3\r
998         BIT Z,PYAVKH\r
999         BPL ORS1\r
1000         ADC I,3\r
1001         JMP ORS3\r
1002 ORS1:   ADC I,0\r
1003 ORS3:   AND I,3\r
1004         STA Z,R2\r
1005         LDA ZX,ZCNTRL-3\r
1006         AND I,374\r
1007         ORA Z,R2\r
1008         STA ZX,ZCNTRL-3\r
1009         LDA Z,STCL              ;ADD IN STEERING CONSTANTS\r
1010         ADC ZX,ZXAX-3\r
1011         STA ZX,ZXAX-3\r
1012         LDA Z,STCH\r
1013         ADC ZX,ZXAX-2\r
1014         STA ZX,ZXAX-2\r
1015         LDA ZX,ZCNTRL-3\r
1016         BIT Z,STCH\r
1017         BPL ORS2\r
1018         ADC I,3\r
1019         JMP ORS4\r
1020 ORS2:   ADC I,0\r
1021 ORS4:   AND I,3\r
1022         STA Z,R2\r
1023         LDA ZX,ZCNTRL-3\r
1024         AND I,374\r
1025         ORA Z,R2\r
1026         STA ZX,ZCNTRL-3\r
1027         LDA ZX,ZXAX-2\r
1028 XROK:   CMP I,CRRHT             ;RIGHT CRASH?\r
1029         BCS CRROK               ;NO\r
1030         LDA I,3\r
1031         AND ZX,ZCNTRL-3         ;ON SCREEN?\r
1032         BNE CRROK               ;NO\r
1033         LDA I,100\r
1034         ORA ZX,ZCNTRL-3\r
1035         STA ZX,ZCNTRL-3         ;SET POSSIBLE CRASH\r
1036 CRROK:  LDA ZX,ZYAX-1           ;UPDATE Y POSITION\r
1037         CLC\r
1038         ADC Z,PYAVL\r
1039         STA ZX,ZYAX-1\r
1040         STA ZX,ZYAX-3\r
1041         LDA ZX,ZYAX\r
1042         ADC Z,PYAVH\r
1043         BCS OCR\r
1044         STA ZX,ZYAX\r
1045         STA ZX,ZYAX-2\r
1046         CMP I,BOTTOM            ;AT BOTTOM OF SCREEN?\r
1047         BCC YPOK                ;NO\r
1048 OCR:    LDA ZX,ZCNTRL-1         ;YES. OBJECT AT CRASH LIMIT?\r
1049         ORA ZX,ZCNTRL-3\r
1050         ASL\r
1051         BPL DEACT               ;NO. DE-ACTIVATE OBJECT\r
1052         BIT Z,SYNC              ;ATTRACT MODE?\r
1053         BMI DEACT               ;YES. IGNORE CRASH\r
1054         LDA I,0                 ;CRASH INTO PYLON\r
1055         STA Z,VELL\r
1056         STA Z,VELH\r
1057         LDA I,0\r
1058         STA A,OUT2              ;TURN OFF CRASH SOUND\r
1059         LDA I,1\r
1060         STA A,OUT2              ;TURN ON CRASH SOUND\r
1061 DEACT:  LDA I,17                ;MAKE OBJECT INVISIBLE\r
1062         STA ZX,ZCNTRL\r
1063         STA ZX,ZCNTRL-2\r
1064         LDA I,0                 ;CLEAR OBJECT CONTROL\r
1065         STA ZX,ZCNTRL-1\r
1066         STA ZX,ZCNTRL-3\r
1067         JMP INAOBJ              ;CONTINUE\r
1068 YPOK:   LDA Z,PYA\r
1069         CLC\r
1070         ADC I,110\r
1071         LSR\r
1072         STA Z,PYA\r
1073         AND I,160\r
1074         STA ZX,ZCNTRL           ;BUILD OBJECT PICTURE (HORIZ SIZE)\r
1075         LDA Z,PYA\r
1076         LSR\r
1077         LSR\r
1078         LSR\r
1079         EOR I,17\r
1080         ORA ZX,ZCNTRL           ;VERTICAL SIZE\r
1081         STA ZX,ZCNTRL\r
1082         STA ZX,ZCNTRL-2         ;DO BOTH OBJECTS OF PAIR\r
1083         LDA ZX,ZCNTRL-1\r
1084         AND I,277               ;DROP CRASH BIT\r
1085         STA ZX,ZCNTRL-1\r
1086         AND I,3                 ;ON SCREEN?\r
1087         BEQ LOBOK               ;YES\r
1088         LDA I,17                ;NO\r
1089         STA ZX,ZCNTRL           ;SET OBJECT INVISIBLE\r
1090 LOBOK:  LDA ZX,ZCNTRL-3\r
1091         AND I,277               ;DROP CRASH BIT\r
1092         STA ZX,ZCNTRL-3\r
1093         AND I,3                 ;ON SCREEN?\r
1094         BEQ INAOBJ              ;YES\r
1095         LDA I,17                ;NO\r
1096         STA ZX,ZCNTRL-2         ;SET OBJECT INVISIBLE\r
1097 INAOBJ: LDA Z,STEER\r
1098         BIT Z,SYNC              ;ATTRACT MODE?\r
1099         BMI DEXOBJ              ;YES. IGNORE STEERING\r
1100         BIT A,STRNG             ;ANY CHANGE IN STEERING?\r
1101         BPL DEXOBJ              ;NO\r
1102         BVS SR                  ;TURN RIGHT\r
1103         SEC\r
1104         SBC I,3                 ;OVERFLOW?\r
1105         BVS SRST                ;YES\r
1106         BVC SST\r
1107 SR:     CLC\r
1108         ADC I,3\r
1109         BVS SRST\r
1110 SST:    STA Z,STEER\r
1111 SRST:   LDA A,STRST             ;RESET STEERING\r
1112 DEXOBJ: DEX                     ;DONE ALL 8 OBJECT PAIRS?\r
1113         DEX\r
1114         DEX\r
1115         DEX\r
1116         BMI OBJDNE              ;YES\r
1117         STA A,WTCHDG\r
1118         TXA                     ;SAVE X\r
1119         PHA\r
1120         JSR COIN                ;GAME START?\r
1121         PLA\r
1122         TAX\r
1123         JMP MOVOBJ              ;NO\r
1124 OBJDNE: CLC\r
1125         LDA Z,STCL\r
1126         ADC Z,CRVL              ;MOVE ORIGIN BY COMPUTING\r
1127         STA Z,PRODL             ;STC+CRV\r
1128         LDA Z,STCH\r
1129         ADC Z,CRVH\r
1130         STA Z,PRODH\r
1131         CLC\r
1132         LDA Z,ORL               ;ADD TO OLD ORIGIN POSITION\r
1133         ADC Z,PRODL\r
1134         STA Z,ORL\r
1135         LDA Z,ORH\r
1136         ADC Z,PRODH\r
1137         STA Z,ORH\r
1138         LDA Z,ORVH\r
1139         BIT Z,PRODH\r
1140         BPL ORVV0\r
1141         ADC I,3\r
1142         JMP ORVV1\r
1143 ORVV0:  ADC I,0\r
1144 ORVV1:  AND I,3\r
1145         STA Z,ORVH\r
1146 STPOM:  LDA Z,VELH\r
1147         LSR\r
1148         STA Z,PRODH\r
1149         LDA Z,VELL              ;DIVIDE VELOCITY BY 8\r
1150         ROR\r
1151         STA Z,PRODL\r
1152         LSR Z,PRODH\r
1153         ROR Z,PRODL\r
1154         LSR Z,PRODH\r
1155         ROR Z,PRODL\r
1156         LDA Z,PRODL\r
1157         CLC\r
1158         ADC Z,TURNL             ;ADD TO TURN TIME\r
1159         STA Z,TURNL\r
1160         LDA Z,TURNH\r
1161         ADC Z,PRODH\r
1162         STA Z,TURNH\r
1163         CMP Z,DIST              ;TURN OVER?\r
1164         BCC CNTRN               ;CONTINUE TURN\r
1165         LDA I,0\r
1166         STA Z,TURNL\r
1167         STA Z,TURNH\r
1168         LDX I,0\r
1169         LDY I,2\r
1170         LDA I,20\r
1171         BIT A,EPSW              ;WHICH TRACK?\r
1172         BNE NORMT               ;NORMAL\r
1173         LDY I,376               ;SET TO -2\r
1174         LDX Z,TRMAX\r
1175         DEX\r
1176         DEX\r
1177 NORMT:  TYA\r
1178         NOP\r
1179         NOP\r
1180         NOP\r
1181         CLC\r
1182         ADC Z,TRNDX\r
1183         CMP Z,TRMAX             ;ALL OF TRACK PROCESSED?\r
1184         BCC GTCS                ;NO\r
1185         BIT Z,SYNC              ;ATTRACT MODE\r
1186         BPL RTX                 ;NO\r
1187         LDA I,174\r
1188         STA Z,ORH               ;CENTER ROAD\r
1189 RTX:    TXA                     ;YES\r
1190         NOP\r
1191         NOP\r
1192         NOP\r
1193 GTCS:   TAY\r
1194         STA Z,TRNDX\r
1195         LDA NY,TRKADL           ;GET CS\r
1196         STA Z,CS\r
1197         INY\r
1198         LDA NY,TRKADL           ;GET DIST\r
1199         STA Z,DIST\r
1200 CNTRN:  LDA Z,PRODL             ;TRACK DISTANCE COVERED\r
1201         CLC                     ;  DETERMINES WHEN NEW OBJECT MUST\r
1202         ADC Z,OBJTML            ;  BE PLACED AT ORIGIN\r
1203         STA Z,OBJTML\r
1204         LDA Z,PRODH\r
1205         ADC Z,OBJTMH\r
1206         STA Z,OBJTMH\r
1207         CMP I,NOT               ;NEW OBJECT TIME?\r
1208         BMI FI0                 ;NO\r
1209         LDX I,37                ;YES\r
1210 IAOLP:  LDA ZX,ZCNTRL-1         ;OBJECT ACTIVE?\r
1211         BPL FIOBJ               ;NO\r
1212         DEX\r
1213         DEX\r
1214         DEX\r
1215         DEX\r
1216         BPL IAOLP\r
1217 FI0:    JMP ELTME               ;ALL OBJECTS ACTIVE\r
1218 FIOBJ:  LDA I,200               ;ACTIVATE OBJECTS\r
1219         ORA Z,ORVH\r
1220         STA ZX,ZCNTRL-1\r
1221         STA ZX,ZCNTRL-3\r
1222         LDY I,MINPIC\r
1223         AND I,3\r
1224         BEQ PICOK\r
1225         LDY I,17\r
1226 PICOK:  TYA\r
1227         STA ZX,ZCNTRL\r
1228         STA ZX,ZCNTRL-2\r
1229         LDA Z,ORH\r
1230         STA ZX,ZXAX\r
1231         CLC\r
1232         ADC I,PRSPC             ;SEPARATE ORIGIN PYLONS BY 'PRSPC'\r
1233         STA ZX,ZXAX-2\r
1234         LDA ZX,ZCNTRL-3\r
1235         ADC I,0\r
1236         AND I,3\r
1237         STA Z,R2\r
1238         LDA ZX,ZCNTRL-3\r
1239         AND I,374\r
1240         ORA Z,R2\r
1241         STA ZX,ZCNTRL-3\r
1242         LDA Z,ORL\r
1243         STA ZX,ZXAX-1\r
1244         STA ZX,ZXAX-3\r
1245         LDA I,PYMIN\r
1246         STA ZX,ZYAX-2           ;INITIALIZE YAXIS ORIGIN\r
1247         STA ZX,ZYAX\r
1248         LDA I,0\r
1249         STA ZX,ZYAX-1\r
1250         STA ZX,ZYAX-3\r
1251         STA Z,OBJTMH            ;CLEAR NEW OBJECT TIME COUNTER\r
1252         STA Z,OBJTML\r
1253         LDA I,0\r
1254         STA Z,R1\r
1255         LDX I,37\r
1256         LDA I,3\r
1257         STA Z,R0\r
1258 OFFSCN: LDA ZX,ZCNTRL-1         ;TEST. COUNT OBJECTS DISPLAYED ON SCREEN.\r
1259 \r
1260         BPL OS0                 ;INACTIVE OBJECT.\r
1261         BIT Z,R0                ;ACTIVE, ON SCREEN?\r
1262         BNE OS0                 ;NO\r
1263         INC Z,R1                ;YES, COUNT IT\r
1264 OS0:    DEX                     ;TEST ALL 16 OBJECTS.\r
1265         DEX\r
1266         BPL OFFSCN\r
1267         LDA Z,R1\r
1268         NOP\r
1269         NOP\r
1270         BNE ELTME\r
1271         JSR INTZRO\r
1272         LDA I,0\r
1273         STA Z,STEER\r
1274         STA Z,VELH\r
1275         STA Z,VELL\r
1276         STA Z,R7\r
1277         LDA I,17\r
1278         STA A,OUT1              ;DROP MOTOR TO LOW RPM\r
1279         LDA Z,SYNC\r
1280         AND I,277               ;DROP PROCESS SYNC BIT\r
1281         STA Z,SYNC\r
1282         JSR BLKSC               ;ERASE SCREEN\r
1283         LDX I,OFFRD-MESS0-1\r
1284         JSR MESLP               ;WRITE OFF ROAD MESSAGE\r
1285 DMLP0:  JSR SYNWT\r
1286         STA A,WTCHDG\r
1287         INC Z,FRMCL\r
1288         BNE DMLP1\r
1289         INC Z,FRMCH\r
1290 DMLP1:  JSR DECTME              ;KEEP GAME TIMER GOING\r
1291         INC Z,R7\r
1292         LDA Z,R7\r
1293         CMP I,180.              ;3 SECONDS PASSED?\r
1294         BCC DMLP0               ;NO\r
1295         JSR BLKSC               ;ERASE OFF ROAD MESSAGE\r
1296         JSR PUTMSG              ;RE-WRITE SCORE LABELS\r
1297         LDX I,MT-MESS0-1\r
1298         JSR MESLP               ;WRITE TIME\r
1299         LDA Z,SYNC\r
1300         ORA I,100               ;ENABLE SYNC PROCESSING\r
1301         STA Z,SYNC\r
1302 ELTME:  JSR COIN                ;GAME START?\r
1303 ELT0:   INC Z,FRMCL             ;NO\r
1304         BNE NELT\r
1305         INC Z,FRMCH\r
1306         BPL NELT\r
1307         LDA I,377\r
1308         BIT Z,COINC             ;ANY CREDIT?\r
1309         BNE NELT\r
1310         BIT Z,COINT             ;COUNTING COIN?\r
1311         BNE NELT\r
1312         SEI\r
1313         LDX I,377\r
1314         TXS\r
1315         CLD\r
1316         JSR CLRZRO              ;RESET\r
1317         JMP TESTS\r
1318 NELT:   BIT Z,SYNC              ;ATTRACT MODE?\r
1319         BPL FC                  ;NO\r
1320         JSR GETTRK\r
1321         JMP MAIN\r
1322 \r
1323 DECTME: LDA Z,FRMCL\r
1324         CMP Z,FRMTME            ;CLOCK TICK?\r
1325         BCC FE                  ;NOPE\r
1326         LDA I,0\r
1327         STA Z,FRMCL             ;YEP\r
1328         SED                     ;YES\r
1329         SEC\r
1330         LDA Z,GTML\r
1331         SBC I,20                ;DECREMENT TIME\r
1332         STA Z,GTML\r
1333         LDA Z,GTMH\r
1334         SBC I,0\r
1335         STA Z,GTMH\r
1336         CLD\r
1337         CMP I,231               ;99 BCD?\r
1338         BNE FE\r
1339         LDA I,40\r
1340         AND A,EPSW              ;EXTENDED PLAY ALLOWED?\r
1341         BNE FD                  ;NO\r
1342         LDA I,20\r
1343         BIT Z,SYNC              ;EXTENDED PLAY ALREADY?\r
1344         BNE FD                  ;YES\r
1345         LSR                     ;NO\r
1346         BIT Z,SYNC              ;EXTENDED PLAY SCORE REACHED?\r
1347         BEQ FD                  ;NO\r
1348         ASL\r
1349         ORA Z,SYNC              ;SET EXTENDED PLAY\r
1350         STA Z,SYNC\r
1351         JSR GTM                 ;RESET GAME TIMER\r
1352         LDA Z,OLDTK             ;ROLL TRACK TO NEXT MOST COMPLEX TRACK\r
1353         LSR\r
1354         LSR\r
1355         TAY\r
1356         LDA AY,ROLL\r
1357         TAY\r
1358         JSR GTCS3               ;ROLL TRACK\r
1359 FE:     RTS\r
1360 \r
1361 \r
1362 ROLL:   .BYTE 1,1,0\r
1363 FD:     LDA I,0\r
1364         STA Z,GTML              ;ZERO GAME TIMER\r
1365         STA Z,GTMH\r
1366         LDX I,377\r
1367         TXS                     ;RESTORE STACK\r
1368         JSR BLKSC               ;CLEAR SCREEN\r
1369         JSR PUTMSG              ;WRITE LABELS\r
1370         JMP ATTRCT\r
1371 \r
1372 \r
1373 FC:     JSR DECTME              ;DO GAME TIME\r
1374         LDA Z,VELL\r
1375         CLC\r
1376         ADC Z,TDISTL            ;ACCUMULATE TOTAL DISTANCE\r
1377         STA Z,TDISTL\r
1378         LDA Z,VELH\r
1379         ADC Z,TDISTM\r
1380         STA Z,TDISTM\r
1381         LDA I,0\r
1382         ADC Z,TDISTH\r
1383         STA Z,TDISTH\r
1384         LDA I,0\r
1385         ADC Z,TDSTVH\r
1386         STA Z,TDSTVH\r
1387         JSR CVDL                ;CONVERT MILEAGE TO DECIMAL\r
1388         LDA I,VELL\r
1389         LDY I,R5\r
1390         JSR CVD                 ;CONVERT VELOCITY TO DECIMAL\r
1391         LDA Z,R6\r
1392         CMP Z,TPSPDH            ;TOP SPEED REACHED?\r
1393         BMI SLOW0               ;NO\r
1394         BEQ SLOW1               ;MAYBE\r
1395         STA Z,TPSPDH            ;YES. UPDATE TOP SPEED\r
1396         LDA Z,R5\r
1397         STA Z,TPSPDL\r
1398 SLOW0:  JMP MAIN                ;CONTINUE GAME\r
1399 SLOW1:  LDA Z,R5                ;TOP SPEED REACHED?\r
1400         CMP Z,TPSPDL\r
1401         BMI SLOW0               ;NO\r
1402         STA Z,TPSPDL            ;YES. UPDATE TOP SPEED\r
1403         JMP MAIN\r
1404 \r
1405 GETTRK: LDY I,1                 ;TRACK SELECT ROUTINE\r
1406 GTCS2:  LDA AY,TRKSW            ;REACH SWITCH PORT. ON?\r
1407         BPL GTCS1               ;YES.\r
1408         DEY                     ;NO.\r
1409         BPL GTCS2               ;ALL SWITCHES TESTED?\r
1410 GTCS1:  INY                     ;ADJUST DECODED SWITCH\r
1411         TYA                     ;A NOW HAS A NUMBER 0,1, OR 2\r
1412         ASL                     ;0=PRO          ;SWITCH CENTER\r
1413         ASL                     ;1=EXPERT       ;SWITCH DOWN\r
1414         TAX                     ;2=NOVICE       ;SWITCH UP\r
1415         LDA ZX,TOPZ             ;FETCH TOP SCORES FROM TABLE\r
1416         STA Z,PRTSDL\r
1417         LDA ZX,TOPZ+1\r
1418         STA Z,PRTSDH\r
1419         LDA ZX,TOPZ+2\r
1420         STA Z,HML\r
1421         LDA ZX,TOPZ+3\r
1422         STA Z,HMH\r
1423         CPX Z,OLDTK             ;IS CURRENT TRACK SAME AS OLD TRACK?\r
1424         BEQ GTCS4               ;YES\r
1425         JSR HISCR               ;NO. WRITE TOP SCORES INTO SCORE TABLE\r
1426         TYA                     ;UPDATE OLD TRACK INDICATOR\r
1427         ASL\r
1428         ASL\r
1429         STA Z,OLDTK\r
1430 GTCS4:  BIT Z,SYNC              ;ATTRACT MODE?\r
1431         BPL GTCS3               ;NO\r
1432         RTS                     ;YES. USING ATTRACT MODE TRACK\r
1433 GTCS3:  LDA AY,TKMXT            ;GET NUMBER OF ENTRIES FOR TRACK\r
1434         STA Z,TRMAX\r
1435         STA Z,TRNDX\r
1436         TYA\r
1437         ASL\r
1438         TAY\r
1439         LDA AY,TKADT            ;GET TRACK TABLE ADDRESS\r
1440         STA Z,TRKADL\r
1441         LDA AY,TKADT+1\r
1442         STA Z,TRKADH\r
1443         RTS\r
1444 \r
1445 CVD:    PHA                     ;SAVE SOURCE ADDRESS\r
1446         TAX\r
1447         LDA ZX,0                ;GET LSB OF SOURCE\r
1448         ROL\r
1449         ROL\r
1450         ROL\r
1451         ROL\r
1452         AND I,7\r
1453         TAX\r
1454         LDA AX,MPHL             ;PSUEDO CVD. LSB=1 OF 8 0,1,3-6,8,9\r
1455         STA AY,0                ;SAVE CONVERTED LSB OF BCD ANSWER\r
1456         PLA                     ;GET ADDRESS\r
1457         TAX\r
1458         LDA ZX,1                ;GET MSB OF SOURCE\r
1459         CMP I,64.               ;TEST FOR MORE THAN 64.\r
1460         BMI MPHOK\r
1461         LDA I,63.\r
1462 MPHOK:  STA Z,R2\r
1463         LDA I,0\r
1464         STA Z,R0                ;CLEAR RESULT\r
1465         SED                     ;SET DECIMAL MODE\r
1466         LDA I,1\r
1467         STA Z,R3                ;INITIALIZE BCD CONVERTER\r
1468 BCDLP:  LSR Z,R2                ;BIT SET?\r
1469         BCC NOADD               ;NO\r
1470         LDA Z,R3                ;YES. ADD BCD CONVERTER TO RESULT\r
1471         CLC\r
1472         ADC Z,R0\r
1473         STA Z,R0\r
1474 NOADD:  LDA Z,R2                ;ANY BITS LEFT?\r
1475         BEQ BCDEND              ;NO\r
1476         LDA Z,R3                ;YES, DOUBLE BCD CONVERTER WITH DECIMAL ADD\r
1477         CLC\r
1478         ADC Z,R3\r
1479         STA Z,R3\r
1480         BNE BCDLP               ;CONTINUE\r
1481 BCDEND: CLD                     ;RESET DECIMAL MODE\r
1482         LDA Z,R0\r
1483         STA AY,1                ;STORE MSB BCD DATA\r
1484         RTS                     ;EXIT\r
1485 \r
1486 CHK2K:  .BYTE 237,141\r
1487 \r
1488 \r
1489 UNPK:   LDA ZX,0                ;GET LOW BYTE\r
1490         ORA I,60                ;FORCE DISPLAYABLE ASCII DIGIT\r
1491         STA AY,PLYFLD+2         ;WRITE IT ON THE PLAYFIELD\r
1492         LDA ZX,1                ;GET MSD\r
1493         AND I,17                ;LOW 4 BITS\r
1494         ORA I,60                ;MAKE DISPLAYABLE ASCII\r
1495         STA AY,PLYFLD+1         ;WRITE IT ON THE SCREEN\r
1496         LDA ZX,1                ;GET MSD\r
1497         LSR                     ;UPPER 4 BITS\r
1498         LSR\r
1499         LSR\r
1500         LSR\r
1501         ORA I,60                ;MAKE DISPLAYABLE\r
1502         STA AY,PLYFLD           ;WRITE ON SCREEN\r
1503         RTS                     ;EXIT\r
1504 \r
1505 UNPKL:  LDA I,1                 ;LONG UNPACK. Y=ADDRESS OF LSD TO APPEAR ON PLAYFIELD\r
1506         STA Z,R3                ;R3=NUMBER OF BYTES TO UNPACK, X=ADDRESS OF BCD\r
1507         BNE UPKL1               ;START WITH UPPER 4 BITS OF LSD\r
1508 UPKL0:  LDA ZX,0                ;GET BYTE\r
1509         AND I,17                ;LOW 4 BITS\r
1510         ORA I,60\r
1511         STA AY,PLYFLD           ;WRITE IT TO PLAYFIELD\r
1512         DEY                     ;CONTINUE NEXT PLAYFIELD ADDRESS\r
1513 UPKL1:  LDA ZX,0                ;GET BYTE\r
1514         LSR                     ;UPPER 4 BITS\r
1515         LSR\r
1516         LSR\r
1517         LSR\r
1518         ORA I,60\r
1519         STA AY,PLYFLD           ;WRITE IT TO PLAYFIELD\r
1520         INX                     ;BUMP BINARY ADDRESS\r
1521         DEY                     ;PLAYFIELD ADDRESS ADJUST\r
1522         DEC Z,R3                ;ALL BYTES UNPACKED?\r
1523         BPL UPKL0               ;NO\r
1524         RTS                     ;YES. EXIT\r
1525 \r
1526 HISCR:  LDX Z,OLDTK             ;GET OLD TRACK INDEX\r
1527         LDA Z,MILEM\r
1528         CMP ZX,TOPZ+3           ;SCORE > OLD SCORE?\r
1529         BCC NOHI                ;NO\r
1530         BEQ HIGH                ;MAYBE\r
1531         STA ZX,TOPZ+3           ;YES\r
1532         STA Z,HMH\r
1533         LDA Z,MILEL\r
1534 NOHIL:  STA ZX,TOPZ+2\r
1535         STA Z,HML\r
1536 NOHI:   LDA Z,TPSPDH            ;PREVIOUS TOP SPEED\r
1537         CMP ZX,TOPZ+1           ;REACHED?\r
1538         BCC ENDSC               ;NO\r
1539         BEQ PTSLW               ;MAYBE\r
1540         STA ZX,TOPZ+1           ;YES\r
1541         STA Z,PRTSDH\r
1542         LDA Z,TPSPDL\r
1543 ESC:    STA ZX,TOPZ\r
1544         STA Z,PRTSDL\r
1545 ENDSC:  NOP\r
1546         LDA I,0                 ;CLEAR PLAYER'S SCORES WITH\r
1547         STA Z,MILEM             ;CHANGING OF TRACK SELECT SWITCH\r
1548         STA Z,MILEL\r
1549         STA Z,TPSPDH\r
1550         STA Z,TPSPDL\r
1551         RTS                     ;EXIT\r
1552 PTSLW:  LDA Z,TPSPDL\r
1553         CMP ZX,TOPZ             ;PREVIOUS TOP SPEED REACHED?\r
1554         BCS ESC                 ;NO\r
1555         BCC ENDSC\r
1556 HIGH:   LDA Z,MILEL             ;NEW SCORE > OLD SCORE?\r
1557         CMP ZX,TOPZ+2\r
1558         BCC NOHI                ;NO\r
1559         BCS NOHIL\r
1560 \r
1561 CVDL:   LDA Z,TDISTM            ;LONG CONVERT TO DECIMAL ROUTINE\r
1562         ASL                     ;CONVERTS THE TOTAL DISTANCE TRAVELED\r
1563         STA Z,R2                ;TO BCD FOR SCORE DISPLAY\r
1564         LDA Z,TDISTH\r
1565         ROL\r
1566         STA Z,R0\r
1567         LDA Z,TDSTVH\r
1568         ROL\r
1569         STA Z,R1                ;MULTIPLY TOTAL DISTANCE BY 8.\r
1570         ASL Z,R2\r
1571         ROL Z,R0\r
1572         ROL Z,R1\r
1573         ASL Z,R2\r
1574         ROL Z,R0\r
1575         ROL Z,R1\r
1576         LDA Z,EPSCR             ;GET TRACK SCORE WEIGHT MULTIPLIER\r
1577         LDY I,PRODL             ;ADDRESS OF ANSWER\r
1578         LDX I,R0                ;ADDRESS OF MULTIPLICAND\r
1579         ASL                     ;MULTIPLY BY 2?\r
1580         STA Z,MLTPLR            ;SAVE MULTIPLIER\r
1581         BCC CVDL1               ;NO\r
1582         LDA Z,R0                ;YES. COMPUTE PRODUCT=2*MULTIPLICAND\r
1583         ASL\r
1584         STA Z,PRODL\r
1585         LDA Z,R1\r
1586         ROL\r
1587         STA Z,PRODH\r
1588         JSR MULTS               ;DO SPECIAL MULTIPLY. FINISH COMPUTING\r
1589         BEQ CVDL0\r
1590 CVDL1:  JSR MULT                ;COMPUTE WEIGHTED SCORE\r
1591 CVDL0:  SED                     ;SET DECIMAL MODE\r
1592         LDA I,1                 ;SET BCD CONVERTER=1\r
1593         STA Z,R3                ;DOUBLE BYTE CONVERTER\r
1594         LDA I,0\r
1595         STA Z,R4\r
1596         STA Z,MILEL             ;CLEAR SUM\r
1597         STA Z,MILEM\r
1598 CVDLP0: LSR Z,PRODH\r
1599         ROR Z,PRODL             ;BINARY BIT SET?\r
1600         BCC CVDLP1              ;NO. DON'T ADD\r
1601         LDA Z,R3                ;YES.\r
1602         CLC                     ;ADD BCD CONVERTER TO SUM\r
1603         ADC Z,MILEL\r
1604         STA Z,MILEL\r
1605         LDA Z,R4\r
1606         ADC Z,MILEM\r
1607         STA Z,MILEM\r
1608 CVDLP1: CLC                     ;DOUBLE BCD CONVERTER USING DECIMAL ADD\r
1609         LDA Z,R3\r
1610         ADC Z,R3\r
1611         STA Z,R3\r
1612         LDA Z,R4                ;DOUBLE BYTE ADD\r
1613         ADC Z,R4\r
1614         STA Z,R4\r
1615         LDA I,377\r
1616         BIT Z,PRODH             ;ANY BITS LEFT IN BINARY HIGH BYTE\r
1617         BNE CVDLP0              ;YES\r
1618         BIT Z,PRODL             ;LOW BYTE?\r
1619         BNE CVDLP0              ;YES\r
1620         CLD                     ;NO. RETURN\r
1621         LDA Z,MILEM\r
1622         CMP I,65                ;EXTENDED PLAY SCORE? (350)\r
1623         BCC CVDLE               ;NO\r
1624         LDA I,10                ;YES\r
1625         ORA Z,SYNC              ;SET EXTEND PLAY\r
1626         STA Z,SYNC\r
1627 CVDLE:  RTS\r
1628 \r
1629 \r
1630 \r
1631 ;MULTIPLICATION ROUTINE\r
1632 ;\r
1633 ;ACCUM = MULTIPLIER\r
1634 ;Y = ADDRESS OF PRODUCT (LOW BYTE)\r
1635 ;X = ADD RESS OF MULTIPLICAND (LOW BYTE)\r
1636 \r
1637 MULT:   STA Z,MLTPLR            ;SAVE MULTIPLIER\r
1638         LDA I,0\r
1639         STA AY,0                ;CLEAR PRODUCT\r
1640         STA AY,1\r
1641 MULTS:  LDA ZX,0                ;GET MULTIPLICAND\r
1642         STA Z,MLTCDL\r
1643         LDA ZX,1\r
1644         STA Z,MLTCDH\r
1645 MT1:    ASL Z,MLTPLR            ;LOOP UNTIL MLTPLR=0\r
1646         BCS MT0\r
1647         BNE MT2                 ;AND CARRY CLEAR\r
1648         RTS\r
1649 MT0:    CLC\r
1650         LDA AY,0                ;ACCUMULATE PRODUCT\r
1651         ADC Z,MLTCDL\r
1652         STA AY,0\r
1653         LDA AY,1\r
1654         ADC Z,MLTCDH\r
1655         STA AY,1\r
1656         CLC\r
1657 MT2:    LDA Z,MLTCDH\r
1658         BPL MT3\r
1659         SEC\r
1660 MT3:    ROR Z,MLTCDH            ;HALVE MULTIPLICAND\r
1661         ROR Z,MLTCDL\r
1662         JMP MT1\r
1663 \r
1664 NEG:    LDA AY,0                ;NEGATE DOUBLE BYTE AT ADDRESS\r
1665         EOR I,377               ;SPECIFIED IN Y REGISTER\r
1666         CLC\r
1667         ADC I,1\r
1668         STA AY,0\r
1669         LDA AY,1\r
1670         EOR I,377\r
1671         ADC I,0\r
1672         STA AY,1\r
1673         RTS\r
1674 \r
1675 CLRZRO: LDX I,ZHI-ZLOW+1        ;BYTE COUNT\r
1676 CLRZVH: LDA I,0\r
1677 CLRZ:   STA ZX,ZLOW-1           ;CLEAR PAGE ZERO\r
1678         LDA ZX,ZLOW-1           ;DID IT CLEAR?\r
1679         BEQ CLZ0                ;YES\r
1680         JMP ZPERR               ;NO. PRINT ERROR MESSAGE\r
1681 CLZ0:   DEX\r
1682         BNE CLRZ\r
1683         RTS\r
1684 \r
1685 INTZRO: LDX I,95.               ;INITIALIZE PYLON TABLES\r
1686         LDA I,0\r
1687 IT0:    STA ZX,ZCNTRL           ;BY FIRST CLEARING ALL BYTES,\r
1688         DEX\r
1689         BNE IT0\r
1690         LDY I,6\r
1691         LDX I,0\r
1692 ZCZLP0: LDA AY,IPIX             ;THEN MOVING IN INITIAL PICTURE INFO AND\r
1693         STA ZX,ZCNTRL+1\r
1694         STA ZX,ZCNTRL+3\r
1695         LDA I,200               ;ACTIVATING OBJECTS\r
1696         STA ZX,ZCNTRL\r
1697         STA ZX,ZCNTRL+2\r
1698         INX\r
1699         INX\r
1700         INX\r
1701         INX\r
1702         DEY\r
1703         BPL ZCZLP0\r
1704         LDA I,17                ;THEN BY MOVING IN BLANK PICTURE DATA\r
1705         STA ZX,ZCNTRL+1         ;FOR INACTIVE OBJECTS\r
1706         STA ZX,ZCNTRL+3\r
1707         TXA\r
1708         CLC\r
1709         ADC I,5                 ;UPDATE INDEX\r
1710         TAX\r
1711         LDY I,13.\r
1712 ZCZLP1: LDA AY,IXD              ;PUT IN INITIAL X AXIS POSITION\r
1713         STA ZX,ZCNTRL\r
1714         INX\r
1715         INX\r
1716         DEY\r
1717         BPL ZCZLP1\r
1718         INX\r
1719         INX\r
1720         INX\r
1721         INX\r
1722         LDY I,6\r
1723 ZCZLP2: LDA AY,IYD              ;THEN PUT IN INITIAL Y AXIS POSITION\r
1724         STA ZX,ZCNTRL\r
1725         STA ZX,ZCNTRL+2\r
1726         INX\r
1727         INX\r
1728         INX\r
1729         INX\r
1730         DEY\r
1731         BPL ZCZLP2\r
1732         LDA I,0\r
1733         STA Z,ORL               ;CENTER ORIGIN\r
1734         STA Z,ORVH\r
1735         LDA I,174\r
1736         STA Z,ORH\r
1737         LDA I,177\r
1738         STA Z,DIST              ;INITIALIZE DISTANCE\r
1739         RTS                     ;EXIT\r
1740 \r
1741 SYNWT:  CLI\r
1742         LDA I,1\r
1743         BIT Z,SYNC              ;INTERRUPT YET?\r
1744         BNE SY0                 ;YEP\r
1745         JSR LFC                 ;ANY COIN?\r
1746         BCC SYNWT               ;NO?\r
1747         SEI                     ;YES\r
1748         TXA                     ;SAVE X AND Y\r
1749         PHA\r
1750         TYA\r
1751         PHA\r
1752         JSR COIN                ;PROCESS COIN\r
1753         LDA I,376               ;RESET SYNC FOUND\r
1754         AND Z,SYNC\r
1755         STA Z,SYNC\r
1756         PLA\r
1757         TAY\r
1758         PLA\r
1759         TAX\r
1760         JMP SYNWT\r
1761 SY0:    EOR Z,SYNC\r
1762         STA Z,SYNC\r
1763         SEI\r
1764         RTS\r
1765 \r
1766 VSYNC:  PHA                     ;SAVE REGS\r
1767         TXA\r
1768         PHA\r
1769         TSX\r
1770         LDA AX,403\r
1771         AND I,20                ;BREAKPOINT?\r
1772         BEQ VS0                 ;NO\r
1773         PLA                     ;YES\r
1774         TAX\r
1775         PLA\r
1776         JMP 70122               ;JUMP TO DEMON\r
1777 VS0:    TYA\r
1778         PHA\r
1779         LDA I,40                ;PAGE ZERO ERROR TRAP?\r
1780         BIT Z,SYNC\r
1781         BEQ VTST                ;NO\r
1782         LDX I,0         ;YES. WRITE 'ERR Z XX' ON LINE 4\r
1783 PEW0:   LDA AX,PZRERR\r
1784         BNE PEW1\r
1785         TYA                     ;GET FAILING BIT(S) MSB\r
1786         LSR                     ;CONVERT TO HEX\r
1787         LSR\r
1788         LSR\r
1789         LSR\r
1790         TAX\r
1791         LDA AX,HEX\r
1792         STA A,PLYFLD+140+PZE-PZRERR     ;DISPLAY THEM\r
1793         TYA\r
1794         AND I,17                ;FAILING BITS LSB\r
1795         TAX\r
1796         LDA AX,HEX\r
1797         STA A,PLYFLD+141+PZE-PZRERR     ;DISPLAY THEM\r
1798         JMP RESET\r
1799 PEW1:   STA AX,PLYFLD+140\r
1800         INX\r
1801         BNE PEW0\r
1802 VTST:   BVC GOEND\r
1803         LDY I,15.\r
1804         LDX I,31.\r
1805 LOOP:   LDA ZX,ZCNTRL           ;PICTURE INFORMATION\r
1806         STA AY,PICTR\r
1807         LDA ZX,ZXAX             ;X AXIS DATA\r
1808         EOR I,377\r
1809         STA AY,XAXIS\r
1810         LDA ZX,ZYAX             ;Y AXIS DATA\r
1811         STA AY,YAXIS\r
1812         DEX\r
1813         DEX\r
1814         DEY\r
1815         BPL LOOP\r
1816         LDA Z,FRMCL             ;YES\r
1817         AND I,17                ;16 FRAMES?\r
1818         BNE SSSC                ;NO\r
1819         LDA I,20        \r
1820         BIT Z,SYNC              ;ATTRACT MODE?, EXTENDED PLAY?\r
1821         BMI GOM                 ;ATTRACT MODE.\r
1822         BEQ SSSD                ;NOT EXTENDED PLAY.\r
1823         LDX I,EPMSG-GO          ;EXTENDED PLAY\r
1824         BNE GOOE\r
1825 GOM:    LDX I,0\r
1826 GOOE:   LDY I,53\r
1827         LDA I,20\r
1828         BIT Z,FRMCL             ;E/O?\r
1829         BEQ GOWRT               ;EVEN WRITE GAME OVER\r
1830 GOLP:   LDA I,0                 ;ODD BLANK GAME OVER\r
1831         STA AY,PLYFLD\r
1832         INY\r
1833         INX\r
1834         LDA AX,GO\r
1835         BNE GOLP\r
1836 GOEND:  BEQ ESYNC\r
1837 GOWRT:  LDA AX,GO\r
1838         BEQ ESYNC\r
1839         STA AY,PLYFLD\r
1840         INY\r
1841         INX\r
1842         BNE GOWRT\r
1843 SSSC:   BIT Z,SYNC              ;ATTRACT MODE?\r
1844         BPL SSSD                ;NO\r
1845         LDX I,HML\r
1846         LDY I,PHS\r
1847         JSR UNPKL               ;UNPACK HIGH SCORE\r
1848         LDX I,PRTSDL\r
1849         LDY I,PPTP\r
1850         JSR UNPK                ;UNPACK HIGH TOP SPEED\r
1851 SSSD:   LDX I,TPSPDL\r
1852         LDY I,YTPSPD\r
1853         JSR UNPK                ;UNPACK YOUR TOP SPEED\r
1854         LDX I,MILEL\r
1855         LDY I,PSCORE\r
1856         JSR UNPKL               ;UNPACK YOUR SCORE\r
1857         BIT Z,SYNC              ;ATTRACT MODE\r
1858         BMI ESYNC               ;YES. SKIP TIME OUTPUT\r
1859         LDX I,GTML\r
1860         LDY I,76\r
1861         JSR UNPKL               ;UNPACK TIME\r
1862 ESYNC:  LDA I,1\r
1863         ORA Z,SYNC\r
1864         STA Z,SYNC              ;SIGNAL SYNC PROCESSED\r
1865         PLA\r
1866         TAY                     ;RESTORE REGS\r
1867         PLA\r
1868         TAX\r
1869         PLA\r
1870         RTI\r
1871 \r
1872         .EVEN\r
1873 \r
1874 CHK3K:  .BYTE 67,311\r
1875 \r
1876 CHKADR: .WORD CHK3K,CHK2K,CHK1K\r
1877         .REPT 117772-.          ;9FFA-.\r
1878         .BYTE 377\r
1879         .ENDR\r
1880         .=117772\r
1881 VCTORS: .WORD RESET,RESET,VSYNC\r
1882 \r
1883 WROB    =71261\r
1884 CRLF    =71212\r
1885 SPACE   =71567\r
1886 \r
1887         .END\r
1888 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0