0100 ; +---------------+ 0110 ; | RACE IN SPACE | 0120 ; +---------------+ 0130 ; 0140 ; Written by Charles Bachand 0150 ; 0160 ORIGIN = $1000 0170 ; 0180 ; Game Playfield Area 0190 ; ------------------- 0200 ; 0210 DRAM = ORIGIN+$1000 0220 MRAM = DRAM+$1900 0230 ASTR = PAGES*512+DRAM 0240 ASTL = PAGES*256+ASTR 0250 ; 0260 ; Player/Missile Area 0270 ; ------------------- 0280 ; 0290 *= $0800 0300 ; 0310 PM *= *+$0180 ;blank space 0320 PMM *= *+$80 ;missiles 0330 PM0 *= *+$80 ;player 0 0340 PM1 *= *+$80 ;player 1 0350 PM2 *= *+$80 ;player 2 0360 PM3 *= *+$80 ;player 3 0370 ; 0380 ; System Equates 0390 ; -------------- 0400 ; 0410 TRAM = PM ;PM blank space 0420 CHBAS = $02F4 ;char base reg 0430 CH = $02FC ;last key press 0440 VSCROL = $D405 ;vertical scroll 0450 NMIEN = $D40E ;interrupt ctrl 0460 VDSLST = $0200 ;DLI vector 0470 SDMCTL = $022F ;DMA enable 0480 SDLSTL = $0230 ;display list 0490 COLOR0 = $02C4 ;color reg 0 0500 COLOR1 = $02C5 ;color reg 1 0510 COLOR2 = $02C6 ;color reg 2 0520 COLPF1 = $D017 ;color playfld 1 0530 DLI = $80 ;DLI flag 0540 ATRACT = 77 ;attract mode 0550 RTCLOK = 20 ;real time clock 0560 PCOLR0 = $02C0 ;player color 0 0570 PCOLR1 = $02C1 ;player color 1 0580 PCOLR2 = $02C2 ;player color 2 0590 PCOLR3 = $02C3 ;player color 3 0600 GPRIOR = $026F ;priority 0610 SIZEP2 = $D00A ;size player 2 0620 SIZEP3 = $D00B ;size player 3 0630 HPOSP0 = $D000 ;pos player 0 0640 HPOSP2 = $D002 ;pos player 2 0650 HPOSP3 = $D003 ;pos player 3 0660 HPOSM0 = $D004 ;pos missile 0 0670 SIZEM = $D00C ;missile size 0680 VDELAY = $D01C ;vertical delay 0690 GRACTL = $D01D ;graphics ctrl 0700 CONSOL = $D01F ;console keys 0710 PMBASE = $D407 ;P/M base addr 0720 AUDF1 = $D200 ;audio freq 1 0730 AUDF2 = $D202 ;audio freq 2 0740 AUDF3 = $D204 ;audio freq 3 0750 AUDF4 = $D206 ;audio freq 4 0760 AUDC1 = $D201 ;audio volume 1 0770 AUDC2 = $D203 ;audio volume 2 0780 AUDC3 = $D205 ;audio volume 3 0790 AUDC4 = $D207 ;audio volume 4 0800 AUDCTL = $D208 ;audio control 0810 SKCTL = $D20F ;serial ctrl 0820 RANDOM = $D20A ;random number 0830 STRIG = $0284 ;joystick trig 0 0840 STICK = $0278 ;joystick 0 0850 PAGES = $06 ;scrn block size 0860 P0PF = $D004 ;P0/PF collision 0870 P1PF = $D005 ;P1/PF collision 0880 M0PL = $D008 ;M0/PL collision 0890 M1PL = $D009 ;M1/PL collision 0900 P0PL = $D00C ;P0/PL collision 0910 P1PL = $D00D ;P1/PL collision 0920 HITCLR = $D01E ;collision clear 0930 PACTL = $D302 ;port A control 0940 ; 0950 ; Page Zero equates 0960 ; ----------------- 0970 ; 0980 *= $80 0990 ; 1000 SELPNT *= *+2 ;menu select pnt 1010 CONSAV *= *+1 ;console save 1020 CLOCK *= *+1 ;local clock 1030 SLINE *= *+1 ;scroll line cnt 1040 VOLUME *= *+1 ;intro volume 1050 DIRSW *= *+1 ;vol direction 1060 OPTION *= *+1 ;OPTION key indx 1070 OPTSW *= *+1 ;OPTION switch 1080 TRIG *= *+1 ;Trigger option 1090 DENS *= *+1 ;starfield dens 1100 SHIP *= *+1 ;ship type 1110 COME *= *+1 ;comet enabled 1120 UNIV *= *+1 ;inverse univ 1130 SOFSET *= *+1 ;SELECT offset 1140 TEMP *= *+4 ;temp registers 1150 GRPAGE *= *+2 ;screen pointer 1160 GRP1 *= *+2 ;asteroid left 1170 GRP2 *= *+2 ;asteroid right 1180 GRP20P *= *+2 ;scrn pntr -20 1190 GRPX *= *+2 ;player gr pntr 1200 GRPM *= *+2 ;missile gr pntr 1210 FLASHC *= *+1 ;univ flash cntr 1220 FLASHF *= *+1 ;univ flash flag 1230 REVF *= *+1 ;inv univ flag 1240 HPOS *= *+1 ;comet H pos 1250 HDIR *= *+1 ;comet H dir 1260 HINC *= *+1 ;comet H speed 1270 VPOS *= *+1 ;comet V pos 1280 VDIR *= *+1 ;comet V dir 1290 VINC *= *+1 ;comet V speed 1300 DEAD *= *+2 ;dead ship flg 1310 COMETF *= *+1 ;comet set flag 1320 CSOUND *= *+1 ;comet snd cntr 1330 UNIVS *= *+1 ;universe sound 1340 ENDGAM *= *+1 ;game over flag 1350 SCORES *= *+2 ;game scores 1360 TRIGN *= *+2 ;processed trigs 1370 TRIGS *= *+2 ;last triggers 1380 ROTATE *= *+1 ;rotate index 1390 SCLOCK *= *+1 ;score snd timer 1400 VDEL *= *+1 ;vert delay 1410 MISSLE *= *+2 ;shot flags 1420 ROWAC *= *+2 ;shot row acc 1430 DELTAR *= *+2 ;shot delta row 1440 ENDPT *= *+2 ;shot end point 1450 ROWCRS *= *+2 ;shot row cursor 1460 ROWINC *= *+2 ;shot row inc 1470 COLAC *= *+2 ;shot column acc 1480 DELTAC *= *+2 ;delta column 1490 COLCRS *= *+2 ;column cursor 1500 COLINC *= *+2 ;shot column inc 1510 COUNTR *= *+2 ;shot delta cnt 1520 NEWCOL *= *+1 ;shot end column 1530 NEWROW *= *+1 ;shot end row 1540 OLDCOL *= *+1 ;shot old column 1550 OLDROW *= *+1 ;shot old row 1560 TEMPM *= *+1 ;shot temporary 1570 M0PLS *= *+2 ;M0 col shadow 1580 XPLR *= *+2 ;ship X coords 1590 YPLR *= *+2 ;ship Y coords 1600 ; 1610 *= ORIGIN 1620 ; 1630 ; Redefined Character Set Data 1640 ; ---------------------------- 1650 ; 1660 CHARS .BYTE 0,0,0,0,0,0,0,0 1670 .BYTE 0,0,0,0,$7B,50,50,50 1680 .BYTE 0,0,0,0,$60,$A0,$A0,32 1690 .BYTE 0,$7E,66,66,$7E,66,66,0 1700 .BYTE 0,$7E,64,64,64,64,$7E,0 1710 .BYTE 0,$7C,70,70,70,70,$7C,0 1720 .BYTE 0,$7E,64,$7C,64,64,$7E,0 1730 .BYTE 0,$7E,64,$7C,64,64,64,0 1740 .BYTE 0,$7E,64,64,78,66,$7E,0 1750 .BYTE 0,66,66,$7E,66,66,66,0 1760 .BYTE 0,$7E,24,24,24,24,$7E,0 1770 .BYTE 0,64,64,64,64,64,$7E,0 1780 .BYTE 0,$7E,66,66,66,66,66,0 1790 .BYTE 0,$7E,66,66,$7E,64,64,0 1800 .BYTE 0,$7E,66,66,$7E,76,70,0 1810 .BYTE 0,$7E,24,24,24,24,24,0 1820 .BYTE 0,66,66,66,90,90,$7E,0 1830 .BYTE 0,66,66,$7E,24,24,24,0 1840 .BYTE $7E,$81,$BD,$A1 1850 .BYTE $A1,$BD,$81,$7E 1860 .BYTE 0,$7E,66,66,66,66,$7E,0 1870 .BYTE 0,8,8,8,8,8,8,0 1880 .BYTE 0,$7E,2,$7E,64,64,$7E,0 1890 .BYTE 0,$7E,2,$7E,2,2,$7E,0 1900 .BYTE 0,66,66,$7E,2,2,2,0 1910 .BYTE 0,$7E,64,$7E,2,2,$7E,0 1920 .BYTE 0,$7E,64,$7E,66,66,$7E,0 1930 .BYTE 0,$7E,2,2,2,2,2,0 1940 .BYTE 0,$7E,66,$7E,66,66,$7E,0 1950 .BYTE 0,$7E,66,$7E,2,2,$7E,0 1960 .BYTE 0,0,0,0,0,0,0,0 1970 .BYTE 24,36,90,0,0,0,0,0 1980 .BYTE 0,0,24,60,60,24,0,0 1990 .BYTE 0,0,0,60,$7E,$7E,$7E,60 2000 .BYTE 0,0,0,0,$7E,$FF,$FF,$FF 2010 .BYTE 0,0,0,0,0,60,$7E,$7E 2020 .BYTE 0,0,0,0,0,0,24,60 2030 .BYTE 0,0,0,0,0,0,0,24 2040 .BYTE 0,0,0,0,0,0,0,0 2050 .BYTE 0,0,0,0,0,0,0,0 2060 .BYTE 0,0,0,0,0,0,0,0 2070 .BYTE 60,0,0,0,0,0,0,0 2080 .BYTE $FF,$FF,$FF,$7E,0,0,0,0 2090 .BYTE $7E,$7E,60,0,0,0,0,0 2100 .BYTE 60,24,0,0,0,0,0,0 2110 .BYTE 24,0,0,0,0,0,0,0 2120 .BYTE 0,24,24,24,24,60,$7E,90 2130 .BYTE 24,24,24,60 2140 .BYTE $7E,$FF,$DB,0 2150 .BYTE 0,0,0,0,0,0,0,0 2160 .BYTE 0,66,66,66,66,66,$7E,0 2170 .BYTE 0,0,24,24,0,24,24,0 2180 .BYTE 0,66,66,66,66,36,24,0 2190 .BYTE 0,$7E,90,90,66,66,66,0 2200 .BYTE 0,70,76,$78,88,76,70,0 2210 .BYTE $FF,$FF,$FF,$FF 2220 .BYTE $FF,$FF,$FF,$FF 2230 .BYTE $7E,66,66,0,66,66,$7E,0 2240 .BYTE 2,2,2,0,2,2,2,0 2250 .BYTE 62,2,2,60,64,64,$7C,0 2260 .BYTE 62,2,2,60,2,2,62,0 2270 .BYTE 66,66,66,60,2,2,2,0 2280 .BYTE $7C,64,64,60,2,2,62,0 2290 .BYTE $7C,64,64,60,66,66,$7E,0 2300 .BYTE 62,2,2,0,2,2,2,0 2310 .BYTE $7E,66,66,60,66,66,$7E,0 2320 .BYTE $7E,66,66,60,2,2,62,0 2330 ; 2340 ; Introduction Display List 2350 ; ------------------------- 2360 ; 2370 DISPI .BYTE $70,$67 2380 DADR .WORD DRAM 2390 .BYTE $27,$27,$27,$27 2400 .BYTE $27,$27,$27,$27 2410 .BYTE $27,$27,$27,$27 2420 .BYTE $27,$07,$41+DLI 2430 .WORD DISPI 2440 ; 2450 ; Game Options Display List 2460 ; ------------------------- 2470 ; 2480 DISPO .BYTE $70,$70,$70,$46 2490 .WORD OPTMSG 2500 .BYTE $07,$46 2510 .WORD SB 2520 .BYTE $46 2530 .WORD OL1 2540 .BYTE $06,$06,$46 2550 .WORD SB 2560 .BYTE $46 2570 .WORD OL2 2580 .BYTE $46 2590 DOT .WORD TOPT 2600 .BYTE $46 2610 .WORD SB 2620 .BYTE $46 2630 .WORD OL3 2640 .BYTE $46 2650 DOD .WORD DOPT 2660 .BYTE $46 2670 .WORD SB 2680 .BYTE $46 2690 .WORD OL4 2700 .BYTE $46 2710 DOS .WORD SOPT 2720 .BYTE $46 2730 .WORD SB 2740 .BYTE $46 2750 .WORD OL5 2760 .BYTE $46 2770 DOC .WORD COPT 2780 .BYTE $46 2790 .WORD SB 2800 .BYTE $46 2810 .WORD OL6 2820 .BYTE $46 2830 DOU .WORD UOPT 2840 .BYTE $46 2850 .WORD SB 2860 .BYTE $46 2870 .WORD OPTMSG 2880 .BYTE $41 2890 .WORD DISPO 2900 ; 2910 ; Game Playfield Display List 2920 ; --------------------------- 2930 ; 2940 DISPG .BYTE $70,$70,$70,$4F 2950 .WORD DRAM 2960 .DBYTE 15,15,15,15,15,15,15 2970 .DBYTE 15,15,15,15,15,15,15 2980 .DBYTE 15,15,15,15,15,15,15 2990 .DBYTE 15,15,15,15,15,15,15 3000 .DBYTE 15,15,15,15,15,15,15 3010 .DBYTE 15,15,15,15,15,15,15 3020 .DBYTE 15,15,15,15,15,15,15 3030 .DBYTE 15,15,15,15,15,15,15 3040 .DBYTE 15,15,15,15,15,15,15 3050 .DBYTE 15,15,15,15,15,15,15 3060 .DBYTE 15,15,15,15,15 3070 .BYTE $70,$30,$47+DLI 3080 .WORD TRAM 3090 .BYTE $30,$42 3100 .WORD ANALOG 3110 .BYTE $41 3120 .WORD DISPG 3130 ; 3140 ; Flying saucer in Intro Data 3150 ; --------------------------- 3160 ; 3170 SAUCER .BYTE $18,$7E,$7E,$FF 3180 .BYTE $FF,$7E,$7E,$18 3190 WINDOW .BYTE $00,$00,$00,$55 3200 .BYTE $55,$00,$00,$00 3210 ; 3220 ; Redefined Char Set Equates 3230 ; -------------------------- 3240 ; 3250 TMC = 1 3260 AC = 3 3270 CC = 4 3280 DC = 5 3290 EC = 6 3300 FC = 7 3310 GC = 8 3320 HC = 9 3330 IC = 10 3340 LC = 11 3350 NC = 12 3360 PC = 13 3370 RC = 14 3380 TC = 15 3390 WC = 16 3400 YC = 17 3410 CRC = 18 3420 N0C = 19 3430 BC = N0C+8 3440 OC = N0C 3450 SC = OC+5 3460 SMK = N0C+10 3470 SMK2 = SMK+8 3480 SHC = SMK2+8 3490 MT = SHC+2 3500 UC = MT+1 3510 COLC = UC+1 3520 VC = COLC+1 3530 MC = VC+1 3540 KC = MC+1 3550 BX = KC+$41 3560 N7C = KC+2 3570 ; 3580 ; Introduction Title Data 3590 ; ----------------------- 3600 ; 3610 TITLE .BYTE 21,AC,NC,AC,LC 3620 .BYTE OC,GC,$FF,36,MC 3630 .BYTE AC,GC,AC,N0C+2,IC 3640 .BYTE NC,EC,$FF,68 3650 .BYTE +$40,PC,RC,EC,SC 3660 .BYTE +$40,EC,NC,TC,SC 3670 .BYTE $FF,97 3680 .BYTE +$80,RC,AC,CC,EC,0 3690 .BYTE +$80,IC,NC,0,SC,PC 3700 .BYTE +$80,AC,CC,EC 3710 .BYTE TMC,TMC+1,$FF,131 3720 .BYTE +$40,WC,RC,IC,TC,TC,EC 3730 .BYTE +$40,NC,0,BC,YC 3740 .BYTE $FF,160 3750 .BYTE +$C0,CC,HC,AC,RC,LC,EC 3760 .BYTE +$C0,SC,0,0,BC,AC,CC 3770 .BYTE +$C0,HC,AC,NC,DC 3780 .BYTE $FF,197,CRC,0 3790 .BYTE N0C+1,N0C+9,N0C+8 3800 .BYTE N0C+4,$FF,230 3810 .BYTE +$80,SHC,0,0,SHC 3820 .BYTE $FF,246 3830 .BYTE +$40,SHC+1,0,0,SHC+1 3840 .BYTE $FF 3850 ; 3860 ; PRESS OPTION Message Data 3870 ; ------------------------- 3880 ; 3890 PMSG .BYTE 0,0,0,0,0,0,0,0,0 3900 .BYTE +$C0,PC,RC,EC,SC,SC 3910 .BYTE +$C0,0,OC,PC,TC,IC 3920 .BYTE +$C0,OC,NC,0,0 3930 .BYTE 0,0,0,0,0,0,0,0,0 3940 ; 3950 ; Options Screen Data 3960 ; ------------------- 3970 ; 3980 OPTMSG .BYTE BX,BX,BX,BX,BX,BX,BX,BX 3990 .BYTE BX,BX,BX,BX,BX,BX,BX,BX 4000 .BYTE BX,0,OC,PC,TC,IC,OC,NC 4010 .BYTE SC 4020 .BYTE +$C0,0,0,TC,COLC 4030 TIMOPT .BYTE +$80,N0C+3,0 4040 OL1 .BYTE BX,0 4050 .BYTE +$40,OC,PC,TC,IC 4060 .BYTE +$40,OC,NC,COLC,0 4070 .BYTE +$80,LC,EC,FC,TC,0 4080 .BYTE BX,BX,0 4090 .BYTE +$40,SC,EC,LC,EC,CC 4100 .BYTE +$40,TC,COLC 4110 .BYTE +$C0,RC,IC,GC,HC,TC,0 4120 .BYTE BX,BX,0 4130 .BYTE +$40,SC,TC,AC,RC,TC 4140 .BYTE +$40,COLC 4150 .BYTE 0,0,PC,LC,AC,YC,0 4160 OL2 .BYTE BX,0,TC,RC,IC,GC,GC,EC 4170 .BYTE RC,COLC,0,0,0,0,0,BX 4180 OL3 .BYTE BX,0 4190 .BYTE +$80,DC,EC,NC,SC,IC,TC 4200 .BYTE +$80,YC,COLC,0,0 4210 .BYTE 0,0,0,BX 4220 OL4 .BYTE BX,0 4230 .BYTE +$80,SC,HC,IC,PC,SC 4240 .BYTE +$80,COLC 4250 .BYTE 0,0,0,0,0,0,0,BX 4260 OL5 .BYTE BX,0 4270 .BYTE +$80,CC,OC,MC,EC,TC 4280 .BYTE +$80,SC,COLC 4290 .BYTE 0,0,0,0,0,0,BX 4300 OL6 .BYTE BX,0 4310 .BYTE +$80,UC,NC,IC,VC 4320 .BYTE +$80,EC,RC,SC,EC,COLC 4330 .BYTE 0,0,0,0,BX 4340 SB .BYTE BX,0,0,0,0,0,0,0 4350 .BYTE 0,0,0,0,0,0,0 4360 TOPT .BYTE BX,0,0,0,0 4370 .BYTE +$C0,NC,OC,0,EC,FC,FC 4380 .BYTE +$C0,EC,CC,TC,0 4390 TOPT2 .BYTE BX,0,0,0,0,0,0 4400 .BYTE +$C0,SC,HC,IC,EC 4410 .BYTE +$C0,LC,DC,SC,0 4420 TOPT3 .BYTE BX,0,0,0,0,0 4430 .BYTE +$C0,MC,IC,SC,SC 4440 .BYTE +$C0,IC,LC,EC,SC,0 4450 TOPT4 .BYTE BX,0,0,0 4460 .BYTE +$C0,WC,AC,RC,PC,0 4470 .BYTE +$C0,DC,RC,IC,VC,EC,0 4480 DOPT .BYTE BX,0,0,0,0,0 4490 .BYTE +$C0,SC,TC,AC,NC 4500 .BYTE +$C0,DC,AC,RC,DC,0 4510 DOPT2 .BYTE BX,0,0,0,0,0,0,0 4520 .BYTE +$C0,DC,OC,UC,BC,LC 4530 .BYTE +$C0,EC,0 4540 DOPT3 .BYTE BX,0,0,0,0,0,0,0 4550 .BYTE +$C0,TC,RC,IC,PC,LC 4560 .BYTE +$C0,EC,0 4570 DOPT4 .BYTE BX,0,0,0,0,0,0,0,0 4580 .BYTE +$C0,SC,UC,PC,EC,RC,0 4590 SOPT .BYTE BX,0,0,0,0,0,0 4600 .BYTE +$C0,RC,OC,CC,KC 4610 .BYTE +$C0,EC,TC,SC,0 4620 SOPT2 .BYTE BX,0,0,0,0,0,0 4630 .BYTE +$C0,SC,AC,UC,CC,EC 4640 .BYTE +$C0,RC,SC,0 4650 COPT .BYTE BX,0,0,0,0,0 4660 .BYTE +$C0,DC,IC,SC,AC 4670 .BYTE +$C0,BC,LC,EC,DC,0 4680 COPT2 .BYTE BX,0,0,0,0,0,0 4690 .BYTE +$C0,EC,NC,AC,BC 4700 .BYTE +$C0,LC,EC,DC,0 4710 UOPT .BYTE BX,0,0,0,0,0 4720 .BYTE +$C0,PC,OC,SC,IC 4730 .BYTE +$C0,TC,IC,VC,EC,0 4740 UOPT2 .BYTE BX,0,0,0,0,0 4750 .BYTE +$C0,NC,EC,GC,AC,TC 4760 .BYTE +$C0,IC,VC,EC 4770 .BYTE 0,BX 4780 ANALOG .BYTE 0,0,0,0,CC,OC,PC,YC 4790 .BYTE RC,IC,GC,HC,TC,0 4800 .BYTE CRC,0,AC,NC,AC,LC 4810 .BYTE OC,GC,0,MC,AC,GC,AC 4820 .BYTE N0C+2,IC,NC,EC,0,N0C+1 4830 .BYTE N0C+9,N0C+8,N0C+4 4840 .BYTE 0,0,0,0 4850 TRAMI .BYTE 0,0,N0C,N0C,0,0,0 4860 TRAMC .BYTE +$C0,N7C+3,COLC,N7C 4870 .BYTE +$C0,N7C,SMK+7,N7C 4880 .BYTE 0,0,0,N0C,N0C,0,0 4890 TRAMN .BYTE 3,0,0,0,0 4900 NUMMSK .BYTE $1F,$1E,$1A,$18 4910 .BYTE $1D,$1B,$33,$35,$30 4920 MISMSK .BYTE $FC,$F3 4930 MISIMA .BYTE 3,0,3,1,1,1,1,3 4940 .BYTE 0,3,2,3,2,2,3,2 4950 MIMAGE .BYTE 0,0,0,0 4960 MCMSK .BYTE $0E,$0D 4970 LADR .WORD DOD,DOS,DOC,DOU,DOT 4980 MADR .WORD TOPT,TOPT2,TOPT3,TOPT4 4990 .WORD DOPT,DOPT2,DOPT3,DOPT4 5000 .WORD SOPT,SOPT2,COPT 5010 .WORD COPT2,UOPT,UOPT2 5020 SELMSK .BYTE 3,3,1,1,1 5030 SELMS2 .BYTE 0,4,4,2,2 5040 SHIPS .BYTE 0,$18,$3C,$3C,$18 5050 .BYTE $5A,$7E,$5A,$42 5060 .BYTE 0,$18,$7E,$DB 5070 .BYTE $7E,0,0,0,0,0 5080 ROTMSK .BYTE $B6,$6D,$DB,$B6 5090 VDMSK .BYTE $10,$20,$01,$02 5100 XSTRT .BYTE 88,160 5110 SCPNT .BYTE 3,17 5120 SCNOTE .BYTE $50,$30 5130 PCOLRS .BYTE $C4,$34 5140 COMETM .BYTE 0,$3C,$7E,$7E 5150 .BYTE $FF,$FF,$FF,$FF,$FF 5160 .BYTE $FF,$7E,$7E,$3C,0 5170 CE3K .BYTE $C6,$46,$F6,$66,$26 5180 CE3KN .BYTE $6C,$A2,$51,$40,$48