A.N.A.L.O.G. ISSUE 54 / MAY 1987 / PAGE 67

Rocks!

48K Disk
by Douglas Engel

The crew was ecstatic—after four years of searching, an inhabitable star system had been found for the Earth’s refugees. As the fleet passed each of the ten planets of the system, scanners showed more signs of the ancient civilization that once prospered here. There were even some energy readings. A landing party was dispatched to investigate. Its members returned with reports of gigantic pyramids, huge underground cities, massive nuclear furnaces, giant radioactive waste dumps—and no signs of life.

The star system was soon brought back to life. People moved into the underground cities and activated the reactors. The advanced technology of the civilization was harnessed, to create impenetrable defense screens of artificial asteroids called Rocks, to protect each planet from the aliens who had destroyed the colonists’ home. Everything seemed to be progressing very well, until the day the colony discovered what had happened to the former inhabitants of the system.

The reactors were in full operation, producing 24 tons of waste each day—waste which was dumped in each planet’s massive waste dump, waste which was still active in some strange way. The radiation at each dump continued to increase until it reached the now-critical levels. Something had to be done to prevent disaster.

You’ve been assigned to the radiation dispersal team working to save as many of the planets as possible from total destruction by the mysterious radiation. To accomplish this task, you’ve been given three remote-controlled shuttle pods. You must carefully navigate a pod through the Rocks and land on the disposal pad, where a canister of waste will be automatically loaded onto your pod. Next, you must pilot your ship back through the Rocks and teleport the canister into one of the passing fleet ships, which will transport it to deep space, to be harmlessly dispersed.

Although this may sound simple, it’s not. Any collision between your pod and another object will result in the loss of the pod. Any attempt to land on the rough ground—or with a canister on board—will crash the pod. When the radiation level gets high enough, strange discharges may destroy your pod.

To further complicate matters, enemy spy satellites have been reported scouting the area. These satellites will explode on contact, also destroying your pod. Finally, if you manage to remove five canisters from a dump, you’ll move to the next planet and be given another spare pod. If the radiation level gets too high, the planet will be devastated—and your services will no longer be required.

Typing it in.

Listing 1 is the BASIC data used to create your copy of Rocks! Please see M/L Editor on page 10 for typing instructions.

Playing Rocks!

Rocks! is a game for one player, and requires one joystick and 24K of memory on any 8-bit Atari computer. The starting level is selected at the beginning of the game on the title screen, by pressing the SELECT key.

The game will begin when the START key is pressed. If you want to abort a game and start a new game, you may press START during play. If you’d like to change the starting level during a game, you may press SELECT to abort the current game and return to the title screen, where a new level may be chosen.

You start the game above the first planet, with the fleet passing above you and the Rocks immediately below you. Beneath the Rocks lies the planet’s atmosphere; below that is the waste dump. The bottom of the screen displays the instruments aboard your pod. These instruments include: C, the number of canisters yet to be moved; RADS, your radiation meter; FUEL, your fuel gauge; and, finally, P, the number of pods you have.

You move in space by pushing your joystick in any of the eight standard directions. The pod will move in that direction. When you head into the atmosphere, the planet’s gravity starts to pull on your pod, so you can move left or right normally, but must use upward thrust to decelerate a fall and to accelerate upward.

To land, you must center your pod above the disposal pad and thrust upward to slow your fall. You must be falling slowly at the point of contact with the pad, or you’ll crash. Do not attempt to land with a canister on board your pod, because the shock will detonate the unstable waste.

Pushing the joystick button when a canister is on your pod will activate the teleport beam. If this beam makes contact with one of the fleet ships, the canister will teleport aboard that ship, and the radiation level will decrease. If the beam expends itself, or contacts an object, the canister will disperse, but the radiation will remain.

As above, when five canisters have been removed from a dump, you’ll move on to the next planet, advance one level and be given another spare pod. When all five canisters have been removed from each of the ten planets, you’ll return to the first planet to continue the task. At this point, you will have reached the highest difficulty and will remain at this level.

The game is lost if the radiation level reaches maximum and destroys the current planet, or if you lose all of your pods. Good luck, and watch out for the Rocks!


Douglas Engel has an A.A.S. in Electrical Technology and has been a computer enthusiast since 1981. He owns an Atari 2600, 600XL, 800XL and 520ST, and numerous peripherals. Rocks! is his first assembly language game. His other interests include art, animation and automobiles (especially classic T-Birds).


Listing 1.
M/L Editor Data.

