--- title: "Bomber" id: 72305 type: "computer_media" slug: "bomber-2" url: "http://localhost/computer_media/bomber-2/" markdown_url: "http://localhost/computer_media/bomber-2.md" published_at: "2026-10-23T07:47:18+00:00" modified_at: "2026-10-23T07:47:18+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/bomber-1.png" excerpt: "Defend wartime London from rows of bombers with an anti-aircraft gun, scoring for each hit while the city's buildings crumble as your 40 shells run out." post_tag: - 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/" genre: - name: "Arcade" slug: "arcade" taxonomy: "genre" url: "http://localhost/type/arcade/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/Bomber%20-%20Raid%20on%20London%20%281984%29%28-%29%28TS2068%29%28US%29%28Program%29.zip" tsrun_member: "Bomber - Raid on London (1984)(-)(TS2068)(US)(Program)/Bomber - Raid on London (1984)(-)(TS2068)(US)(Program).tap" mediadate: "1984" images: - url: "http://localhost/wp-content/uploads/2026/10/bomber-1.png" - url: "http://localhost/wp-content/uploads/2026/10/bomber-2.png" media_type_tags: "Arcade" license: false --- # Bomber Defend London from a World War II air raid. Rows of bombers drift across a cyan sky above a UDG skyline, five barrage balloons hang on their cables over the city, and an anti-aircraft gun stands in the street below. Holding F fires a shell straight up from the gun; a hit on the lowest row scores 25 and on the row above it 50, and the bomber disappears. You have 40 shots, and as they run down past 35, 25 and 15, parts of the city turn to rubble. The game ends with “THAT’S THE END OF THE GAME” when the shots are gone. A REM credits the listing to ZX Computing for December 1984, a British Spectrum magazine; the author is not named. A second REM describes it as a bomber raid on WW II London and says to press f to shoot the bombers down. It is a Spectrum listing, but it runs unchanged on the TS2068. This copy is BOMBER from a SNUG library disk. It is a different game from the city-lander Bomber elsewhere on this site. ## Program Analysis ### Setting the Scene - Line 30 sets the colours and calls line 370 to define the UDGs, with `RESTORE 370` first so the READs start at the DATA in line 390. - Lines 50–90 draw the skyline in block graphics and the ground in alternating textures from UDGs g and h. - Lines 110–120 build the gun from UDGs d and e, line 130 places the five balloons (UDGs m and n), and line 140 draws their cables with `PLOT` and `DRAW`. ### The Main Loop - Line 200 builds `a$`, 32 characters of bombers and spaces. UDGs a and b are the same aircraft drawn two pixels apart in height, which staggers the formation. `b$` starts as a copy. - Line 230 prints `a$` on row 5, `b$` on row 4 and `b$` shifted by two characters on row 3. Lines 330–340 rotate `a$` by one character and `b$` by two, so the rows fly at different speeds. - Lines 240–250 animate the shell from row 16 up to row 6 with a `FOR` loop whose `NEXT` is inside an `IF INKEY$="f"`, so the shell climbs only while F is held. - Lines 260–270 check character 21 of each string, the gun’s column, for a bomber UDG, print a flashing bright red star, add to the score and blank that character. - Line 280 shows the score and shots left in inverse on the bottom line, lines 290–310 turn buildings into rubble (UDG o) as the shots run down, and line 320 ends the game. ## Notable Techniques - Several DATA items are the variable `y` instead of a number. Because `READ y` evaluates the item, `y` still holds the value just read, so it repeats the previous number and shortens the DATA lines. - `c$` is `CHR$ 19+CHR$ 1`, the embedded control code for BRIGHT 1, printed in front of the explosions and rubble. - The bombers move by string rotation (`a$=a$(2 TO )+a$(1)`) rather than by printing each aircraft separately. - The pitch of the beep at each frame rises as the shots run down (`BEEP .008,55-shots`). ## Potential Issues - Line 230 has a comma after `AT 5,0`, which moves the print position to column 16, so the lowest row of bombers starts mid-screen on row 5 and wraps onto row 6. The hit test in line 260 still checks `a$(21)`, so the bomber that counts as hit appears not to be the one shown above the gun. - The top row is `b$` shifted by two characters, so it can never be hit, and shooting a bomber in the middle row also removes one from the top row. - A shell that reaches the top costs a shot in line 250, and a hit costs another in line 260 or 270, so each hit uses two shots. A shell let go before it reaches the top costs nothing. This program came from an Oliger (JLO SAFE) disk and was converted for tape. Lines 290–310 tested a variable written as `shots left`; Sinclair BASIC ignores the space and reads it as `shotsleft`, which is never set, so the game stopped with “2 Variable not found” on its first pass. The three lines now test `shots`. The Oliger `SAVE /` in line 360 became a plain `SAVE`. It was tested in ZEsarUX on a stock TS2068: the play screen, and a game reaching a score of 450 with the buildings crumbling. ## Source Code ``` 10 REM from ZX Computing 12/84 20 REM ----- Bomber Raid on WW II London. Press 'f' to shootdown bombers to save London.--- 30 BORDER 3: PAPER 5: INK 1: CLS : RESTORE 370: GO SUB 370 40 REM ----- Build city------- 50 PRINT AT 12,0;": : ";AT 13,0;" :': ";AT 13,30;" ";AT 14,0;" .:..:. :'";AT 14,27;": " 60 PRINT AT 15,0;" .: :.";AT 15,25;".: . " 70 PRINT " .:.:....:.:........:.:.. " 80 PRINT AT 17,0;"ghghgghghghhghghgghghghhghghgghghghghgghghghhghghghgghgghghghhhgghhghgghghhghgghghh hgghghghhg" 90 PRINT "hghgghghghhghghgghghghhghghgghghghghhghgghghghhghghgghghghhghghg" 100 REM ---- gun firing------ 110 PRINT AT 18,20; INK 0;"d": PRINT AT 19,20; INK 0;"e" 120 PRINT AT 19,19; INK 0;": ": PRINT AT 19,21; INK 0;": " 130 PRINT AT 6,4; INK 1;"mn": PRINT AT 6,22; INK 1;"mn": PRINT AT 7,16; INK 1;"mn": PRINT AT 8,9; INK 1;"mn": PRINT AT 8,28; INK 1;"mn" 140 INK 1: PLOT 56,56: DRAW -16,64: PLOT 96,48: DRAW -16,56: PLOT 152,44: DRAW -16,68: PLOT 200,44: DRAW -16,76: PLOT 244,56: DRAW -12,48 150 REM ------BOMBERS------- 160 LET score=0 170 FOR g=1 TO 20: BEEP .008,g: NEXT g 180 LET shots=40 190 FOR h=50 TO 20 STEP -2: BEEP .008,h: NEXT h 200 LET a$="a b a b a b a b a b a b" 210 LET b$=a$ 220 LET across=21 230 PRINT AT 5,0, INK 0;a$;AT 4,0;b$;AT 3,0;b$(3 TO )+b$(1 TO 2): BEEP .008,55-shots 240 FOR h=16 TO 6 STEP -1 250 IF INKEY$="f" THEN PRINT AT h,20; INK 0;"^": PRINT AT h,20;" ": NEXT h: LET shots=shots-1 260 IF INKEY$="f" AND a$(across)="a" OR INKEY$="f" AND a$(across)="b" THEN PRINT AT 5,20;c$; PAPER 7; FLASH 1; INK 2;"*": LET shots=shots-1: BEEP .05,shots: LET score=score+25: BEEP .05,50-shots: LET a$(across)=" " 270 IF INKEY$="f" AND b$(across)="a" OR INKEY$="f" AND b$(across)="b" THEN PRINT AT 4,20;c$; PAPER 7; FLASH 1; INK 2;"*": LET shots=shots-1: BEEP .05,shots: LET score=score+50: BEEP .05,50-shots: LET b$(across)=" " 280 PRINT AT 21,0; INK 0; INVERSE 1;"Score: ";score;" : Shots Left: ";shots;" " 290 IF shots<=35 THEN PRINT AT 12,0;c$; PAPER 7; INK 2;"ooo": PRINT AT 12,0;" ": PRINT AT 13,0;c$; PAPER 7; INK 2;"ooo": PRINT AT 13,0;" ": PRINT AT 14,0;c$; PAPER 2; INK 7;"ooo" 300 IF shots<=25 THEN PRINT AT 15,8;c$; PAPER 7; INK 2;"ooo": PRINT AT 15,8;" ": PRINT AT 16,8;c$; PAPER 7; INK 2;"ooo": PRINT AT 14,8;" " 310 IF shots<=15 THEN PRINT AT 15,26;c$; PAPER 7; INK 2;"oo": PRINT AT 15,26;" ": PRINT AT 16,26;c$; PAPER 7; INK 2;"oo": PRINT AT 14,27;" " 320 IF shots<1 THEN PRINT AT 10,3;"THAT'S THE END OF THE GAME": STOP 330 LET a$=a$(2 TO )+a$(1) 340 LET b$=b$(3 TO )+b$(1 TO 2) 350 GO TO 230 360 SAVE "BOMBER" LINE 10 370 FOR x=0 TO 15: READ y: POKE USR "g"+x,y: NEXT x 380 LET c$=CHR$ 19+CHR$ 1 390 DATA 178,142,113,77,178,142,113,77,51,204,85,y,170,y,51,204 400 FOR x=0 TO 15: READ y: POKE USR "d"+x,y: NEXT x 410 DATA 24,y,y,y,y,y,y,y,y,60,y,255,y,60,y,y 420 FOR x=0 TO 23: READ y: POKE USR "m"+x,y: NEXT x 430 DATA 0,193,239,127,y,y,239,193,0,240,252,254,255,254,252,240 440 DATA 36,165,y,90,189,153,255,y 450 FOR x=0 TO 15: READ y 460 POKE USR "a"+x,y: NEXT x 470 DATA 0,y,16,33,255,124,32,64 480 DATA 16,33,255,124,32,64,0,y 490 RETURN ```