--- title: "Home Base" id: 72372 type: "computer_media" slug: "home-base" url: "http://localhost/computer_media/home-base/" markdown_url: "http://localhost/computer_media/home-base.md" published_at: "2026-10-23T07:47:12+00:00" modified_at: "2026-10-23T07:47:12+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/homebase-4.png" excerpt: "Steer a ship up from the bottom of a field of X obstacles to Home Base, picking up bonus stars and saucers before the base entrance closes in." 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/" indiv: - name: "David Naylor" slug: "david-naylor" taxonomy: "indiv" url: "http://localhost/indiv/david-naylor/" genre: - name: "Game" slug: "game" taxonomy: "genre" url: "http://localhost/type/game/" media_type: "Program" programmers: - name: "David Naylor" slug: "david-naylor" taxonomy: "indiv" url: "http://localhost/indiv/david-naylor/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Home%20Base%20%281984%29%28Naylor%2C%20David%29%28TS2068%29%28US%29%28Program%29.zip" tsrun_member: "Home Base (1984)(Naylor, David)(TS2068)(US)(Program)/Home Base (1984)(Naylor, David)(TS2068)(US)(Program).tap" mediadate: "1984" images: - url: "http://localhost/wp-content/uploads/2026/10/homebase-4.png" - url: "http://localhost/wp-content/uploads/2026/10/homebase-5.png" - url: "http://localhost/wp-content/uploads/2026/10/homebase-1.png" related_content: - id: 72713 title: "SNUG-ISTUG Public Domain Library" type: "computer_media" url: "http://localhost/computer_media/snug-istug-public-domain-library/" media_type_tags: "Game" license: false --- # Home Base Guide a diamond-shaped ship from the bottom-left corner of the screen up to HOME BASE on the top line, through a field of X obstacles. The ship climbs one row on each turn that no key is held. Keys 0 and 9 move it right and left instead, and 1 moves it down. A power pack (`#`), a star (`.`), a flying saucer (`^`) and a shooting star (`*`) are scattered across the field, and each one is worth points and an extra life. Hitting an X costs a life, and a new X appears somewhere on every turn. As your score rises, red `<` and `>` marks close in on the base line from both sides. Touching one is fatal, and past a final threshold the base disappears altogether. There are seven skill levels. You can pick one, or answer a to the opening question and have the levels build up automatically. The REM credits David Naylor and ZX Computing (“M/A 84”), and the title screen reads “DAVID NAYLOR 1983”. It is a type-in from a British Spectrum magazine, written in plain Sinclair BASIC, and runs unchanged on the TS2068. ## Program Analysis ### Structure - Lines 1010–1130: the title, scoring table and key instructions, the automatic-level question, and the ship UDG (n) from DATA. - Lines 40–230: build the field with 50 Xs per level, place the four bonus objects at random and print the base line. - Lines 280–680: the main loop, which runs for `350/level` turns and is counted on screen as “TIME GONE”. - Lines 690–940: death, running out of time, reaching the base, the closed base (“TOO LATE”) and the play-again prompt. - Lines 950–1000: bonus pickups and the X collision. ### Gameplay Details Collisions are found with `SCREEN$` at the ship’s new position before the ship is redrawn, and lines 540–600 chain through each object type. Moving forward, left or right scores 2 points per level. Bonuses score 50 to 150, and reaching the base adds 200. Lives start at twice the level, up to 9. The closing marks are driven by a random multiplier `x` from 2 to 9, chosen afresh each turn. The score thresholds in lines 390–450 (20×, 30× and up to 280×) therefore close the base at irregular points. Past the last threshold the game ends with “TOO SLOW, YOUR BASE DISAPPEARED”. The high score is kept for the session. ## Notable Techniques - `SCREEN$` collision detection. Every object is an ordinary character, so the test is a simple string comparison. - `PAUSE NOT PI` and `PRINT AT 9,NOT PI` use `NOT PI` for 0, a common byte-saving idiom. - The border and paper flash through random colours in the victory sequence. ## Potential Issues - In automatic mode, line 860 raises the level after each base is reached and ends the game with “You’re the greatest!!” as soon as it reaches 7. The build-up therefore stops after level 6, and level 7 is never played. - Line 40 accepts only a lower-case a for automatic mode, while lines 850 and 900 accept A as well. Typing A asks for a starting level and then advances automatically from it. This program came from an Oliger (JLO SAFE) disk in the SNUG library set and was converted for tape. It has no disk commands, so no changes were needed. It was tested in ZEsarUX on a stock TS2068 through the instructions, the playing field and a successful “YOU’VE DONE IT!!” return to base. ## Source Code ``` 10 REM >> HOME BASE << by David Naylor * ZX COMPUTING, M/A 84 20 GO SUB 1010: GO TO 40 30 FOR s=0 TO sp: PRINT AT 2,s; INK 2;"<";AT 2,31-s;">": NEXT s: RETURN 40 IF l$="a" THEN LET di=1: GO TO 70 50 INPUT "Level of difficulty (1-7)? ";di 60 IF di<1 OR di>7 THEN GO TO 50 70 LET sc=0 80 LET l=di*2 90 IF l>9 THEN LET l=9 100 BORDER 1: PAPER 4: CLS 110 PRINT TAB 9;"PLEASE WAIT" 120 FOR q=0 TO 50*di 130 LET s=INT (RND*31): LET k=INT (RND*21)+3 140 IF k>21 THEN LET k=21 150 PRINT AT k,s;"X" 160 BEEP .05,RND*50 170 IF q=50*di THEN GO TO 200 180 PRINT AT 21,0;" " 190 NEXT q 200 LET c=0: LET r=21: LET sp=c 210 FOR s=1 TO 4: PRINT AT RND*17+3,RND*31;p$(s): NEXT s 220 PRINT AT 0,5;"PRESS ANY KEY TO MOVE " 230 PRINT AT 2,0;" H * O * M * E B * A * S * E " 240 PRINT AT r,c;"n" 250 PAUSE 0 260 PRINT AT 0,0; INVERSE 1,,,, 270 PRINT AT r,c;" " 280 FOR w=1 TO INT 350/di 290 IF w=INT (350/di) THEN GO TO 760 300 PRINT AT r,c;"n" 310 IF l>9 THEN LET l=9 320 PRINT AT 0,25; INVERSE 1;"LIVES:";l 330 PRINT AT 0,12; INVERSE 1;"LEVEL:";di 340 PRINT AT 0,0; INVERSE 1;"SCORE:";sc 350 IF hi20*x THEN LET sp=3: GO SUB 30 400 IF sc>30*x THEN LET sp=6: GO SUB 30 410 IF sc>90*x THEN LET sp=8: GO SUB 30 420 IF sc>120*x THEN LET sp=9: GO SUB 30 430 IF sc>180*x THEN LET sp=12: GO SUB 30 440 IF sc>220*x THEN LET sp=14: GO SUB 30 450 IF sc>280*x THEN PRINT AT 2,0;" T O O L A T E ": PAUSE 200: GO TO 920 460 PRINT AT r,c;" " 470 IF INKEY$="0" THEN LET c=c+1: LET sc=sc+(di*2) 480 IF INKEY$="1" THEN LET r=r+1 490 IF INKEY$="9" THEN LET c=c-1: LET sc=sc+(di*2) 500 IF INKEY$="" THEN LET r=r-1: LET sc=sc+(di*2) 510 IF r>20 THEN LET r=21 520 IF c<0 THEN LET c=0 530 IF c>31 THEN LET c=31 540 IF SCREEN$ (r,c)="#" THEN GO TO 950 550 IF SCREEN$ (r,c)="." THEN GO TO 960 560 IF SCREEN$ (r,c)="^" THEN GO TO 970 570 IF SCREEN$ (r,c)="*" THEN GO TO 980 580 IF SCREEN$ (r,c)="X" THEN GO TO 990 590 IF SCREEN$ (r,c)="<" THEN GO TO 690 600 IF SCREEN$ (r,c)=">" THEN GO TO 690 610 PRINT AT 1,18; INVERSE 1;"TIME GONE: ";w 620 IF r=2 THEN GO TO 790 630 LET x=INT (RND*31) 640 LET z=INT (RND*21) 650 IF z<3 THEN GO TO 630 660 PRINT AT z,x;"X" 670 IF r<2 THEN LET r=2 680 NEXT w 690 PRINT AT 10,9;"YOU'RE DEAD!!!" 700 FOR a=0 TO -20 STEP -1: BEEP .05,a: NEXT a 710 CLS : PRINT AT 10,9;"AGAIN? (Y or N)" 720 INPUT LINE a$ 730 IF hi"a" AND l$<>"A" THEN GO TO 880 860 LET di=di+1: IF di<7 THEN GO TO 880 870 PRINT AT 10,7; PAPER 7; INK 4;"You're the greatest!!": PAUSE 50: PRINT AT 15,6;"Your final score is ";scs: LET scs=0: PAUSE 200: GO TO 710 880 PRINT AT 10,8; PAPER 7; FLASH 1;"Your score is: ";scs: PAUSE 200 890 LET scs=0 900 PAPER 7: CLS : IF l$="a" OR l$="A" THEN GO TO 80 910 GO TO 50 920 PRINT AT 10,0;"TOO SLOW, YOUR BASE DISAPPEARED" 930 FOR a=1 TO 30: BEEP .01,1+20: BEEP .01,a-30: NEXT a 940 GO TO 710 950 LET sc=sc+100: LET l=l+1: BEEP .01,30: GO TO 550 960 LET sc=sc+50: LET l=l+1: BEEP .01,20: GO TO 560 970 LET sc=sc+150: LET l=l+1: BEEP .01,10: GO TO 570 980 LET sc=sc+50: LET l=l+1: BEEP .01,40: GO TO 580 990 LET l=l-1: BEEP .01,50: IF l=0 THEN GO TO 690 1000 GO TO 590 1010 PAPER 7: CLS : LET hi=0: LET scs=hi 1020 PRINT AT 21,6;"DAVID NAYLOR 1983" 1030 PRINT AT 9,NOT PI; INK 1;" H * O * M * E B * A * S * E " 1040 FOR r=1 TO 20: BEEP .05,r: BEEP .01,r+10: BEEP .001,r-20: NEXT r 1050 PAUSE 50: CLS : PRINT "SCORING :"'"2,4,6,8,10,12,14pts depending onlevel for moving: forwards",," left",," right"," 50pts for a shooting star (*) for a star (.)","100pts for a power pack (#)","150pts for a flying saucer (^) 200pts on completing return"''"SKILL LEVELS:"'"1...50*(X) ,350 secs"'"2..100*(X) ,175 secs"'"3..150*(X) ,113 secs","4..200*(X) , 85 secs" 1060 PRINT "5..250*(X) , 70 secs","6..300*(X) , 58 secs","7..350*(X) , 50 secs" 1070 PRINT AT 21,9;"PRESS A KEY": PAUSE 0: CLS : PRINT '''''"USE"'"'0' for right"'"'9' for left"'"'1' for down"'"You move forwards automatically" 1080 PRINT #1;" PRESS A KEY TO START": PAUSE NOT PI: CLS 1090 INPUT "If you want skill levels to"'"build up automatically (1-7), then press 'a'."; LINE l$ 1100 LET P$="#.^*" 1110 FOR l=0 TO 7 1120 DATA 24,60,126,255,126,60,24,0 1130 READ n: POKE USR "n"+l,n: NEXT l: RETURN ```