1000 DATA 255,255,0,32,246,47,169,3,141,15,210,169,22,141,8,2,2781
1010 DATA 169,38,141,9,2,169,29,141,195,2,169,0,141,8,210,133,4926
1020 DATA 204,133,206,173,244,2,133,205,169,64,133,207,160,64,162,1,8133
1030 DATA 177,204,145,206,200,208,249,230,205,230,207,202,16,242,169,64,4706
1040 DATA 141,244,2,160,0,162,0,189,216,70,141,26,80,142,27,80,4019
1050 DATA 162,7,173,26,80,10,141,26,80,144,4,169,73,208,2,169,4331
1060 DATA 0,153,224,59,200,202,16,234,174,27,80,232,224,25,208,215,1792
1070 DATA 169,64,141,14,212,169,0,141,47,2,160,98,162,228,169,7,6372
1080 DATA 32,92,228,169,136,141,48,2,169,61,141,49,2,169,11,141,3617
1090 DATA 0,2,169,38,141,1,2,169,192,141,14,212,32,41,36,32,1708
1100 DATA 68,37,133,77,141,200,2,169,2,141,196,2,169,4,141,197,6348
1110 DATA 2,169,6,141,198,2,169,134,141,199,2,173,95,71,141,201,8206
1120 DATA 60,169,34,141,47,2,173,31,208,201,7,240,249,133,77,201,199
1130 DATA 5,208,17,238,201,60,173,201,60,201,26,208,20,169,16,141,7192
1140 DATA 201,60,208,13,201,6,208,222,173,31,208,201,7,208,249,240,3555
1150 DATA 36,141,95,71,162,64,160,0,200,208,253,202,208,250,162,112,3864
1160 DATA 160,0,173,57,80,200,208,250,173,31,208,201,7,240,183,202,3118
1170 DATA 208,240,76,192,32,169,0,141,47,2,141,96,71,133,77,162,4834
1180 DATA 7,169,16,157,87,71,202,16,250,169,19,141,218,59,173,95,8220
1190 DATA 71,141,201,60,141,97,71,169,80,160,0,162,1,32,17,37,1094
1200 DATA 32,68,37,32,41,36,169,5,141,129,66,141,134,66,169,168,6117
1210 DATA 141,165,66,169,21,141,183,59,141,37,80,169,3,141,29,208,5582
1220 DATA 169,80,141,7,212,169,0,162,167,157,168,61,202,16,250,169,327
1230 DATA 83,160,0,162,5,32,17,37,169,83,133,205,169,0,133,204,6643
1240 DATA 169,41,168,169,128,145,204,230,204,145,204,198,204,152,24,105,2175
1250 DATA 8,144,239,162,215,189,0,83,9,5,157,0,83,232,224,224,8913
1260 DATA 208,243,162,10,173,10,210,240,251,157,32,62,173,10,210,240,1099
1270 DATA 251,157,56,62,202,16,237,169,48,160,0,162,9,32,17,37,1756
1280 DATA 162,2,169,51,133,205,169,0,133,204,32,137,37,201,6,144,6157
1290 DATA 38,24,105,64,160,0,145,204,32,137,37,141,57,80,32,79,2756
1300 DATA 37,141,58,80,169,13,56,237,58,80,24,109,57,80,24,101,2055
1310 DATA 204,176,61,133,204,144,211,141,26,80,165,204,201,254,176,202,4408
1320 DATA 173,26,80,41,254,105,64,160,0,145,204,24,105,1,200,145,6258
1330 DATA 204,32,137,37,141,57,80,32,79,37,141,58,80,169,14,56,1860
1340 DATA 237,58,80,24,109,57,80,24,101,204,176,4,133,204,144,154,7810
1350 DATA 230,205,230,205,202,16,143,169,49,133,205,169,0,133,204,160,495
1360 DATA 0,169,208,145,204,200,169,81,145,204,200,32,131,37,24,105,7143
1370 DATA 3,141,26,80,169,82,145,204,200,204,26,80,208,248,169,83,1162
1380 DATA 145,204,200,169,212,145,204,200,152,24,101,204,133,204,32,137,591
1390 DATA 37,109,201,60,109,201,60,105,32,24,101,204,176,6,133,204,7217
1400 DATA 201,240,144,187,162,3,169,0,133,204,169,49,133,205,160,0,7955
1410 DATA 177,204,230,205,145,204,198,205,200,192,48,208,243,230,205,230,8358
1420 DATA 205,202,16,234,169,2,141,169,61,169,3,141,217,61,162,4,6342
1430 DATA 173,10,210,41,3,240,249,201,3,240,245,157,168,61,201,1,298
1440 DATA 208,7,169,4,157,240,61,208,5,169,0,157,240,61,169,0,6629
1450 DATA 157,8,62,232,224,11,208,216,162,4,32,137,37,105,1,157,5079
1460 DATA 216,61,173,10,210,201,48,144,5,41,3,157,216,61,232,224,9199
1470 DATA 11,208,231,169,48,141,48,2,169,61,141,49,2,32,57,36,879
1480 DATA 169,158,141,0,2,169,37,141,1,2,160,30,162,38,169,7,2233
1490 DATA 32,92,228,169,63,141,47,2,208,47,173,43,80,240,2,208,7091
1500 DATA 40,173,31,208,201,7,208,22,173,30,80,162,0,142,30,80,3889
1510 DATA 201,5,208,3,76,106,32,201,6,208,6,76,15,33,141,30,1569
1520 DATA 80,173,35,80,240,212,76,49,33,32,85,37,32,68,37,169,2390
1530 DATA 48,141,62,80,169,126,141,28,80,32,31,36,173,17,80,240,4518
1540 DATA 20,206,218,59,173,218,59,201,16,208,10,162,18,32,247,36,6297
1550 DATA 169,255,141,25,80,169,87,141,41,80,169,152,141,22,80,169,6800
1560 DATA 125,141,53,80,169,108,141,193,2,169,149,141,192,2,32,143,6801
1570 DATA 37,141,38,80,141,17,80,141,24,80,141,14,80,141,44,80,2507
1580 DATA 141,16,80,141,43,80,141,10,80,169,255,141,21,80,169,1,5170
1590 DATA 141,20,80,141,36,80,173,201,60,24,105,192,141,223,60,173,8916
1600 DATA 201,60,201,25,208,12,169,209,141,249,60,169,208,141,250,60,2426
1610 DATA 208,11,24,105,193,141,250,60,169,208,141,249,60,173,25,80,9370
1620 DATA 208,20,162,6,32,247,36,169,0,141,64,80,169,255,141,37,7172
1630 DATA 80,169,180,141,63,80,32,179,36,76,20,35,172,34,80,216,4695
1640 DATA 174,12,80,189,87,71,24,105,1,201,26,176,12,157,87,71,3915
1650 DATA 136,208,237,169,255,141,36,80,96,24,233,9,157,87,71,202,7933
1660 DATA 16,225,76,20,35,169,84,160,0,162,2,32,17,37,96,162,2288
1670 DATA 17,169,0,157,0,208,202,16,250,96,69,79,37,78,96,162,5965
1680 DATA 119,189,80,62,157,200,62,157,64,63,224,70,240,12,224,46,8234
1690 DATA 240,8,224,22,240,4,202,16,232,96,160,10,173,97,71,41,5728
1700 DATA 15,10,10,10,10,77,97,71,10,41,247,93,80,62,157,200,5360
1710 DATA 62,157,64,63,202,136,16,228,48,199,169,0,133,224,169,68,9061
1720 DATA 133,225,169,12,133,226,169,68,133,227,96,173,10,210,41,24,7274
1730 DATA 72,29,0,84,157,0,84,104,29,0,85,157,0,85,238,23,2609
1740 DATA 80,238,23,80,96,173,10,210,172,18,80,192,1,208,5,41,4521
1750 DATA 3,76,138,36,41,192,76,138,36,173,28,80,141,0,208,141,5987
1760 DATA 1,208,24,105,3,141,6,208,174,62,80,202,169,0,157,0,5278
1770 DATA 84,157,0,85,232,160,0,177,224,157,0,84,177,226,157,0,8458
1780 DATA 85,232,200,192,12,208,240,173,36,80,240,16,162,7,189,87,8456
1790 DATA 71,157,8,48,202,16,247,169,0,141,36,80,96,160,0,189,5856
1800 DATA 112,61,153,88,61,232,200,192,6,208,244,96,169,0,162,25,8475
1810 DATA 157,116,87,202,16,250,96,133,205,132,204,169,0,168,145,204,1812
1820 DATA 200,208,251,230,205,202,208,246,96,141,26,80,32,125,37,208,9339
1830 DATA 21,173,26,80,141,26,80,142,27,80,162,7,42,110,26,80,1817
1840 DATA 202,16,249,174,27,80,173,26,80,96,169,0,162,7,157,1,3665
1850 DATA 210,202,16,250,96,173,201,60,41,15,96,174,62,80,232,232,9698
1860 DATA 160,35,169,207,61,0,83,157,0,83,202,136,208,244,169,0,8906
1870 DATA 141,5,80,141,4,80,141,6,80,141,32,80,141,7,210,32,3395
1880 DATA 116,36,96,173,10,210,41,1,96,173,10,210,41,7,96,173,4716
1890 DATA 10,210,41,15,96,169,0,141,31,80,141,0,80,141,3,80,2094
1900 DATA 141,2,80,96,72,138,72,166,202,141,10,212,189,160,63,141,9469
1910 DATA 26,208,189,240,61,141,4,212,141,10,212,189,88,63,141,23,7232
1920 DATA 208,189,112,63,141,24,208,189,136,63,141,25,208,189,64,63,7934
1930 DATA 141,22,208,189,32,62,240,16,141,10,212,141,7,208,189,32,7578
1940 DATA 62,24,125,56,62,141,10,212,141,7,208,230,202,189,9,71,8501
1950 DATA 141,10,212,141,27,208,224,2,208,6,173,2,208,141,33,80,6590
1960 DATA 224,11,208,9,173,48,80,32,52,36,141,21,208,104,170,104,5840
1970 DATA 64,72,169,54,32,52,36,141,22,208,104,64,173,9,210,141,6724
1980 DATA 252,2,104,64,173,43,80,240,3,76,138,47,169,0,133,202,6700
1990 DATA 141,18,80,173,37,80,240,3,76,138,47,173,25,80,240,13,5378
2000 DATA 173,132,2,208,5,104,104,76,15,33,76,211,47,173,13,80,3601
2010 DATA 208,3,76,211,38,238,15,80,173,15,80,201,56,144,18,201,6888
2020 DATA 224,144,61,162,18,142,25,80,32,247,36,32,68,37,76,138,3408
2030 DATA 47,162,3,32,43,36,162,12,189,40,63,24,105,1,41,15,9515
2040 DATA 9,112,157,40,63,157,160,63,141,0,210,105,32,141,2,210,6404
2050 DATA 169,207,141,1,210,141,3,210,232,224,19,208,219,76,138,47,423
2060 DATA 162,119,173,42,80,41,15,93,200,62,157,200,62,157,64,63,6161
2070 DATA 169,15,141,1,210,141,3,210,169,143,141,5,210,141,7,210,9024
2080 DATA 173,15,80,141,0,210,10,141,2,210,10,141,4,210,73,255,7632
2090 DATA 141,6,210,202,16,204,76,138,47,162,23,189,168,61,240,103,9471
2100 DATA 189,192,61,221,216,61,144,92,169,0,157,192,61,189,168,61,9417
2110 DATA 201,2,240,43,169,3,56,253,8,62,157,240,61,254,8,62,7246
2120 DATA 189,8,62,201,4,208,64,157,240,61,169,0,157,8,62,142,6271
2130 DATA 27,80,189,241,70,170,254,48,61,174,27,80,76,65,39,254,7473
2140 DATA 8,62,189,8,62,157,240,61,201,4,208,27,169,0,157,240,9144
2150 DATA 61,157,8,62,142,27,80,189,241,70,170,222,48,61,174,27,7664
2160 DATA 80,76,65,39,254,192,61,202,16,145,238,54,80,173,54,80,7620
2170 DATA 201,128,208,12,162,10,222,32,62,202,16,250,232,142,54,80,8827
2180 DATA 238,55,80,173,55,80,201,28,240,14,201,30,240,17,201,58,8018
2190 DATA 240,20,201,60,240,28,208,41,169,13,141,129,66,208,122,169,9519
2200 DATA 5,141,129,66,208,115,169,13,141,134,66,169,184,141,165,66,9415
2210 DATA 208,103,169,5,141,134,66,169,168,141,165,66,169,0,141,55,7195
2220 DATA 80,238,8,80,173,8,80,201,40,240,6,201,60,240,12,208,9087
2230 DATA 23,169,2,141,113,63,141,114,63,208,62,169,40,141,113,63,6557
2240 DATA 141,114,63,169,0,141,8,80,238,9,80,173,9,80,201,56,5352
2250 DATA 240,6,201,72,240,17,208,33,169,127,141,244,67,169,247,141,2883
2260 DATA 202,67,141,206,67,208,18,169,63,141,244,67,169,243,141,202,3315
2270 DATA 67,141,206,67,169,0,141,9,80,173,17,80,240,3,76,148,5676
2280 DATA 41,173,31,80,208,122,173,62,80,201,192,208,3,76,219,40,8925
2290 DATA 205,53,80,176,3,76,26,41,238,24,80,173,24,80,201,10,4471
2300 DATA 208,59,169,0,141,24,80,173,14,80,240,4,169,255,208,3,8475
2310 DATA 173,120,2,77,20,80,41,1,208,12,206,59,80,208,30,169,5984
2320 DATA 1,141,59,80,208,23,238,59,80,173,59,80,201,16,208,13,6640
2330 DATA 169,15,141,59,80,173,20,80,73,1,141,20,80,173,59,80,3491
2340 DATA 238,0,80,205,0,80,240,2,176,13,169,0,141,0,80,173,5188
2350 DATA 20,80,240,6,238,62,80,76,55,41,206,62,80,76,55,41,3504
2360 DATA 173,32,80,208,20,238,2,80,208,29,169,255,141,2,80,173,8761
2370 DATA 120,2,41,1,240,3,76,109,41,169,14,141,59,80,141,32,3662
2380 DATA 80,32,143,37,141,20,80,174,3,80,189,33,71,205,2,80,4283
2390 DATA 240,3,76,109,41,189,69,71,141,1,210,189,51,71,141,0,5319
2400 DATA 210,24,165,224,105,24,133,224,169,0,101,225,133,225,24,165,652
2410 DATA 226,105,24,133,226,169,0,101,227,133,227,238,3,80,76,109,9171
2420 DATA 41,173,20,80,208,3,76,18,40,173,59,80,201,11,144,42,4219
2430 DATA 173,32,80,208,37,173,28,80,201,129,176,30,169,124,205,28,8649
2440 DATA 80,176,23,169,6,141,12,80,141,31,80,32,79,37,141,34,2264
2450 DATA 80,238,34,80,32,246,35,76,109,41,238,17,80,76,109,41,4525
2460 DATA 169,1,141,20,80,169,8,141,59,80,173,14,80,208,33,173,6349
2470 DATA 120,2,41,1,240,29,173,120,2,41,2,240,28,173,14,80,3872
2480 DATA 208,14,173,120,2,41,4,240,22,173,120,2,41,8,240,25,3836
2490 DATA 76,109,41,206,62,80,76,55,41,238,62,80,76,55,41,206,5553
2500 DATA 28,80,169,1,141,18,80,208,10,238,28,80,169,2,141,18,4602
2510 DATA 80,208,0,173,62,80,201,37,176,5,169,37,141,62,80,173,6797
2520 DATA 28,80,201,38,176,5,169,38,141,28,80,169,209,205,28,80,7604
2530 DATA 176,5,169,209,141,28,80,32,179,36,173,45,80,208,113,238,9617
2540 DATA 46,80,240,3,76,134,42,32,125,37,240,3,76,134,42,32,3389
2550 DATA 125,37,240,7,169,1,141,49,80,208,5,169,254,141,49,80,7901
2560 DATA 32,131,37,240,251,141,52,80,173,10,210,9,8,141,48,80,5183
2570 DATA 32,137,37,205,96,71,176,2,144,3,173,96,71,10,10,10,1715
2580 DATA 170,160,0,189,200,69,153,126,87,232,200,192,8,208,244,169,4306
2590 DATA 0,141,47,80,141,7,80,141,60,80,169,255,141,45,80,32,6202
2600 DATA 131,37,208,7,169,255,141,56,80,208,5,169,0,141,56,80,6244
2610 DATA 238,47,80,173,47,80,205,52,80,208,113,173,50,80,208,80,8729
2620 DATA 173,29,80,56,233,128,16,5,73,255,24,105,1,141,60,80,4298
2630 DATA 169,255,56,237,60,80,74,74,74,74,74,141,60,80,238,7,5809
2640 DATA 80,173,7,80,201,11,144,26,201,12,144,7,169,0,141,7,3715
2650 DATA 80,240,29,169,160,13,60,80,141,3,210,169,16,141,2,210,7120
2660 DATA 208,14,173,60,80,74,9,128,141,3,210,169,16,141,2,210,6795
2670 DATA 169,0,141,47,80,173,29,80,24,109,49,80,141,29,80,141,4231
2680 DATA 3,208,208,8,169,0,141,45,80,141,3,210,173,56,80,240,8703
2690 DATA 3,238,48,80,238,39,80,173,39,80,201,56,208,18,169,0,6526
2700 DATA 141,39,80,238,40,80,173,40,80,201,255,208,3,141,13,80,7841
2710 DATA 173,40,80,201,128,144,36,173,66,80,208,31,32,125,37,13,4130
2720 DATA 42,80,208,23,173,10,210,201,38,176,2,144,247,201,209,144,2957
2730 DATA 2,176,241,141,2,208,169,255,141,66,80,173,31,80,208,28,8828
2740 DATA 238,23,80,173,23,80,201,113,144,18,169,0,141,23,80,206,6848
2750 DATA 21,80,208,8,141,1,210,169,255,141,14,80,173,13,80,240,9410
2760 DATA 12,173,41,80,24,105,32,141,4,208,76,68,45,173,40,80,4318
2770 DATA 74,74,74,24,109,41,80,141,4,208,173,14,80,240,14,174,7370
2780 DATA 22,80,202,142,5,208,169,0,141,53,80,240,13,173,21,80,6337
2790 DATA 74,74,74,24,109,22,80,141,5,208,173,31,80,208,20,173,7115
2800 DATA 32,80,240,15,173,17,80,208,10,173,132,2,208,5,169,255,9648
2810 DATA 141,5,80,173,5,80,208,3,76,114,44,238,4,80,173,4,4873
2820 DATA 80,201,1,240,3,76,56,44,169,0,141,4,80,173,10,208,5540
2830 DATA 41,8,240,34,238,50,80,169,5,141,12,80,173,56,80,240,7765
2840 DATA 3,206,12,80,32,79,37,141,34,80,238,34,80,32,246,35,5502
2850 DATA 76,26,44,76,32,44,173,62,80,201,136,176,246,173,2,208,861
2860 DATA 240,241,173,33,80,240,121,169,5,141,12,80,169,1,141,16,5401
2870 DATA 80,169,54,141,61,80,32,79,37,141,34,80,238,34,80,32,4014
2880 DATA 246,35,173,40,80,24,105,224,141,40,80,176,5,169,0,141,6294
2890 DATA 40,80,206,183,59,173,183,59,201,16,208,68,173,218,59,201,2001
2900 DATA 25,240,3,238,218,59,173,201,60,201,25,240,3,238,201,60,1680
2910 DATA 173,96,71,201,15,240,3,238,96,71,174,97,71,232,224,26,331
2920 DATA 208,2,162,16,142,97,71,32,68,37,141,64,80,169,120,141,6490
2930 DATA 10,80,141,63,80,141,37,80,162,12,32,247,36,76,138,47,5168
2940 DATA 32,85,37,76,142,44,238,6,80,169,42,141,7,210,173,6,6531
2950 DATA 80,141,6,210,201,32,208,6,32,85,37,76,142,44,174,62,5392
2960 DATA 80,232,232,169,207,61,0,83,157,0,83,202,172,6,80,200,8411
2970 DATA 169,207,224,35,208,6,32,85,37,76,142,44,61,0,83,141,3822
2980 DATA 26,80,169,48,45,10,210,240,249,13,26,80,157,0,83,202,7675
2990 DATA 136,208,221,169,207,61,0,83,173,12,208,13,13,208,41,12,4955
3000 DATA 208,15,173,62,80,201,128,176,11,173,5,208,13,4,208,240,9480
3010 DATA 3,238,17,80,32,137,37,9,171,141,194,2,173,17,80,240,7807
3020 DATA 3,76,68,45,173,31,80,208,102,173,14,80,240,3,76,68,5986
3030 DATA 45,173,120,2,41,15,201,15,240,85,41,3,201,2,240,6,5445
3040 DATA 201,1,240,19,208,28,173,62,80,24,105,9,170,32,133,36,4406
3050 DATA 232,32,133,36,76,220,44,174,62,80,232,32,133,36,202,32,7358
3060 DATA 133,36,173,18,80,240,10,173,62,80,24,105,5,170,32,159,5501
3070 DATA 36,173,1,80,73,255,141,1,80,208,34,173,44,80,201,8,6750
3080 DATA 240,3,238,44,80,141,1,210,169,24,141,0,210,208,14,173,9081
3090 DATA 44,80,240,9,206,44,80,173,44,80,141,1,210,238,19,80,7674
3100 DATA 173,19,80,201,64,208,7,169,0,141,19,80,240,28,201,48,7198
3110 DATA 176,24,172,62,80,200,200,173,2,80,205,34,71,176,6,205,8720
3120 DATA 33,71,144,1,200,169,66,153,0,85,173,50,80,208,3,76,5997
3130 DATA 217,45,169,0,141,56,80,169,31,141,48,80,32,6,37,238,4937
3140 DATA 51,80,173,51,80,201,56,144,25,32,6,37,169,0,141,3,2639
3150 DATA 208,141,29,80,141,50,80,141,51,80,141,45,80,141,3,210,6509
3160 DATA 240,93,173,10,210,41,24,168,162,7,173,51,80,201,16,144,7394
3170 DATA 11,201,40,176,7,169,1,141,11,208,208,33,169,64,237,51,8918
3180 DATA 80,141,2,210,169,8,141,3,210,169,0,141,11,208,185,72,8546
3190 DATA 70,32,35,37,157,126,87,200,202,16,243,48,34,169,80,56,7458
3200 DATA 237,51,80,141,2,210,169,15,141,3,210,138,10,170,185,72,8618
3210 DATA 70,32,35,37,157,118,87,157,119,87,200,202,202,16,239,173,2723
3220 DATA 66,80,208,3,76,109,46,238,65,80,173,65,80,201,108,208,212
3230 DATA 25,169,0,141,5,210,141,65,80,141,66,80,141,2,208,170,8466
3240 DATA 157,122,86,232,224,96,208,248,240,105,201,54,176,46,169,42,2171
3250 DATA 141,5,210,169,80,56,237,65,80,141,26,80,32,137,37,77,5119
3260 DATA 26,80,141,4,210,173,10,210,41,12,168,162,4,185,104,70,7326
3270 DATA 32,35,37,157,202,86,200,202,208,243,240,55,173,65,80,56,1510
3280 DATA 233,32,141,4,210,169,0,141,205,86,141,206,86,169,79,141,861
3290 DATA 5,210,170,173,10,210,41,31,168,185,120,70,157,123,86,157,9849
3300 DATA 124,86,157,125,86,157,126,86,200,152,41,31,168,202,202,202,2926
3310 DATA 202,16,230,173,50,80,208,8,173,15,208,240,3,238,50,80,9452
3320 DATA 173,16,80,240,34,201,1,208,22,206,61,80,173,61,80,240,9804
3330 DATA 14,74,74,9,64,141,7,210,169,32,141,6,210,208,8,169,8575
3340 DATA 0,141,16,80,141,7,210,173,17,80,208,3,76,134,47,238,8245
3350 DATA 38,80,169,48,24,109,38,80,141,0,210,173,38,80,201,24,6595
3360 DATA 144,28,201,48,176,3,76,28,47,201,80,144,59,201,120,144,8735
3370 DATA 5,169,255,141,43,80,169,0,141,1,210,76,134,47,32,179,7165
3380 DATA 36,169,10,141,1,210,173,10,210,41,24,168,174,62,80,232,9526
3390 DATA 169,7,141,11,80,185,72,70,32,35,37,32,138,36,232,200,7021
3400 DATA 206,11,80,16,240,76,134,47,32,31,36,160,3,206,44,80,4679
3410 DATA 240,13,136,16,248,173,44,80,74,74,74,74,141,1,210,76,6695
3420 DATA 134,47,169,15,141,1,210,169,0,141,44,80,169,15,141,192,8196
3430 DATA 2,141,193,2,173,28,80,56,233,4,141,0,208,24,105,8,4773
3440 DATA 141,1,208,169,0,141,11,80,173,62,80,56,233,4,170,173,8578
3450 DATA 10,210,41,48,168,185,152,70,157,0,84,232,200,238,11,80,267
3460 DATA 173,11,80,201,16,208,238,173,10,210,41,48,168,142,27,80,8151
3470 DATA 185,152,70,141,26,80,32,46,37,174,27,80,173,26,80,157,5590
3480 DATA 0,85,202,200,206,11,80,173,11,80,208,225,169,0,133,77,9407
3490 DATA 141,30,208,173,64,80,208,40,206,63,80,208,60,169,180,141,1545
3500 DATA 63,80,141,64,80,162,0,32,247,36,173,10,80,240,12,169,7920
3510 DATA 0,141,64,80,169,255,141,35,80,208,5,169,0,141,37,80,6638
3520 DATA 173,252,2,201,33,208,18,32,68,37,173,37,80,73,255,141,8274
3530 DATA 37,80,208,5,162,119,32,57,36,169,255,141,252,2,173,10,9145
3540 DATA 210,141,42,80,173,37,80,13,25,80,240,14,162,119,189,200,9869
3550 DATA 62,32,52,36,157,64,63,202,16,244,76,98,228,0,58,223,9200
3560 DATA 59,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,764
3570 DATA 85,90,92,89,127,127,127,127,127,127,127,127,127,127,127,127,469
3580 DATA 127,127,127,127,127,127,127,87,91,92,88,127,127,127,127,127,9429
3590 DATA 127,127,127,127,127,127,127,127,127,85,91,92,88,127,87,91,7943
3600 DATA 94,96,98,98,92,88,87,89,127,127,127,127,85,91,92,89,7398
3610 DATA 127,127,127,127,127,86,90,94,96,98,100,92,88,86,91,92,6646
3620 DATA 89,92,89,85,90,92,88,86,91,95,96,98,97,101,102,93,6500
3630 DATA 94,96,100,97,105,106,95,99,92,89,86,90,94,96,100,99,6616
3640 DATA 92,88,127,85,90,95,94,95,96,97,99,105,106,93,96,98,6938
3650 DATA 98,105,106,93,96,105,106,94,95,93,96,97,100,99,98,103,7061
3660 DATA 104,96,105,106,94,93,94,98,105,106,93,95,96,96,97,99,6964
3670 DATA 98,97,101,102,93,93,95,96,96,105,106,94,95,94,96,97,6880
3680 DATA 99,107,107,108,107,107,108,108,108,107,108,109,110,111,110,111,8491
3690 DATA 109,108,108,107,108,107,108,110,107,108,108,107,107,108,109,111,8414
3700 DATA 110,111,111,109,107,108,108,107,108,107,108,108,107,107,108,109,8375
3710 DATA 111,112,114,113,114,112,113,114,112,114,114,113,114,112,114,112,9094
3720 DATA 114,112,114,113,114,112,113,114,112,113,114,112,114,113,112,113,9085
3730 DATA 112,114,112,114,112,113,114,112,114,113,114,112,114,112,114,114,9132
3740 DATA 112,115,116,117,115,116,125,115,116,115,116,117,116,115,117,115,9551
3750 DATA 125,115,117,115,116,117,115,116,115,126,126,115,117,116,117,125,9892
3760 DATA 116,116,115,117,116,117,116,116,116,117,115,125,115,115,116,117,9639
3770 DATA 125,125,119,120,125,118,125,125,118,125,125,125,119,120,125,125,479
3780 DATA 125,120,118,125,120,125,125,121,122,123,124,121,125,125,125,120,506
3790 DATA 125,125,125,125,125,125,118,125,125,125,125,119,125,125,125,125,669
3800 DATA 125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,800
3810 DATA 125,125,125,125,125,125,125,125,125,126,126,125,125,125,125,125,831
3820 DATA 125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,820
3830 DATA 125,0,0,0,0,0,35,26,16,0,50,33,36,51,7,1,6801
3840 DATA 3,4,3,5,3,4,3,6,0,0,38,53,37,44,7,1,6260
3850 DATA 3,4,3,5,3,4,3,6,0,48,26,16,0,0,0,0,4956
3860 DATA 0,168,60,167,61,192,192,226,249,192,228,239,245,231,236,225,2749
3870 DATA 243,192,229,238,231,229,236,192,192,0,0,0,0,0,0,44,4285
3880 DATA 37,54,37,44,26,0,16,0,0,0,0,0,0,192,192,192,3194
3890 DATA 192,192,192,192,192,236,229,246,229,236,218,192,208,192,192,192,2224
3900 DATA 192,192,192,192,192,192,192,192,192,192,237,245,236,244,233,240,3826
3910 DATA 236,233,229,242,218,192,208,208,192,192,192,192,192,192,192,192,829
3920 DATA 192,192,192,192,231,225,237,229,192,192,239,246,229,242,192,192,3382
3930 DATA 192,192,192,192,192,192,192,192,192,236,229,246,229,236,192,227,3194
3940 DATA 239,237,240,236,229,244,229,228,192,192,192,192,192,176,112,112,8849
3950 DATA 214,0,48,16,212,0,49,212,128,48,212,128,48,212,64,55,8403
3960 DATA 212,192,53,212,64,51,212,192,53,212,64,51,212,192,55,212,2783
3970 DATA 0,53,212,128,48,212,128,48,212,128,48,212,0,58,132,132,9180
3980 DATA 132,132,132,132,132,132,32,82,176,59,65,48,61,212,128,128,8826
3990 DATA 212,128,128,214,208,60,214,232,60,214,24,61,212,128,48,214,2820
4000 DATA 0,61,212,128,48,112,112,112,112,112,68,224,59,4,4,4,4373
4010 DATA 4,112,134,112,112,112,112,112,6,112,112,112,112,112,112,112,8246
4020 DATA 112,112,65,136,61,80,62,199,62,202,164,164,2,2,2,2,4372
4030 DATA 2,2,2,2,2,50,50,50,50,50,50,50,50,50,50,50,110
4040 DATA 2,36,162,162,4,4,4,4,4,4,4,4,4,4,52,52,7240
4050 DATA 52,52,52,52,52,52,52,52,10,6,6,6,6,6,6,6,6558
4060 DATA 6,6,6,6,6,6,54,54,54,54,54,54,54,54,54,54,396
4070 DATA 80,64,142,142,64,64,64,64,64,64,64,64,64,72,72,64,3568
4080 DATA 64,64,64,64,64,64,64,143,143,0,0,0,0,0,0,0,8303
4090 DATA 0,0,0,0,0,128,130,132,134,136,138,140,142,30,30,30,5784
4100 DATA 80,0,64,63,64,0,0,0,0,0,0,0,0,0,0,192,8016
4110 DATA 192,192,192,204,255,0,0,0,0,0,0,0,0,0,0,0,7353
4120 DATA 0,0,192,204,255,0,0,0,0,192,192,204,255,0,0,0,6582
4130 DATA 192,192,192,204,255,0,12,222,204,192,192,192,192,0,0,30,381
4140 DATA 0,0,0,0,0,0,66,97,71,0,3,15,47,59,59,47,9304
4150 DATA 5,0,64,144,164,228,228,144,64,0,15,59,31,62,59,61,4440
4160 DATA 15,0,84,229,121,249,249,229,84,0,12,63,190,238,254,62,3265
4170 DATA 10,0,0,64,80,80,144,80,64,0,20,233,249,249,233,20,1094
4180 DATA 0,0,16,228,228,228,16,0,0,0,0,32,228,228,228,32,8232
4190 DATA 0,0,40,249,121,249,249,185,37,0,244,249,249,164,16,0,2406
4200 DATA 0,0,0,0,0,13,9,5,0,0,0,0,53,57,45,41,7199
4210 DATA 5,0,0,56,57,41,36,16,0,0,56,56,36,0,0,0,7106
4220 DATA 0,0,0,8,57,57,41,37,5,0,5,5,0,0,5,5,5777
4230 DATA 0,192,84,90,170,170,84,84,192,12,42,170,149,149,170,42,9951
4240 DATA 12,3,10,169,169,170,170,10,3,0,128,96,88,168,168,128,8750
4250 DATA 0,0,0,0,0,0,3,14,62,0,0,0,0,0,3,15,5226
4260 DATA 59,0,0,0,0,0,3,15,61,0,0,0,0,64,80,148,9473
4270 DATA 89,0,0,0,0,64,80,148,85,0,3,14,63,254,254,187,8630
4280 DATA 238,0,3,15,61,255,247,191,254,64,80,148,85,85,89,149,1275
4290 DATA 86,190,235,190,234,190,187,238,187,254,255,254,238,187,234,238,4850
4300 DATA 170,254,251,222,238,187,250,238,186,186,250,190,250,235,238,251,5275
4310 DATA 174,153,165,165,166,166,106,153,154,166,153,169,150,105,165,153,4837
4320 DATA 85,89,150,101,89,150,105,86,101,89,150,89,101,85,89,153,9008
4330 DATA 102,64,83,155,85,85,89,85,86,251,186,255,234,126,90,86,3589
4340 DATA 101,126,95,151,89,85,89,149,101,250,238,255,254,123,94,150,6273
4350 DATA 101,153,169,149,101,149,151,95,189,89,151,95,126,239,255,190,6317
4360 DATA 255,255,190,239,255,187,255,190,255,254,191,251,191,238,255,251,5957
4370 DATA 191,170,186,255,238,255,251,191,255,170,170,238,255,251,191,239,4723
4380 DATA 254,170,170,251,255,191,254,239,187,255,187,255,255,238,255,255,6501
4390 DATA 239,255,191,255,251,191,255,254,239,191,254,255,255,251,255,239,7343
4400 DATA 254,255,255,235,255,255,255,250,255,175,255,255,255,250,255,255,8089
4410 DATA 255,255,255,255,235,255,255,255,175,255,255,239,187,239,255,255,6970
4420 DATA 255,255,175,255,255,255,251,238,251,255,255,251,255,255,255,239,8356
4430 DATA 255,255,255,243,255,255,255,243,255,255,255,253,213,214,213,245,7032
4440 DATA 255,255,213,89,89,170,89,89,85,255,255,95,85,165,85,87,2342
4450 DATA 127,255,255,255,255,255,255,255,255,255,251,255,255,63,255,255,6270
4460 DATA 255,0,0,0,0,0,0,0,0,0,36,126,126,36,36,0,9305
4470 DATA 0,24,0,0,0,0,0,0,0,0,0,60,126,66,66,231,2486
4480 DATA 0,0,0,36,126,126,36,36,0,0,24,0,0,0,0,0,6814
4490 DATA 0,0,0,0,60,126,66,231,0,0,36,126,126,36,36,0,2446
4500 DATA 0,24,0,0,0,0,0,0,0,0,0,60,126,66,66,231,2516
4510 DATA 0,0,36,126,126,36,36,0,0,0,0,0,0,0,0,0,6220
4520 DATA 0,0,0,36,102,66,66,231,0,0,36,126,126,36,36,0,2470
4530 DATA 0,0,0,0,0,0,0,0,0,0,0,36,66,66,66,231,1430
4540 DATA 0,0,36,126,126,36,36,0,0,0,0,24,0,0,0,0,6538
4550 DATA 0,0,0,36,66,66,66,255,0,0,36,126,126,36,36,0,2512
4560 DATA 0,0,24,24,0,0,0,0,0,0,0,36,66,66,90,255,2372
4570 DATA 0,0,36,126,126,36,36,0,0,24,24,8,0,0,0,0,6880
4580 DATA 0,0,0,36,66,90,90,231,0,0,36,126,126,36,36,0,2662
4590 DATA 24,24,8,16,0,0,0,0,0,0,0,36,90,90,66,231,2298
4600 DATA 0,0,36,126,126,36,36,24,24,8,16,8,0,0,0,0,7070
4610 DATA 0,0,0,60,90,66,66,231,0,0,36,126,126,36,60,24,3340
4620 DATA 8,16,8,16,0,0,0,0,0,0,24,60,66,66,66,231,2200
4630 DATA 0,0,36,126,126,60,60,8,16,8,16,8,0,0,0,0,7212
4640 DATA 0,24,24,36,66,66,66,231,0,0,36,126,126,60,60,0,3226
4650 DATA 8,16,8,16,0,0,0,0,0,24,24,36,66,66,66,231,2182
4660 DATA 0,0,36,126,126,60,60,0,0,8,16,8,0,0,0,0,7034
4670 DATA 0,24,24,36,66,66,66,231,0,0,36,126,126,60,60,0,3256
4680 DATA 0,0,8,16,0,0,0,0,0,24,24,36,66,66,66,231,2172
4690 DATA 0,0,36,126,126,60,60,0,0,0,0,8,0,0,0,0,6808
4700 DATA 0,24,24,36,66,66,66,231,0,0,36,126,126,60,60,0,3286
4710 DATA 0,0,0,0,0,0,0,0,0,24,24,36,66,66,66,231,2114
4720 DATA 0,0,36,126,126,60,60,0,0,0,0,0,0,0,0,0,6742
4730 DATA 0,24,24,36,102,66,66,231,0,0,36,126,126,60,60,0,3496
4740 DATA 0,24,0,0,0,0,0,0,0,24,24,60,126,66,66,231,3260
4750 DATA 0,0,68,40,16,56,56,56,16,14,206,100,63,63,100,206,6617
4760 DATA 14,54,73,28,62,62,28,42,73,34,28,28,127,127,8,8,1745
4770 DATA 20,8,28,28,28,8,62,8,20,0,255,24,255,24,24,36,3548
4780 DATA 0,7,7,164,127,164,7,7,0,40,16,16,56,56,16,16,9971
4790 DATA 40,0,0,60,153,126,153,60,0,16,84,56,124,56,84,16,3810
4800 DATA 40,0,0,26,188,127,188,26,0,16,56,18,60,60,18,56,1948
4810 DATA 16,16,16,124,56,16,84,56,84,129,90,60,102,102,60,90,5664
4820 DATA 129,0,28,62,85,62,28,0,0,0,0,0,219,126,24,0,1245
4830 DATA 0,0,36,8,24,72,2,16,0,0,66,40,52,16,68,0,8790
4840 DATA 16,4,64,40,20,57,60,80,2,128,37,30,44,154,33,72,3158
4850 DATA 2,64,49,132,0,131,90,0,4,68,132,65,18,130,44,17,3005
4860 DATA 64,4,8,16,16,16,32,64,128,64,64,32,16,8,8,4,9316
4870 DATA 2,2,4,8,16,16,8,4,4,2,1,1,2,4,8,8,5593
4880 DATA 4,1,0,40,2,4,31,38,15,21,15,75,5,19,0,66,8398
4890 DATA 0,32,0,68,1,18,5,139,27,78,11,6,35,0,0,1,8173
4900 DATA 0,128,0,17,0,10,5,27,7,43,13,39,11,6,64,0,7826
4910 DATA 2,0,10,16,0,85,0,5,2,139,5,3,35,1,128,8,9572
4920 DATA 0,7,142,57,39,160,4,81,69,72,32,7,145,65,135,32,4528
4930 DATA 4,81,69,64,128,4,78,57,47,32,4,8,11,14,17,20,9022
4940 DATA 23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,2148
4950 DATA 71,75,34,34,34,34,34,34,34,34,34,34,34,34,34,33,9677
4960 DATA 33,33,33,33,33,33,33,33,49,49,10,20,56,64,80,88,1661
4970 DATA 96,104,112,120,128,136,144,152,160,168,200,208,32,32,0,56,9346
4980 DATA 48,95,93,91,89,88,88,89,91,93,95,48,56,0,136,128,6348
4990 DATA 0,72,72,40,40,40,40,40,40,40,40,40,40,72,72,0,838
5000 DATA 16,16,16,16,16,16,16,16,16,0,0,226,2,227,2,0,1666
5010 DATA 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5042

