Pilot

Developer(s): M. Male
Date: 1982
Type: Cassette
Platform(s): TS 1000

Simulates instrument flying of a light aircraft from a cockpit panel with an artificial horizon, ADF needle, VOR/ILS course and glideslope indicator, DME, fuel gauge, flap and gear status and a wind readout, plus heading, altitude, vertical speed, RPM, airspeed and time across the bottom. Seven modes are offered: final approach, inbound NDB, inbound VOR, take-off, random position, autopilot and autolanding. The aircraft can stall, exceed its never-exceed, gear or flap speeds, run out of fuel, hit one of two mountain areas or land off the airfield, and the landing check reports faults such as an undershoot, overshoot, heavy landing or gear-up landing. After each flight the program gives a navigation and skill score, then plots the ground track and the approach profile.

The cassette label reads “MINDWARE – PILOT, by M. Male – A QUICKLOAD PROGRAM – (c) Mindware 1982 16K”, and the title line reads “PILOT-(C)M.MALE 1982”. The tape starts with a short loader, saved as AUTOBOOT, that shows a notice that the program is being loaded “USING QUICKLOAD (TM), A PROPRIETARY PRODUCT OF MINDWARE, INC.”, “PAT PENDING”, and then calls machine code in its REM line to load the main program at higher speed.

Program Analysis

Program Structure

  • Line 5: a REM holding the panel artwork and the machine code that draws and updates the display.
  • 10–211: initial state. Wind direction and speed are random (W(1), W(2)); the array G(100,3) holds the beacon positions (NDB at G(1), VOR at G(2), runway at G(3)) and then the aircraft’s track, one row per step.
  • 215–311: mode menu and a GOTO 230+10*VAL Q$ jump to a block that sets the start position, heading, altitude, speed and fuel for that mode.
  • 330–780: the flight loop: read keys, redraw the horizon with PLOT/UNPLOT, compute airspeed, climb rate, heading, position (including wind drift) and fuel use.
  • 833–1115: update the readouts, the ADF needle, the course deviation bar and, after ILS is selected, the glideslope bar.
  • 1120–1390: warnings, crash and landing checks and the score deductions for each fault.
  • 1855–2130: score screen, ground-track plot and approach-profile plot.
  • 2200–2790: the autopilot and autolanding logic, which adjusts heading, bank, pitch, power, flaps and gear and prints what it is doing; pressing T hands control back to the player.

Controls

From the listing: 5 and 8 change the bank angle, 6 and 7 pitch, 4 and 9 nudge the heading, J and K lower and raise RPM between 800 and 2500, F toggles flaps, G toggles the gear, I switches the course indicator to the ILS, and 0 halves the time step.

Notable Techniques

  • If no key is pressed at the menu, the routine at line 3000 times out using the high byte of the FRAMES counter (16437) and the program starts mode 7, autolanding. After an autolanding it restarts with GOTO 0, so it runs as a self-playing demonstration.
  • Bearings to the beacons are computed with ATN plus quadrant corrections, and the needles are moved by unplotting the old position and plotting the new one only when the value has changed.
  • Wind is applied as a separate drift vector in the position update (lines 700–705).
  • Near the runway, line 1360 computes two screen columns from the lateral offset and distance and POKEs them into the machine code at 16932–16933 before calling 16934, apparently to draw the runway as it comes into view.
  • Many flags are folded into arithmetic, for example LET R=R+(INKEY$="K" AND R<2500)*100-(INKEY$="J" AND R>800)*100.

Potential Issues

  • The track index E grows by 0.5 every step and G is dimensioned to 100 rows, so a very long flight will stop with a subscript error.
  • Line 1345 adds (V>=-200)*50+(V<-200)*50, which is always 50, so the heavy-landing test has no effect on the score.
  • Several jumps target lines that do not exist (1331, 2215, 2241, 2250); the ZX81 continues at the next line, which gives the intended result in each case.

Related Products

Flight simulator. Learn to take-off, land and direction-find from the safety of your computer. Similar to Nightlite but without high...
Saves/loads programs fifteen times faster. Stores megabyte on one cassette.

Image Gallery

