Star Trek

Products: Star Trek
Type: Program
Platform(s): TS 2068
Tags: Game

This program is a full implementation of the classic Star Trek text adventure game, adapted with TS-2068-specific features including custom UDG graphics for the Enterprise, Klingon battle cruisers, and Federation starbases, as well as BEEP and SOUND commands for audio feedback. The galaxy is represented as an 8×8 quadrant grid, each subdivided into an 8×8 sector grid, with Klingon ships, starbases, and stars procedurally distributed at startup using random number thresholds. Navigation uses a nine-direction circular course system with fractional warp factors, and combat involves both phaser energy allocation and photon torpedo trajectory tracking through the sector string array. The program supports saving and resuming a game mid-session via SAVE “TREK” LINE 1990, and includes a library computer with six functions including a cumulative galactic map, direction/distance calculator, and region name display.


Program Analysis

Program Structure

The program is organized into well-defined functional blocks, roughly as follows:

  1. Lines 1–35: Title screen, credits, UDG setup (via GO SUB 9490), and sound initialization (GO SUB 9600).
  2. Lines 40–275: Optional multi-page instruction sequence with hardcopy (COPY) support at each page break.
  3. Lines 276–1305: Variable initialization, galaxy generation, and mission briefing.
  4. Lines 1310–3980: Main game loop — quadrant entry, movement, collision detection, and energy management.
  5. Lines 4000–5490: Weapon systems: long-range sensors, phasers, and photon torpedoes.
  6. Lines 5530–5980: Shield control and damage control subsystems.
  7. Lines 6000–6420: Klingon firing, end-of-game conditions, and short-range sensor scan display.
  8. Lines 7280–8520: Library computer (six options: galactic record, status, torpedo data, starbase nav, direction/distance calculator, region name map).
  9. Lines 8580–8900: Quadrant string utilities — finding empty sectors, inserting objects, and comparing positions.
  10. Lines 9010–9300: Quadrant name lookup using computed GO TO.
  11. Lines 9490–9595: UDG definition and separator string initialization.
  12. Lines 9600–9899: Sound effect subroutines.
  13. Lines 9900–9990: Save-game routine using SAVE "TREK" LINE 1990.

Quadrant Representation

The entire quadrant is stored as a single string Q$ of 192 characters (8×8 sectors × 3 characters each). Objects are inserted and read back using calculated offsets. The key formula appears at line 8670:

LET S8=INT (Z2-.5)*3+INT (Z1-.5)*24+1

This maps a (column, row) sector coordinate to a 1-based index into Q$. A complementary subroutine at line 8830 reads from Q$ and sets Z3=1 if the substring matches A$, acting as a hit-test. The three-character object codes are UDG sequences: \a\b\c for the Enterprise, \d\e\f for Klingons, \j\k\l for starbases, and " * " for stars.

UDG Graphics

Nine UDGs (A–G, I, J, K, L) are defined at lines 9500–9545 by POKEing pixel data directly into USR "A" through USR "L". Each graphic is three characters wide (a 24-pixel-wide sprite), giving ships and starbases a recognizable multi-character appearance on the sensor display. UDG “I” is set uniformly to value 16 (a single horizontal rule pixel row), used as a vertical divider in the long-range sensor output.

Computed GO TO for Device Names and Quadrant Names

Two subroutines exploit computed GO TO as a dispatch table:

  • Line 8790: GO TO 8790+R1*2 — dispatches to one of eight device-name assignments (warp engines, sensors, phasers, etc.) based on the device index R1.
  • Lines 9030/9120: GO TO 9030+(Z4*10) and GO TO 9120+(Z4*10) — select a star region name based on quadrant row, then GO TO 9220+(Z5*10) appends a Roman numeral suffix based on the column.

The same technique is used at line 6830: GO TO 6840+10+(I*50) dispatches the status display loop to one of eight labeled PRINT lines (6900, 6950, 7000, … 7250).

Galaxy Initialization

At lines 820–1040, each of the 64 quadrants receives a three-digit value G(I,J) = K3*100 + B3*10 + S3 encoding Klingon count (hundreds), starbase count (tens), and star count (units). Klingon placement uses RND thresholds: >0.98 → 3 Klingons, >0.95 → 2, >0.80 → 1. Starbases are placed independently with probability 0.04. If no starbases result, one is forced into a random quadrant (lines 1150–1160), guaranteeing the player always has at least one resupply point.

Navigation and Movement

The nine-direction course system uses a 9×2 array C(9,2) initialized at lines 530–600 with unit direction vectors. Fractional courses are interpolated between adjacent cardinal directions at line 3110:

LET X1=C(C1,1)+(C(INT C1+1,1)-C(C1,1))*(C1-INT (C1))

The ship moves N = INT(W1*8+.5) steps, each step checking the quadrant string for collisions. On crossing a quadrant boundary, lines 3500–3860 recalculate the new quadrant and sector coordinates using full galactic coordinates.

Photon Torpedo Bug

At line 4850, the torpedo X1 direction vector is computed as:

LET X1=C(C1,1)+(C(1+1,1)-C(C1,1))*(C1-INT (C1))

The interpolation references C(1+1,1) (i.e., C(2,1)) instead of C(INT C1+1,1), meaning the fractional interpolation for torpedo direction always uses course 2 as the upper bound rather than the next course above C1. This causes incorrect torpedo trajectories for all fractional courses other than those between 1 and 2.

Sound System

Sound is toggled via a SND flag. When enabled, POKE 23609,25 sets the Spectrum’s system variable for beeper volume. The game uses both BEEP for simple tones (phaser fire, alerts, docking) and the TS2068 SOUND keyword (masked as } per preprocessing rules) for AY chip effects on Klingon destruction (lines 4553, 5108). Subroutine 9675 plays a brief musical fanfare using a sequence of BEEP calls at the title screen.

Save/Resume Feature

Lines 9900–9940 implement a mid-game save by issuing SAVE "TREK" LINE 1990, which saves the entire program with an auto-start at line 1990 (the main command prompt). This preserves all game variables in the saved snapshot, allowing the player to resume exactly where they left off. A second save block at lines 9950–9960 uses LINE 1 (full restart).

Key Variables

VariablePurpose
G(8,8)Galaxy map: encoded Klingon/starbase/star counts per quadrant
Z(8,8)Player’s explored/known galaxy map (same encoding, updated on scan)
K(3,3)Klingon positions (col 1,2) and shield energy (col 3) for up to 3 per quadrant
D(8)Damage state for 8 ship systems; negative = damaged
Q$192-char string representing the current quadrant’s 8×8 sector grid
ECurrent ship energy
SShield energy
TCurrent stardate
K9Total Klingons remaining in galaxy
SNDSound effects flag (1=on, 0=off)
CLSFlag to suppress automatic CLS at command prompt

Notable Anomalies

  • Line 8700 always executes even when S8=1 or S8=190 have already handled the edge cases at lines 8680–8690, resulting in a redundant (but harmless) string replacement.
  • Line 9507 has a stray colon (9507:) before RESTORE 9507, which is syntactically valid but unusual.
  • Lines 9800–9899 define a subroutine (a rising-then-falling tone sweep) that is never called anywhere else in the program.
  • The comment at line 4180 (REM IF N(L)<0 THEN PRINT "*** ";: GO TO 4230) is dead code left inside a REM statement — the actual N/A logic is handled by lines 4215 and 4225 instead.
  • Lines 9605–9630 form a sound-initialization subroutine called at line 3 (GO SUB 9600), but line 9600 does not exist — execution falls through to line 9605, which is the intended entry point. This is the well-known technique of targeting a non-existent line.
  • The Roman numeral suffix dispatch at lines 9270–9300 duplicates I–IV rather than continuing with V–VIII, meaning quadrants in columns 5–8 are labeled I–IV rather than V–VIII.

Content

Appears On

Capital Area Timex Sinclair User Group’s Library Tape.

Related Products

Implementation of the famous text-based Star Trek game.

Related Articles

Related Content

Image Gallery

Star Trek