Listing 2.
Assembly listing.

; *********************
; *     ROCKS!        *
; *                   *
; *  BY DOUGLAS ENGEL *
; *                   *
; *********************
;
; OS EQUATES
;
ATRACT	=	$4D
AUDC1	=	$D201
AUDC2	=	$D203
AUDC3	=	$D205
AUDC4	=	$D207
AUDCTL	=	$D208
AUDF1	=	$D200
AUDF2	=	$D202
AUDF3	=	$D204
AUDF4	=	$D206
CH	=	$02FC
CHBAS	=	$02F4
COLOR0	=	$02C4
COLOR4	=	$02C8
COLPF0	=	$D016
COLPM0	=	$D012
COLRSH	=	$4F
CONSOL	=	$D01F
DRKMSK	=	$4E
GRACTL	=	$D01D
HITCLR	=	$D01E
HPOSP0	=	$D000
HPOSP1	=	$D001
HPOSP2	=	$D002
HPOSP3	=	$D003
HPOSM0	=	$D004
HSCROL	=	$D404
KBCODE	=	$D209
M2PF	=	$D002
M2PL	=	$D00A
NMIEN	=	$D40E
P0PF	=	$D004
P0PL	=	$D00C
P1PF	=	$D005
P1PL	=	$D00D
P3PL	=	$D00F
PCOLR0	=	$02C0
PMBASE	=	$D407
PRIOR	=	$D01B
RANDOM	=	$D20A
RUNAD	=	$02E0
SDLSTL	=	$0230
SDMCTL	=	$022F
SETVBV	=	$E45C
SIZEP0	=	$D008
SKCTL	=	$D20F
STICK0	=	$0278
STRIG0	=	$0284
VDSLST	=	$0200
VKEYBD	=	$0208
WSYNC	=	$D40A
XITVBV	=	$E462
;
; PROGRAM EQUATES
;
MISSLES	=	PMTABL+768	;PM missles
PLAYER0	=	PMTABL+1024	;PM players 0 & 1
PLAYER1	=	PMTABL+1280
PMSATS	=	PMTABL+1918	;PM for sats
PMTABL	=	$5000	;Loc. of table
PMZAP	=	PMSATS-180	;PM for zap
SCOREBOARD	=	SCREEN+$08	;Print score here
SCREEN	=	$3000	;Screen mem.
;
; PROGRAM VARIABLES
;
	*=	PMTABL
ACCOUNT	*=	*+1	;Velocity counter
ALT	*=	*+1	;1/30 sec counter
ANIMATE	*=	*+1	;Animation counter
ANIPTR	*=	*+1	;Offset to frame values
BEAMDLAY	*=	*+1	;Delay counter
BEAMFLG	*=	*+1	;Flags beam on
BEAMPOS	*=	*+1	;Beam length
BLEEP	*=	*+1	;Decay
BLINK	*=	*+1	;Light counter
BLINK1	*=	*+1	;Ditto
COMPLETED	*=	*+1	;Level done flag
COWNTER	*=	*+1	;Explosion counter
DIGIT	*=	*+1	;Current score dig.
DOOM	*=	*+1	;Doom flag
EMPTY	*=	*+1	;No fuel flag
ENDCNTR	*=	*+1	;Doom counter
ETC.	*=	*+1	;Misc. sound flag
EXPLOSION	*=	*+1	;Flag
FD	*=	*+1	;Flame dir.
FLASHME	*=	*+1	;Light counter
FLIP	*=	*+1	;Direction mask
FUEL	*=	*+1	;Amount of fuel
FUELMTR	*=	*+1	;Offset to needle
FUELUSE	*=	*+1	;Rate of use
GRAVITY	*=	*+1	;Counter for veloc. change
G.O	*=	*+1	;Game over flag
HOLDA	*=	*+1	;Temp accumulator
HOLDX	*=	*+1	;Temp index reg.
HPOSME	*=	*+1	;My horiz.
HPOSSAT	*=	*+1	;Sat horiz.
KONSOL	*=	*+1	;Former consol val.
LANDFLAG	*=	*+1	;Flag landing
LOADED	*=	*+1	;Flag  loaded
MISS	*=	*+1	;M2PF shadow (sort of)
MULTIPLY	*=	*+1	;Multiplier
NEWLEV	*=	*+1	;Next level flag
NEWSC	*=	*+1	;Flag show score
PAUSED	*=	*+1	;Pause flag
POWNTER	*=	*+1	;Explosion counter
RADCOUNT	*=	*+1	;Rate of rad increase
RADS	*=	*+1	;Amount of rads
RADSMTR	*=	*+1	;Offset to needle
RAND1	*=	*+1	;Saved random #
RESET	*=	*+1	;Set up me flag
ROAR	*=	*+1	;Rocket decay
SAT?	*=	*+1	;Active sat flag
SATCNT	*=	*+1	;Time between sats counter
SATCNT1	*=	*+1	;Sat move counter
SATCOLR	*=	*+1	;Color of sat
SATDIR	*=	*+1	;Move direction
SATEXP	*=	*+1	;Sat explosion flag
SATFRAME	*=	*+1	;Sat explosion counter
SATSPD	*=	*+1	;Speed of sat
SKY	*=	*+1	;Where fall happens
STARCNT	*=	*+1	;Star move counter
STROBE	*=	*+1	;Light counter
SUPER	*=	*+1	;Super sat flag
TEMPA	*=	*+1	;Temporary
TEMPB	*=	*+1	;Temporary
VELOCITY	*=	*+1	;Fall veloc.
VOL	*=	*+1	;Decay
VOL4	*=	*+1	;Decay
VPOSME	*=	*+1	;My vert.
WAITCNTR	*=	*+1	;Message delay
WAITING	*=	*+1	;Message flag
ZAPCNT	*=	*+1	;Zap counter
ZAPFLAG	*=	*+1	;Flags zap
;
; ZERO PAGE EQUATES
;
LINENO	=	$CA	;Current DL mode line
SHAPEA	=	$E0	;Player 0 bit pattern
SHAPEB	=	$E2	;same for Player 1
ZEROPA	=	$CC	;General usage
ZEROPB	=	$CE	;same here
;
; PROGRAM
;
	*=	$2000
