10 REMA: 20 : 21 REM LIST OF VARIABLES 22 REM SP SPRITE PAGE 23 REM V BASE OF VIDEO CHIP 24 REM C BASE OF COLOUR RAM 25 REM SD BASE OF SOUND CHIP 26 REM S BASE OF SCREEN 27 REM HS BYTE TO SAVE HIGH SCORE 28 REM CH KERNAL PRINT ROUTINE (CHROUT) 29 REM AR IMAGE OF ACCUMULATOR REGISTER 30 REM BS BEST SCORE YET AT RUNTIME 31 REM ZS OLD SCREEN BASE AND CHAR SET 32 REM ZC OLD BACKGROUND COLOUR 33 REM ZE OLD BORDER COLOUR 34 REM ZR OLD VALUE OF REPEAT FLAG 35 REM ZL OLD PRINT COLOUR 36 REM GL TURN NUMBER IN GAME LOOP 37 REM I AND J FOR-NEXT INDICES 38 REM U, U2 AND U$ WORKHORSES 39 REM T1-T9 CONSTANTS IN GAME LOOP 40 REM B$ GAME SCREEN BUILDING BLOCK 41 REM T$ 16 SPACE INDENT 42 REM W EITHER V OR V+1 (SPRITE POS.) 43 REM PS PART-SCORE (ONE TURN) 44 REM TS TOTAL SCORE SO FAR 45 REM FQ QUIT FLAG, SET BY PRESSING * 46 : 47 REM SUBROUTINES 48 REM 1000 ONE TURN OF THE GAME 49 REM 2000 PRINT GAME SCREEN 50 REM 3000 EXIT (OR PLAY AGAIN) 51 REM 4000 BUILD SPRITE 52 REM 5000 INSTRUCTIONS DATA STRINGS 53 REM 6000 PRINT INSTRUCTIONS 54 REM 7000 FLY SPRITE AHEAD OF INSTR. 55 REM 8000 WAIT TO RESUME GAME 56 : 100 REM SEED RANDOM NUMBER GENERATOR, DISABLE CHARACTER SET SHIFTS 110 U=RND(-TI):POKE657,128 120 REM SAVE OLD ENVIRONMENT, BUILD NEW ONE, BUILD SPRITE, PRINT INSTRUCTIONS 130 SP=13:V=53248 140 POKE2041,PEEK(V+24):POKEV+24,22 150 POKE2042,PEEK(V+32):POKEV+32,7 160 POKE2043,PEEK(V+33):POKEV+33,7 170 POKE2044,PEEK(646):POKE646,0 180 POKE2045,PEEK(650):POKE650,128 190 PRINT"[147]":GOSUB4000 200 GOSUB6000:PRINT"[147]":POKEV+24,20 210 DEFFNSC(U)=INT(U+U*GL/10) 220 FORI=1TO16:T$=T$+"":NEXTI 230 B$=""+CHR$(13)+"":FORI=0TO39:B$=B$+" ":NEXTI 240 V=53248:C=55296:S=1024:SD=54272 250 HS=PEEK(43)+PEEK(44)*256+5 260 T1=135:T2=255:T3=230:T4=133 270 T5=5:T6=9:T7=.992:T8=42:T9=32 280 BS=PEEK(HS):CH=65508:AR=780 290 REM INITIALIZE CURSORS, PRINT GAME SCREEN 300 E(1)=1269:E(2)=1475:E(3)=1682:E(4)=1888 310 POKEV+21,0:GOSUB2000 320 REM MAKE SPACE FOR SCORE ON SCREEN, SET SOUND CHIP, CLEAR KEYBOARD BUFFER 330 FORI=1080TO1100:POKEI,32:NEXT 340 POKESD+4,16:POKESD+11,16:POKESD+18,16 350 POKESD+6,240:POKESD+13,240:POKESD+20,240 360 POKESD+24,15 370 GETA$:IFA$<>""THEN370 380 : 390 REM BEGIN 20-TURN GAME LOOP,SET PART SCORE TO ZERO 400 FORGL=1TO20:PS=0 410 REM POSITION SPRITE, UNEXPAND IT, ZERO THE COLLISION DETECT REGISTER 420 POKEV,23:POKEV+1,49 430 POKEV+23,0:POKEV+31,0 440 REM PRINT SCORE INFO, TURN ON SOUND 450 PRINT""T$"TURN:"GL" SCORE:"TS 460 PRINT""T$"BEST YET:"PEEK(HS)-1 470 POKESD+4,17:POKESD+11,17:POKESD+18,17 480 REM TURN ON SPRITE, TAKE 1 TURN, GOTO 570 IF GAME ABORTED (FQ SET) 490 POKEV+21,1:GOSUB1000:IFFQ=1THEN550 500 REM SCROLL SPRITE OFF SCREEN IF NO COLLISION, OTHERWISE SCREECH TO A HALT 510 IFPEEK(V+1)>T3THENFORI=PEEK(V+1)TO250:POKEV+1,I:NEXTI:GOTO550 520 POKESD+4,129:POKESD+11,33:POKESD+18,33 530 FOR I=72TO20STEP-2:POKESD+1,I:POKESD+8,I-3:POKESD+15,I-2:NEXTI 540 REM TURN OFF SOUND. JUMP TO EXIT IF FQ SET 550 POKESD+4,16:POKESD+11,16:POKESD+18,16 560 POKESD+1,0:POKESD+8,0:POKESD+15,0 570 IFFQ=1THENFQ=0:GL=20:NEXT:POKEV+21,0:GOTO670 580 REM CALCULATE PART SCORE FROM SPRITE Y POSITION, MODIFY, ADD TO TOTAL SCORE 590 PS=FNSC(INT((PEEK(V+1)-71)/40)) 600 TS=TS+INT((PS^1.4+PS)/2) 610 POKEV+21,0:POKEV+16,0 620 NEXTGL 630 REM UPDATE HIGH SCORE RECORD, ZERO SOUND CHIP, GO TO EXIT (3000) 640 IFPEEK(HS)T7ANDPEEK(V+1)T2THENPOKEV+16,1:POKEV,PEEK(V)+U-T2:GOTO1070 1050 REM UPDATE SPRITE POSITION. EXIT IF COLLISION DETECTED OR 4TH GAP CROSSED 1060 POKEW,PEEK(W)+U 1070 IF(PEEK(V+31)AND1)ORPEEK(V+1)>T3THENRETURN 1080 REM CHANGE FREQUENCIES ACCORDING TO SPRITE Y POSITION AND RANDOM NUMBER U2 1090 U=232-PEEK(V+1):POKESD+1,U*2/3:POKESD+8,U+3*U2:POKESD+15,U+3 1100 REM POLL KEYBOARD. EXIT ON *; PAUSE ON ' '; GOTO1000 IF NOT A FUNCTION KEY 1110 SYSCH:U=PEEK(AR):IFU=T8THENTS=0:FQ=1:RETURN :REM EXIT 1120 IFU=T9THENGOSUB8000:REM TAKE 5 1130 IFUF8 1180 E(U)=E(U)+(E(U)=1100+200*U-(U>2)):POKEE(U),223:POKEE(U)-1,160 1190 POKE E(U)+4+(U>2),32:POKEE(U)+5+(U>2),95:E(U)=E(U)+1:GOTO1000 1200 U=U-4:E(U)=E(U)-(E(U)=1064+200*(U)):POKEE(U)+3+(U>2),95 1210 POKEE(U)+4+(U>2),160:POKEE(U)-1,32:POKEE(U)-2,223:E(U)=E(U)-1:GOTO1000 1970 REM SUBROUTINE--PRINT GAME SCREEN 1980 : 1990 REM LINE COLOURS SET IN LINE 2000. LAST COLOUR IS FOR PRINTED MESSAGES 2000 PRINT"[147][156]"B$""B$"[154]"B$"[150]"B$"[144]" 2010 FORI=1TO4:POKEE(I)-1,223:POKEE(I)+3-(I<3),95:FORJ=E(I)TOE(I)+2-(I<3) 2020 POKEJ,32:NEXTJ,I:RETURN 2030 : 2980 REM SUBROUTINE--EXIT OR RE-ENTRY 2990 : 3000 PRINT"[147]"T$"YOUR SCORE:"TS 3010 PRINT""T$"BEST YET:";PEEK(HS)-1 3020 PRINT"PLAY AGAIN (Y/N)? 3030 [161]A$:[139]A$[178]""[167]3030 3040 [139]A$[178]"Y"[167][142] 3050 [139]A$[178]"N"[167]3070 3060 [137]3030 3070 [139] [168](BS[179][194](HS))[167]3100 3080 [153]:[153]" CONGRATULATIONS, YOU BROKE THE RECORD. 3090 PRINT:PRINT" BE SURE TO SAVE THE PROGRAM. 3100 [153]:[153]" SEE YOU AROUND. 3110 PRINT"" 3120 REM RESTORE PREVIOUS ENVIRONMENT 3130 POKEV+24,PEEK(2041):POKEV+32,PEEK(2042):POKEV+33,PEEK(2043) 3140 POKE646,PEEK(2044):POKE650,PEEK(2045):POKE657,0 3150 END 3160 : 3980 REM SUBROUTINE--BUILD SPRITE AT PAGE 13 (LOCATIONS 832-895 IN TAPE BUFFER) 3990 : 4000 FOR I=0TO41:READU:POKE(64*SP)+I,U:NEXT 4010 FORI=42TO63:POKE(64*SP)+I,0:NEXT 4020 POKE2040,SP:POKEV+23,1:POKEV+29,1:POKEV+39,0:RETURN 4030 RETURN 4040 DATA 248,0,0,62,0,0,7,128,0,1,224 4050 DATA 0,0,120,0,0,62,0,0,15,112 4060 DATA 0,7,248,0,7,248,0,6,120,0 4070 DATA 6,12,0,6,6,0,3,6,0,1,128 4080 : 4980 REM DATA FOR INSTRUCTIONS PAGE 4990 : 5000 DATA"[217]OUR OBJECTIVE IS TO MANEUVER THE 5010 [131]"HORIZONTAL LINES SO THAT (null)UPER(null)PRITE 5020 DATA"MAY FLY SAFELY THROUGH THE GAPS. 5030 [131]"(null)HE FOUR LINES ARE CONTROLLED BY THE 5040 DATA"FOUR FUNCTION KEYS ON YOUR RIGHT. 5050 [131]" 5060 DATA"[208]RESSING ONE OF THESE KEYS WILL CAUSE 5070 [131]"THE CORRESPONDING LINE TO SLIDE RIGHT. 5080 DATA"[212]HE SAME KEY SHIFTED WILL CAUSE ITS 5090 [131]"LINE TO SLIDE LEFT. (null)RESS THE SPACE 5100 DATA"BAR TO PAUSE, '*' TO ABORT. 5110 [131]" 5120 DATA"[193] GAME CONSISTS OF 20 TURNS. [208]OINTS ARE 5130 [131]"AWARDED FOR EVERY GAP SAFELY TRAVERSED. 5140 DATA"[212]HE PAYOFFS INCREASE WITH THE NUMBER OF 5150 [131]"GAPS TRAVERSED ON A TURN, AND WITH THE 5160 DATA"NUMBER OF TURNS TAKEN. [211]UPER[211]PRITE'S 5170 [131]"FLIGHT SPEED AND NATURAL WAYWARDNESS 5180 DATA"ALSO INCREASE AS THE GAME PROGRESSES." 5190 DATA" 5200 [131]"(null)HE MAXIMUM SCORE IS 253. CHR$OOD LUCK. 5210 DATA" 5220 [131]" (null)(null)VAL(null)(null)CLOSE(null)(null)ATNLENVALCLOSEPEEKATN(null)CLOSE(null)(null) (null)(null)ATN(null)(null)CLOSECHR$ATN(null)VAL. 5230 : 5980 REM SUBROUTINE--PRINT INSTRUCTIONS 5990 : 6000 POKEV,23:POKEV+1,49:POKEV+21,1 6010 GOSUB7000:GOSUB7000 6020 FORW=1TO23:READU$:PRINTU$:GOSUB7000:NEXTW 6030 POKEV+21,0:POKEV,23:POKEV+1,49:POKEV+23,0:POKEV+29,0 6040 GETA$:IFA$<>CHR$(32)THEN 6040 6050 RETURN 6060 : 6980 REM SUBROUTINE--FLY SPRITE DOWN 1 PRINT LINE (AHEAD OF INSTRUCTIONS) 6990 : 7000 FORI=1TO8:POKEV,PEEK(V)+1 7010 POKEV+1,PEEK(V+1)+1:NEXT 7020 POKEV,PEEK(V)+1:RETURN 7030 : 7980 REM SUBROUTINE--ANSWER THE PHONE 7990 : 8000 POKE SD+24,0 8010 SYSCH:IFPEEK(AR)<>32THEN8010 8020 POKE SD+24,15 8030 RETURN