Source Code

    1 REM *************************** COPYRIGHT BY T.S.S. 1984  **    ALL RIGHT RESERVED.       *********************************
    2 BORDER 1: PAPER 1: INK 7: CLS : POKE 23658,8
    3 GO SUB 9490
   10 GO SUB 9600
   15 CLS 
   20 PRINT AT 2,0;"*********************************";TAB 31;"**";TAB 31;"**";TAB 31;"**";TAB 7;"*  * STAR TREK *  *";TAB 31;"**";TAB 31;"**";TAB 6;"THE KLINGON ENCOUNTER";TAB 31;"**";TAB 31;"**";TAB 31;"**";TAB 31;"**";TAB 31;"*"
   25 PRINT "********************************"
   28 PRINT "     T. S.  S E R V I C E S."
   30 PRINT "     PUBLIC DOMAIN SOFTWARE",,,"THIS PROGRAM COMES TO YOU       THROUGH THE COMBINED EFFORTS OF NATHAN BROWN, DON BARNARD, AND  JAMES BROWN."
   35 GO SUB 9675
   40 INPUT "    DO YOU NEED INSTRUCTIONS                (Y/N)";K$: IF K$="N" THEN GO TO 276
   45 IF K$<>"Y" THEN GO TO 40
   50 CLS 
   60 PRINT ,,,,"    'STAR TREK' INSTRUCTIONS",,,
   70 PRINT ,,"1. WHEN  YOU  SEE  \COMMAND ?\,    ENTER  ONE  OF  THE  LEGAL      COMMANDS (NAV, SRS, LRS, PHA,   TOR, SHE, DAM, COM, OR XXX )."
   80 PRINT ,,"2. IF  YOU  SHOULD  TYPE  IN  AN   ILLEGAL COMMAND, YOU'LL GET A   SHORT LIST OF LEGAL COMMANDS."
   90 PRINT ,,"3. SOME COMMANDS  REQUIRE YOU TO   ENTER DATA.  FOR EXAMPLE, THE   'NAV' COMMAND COMES BACK WITH   'COURSE (1-9) ?'. IF YOU TYPE   IN ILLEGAL DATA LIKE NEGATIVE   NUMBERS, THAT COMMAND WILL BE   ABORTED."
   93 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
   94 CLS 
  100 PRINT ,,"  THE GALAXY IS  DIVIDED INTO AN8 x 8  QUADRANT  GRID, AND  EACHQUADRANT IS FURTHER DIVIDED INTOAN 8 x 8 SECTOR GRID.",
  110 PRINT ,,"  YOU'LL BE  ASSIGNED A STARTINGPOINT SOMEWHERE IN THE GALAXY TOBEGIN  YOUR  TOUR OF DUTY AS THECOMMANDER  OF  THE  STARSHIP    ""ENTERPRISE"".",,,,"  YOUR  MISSION:   TO  SEEK  ANDDESTROY  THE  FLEET  OF  KLINGONWARSHIPS WHICH ARE  MENACING THEUNITED FEDERATION OF PLANETS."
  115 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
  118 CLS 
  120 PRINT ,,,," YOU HAVE THE FOLLOWING COMMANDSAVAILABLE  TO YOU AS  CAPTAIN OFTHE STARSHIP ""ENTERPRISE""."
  130 PRINT ,,"         \NAV\ COMMAND",,,"WARP ENGINE  CONTROL:  COURSE ISIN A CIRCULAR MUMERICAL ARRANGE-MENT AS  SHOWN.  INTERGER & REALVALUES MAY BE USED.  (COURSE 1.5IS HALFWAY BETWEEN 1 AND 2.)"
  140 PRINT "VALUES  MAY  APPROACH 9.0, WHICHITSELF IS EQUIVALENT TO 1.0.",,,
  150 PRINT "ONE  WARP  FACTOR IS THE SIZE OFONE QUADRANT.  THEREFORE, TO GETFROM  QUADRANT  6,5 TO 5,5,  YOUWOULD USE COURSE 3 WARP FACTOR 1"
  155 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
  156 CLS 
  160 PRINT ,,"       4  3  2                          . . .                            ...                         5 ---*--- 1   ""COURSE""              ...                            . . .                          6  7  8"
  165 PRINT ,,"         \SHE\ COMMAND",,,"SHIELD  CONTROL:    DEFINES  THENUMBER  OF  ENERGY UNITS  TO  BEASSIGNED TO THE  SHIELDS.",,,"ENERGY IS  TAKEN FORM  THE TOTALSHIPS ENERGY.",,,,"NOTE THAT THE  STATUS  DISPLAY'STOTAL  ENERGY  INCLUDES   SHIELDENERGY."
  170 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
  171 CLS 
  180 PRINT ,,"         \SRS\ COMMAND",,,"SHORT RANGE SENSOR SCAN:   SHOWSYOU  A  SCAN  OF  YOUR   PRESENTQUADRANT."
  190 PRINT ,,,,"SYMBOLOGY ON YOUR SENSOR  SCREENIS AS FOLLOWS:",,,,"\a\b\c = YOUR STARSHIP'S POSITION  ",,"\d\e\f = KLINGON BATTLE CRUISER    ",,"\j\k\l = FEDERATION STARBASE","    (REFUEL/REPAIR/RE-ARM HERE!)",," *  = STAR"
  195 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
  196 CLS 
  200 PRINT ,,"         \LRS\ COMMAND",,,"LONG  RANGE SENSOR  SCAN:  SHOWSCONDITIONS   IN  SPACE  FOR  ONEQUADRANT  ON  EACH  SIDE  OF THEENTERPRISE,   WHICH  IS  IN  THEMIDDLE OF THE SCAN. N/A MEANS   THAT AREA OF SPACE HAS NOT BEEN MAPPED YET. ",,,,"THE SCAN IS  CODED  IN  THE FORM\###\,  WHERE THE UNITS DIGIT ISTHE  NUMBER  OF  STARS, THE TENSDIGIT IS THE NUMBER OF STARBASESAND THE  HUNDREDS  DIGIT  IS THENUMBER OF KLINGONS."
  210 PRINT ,,,,"EXAMPLE   - 2 0 7__= 7 STARS                ^ ^____= 0 STARBASES            \i______= 2 KLINGONS."
  215 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
  216 CLS 
  220 PRINT ,,"         \TOR\ COMMAND",,,"PHOTON TORPEDO CONTROL:  TORPEDOCOURSE IS  THE  SAME  AS USED INWARP ENGINE CONTROL.",,,"IF YOU HIT  THE KLINGON  VESSEL,HE IS DESTROYED  AND CANNOT FIREBACK AT  YOU.",,,,"IF YOU  MISS, YOU ARE SUBJECT TOHIS PHASER  FIRE.",,,"IN EITHER CASE YOU  ARE  SUBJECTTO THE PHASER FIRE OF ALL  OTHERKLINGONS IN THE QUADRANT."
  225 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
  226 CLS 
  240 PRINT ,,,,"         \COM\ COMMAND",,,"THE  LIBRARY - COMPUTER CONTAINSSEVEN OPTIONS:"
  250 PRINT ,,"OPTION 1 = STATUS  REPORT  SHOWSTHE  NUMBER  OF  KLINGONS, STAR-DATES, AND  STARBASES  REMAININGIN THE GAME.",,,,"OPTION 2 = PHOTON TORPEDO DATA  GIVES  DIRECTIONS  AND  DISTANCEFROM  THE  ALL THE  KLINGONS  TOTHE ENTERPRISE IN THIS QUADRANT."
  258 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
  259 CLS 
  260 PRINT ,,,,,,,,"OPTION 3  =  STARBASE  NAV  DATAGIVES  DIRECTION AND DISTANCE TOANY STARBASE IN YOUR QUADRANT."
  270 PRINT ,,"OPTION  4  =  DIRECTION/DISTANCECALCULATOR  ALLOWS  YOU TO ENTERCOORDINATES  FOR  DIRECTION/    DISTANCE CALCULATIONS."
  273 PRINT ,,"OPTION 5 = GALACTIC REGION  NAMEMAP  PRINTS  THE  NAMES  OF  THESIXTEEN  MAJOR  GALACTIC REGIONSREFERRED TO IN THE GAME.",,,
  274 PRINT ,," S-GAME = WILL ALLOW YOU TO SAVE          THE GAME AND RESTART AT         POINT WHERE YOU STOPPED."
  275 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY 
  276 CLS : LET CLS=0: LET SRS=0: PRINT AT 18,0;"PREPARE TO BEAM ABOARD AND BEGINYOUR TOUR OF  DUTY, CAPTAIN."
  280 PRINT AT 0,13;"___                  \      ___/ --\___               \   _/...........\____           \_/...................\____ __ ......................._____)  /....__..............__/       / .../  \____   ____/          /..../        \_/               ..../                           ___/_                                \                           1701 !                              /                          ____/"
  290 PRINT ,," THE USS ENTERPRISE --- NCC-1701"
  293 GO SUB 9750
  295 PRINT #1; BRIGHT 1; FLASH 1;"       STANDBY FOR ORDERS          PRIORITY 1 MESSAGE COMING IN ": FLASH 0
  300 LET Z$="                         "
  310 GO SUB 9750
  330 DIM G(8,8): DIM C(9,2): DIM K(3,3): DIM N(3): DIM Z(8,8): DIM D(8): DIM X$(2,3)
  370 LET T=INT (RND*20+20)*100: LET T0=T: LET T9=25+INT (RND*10): LET D0=0: LET E=3000: LET E0=E
  440 LET P=10: LET P0=P: LET S9=200: LET S=0: LET B9=0: LET K9=0: LET X$(2)="   ": LET X$(1)="IS "
  470 DEF FN D(D)=SQR (ABS (K(I,1)-S1)^2+ABS (K(I,2)-S2)^2)
  475 DEF FN R(R)=INT ((RND*R)*7.98+1.01)
  480 REM *** INITIALIZE ENTERPRISE'S POSITION
  490 LET Q1=FN R(1): LET Q2=FN R(1): LET S1=FN R(1): LET S2=FN R(1)
  530 FOR I=1 TO 9: LET C(I,1)=0: LET C(I,2)=0: NEXT I
  540 LET C(3,1)=-1: LET C(2,1)=-1: LET C(4,1)=-1: LET C(4,2)=-1: LET C(5,2)=-1: LET C(6,2)=-1
  600 LET C(1,2)=1: LET C(2,2)=1: LET C(6,1)=1: LET C(7,1)=1: LET C(8,1)=1: LET C(8,2)=1: LET C(9,2)=1
  670 FOR I=1 TO 8: LET D(I)=0: NEXT I
  710 LET W$="NAVSRSLRSPHATORSHEDAMCOMXXX"
  810 REM **** SET UP WHAT EXISTS IN GALAXY ****
  820 FOR I=1 TO 8: FOR J=1 TO 8: LET K3=0: LET Z(I,J)=0: LET R1=RND
  850 IF R1>.98 THEN LET K3=3: LET K9=K9+3: GO TO 980
  860 IF R1>.95 THEN LET K3=2: LET K9=K9+2: GO TO 980
  870 IF R1>.80 THEN LET K3=1: LET K9=K9+1
  980 LET B3=0: IF RND>.96 THEN LET B3=1: LET B9=B9+1
 1040 LET G(I,J)=K3*100+B3*10+FN R(1): NEXT J: NEXT I: IF K9>T9 THEN LET T9=K9+1
 1100 IF B9<>0 THEN GO TO 1200
 1150 IF G(Q1,Q2)<200 THEN LET G(Q1,Q2)=G(Q1,Q2)+100: LET K9=K9+1
 1160 LET B9=1: LET G(Q1,Q2)=G(Q1,Q2)+10: LET Q1=FN R(1): LET Q2=FN R(1)
 1200 LET K7=K9: IF B9<>1 THEN LET X$(2)="S  ": LET X$(1)="ARE"
 1210 GO SUB 9750
 1230 CLS : PRINT ,,,,,,,,,,,,"  YOUR ORDERS ARE AS FOLLOWS:"
 1240 PRINT ,,,,"DESTROY THE ";K9;" KLINGON WARSHIPS","WHICH  HAVE INVADED THE GALAXY "
 1250 PRINT "BEFORE    THEY    CAN    DESTROYFEDERATION    HEADQUARTERS ";
 1260 PRINT "   ONSTARDATE ";T0+T9;".  THIS  GIVES  YOU";T9;" DAYS. THERE ";X$(1);" ";
 1270 PRINT " ";B9;" STARBASE","IN THE GALAXY FOR RESUPPLYING","YOUR SHIP."
 1280 PRINT ,,,, FLASH 1;"   HIT ANY KEY WHEN READY TO            ACCEPT COMMAND          "
 1300 LET I=RND: IF INKEY$="" THEN GO TO 1300
 1305 CLS 
 1310 REM  **** HERE ANY TIME NEW QUADRANT ENTERED ****
 1315 GO SUB 9750
 1320 LET Z4=Q1: LET Z5=Q2: LET K3=0: LET B3=0: LET S3=0: LET G5=0: LET D4=.5*RND: LET Z(Q1,Q2)=G(Q1,Q2)
 1390 IF Q1<1 OR Q1>8 OR Q2<1 OR Q2>8 THEN GO TO 1600
 1430 GO SUB 9030: PRINT : IF T0<>T THEN GO TO 1490
 1460 LET D(2)=0: CLS : PRINT ,,,,,,,,,,,,"YOUR  MISSION  BEGINS  WITH YOURSTARSHIP LOCATED ";
 1470 PRINT "IN THE GALACTICQUADRANT, """;G$;""".": GO TO 1500
 1490 CLS : PRINT "     NOW ENTERING QUADRANT",TAB 15-INT LEN G$/2;G$
 1500 PRINT : LET K3=INT (G(Q1,Q2)*.01): LET B3=INT (G(Q1,Q2)*.1)-10*K3
 1540 LET S3=G(Q1,Q2)-100*K3-10*B3: IF K3=0 THEN GO TO 1590
 1545 IF snd=0 THEN GO TO 1560
 1550 FOR M=1 TO 20: BEEP .075,12: NEXT M
 1560 PRINT FLASH 1; INK 7; PAPER 0;"COMBAT AREA"; INK 7; PAPER 2; FLASH 0;"        "; FLASH 1;"CONDITION RED"; INK 0: IF S>200 THEN GO TO 1590
 1570 IF SND=0 THEN GO TO 1580
 1575 FOR M=1 TO 10: BEEP .075,-11: NEXT M
 1580 PRINT ,, FLASH 1;"    SHIELDS DANGEROUSLY LOW     "
 1583 IF SND=0 THEN GO TO 1590
 1585 FOR M=1 TO 10: BEEP .075,-20: NEXT M
 1590 FOR I=1 TO 3: LET K(I,1)=0: LET K(I,2)=0: NEXT I
 1600 FOR I=1 TO 3: LET K(I,3)=0: NEXT I: LET Q$=Z$+Z$+Z$+Z$+Z$+Z$+Z$+Z$( TO 17)
 1660 REM POSITION ENTERPRISE IN QUADRANT, THEN PLACE "K3" KLINGONS, & "B3" STARBASES, & "S3" STARS ELSEWHERE.
 1680 LET A$="\a\b\c": LET Z1=S1: LET Z2=S2: GO SUB 8670: IF K3<1 THEN GO TO 1820
 1720 FOR I=1 TO K3: GO SUB 8590: LET A$="\d\e\f": LET Z1=R1: LET Z2=R2
 1725 IF SND=1 THEN BEEP .05,48
 1780 GO SUB 8670: LET K(I,1)=R1: LET K(I,2)=R2: LET K(I,3)=S9*(0.5+RND): NEXT I
 1820 IF B3<1 THEN GO TO 1910
 1880 GO SUB 8590: LET A$="\j\k\l": LET Z1=R1: LET B4=R1: LET Z2=R2: LET B5=R2: GO SUB 8670
 1910 FOR I=1 TO S3: GO SUB 8590: LET A$=" * ": LET Z1=R1: LET Z2=R2: GO SUB 8670: NEXT I
 1980 GO SUB 6430
 1990 BORDER 1: PAPER 1: IF S+E>10 AND E>10 OR D(7)=0 THEN GO TO 2060
 2013 IF SND=0 THEN GO TO 2020
 2015 FOR M=24 TO 0: BEEP .05,-20: BEEP .05,21: NEXT M
 2020 CLS : PRINT : PRINT "** FATAL ERROR **   YOU'VE JUST STRANDED YOUR SHIP IN SPACE.    YOU HAVE INSUFFICIENT MANUVERINGENERGY, AND SHIELD CONTROL IS   PRESENTLY INCAPABLE OF DIVERTINGENERGY TO THE ENGINE ROOM!"
 2050 LET A$="   "
 2060 INPUT "YOUR COMMAND, SIR? ";A$: IF A$="SRS" THEN LET SRS=1
 2065 IF A$="S-GAME" THEN GO TO 9900
 2070 IF CLS=0 THEN CLS 
 2072 LET CLS=0
 2075 IF LEN A$<3 THEN CLS : GO TO 2160
 2080 RESTORE : FOR I=1 TO 9: READ Z22: IF A$<>W$(3*I-2 TO 3*I) THEN GO TO 2160
 2140 GO TO Z22: DATA 2300,1980,4000,4260,4700,5530,5690,7290,6270
 2150 REM  **COMMAND ENTRY**
 2160 NEXT I: RESTORE : PRINT "ENTER ONE OF THE FOLLOWING:",,," NAV   (TO SET COURSE)"," SRS   (SHORT RANGE SENSOR SCAN)"
 2200 PRINT " LRS   (LONG RANGE SENSOR SCAN)"," PHA   (FIRE PHASERS)"," TOR   (FIRE PHOTON TORPEDOS)"
 2230 PRINT " SHE   (RAISE OR LOWER SHIELDS)"," DAM   (DAMAGE CONTROL REPORTS)"
 2240 PRINT " COM   (CALL LIBRARY COMPUTER)"," XXX   (RESIGN COMMAND)","S-GAME (SAVE GAME FROM HERE)"
 2250 GO TO 1990
 2290 REM COURSE CONTROL BEGINS HERE
 2300 PRINT AT 14,1;"     4  3  2                          . . .                            ...                         5 ---*--- 1   'COURSE'              ...                            . . .                          6  7  8": INPUT "COURSE (1-9)";C1
 2305 IF C1=9 THEN LET C1=1
 2310 IF C1>=1 AND C1<9 THEN GO TO 2350
 2317 IF SND=0 THEN GO TO 2330
 2320 FOR M=1 TO 10: BEEP .025,50: NEXT M
 2330 PRINT "LT. SULU REPORTS,",,,"""INCORRECT COURSE DATA, SIR.""": GO TO 1990
 2350 LET X$(2)=" 8 ": IF D(1)<0 THEN LET X$(2)="0.2"
 2360 INPUT ("WARP FACTOR ( 0-";X$(2);")");W1: IF D(1)<0 AND W1>.2 THEN GO TO 2470
 2380 IF W1>0 AND W1<=8 THEN GO TO 2490
 2390 IF W1=0 THEN GO TO 1990
 2420 PRINT "CHIEF ENGINEER SCOTT REPORTS,","""SIRRR! SHE CAN'T TAKE WARP """;W1;"!": GO TO 1990
 2470 PRINT "WARP ENGINES ARE DAMAGED.","MAX SPEED = WARP 0.2": GO TO 1990
 2490 CLS : LET N=INT (W1*8+.5): IF E-N>=0 THEN GO TO 2590
 2500 PRINT "ENGINEERING REPORTS, SIR,       INSUFFICIENT ENERGY AVAILABLE   FOR MANEUVERING AT WARP ";W1,"SIR!"
 2530 IF S<N-E OR D(7)<0 THEN GO TO 1990
 2550 PRINT "DEFLECTOR CONTROL ROOM          ACKNOWLEGES: ",S,"UNITS OF ENERGY";TAB 0;"PRESENTLY DEPLOYED TO SHIELDS."
 2555 IF SND=0 THEN GO TO 2570
 2560 FOR M=1 TO S/20: BEEP .005,M-23: NEXT M
 2570 GO TO 1990
 2580 REM KLINGONS MOVE/FIRE ON MOVING STARSHIP . . .
 2590 FOR I=1 TO K3: IF K(I,3)=0 THEN GO TO 2700
 2610 LET A$="   ": LET Z1=K(I,1): LET Z2=K(I,2): GO SUB 8670: GO SUB 8590
 2660 LET K(I,1)=Z1: LET K(I,2)=Z2: LET A$="\d\e\f": GO SUB 8670
 2700 NEXT I: GO SUB 6000: LET D1=0: LET D6=W1: IF W1>=1 THEN LET D6=1
 2770 FOR I=1 TO 8: IF D(1)>=0 THEN GO TO 2880
 2790 LET D(I)=D(I)+D6: IF D(I)>-.1 AND D(I)<0 THEN LET D(I)=-.1: GO TO 2880
 2800 IF D(I)<0 THEN GO TO 2880
 2810 IF D1<>1 THEN LET D1=1: PRINT "DAMAGE CONTROL REPORT:  ";
 2840 PRINT : LET R1=I: GO SUB 8790: PRINT G$;" REPAIRED."
 2880 NEXT I: IF RND>.2 THEN GO TO 3070
 2910 LET R1=FN R(1): IF RND>=.6 THEN GO TO 3000
 2925 IF SND=0 THEN GO TO 2930
 2928 FOR M=10 TO 0 STEP -1: BEEP .005,M: NEXT M
 2930 LET D(R1)=D(R1)-(RND*5+1): PRINT "DAMAGE CONTROL REPORT:": PRINT 
 2960 GO SUB 8790: PRINT G$;" DAMAGED": PRINT : GO TO 3070
 3000 LET D(R1)=D(R1)+RND*3+1: PRINT "DAMAGE CONTROL REPORT:": PRINT 
 3030 GO SUB 8790: PRINT G$;TAB 0;"STATE OF REPAIR IMPROVED": PRINT 
 3035 IF SND=0 THEN GO TO 3060
 3040 FOR M=0 TO 10: BEEP .005,M+30: NEXT M
 3060 REM BEGIN MOVING STARSHIP
 3070 LET A$="   ": LET Z1=INT (S1): LET Z2=INT (S2): GO SUB 8670
 3110 LET X1=C(C1,1)+(C(INT C1+1,1)-C(C1,1))*(C1-INT (C1)): LET X=S1: LET Y=S2
 3140 LET X2=C(C1,2)+(C(INT C1+1,2)-C(C1,2))*(C1-INT (C1)): LET Q4=Q1: LET Q5=Q2
 3170 FOR I=1 TO N: LET S1=S1+X1: LET S2=S2+X2: IF S1<1 OR S1>=9 OR S2<1 OR S2>=9 THEN GO TO 3500
 3240 LET S8=INT (S1)*24+INT (S2)*3-26: IF Q$(S8 TO S8+2)="   " THEN GO TO 3360
 3310 PRINT FLASH 1;AT 6,0;"        COLLISION ALERT!!       ": FLASH 0
 3314 IF SND=0 THEN GO TO 3320
 3315 FOR M=48 TO -24 STEP -1: BEEP .005,M: NEXT M
 3320 LET S1=INT (S1-X1): LET S2=INT (S2-X2): PRINT "WARP ENGINES SHUT DOWN AT ";
 3350 PRINT "SECTOR";S1;",";S2;" DUE TO BAD NAVIGATION": GO TO 3370
 3360 NEXT I: LET S1=INT (S1): LET S2=INT (S2)
 3370 LET A$="\a\b\c": LET Z1=INT (S1): LET Z2=INT (S2): GO SUB 8670: GO SUB 3910: LET T8=1
 3430 IF W1<1 THEN LET T8=.1*INT (10*W1)
 3450 LET T=T+T8: IF T>T0+T9 THEN GO TO 6220
 3470 REM SEE IF DOCKED, THEN GET COMMAND
 3480 GO TO 1980
 3490 REM EXCEDED QUADRANT LIMITS
 3500 LET X=8*Q1+X+N*X1: LET Y=8*Q2+Y+N*X2: LET Q1=INT (X/8): LET Q2=INT (Y/8): LET S1=INT (X-Q1*8)
 3550 LET S2=INT (Y-Q2*8): IF S1=0 THEN LET Q1=Q1-1: LET S1=8
 3590 IF S2=0 THEN LET Q2=Q2-1: LET S2=8
 3620 LET X5=0: IF Q1<1 THEN LET X5=1: LET Q1=1: LET S1=1
 3670 IF Q1>8 THEN LET X5=1: LET Q1=8: LET S1=8
 3710 IF Q2<1 THEN LET X5=1: LET Q2=1: LET S2=1
 3750 IF Q2>8 THEN LET X5=1: LET Q2=8: LET S2=8
 3790 IF X5=0 THEN GO TO 3860
 3795 IF SND=0 THEN GO TO 3800
 3798 FOR M=48 TO 56: BEEP .025,M-6: BEEP .025,M: NEXT M
 3800 PRINT ,,"LT. UHURA REPORTS: SIR...       MESSAGE FROM  STARFLEET COMMAND:",,
 3805 GO SUB 9750
 3810 PRINT """PERMISSION TO ATTEMPT CROSSING OF GALACTIC PERIMETER"
 3820 PRINT "IS HEREBY *DENIED*";". ",; FLASH 1;"SHUT DOWN YOUR ENGINES."; FLASH 0;""""
 3830 PRINT ,,"CHIEF ENGINEER SCOTT REPORTS:   ""DAMN IT JIM!!!",,"WARP ENGINES SHUT DOWN ";
 3840 PRINT "AT SECTOR";S1;",";S2;" OF QUADRANT ";Q1;",";Q2;"."""
 3845 PAUSE 200
 3850 IF T>T0+T9 THEN GO TO 6220
 3860 IF 8*Q1+Q2=8*Q4+Q5 THEN GO TO 3370
 3870 LET T=T+1: GO SUB 3910: GO TO 1320
 3900 REM MANEUVER ENERGY S/R **
 3910 LET E=E-N-10: IF E>=0 THEN RETURN 
 3930 PRINT "SHIELD CONTROL SUPPLIES ENERGY TO COMPLETE THE MANEUVER."
 3940 LET S=S+E: LET E=0: IF S<=0 THEN LET S=0
 3980 RETURN 
 3990 REM LONG RANGE SENSOR SCAN CODE
 4000 IF D(3)<0 THEN PRINT "LONG RANGE SENSORS ARE","INOPERABLE": GO TO 1990
 4030 PRINT ,,,,"LONG RANGE SENSOR SCAN FOR:"," QUADRANT ";Q1;",";Q2,,,,
 4040 LET O$="\g\g\g\g\g\g\g\g\g\g\g\g\g": PRINT O$
 4060 FOR I=Q1-1 TO Q1+1: LET N(1)=-1: LET N(2)=-2: LET N(3)=-3: FOR J=Q2-1 TO Q2+1
 4065 IF SND<>1 THEN GO TO 4120
 4070 BEEP .005,I-5
 4120 IF I>0 AND I<9 AND J>0 AND J<9 THEN LET N(J-Q2+2)=G(I,J): LET Z(I,J)=G(I,J)
 4180 NEXT J: FOR L=1 TO 3: PRINT "\i";: REM IF N(L)<0 THEN PRINT "*** ";: GO TO 4230
 4210 LET A$=STR$ (N(L)+1000)
 4215 IF N(L)<0 THEN LET A$="***"
 4220 IF N(L)>=0 THEN PRINT A$(2 TO );"";
 4225 IF N(L)<0 THEN PRINT A$;"";
 4230 NEXT L: PRINT "\i": PRINT O$: NEXT I: GO TO 1990
 4250 REM PHASER CONTROL CODE BEGINS HERE
 4260 IF D(4)<0 THEN PRINT "PHASERS INOPERATIVE": GO TO 1990
 4265 IF K3>0 THEN GO TO 4330
 4270 PRINT ,,,,,,,,"SCIENCE OFFICER SPOCK REPORTS:",,,,," ""SENSORS SHOW NO ENEMY SHIPS","  IN THIS QUADRANT""": GO TO 1990
 4325 IF SND=0 THEN GO TO 4330
 4328 FOR M=48 TO 56 STEP .5: BEEP .005,M: NEXT M
 4333 IF SND=0 THEN GO TO 4350
 4334 FOR Z=0 TO -5 STEP -1: BEEP .025,Z: NEXT Z
 4350 PRINT "PHASERS "; FLASH 1;"LOCKED"; FLASH 0;" ON TARGET, SIR.",,,
 4353 IF D(8)<0 THEN PRINT "COMPUTER FAILURE HAMPERS        TARGETING ACCURACY."
 4355 IF SND=1 THEN PAUSE 1: BEEP .05,48: BEEP .05,49
 4360 PRINT "ENERGY AVAILABLE = ";E;" UNITS",,,
 4370 INPUT "NUMBER OF UNITS TO FIRE = ";X: IF X<=0 THEN GO TO 1990
 4400 IF E-X<0 THEN GO TO 4360
 4410 LET E=E-X: IF D(7)<0 THEN LET X=X*RND
 4450 LET H1=INT (X/K3): FOR I=1 TO 3: IF K(I,3)<=0 THEN GO TO 4670
 4480 LET H=INT ((H1/FN D(0))*(RND+2)): IF H>.15*K(I,3) THEN GO TO 4530
 4500 PRINT "SENSORS SHOW NO DAMAGE TO ENEMY AT ";K(I,1);",";K(I,2): GO TO 4670
 4530 GO SUB 9700
 4535 LET K(I,3)=K(I,3)-H: PRINT H;" UNIT HIT ON KLINGON AT","SECTOR ";K(I,1);",",
 4550 PRINT K(I,2),,,: IF K(I,3)<=0 THEN PRINT "**** KLINGON DESTROYED ****",,,
 4553 IF K(I,3)<=0 AND SND=1 THEN SOUND 6,20;7,7;8,16;9,16;10,16;12,56;13,8: PAUSE 90: SOUND 8,0;9,0;10,0: GO TO 4580
 4555 IF K(I,3)<=0 THEN GO TO 4580
 4560 PRINT "(SENSORS SHOW ";K(I,3);" UNITS","REMAINING)",,,,: GO TO 4670
 4580 LET K3=K3-1: LET K9=K9-1: LET Z1=K(I,1): LET Z2=K(I,2): LET A$="   ": GO SUB 8670
 4650 LET K(I,3)=0: LET G(Q1,Q2)=G(Q1,Q2)-100: LET Z(Q1,Q2)=G(Q1,Q2): IF K9<=0 THEN GO TO 6370
 4670 NEXT I: GO SUB 6000: GO TO 1990
 4690 REM PHOTON TORPEDO CODE BEGINS HERE
 4700 IF P<=0 THEN PRINT "ALL PHOTON TORPEDOES EXPENDED": GO TO 1990
 4730 IF D(5)<0 THEN PRINT "PHOTON TUBES ARE NOT OPERATIONAL": GO TO 1990
 4760 PRINT AT 14,1;"     4  3  2                          . . .                            ...                         5 ---*--- 1   'COURSE'              ...                            . . .                          6  7  8": INPUT "PHOTON TORPEDO COURSE, SIR?(1-9)";C1
 4765 IF C1=9 THEN LET C1=1
 4780 IF C1>=1 AND C1<9 THEN GO TO 4850
 4790 PRINT "ENSIGN CHEKOV REPORTS,","""INCORRECT COURSE DATA, CAPTAIN!""","""(TOO MUCH ""WOODKA""...SIR)"""
 4800 GO TO 1990
 4850 LET X1=C(C1,1)+(C(1+1,1)-C(C1,1))*(C1-INT (C1)): LET E=E-2: LET P=P-1
 4860 LET X2=C(C1,2)+(C(1+1,2)-C(C1,2))*(C1-INT (C1)): LET X=S1: LET Y=S2
 4910 PRINT "TORPEDO AWAY, SIR!";TAB 0;"TORPEDO TRACK: "
 4920 LET X=X+X1: LET Y=Y+X2: LET X3=INT (X+.5): LET Y3=INT (Y+.5)
 4960 IF X3<1 OR X3>8 OR Y3<1 OR Y3>8 THEN GO TO 5490
 4975 IF SND=1 THEN BEEP .005,50
 5000 PRINT X3;",";Y3;" : ": LET A$="   ": LET Z1=X: LET Z2=Y: GO SUB 8830
 5050 IF Z3<>0 THEN GO TO 4920
 5060 LET A$="\d\e\f": LET Z1=X: LET Z2=Y: GO SUB 8830: IF Z3=0 THEN GO TO 5210
 5103 IF SND=0 THEN GO TO 5110
 5105 FOR M=30 TO 35 STEP .5: BEEP .005,M: NEXT M
 5107 IF SND=0 THEN GO TO 5110
 5108 SOUND 6,10;7,7;8,16;9,16;10,16;12,56;13,8: PAUSE 90: SOUND 8,0;9,0;10,0
 5110 PRINT "**** KLINGON DESTROYED ****": LET K3=K3-1: LET K9=K9-1: IF K9<=0 THEN GO TO 6370
 5150 FOR I=1 TO 3: IF X3=K(I,1) AND Y3=K(I,2) THEN GO TO 5190
 5180 NEXT I: LET I=3
 5190 LET K(I,3)=0: GO TO 5430
 5210 LET A$=" * ": LET Z1=X: LET Z2=Y: GO SUB 8830: IF Z3=0 THEN GO TO 5280
 5260 PRINT "STAR AT ";X3;",";Y3;" ABSORBED TORPEDO","ENERGY.": GO SUB 6000: GO TO 1990
 5280 LET A$="\j\k\l": LET Z1=X: LET Z2=Y: GO SUB 8830: IF Z3=0 THEN GO TO 5490: REM IF Z3=0 THEN GO TO 4760
 5323 IF SND=0 THEN GO TO 5330
 5325 FOR M=1 TO 10: BEEP .025,60: NEXT M
 5330 PRINT "*** STARBASE DESTROYED ***": LET B3=B3-1: LET B9=B9-1
 5360 IF B9>0 OR K9>T-T0-T9 THEN GO TO 5400
 5370 PRINT "THAT DOES IT, CAPTAIN!!  YOU AREHEREBY  RELIEVED  OF COMMAND";
 5380 PRINT " ANDSENTENCED  TO  99  STARDATES  ATHARD LABOR ON CYGNUS 12!!",,,
 5390 GO TO 6270
 5400 PRINT "STARFLEET COMMAND REVIEWING YOUR RECORD TO CONSIDER "
 5410 PRINT "COURT MARTIAL!": LET D0=0
 5415 IF SND=1 THEN GO SUB 9750
 5430 LET Z1=X: LET Z2=Y: LET A$="   ": GO SUB 8670
 5470 LET G(Q1,Q2)=K3*100+B3*10+S3: LET Z(Q1,Q2)=G(Q1,Q2): GO SUB 6000: GO TO 1990
 5490 PRINT "TORPEDO MISSED, SIR...": GO SUB 6000: GO TO 1990
 5520 REM SHEILD CONTROL
 5530 IF D(7)<0 THEN PRINT "SHEILD CONTROL INOPERABLE": GO TO 1990
 5560 PRINT "ENERGY AVAILABLE =";E+S,: INPUT "NUMBER OF UNITS TO SHIELDS",X
 5580 IF X<0 OR S=X THEN PRINT "<SHIELDS UNCHANGED>": GO TO 1990
 5590 IF X<=E+S THEN GO TO 5630
 5600 PRINT "SHIELD CONTROL REPORTS ""THIS IS NOT THE FEDERATION TREASURY."""
 5610 PRINT "<SHIELDS UNCHANGED>": GO TO 1990
 5630 LET E=E+S-X: LET S=X: PRINT "DEFLECTOR CONTROL ROOM REPORT:"
 5635 IF SND=0 THEN GO TO 5660
 5640 FOR M=1 TO S/20: BEEP .005,M+30: NEXT M
 5660 PRINT """SHIELDS NOW AT ";INT (S);" UNITS,"," PER YOUR COMMAND, SIR""": GO TO 1990
 5680 REM  DAMAGE CONTROL
 5690 IF D(6)>=0 THEN GO TO 5910
 5700 PRINT "DAMAGE CONTROL REPORT:", FLASH 1;"NOT AVAILABLE": IF D0=0 THEN GO TO 1990
 5720 LET D3=0: FOR I=1 TO 8: IF D(I)<0 THEN LET D3=D3+.1
 5760 NEXT I: IF D3=0 THEN GO TO 1990
 5780 PRINT : LET D3=D3+D4: IF D3>=1 THEN LET D3=.9
 5810 PRINT "TECHNICIANS STANDING BY TO      EFFECT REPAIRS TO YOUR SHIP",,,
 5820 PRINT "ESTIMATED TIME TO REPAIR:",.01*INT (100*D3);" STARDATES"
 5840 INPUT "WILL  YOU  AUTHORIZE  THE       REPAIR ORDER, SIR? (Y/N)";A$
 5860 IF A$<>"Y" AND A$<>"y" THEN GO TO 1990
 5870 FOR I=1 TO 8: IF D(I)<0 THEN LET D(I)=0
 5890 NEXT I: LET T=T+D3+.1
 5910 PRINT : PRINT "DEVICE           STATE OF REPAIR",,: FOR I=1 TO 8: LET R1=I
 5920 GO SUB 8790: PRINT TAB 9-INT LEN G$/2;G$;TAB 24;INT (D(R1)*100)*.01
 5925 IF SND=1 THEN BEEP .005,I-13
 5930 NEXT I: PRINT L$;"(YOU ARE IN QUADRANT ";Q1;",";Q2;")"
 5950 PRINT ;"TOTAL ENERGY LEFT: "; FLASH 1;E+S: FLASH 0: PRINT 
 5955 IF A$="Y" THEN PRINT TAB 0;"REPAIRS COMPLETED, CAPTAIN...   YOU MAY GET UNDER WAY NOW..."
 5960 IF D0<>0 THEN GO TO 5720
 5980 GO TO 1990
 5990 REM KLINGONS SHOOTING
 6000 IF K3<=0 THEN RETURN 
 6010 IF D0<>0 THEN PRINT "STARBASE SHIELDS PROTECT THE ENTERPRISE": RETURN 
 6040 FOR I=1 TO 3: IF K(I,3)<=0 THEN GO TO 6200
 6060 LET H=INT ((K(I,3)/FN D(1))*(2+RND)): LET S=S-H: LET K(I,3)=K(I,3)/(3+RND)
 6067 IF SND=0 THEN GO TO 6080
 6070 FOR M=10 TO 20 STEP .5: BEEP .005,M: NEXT M
 6080 PRINT H;" UNIT HIT ON ENTERPRISE","FROM SECTOR ";K(I,1);",";K(I,2)
 6090 IF S<=0 THEN GO TO 6240
 6100 PRINT "  <SHIELDS DOWN TO ";S;" UNITS>": IF H<20 THEN GO TO 6200
 6120 IF RND>.6 OR H/S<=.02 THEN GO TO 6200
 6140 LET R1=FN R(1): LET D(R1)=D(R1)-H/S-.5*RND: GO SUB 8790
 6170 PRINT "DAMAGE CONTROL REPORTS:","""";G$;"""": PRINT "DAMAGED BY THE HIT."
 6200 NEXT I: RETURN 
 6210 REM END OF GAME
 6220 PRINT "IT IS STARDATE ";T,,,: GO TO 6270
 6233 IF SND=0 THEN GO TO 6240
 6235 FOR M=0 TO -10 STEP -2: BEEP .025,M: NEXT M
 6240 CLS : PRINT : PRINT """ENTERPRISE"" HAS BEEN DESTROYED.",,"THE FEDERATION ";
 6250 PRINT "WILL BE CONQUERED",,: GO TO 6220
 6270 PRINT "THERE  WERE  ";K9;"  KLINGON  BATTLE": PRINT "CRUISERS LEFT AT";
 6280 PRINT " THE END OF YOURMISSION."
 6290 PRINT : PRINT : IF B9=0 THEN GO TO 6360
 6310 PRINT "THE FEDERATION  IS IN  NEED OF ANEW  STARSHIP  COMMANDER FOR A  ";
 6320 PRINT "SIMILAR MISSION...              IF THERE IS A VOLUNTEER,"
 6330 INPUT "LET HIM STEP FORWARD AND ENTER  ""AYE""  ";A$: IF A$="AYE" THEN CLS : GO TO 10
 6340 GO TO 6330
 6370 PRINT "CONGRATULATIONS, CAPTAIN! THE","LAST KLINGON BATTLE CRUISER"
 6380 PRINT "MENACING THE FEDERATION HAS","BEEN DESTROYED.": PRINT 
 6390 GO SUB 9750
 6400 PRINT "YOUR EFFICIENCY RATING IS:",1000*(K7/(T-T0))^2: GO TO 6290
 6420 REM SHORT SENSOR SCAN & STARTUP SUBROUTINE
 6430 FOR I=S1-1 TO S1+1: FOR J=S2-1 TO S2+1
 6450 IF INT (I+.5)<1 OR INT (I+.5)>8 OR INT (J+.5)<1 OR INT (J+.5)>8 THEN GO TO 6540
 6490 LET A$="\j\k\l": LET Z1=I: LET Z2=J: GO SUB 8830: IF Z3=1 THEN GO TO 6580
 6540 NEXT J: NEXT I: LET D0=0: GO TO 6650
 6580 LET D0=1: LET C$="DOCKED": LET E=E0: LET P=P0
 6585 IF SND=0 THEN GO TO 6620
 6610 FOR M=1 TO 10: BEEP .025,60: NEXT M
 6620 PRINT "SHIELDS DROPPED FOR DOCKING": LET S=0: PAUSE 100: GO TO 6720
 6650 IF K3>0 THEN LET C$="*RED*": GO TO 6720
 6660 LET C$="GREEN": IF E<E0*.1 THEN LET C$="YELLOW"
 6720 IF D(2)>=0 THEN GO TO 6773
 6730 PRINT : PRINT "* SHORT RANGE SENSORS ARE OUT *": LET SRS=0: PRINT 
 6770 PRINT ,,,,,, FLASH 1;"PRESS ""S"" KEY FOR STATUS REPORT,OR ANY OTHER KEY TO GIVE COMMAND": PAUSE 0: IF INKEY$="S" THEN GO TO 7890
 6771 GO TO 1990
 6773 LET SRS=0: GO SUB 9030: CLS : PRINT TAB 15-INT LEN G$/2;G$: PRINT L$;: FOR I=1 TO 8
 6830 GO TO 6840+10+(I*50)
 6900 PRINT "      STARDATE         ";INT (T*10)*.1: GO TO 7260
 6950 PRINT "      CONDITION        ";C$: GO TO 7260
 7000 PRINT "      QUADRANT         ";Q1;",";Q2: GO TO 7260
 7050 PRINT "      SECTOR           ";S1;",";S2: GO TO 7260
 7100 PRINT "      PHOTON TORPEDOES ";INT (P): GO TO 7260
 7150 PRINT "      TOTAL ENERGY     ";INT (E+S): GO TO 7260
 7200 PRINT "      SHIELDS          ";INT (S): GO TO 7260
 7250 PRINT "      KLINGONS LEFT    ";INT (K9)
 7260 NEXT I: PRINT L$
 7265 PRINT "  1   2   3   4   5   6   7   8"
 7267 PRINT S$
 7269 IF SND=1 THEN BEEP .05,40
 7270 FOR I=1 TO 8: PRINT I;: FOR J=(I-1)*24+1 TO (I-1)*24+22 STEP 3: PRINT Q$(J TO J+2);: IF J<(I-1)*24+22 THEN PRINT " ";
 7275 NEXT J: PRINT : NEXT I: PRINT S$: RETURN 
 7280 REM LIBRARY COMPUTER CODE
 7290 IF D(8)<0 THEN PRINT "COMPUTER DISABLED": GO TO 1990
 7300 GO TO 7360
 7320 INPUT "COMPUTER ACTIVE AND AWAITING    YOUR COMMAND, SIR...";A: CLS : IF A<0 OR A>6 THEN GO TO 1990
 7325 IF A<6 THEN GO TO 7350
 7330 PRINT #0;"SOUND EFFECTS? (Y/N) ": PAUSE 0: IF INKEY$="N" THEN LET SND=0: POKE 23609,0: GO TO 1990
 7350 PRINT : LET H8=1: GO TO 7351+A
 7351 GO TO 7540
 7352 GO TO 7900
 7353 GO TO 8070
 7354 GO TO 8500
 7355 GO TO 8150
 7356 GO TO 7400
 7357 IF A=6 THEN LET SND=1: POKE 23609,25: GO TO 1990
 7360 PRINT "FUNCTIONS AVAILABLE             FROM LIBRARY-COMPUTER:"
 7365 PRINT 
 7370 PRINT " 0 = CUMULATIVE GALACTIC RECORD"
 7372 PRINT " 1 = STATUS REPORT"
 7373 PRINT " 2 = PHOTON TORPEDO DATA"
 7376 PRINT " 3 = STARBASE NAV DATA"
 7378 PRINT " 4 = DIR/DIST CALCULATOR"
 7380 PRINT " 5 = GALAXY ""REGION NAME"" MAP"
 7385 PRINT " 6 = SOUND EFFECTS ON/OFF"
 7387 PRINT : GO TO 7320
 7390 REM SETUP TO CHANGE CUM GAL RECORD TO GALAXY MAP
 7400 LET H8=0: LET G5=1: CLS : PRINT "         THE GALAXY",,,: GO TO 7550
 7530 REM CUM GALACTIC RECORD
 7540 CLS 
 7544 PRINT "COMPUTER  RECORD  OF GALAXY  FORQUADRANT ";Q1;",";Q2;"   ";"""***""= UNMAPPED"
 7546 PRINT FLASH 1;"     (PRESS S TO STOP MAP.)     ": FLASH 0
 7550 PRINT "  1   2   3   4   5   6   7   8 "
 7570 PRINT S$: FOR I=1 TO 8: PRINT I;: IF H8=0 THEN GO TO 7740
 7630 FOR J=1 TO 8: IF INKEY$="S" THEN GO TO 1990
 7633 IF SND=0 THEN GO TO 7635
 7634 BEEP .005,24
 7635 PLOT 8,8: DRAW 0,128: PLOT 36,8: DRAW 0,128: PLOT 68,8: DRAW 0,128: PLOT 100,8: DRAW 0,128: PLOT 130,8: DRAW 0,128: PLOT 164,8: DRAW 0,128: PLOT 196,8: DRAW 0,128: PLOT 230,8: DRAW 0,128
 7700 LET A$=STR$ (Z(I,J)+1000)
 7705 IF A$(2 TO )="000" THEN LET A$(2 TO )="***"
 7710 PRINT A$(2 TO );: IF J<8 THEN PRINT " ";
 7720 NEXT J:: GO TO 7850
 7740 LET Z4=I: LET Z5=1: GO SUB 9030: LET J0=INT 8-LEN G$/2: PRINT TAB J0;G$;
 7800 LET Z5=5: GO SUB 9030: LET J0=INT 24-LEN G$/2: PRINT TAB J0;G$
 7850 PRINT S$: IF INKEY$="S" THEN GO TO 1990
 7855 NEXT I: POKE 23692,6: PRINT "    (YOU ARE IN QUADRANT ";Q1;",";Q2;")": PRINT : PRINT 
 7860 INPUT "DO YOU WANT A HARD COPY, SIR?   (Y/N) (CHECK PRINTER FIRST.)";R$
 7865 IF R$="Y" THEN COPY 
 7870 GO TO 1990
 7890 REM STATUS REPORT
 7900 CLS : PRINT "STATUS REPORT, SIR:",: LET X$(2)="": IF K9>1 THEN LET X$(2)="S"
 7940 PRINT "KLINGON";X$(2)( TO 1);" LEFT: ";K9
 7960 PRINT "MISSION MUST BE COMPLETED IN ";.1*INT ((T0+T9-T)*10);" STARDATES"
 7970 LET X$(2)="S": IF B9<2 THEN LET X$(2)="": IF B9<1 THEN GO TO 8010
 7980 PRINT "THE FEDERATION IS MAINTAINING ";B9;" STARBASE";X$(2)( TO 1);" IN THE GALAXY"
 7985 PAUSE 100
 7990 GO TO 5690
 8005 GO SUB 9750
 8010 PRINT " YOUR STUPIDITY HAS LEFT YOU ON  YOUR OWN IN"
 8020 PRINT " THE GALAXY. -- YOU HAVE NO     STARBASES LEFT!": GO TO 5690
 8060 REM TORPEDO, BASE NAV, D/D CALCULATOR
 8070 IF K3<=0 THEN GO TO 4270
 8080 LET X$(2)="": IF K3>1 THEN LET X$(2)="S"
 8090 LET CLS=1: PRINT "FROM ENTERPRISE TO KLINGON",,,"BATTLE CRUISER";X$(2)
 8100 LET H8=0: FOR I=1 TO 3: IF K(I,3)<=0 THEN GO TO 8480
 8110 LET W1=K(I,1): LET X=K(I,2)
 8120 LET C1=S1: LET A=S2: GO TO 8220
 8150 LET CLS=1: PRINT "DIRECTION/DISTANCE CALCULATOR:",,,
 8160 PRINT "        YOU ARE AT",,," QUADRANT ";Q1;",";Q2;"    SECTOR ";S1;",";S2
 8170 INPUT AT 8,0;"PLEASE ENTER INITIAL COORDINATESX (THEN ENTER)  Y (THEN ENTER)  ";C1,A
 8200 INPUT AT 10,0;"FINAL COORDINATES","X (THEN ENTER)  Y (THEN ENTER)  ";W1,X: CLS 
 8220 LET X=X-A: LET A=C1-W1: IF X<0 THEN GO TO 8350
 8250 IF A<0 THEN GO TO 8410
 8260 IF X>0 THEN GO TO 8280
 8270 IF A=0 THEN LET C1=5: GO TO 8290
 8280 LET C1=1
 8290 IF ABS (A)<=ABS (X) THEN GO TO 8330
 8310 PRINT ,,"DIRECTION =";C1+(((ABS (A)-ABS (X))+ABS (A))/ABS (A)): GO TO 8460
 8330 PRINT ,,"DIRECTION =";C1+(ABS (A)/ABS (X)): GO TO 8460
 8350 IF A>0 THEN LET C1=3: GO TO 8420
 8360 IF X<>0 THEN LET C1=5: GO TO 8290
 8410 LET C1=7
 8420 IF ABS (A)>=ABS (X) THEN GO TO 8450
 8430 PRINT ,,"DIRECTION =";C1+(((ABS (X)-ABS (A))+ABS (X))/ABS (X)): GO TO 8460
 8450 PRINT ,,"DIRECTION =";C1+(ABS (X)/ABS (A))
 8460 PRINT ,,"DISTANCE = ";SQR ((X*X)+(A*A)): IF H8=1 THEN GO TO 1990
 8480 NEXT I: GO TO 1990
 8500 LET CLS=1: IF B3<>0 THEN PRINT "FROM ENTERPRISE TO STARBASE:": LET W1=B4: LET X=B5: GO TO 8120
 8510 PRINT ,,,,,,,,"SCIENCE OFFICER SPOCK REPORTS:",,," ""SIR, SENSORS SHOW NO","  STARBASES IN THIS QUADRANT!"
 8520 GO TO 1990
 8580 REM FIND EMPTY PLACE IN QUADRANT (FOR THINGS)
 8590 LET R1=FN R(1): LET R2=FN R(1): LET A$="   ": LET Z1=R1: LET Z2=R2: GO SUB 8830: IF Z3=0 THEN GO TO 8590
 8600 RETURN 
 8610 GO SUB 9750
 8660 REM INSERT IN STRING ARRAY FOR QUADRANT
 8670 LET S8=INT (Z2-.5)*3+INT (Z1-.5)*24+1
 8675 IF LEN A$<>3 THEN PRINT FLASH 1;"ERROR": STOP 
 8680 IF S8=1 THEN LET Q$=A$+Q$(4 TO )
 8690 IF S8=190 THEN LET Q$=Q$( TO 189)+A$
 8700 LET Q$=Q$( TO S8-1)+A$+Q$(S8+3 TO ): RETURN 
 8780 REM PRINTS DEVICE NAME
 8790 GO TO 8790+R1*2
 8792 LET G$="WARP ENGINES": RETURN 
 8794 LET G$="SHORT RANGE SENSORS": RETURN 
 8796 LET G$="LONG RANGE SENSORS": RETURN 
 8798 LET G$="PHASER CONTROL": RETURN 
 8800 LET G$="PHOTON TUBES": RETURN 
 8802 LET G$="DAMAGE CONTROL": RETURN 
 8804 LET G$="SHIELD CONTROL": RETURN 
 8806 LET G$="LIBRARY-COMPUTER": RETURN 
 8820 REM STRING COMPARISON IN QUADRANT ARRAY
 8830 LET Z1=INT (Z1+.5): LET Z2=INT (Z2+.5): LET S8=(Z2-1)*3+(Z1-1)*24+1: LET Z3=0
 8890 IF Q$(S8 TO S8+2)<>A$ THEN RETURN 
 8900 LET Z3=1: RETURN 
 9010 REM **** QUADRANT NAME IN G$ FROMZ4,Z5 (=Q1,Q2) ****
 9020 REM **** CALL WITH G5=1 TO GET REGION NAME ONLY ****
 9030 IF Z5<=4 THEN GO TO 9030+(Z4*10)
 9035 GO TO 9120
 9040 LET G$="ANTARES": GO TO 9210
 9050 LET G$="RIGEL": GO TO 9210
 9060 LET G$="PROCYON": GO TO 9210
 9070 LET G$="VEGA": GO TO 9210
 9080 LET G$="CANOPUS": GO TO 9210
 9090 LET G$="ALTAIR": GO TO 9210
 9100 LET G$="SAGITTARIUS": GO TO 9210
 9110 LET G$="POLLUX": GO TO 9210
 9120 GO TO 9120+(Z4*10)
 9130 LET G$="SIRIUS": GO TO 9210
 9140 LET G$="DENEB": GO TO 9210
 9150 LET G$="CAPELLA": GO TO 9210
 9160 LET G$="BETELGUESE": GO TO 9210
 9170 LET G$="ALDEBARAN": GO TO 9210
 9180 LET G$="REGULUS": GO TO 9210
 9190 LET G$="ARCTURUS": GO TO 9210
 9200 LET G$="SPICA"
 9210 IF G5<>1 THEN GO TO 9220+(Z5*10)
 9220 RETURN 
 9230 LET G$=G$+" I": RETURN 
 9240 LET G$=G$+" II": RETURN 
 9250 LET G$=G$+" III": RETURN 
 9260 LET G$=G$+" IV": RETURN 
 9270 LET G$=G$+" I": RETURN 
 9280 LET G$=G$+" II": RETURN 
 9290 LET G$=G$+" III": RETURN 
 9300 LET G$=G$+" IV": RETURN 
 9490 CLS : PRINT AT 8,0;"ONE MOMENT, PLEASE...           DEFINING THE GRAPHICS..."
 9500 RESTORE 9500: DATA 0,255,127,127,2,1,31,7
 9501 FOR M=0 TO 7: READ Z28: POKE USR "A"+M,Z28: NEXT M
 9502 RESTORE 9502: DATA 0,240,241,255,79,156,254,252
 9503 FOR M=0 TO 7: READ Z29: POKE USR "B"+M,Z29: NEXT M
 9504 RESTORE 9504: DATA 0,112,254,255,255,112,0,0
 9505 FOR M=0 TO 7: READ Z30: POKE USR "C"+M,Z30: NEXT M
 9507: RESTORE 9507: DATA 0,24,63,60,24,0,0,0
 9508 FOR M=0 TO 7: READ Z31: POKE USR "D"+M,Z31: NEXT M
 9509 RESTORE 9509: DATA 0,3,255,0,0,0,0,0
 9510 FOR M=0 TO 7: READ Z32: POKE USR "E"+M,Z32: NEXT M
 9511 RESTORE 9511: DATA 56,240,224,248,48,240,254,254
 9512 FOR M=0 TO 7: READ Z33: POKE USR "F"+M,Z33: NEXT M
 9513 RESTORE 9513: DATA 0,0,0,0,255,0,0,0
 9515 FOR M=0 TO 7: READ Z34: POKE USR "G"+M,Z34: NEXT M
 9517 FOR M=0 TO 7: POKE USR "I"+M,16: NEXT M
 9520 RESTORE 9520: DATA 24,189,255,165,165,255,189,24
 9525 FOR M=0 TO 7: READ Z25: POKE USR "K"+M,Z25: NEXT M
 9530 RESTORE 9530: DATA 129,64,63,210,82,63,64,129
 9535 FOR M=0 TO 7: READ Z26: POKE USR "J"+M,Z26: NEXT M
 9540 RESTORE 9540: DATA 129,2,252,75,74,252,2,129
 9545 FOR M=0 TO 7: READ Z27: POKE USR "L"+M,Z27: NEXT M
 9550 LET L$="--------------------------------": LET S$="________________________________"
 9595 RETURN 
 9605 LET SND=1
 9625 IF SND=1 THEN POKE 23609,25
 9630 RETURN 
 9667 IF SND=0 THEN RETURN 
 9668 FOR Z=1 TO 20: BEEP .025,30: NEXT Z
 9669 SOUND 7,62;8,15: FOR Z=50 TO 100: SOUND 0,Z: PAUSE 1: NEXT Z: SOUND 6,6;7,7;8,16;9,16;10,16;12,56;13,8: PAUSE 90: SOUND 8,0;9,0;10,0
 9670 PAUSE 60: RETURN 
 9675 FOR Z=4 TO 1 STEP -1: BEEP .05,Z: NEXT Z: BEEP 1,0: BEEP 1.5,10: BEEP .5,9: BEEP .25,5: BEEP .25,2: BEEP .25,7: BEEP .75,12: BEEP .25,12: BEEP 1.5,16
 9680 RETURN 
 9700 REM ***PHASOR FIRE****
 9703 IF SND=0 THEN RETURN 
 9705 FOR M=30 TO 40
 9710 BEEP .025,M
 9715 NEXT M
 9720 RETURN 
 9750 IF SND=0 THEN RETURN 
 9755 LET ZZ=RND*30: FOR M=ZZ TO ZZ+10: BEEP .025,M: NEXT M: RETURN 
 9800 FOR M=55 TO 60
 9810 BEEP .025,M: NEXT M
 9830 FOR M=60 TO 55 STEP -1
 9840 BEEP .025,M: NEXT M
 9899 RETURN 
 9900 REM *****SAVE ROUTINE******
 9910 CLS : PRINT FLASH 1;AT 10,7;"SAVING ""STAR TREK"""
 9920 SAVE "TREK" LINE 1990
 9940 GO TO 1990
 9950 CLS : PRINT FLASH 1;AT 10,7;"SAVING ""STAR TREK"""
 9960 SAVE "TREK" LINE 1
 9990 BEEP 2,30: STOP 

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

Scroll to Top