START	LDA	#$03	;Init serial port
	STA	SKCTL
	LDA	#<INKEY	;Steal KB vector
	STA	VKEYBD
	LDA	#>INKEY
	STA	VKEYBD+1
	LDA	#$1D	;Star color
	STA	PCOLR0+3
	LDA	#$00	;Init sound
	STA	AUDCTL
;
; Move portion of chars
;
	STA	ZEROPA	;Clear these
	STA	ZEROPB
	LDA	CHBAS	;Point to chars
	STA	ZEROPA+1
	LDA	#>CHARS	;Point to mine
	STA	ZEROPB+1
	LDY	#$40	;16 already defined
	LDX	#$01
CHLOOP	LDA	(ZEROPA),Y	;Move 'em
	STA	(ZEROPB),Y
	INY
	BNE	CHLOOP
	INC	ZEROPA+1
	INC	ZEROPB+1
	DEX
	BPL	CHLOOP
	LDA	#>CHARS	;Tell OS where they went
	STA	CHBAS
;
; Draw title
;
	LDY	#$00
	LDX	#$00
BITBLT	LDA	BITS,X	;Grab title byte
	STA	HOLDA	;Save it
	STX	HOLDX	;Save x
	LDX	#$07	;Rotate byte 8 times
SHFT	LDA	HOLDA
	ASL	A
	STA	HOLDA
	BCC	CC	;See if 0 falls out
	LDA	#$49	;No, load Rock char
	BNE	PLOT	;Always
CC	LDA	#$00	;Space char
PLOT	STA	TITLE,Y	;Store in screen mem.
	INY
	DEX
	BPL	SHFT
	LDX	HOLDX	;Get next byte
	INX
	CPX	#$19
	BNE	BITBLT	;Go back until done
SETUP	LDA	#$40	;DLI off
	STA	NMIEN
	LDA	#$00	;DMA off
	STA	SDMCTL
	LDY	#<XITVBV	;VBI off
	LDX	#>XITVBV
	LDA	#$07
	JSR	SETVBV
	LDA	#<DLIST1	;New DL vectors
	STA	SDLSTL
	LDA	#>DLIST1
	STA	SDLSTL+1
CDLI1	LDA	#<DLI1	;New DLI vector
	STA	VDSLST
	LDA	#>DLI1
	STA	VDSLST+1
	LDA	#$C0	;DLI on
	STA	NMIEN
	JSR	INITPM	;Clear PM regs.
	JSR	SILENT	;No sound
	STA	ATRACT	;No attract
	STA	COLOR0+4	;Black
	LDA	#$02
	STA	COLOR0	;Dk grey
	LDA	#$04
	STA	COLOR0+1	;Grey
	LDA	#$06
	STA	COLOR0+2	;Lt grey
	LDA	#$86
	STA	COLOR0+3	;Blue
	LDA	SLEVEL	;Use start level
	STA	LEVEL
	LDA	#$22	;Screen DMA on
	STA	SDMCTL
;
INPUT	LDA	CONSOL	;Consol input
	CMP	#$07	;No key, try again
	BEQ	INPUT
	STA	ATRACT	;Off
SEL	CMP	#$05	;Select?
	BNE	STA
	INC	LEVEL	;Update level
	LDA	LEVEL
	CMP	#$1A	;Insure wrap at 10
	BNE	DEBOUNCE
	LDA	#$10
	STA	LEVEL
	BNE	DEBOUNCE	;Always
STA	CMP	#$06	;Start?
	BNE	INPUT
LG	LDA	CONSOL	;Wait for release
	CMP	#$07
	BNE	LG
	BEQ	UNPRESS	;Always
DEBOUNCE	STA	SLEVEL	;New start level
	LDX	#$40	;Debounce delay
	LDY	#$00
ASIA	INY
	BNE	ASIA
	DEX
	BNE	ASIA
BOINK	LDX	#$70	;Wait for release
	LDY	#$00
PRESSED	LDA	TEMPA	;Waste time
	INY
	BNE	PRESSED
	LDA	CONSOL	;Let go, go back
	CMP	#$07
	BEQ	INPUT
	DEX
	BNE	PRESSED
	JMP	INPUT	;go back now
;
UNPRESS	LDA	#$00
	STA	SDMCTL
	STA	TOTAL	;Levels done=0
	STA	ATRACT	;Off
CLRSCR	LDX	#$07	;Put ATASCII 0's in score
	LDA	#$10
GEM	STA	SCORE,X
	DEX
	BPL	GEM
	LDA	#$13	;ATASCII 3 ships
	STA	SHIPS
	LDA	SLEVEL	;Start at start level
	STA	LEVEL
	STA	PAINT	;Planet color mask
;
INIT	LDA	#>PMTABL	;Clear all those vars
	LDY	#<PMTABL
	LDX	#$01
	JSR	CLEER	;Use this routine
	JSR	SILENT	;Sound off
	JSR	INITPM	;Reset PM regs.
	LDA	#$05	;Make sure that we
	STA	CHARS+641	;Start with original
	STA	CHARS+646	;Char shapes
	LDA	#$A8
	STA	CHARS+677
	LDA	#$15
	STA	CANISTERS
	STA	PAUSED	;Start paused
ACROSS	LDA	#$03	;PM on
	STA	GRACTL
	LDA	#>PMTABL	;Tell OS where pm is
	STA	PMBASE
	LDA	#$00	;Clear scroll tables
	LDX	#$A7
CLR	STA	SCRLST,X
	DEX
	BPL	CLR
	LDA	#>MISSLES	;Clear PM area
	LDY	#<MISSLES
	LDX	#$05
	JSR	CLEER
	LDA	#>MISSLES	;Put stars in missile 3
	STA	ZEROPA+1
	LDA	#<MISSLES
	STA	ZEROPA
	LDA	#$29	;Starting line
SPOT	TAY
	LDA	#$80	;Put $80
	STA	(ZEROPA),Y	; on 2 consecutive
	INC	ZEROPA	; bytes
	STA	(ZEROPA),Y
	DEC	ZEROPA
	TYA
	CLC
	ADC	#$08	;Then skip 8 bytes
	BCC	SPOT	; and put in more
;
	LDX	#$D7	;Draw guage needles
NEEDLE	LDA	MISSLES,X
	ORA	#$05	;Missiles 0 & 1
	STA	MISSLES,X
	INX
	CPX	#$E0
	BNE	NEEDLE
;
	LDX	#$0A	;Create random distances
STARS	LDA	RANDOM	; between the horiz.
	BEQ	STARS	; positions of the consecutive
	STA	MPOS,X	; star bits.
OFS	LDA	RANDOM
	BEQ	OFS
	STA	OFFSET,X
	DEX
	BPL	STARS
;
FIELDCLR	LDA	#>SCREEN	;Clear asteroid field
	LDY	#<SCREEN
	LDX	#$09
	JSR	CLEER
;
; Put rock chars on screen
;
	LDX	#$02
	LDA	#>SCREEN+768	;Start location
	STA	ZEROPA+1
ROCKS	LDA	#$00
	STA	ZEROPA	;Start at 0
ASTRO	JSR	R16	;Random #
	CMP	#$06	;<6?
	BCC	DOUBLE	;Yes, make big rock
	CLC
	ADC	#$40	;Offset to char code
	LDY	#$00
	STA	(ZEROPA),Y	;Put in char
	JSR	R16	;Find spacing for next rock
	STA	TEMPA
	JSR	GETLEV	;Based on level
	STA	TEMPB
	LDA	#$0D	;By subtracting level from 14
	SEC
	SBC	TEMPB
	CLC
	ADC	TEMPA	; and adding random #
	CLC
	ADC	ZEROPA	;Point to new spot
	BCS	COMPLE	;Done at page end
	STA	ZEROPA
	BCC	ASTRO	;Always
DOUBLE	STA	HOLDA	;Save
	LDA	ZEROPA	;See if near page end
	CMP	#$FE
	BCS	ASTRO	;Too close try again
	LDA	HOLDA	;Get char code
	AND	#$FE	;Make even
	ADC	#$40	;Char offset
	LDY	#$00
	STA	(ZEROPA),Y	;Put in mem
	CLC
	ADC	#$01	;Next char
	INY
	STA	(ZEROPA),Y	; goes in next byte
	JSR	R16	;Random spacing by level again.
	STA	TEMPA
	JSR	GETLEV
	STA	TEMPB
	LDA	#$0E
	SEC
	SBC	TEMPB
	CLC
	ADC	TEMPA
	CLC
	ADC	ZEROPA
	BCS	COMPLE
	STA	ZEROPA
	BCC	ASTRO
COMPLE	INC	ZEROPA+1	;Point to next page
	INC	ZEROPA+1
	DEX
	BPL	ROCKS	;Do more
;
; Put fleet on screen
	LDA	#>SCREEN+256	;Set addr.
	STA	ZEROPA+1
	LDA	#<SCREEN+256
	STA	ZEROPA
PUTSHP	LDY	#$00	;Set index
	LDA	#$D0	;Rear char code
	STA	(ZEROPA),Y	;Place
	INY		;Next byte
	LDA	#$51	;Engines char
	STA	(ZEROPA),Y	;Place
	INY		;Next
	JSR	R07	;Random # <=7 but >3
	CLC
	ADC	#$03
	STA	HOLDA
	LDA	#$52	;Pod back char
SHIP	STA	(ZEROPA),Y
	INY		;Next
	CPY	HOLDA	;Done enough?
	BNE	SHIP
	LDA	#$53	;Bridge char
	STA	(ZEROPA),Y
	INY		;Next
	LDA	#$D4	;Nose char
	STA	(ZEROPA),Y
	INY
	TYA
	CLC
	ADC	ZEROPA	;Start addr is now at
	STA	ZEROPA	;Front of ship
	JSR	R16	;Spacing = 2*level+Rnd
	ADC	LEVEL
	ADC	LEVEL
	ADC	#$20	;+ $20
	CLC
	ADC	ZEROPA	;Add to start
	BCS	OVER	;Page done?
	STA	ZEROPA	;See if too close to
	CMP	#$F0	;Page boundary
	BCC	PUTSHP
;
; Copy for scroll wrap
;
OVER	LDX	#$03	;# of pages
	LDA	#<SCREEN+256	Set up
	STA	ZEROPA
	LDA	#>SCREEN+256
	STA	ZEROPA+1
WRAP	LDY	#$00	;# of bytes moved
COPY	LDA	(ZEROPA),Y	;Get one
	INC	ZEROPA+1	;Put on next page
	STA	(ZEROPA),Y
	DEC	ZEROPA+1	;Point to ogir. page
	INY
	CPY	#$30
	BNE	COPY	;Done?
	INC	ZEROPA+1	;Skip a page
	INC	ZEROPA+1
	DEX		;Done?
	BPL	WRAP
;
;Random scroll directions and speeds
;
	LDA	#$02
	STA	SCRLST+1	;Fleet dir
	LDA	#$03
	STA	LIMIT+1	;Fleet speed
	LDX	#$04
SETDIR	LDA	RANDOM	;Random rock dir
	AND	#$03
	BEQ	SETDIR	;no 0's
	CMP	#$03	;no 3's
	BEQ	SETDIR
	STA	SCRLST,X
	CMP	#$01	;Set counter
	BNE	RD	; to right value
	LDA	#$04	; for left
	STA	CURR,X
	BNE	ZC	;Always
RD	LDA	#$00	;Also for right
	STA	CURR,X
ZC	LDA	#$00	;Set 0 color clocks
	STA	COLCKS,X
	INX
	CPX	#$0B	;Done?
	BNE	SETDIR
SPEED	LDX	#$04	;Set 5 (speed) counters
SETSPD	JSR	R16	;Random # 1-16
	ADC	#$01
	STA	LIMIT,X	;Store it
	LDA	RANDOM	;Bias the speeds
	CMP	#$30	; if <$30
	BCC	CONTIN
	AND	#$03	;High speed
	STA	LIMIT,X
CONTIN	INX
	CPX	#$0B	;Done?
	BNE	SETSPD
;
	LDA	#<DLIST	;New DL vector
	STA	SDLSTL
	LDA	#>DLIST
	STA	SDLSTL+1
	JSR	OLDC	;Set color table
CDLI	LDA	#<DLI	;New DLI vector
	STA	VDSLST
	LDA	#>DLI
	STA	VDSLST+1
	LDY	#<VBLANK	;New VBI vector
	LDX	#>VBLANK
	LDA	#$07
	JSR	SETVBV
FAT	LDA	#$3F	;Wide screen DMA
	STA	SDMCTL
	BNE	RESETME	;Always
;
; PROGRAM LOOP
;
LOOP	LDA	RESET	;Reset flag?
	BEQ	SPCLKEYS	;No, check consol
	BNE	RESETME	;Yes, reset
SPCLKEYS	LDA	CONSOL	;Get consol
	CMP	#$07	;Any pressed
	BNE	AAAAAC	;Yes, go ahead
	LDA	KONSOL	;No, get former
	LDX	#$00
	STX	KONSOL	;Clear it
SEL1	CMP	#$05	;Select?
	BNE	STA1
	JMP	SETUP	;Go to title screen
STA1	CMP	#$06	;Start?
	BNE	AAAAAB
	JMP	UNPRESS	;Restart game
AAAAAC	STA	KONSOL	;Save Console in former
AAAAAB	LDA	NEWLEV	;Check for new level
	BEQ	LOOP
	JMP	INIT	;Start new level
;
RESETME	JSR	BEAMOFF	;No beam
	JSR	SILENT	;No sound
	LDA	#$30	;Init my positions
	STA	VPOSME
	LDA	#$7E
	STA	HPOSME
	JSR	CLRME	;Erase me
	LDA	EXPLOSION	;See if I exploded
	BEQ	RS232	;No? skip this
SUBTRACT	DEC	SHIPS	;Another on bites the dust
	LDA	SHIPS	;Any left?
	CMP	#$10
	BNE	RS232	;Yes skip this
	LDX	#$12	;Game over message and flag
	JSR	DLPRINT
	LDA	#$FF
	STA	G.O
RS232	LDA	#$57	;Reset all variables
	STA	RADSMTR
	LDA	#$98
	STA	FUELMTR
	LDA	#$7D
	STA	SKY
	LDA	#$6C
	STA	PCOLR0+1
	LDA	#$95
	STA	PCOLR0
	JSR	FLAGS	;Reset landed flags
	STA	POWNTER
	STA	EXPLOSION
	STA	GRAVITY
	STA	EMPTY
	STA	ROAR
	STA	ETC.
	STA	RESET
	STA	COMPLETED
	LDA	#$FF	;Fill 'er up
	STA	FUEL
	LDA	#$01
	STA	FLIP
	STA	NEWSC	;Flag new score
	LDA	LEVEL	;Get right ATASCII value
	CLC		; for displaying level
	ADC	#$C0
	STA	PLEVEL
	LDA	LEVEL	;Find multiplier
	CMP	#$19	;If level<9 then
	BNE	ONEDIGIT	;Mult. <10
	LDA	#$D1	;Mult must be 10
	STA	PMULT	;Show "1"
	LDA	#$D0
	STA	PMULT+1	;Show "0"
	BNE	THX1138	;Always
ONEDIGIT	CLC		;Mult. = level+1
	ADC	#$C1	;+$C0 for correct ATASCII
	STA	PMULT+1
	LDA	#$D0
	STA	PMULT	;" " in second digit
THX1138	LDA	G.O	;See if game over
	BNE	NEO
	LDX	#$06	;Yes, show message
	JSR	DLPRINT
	LDA	#$00
	STA	WAITING
	LDA	#$FF	;Permanent pause
	STA	PAUSED
	LDA	#$B4
	STA	WAITCNTR
NEO	JSR	SHOW	;Show me
	JMP	LOOP	;Back to main
;
; SUBROUTINE LIBRARY
;
; routine to find score
;
MATH	LDY	MULTIPLY	;# of iterations
	CLD
STEP	LDX	DIGIT	;Digit to operate on
ADDNUM	LDA	SCORE,X	;Current val
	CLC
	ADC	#$01	;+1 for each iteration
	CMP	#$1A	;Over 10?
	BCS	NEXTPLACE	;Yes, next digit
FIN	STA	SCORE,X	;New val
	DEY		;Next
	BNE	STEP	;Another iteration
	LDA	#$FF
	STA	NEWSC	;Flag score
	RTS		;Done!
NEXTPLACE	CLC		;Sub 9 from val
	SBC	#$09
	STA	SCORE,X	;Save
	DEX		;Next higher digit
	BPL	ADDNUM	;Always
EGG	JMP	LOOP	;Easter egg could go here
;
;Routine to clear me form PM table
;
CLRME	LDA	#>PLAYER0
	LDY	#<PLAYER0
	LDX	#$02
	JSR	CLEER
	RTS
