--- title: "Breakout (Byte Power)" id: 72332 type: "computer_media" slug: "breakout-byte-power" url: "http://localhost/computer_media/breakout-byte-power/" markdown_url: "http://localhost/computer_media/breakout-byte-power.md" published_at: "2026-10-23T07:47:14+00:00" modified_at: "2026-10-23T07:47:14+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/breakout-3.png" excerpt: "A sideways Breakout: steer a bat up and down the left edge to keep the ball bouncing into a wall of coloured bricks, scoring points by brick colour." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Byte Power" slug: "byte-power" taxonomy: "post_tag" url: "http://localhost/tag/byte-power/" - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" indiv: - name: "Kristian Boisvert" slug: "boisvert-kristian" taxonomy: "indiv" url: "http://localhost/indiv/boisvert-kristian/" genre: - name: "Arcade" slug: "arcade" taxonomy: "genre" url: "http://localhost/type/arcade/" media_type: "Program" programmers: - name: "Kristian Boisvert" slug: "boisvert-kristian" taxonomy: "indiv" url: "http://localhost/indiv/boisvert-kristian/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Breakout%20-%20Byte%20Power%20%281988%29%28Boisvert%2C%20Kristian%29%28TS2068%29%28US%29%28Program%29.zip" tsrun_member: "Breakout - Byte Power (1988)(Boisvert, Kristian)(TS2068)(US)(Program)/Breakout - Byte Power (1988)(Boisvert, Kristian)(TS2068)(US)(Program).tap" mediadate: "1988" producer_company: - id: 25181 title: "Byte Power" type: "company" url: "http://localhost/company/byte-power/" images: - url: "http://localhost/wp-content/uploads/2026/10/breakout-3.png" - url: "http://localhost/wp-content/uploads/2026/10/breakout-2.png" media_type_tags: "Arcade" license: false --- # Breakout (Byte Power) 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()` centres `A$` 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`. Each `a` is read as an expression, so it repeats the value just read into `A`, 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$` after `PAUSE 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 10 ```