Source Code

   5 REM ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄███[A][/][H]███[A][D][F]██[V][O][R][3][6][0][R]██[D][M][E]███████▀▀▀▀▀▀▜▀▀▜▀▀▜▀▀▀▛▀▀▜████████████      ▐     ▐▘     ▐██[F][U][E][L]██████      ▐     ▐▘     ▐████████████▄▖▄▄▖▄▟▘ ▝  ▜▌     ▟██[F][L][A][P]█UP███      ▐  ▝  ▐▘     ▐████████████      ▐  ▐  ▐▘     ▐██[G][E][A][R]█UP███      ▐██████▘  ▖  ▐██████████████████████████████████[W][N][D]███████[H][D][G]█[A][L][T]██[V][S][I]██[R][P][M]███[A][S][I]██[T][I][M][E]██5£RND#7#5E▘;##5▙RND▘4  GOSUB [K]<# RETURN LLIST 4 PRINT # RETURNINKEY$ 4 LIST TAN A #ACS 9ACS 9ACS 9ACS 9ACS =ACS 9ACS =#- ;#; GOSUB #£RND;)▘ ;#TAN ▌.:▖▞3Y LN ▝PI( CLSLN ▝PI£# RETURN▒4 INPUT 58PI#7#:▖VAL Y[▒]STR$ LN ▝PISGN ▖#[U]4 POKE AT # RETURN▛COS £# RETURN C▘▌# RETURN3C▘=/ TO :~~Y[▒]▞▀LN ▝PI( CLS£# RETURN$4 LET :"▞▛Y[▒]LN ▝PI▖# RETURN$4 PRINT £# RETURN:4 GOSUB :▖▞▌Y[V]LN ▝PI:(▞=Y[N]LN ▝PI▞~~Y[R]LN ▝PI▖Y[W]LN ▝PITAN -0:+▞ #STR$ LN ▝PISGN #CHR$ ▝##LEN ▀#=# RETURNA4 GOTO TAN :=▞3Y█LN ▝PI( CLSLN ▝PI£# RETURN-4 INPUT TAN ▞~~5£RND#7#5CHR$ ▝;, RETURN#C~~ PAUSE  LET PICHR$ █/▝LEN █><#[X]4 GOTO #[W]4 CONT (>=TAN QQQQQQQQQI
  10 LET B=0
  15 LET M=180
  20 LET P=B
  25 LET N=-6
  30 LET R=2000
  35 LET O=N
  40 LET H=270
  45 LET V=B
  50 LET T=B
  55 LET S=70
  60 LET GS=1
  61 LET FS=GS
  65 LET K=120
  70 LET A$="UP"
  80 LET B$=A$
  85 LET TA=10
  90 LET C=B
  93 LET EA=5
  95 LET NT=B
  96 LET NV=B
  97 LET NA=B
 100 LET D=B
 105 LET E=EA
 110 LET F=360
 115 LET V$="V"
 120 DIM W(2)
 125 RAND 
 130 LET W(1)=RND*PI+PI
 140 LET W(2)=INT (RND*20)
 145 LET AA=1600+(-(W(1)<3/2*PI)+(W(1)>3/2*PI))*100+(RND>.5)*50
 150 LET A=AA
 155 DIM G(100,3)
 160 LET G(3,1)=20
 170 LET G(3,2)=10
 180 LET G(2,1)=10
 190 LET G(2,2)=35
 200 LET G(1,1)=40
 210 LET G(1,2)=10
 211 CLS
 215 LET C$="1 FINAL APP  2 INBOUND NDB3 INBOUND VOR4 TAKE OFF   5 RANDOM POSN6 AUTOPILOT  7 AUTOLANDING"
 216 PRINT TAB 4;"█[P][I][L][O][T][-][(][C][)][M][.][M][A][L][E]█[1][9][8][2]█"
 217 PRINT 
 218 PRINT "   SELECT MODE-";
 219 FOR Z=1 TO 79 STEP 13
 220 PRINT TAB 15;C$(Z TO Z+12)
 221 NEXT Z
 222 GOSUB 3000
 225 LET Q$=INKEY$ 
 226 IF Q$="" THEN LET Q$="7"
 228 IF ABS (CODE Q$-32)>3 THEN GOTO 222
 231 CLS
 232 LET Z=13*(CODE Q$-29)+1
 233 PRINT AT 0,4;"PILOT-MODE ";C$(Z TO Z+12)
 235 GOTO 230+10*VAL Q$
 240 LET G(4,1)=52
 241 LET G(4,2)=6+RND*8
 242 LET W(2)=INT (W(2)/2)
 244 LET TA=5
 247 LET U=53
 249 GOTO 311
 250 LET G(4,1)=30
 251 LET G(4,2)=20+RND*8
 252 LET H=130
 257 LET U=80
 259 GOTO 311
 260 LET G(4,1)=8+RND*4
 261 LET G(4,2)=15
 262 LET U=140
 263 LET H=360
 264 LET A=(AA-1000+RND*2000)
 265 PRINT "MAINTAIN ";
 269 GOTO 310
 270 LET G(4,1)=20
 271 LET G(4,2)=10
 272 LET A=0
 273 LET R=2300
 274 LET K=A
 275 LET A$="DN"
 276 LET U=180
 277 PRINT "CLIMB TO ";
 278 LET GS=-1
 279 GOTO 310
 280 LET G(4,1)=28+RND*30
 281 LET G(4,2)=RND*40
 282 LET H=360
 283 LET U=180
 284 PRINT "MAINTAIN ";
 285 LET W(2)=W(2)+20
 286 LET F=270
 287 LET NT=50
 289 GOTO 310
 290 LET G(4,1)=52
 291 LET G(4,2)=7.5+(RND>.5)*5
 292 LET TA=5
 293 LET W(2)=0
 294 LET U=60
 295 LET AA=1200
 296 LET A=AA
 299 GOTO 311
 300 LET G(4,1)=26
 301 LET G(4,2)=10
 302 LET TA=5
 303 LET W(2)=0
 304 LET A=395
 305 LET R=1600
 306 LET V=-400
 307 LET K=70
 308 LET U=15
 309 GOTO 311
 310 PRINT AA;"FT CROSS VOR LEVEL"
 311 RAND USR 16866
 315 IF VAL Q$<3 OR VAL Q$>5 THEN GOSUB 790
 320 PRINT AT 18,26;INT (W(1)*180/PI);"/";W(2)
 325 IF Q$="5" THEN PRINT AT 10,17;"[2][7][0]"
 330 PRINT AT 10,0;"I"
 332 LET B=B+(INKEY$ ="5" AND B<4)*2-(INKEY$ ="8" AND B>-4)*2
 335 LET H=H+(INKEY$ ="9")*5-(INKEY$ ="4")*5
 350 LET P=P+(INKEY$ ="7" AND P<6)-(INKEY$ ="6" AND P>-6)
 365 IF INKEY$ ="0" THEN LET TA=5
 370 IF C=P AND D=B THEN GOTO 510
 380 LET Y=B
 390 LET X=D
 400 FOR Z=1 TO 5
 410 IF ABS (X-C)<7 THEN UNPLOT 5+Z,14-X+C
 430 IF ABS (Y-P)<7 THEN PLOT 5+Z,14-Y+P
 450 LET Y=Y-B/2
 460 LET X=X-D/2
 470 NEXT Z
 480 LET C=P
 490 LET D=B
 510 IF INKEY$ <>"F" THEN GOTO 550
 520 LET FS=-FS
 530 LET B$="UP"
 540 IF FS<0 THEN LET B$="DN"
 550 IF INKEY$ <>"G" THEN GOTO 600
 560 LET GS=-GS
 570 LET A$="UP"
 580 IF GS<0 THEN LET A$="DN"
 600 LET R=R+(INKEY$ ="K" AND R<2500)*100-(INKEY$ ="J" AND R>800)*100
 620 IF INKEY$ ="I" THEN GOSUB 790
 625 PRINT AT 10,0;"█"
 627 IF P>0 AND K<S THEN GOTO 650
 630 LET S=65+FS*5+2.5*ABS B
 640 LET I=5-2.5*(FS+GS)
 645 LET Z=((R-800)/10-P*7-I)
 646 IF Z>K+10 THEN LET Z=K+10
 647 IF Z<K-10 THEN LET Z=K-10
 648 LET K=Z
 650 LET Z=(R-2000+P*70)*(K>=S)
 660 LET H=H-TA*B*1.5
 662 LET H=H+((H<=0)-(H>360))*360
 670 IF Z>V+100 THEN LET Z=V+100
 680 IF Z<V-100 THEN LET Z=V-100
 685 LET V=Z
 690 LET A=INT (A+V/60*TA)
 695 IF A<0 THEN LET A=0
 700 LET G(E,1)=G(E-1,1)+SIN (H/180*PI)*K/720*TA-SIN W(1)*W(2)/720*TA
 705 LET G(E,2)=G(E-1,2)+COS (H/180*PI)*K/720*TA-COS W(1)*W(2)/720*TA
 710 LET T=T+TA
 715 IF T/100-INT (T/100)>.55 THEN LET T=T+40
 720 LET G(E,3)=A/100
 731 LET X=100-ABS (G(E,1)-10)*50-ABS (G(E,2)-35)*50
 732 IF X>NV THEN LET NV=X
 733 IF H>210 THEN GOTO 736
 734 LET X=100-ABS (G(E,1)-40)*50-ABS (G(E,2)-10)*50
 735 IF X>NA THEN LET NA=X
 736 IF TA=10 THEN LET NT=NT+1
 737 IF G(E,1)>12 AND G(E,2)>15 THEN LET NT=NT-ABS (A-AA)/10
 740 LET X=(G(2,1)-G(E,1))*.25
 745 LET Y=(G(2,2)-G(E,2))*.25
 750 LET L=INT (SQR (X*X+Y*Y)*100)/100
 760 LET U=U-R*TA/10000
 763 IF U>0 THEN GOTO 780
 765 LET U=0
 770 LET R=800
 775 PRINT AT 2,0;"[O][U][T]█[O][F]█[F][U][E][L]"
 780 GOTO 833
 790 LET G(2,1)=G(3,1)
 800 LET G(2,2)=G(3,2)
 810 PRINT AT 10,13;"██[I][L][S]███"
 820 LET F=270
 830 LET V$="I"
 832 RETURN
 833 PRINT AT 10,27;"█████";AT 10,27;L
 834 IF V$="I" AND G(E,1)<20 THEN PRINT AT 10,27;"-"
 835 PRINT AT 12,28;"███";AT 12,28;INT U;AT 14,28;B$;AT 16,28;A$
 836 RAND USR 17092
 837 PRINT AT 20,1;H;TAB 5;A;TAB 10;V;TAB 15;R;TAB 21;K;TAB 26;T/100
 840 LET X=G(1,1)-INT (G(E,1)*10)/10+.01
 850 LET Y=G(1,2)-INT (G(E,2)*10)/10+.01
 860 LET Z=(ATN (X/Y)+(X<0)*2*PI+(Y<0)*PI)*180/PI
 870 LET Z=Z-H+360*(Z-H<=0)
 880 IF INT (Z/16)=INT (M/16) THEN GOTO 930
 890 FOR Y=0 TO 4 STEP 2
 900 UNPLOT 21+SIN (M/180*PI)*Y,15+COS (M/180*PI)*Y
 910 PLOT 21+SIN (Z/180*PI)*Y,15+COS (Z/180*PI)*Y
 920 NEXT Y
 925 LET M=Z
 930 LET X=G(E,1)-G(2,1)
 935 LET X=X+(X=0)*.01
 940 LET Y=G(E,2)-G(2,2)
 945 LET Y=Y+(Y=0)*.01
 950 LET Z=(ATN (X/Y)+(X<0)*2*PI+(Y<0)*PI)*180/PI
 960 LET Z=INT (Z-F+180+.5)-(Z>360)*360
 970 IF Z>12 THEN LET Z=12
 975 IF Z<-12 THEN LET Z=-12
 980 IF Z/2=N THEN GOTO 1040
 990 FOR X=9 TO 19 STEP 2