;
; PM register clear routine
;
INITPM	LDX	#$11	;17 registers
INITP	LDA	#$00	;Entry point if other than 17
IPM	STA	HPOSP0,X
	DEX
	BPL	IPM
	RTS
;
; Routine for color attracting
;
MIXUP	EOR	COLRSH
	AND	DRKMSK
	RTS
;
; Routint to initialize color tables
;
OLDC	LDX	#$77
SETCOLR	LDA	COLTAB,X	;Orig color
	STA	ACOLTAB,X	;Attract table
	STA	DCOLTAB,X	;Display table
	CPX	#$46
	BEQ	CHANGE	;Test to see if color in question
	CPX	#$2E
	BEQ	CHANGE	; is a planet color
	CPX	#$16
	BEQ	CHANGE	; and alter it
	DEX
	BPL	SETCOLR	;Done?
	RTS		;Return
CHANGE	LDY	#$0A	;Change next 11
SILLY	LDA	PAINT	;Get mask
	AND	#$0F	;Make lower bits high
	ASL	A
	ASL	A
	ASL	A
	ASL	A
	EOR	PAINT	;Scramble it
	ASL	A	;Scramble more
	AND	#$F7	;Mask high intensity
	EOR	COLTAB,X	;Use it to scramble colors
	STA	ACOLTAB,X
	STA	DCOLTAB,X
	DEX
	DEY
	BPL	SILLY	;All done?
	BMI	SETCOLR	;NO, go back
;
; Routine to set my PM shape pointers
;
SETSHAPE	LDA	#<SHAPE1A	;Player 0
	STA	SHAPEA
	LDA	#>SHAPE1A
	STA	SHAPEA+1
	LDA	#<SHAPE1B	;Player 1
	STA	SHAPEB
	LDA	#>SHAPE1B
	STA	SHAPEB+1
	RTS
;
; Routine to put flames on ship
;
BURN	LDA	RANDOM	;Bits for top and bottom
	AND	#$18	;Flames here
PUT	PHA		;Entry point from side routine
	ORA	PLAYER0,X	;"OR" into player 0
	STA	PLAYER0,X
	PLA
	ORA	PLAYER1,X	;Ditto
	STA	PLAYER1,X
	INC	FUELUSE	;Rockets use fuel
	INC	FUELUSE
	RTS
;
BURN1	LDA	RANDOM	;Bits for side flames
	LDY	FD	;Mov.ng left or right
	CPY	#$01
	BNE	RF	;Right. skip this
	AND	#$03	;Mask bits
	JMP	PUT	;Show them
RF	AND	#$C0	;Mask bits
	JMP	PUT	;Show them
;
; Routine to show me
;
SHOW	LDA	HPOSME	;Set horiz. regs.
	STA	HPOSP0
	STA	HPOSP1
	CLC
	ADC	#$03	;+3 for beam horiz.
	STA	HPOSM0+2
	LDX	VPOSME	;My vert
	DEX
	LDA	#$00
	STA	PLAYER0,X	;Erase flames above
	STA	PLAYER1,X
	INX
	LDY	#$00
LPRINT	LDA	(SHAPEA),Y	;Move shape data
	STA	PLAYER0,X
	LDA	(SHAPEB),Y	;For both players
	STA	PLAYER1,X
	INX
	INY
	CPY	#$0C	;12 bytes?
	BNE	LPRINT
	LDA	NEWSC	;See if score updated
	BEQ	AAAAAD	;No, skip this
	LDX	#$07	;Yes, Put score in screen mem
RMK	LDA	SCORE,X
	STA	SCOREBOARD,X
	DEX
	BPL	RMK
	LDA	#$00	;Clear flag
	STA	NEWSC
AAAAAD	RTS		;Return
;
; Routine to display messages
; by altering Display list
;
DLPRINT	LDY	#$00	;Counter
LLLLLL	LDA	DLTABL,X	;New DL val
	STA	DLIST+40,Y	;Store
	INX
	INY
	CPY	#$06	;6 vals altered
	BNE	LLLLLL	;No, do,it again
	RTS
;
; Routine to clear satellites form PM table
;
CSAT	LDA	#$00
	LDX	#$19	;Zero 64 bytes
RUB	STA	PMSATS-10,X
	DEX
	BPL	RUB
	RTS
;
; General purpose clearing routine
;
CLEER	STA	ZEROPA+1	;Save high byte
	STY	ZEROPA	;Save low byte
	LDA	#$00	;X reg. is # of pages
	TAY
CLEAN	STA	(ZEROPA),Y	;Clear
	INY
	BNE	CLEAN
	INC	ZEROPA+1
	DEX
	BNE	CLEAN	;Do until done
	RTS
;
; Routine to mirror bits in a byte
;
MYRNA	STA	HOLDA	;Entry point for random mirror
	JSR	R01
	BNE	RET	;Don't mirror
	LDA	HOLDA
MIRROR	STA	HOLDA	;Entry point for mirror always
	STX	HOLDX	;Save x
	LDX	#$07	;8 bits
MM	ROL	A	;Rotate bit in carry
	ROR	HOLDA	;Rotate out reverse
	DEX
	BPL	MM	;Do all 8
	LDX	HOLDX	;Restore X & A
RET	LDA	HOLDA
	RTS		;Done!
;
; Routine to turn off sound
;
SILENT	LDA	#$00	;No explanation needed
	LDX	#$07
HUH	STA	AUDC1,X
	DEX
	BPL	HUH
	RTS
;
; Routine to get actual level
;
GETLEV	LDA	LEVEL
	AND	#$0F
	RTS
;
; Routine to erase beam
;
BEAMOFF	LDX	VPOSME	;Beam starts at me+2
	INX
	INX
	LDY	#$23	;Erase this much
OFFLOOP	LDA	#$CF
	AND	MISSLES,X
	STA	MISSLES,X
	DEX
	DEY
	BNE	OFFLOOP	;Do it all
	LDA	#$00	;Clear all beam flags
	STA	BEAMFLG
	STA	BEAMDLAY
	STA	BEAMPOS
	STA	LOADED
	STA	AUDC4
	JSR	SETSHAPE	;Set original shape
	RTS
;
; Random number routines
;
R01	LDA	RANDOM
	AND	#$01
	RTS
R07	LDA	RANDOM
	AND	#$07
	RTS
R16	LDA	RANDOM
	AND	#$0F
	RTS
;
; Landing flag clearing routine
;
FLAGS	LDA	#$00
	STA	LANDFLAG
	STA	ACCOUNT
	STA	ANIPTR
	STA	ANIMATE
	RTS
;
; DISPLAY LIST INTERRUPT ROUTINE
;         FOR GAME SCREEN
;
DLI	PHA		;Save 6502 regs.
	TXA
	PHA
	LDX	LINENO	;Current mode line
	STA	WSYNC
	LDA	DCOLTAB+96,X	;Background color
	STA	COLPF0+4
	LDA	CURR,X	;Current HSCROL val
	STA	HSCROL
	STA	WSYNC
	LDA	DCOLTAB+24,X	;Color1
	STA	COLPF0+1
	LDA	DCOLTAB+48,X	;Color2
	STA	COLPF0+2
	LDA	DCOLTAB+72,X	;Color3
	STA	COLPF0+3
	LDA	DCOLTAB,X	;Color0
	STA	COLPF0
	LDA	MPOS,X	;Stars on this line?
	BEQ	NOSTAR	;No? skip this
	STA	WSYNC
	STA	HPOSM0+3	;Horiz. pos. of star
	LDA	MPOS,X	;Find pos. of star next line
	CLC
	ADC	OFFSET,X
	STA	WSYNC	;Wait for next line
NOSTAR	STA	HPOSM0+3	;Save pos for it
	INC	LINENO
	LDA	PRITAB,X	;Set priority this line
	STA	WSYNC
	STA	PRIOR
	CPX	#$02	;Is it line #2?
	BNE	NADA	;No, skip
	LDA	M2PF	;Hold collisions for line
	STA	MISS
NADA	CPX	#$0B	;Line 11 yet?
	BNE	NAY	;No, skip
	LDA	SATCOLR	;Change color for sats
	JSR	MIXUP	;Attract them first
	STA	COLPM0+3
NAY	PLA		;Restore 6502
	TAX
	PLA
	RTI
;
; DISPLAY LIST INTERRUPT ROUTINE
;         FOR TITLE SCREEN
;
DLI1	PHA		;Save
	LDA	#$36	;Red
	JSR	MIXUP	;Attract
	STA	COLPF0	;Color0
	PLA		;Restore
	RTI
;
; KEYBOARD INTERRUPT ROUTINE
;
INKEY	LDA	KBCODE	;Key code (A saved by OS)
	STA	CH	;Save
	PLA		;Restore
	RTI
;
; COMMON LABELS
;
ACOLTAB	=	$3EC8
BITS	=	$46D8
CANISTERS	=	$3BB7
CHARS	=	$4000
COLCKS	=	$3E08
COLTAB	=	$3E50
CURR	=	$3DF0
DCOLTAB	=	$3F40
DLIST	=	$3D30
DLIST1	=	$3D88
DLTABL	=	$3D70
LEVEL	=	$3CC9
LIMIT	=	$3DD8
MPOS	=	$3E20
OFFSET	=	$3E38
PAINT	=	$4761
PLEVEL	=	$3CDF
PMULT	=	$3CF9
PRITAB	=	$4709
SCORE	=	$4757
SCRLST	=	$3DA8
SHAPE1A	=	$4400
SHAPE1B	=	$440C
SHIPS	=	$3BDA
SLEVEL	=	$475F
TITLE	=	$3BE0
TOTAL	=	$4760
VBLANK	=	$261E
	.END

Listing 3.
Assembly listing

;  ROCKS! VERTICAL BLANK
; ROUTINE AND DATA TABLES
;    By: Douglas Engel
;
; OS EQUATES
;
ATRACT	=	$4D
AUDC1	=	$D201
AUDC2	=	$D203
AUDC3	=	$D205
AUDC4	=	$D207
AUDCTL	=	$D208
AUDF1	=	$D200
AUDF2	=	$D202
AUDF3	=	$D204
AUDF4	=	$D206
CH	=	$02FC
HITCLR	=	$D01E
HPOSP0	=	$D000
HPOSP1	=	$D001
HPOSP2	=	$D002
HPOSP3	=	$D003
HPOSM0	=	$D004
M2PF	=	$D002
M2PL	=	$D00A
P0PF	=	$D004
P0PL	=	$D00C
P1PF	=	$D005
P1PL	=	$D00D
P3PL	=	$D00F
PCOLR0	=	$02C0
PRIOR	=	$D01B
RANDOM	=	$D20A
RUNAD	=	$02E0
SIZEP0	=	$D008
STICK0	=	$0278
STRIG0	=	$0284
XITVBV	=	$E462
;
;COMMON LABELS AND VARIABLES
;SEE PART 1 FOR DESCRIPTIONS
;
ACCOUNT	=	$5000
ALT	=	$5001
ANIMATE	=	$5002
ANIPTR	=	$5003
BEAMDLAY	=	$5004
BEAMFLG	=	$5005
BEAMOFF	=	$2555
BEAMPOS	=	$5006
BLEEP	=	$5007
BLINK	=	$5008
BLINK1	=	$5009
BURN	=	$2485
BURN1	=	$249F
CLRME	=	$241F
COMPLETED	=	$500A
COWNTER	=	$500B
CSAT	=	$2506
DIGIT	=	$500C
DLPRINT	=	$24F7
DOOM	=	$500D
EMPTY	=	$500E
ENDCNTR	=	$500F
ETC.	=	$5010
EXPLOSION	=	$5011
FD	=	$5012
FLAGS	=	$258F
FLASHME	=	$5013
FLIP	=	$5014
FUEL	=	$5015
FUELMTR	=	$5016
FUELUSE	=	$5017
GETLEV	=	$254F
GRAVITY	=	$5018
G.O	=	$5019
HOLDA	=	$501A
HOLDX	=	$501B
HPOSME	=	$501C
HPOSSAT	=	$501D
INITP	=	$242B
KONSOL	=	$501E
LANDFLAG	=	$501F
LINENO	=	$CA
LOADED	=	$5020
MATH	=	$23F6
MIRROR	=	$252E
MIXUP	=	$2434
MISS	=	$5021
MISSLES	=	PMTABL+768
MULTIPLY	=	$5022
MYRNA	=	$2523
NEWLEV	=	$5023
NEWSC	=	$5024
OLDC	=	$2439
PAUSED	=	$5025
PLAYER0	=	PMTABL+1024
PLAYER1	=	PMTABL+1280
PMSATS	=	PMTABL+1918
PMTABL	=	$5000
PMZAP	=	PMSATS-180
POWNTER	=	$5026
PUT	=	$248A
R01	=	$257D
R07	=	$2583
R16	=	$2589
RADCOUNT	=	$5027
RADS	=	$5028
RADSMTR	=	$5029
RAND1	=	$502A
RESETFLAG	=	$502B
ROAR	=	$502C
SAT?	=	$502D
SATCNT	=	$502E
SATCNT1	=	$502F
SATCOLR	=	$5030
SATDIR	=	$5031
SATEXP	=	$5032
SATFRAME	=	$5033
SATSPD	=	$5034
SHAPEA	=	$E0
SHAPEB	=	$E2
SHOW	=	$24B3
SILENT	=	$2544
SKY	=	$5035
STARCNT	=	$5036
START	=	$2000
STROBE	=	$5037
SUPER	=	$5038
UNPRESS	=	$210F
VELOCITY	=	$503B
VOL	=	$503C
VOL4	=	$503D
VPOSME	=	$503E
WAITCNTR	=	$503F
WAITING	=	$5040
ZAPCNT	=	$5041
ZAPFLAG	=	$5042
;
	*=	$261E	;Byte after Part 1
;
; VERTICAL BLANK ROUTINE
;
VBLANK	LDA	RESETFLAG	;Skip most during reset
	BEQ	READY
	JMP	TESTCH
READY	LDA	#$00
	STA	LINENO	;Point to !st line
	STA	FD	;Clear
	LDA	PAUSED	;Skip most if paused
	BEQ	FIN?
	JMP	TESTCH
FIN?	LDA	G.O	;Skip ahead if not over
	BEQ	DOOMSDAY
	LDA	STRIG0	;Trigger restarts
	BNE	BUSY
	PLA		;This breaks out of routine,
	PLA		; so, pull ret. addr.
	JMP	UNPRESS	; and jump back
BUSY	JMP	CLRCH
;
; Planet destruction routine
;
DOOMSDAY	LDA	DOOM	;Test for doom
	BNE	QW
	JMP	MOVEMENT	;No, skip this
QW	INC	ENDCNTR	;Count
	LDA	ENDCNTR	;Test and branch to
	CMP	#$38	; appropriate part of explosion
	BCC	PY0
	CMP	#$E0	;Maximum val?
	BCC	PY1	;No, skip
	LDX	#$12	;Set game over flags
	STX	G.O
	JSR	DLPRINT	;Print message
	JSR	SILENT	;Sound off
	JMP	TESTCH	;Skip rest
PY0	LDX	#$03	;0 all HPOS regs.
	JSR	INITP
	LDX	#$0C	;Increment sky colors
G	LDA	ACOLTAB+96,X
	CLC
	ADC	#$01
	AND	#$0F	;Make them only blue
	ORA	#$70
	STA	ACOLTAB+96,X
	STA	DCOLTAB+96,X
	STA	AUDF1	;Use val for sounds
	ADC	#$20
	STA	AUDF2
	LDA	#$CF	;Set audio control
	STA	AUDC1
	STA	AUDC2
	INX
	CPX	#$13	;Do all sky lines
	BNE	G
	JMP	TESTCH
PY1	LDX	#$77	;Flash all colors
G1	LDA	RAND1	;Random mask
	AND	#$0F	;Only intensity bits
	EOR	ACOLTAB,X
	STA	ACOLTAB,X
	STA	DCOLTAB,X
	LDA	#$0F	;Audio controls
	STA	AUDC1
	STA	AUDC2
	LDA	#$8F
	STA	AUDC3
	STA	AUDC4
	LDA	ENDCNTR	;Use counter for freq.
	STA	AUDF1
	ASL	A	;Freq *2
	STA	AUDF2
	ASL	A	;Freq *2
	STA	AUDF3
	EOR	#$FF	;Inverse
	STA	AUDF4	;Use as freq.
	DEX
	BPL	G1	;Do all colors
	JMP	TESTCH	;Skip ahead
;
; Scrolling routine
;
MOVEMENT	LDX	#$17	;Scrolling 24 lines
SCROLL	LDA	SCRLST,X	;Direction
	BEQ	NXTLIN	;0?, don't
	LDA	COUNT,X	;Speed counter
	CMP	LIMIT,X	;Is it max?
	BCC	INCCNT	;No, skip
	LDA	#$00
	STA	COUNT,X	;0 count
	LDA	SCRLST,X	;Check dir.
	CMP	#$02
	BEQ	RIGHT
