This is Breakout turned on its side. The bat sits at the left edge and moves with Q (up) and A (down), and the wall stands at the right: two banks of seven coloured columns. A brick scores by its colour, from 5 points for yellow up to 35 for black, and the ball bounces back from each brick it breaks. You have five balls. Clearing the whole wall moves you on to the next level and a fresh wall, and the high score is kept while the program runs. When the last ball is lost, GAME OVER scrolls across the screen and PLAY AGAIN? appears; N stops.
The board reads “WRITTEN BY KRISTIAN BOISVERT”, and the REMs give “WRITTEN BY K BOISVERT” and a 1988 Byte Power copyright line (the © character lists as the keyword RESET on the TS2068). Byte Power was Boisvert’s Montreal TS2068 tape magazine. This Breakout is not in the Byte Power issues on the site and is a different program from the other Breakout games here. It was on the disk SNUG_11_12 as BREAKOUT.
Program Analysis
Structure
- Line 40:
DEF FN P()centresA$on a line. Lines 370–375 define the ball UDG and set the colours, caps lock and high score. - Lines 50–70: start a game or level, then draw the board (lines 300–360).
- Lines 80–200: serve a ball and run the main loop.
- Lines 210–230: a lost ball, with a rising sound. Lines 240–290: game over and play again.
Play
X is the ball’s row and Y its column. DIR is the horizontal direction and DIR2 the vertical one, never 0, so the ball always travels diagonally. Before moving the ball, line 150 reads the paper colour of the cell it is entering with ATTR. A colour other than white is a brick, worth (7-N)*5 points, and the ball turns back; reprinting the ball and then a space with white paper removes the brick. Line 140 nudges the ball onto the bat when it is about to slip past it by one row.
The wall is printed by line 330 with PAPER control codes embedded in the string. Each bank is worth 5+10+…+35 = 140 points per row, so 15 rows of two banks total exactly 4200. That is why the test SC=LEVEL*4200 in line 180 fires just as the last brick goes.
Notable Techniques
- Collision detection by attribute: the paper colour of a cell is both the brick test and its score.
- The ball UDG comes from
DATA 60,66,129,a,a,a,66,60. Eachais read as an expression, so it repeats the value just read intoA, 129. - GAME OVER is animated by printing it letter by letter at a moving column, forwards and then backwards.
Potential Issues
- Line 280 tests
INKEY$afterPAUSE 0. If N is released before the test, a new game appears to start instead of the program stopping.
This program came from an Oliger (JLO SAFE) disk and was converted to load from tape by making the disk SAVE / in line 380 a plain SAVE. It was tested in ZEsarUX through the level screen, play with scoring, and a full game to GAME OVER and PLAY AGAIN?.
Source Code
10 REM BREAKOUT
20 REM WRITTEN BY K BOISVERT
30 REM RESET 1988 BYTE POWER
40 DEF FN P()=16-LEN A$/2: GO SUB 370
50 LET BALL=5: LET SC=0: LET LEVEL=1
60 LET A$="ENTERING LEVEL "+STR$ LEVEL: PRINT AT 8,FN P();A$;AT 18,0;"SCORE:";SC: LET A$="HIGH SCORE:"+STR$ HIGH: PRINT AT 20,FN P();A$: PAUSE 0: PRINT AT 8,0,,: LET A=7: GO SUB 300
70 PRINT AT 18,26;"BALL:";6-BALL
80 LET OA=A: LET Y=0: LET X=INT (RND*15)+1: LET DIR=1: LET OX=X: LET OY=Y
90 LET DIR2=INT (RND*3)-1: IF DIR2=0 THEN GO TO 90
100 IF OA<>A THEN PRINT AT OA,0;" ";AT OA+1,0;" "
110 PRINT AT A,0;" :";AT A+1,0;" :"
120 LET OX=X: LET OY=Y: LET Y=Y+DIR: IF (Y=0 AND (X=A OR X=A+1)) OR Y=31 THEN LET DIR=-DIR: LET Y=Y+DIR+DIR
130 LET X=X+DIR2: IF X=0 OR X=16 THEN LET DIR2=-DIR2: LET X=X+DIR2+DIR2
140 IF Y=1 AND X<>A AND X<>A+1 THEN IF X+DIR2=A OR X+DIR2=A+1 THEN LET X=X+DIR2
150 LET N=INT (ATTR (X,Y)/8)
160 PRINT AT OX,OY;" ";AT X,Y;"a"
170 IF Y=0 THEN GO TO 210
180 LET SC=SC+(7-N)*5: IF N<>7 THEN BEEP .002,(7-N)*5: PRINT AT 18,6;SC: LET DIR=-DIR: IF SC=LEVEL*4200 THEN LET LEVEL=LEVEL+1: PRINT AT X,Y;" ";AT A,0;" ";AT A+1,0;" ": GO TO 60
190 LET OA=A: LET A=A+(INKEY$="A" AND A<14)-(INKEY$="Q" AND A>1)
200 GO TO 100
210 PRINT AT X,Y;" ": LET BALL=BALL-1: IF BALL=0 THEN GO TO 240
220 FOR F=-10 TO 10: BEEP .01,F*4: NEXT F
230 GO TO 70
240 IF SC>HIGH THEN LET HIGH=SC: LET A$="HIGH SCORE:"+STR$ HIGH: PRINT AT 20,FN P();A$
250 LET A$=" GAME OVER ": FOR G=32 TO -8 STEP -1: FOR F=1 TO LEN A$: PRINT AT 8,G+F-12; INVERSE 1;A$(F): NEXT F
260 FOR F=1 TO LEN A$: PRINT AT 8,G-F; INVERSE 1;A$(F): NEXT F
270 NEXT G
280 LET A$="PLAY AGAIN?": PRINT #1;AT 0,FN P();A$: PAUSE 0: IF INKEY$="N" THEN STOP
290 CLS : GO TO 50
300 REM PRINT BOARD
320 PRINT AT 0,0;"........................BREAKOUT....................... "
330 FOR F=1 TO 15: PRINT ," : "
340 NEXT F
350 PRINT "''''WRITTEN BY KRISTIAN BOISVERT''' "
360 RETURN
370 DATA 60,66,129,a,a,a,66,60: RESTORE 370: FOR F=0 TO 7: READ A: POKE USR "a"+F,A: NEXT F
375 POKE 23658,8: INK 0: PAPER 7: BORDER 7: BRIGHT 0: INVERSE 0: FLASH 0: CLS : LET HIGH=0: RETURN
380 SAVE "BREAKOUT" LINE 10Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