1000 UNPLOT 34+N,X
1010 PLOT 34+Z/2,X
1020 NEXT X
1030 LET N=Z/2
1040 IF V$="V" OR L<.1 THEN GOTO 1120
1050 LET Z=INT (A/L/50+.5)
1060 IF Z>10 THEN LET Z=10
1070 IF Z<1 THEN LET Z=1
1080 IF O=Z THEN GOTO 1120
1090 FOR X=29 TO 39 STEP 2
1095 UNPLOT X,20-O
1100 PLOT X,20-Z
1110 NEXT X
1115 LET O=Z
1120 IF G(E,1)>40 AND G(E,2)<15 AND H<300 THEN PRINT AT 1,0;"  COMMENCE DESCENT WHEN READY   "
1125 PRINT AT 2,0;
1130 IF G(E,1)<2 OR G(E,1)>8 OR G(E,2)<17 OR G(E,2)>23 THEN GOTO 1138
1136 GOTO 1140
1138 IF G(E,1)<14 OR G(E,1)>28 OR G(E,2)<15 OR G(E,2)>21 THEN GOTO 1144
1140 PRINT "HIT MOUNTAIN"
1143 GOTO 1760
1144 IF A<>0 OR K>=70 OR A$="DN" THEN GOTO 1150
1145 PRINT "GEAR RETRACTED"
1147 GOTO 1750
1150 IF A>10 THEN GOTO 1220
1160 IF V=0 AND A=0 THEN GOTO 1220
1161 IF A>0 AND K>60 THEN GOTO 1220
1164 IF G(E,1)>22 OR G(E,1)<17 OR G(E,2)>12 OR G(E,2)<8 THEN GOTO 1380
1170 IF G(E,2)<9.8 OR G(E,2)>10.2 THEN PRINT ;"MISSED RUNWAY",
1180 IF G(E,1)>20 THEN PRINT ;"UNDERSHOT R/WAY",
1190 IF V<-300 THEN PRINT ;"CRASH LANDING",
1195 IF B<>0 THEN PRINT ;"WINGTIP GROUNDED",
1200 IF G(E,1)<18.5 THEN PRINT ;"OVERSHOT R/WAY",
1203 IF K>60 THEN PRINT "TOO FAST",
1205 IF A$="UP" THEN PRINT ;"GEAR UP LANDING"
1206 LET NT=NT-(G(E,1)>20)*50-(G(E,1)<18.5)*50-(G(E,2)<9.8 OR G(E,2)>10.2)*100
1207 LET NT=NT-(V<-300)*100-(B<>0)*50-(A$="UP")*100
1210 IF K<=60 AND G(E,1)<=20 AND G(E,1)>=18.5 AND G(E,2)<=10.2 AND G(E,2)>=9.8 AND V>=-300 AND B=0 AND A$="DN" THEN GOTO 1330
1215 GOTO 1850
1220 IF K>=S OR A=0 THEN GOTO 1250
1230 PRINT "STALLED FROM ";INT A;" FT          "
1235 LET NT=NT-100*(A>50)
1240 GOTO 1780
1250 IF K<=145 THEN GOTO 1270
1260 PRINT "VNE EXCEEDED-CRASH"
1265 GOTO 1760
1270 IF A$="UP" OR K<=90 THEN GOTO 1290
1280 PRINT "GEAR LIMIT EXCEEDED-CRASH"
1285 GOTO 1760
1290 IF B$="UP" OR K<=85 THEN GOTO 1310
1300 PRINT "FLAP LIMIT EXCEEDED-CRASH      "
1305 GOTO 1760
1310 IF G(E,2)<12 AND ABS (G(E,1)-22)<2 THEN GOSUB 1360
1312 IF G(E,1)<20 AND G(E,2)>14 THEN LET EA=E
1313 LET G(E-1,2)=G(E,2)
1314 LET G(E-1,1)=G(E,1)
1315 LET E=E+.5
1317 IF VAL Q$>5 THEN GOTO 2200
1320 GOTO 330
1330 LET Z=6
1335 PRINT AT 6,9;"LANDED SAFELY"
1340 IF V<-200 THEN PRINT TAB 8;"HEAVY LANDING"
1342 PRINT AT 6,9;"[L][A][N][D][E][D]█[S][A][F][E][L][Y]"
1343 LET Z=Z-1
1344 IF Z>0 THEN GOTO 1331
1345 LET NT=NT+(V>=-200)*50+(V<-200)*50+(G(E,1)-18.5)*50+50-ABS (G(E,2)-10)*50
1350 GOTO 1855
1360 LET Z=30-INT ((G(E,2)-9.8)*75)
1361 LET X=2+INT (10-10*L)
1362 LET Y=Z-X
1363 IF Y>31 THEN GOTO 1371
1364 IF Y<0 THEN LET Y=0
1365 POKE 16932,Y
1366 LET Y=Z+X
1367 IF Y<0 THEN GOTO 1371
1368 IF Y>31 THEN LET Y=31
1369 POKE 16933,Y
1370 RAND USR 16934
1371 RETURN
1380 PRINT "CRASH-OFF AIRFIELD             "
1390 GOTO 1206
1750 LET NT=NT-50
1760 LET NT=NT-50
1770 LET NT=NT-50
1780 LET NT=NT-50
1850 RAND USR 17113
1855 PRINT AT 8,2;"PRESS N/L FOR SCORE AND PLOT"
1856 IF Q$="7" THEN GOTO 0
1860 GOSUB 3000
1865 CLS
1866 PRINT "NAV=";INT (NA+NV);"+SKILL=";INT (NT+U/4);" TOTAL=";INT (NT+U/4)+INT (NV+NA)
1900 RAND USR 16995
1910 FOR Z=4 TO E-2 STEP 2
1920 IF G(Z,1)>0 AND G(Z,1)<64 AND G(Z,2)>0 AND G(Z,2)<42 THEN PLOT G(Z,1),G(Z,2)
1930 NEXT Z
1940 RAND USR 16995
2010 PRINT AT 21,0;"PRESS N/L FOR APP PROFILE"
2020 GOSUB 3000
2030 CLS
2060 RAND USR 17065
2065 FOR Z=EA TO E STEP 2
2070 PLOT (G(Z,1)-20)*1.5,G(Z,3)/10*14.6
2080 NEXT Z
2090 PRINT AT 0,0;"PRESS S TO STOP,ANY KEY TO GO "
2100 GOSUB 3000
2110 IF INKEY$ ="S" THEN STOP
2120 CLS
2130 GOTO 0
2200 PRINT AT 1,0;"                                                                "
2201 PRINT AT 1,0;
2202 IF INKEY$ ="T" THEN GOTO 2600
2203 IF ABS (H-270)<=5 THEN LET H=270
2204 IF K<85 AND FS>0 THEN GOTO 2730
2205 IF K<91 AND GS>0 THEN GOTO 2700
2211 IF L<.9 THEN GOTO 2300
2212 IF O<6 THEN GOTO 2330
2213 IF O>=6 THEN GOTO 2380
2230 IF ABS N<=1 AND ABS (H-270)<=5 AND B=0 THEN GOTO 2300
2235 LET B=(N<0 AND H>260)*2-(N>0 AND H<280)*2
2238 IF B<>0 THEN GOTO 2241
2240 LET B=(N=0 AND H>275)*2-(N=0 AND H<265)*2
2245 IF B<>0 THEN GOTO 2760
2290 GOTO 370
2300 LET H=270+(N>0)*5-(N<0)*5
2305 IF L<.9 THEN GOTO 2500
2306 IF H=270 THEN GOTO 2250
2307 PRINT "[A][D][J][U][S][T]█[H][D][G]█[T][O]█[S][T][A][Y]█[O][N]█[C][E][N][T][R][E][L][I][N][E]"
2310 GOTO 370
2330 IF A=AA THEN GOTO 2215
2340 LET Z=(K<70)
2350 LET R=R+100*(Z=1)
2360 LET P=P+(Z=0)
2365 PRINT "█[A][D][J][U][S][T][S]█[P][O][W][E][R]█[O][R]█[P][I][T][C][H]█[T][O]█[K][E][E][P]██[O][N]█[R][E][C][O][M][M][E][N][D][E][D]█[G][L][I][D][E]█[S][L][O][P][E]█████"
2370 GOTO 370
2380 LET Z=(K>75)
2385 IF V<-500 THEN GOTO 2215
2390 LET R=R-100*(Z=1)
2400 LET P=P-(Z=0)
2410 GOTO 2365
2500 IF L<.5 THEN LET H=270
2505 PRINT "█[A][D][J][U][S][T][S]█[P][O][W][E][R][,][P][I][T][C][H]█[A][N][D]█[H][D][G]█[T][O]██[S][T][A][L][L]█[O][N][T][O]█[R][U][N][W][A][Y]█[F][R][O][M]█[<][=][1][0][F][T]██"
2510 LET R=1500+(A<180)*100+(A<55)*100
2520 LET P=(A<80)+(A<31)+(A<17)
2530 GOTO 370
2600 PRINT AT 1,0;"PLAYER HAS CONTROL"
2610 LET Q$="1"
2620 GOTO 330
2700 LET A$="DN"
2705 LET GS=-1
2710 PRINT "[G][E][A][R]█[D][O][W][N]"
2720 GOTO 370
2730 LET B$="DN"
2735 LET FS=-1
2740 PRINT "[F][L][A][P]█[D][O][W][N]"
2750 GOTO 370
2760 PRINT "[T][U][R][N][I][N][G]█";
2770 IF N<>0 THEN PRINT "[O][N][T][O]█[C][L][O][S][I][N][G]█[H][E][A][D][I][N][G]"
2780 IF N=0 THEN PRINT "[O][N][T][O]█[T][H][E]█[C][E][N][T][R][E][L][I][N][E]"
2790 GOTO 370
3000 LET X=PEEK 16437-8
3005 IF X<128 THEN LET X=128
3010 IF INKEY$ ="" AND PEEK 16437>X THEN GOTO 3010
3020 RETURN
4000 SAVE "PILO[T]"
4005 SLOW
4010 RUN

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.