LEFT	LDA	#$03	;Find #of color clocks
	SEC
	SBC	COLCKS,X
	STA	CURR,X	;Put in table
	INC	COLCKS,X
	LDA	COLCKS,X	;See if too many
	CMP	#$04
	BNE	NXTLIN
	STA	CURR,X	;Reset table
	LDA	#$00
	STA	COLCKS,X
	STX	HOLDX
	LDA	POINTR,X	;Find DL byte to change
	TAX
	INC	DLIST,X	;Change
	LDX	HOLDX
	JMP	NXTLIN	;Next line
RIGHT	INC	COLCKS,X	;Next color clock
	LDA	COLCKS,X	;Update table
	STA	CURR,X
	CMP	#$04	;See if too many
	BNE	NXTLIN
	LDA	#$00	;Reset table
	STA	CURR,X
	STA	COLCKS,X
	STX	HOLDX
	LDA	POINTR,X	;DL byte to alter
	TAX
	DEC	DLIST,X	;Alter
	LDX	HOLDX
	JMP	NXTLIN	;Next
INCCNT	INC	COUNT,X	;Inc. counter
NXTLIN	DEX		;Do rest of lines
	BPL	SCROLL
SKYLON	INC	STARCNT	;Star counter
	LDA	STARCNT	;Test max.
	CMP	#$80
	BNE	FLASH	;Not yet, skip
	LDX	#$0A
TIME	DEC	MPOS,X	;Change star pos.
	DEX
	BPL	TIME	;Do all lines
	INX
	STX	STARCNT
;
; Light flashing routines
;
FLASH	INC	STROBE	;Light counter
	LDA	STROBE
	CMP	#$1C	;Branch at each of these
	BEQ	YES1
	CMP	#$1E
	BEQ	NO1
	CMP	#$3A
	BEQ	YES
	CMP	#$3C
	BEQ	NO
	BNE	RUNING	;None of them, skip
YES1	LDA	#$0D	;On, alter char
	STA	CHARS+641
	BNE	MOVEME
NO1	LDA	#$05	;Off alter char
	STA	CHARS+641
	BNE	MOVEME
YES	LDA	#$0D	;On, alter these
	STA	CHARS+646
	LDA	#$B8
	STA	CHARS+677
	BNE	MOVEME
NO	LDA	#$05	;Off, alter these
	STA	CHARS+646
	LDA	#$A8
	STA	CHARS+677
	LDA	#$00
	STA	STROBE
RUNING	INC	BLINK	;Other light counter
	LDA	BLINK	;Branch at right vals.
	CMP	#$28
	BEQ	OFF
	CMP	#$3C
	BEQ	ON
	BNE	BASE
OFF	LDA	#$02	;Off, dark color
	STA	DCOLTAB+49
	STA	DCOLTAB+50
	BNE	MOVEME
ON	LDA	#$28	;On, light color
	STA	DCOLTAB+49
	STA	DCOLTAB+50
	LDA	#$00
	STA	BLINK	;Clear count
BASE	INC	BLINK1	;Base light counter
	LDA	BLINK1	;Branch at these
	CMP	#$38
	BEQ	DARK
	CMP	#$48
	BEQ	LIGHT
	BNE	MOVEME
DARK	LDA	#$7F	;Off, alter chars
	STA	CHARS+1012
	LDA	#$F7
	STA	CHARS+970
	STA	CHARS+974
	BNE	MOVEME
LIGHT	LDA	#$3F	;On, alter chars
	STA	CHARS+1012
	LDA	#$F3
	STA	CHARS+970
	STA	CHARS+974
	LDA	#$00
	STA	BLINK1
;
; Movement within atmosphere routine
;
MOVEME	LDA	EXPLOSION	;Skip if exploding
	BEQ	LUKE
	JMP	SPOCK
LUKE	LDA	LANDFLAG	;Skip if landed
	BNE	LANDED
	LDA	VPOSME	;Ground level?
	CMP	#$C0
	BNE	ABOVE
	JMP	GROUND
ABOVE	CMP	SKY	;In space?
	BCS	RISING
	JMP	SPACE
RISING	INC	GRAVITY	;Inc. count
	LDA	GRAVITY
	CMP	#$0A	;Max val?
	BNE	FALL
	LDA	#$00	;Yes, clear
	STA	GRAVITY
	LDA	EMPTY	;No fuel, no stick
	BEQ	JOY1
	LDA	#$FF
	BNE	NOJOY1	;Always
JOY1	LDA	STICK0
NOJOY1	EOR	FLIP	;Change stick for
	AND	#$01	;Up or down accel.
	BNE	DECEL
ACCEL	DEC	VELOCITY	;Move faster
	BNE	FALL	;Can't be <1
	LDA	#$01
	STA	VELOCITY
	BNE	FALL	;Always
DECEL	INC	VELOCITY	;Move slower
	LDA	VELOCITY
	CMP	#$10
	BNE	FALL	;At this slow we are
	LDA	#$0F	; reversing direction
	STA	VELOCITY
	LDA	FLIP
	EOR	#$01	;Flip to reverse dir.
	STA	FLIP
FALL	LDA	VELOCITY	;Counter
	INC	ACCOUNT
	CMP	ACCOUNT
	BEQ	OOOOOH
	BCS	JUMPIT
OOOOOH	LDA	#$00	;Clear them
	STA	ACCOUNT
	LDA	FLIP	;See if going up or down
	BEQ	DECRE
INCRE	INC	VPOSME	;Move down and jump
JUMPIT	JMP	SLEFT
DECRE	DEC	VPOSME	;Move up and jump
	JMP	SLEFT
;
; Landing routines
;
LANDED	LDA	LOADED	;Landed? Then skip
	BNE	BLASTOFF
	INC	ANIMATE	;Count
	BNE	NOSTK	;Not max
	LDA	#$FF	;Reset count
	STA	ANIMATE
	LDA	STICK0	;Wait for stick
	AND	#$01
	BEQ	BLASTOFF
	JMP	PRINT
BLASTOFF	LDA	#$0E	;Set vel.
	STA	VELOCITY
	STA	LOADED	;All loaded
	JSR	FLAGS	;Clear land flags
	STA	FLIP
NOSTK	LDX	ANIPTR	;Find frame val
	LDA	ANITAB,X	;There yet?
	CMP	ANIMATE
	BEQ	NEWFRAME	;Yes
	JMP	PRINT
NEWFRAME	LDA	NOIZE,X	;Get sound vals
	STA	AUDC1
	LDA	FREQ,X
	STA	AUDF1
	CLC
	LDA	SHAPEA	;Point to next frame
	ADC	#$18
	STA	SHAPEA	;Player0
	LDA	#$00	;+ carry
	ADC	SHAPEA+1
	STA	SHAPEA+1
	CLC
	LDA	SHAPEB	;Same, player1
	ADC	#$18
	STA	SHAPEB
	LDA	#$00
	ADC	SHAPEB+1
	STA	SHAPEB+1
	INC	ANIPTR	;Counter
	JMP	PRINT
GROUND	LDA	FLIP	;Up, or down motion?
	BNE	FALLING
	JMP	RISING
FALLING	LDA	VELOCITY	;Too fast, we crash
	CMP	#$0B
	BCC	CRASHED
	LDA	LOADED	;Crash if loaded
	BNE	CRASHED
	LDA	HPOSME	;Not on pad, crash
	CMP	#$81
	BCS	CRASHED
	LDA	#$7C
	CMP	HPOSME
	BCS	CRASHED
	LDA	#$06	;Landed! set flags
	STA	DIGIT
	STA	LANDFLAG
	JSR	GETLEV	;Give score
	STA	MULTIPLY
	INC	MULTIPLY
	JSR	MATH
	JMP	PRINT
CRASHED	INC	EXPLOSION	;Flag <> 0
	JMP	PRINT
;
; Movement in space routine
;
SPACE	LDA	#$01	;In space? reset Vars.
	STA	FLIP
	LDA	#$08
	STA	VELOCITY
;
;Test joystick for movement in space
;
SUP	LDA	EMPTY	;No fuel, no stick
	BNE	CCC
	LDA	STICK0	;Up?
	AND	#$01
	BEQ	MUP
SDOWN	LDA	STICK0	;Down?
	AND	#$02
	BEQ	MDOWN
SLEFT	LDA	EMPTY	;Out of fuel?
	BNE	CCC
	LDA	STICK0	;Left?
	AND	#$04
	BEQ	MLEFT
SRIGHT	LDA	STICK0	;Right
	AND	#$08
	BEQ	MRIGHT
CCC	JMP	PRINT	;No stick, skip
MUP	DEC	VPOSME	;Up.
	JMP	SLEFT	;Test for sideways
MDOWN	INC	VPOSME	;Down
	JMP	SLEFT	;Test for sideways
MLEFT	DEC	HPOSME	;Left
	LDA	#$01	;Flame direction flag
	STA	FD
	BNE	PRINT
MRIGHT	INC	HPOSME	;Right.
	LDA	#$02
	STA	FD
	BNE	PRINT
PRINT	LDA	VPOSME	;Test screen bounds
	CMP	#$25
	BCS	TESTL
	LDA	#$25
	STA	VPOSME
TESTL	LDA	HPOSME
	CMP	#$26
	BCS	TESTR
	LDA	#$26
	STA	HPOSME
TESTR	LDA	#$D1
	CMP	HPOSME
	BCS	DISPLAY
	LDA	#$D1
	STA	HPOSME
DISPLAY	JSR	SHOW	;Now we can show ship
;
; Sattelite creation routine
;
SPOCK	LDA	SAT?	;Move sat?
	BNE	SATMOV
	INC	SATCNT	;Delay between sats
	BEQ	T1
	JMP	NODIFF
T1	JSR	R01	;Random #
	BEQ	T2	;No sat this time
	JMP	NODIFF
T2	JSR	R01	;Dir to move
	BEQ	MINMAY
	LDA	#$01	;Right
	STA	SATDIR
	BNE	SDF1
MINMAY	LDA	#$FE	;Left
	STA	SATDIR
SDF1	JSR	R07	;Speed
	BEQ	SDF1	;<> 0
	STA	SATSPD
	LDA	RANDOM	;Color
	ORA	#$08
	STA	SATCOLR
	JSR	R16	;Random sat
	CMP	TOTAL	;Based on complete levels
	BCS	THAT
	BCC	THIS
THAT	LDA	TOTAL	;Use this for sat
THIS	ASL	A	;Otherwise Random
	ASL	A
	ASL	A
	TAX
	LDY	#$00
SATLP	LDA	ASATS,X	;Move shape to PM
	STA	PMSATS,Y
	INX
	INY
	CPY	#$08
	BNE	SATLP
	LDA	#$00	;Set flags and counters
	STA	SATCNT1
	STA	BLEEP
	STA	VOL
	LDA	#$FF
	STA	SAT?
	JSR	R07	;Is sat super
	BNE	WIMPY	;No, skip
	LDA	#$FF
	STA	SUPER
	BNE	SATMOV	;Always
WIMPY	LDA	#$00	;Not super
	STA	SUPER
;
; Sattelite movement
;
SATMOV	INC	SATCNT1	;Count to speed
	LDA	SATCNT1
	CMP	SATSPD
	BNE	NODIFF
	LDA	SATEXP	;Exploding? skip
	BNE	NSO
	LDA	HPOSSAT	;Sound for sat
	SEC
	SBC	#$80	;Louder at mid screen
	BPL	DIV
	EOR	#$FF
	CLC
	ADC	#$01
DIV	STA	VOL	;save
	LDA	#$FF	;Sub, since higher # is louder
	SEC
	SBC	VOL
	LSR	A	;Div to get ony vol bits
	LSR	A
	LSR	A
	LSR	A
	LSR	A
	STA	VOL
	INC	BLEEP	;Beep count
	LDA	BLEEP
	CMP	#$0B	;Beep between $0B & $0C
	BCC	NBL
	CMP	#$0C
	BCC	YBL
	LDA	#$00
	STA	BLEEP	;Clear
	BEQ	NSO	; Always
YBL	LDA	#$A0	;Beep sound
	ORA	VOL
	STA	AUDC2
	LDA	#$10
	STA	AUDF2
	BNE	NSO	;Always
NBL	LDA	VOL	;Rocket sound
	LSR	A
	ORA	#$80
	STA	AUDC2
	LDA	#$10
	STA	AUDF2
NSO	LDA	#$00
	STA	SATCNT1	;Clear
	LDA	HPOSSAT
	CLC
	ADC	SATDIR	;Move
	STA	HPOSSAT
	STA	HPOSP3
	BNE	NODIFF	;All the way across?
	LDA	#$00
	STA	SAT?	;Reset
	STA	AUDC2
NODIFF	LDA	SUPER	;Super?
	BEQ	WIERD	;No skip
	INC	SATCOLR	;Flash color
;
; Fuel and radiation routines
;
WIERD	INC	RADCOUNT	;Counter
	LDA	RADCOUNT
	CMP	#$38	;Max?
	BNE	THESAME
	LDA	#$00
	STA	RADCOUNT	;Clear
	INC	RADS	;More rads
	LDA	RADS
	CMP	#$FF	;Too many?
	BNE	THESAME
	STA	DOOM	;End of planet?
THESAME	LDA	RADS	;Enough rads to zap?
	CMP	#$80
	BCC	TWOMUCH
	LDA	ZAPFLAG	;Zap in progress?
	BNE	TWOMUCH
	JSR	R01	;Randomly zap
	ORA	RAND1
	BNE	TWOMUCH
RPO	LDA	RANDOM	;Get random spot
	CMP	#$26	;Within bounds?
	BCS	R.T
	BCC	RPO
R.T	CMP	#$D1
	BCC	BATMAN
	BCS	RPO
BATMAN	STA	HPOSP2	;Use this pos.
	LDA	#$FF
	STA	ZAPFLAG	;Do zap
TWOMUCH	LDA	LANDFLAG	;Landed? skip
	BNE	GUAGES
	INC	FUELUSE	;Use fuel
	LDA	FUELUSE
	CMP	#$71	;Limit?
	BCC	GUAGES
	LDA	#$00
	STA	FUELUSE	;Clear
	DEC	FUEL	;Move needle
	BNE	GUAGES	;Fuel left? skip
	STA	AUDC1	;No sound
	LDA	#$FF
	STA	EMPTY	;Flag empty
;
; Display guages routine
;
GUAGES	LDA	DOOM	;Test doom
	BEQ	R
	LDA	RADSMTR	;Pin the needle
	CLC
	ADC	#$20
	STA	HPOSM0	;Show needle
	JMP	BANGTEST
R	LDA	RADS	;Divide to get needle val
	LSR	A
	LSR	A
	LSR	A
	CLC
	ADC	RADSMTR	;+ offset
	STA	HPOSM0
TANK	LDA	EMPTY	;Empty?
	BEQ	F
	LDX	FUELMTR	;Zero needle
	DEX
	STX	HPOSM0+1	;Show needle
	LDA	#$00	;Raise sky so ship falls
	STA	SKY
	BEQ	N
F	LDA	FUEL	;Div. to get needle val
	LSR	A
	LSR	A
	LSR	A
	CLC
	ADC	FUELMTR	;Add offset
	STA	HPOSM0+1
;
; Transporter routine
;
N	LDA	LANDFLAG	;Landed? skip
	BNE	XPORTER
BUTTON	LDA	LOADED	;Not loaded? skip
	BEQ	XPORTER
	LDA	EXPLOSION	;Exploding? skip
	BNE	XPORTER
	LDA	STRIG0	;No button? skip
	BNE	XPORTER
	LDA	#$FF
	STA	BEAMFLG	;Flag beam
XPORTER	LDA	BEAMFLG	;Beaming in progress?
	BNE	ALREADY
	JMP	HITME
ALREADY	INC	BEAMDLAY	;Delay
	LDA	BEAMDLAY
	CMP	#$01	;Only 1/60 sec
	BEQ	PSPS
	JMP	NOACTION
PSPS	LDA	#$00
	STA	BEAMDLAY	;Clear
	LDA	M2PL	;Hit a sat?
	AND	#$08
	BEQ	SORRY	;No, skip
	INC	SATEXP	;Flag <>0
	LDA	#$05	;Give points
	STA	DIGIT
	LDA	SUPER
	BEQ	ASDFG
	DEC	DIGIT
ASDFG	JSR	GETLEV	;Based on level
	STA	MULTIPLY
	INC	MULTIPLY
	JSR	MATH
	JMP	NOTSHIP
JMPTAB	JMP	EXTEND	;Jump table
SORRY	LDA	VPOSME
	CMP	#$88	;If this low, it hit a mountain
	BCS	JMPTAB
	LDA	M2PF	;Hit anything?
	BEQ	JMPTAB
	LDA	MISS	;Was a hit on line 2?
	BEQ	NOTSHIP
	LDA	#$05	;If it gets here it hit fleet
	STA	DIGIT	; so give score
	LDA	#$01
	STA	ETC.
	LDA	#$36
	STA	VOL4
	JSR	GETLEV	;Based on level
	STA	MULTIPLY
	INC	MULTIPLY
	JSR	MATH
	LDA	RADS	;And decrease rads
	CLC
	ADC	#$E0
	STA	RADS
	BCS	MISFITS	;Can't be <0
	LDA	#$00
	STA	RADS	;So, make it 0
