10 REM =============================
20 REM ========== Pinball ==========
30 REM ======= By D. Cromwell ======
40 REM =============================
50 REM == All rems are removeable ==
60 REM === and can    be omitted ===
70 REM =============================
100 SYMBOL AFTER 256
110 MEMORY 24999:SYMBOL AFTER 33
120 RESTORE 2240:FOR j=25000 TO 25074
130 READ a:POKE j,a:NEXT
140 REM ====== Game set up ======
150 GOSUB 1850:GOSUB 1480
160 PEN 2:LOCATE 3,8
170 PRINT"Press <SPACE> to start game";
180 FOR j=1 TO 3:LOCATE 2,j+3
190 PRINT STRING$(15,"%");:NEXT
200 WINDOW 34,39,5,20
210 PRINT"Score:           0"
220 PRINT:PRINT:PRINT" High scores "
230 FOR j=1 TO 5
240 PRINT USING"######";h(j);
250 NEXT:WINDOW 1,40,1,25
260 pn=240:sc=0:in=0:bal=5
270 PEN 1:LOCATE 32,24:PRINT "(((((";
280 MOVE pn,46:DRAWR 46,0,1
290 WHILE INKEY(47)=-1:WEND
300 LOCATE 2,8:PRINT SPACE$(29);
310 x=31:y=24:dx=0:dy=0
320 LOCATE 31+bal,24:PRINT " ";
330 LOCATE 31,24:PRINT "(";
340 FOR j=1 TO 100:NEXT
350 PEN 1:LOCATE 31,25:PRINT "*";
360 FOR j=1 TO 100:NEXT
370 PRINT CHR$(8);")";:PEN 2
380 WHILE dx=0:GOSUB 770
390 FOR j=1 TO 20:NEXT
400 GOSUB 720:WEND
410 WHILE y<25:GOSUB 880
420 GOSUB 720
430 WEND
440 REM ====== Lost ball ======
450 SOUND 7,500,10:PEN 1:LOCATE x,y
460 PRINT CHR$(130);:bal=bal-1
470 PEN 2:LOCATE 30,10:PRINT " ";
480 IF bal>0 THEN 290
490 REM ====== Game over ======
500 SOUND 3,60,200,10,0,1
510 LOCATE 13,8:PRINT"GAME OVER";
520 FOR k=1 TO 1500:NEXT
530 FOR j=1 TO 5:IF sc>h(j) THEN 550
540 NEXT:GOTO 630
550 FOR k=5 TO j+1 STEP -1
560 h(k)=h(k-1):NEXT:h(j)=sc
570 LOCATE 7,8:PRINT"You have achieved the";
580 IF j=1 THEN LOCATE 10,9:GOTO 620
590 pl$="th":IF j=2 THEN pl$="nd" ELSE IF j=3 THEN pl$="rd"
600 j$=STR$(j):LOCATE 14,9
610 PRINT j$+pl$;:LOCATE 10,10
620 PRINT"Highest score"
630 WHILE INKEY$<>"":WEND:FOR j=1 TO 1500
640 IF INKEY$<>"" THEN 660
650 NEXT
660 LOCATE 3,8:PRINT"Press <SPACE> to play again";
670 LOCATE 10,9:PRINT SPACE$(13);
680 LOCATE 10,10:PRINT SPACE$(13);
690 MOVE pn,46:DRAWR 46,0,0
700 GOTO 180
710 REM ====== Bat control ======
720 po=pn:IF INKEY(34)<>-1 AND po>64 THEN pn=pn-16
730 IF INKEY(27)<>-1 AND po<368 THEN pn=pn+16
740 MOVE po,46:DRAWR 46,0,0
750 MOVE pn,46:DRAWR 46,0,1:RETURN
760 REM ====== Ball in shute ======
770 IF y=10 THEN 820
780 LOCATE x,y:PRINT " ";
790 y=y-1:IF y=10 THEN x=x-1
800 LOCATE x,y:PRINT "(";
810 RETURN
820 dx=-1:dy=CINT(RND)
830 PEN 1:LOCATE x,y:PRINT "!";
840 PEN 2:x=x-1:y=y+dy
850 LOCATE x,y:PRINT "(";
860 RETURN
870 REM ====== Ball movement ======
880 ox=-dx:oy=-dy:GOSUB 1420
890 ON PEEK(24995) GOTO 1010,900,900,910,930,960
900 dx=-dx:GOTO 1010
910 dy=1:dx=0:GOTO 1010
920 GOTO 1010
930 LOCATE x+dx,y:PRINT" ";
940 SOUND 1,200,0,0,1:in=20:GOSUB 1340
950 dx=-dx:GOTO 1010
960 SOUND 2,250,0,0,1:in=50:GOSUB 1340
970 dx=-dx:IF dy=0 THEN dy=SGN(INT(RND*7-3)):GOTO 990
980 dy=CINT(RND)*dy
990 GOSUB 1430:IF PEEK(24997)=1 THEN 1010
1000 dy=-dy:GOTO 1300
1010 ON PEEK(24996) GOTO 1210,1020,1030,1300,1040,1070,1150,1170
1020 dy=-dy:GOTO 1300
1030 dx=1:GOTO 1300
1040 LOCATE x,y+dy:PRINT " ";
1050 SOUND 1,200,0,0,1:in=20:GOSUB 1340
1060 dy=-dy:GOTO 1300
1070 SOUND 2,250,0,0,1:in=50:GOSUB 1340
1080 dy=-dy:IF dx=0 THEN dx=SGN(INT(RND*7-3)):GOTO 1100
1090 dx=CINT(RND)*dx
1100 IF dx=0 AND dy=0 THEN dx=ox:dy=oy:GOTO 1300
1130 GOSUB 1430:IF PEEK(24997)=1 THEN 1300
1140 dx=-dx:GOTO 1300
1150 SOUND 4,170,0,0,1:in=100:GOSUB 1340
1160 dy=-dy:GOTO 1300
1170 IF po<pn AND dx<1 THEN dx=dx+1
1180 IF po>pn AND dx>-1 THEN dx=dx-1
1190 IF x=26 AND dx=1 THEN dx=-1
1200 dy=-dy:SOUND 1,338,0,0,1:GOTO 1300
1210 IF PEEK(24996)*PEEK(24995)<>1 THEN 1300
1220 ON PEEK(24997) GOTO 1300,1230,1230,1300,1240,1260,1300,1290
1230 dy=-dy:dx=-dx:GOTO 1300
1240 LOCATE x+dx,y+dy:PRINT" ";
1250 dx=-dx:GOTO 1050
1260 SOUND 2,250,0,0,1:in=50:GOSUB 1340
1270 IF RND>0.5 THEN dx=-dx:dy=0:GOTO 1300
1280 dx=0:dy=-dy:GOTO 1300
1290 dy=-1:dx=0:SOUND 1,338,0,0,1
1300 LOCATE x,y:PRINT " ";
1310 x=x+dx:y=y+dy:LOCATE x,y
1320 PRINT"(";:RETURN
1330 REM ====== Score routine ======
1340 IF sc<10000 AND sc+in>9999 THEN GOSUB 1380
1350 sc=sc+in:LOCATE 34,7
1360 PRINT USING"######";sc;
1370 RETURN
1380 bal=bal+1:LOCATE 30+bal,24
1390 PEN 1:PRINT "(";
1400 PEN 2:RETURN
1410 REM ==== Machine code call ====
1420 POKE 24990,y:POKE 24991,x
1430 POKE 24992,(256+dx) MOD 256
1440 POKE 24993,(256+dy) MOD 256
1450 CALL 25000
1460 RETURN
1470 REM ====== Table printout ======
1480 INK 0,0:INK 1,6:INK 2,26:INK 3,18
1490 MODE 1:BORDER 1:PEN 1:PAPER 0
1500 PRINT STRING$(31,"!")
1510 PRINT"!               !!!! !  ! !! !!"
1520 PRINT"!               !!           !!"
1530 PRINT"!               !             !!"
1540 PRINT"!               !             !!"
1550 PRINT"!                             !!"
1560 PRINT"!                             !!"
1570 PRINT"!                              !"
1580 PRINT"!                            !!!"
1590 PRINT"!                              !"
1600 PRINT"!              !!!           ! !"
1610 PRINT"!                            ! !"
1620 PRINT"!  !                         ! !"
1630 PRINT"!  !                       ! ! !"
1640 PRINT"!  !                       ! ! !"
1650 PRINT"!  !                      #! ! !"
1660 PRINT"!  !                       # ! !"
1670 PRINT"!  !           !         $   ! !"
1680 FOR j=1 TO 4
1690 PRINT"!  !                     !   ! !"
1700 NEXT
1710 PRINT"!  !                     !   ! !!!!!!"
1720 PRINT"!                            !      !"
1730 PRINT"!                            !)!!!!!!"
1740 LOCATE 5,20:PRINT "!";
1750 PEN 3:FOR j=1 TO 29:READ x,y
1760 LOCATE x,y:PRINT "&";:NEXT
1770 PEN 2:FOR j=1 TO 11:READ x,y
1780 LOCATE x,y:PRINT "'";:NEXT
1790 MOVE 0,399:DRAWR 320,0,1
1800 MOVE 0,0:DRAWR 478,0
1810 LOCATE 33,2:PEN 3
1820 PRINT"PINBALL":RETURN
1830 REM ====== Graphic set up ======
1840 REM ====== and title page ======
1850 SYMBOL 33,255,255,255,255,255,255,255,255
1860 SYMBOL 35,255,127,63,31,15,7,3,1
1870 SYMBOL 36,128,192,224,240,248,252,254,255
1880 SYMBOL 37,126,126,126,126,126,126,0,0
1890 SYMBOL 38,60,66,153,189,189,153,66,60
1900 SYMBOL 39,0,126,24,60,102,102,255,255
1910 SYMBOL 40,0,56,124,254,254,124,56,0
1920 SYMBOL 41,126,126,24,56,28,56,28,56
1930 SYMBOL 42,0,0,0,0,0,126,126,60
1940 SYMBOL 129,255,0,0,0,0,0,0,0
1950 SYMBOL 130,0,0,0,0,0,0,0,255
1960 ENV 1,6,-2,3:ENT 1,100,5,2
1970 FOR j=1 TO 5:h(j)=1000:NEXT
1980 CALL &BC02:INK 2,18
1990 MODE 1:LOCATE 17,4
2000 PEN 1:PRINT"PINBALL"
2010 MOVE 256,332:DRAWR 110,0,3
2020 LOCATE 13,7
2030 PRINT"By D. Cromwell"
2040 PEN 2:WINDOW 3,37,10,25
2050 PRINT" Guide the ball around the pinball"
2060 PRINT"table using the bat."
2070 PEN 1:PRINT
2080 PRINT"   Controls :- <O> moves bat left"
2090 PRINT"               <P> moves bat right"
2100 PRINT"     <SPACE> releases the balls"
2110 PEN 3:PRINT
2120 PRINT"Scores : ' - 100 pts   & - 50 pts"
2130 PRINT:PRINT TAB(10)"A brick -  20 pts"
2140 PEN 2:PRINT
2150 PRINT"A bonus ball is given at 10000 pts"
2160 PRINT:PRINT"      Press any key to start"
2170 WHILE INKEY$<>"":WEND
2180 CALL &BB18:RETURN
2190 REM ==== Machine code data ====
2200 REM == Start address : 25000 ==
2210 REM ==== Length : 75 bytes ====
2220 REM == Entry point   : 25000 ==
2230 REM = + screen positions data =
2240 DATA 42,158,97,58,160,97,132,103
2250 DATA 245,205,117,187,205,96,187
2260 DATA 221,33,163,97,205,218,97,42
2270 DATA 158,97,58,161,97,133,111,205
2280 DATA 117,187,205,96,187,221,35
2290 DATA 205,218,97
2300 DATA 241,205,111,187,205,96,187
2310 DATA 221,35,6,8,33,235,97,190,40,5
2320 DATA 35,16,250,6,1,221,112,0,201
2330 DATA 129,39,38,37,35,36,33,32
2340 DATA 21,2,27,2,19,3,29,3,18,4,30,4
2350 DATA 21,5,27,5,24,6,20,7,28,7,31,8
2360 DATA 24,9,6,10,15,11,19,11,15,12
2370 DATA 19,12,29,13,10,14,24,14,28,15
2380 DATA 5,16,5,17,17,17,5,18,16,18
2390 DATA 18,18,5,19
2400 DATA 3,1,6,1,9,1,12,1,15,1,23,2
2410 DATA 24,2,25,2,16,12,17,12,18,1224,6,20,7,28,7,31,8
2360 DATA 24,9,6,10,15,11,19,11,15,12
2370 DATA 19,12,29,13,10,14,24,14,28,15
2380 DATA 5,16,5,17,17,17,5,18,16,18
2390 DATA 18,18,5,19
2400 DATA 3,1,6,1,9,1,12,1,15,1,23,2
2410 DATA 24,2,25,2,16,12,17,12,18,12