MISFITS	DEC	CANISTERS	;1 less can.
	LDA	CANISTERS	;All gone?
	CMP	#$10
	BNE	NOTSHIP
	LDA	SHIPS	;Level done, so give ship
	CMP	#$19	;But no more than 9
	BEQ	ENUF
	INC	SHIPS
ENUF	LDA	LEVEL	;Next level
	CMP	#$19	;No more than 9
	BEQ	CMPL
	INC	LEVEL
CMPL	LDA	TOTAL	;Inc total levels
	CMP	#$0F	;Not more than 15
	BEQ	ZYX
	INC	TOTAL
ZYX	LDX	PAINT	;Next planet color
	INX
	CPX	#$1A	;Wrap at 10
	BNE	XYZ
	LDX	#$10
XYZ	STX	PAINT
	JSR	SILENT	;No sound
	STA	WAITING	;Message delay on
	LDA	#$78
	STA	COMPLETED	;Flag done
	STA	WAITCNTR	; & wait
	STA	PAUSED	; & pause
	LDX	#$0C
	JSR	DLPRINT	;Print message
	JMP	TESTCH
NOTSHIP	JSR	BEAMOFF	;No valid hit
	JMP	LUMINATE	;Skip
EXTEND	INC	BEAMPOS	;Extend beam
	LDA	#$2A	;Beam sound
	STA	AUDC4
	LDA	BEAMPOS
	STA	AUDF4
	CMP	#$20	;Beam limit?
	BNE	NOACTION
	JSR	BEAMOFF	;Yes, off
	JMP	LUMINATE
NOACTION	LDX	VPOSME	;Draw beam at top+2
	INX
	INX
	LDA	#$CF
	AND	MISSLES,X	;clear end
	STA	MISSLES,X
	DEX
	LDY	BEAMPOS
	INY
BEAMLOOP	LDA	#$CF	;Beam mask
	CPX	#$23	;Hit top of screen
	BNE	NOT2HIGH
	JSR	BEAMOFF	;Yes, off
	JMP	LUMINATE
NOT2HIGH	AND	MISSLES,X	;Clear
	STA	HOLDA	;Save
NOTZERO	LDA	#$30	;Ok, random beam
	AND	RANDOM
	BEQ	NOTZERO
	ORA	HOLDA
	STA	MISSLES,X	;Draw it
	DEX
	DEY
	BNE	BEAMLOOP	;Do all of it
	LDA	#$CF
	AND	MISSLES,X	;Clear end
;
; Ship collision detection
;
HITME	LDA	P0PL	;My collision detection
	ORA	P1PL	;Sats and zaps detect
	AND	#$0C
	BNE	KAPOW	;Yes, explode
	LDA	VPOSME	;If this low, I hit mountain
	CMP	#$80
	BCS	LUMINATE
	LDA	P1PF	;Rocks and ships detect
	ORA	P0PF
	BEQ	LUMINATE	;No, skip
KAPOW	INC	EXPLOSION	;Flag <>0
LUMINATE	JSR	R16	;Random blue Zap & beam
	ORA	#$AB
	STA	PCOLR0+2
;
; Rocket flames routine
;
JETS	LDA	EXPLOSION	;No jets if exploded
	BEQ	DARTH
	JMP	BANGTEST
DARTH	LDA	LANDFLAG	;No jets if landed
	BNE	NOFL
	LDA	EMPTY	;No fuel, no jets
	BEQ	XVXV
	JMP	BANGTEST
XVXV	LDA	STICK0	;Stick determines dir.
	AND	#$0F
	CMP	#$0F
	BEQ	NOFL	;No sticks? skip
	AND	#$03
	CMP	#$02	;Test for up
	BEQ	UF
	CMP	#$01	;Test for down
	BEQ	DF
	BNE	SIDES	;Neither, try sides
UF	LDA	VPOSME	;Loc. to put flame
	CLC
	ADC	#$09
	TAX
	JSR	BURN	;Show flame
	INX
	JSR	BURN
	JMP	SIDES
DF	LDX	VPOSME	;Loc. to put flame
	INX
	JSR	BURN	;Show flame
	DEX
	JSR	BURN
SIDES	LDA	FD	;Side flame dir. flag
	BEQ	EFX	;No dir? skip
	LDA	VPOSME	;Location to put flame
	CLC
	ADC	#$05
	TAX
	JSR	BURN1	;Show it
EFX	LDA	ALT	;Flip 1/30 sec counter
	EOR	#$FF
	STA	ALT
	BNE	MYLT	;Skip every other VBLANK
	LDA	ROAR	;Test rocket sound
	CMP	#$08	;Not too loud
	BEQ	SO
	INC	ROAR	;Update and sound on
SO	STA	AUDC1
	LDA	#$18
	STA	AUDF1
	BNE	MYLT	;Always
NOFL	LDA	ROAR	;No flames? Quiet sound
	BEQ	MYLT	; until silent
	DEC	ROAR
	LDA	ROAR
	STA	AUDC1
MYLT	INC	FLASHME	;Light counter
	LDA	FLASHME	;Branch at right time
	CMP	#$40
	BNE	TBIRD
	LDA	#$00
	STA	FLASHME	;Reset count
	BEQ	BANGTEST
TBIRD	CMP	#$30	;Turn off time
	BCS	BANGTEST	;Yes, skip
	LDY	VPOSME	;Pos. of lights
	INY
	INY
	LDA	ANIMATE	;Less if landing
	CMP	ANITAB+1
	BCS	TALL
	CMP	ANITAB
	BCC	TALL
	INY
TALL	LDA	#$42	;Light Bit pattern
	STA	PLAYER1,Y	;Turn on
;
; Satellite explosion routines
;
BANGTEST	LDA	SATEXP	;Sat exploding
	BNE	YESSAT
	JMP	NOTASAT	;No, skip
YESSAT	LDA	#$00
	STA	SUPER	;Turn off supersat
	LDA	#$1F
	STA	SATCOLR	;Yellow explosion
	JSR	CSAT	;Clear sat
	INC	SATFRAME	;Explosion count
	LDA	SATFRAME
	CMP	#$38	;Branch if less than
	BCC	P1
	JSR	CSAT	;Explosion done. Clear it
	LDA	#$00	;Set pos to 0
	STA	HPOSP3
	STA	HPOSSAT
	STA	SATEXP	;Clear flags
	STA	SATFRAME
	STA	SAT?
	STA	AUDC2	;Sound off
	BEQ	NOTASAT	;Always
P1	LDA	RANDOM	;Make random explosion
	AND	#$18	;Mask wrong bits
	TAY
	LDX	#$07	;8 bytes of data
EXPLP1	LDA	SATFRAME	;Test counter
	CMP	#$10
	BCC	SMALLER	;If less do small shape
	CMP	#$28
	BCS	SMALLER	;If greater, do small
	LDA	#$01	;If between, make larger
	STA	SIZEP0+3	;Double width
	BNE	BIGGER	;Branch always
SMALLER	LDA	#$40	;Get sound in range
	SBC	SATFRAME	; by subtracting from 64
	STA	AUDF2	;Set audio
	LDA	#$08
	STA	AUDC2
	LDA	#$00
	STA	SIZEP0+3	;Make it narrow
TINY	LDA	EXPL1,Y	;Get byte
	JSR	MYRNA	;Random mirror
	STA	PMSATS,X	;Place it
	INY
	DEX
	BPL	TINY	;Do 8
	BMI	NOTASAT	;Always
BIGGER	LDA	#$50	;Get sound in range
	SEC		; by subtracting from 80
	SBC	SATFRAME
	STA	AUDF2	;Set audio
	LDA	#$0F
	STA	AUDC2
	TXA		;Multiply X*2
	ASL	A
	TAX		; and put it back
LARGER	LDA	EXPL1,Y	;Get byte
	JSR	MYRNA	;Randomly mirror
	STA	PMSATS-8,X	;Put on 2 lines
	STA	PMSATS-7,X	; for double height
	INY
	DEX		;Update twice for double lines
	DEX
	BPL	LARGER	;Do 16 lines
;
; Zap routine
;
NOTASAT	LDA	ZAPFLAG	;Do a zap?
	BNE	ZZZZT
	JMP	NOZAP	;No, skip
ZZZZT	INC	ZAPCNT	;Counter
	LDA	ZAPCNT	;Test max val.
	CMP	#$6C
	BNE	HUNTER	;No, skip
	LDA	#$00	;Zap is done, clear
	STA	AUDC3	; sound
	STA	ZAPCNT	; & flags
	STA	ZAPFLAG
	STA	HPOSP2	; & pos.
	TAX		; & clear PM zap area
PILL	STA	PMZAP-$50,X
	INX
	CPX	#$60
	BNE	PILL
	BEQ	NOZAP	;Always
HUNTER	CMP	#$36	;Test branches
	BCS	STRIKE	;>$36, skip
	LDA	#$2A	;Set for noise
	STA	AUDC3
	LDA	#$50	;Find freq.
	SEC
	SBC	ZAPCNT
	STA	HOLDA
	JSR	R16	;Randomize it
	EOR	HOLDA
	STA	AUDF3	;Sound it
	LDA	RANDOM	;Make random sparks
	AND	#$0C	;Set pointer
	TAY
	LDX	#$04	;4 lines of them
SPKLP	LDA	SPARKS,Y
	JSR	MYRNA	;Randomly mirror
	STA	PMZAP,X
	INY
	DEX
	BNE	SPKLP	;Do all 4
	BEQ	NOZAP	;Always
STRIKE	LDA	ZAPCNT	;Now make bolt
	SEC
	SBC	#$20	;Find sound freq.
	STA	AUDF3
	LDA	#$00	;Clear remaining sparks
	STA	PMZAP+3
	STA	PMZAP+4
	LDA	#$4F
	STA	AUDC3	;Set audio
	TAX		;Save X for later routine
	LDA	RANDOM	;Random starting pt.
	AND	#$1F	;Mask bits
	TAY
STRILP	LDA	BOLTS,Y
	STA	PMZAP-79,X	;Make 4 same lines
	STA	PMZAP-78,X
	STA	PMZAP-77,X
	STA	PMZAP-76,X
	INY
	TYA
	AND	#$1F	;Make y wrap at 32
	TAY
	DEX
	DEX
	DEX
	DEX
	BPL	STRILP	;Do 78 lines
NOZAP	LDA	SATEXP	;Sat exploding?
	BNE	SATOK	;Yes, skip
	LDA	P3PL	;Sat zapped?
	BEQ	SATOK
	INC	SATEXP	;Yes, Flag it
;
; Misc. sound routine
;
SATOK	LDA	ETC.	;Test misc sound flag
	BEQ	TE	;0?, skip
	CMP	#$01	;Branch to right place
	BNE	UE
	DEC	VOL4	;This is Boing sound decay
	LDA	VOL4
	BEQ	UE	;Until 0
	LSR	A
	LSR	A
	ORA	#$40	;Set distortion
	STA	AUDC4	;Use it
	LDA	#$20
	STA	AUDF4	;This freq.
	BNE	TE	;Always
UE	LDA	#$00
	STA	ETC.	;Clear flag
	STA	AUDC4	;Off sound
;
; Ship explosion routine
;
TE	LDA	EXPLOSION	;Test my exp. flag
	BNE	SHABOOM
	JMP	NOATR	;No, Skip
SHABOOM	INC	POWNTER	;Counter
	LDA	#$30	;Get freq. range
	CLC
	ADC	POWNTER	; by adding $30
	STA	AUDF1
	LDA	POWNTER	;Test branches
	CMP	#$18
	BCC	OVERLAP
	CMP	#$30
	BCS	TA
	JMP	ENGULF
TA	CMP	#$50
	BCC	CATCHUP
	CMP	#$78	;No branches?
	BCC	SLNT
	LDA	#$FF
	STA	RESETFLAG	;Done? reset me
SLNT	LDA	#$00	;My sound off
	STA	AUDC1
	JMP	NOATR
OVERLAP	JSR	SHOW	;Show me
	LDA	#$0A	;Set audio
	STA	AUDC1
	LDA	RANDOM	;Find rand. expl. data
	AND	#$18
	TAY
	LDX	VPOSME	;My position
	INX
	LDA	#$07
	STA	COWNTER
HINKLEY	LDA	EXPL1,Y	;Get byte
	JSR	MYRNA	;Random mirror
	JSR	PUT	;"OR" it on me
	INX
	INY
	DEC	COWNTER
	BPL	HINKLEY	;Do 8
	JMP	NOATR
CATCHUP	JSR	CLRME	;Erase
	LDY	#$03
D	DEC	ROAR	;Fade sound
	BEQ	OW	;Unless 0
	DEY
	BPL	D
	LDA	ROAR
	LSR	A
	LSR	A
	LSR	A
	LSR	A
	STA	AUDC1
OW	JMP	NOATR
ENGULF	LDA	#$0F	;Big explosion sound
	STA	AUDC1
	LDA	#$00
	STA	ROAR	;Clear sound fade
	LDA	#$0F	;Bright white expl.
	STA	PCOLR0
	STA	PCOLR0+1
	LDA	HPOSME	;Center Plyrs on my horiz.
	SEC
	SBC	#$04
	STA	HPOSP0
	CLC
	ADC	#$08
	STA	HPOSP1
	LDA	#$00
	STA	COWNTER	;Clear count
LSIDE	LDA	VPOSME	;Draw random left exp.
	SEC
	SBC	#$04
	TAX
	LDA	RANDOM	;Rand byte
	AND	#$30	;Point to data
	TAY
AUTOMAN	LDA	EXPME,Y	;Xfer data
	STA	PLAYER0,X
	INX
	INY
	INC	COWNTER
	LDA	COWNTER
	CMP	#$10
	BNE	AUTOMAN	;Do 16 lines
RSIDE	LDA	RANDOM	;Draw right side
	AND	#$30	;Point to data
	TAY
ORBOTS	STX	HOLDX	;Save count
	LDA	EXPME,Y	;Get Left side data
	STA	HOLDA
	JSR	MIRROR	;Mirror for right
	LDX	HOLDX	;Get count
	LDA	HOLDA
	STA	PLAYER1,X	;Place byte
	DEX
	INY
	DEC	COWNTER
	LDA	COWNTER
	BNE	ORBOTS	;Do 16 lines
;
; Pause routine and cleanup
;
NOATR	LDA	#$00
	STA	ATRACT	;Attract mode off
TESTCH	STA	HITCLR	;Clr collisions
	LDA	WAITING	;Are we waiting?
	BNE	INCH	;No, skip
	DEC	WAITCNTR	;Count down
	BNE	CLRCH	;Not 0 yet? skip
	LDA	#$B4	;Reset count to 3 sec
	STA	WAITCNTR
	STA	WAITING	;Flag not waiting
	LDX	#$00
	JSR	DLPRINT	;Erase messages
	LDA	COMPLETED	;Level done?
	BEQ	NNLEV	;No, skip
	LDA	#$00	;Flag wait
	STA	WAITING
	LDA	#$FF
	STA	NEWLEV	;Flag new level
	BNE	INCH	;Always
NNLEV	LDA	#$00
	STA	PAUSED	;Pause off
INCH	LDA	CH	;Test KB for space bar
	CMP	#$21
	BNE	CLRCH	;No? skip
	JSR	SILENT	;Sound off
	LDA	PAUSED	;Toggle pause
	EOR	#$FF
	STA	PAUSED
	BNE	CLRCH	;Pause on? skip
	LDX	#$77
	JSR	OLDC	; restore colors
CLRCH	LDA	#$FF
	STA	CH	;Reset KB shadow
	LDA	RANDOM
	STA	RAND1	;Set constant random #
ATR	LDA	PAUSED	;If paused...
	ORA	G.O	; or game over...
	BEQ	EXIT
	LDX	#$77	; do attracting
AC	LDA	ACOLTAB,X
	JSR	MIXUP
	STA	DCOLTAB,X
	DEX
	BPL	AC
EXIT	JMP	XITVBV	;End or routine
;
; PROGRAM DATA TABLES
;
;
; Mountain range data
;
	*=	$3A00
	.SBYTE	+$40,"_______________5:<9___________________7;<8______"
	.SBYTE	+$40,"________5;<8_7;>@BB<879____5;<9_____6:>@BD<86;<9"
	.SBYTE	+$40,"<95:<86;?@BAEF=>@DAIJ?C<96:>@DC<8_5:?>?@ACIJ=@BB"
	.SBYTE	+$40,"IJ=@IJ>?=@ADCBGH@IJ>=>BIJ=?@@ACBAEF==?@@IJ>?>@AC"
	.SBYTE	+$40,"KKLKKLLLKLMNONOMLLKLKLNKLLKKLMONOOMKLLKLKLLKKLMO"
	.SBYTE	+$40,"PRQRPQRPRRQRPRPRPRQRPQRPQRPRQPQPRPRPQRPRQRPRPRRP"
	.SBYTE	+$40,"STUST]STSTUTSUS]SUSTUSTS^^SUTU]TTSUTUTTTUS]SSTU]"
	.SBYTE	+$40,"]WX]V]]V]]]WX]]]XV]X]]YZ[\Y]]]X]]]]]]V]]]]W]]]]]"
	.SBYTE	+$40,"]]]]]]]]]]]]]]]]]]]]]]]]^^]]]]]]]]]]]]]]]]]]]]]]"
BOT	.SBYTE	"     C:0 RADS'!#$#%#$#&  FUEL'!#$#%#$#& P:0     "
CANISTERS	=	*-$29	;# canisters left
SHIPS	=	*-$06	;# ships left
;
; Title screen text
;
TITLE	*=	*+$C8
	.SBYTE	+$C0,"  BY DOUGLAS ENGEL  "
	.SBYTE	"      LEVEL: 0      "
LEVEL	=	*-$07
;
; Message text
;
LEVLLINE	.SBYTE	+$C0,"        LEVEL: 0        "
PLEVEL	=	*-$09
MULTLINE	.SBYTE	+$C0,"     MULTIPLIER: 00     "
PMULT	=	*-$07
MESSLINE	.SBYTE	+$C0,"       GAME  OVER       "
COMPLINE	.SBYTE	+$C0,"    LEVEL COMPLETED     "
;
; Game display list
;
DLIST	.BYTE	$B0,$70,$70,$D6,$00,$30,$10,$D4,$00,$31
	.BYTE	$D4,$80,$30,$D4,$80,$30,$D4,$40,$37,$D4
	.BYTE	$C0,$35,$D4,$40,$33,$D4,$C0,$35,$D4,$40
	.BYTE	$33,$D4,$C0,$37,$D4,$00,$35,$D4,$80,$30
	.BYTE	$D4,$80,$30,$D4,$80,$30,$D4,$00,$3A
	.BYTE	$84,$84,$84,$84,$84,$84,$84,$84
	.BYTE	$20,$52,<BOT,>BOT,$41,<DLIST,>DLIST
;
; Alternate DL lines for messages
;
DLTABL
	.BYTE	$D4,$80,$80,$D4,$80,$80
	.BYTE	$D6,<LEVLLINE,>LEVLLINE,$D6,<MULTLINE,>MULTLINE
	.BYTE	$D6,<COMPLINE,>COMPLINE,$D4,$80,$30
	.BYTE	$D6,<MESSLINE,>MESSLINE,$D4,$80,$30
;
; Title screen display list
;
DLIST1	.BYTE	$70,$70,$70,$70,$70,$44,<TITLE,>TITLE,$04,$04,$04,$04,$70,$86
	.BYTE	$70,$70,$70,$70,$70,$06,$70,$70,$70,$70,$70,$70,$70,$70,$70
	.BYTE	$41,<DLIST1,>DLIST1
;
; Scroll tables
;
SCRLST	*=	*+24	;Direction
COUNT	*=	*+24	;Speed counter
LIMIT	*=	*+24	;Maximum count
CURR	*=	*+24	;Current HSCROL value
COLCKS	*=	*+24	;Scrolled color clocks
MPOS	*=	*+24	;Star missile positions
OFFSET	*=	*+24	;Offset between stars
;
; COLOR TABLES
;
;
;Actual colors
;
COLTAB	.BYTE	$CA,$A4,$A4,$02,$02,$02,$02,$02,$02,$02,$02,$02
	.BYTE	$32,$32,$32,$32,$32,$32,$32,$32,$32,$32,$32,$02
	.BYTE	$24,$A2,$A2,$04,$04,$04,$04,$04,$04,$04,$04,$04
	.BYTE	$04,$34,$34,$34,$34,$34,$34,$34,$34,$34,$34,$0A
	.BYTE	$06,$06,$06,$06,$06,$06,$06,$06,$06,$06,$06,$06
	.BYTE	$06,$36,$36,$36,$36,$36,$36,$36,$36,$36,$36,$50
	.BYTE	$40,$8E,$8E,$40,$40,$40,$40,$40,$40,$40,$40,$40
	.BYTE	$48,$48,$40,$40,$40,$40,$40,$40,$40,$40,$8F,$8F
	.BYTE	$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	.BYTE	$80,$82,$84,$86,$88,$8A,$8C,$8E,$1E,$1E,$1E,$50
;
ACOLTAB	*=	*+120	;Attracted table
;
DCOLTAB	*=	*+120	;Displayed table
;
; Character set data
;
	*=	$4000	;First 8 chars
CHARS	.BYTE	$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$C0,$C0,$C0,$C0,$CC,$FF
	.BYTE	$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$C0,$CC,$FF
	.BYTE	$00,$00,$00,$00,$C0,$C0,$CC,$FF,$00,$00,$00,$C0,$C0,$C0,$CC,$FF
	.BYTE	$00,$0C,$DE,$CC,$C0,$C0,$C0,$C0,$00,$00,$1E,$00,$00,$00,$00,$00
	*=	CHARS+$0200	;Last 64 chars
	.BYTE	$00,$03,$0F,$2F,$3B,$3B,$2F,$05,$00,$40,$90,$A4,$E4,$E4,$90,$40
	.BYTE	$00,$0F,$3B,$1F,$3E,$3B,$3D,$0F,$00,$54,$E5,$79,$F9,$F9,$E5,$54
	.BYTE	$00,$0C,$3F,$BE,$EE,$FE,$3E,$0A,$00,$00,$40,$50,$50,$90,$50,$40
	.BYTE	$00,$14,$E9,$F9,$F9,$E9,$14,$00,$00,$10,$E4,$E4,$E4,$10,$00,$00
	.BYTE	$00,$00,$20,$E4,$E4,$E4,$20,$00,$00,$28,$F9,$79,$F9,$F9,$B9,$25
	.BYTE	$00,$F4,$F9,$F9,$A4,$10,$00,$00,$00,$00,$00,$00,$0D,$09,$05,$00
	.BYTE	$00,$00,$00,$35,$39,$2D,$29,$05,$00,$00,$38,$39,$29,$24,$10,$00
	.BYTE	$00,$38,$38,$24,$00,$00,$00,$00,$00,$00,$08,$39,$39,$29,$25,$05
	.BYTE	$00,$05,$05,$00,$00,$05,$05,$00,$C0,$54,$5A,$AA,$AA,$54,$54,$C0
	.BYTE	$0C,$2A,$AA,$95,$95,$AA,$2A,$0C,$03,$0A,$A9,$A9,$AA,$AA,$0A,$03
	.BYTE	$00,$80,$60,$58,$A8,$A8,$80,$00,$00,$00,$00,$00,$00,$03,$0E,$3E
	.BYTE	$00,$00,$00,$00,$00,$03,$0F,$3B,$00,$00,$00,$00,$00,$03,$0F,$3D
	.BYTE	$00,$00,$00,$00,$40,$50,$94,$59,$00,$00,$00,$00,$40,$50,$94,$55
	.BYTE	$00,$03,$0E,$3F,$FE,$FE,$BB,$EE,$00,$03,$0F,$3D,$FF,$F7,$BF,$FE
	.BYTE	$40,$50,$94,$55,$55,$59,$95,$56,$BE,$EB,$BE,$EA,$BE,$BB,$EE,$BB
	.BYTE	$FE,$FF,$FE,$EE,$BB,$EA,$EE,$AA,$FE,$FB,$DE,$EE,$BB,$FA,$EE,$BA
	.BYTE	$BA,$FA,$BE,$FA,$EB,$EE,$FB,$AE,$99,$A5,$A5,$A6,$A6,$6A,$99,$9A
	.BYTE	$A6,$99,$A9,$96,$69,$A5,$99,$55,$59,$96,$65,$59,$96,$69,$56,$65
	.BYTE	$59,$96,$59,$65,$55,$59,$99,$66,$40,$53,$9B,$55,$55,$59,$55,$56
	.BYTE	$FB,$BA,$FF,$EA,$7E,$5A,$56,$65,$7E,$5F,$97,$59,$55,$59,$95,$65
	.BYTE	$FA,$EE,$FF,$FE,$7B,$5E,$96,$65,$99,$A9,$95,$65,$95,$97,$5F,$BD
	.BYTE	$59,$97,$5F,$7E,$EF,$FF,$BE,$FF,$FF,$BE,$EF,$FF,$BB,$FF,$BE,$FF
	.BYTE	$FE,$BF,$FB,$BF,$EE,$FF,$FB,$BF,$AA,$BA,$FF,$EE,$FF,$FB,$BF,$FF
	.BYTE	$AA,$AA,$EE,$FF,$FB,$BF,$EF,$FE,$AA,$AA,$FB,$FF,$BF,$FE,$EF,$BB
	.BYTE	$FF,$BB,$FF,$FF,$EE,$FF,$FF,$EF,$FF,$BF,$FF,$FB,$BF,$FF,$FE,$EF
	.BYTE	$BF,$FE,$FF,$FF,$FB,$FF,$EF,$FE,$FF,$FF,$EB,$FF,$FF,$FF,$FA,$FF
	.BYTE	$AF,$FF,$FF,$FF,$FA,$FF,$FF,$FF,$FF,$FF,$FF,$EB,$FF,$FF,$FF,$AF
	.BYTE	$FF,$FF,$EF,$BB,$EF,$FF,$FF,$FF,$FF,$AF,$FF,$FF,$FF,$FB,$EE,$FB
	.BYTE	$FF,$FF,$FB,$FF,$FF,$FF,$EF,$FF,$FF,$FF,$F3,$FF,$FF,$FF,$F3,$FF
	.BYTE	$FF,$FF,$FD,$D5,$D6,$D5,$F5,$FF,$FF,$D5,$59,$59,$AA,$59,$59,$55
	.BYTE	$FF,$FF,$5F,$55,$A5,$55,$57,$7F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
	.BYTE	$FF,$FB,$FF,$FF,$3F,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00
;
; PLAYER MISSILE BIT MAPS
;
;
;Data for my ship
;
SHAPE1A
	.BYTE	$00,$24,$7E,$7E,$24,$24,$00,$00,$18,$00,$00,$00
SHAPE1B
	.BYTE	$00,$00,$00,$00,$00,$00,$3C,$7E,$42,$42,$E7,$00
	.BYTE	$00,$00,$24,$7E,$7E,$24,$24,$00,$00,$18,$00,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$00,$3C,$7E,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$24,$24,$00,$00,$18,$00,$00,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$3C,$7E,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$24,$24,$00,$00,$00,$00,$00,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$24,$66,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$24,$24,$00,$00,$00,$00,$00,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$24,$42,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$24,$24,$00,$00,$00,$00,$18,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$24,$42,$42,$42,$FF,$00
	.BYTE	$00,$24,$7E,$7E,$24,$24,$00,$00,$00,$18,$18,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$24,$42,$42,$5A,$FF,$00
	.BYTE	$00,$24,$7E,$7E,$24,$24,$00,$00,$18,$18,$08,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$24,$42,$5A,$5A,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$24,$24,$00,$18,$18,$08,$10,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$24,$5A,$5A,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$24,$24,$18,$18,$08,$10,$08,$00
	.BYTE	$00,$00,$00,$00,$00,$00,$3C,$5A,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$24,$3C,$18,$08,$10,$08,$10,$00
	.BYTE	$00,$00,$00,$00,$00,$18,$3C,$42,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$3C,$3C,$08,$10,$08,$10,$08,$00
	.BYTE	$00,$00,$00,$00,$18,$18,$24,$42,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$3C,$3C,$00,$08,$10,$08,$10,$00
	.BYTE	$00,$00,$00,$00,$18,$18,$24,$42,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$3C,$3C,$00,$00,$08,$10,$08,$00
	.BYTE	$00,$00,$00,$00,$18,$18,$24,$42,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$3C,$3C,$00,$00,$00,$08,$10,$00
	.BYTE	$00,$00,$00,$00,$18,$18,$24,$42,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$3C,$3C,$00,$00,$00,$00,$08,$00
	.BYTE	$00,$00,$00,$00,$18,$18,$24,$42,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$3C,$3C,$00,$00,$00,$00,$00,$00
	.BYTE	$00,$00,$00,$00,$18,$18,$24,$42,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$3C,$3C,$00,$00,$00,$00,$00,$00
	.BYTE	$00,$00,$00,$00,$18,$18,$24,$66,$42,$42,$E7,$00
	.BYTE	$00,$24,$7E,$7E,$3C,$3C,$00,$00,$18,$00,$00,$00
	.BYTE	$00,$00,$00,$00,$18,$18,$3C,$7E,$42,$42,$E7,$00
;
;Sattelite data
;
ASATS	.BYTE	$00,$44,$28,$10,$38,$38,$38,$10,$0E,$CE,$64,$3F,$3F,$64,$CE,$0E
	.BYTE	$36,$49,$1C,$3E,$3E,$1C,$2A,$49,$22,$1C,$1C,$7F,$7F,$08,$08,$14
	.BYTE	$08,$1C,$1C,$1C,$08,$3E,$08,$14,$00,$FF,$18,$FF,$18,$18,$24,$00
	.BYTE	$07,$07,$A4,$7F,$A4,$07,$07,$00,$28,$10,$10,$38,$38,$10,$10,$28
	.BYTE	$00,$00,$3C,$99,$7E,$99,$3C,$00,$10,$54,$38,$7C,$38,$54,$10,$28
	.BYTE	$00,$00,$1A,$BC,$7F,$BC,$1A,$00,$10,$38,$12,$3C,$3C,$12,$38,$10
	.BYTE	$10,$10,$7C,$38,$10,$54,$38,$54,$81,$5A,$3C,$66,$66,$3C,$5A,$81
	.BYTE	$00,$1C,$3E,$55,$3E,$1C,$00,$00,$00,$00,$00,$DB,$7E,$18,$00,$00
;
;Sattelite explosion data
;
EXPL1	.BYTE	$00,$24,$08,$18,$48,$02,$10,$00,$00,$42,$28,$34,$10,$44,$00,$10
	.BYTE	$04,$40,$28,$14,$39,$3C,$50,$02,$80,$25,$1E,$2C,$9A,$21,$48,$02
;
;Spark data
;
SPARKS	.BYTE	$40,$31,$84,$00,$83,$5A,$00,$04,$44,$84,$41,$12,$82,$2C,$11,$40
;
;Bolt data
;
BOLTS	.BYTE	$04,$08,$10,$10,$10,$20,$40,$80,$40,$40,$20,$10,$08,$08,$04,$02
	.BYTE	$02,$04,$08,$10,$10,$08,$04,$04,$02,$01,$01,$02,$04,$08,$08,$04
;
;My explosion data
;
EXPME	.BYTE	$01,$00,$28,$02,$04,$1F,$26,$0F,$15,$0F,$4B,$05,$13,$00,$42,$00
	.BYTE	$20,$00,$44,$01,$12,$05,$8B,$1B,$4E,$0B,$06,$23,$00,$00,$01,$00
	.BYTE	$80,$00,$11,$00,$0A,$05,$1B,$07,$2B,$0D,$27,$0B,$06,$40,$00,$02
	.BYTE	$00,$0A,$10,$00,$55,$00,$05,$02,$8B,$05,$03,$23,$01,$80,$08,$00
;
; MISCELLANEOUS DATA TABLES
;
;
;Title screen bitmap
;
BITS	.BYTE	$07,$8E,$39,$27,$A0,$04,$51,$45,$48,$20,$07,$91,$41,$87,$20
	.BYTE	$04,$51,$45,$40,$80,$04,$4E,$39,$2F,$20
;
;DL modification pointers
;
POINTR	.BYTE	$04,$08,$0B,$0E,$11,$14,$17,$1A,$1D,$20,$23,$26
	.BYTE	$29,$2C,$2F,$32,$35,$38,$3B,$3E,$41,$44,$47,$4B
;
;Priority table
;
PRITAB	.BYTE	$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22,$22
	.BYTE	$22,$21,$21,$21,$21,$21,$21,$21,$21,$21,$31,$31
;
;Animation frame pointers
;
ANITAB	.BYTE	$0A,$14,$38,$40,$50,$58,$60,$68,$70
	.BYTE	$78,$80,$88,$90,$98,$A0,$A8,$C8,$D0
;
;Frequency table
;
FREQ	.BYTE	$20,$20,$00,$38,$30,$5F,$5D,$5B,$59
	.BYTE	$58,$58,$59,$5B,$5D,$5F,$30,$38,$00
;
;Distortion table
;
NOIZE	.BYTE	$88,$80,$00,$48,$48,$28,$28,$28,$28
	.BYTE	$28,$28,$28,$28,$28,$28,$48,$48,$00
;
; Other locations
;
SCORE	.SBYTE	"00000000"	;Score in memory
SLEVEL	.SBYTE	"0"	;Starting level
TOTAL	.BYTE	$00	;Total # levels done
PAINT	.BYTE	$00	;Planet color mask
;
;
	*=	RUNAD
	.WORD	START
	.END