DECLARE SUB BOX6 () DECLARE SUB BOX5 () DECLARE SUB DELFILE () DECLARE SUB WHATENGINE () DECLARE SUB READFILE2 () DECLARE SUB NOFILES () DECLARE SUB NOSUCHFILE () DECLARE SUB BOX4 () DECLARE SUB SAVEDBOX () DECLARE SUB BOOSTERWRITE () DECLARE SUB ENGINEWRITE () DECLARE SUB RKTNAMEBOX () DECLARE SUB BOX3 () DECLARE SUB EARTHMOON () DECLARE SUB OPENSCREEN () DECLARE SUB WRITEFILE1 () DECLARE SUB RKTWINDOW () DECLARE SUB BOX1 () DECLARE SUB BOX2 () DECLARE SUB FILEMAN () '------------------------------------------------------------------- ' ********VERSION 7.3H****** (ROKET73) ' JANUARY 31, 1996 ' ' -- READ THE FILE "ROCKET.TXT" FOR MORE INFO. -- ' ...MIKE SIMPSON... ' ' MAJOR ENHANCEMENTS BY ANDREW RAMSEY and MICHAEL SIMPSON '------------------------------------------------------------------ '------------------------------------------------------------------ COMMON SHARED ROCKETNAME$, R, C, D, STAGE$, BOOSTERWEIGHT, T$, T2$ COMMON SHARED CGA, RED, ENGINEPIC, SELECTION, MENUREAD, UPPERENGINE COMMON SHARED GOODBYE$ COMMON SHARED ENGINENAME$, E$, L$, I$, P$, TD$ COMMON SHARED ENGINENAME2$, E2$, L2$, I2$, P2$ COMMON SHARED XENGINENAME$, XE, XL, XI, XP, XTD COMMON SHARED RC, XX$, AA$, DELFILENAME$ '------ START THE PROGRAM BY PROTECTING OUR NAMES ------ 60 CLEAR : CLEAR 1000 PHONE1$ = "000": PHONE1 = VAL(PHONE1$) PHONE2$ = "000": PHONE2 = VAL(PHONE2$) NAM1$ = "Michael Simpson" FOR MIKE = 1 TO LEN(NAM1$): DIGT1 = ASC(MID$(NAM1$, MIKE)): TOTL1! = TOTL1 + DIGT1: NEXT MIKE NAM2$ = "Andrew Ramsey" FOR ANDY = 1 TO LEN(NAM2$): DIGT2 = ASC(MID$(NAM2$, ANDY)): TOTL2! = TOTL2 + DIGT2: NEXT ANDY IF TOTL1 <> 1468 GOTO 6250 IF TOTL2 <> 1266 GOTO 6250 'IF PHONE1 <> 855 GOTO 6250 'IF PHONE2 <> 401 GOTO 6250 CITY1$ = CHR$(87) + CHR$(101) + CHR$(115) + CHR$(116) '"WEST" CITY2$ = CHR$(80) + CHR$(111) + CHR$(105) + CHR$(110) + CHR$(116) '"POINT" PO = 100 - 48: PO$ = STR$(PO) ' PO BOX ZIP = 21441 - 1955: ZIP$ = STR$(ZIP) ' zip code CGA = 0 'It doesn't matter yet if there's no EGA monitor DRAGSCREEN = 0 'the drag screen hasn't been accessed MENUREAD = 0 'the engine menu hasn't been accessed yet UPPERENGINE = 0 'upper stage engine has not been picked for a two stage rocket REED = 0 'disk file has not been read RED = 1 'the background is red DIM A$(60): Q1 = 29 'rocket engine data DIM C(10) ' array for drag computation DIM L$(20) ' new font EN = 23 ' maximum number of entries in any menu DIM em$(EN) ' dimension engine array FOR T = 1 TO Q1: READ A$(T): NEXT T 'get engine data CALL OPENSCREEN CALL BOX1 LOCATE 23, 18: PRINT "USE ARROW KEYS TO SELECT ENTRY, THEN PRESS " BM = 3: FM = 1: BMR = 14: FMR = 1: MY = 7: MX = 15 'menu coordinates and colors GOSUB 3460 'menu subroutine 200 ROCKETNAME$ = em$(SM) IF ROCKETNAME$ = " ** EXIT **" THEN ON ERROR GOTO 5058 SCREEN 9 GOODBYE$ = "EGA" GOTO 4910 END IF IF ROCKETNAME$ = " NEW ENTRY" THEN NEWENTRY = 1 REED = 2 'data base not accessed COLOR 4, 4: LOCATE 23, 18: PRINT SPACE$(51)'erase message CALL RKTNAMEBOX LOCATE 8, 50 COLOR 0, 3 INPUT "", ROCKETNAME$ ROCKETNAME$ = LEFT$(UCASE$(ROCKETNAME$), 19) CALL RKTNAMEBOX 'clears box contents COLOR 0, 3 LOCATE 8, 57 - (LEN(ROCKETNAME$) / 2): PRINT ROCKETNAME$ COLOR 15, 4 END IF IF ROCKETNAME$ = "-ACCESS FILE-" THEN ROCKETNAME$ = "": GOTO 5500 210 IF STAGE$ = "Y" THEN GOTO 340 IF REED = 1 THEN GOTO 340 LOCATE 18, 18: INPUT "IS THIS A TWO STAGE ROCKET Y/(N) "; STAGE$ LOCATE 18, 18: PRINT SPACE$(50) STAGE$ = UCASE$(LEFT$(STAGE$, 1)) IF STAGE$ <> "Y" THEN STAGE$ = "N" 220 IF STAGE$ = "Y" THEN LOCATE 18, 18: INPUT "ENTER BOOSTER STAGE WEIGHT WITHOUT ENGINE (OZ.) :", BOOSTERWEIGHT$ BOOSTERWEIGHT = VAL(BOOSTERWEIGHT$) IF BOOSTERWEIGHT = 0 THEN GOTO 220 230 LOCATE 19, 19: INPUT "ENTER UPPER STAGE WEIGHT WITHOUT ENGINE (0Z.) :", R$ R = VAL(R$): IF R = 0 THEN GOTO 230 ELSE 240 LOCATE 18, 18: INPUT "ENTER ROCKET WEIGHT WITHOUT ENGINE (OZ.) :", R$ R = VAL(R$): IF R = 0 THEN 240 END IF LOCATE 18, 18: PRINT SPACE$(50) LOCATE 19, 18: PRINT SPACE$(50) LOCATE 16, 5: PRINT "ENTER ROCKET DIAMETER" MY = 6: EN = 8: MX = 10: SM = 10: WM = 0' menu coordinates FM = 1: BM = 3: FMR = 1: BMR = 14 ' menu colors em$(1) = "BT-5 .541": em$(2) = "BT-20 .736": em$(3) = "BT-50 .976" em$(4) = "BT-55 1.325": em$(5) = "BT-60 1.637": em$(6) = "BT-70 2.217" em$(7) = "BT-80 2.600": em$(8) = " OTHER" FOR x = 6 TO 13: LOCATE x, 26: PRINT " ": NEXT x'clears area behind menu CALL BOX2 'box for diameter menu GOSUB 3640 'menu subroutine D$ = em$(SM): DIA$ = (RIGHT$(D$, 5)): D = VAL(DIA$): DIAMETER1 = D COLOR 15, 4 250 IF DIA$ = "OTHER" THEN D = 0: LOCATE 12, 30 LINE INPUT "ENTER THE DIAMETER IN INCHES :", D$ D = VAL(D$) DIAMETER1 = D IF D = 0 THEN 250 END IF IF D > 6 THEN LOCATE 14, 30 PRINT "THAT'S KIND OF LARGE, ISN'T IT ?" COLOR 30, 4: LOCATE 12, 60: PRINT " ": COLOR 15, 4 GOTO 250 END IF LOCATE 14, 30: PRINT " " 260 LOCATE 18, 21: PRINT "ENTER COEFFICIENT OF DRAG. (.75 IS TYPICAL)" LOCATE 19, 20: COLOR 7, 1: PRINT "IF DRAG COEF. IS UNKNOWN, PRESS"; COLOR 14, 1: PRINT " , :" LOCATE 19, 66: COLOR 15, 4: INPUT "", C$ C = VAL(C$): IF C$ = "D" OR C$ = "d" THEN GOSUB 2270 270 IF C = 0 THEN GOTO 260 LOCATE 22, 30: INPUT "SAVE TO FILE ? Y/(N) ", FILE$ FILE$ = UCASE$(LEFT$(FILE$, 1)) IF FILE$ = "Y" THEN CALL WRITEFILE1 340 T$ = "" T2$ = "" IF NEWENTRY = 1 THEN SCREEN 0: VIEW PRINT 1 TO 25: COLOR 15, 4 CLS IF FILE$ = "Y" THEN CALL SAVEDBOX CALL RKTWINDOW: COLOR 15, 4 COLOR 15, 4 GOSUB 2120: ' rocket engine menu subroutine 350 T$ = em$(SM) 370 IF T$ = "OTHER" THEN LOCATE 18, 25: PRINT SPACE$(50) 'clear comment GOSUB 4320 END IF F = LEN(T$): FOR X1 = 1 TO Q1 IF LEFT$(A$(X1), F) = T$ THEN 440 NEXT X1 440 E$ = MID$(A$(X1), 9, 4): E = VAL(E$): EDATA = E L$ = MID$(A$(X1), 14, 4): L = VAL(L$): LDATA = L I$ = MID$(A$(X1), 19, 4): I = VAL(I$): IDATA = I P$ = MID$(A$(X1), 24, 5): P = VAL(P$): PDATA = P TD = VAL(RIGHT$(T$, 1)) 490 GOSUB 6050 'window with engine data COLOR 15, 4 495 GOSUB ENGINECHOICE IF CHOICE$ = "N" THEN MENUREAD = 0: GOTO 340 498 IF STAGE$ = "Y" THEN CLS : GOTO 11000 500 IF MENUREAD = 2 THEN GOSUB ENGINECHOICE 'going here a 2nd time clears "CHOICE$" variable. IF STAGE$ = "Y" AND CHOICE$ = "N" THEN MENUREAD = 1: GOTO 11000 770 LOCATE 21, 21: INPUT "IS THIS A MULTI ENGINE CLUSTER ? Y/(N): ", EN$ EN$ = UCASE$(LEFT$(EN$, 1)) IF EN$ <> "Y" THEN 870 820 LOCATE 22, 23: INPUT "HOW MANY ENGINES IN CLUSTER ? : ", RE$ RE = VAL(RE$) ON ERROR GOTO 820 IF RE < 1 THEN 820 IF RE > 5 THEN LOCATE 23, 35: PRINT "GET REAL !": LOCATE 22, 55: PRINT " ": GOTO 820 LOCATE 23, 35: PRINT " " IF STAGE$ = "Y" THEN E2 = E2 * RE: I2 = I2 * RE: P2 = P2 * RE ELSE E = E * RE: I = I * RE: P = P * RE END IF 870 LOCATE 24, 21: PRINT SPACE$(50) LOCATE 23, 21: PRINT "IF LAUNCH ANGLE IS LESS THAN 90 DEGREES" LOCATE 24, 21: INPUT "THEN ENTER LAUNCH ANGLE : ", AN$: AN = VAL(AN$) IF AN = 90 THEN AN = 0' In case user actually enters 90 as the angle. AG = AN: IF AG = 0 THEN AG = 90 ANGLE = AN '"ANGLE" is needed for graph of rocket path. IF AN > 90 THEN PLUSANGLE = AN - 90: ANGLE = 90 - PLUSANGLE 'nothing > 90 ON ERROR GOTO 5240 REM CALCULATE CROSS SECTIONAL AREA OF ROCKET M = 3.14159 * (D / 2) * (D / 2) IF STAGE$ = "Y" THEN TWOSTAGEWEIGHT = R + BOOSTERWEIGHT + I + I2 '-- CALCULATE AVERAGE THRUST IN OUNCES -- BOOSTERT = 16 * E2 / L2 '-- CALCULATE AVERAGE WEIGHT DURING THRUST -- BOOSTERW = TWOSTAGEWEIGHT - (P2 / 2) '-- CALCULATE BALLISTIC COEF. DURING THRUSTING -- BOOSTERB = BOOSTERW / C / M '-- CALCULATE DRAG FREE ACCELERATION -- BOOSTERA = BOOSTERT / BOOSTERW - 1 '-- CALCULATE BURNOUT ALTITUDE -- BOOSTERX1 = (.36981 * SQR(BOOSTERA) * L2 / SQR(BOOSTERB)) BOOSTERY1 = (EXP(BOOSTERX1) + EXP(-BOOSTERX1)) / 2 BOOSTERBURNOUT = 235.26 * BOOSTERB * LOG(BOOSTERY1) '-- CALCULATE BURNOUT VELOCITY -- BOOSTERY2 = (EXP(BOOSTERX1) - EXP(-BOOSTERX1)) / 2 BOOSTERVELOCITY = 87 * SQR(BOOSTERB) * SQR(BOOSTERA) * ((BOOSTERY2) / (BOOSTERY1)) 'NOW SEPERATE THE STAGES..... END IF '-- CALCULATE AVERAGE THRUST IN OUNCES -- T = 16 * E / L '-- CALCULATE AVERAGE WEIGHT DURING THRUSTING -- W = (R + I) - (P / 2) '-- CALCULATE BALLISTIC COEF. DURING THRUSTING -- B = W / C / M '-- CALCULATE DRAG FREE ACCELERATION -- A = T / W - 1 '-- CALCULATE BURNOUT ALTITUDE -- X1 = (.36981 * SQR(A) * L / SQR(B)) Y1 = (EXP(X1) + EXP(-X1)) / 2 S = 235.26 * B * LOG(Y1) IF STAGE$ = "Y" THEN S = S + BOOSTERBURNOUT '-- CALCULATE BURNOUT VELOCITY -- Y2 = (EXP(X1) - EXP(-X1)) / 2 V = 87 * SQR(B) * SQR(A) * ((Y2) / (Y1)) IF STAGE$ = "Y" THEN V = V + BOOSTERVELOCITY '-- CALCULATE AVERAGE WEIGHT DURING COASTING -- W = R + (I - P) '-- CALCULATE BALLISTIC COEF. DURING COASTING -- B = W / C / M '-- CALCULATE COASTING DISTANCE -- G = 117.63 * B * LOG(1 + V * V / B / 7569.386) '-- CALCULATE COASTING TIME -- C1 = 2.7041 * SQR(B): C2 = V / 87 / SQR(B) C3 = ATN(C2) K = C1 * C3 KTIME = K '...needed for graph IF TD = 0 THEN TD = 360 'ignore coasting time if using booster engine '-- ALLOW FOR ENGINE TIME DELAY LONGER THAN COASTING TIME -- IF K > TD THEN GOTO 1310 '-- ROCKET FALLS FROM PEAK ALTITUDE-COASTING TIME MINUS TIME DELAY -- IF K < TD THEN REALCOASTTIME = TD - K ELSE REALCOASTTIME = TD '-- DOWNWARD ACCELERATION -- AC = 32.152 * REALCOASTTIME ^ 2 '-- DISTANCE ROCKET FALLS -- DI = AC * .5 '-- VELOCITY -- VE = SQR(2 * (32.152 * DI)) GOTO 1350 1310 '-- ALLOW FOR TIME DELAY SHORTER THAN COASTING TIME -- IF TD < K THEN AA = G / K ^ 2 H = (AA * TD ^ 2) + S K = TD: G = AA * K ^ 2 END IF '-- CHUTE EJECTION VELOCITY -- VE = V - 32.152 * K 1350 IF TD = K OR TD > K THEN H = S + G '-- ALLOW FOR LAUNCH ANGLE -- IF AN = 0 THEN GOTO 1410 AN = AN / 57.29577951# DR = (COS(AN) * H) H = SQR(((H) ^ 2) - (DR ^ 2)) 1410 '-- IF ROCKET IMPACTS -- IF DI > H THEN DI = H RETURNFROMSHELL: '------------------------THIS IS WHAT IT'S ALL ABOUT--------------------- ON ERROR GOTO 6290 IF CGA = 1 GOTO 6290 SCREEN 9: CLS : COLOR 15, 8 PRINT "ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸" LOCATE 2, 1: PRINT "³": LOCATE 3, 1: PRINT "³" LOCATE 2, 37: PRINT "³": LOCATE 3, 37: PRINT "³" LOCATE 2, 12: COLOR 14: PRINT ROCKETNAME$: COLOR 15 LOCATE 4, 1: PRINT "ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;" IF STAGE$ = "Y" THEN T2$ = LEFT$(T2$, 8) T$ = LEFT$(T$, 8) IF RE > 1 THEN LOCATE 3, 4: PRINT "ENGINE TYPE: "; T2$; CHR$(40) + RE$ + CHR$(41); " "; T$: GOTO 1510 LOCATE 3, 4: PRINT "ENGINE TYPE: "; T2$; " "; T$ ELSE IF RE > 1 THEN LOCATE 3, 4: PRINT "ENGINE TYPE: "; T$; " "; CHR$(40) + RE$ + CHR$(41): GOTO 1510 LOCATE 3, 4: PRINT "ENGINE TYPE: "; T$ END IF 1510 PRINT ON ERROR GOTO 0 COLOR 14: PRINT " TOTAL ALTITUDE= "; IF H >= 10000 THEN PRINT USING "#####.#"; H; : GOTO 1520 IF H >= 1000 THEN PRINT USING "####.#"; H; : GOTO 1520 IF H >= 100 THEN PRINT USING "###.#"; H; : GOTO 1520 IF H >= 10 THEN PRINT USING "##.#"; H; : GOTO 1520 IF H < 10 THEN PRINT USING "#.#"; H; 1520 PRINT " FEET": COLOR 15 PRINT " DOWN RANGE "; IF DR >= 10000 THEN PRINT USING "#####.#"; DR; : GOTO 1530 IF DR >= 1000 THEN PRINT USING "####.#"; DR; : GOTO 1530 IF DR >= 100 THEN PRINT USING "###.#"; DR; : GOTO 1530 IF DR >= 10 THEN PRINT USING "##.#"; DR; : GOTO 1530 IF DR < 10 THEN PRINT USING "#.#"; DR; 1530 PRINT " FEET" IF STAGE$ = "Y" THEN COLOR 12 PRINT " FIRST STAGE:" COLOR 15 PRINT " BURNOUT ALTITUDE="; PRINT USING "###.#"; BOOSTERBURNOUT; PRINT " FEET" PRINT " BURNOUT VELOCITY="; PRINT USING "###.#"; BOOSTERVELOCITY; PRINT " FT/SEC" COLOR 12 PRINT " SECOND STAGE:" COLOR 15 END IF PRINT " BURNOUT ALTITUDE="; IF S >= 10000 THEN PRINT USING "#####.#"; S; : GOTO 1540 IF S >= 1000 THEN PRINT USING "####.#"; S; : GOTO 1540 IF S >= 100 THEN PRINT USING "###.#"; S; : GOTO 1540 IF S >= 10 THEN PRINT USING "##.#"; S; : GOTO 1540 IF S < 10 THEN PRINT USING "#.#"; S; 1540 PRINT " FEET" PRINT " BURNOUT VELOCITY= "; PRINT USING "###.#"; V; PRINT " FT/SEC" PRINT " COASTING DISTANCE="; PRINT USING "####.#"; G; PRINT " FEET" IF DI > 0 THEN COLOR 7: PRINT " ROCKET FALLS "; IF DI >= 10000 THEN PRINT USING "#####.#"; DI; : GOTO 1550 IF DI >= 1000 THEN PRINT USING "####.#"; DI; : GOTO 1550 IF DI >= 100 THEN PRINT USING "###.#"; DI; : GOTO 1550 IF DI >= 10 THEN PRINT USING "##.#"; DI; : GOTO 1550 IF DI < 10 THEN PRINT USING "#.#"; DI; 1550 PRINT " FEET": COLOR 15 END IF CE = H - DI: IF CE < 0 THEN CE = 0 PRINT " CHUTE EJECTS AT "; PRINT USING "####.#"; CE; PRINT " FEET" IF CE = 0 THEN VE = SQR(2 * (32.15223097# * H)): GOTO 1620 PRINT " CHUTE EJECTS AT "; PRINT USING "###.#"; VE; PRINT " FT/SEC" 1620 PRINT " COASTING TIME="; PRINT USING "##.#"; K; PRINT " SECONDS" PRINT " LAUNCH ANGLE="; AG; "DEGREES" IF STAGE$ = "Y" THEN PRINT " LIFTOFF WEIGHT IS"; PRINT USING "##.#"; TWOSTAGEWEIGHT; PRINT " OUNCES" ELSE PRINT : PRINT : PRINT " AVERAGE THRUST="; PRINT USING "###.#"; T; PRINT " OUNCES" PRINT " THRUST DURATION= "; PRINT USING "##.#"; L; PRINT " SECONDS" PRINT " LIFTOFF WEIGHT IS"; PRINT USING "##.#"; I + R; PRINT " OUNCES" END IF LINE (3, 52)-(292, 268), 15, B COLOR 7 LINE (3, 0)-(638, 0), 15 ' top line LINE (3, 272)-(638, 272), 15 ' bottom line IF CE > 0 AND K = TD AND VE > 25 THEN LOCATE 21, 1 COLOR 4: PRINT " ***CAUTION!***"; COLOR 7, 8: PRINT " ROCKET IS STILL CLIMBING AT TIME OF CHUTE EJECTION" PRINT END IF GOTO 3990 END REM ROCKET ENGINES DATA 1/2A6-2 0.28 0.20 0.53 0.055 DATA A8-3 0.56 0.32 0.57 0.110 DATA B4-2 1.12 1.20 0.70 0.294 DATA B4-4 1.12 1.20 0.74 0.294 DATA B6-2 1.12 0.83 0.68 0.220 DATA B6-4 1.12 0.83 0.71 0.220 DATA B8-5 1.12 0.60 0.68 0.220 DATA C5-3 2.25 2.10 0.90 0.450 DATA C6-3 2.25 1.70 0.88 0.440 DATA C6-5 2.25 1.70 0.91 0.440 DATA A8-5 0.56 0.32 0.62 0.110 DATA B4-6 1.12 1.20 0.78 0.294 DATA C6-7 2.25 1.70 0.95 0.440 DATA B6-6 1.12 0.83 0.78 0.220 DATA A8-0 0.56 0.30 0.51 0.110 DATA B6-0 1.12 0.80 0.58 0.220 DATA C6-0 2.25 1.60 0.80 0.440 DATA D12-3 4.48 1.70 1.49 0.879 DATA D12-5 4.48 1.70 1.52 0.879 DATA D12-7 4.48 1.70 1.55 0.879 DATA D11-9 3.37 1.40 1.51 0.650 DATA D12-0 4.48 1.70 1.44 0.879 DATA 1/2A3-2 0.28 0.86 0.20 0.062 DATA A3-2 0.28 0.86 0.25 0.124 DATA A3-4 0.56 0.86 0.27 0.124 DATA A10-3 0.56 0.26 0.28 0.133 DATA 1/2A3-4 0.28 0.36 0.21 0.062 DATA A3-6 0.56 0.86 0.28 0.124 DATA A10-0 0.56 0.26 0.24 0.133 END '-----MENU SUBROUTINE---- 2120 MX = 9: MY = 2: EN = 23: WM = 0: BM = 7: FM = 1 IF REED = 2 THEN GOTO 2150 'IF R > 0 THEN CALL RKTWINDOW: COLOR 15, 4 2150 EMN$ = "ROCKET ENGINE MENU" MENUREAD = MENUREAD + 1 '...How many times this menu has been read. em$(1) = "1/2A6-2": em$(2) = "A8-0": em$(3) = "A8-3": em$(4) = "A8-5" em$(5) = "B4-2": em$(6) = "B4-4": em$(7) = "B4-6": em$(8) = "B6-0" em$(9) = "B6-2": em$(10) = "B6-4": em$(11) = "B6-6": em$(12) = "B8-5" em$(13) = "C5-3": em$(14) = "C6-0": em$(15) = "C6-3": em$(16) = "C6-5" em$(17) = "C6-7": em$(18) = "D11-9": em$(19) = "D12-0": em$(20) = "D12-3" em$(21) = "D12-5": em$(22) = "D12-7": em$(23) = "OTHER" IF STAGE$ = "Y" AND MENUREAD = 1 THEN LOCATE 18, 25: PRINT "SELECT UPPER STAGE ROCKET ENGINE FIRST" LOCATE 2, 32: COLOR 14, 4: PRINT "UPPER STAGE ENGINE " END IF IF STAGE$ = "N" THEN LOCATE 18, 25: PRINT "SELECT SINGLE STAGE ROCKET ENGINE" LOCATE 3, 32: COLOR 14, 4: PRINT "SINGLE STAGE ENGINE " END IF IF MENUREAD = 2 THEN '...MENUREAD can only be > 1 if STAGE$="Y". LOCATE 18, 25: PRINT " SELECT BOOSTER STAGE ENGINE " LOCATE 2, 30: COLOR 14, 4: PRINT " BOOSTER STAGE ": COLOR 15, 4 END IF WIDT = 8: FOR LENG = 2 TO 24: COLOR 1, 7: LOCATE LENG, WIDT: PRINT " ": NEXT LENG GOSUB 3640 COLOR 15, 4: BM = 4: FM = 15 'change colors back IF MENUREAD = 2 THEN GOTO 11001 ELSE GOTO 350 '...if we're looking at the menu twice, go get the booster engine. 2270 REM -----------------------------DRAG PREDICTION-------------------------- 'THANX TO ANDREW RAMSEY FOR MOST OF THE TYPING DRAGSCREEN = 1 D1 = D: A1 = 3.141592 * (D1 / 2) ^ 2 'cross sectional area of body tube 2310 GOSUB 9000 'get a new font ON ERROR GOTO 6540 2320 SCREEN 9: COLOR 15, 4: CLS : GOSUB heading 2330 LOCATE 6, 30: PRINT "Nose cone style:" LOCATE 8, 33: PRINT "1. Ogive"; LOCATE 9, 33: PRINT "2. Cone"; LOCATE 10, 33: PRINT "3. Hemisphere"; LOCATE 23, 17: PRINT "OGIVE CONE HEMISPHERE" CIRCLE (148, 275), 66, 15, 6, 3.42, 3: LINE (127, 294)-(168, 294), 15'OGIVE DRAW "l2;d10;l35;u10": PAINT (148, 275), 1, 15: PAINT (148, 298), 8, 15 LINE (300, 294)-(320, 210): LINE (320, 210)-(340, 294): LINE (300, 294)-(340, 294)'CONE DRAW "l2;d10;l35;u10": PAINT (310, 291), 1, 15: PAINT (310, 300), 8, 15 CIRCLE (490, 290), 21, 15, 6, 3.4: LINE (470, 294)-(510, 294)' HEMISPHERE DRAW "l2;d10;l35;u10": PAINT (490, 290), 1, 15: PAINT (490, 300), 8, 15 LOCATE 3, 11: PRINT "ANSWER ALL QUESTIONS CONCERNING LENGTH, WIDTH OR DIAMETER" LOCATE 4, 12: PRINT "IN INCHES. ANSWER ALL QUESTIONS ABOUT WEIGHT IN OUNCES." 2460 LOCATE 12, 32: PRINT "(1-3):"; : INPUT " ", I1$: I1 = VAL(I1$): NOSETYPE = I1 IF I1 < 1 OR I1 > 3 THEN GOTO 2460 CLS ON I1 GOTO 2490, 2520, 2550: GOTO 2330 2490 GOSUB 10000: GOSUB heading LOCATE 10, 25: PRINT "Enter ogive nose LENGTH:"; : INPUT " ", N1$ N1 = VAL(N1$) NOSELENGTH = N1 IF N1 = 0 THEN GOTO 2490 O1 = 2.67 * N1 / D1: GOTO 2560 'nose area ratio 2520 GOSUB 10010: GOSUB heading LOCATE 10, 25: PRINT "Enter nose cone LENGTH:"; : INPUT " ", N1$ N1 = VAL(N1$) NOSELENGTH = N1 IF N1 = 0 THEN GOTO 2520 O1 = 2 * SQR((D1 / 2) ^ 2 + N1 ^ 2) / D1: GOTO 2560 'nose area ratio 2550 N1 = D1 / 2: O1 = 2 2560 GOSUB 9010: GOSUB heading LOCATE 12, 25: PRINT "Enter BODY TUBE length:"; : INPUT " ", B1$: B1 = VAL(B1$) IF B1 = 0 THEN GOTO 2560 IF B1 < 2 THEN LOCATE 14, 5 PRINT "THAT'S KIND OF SHORT, ISN'T IT ?" GOTO 2560 END IF P1 = 4 * B1 / D1 'body area ratio L1 = N1 + B1 'total length K2 = O1 + P1 'total area ratio R1 = 50855! * L1 'REYNOLDS number at 100 FT/S, sea level, 70 deg F LOCATE 10, 25: PRINT " " LOCATE 12, 25: PRINT " " LOCATE 14, 5: PRINT SPACE$(35) 'clears last error message GOSUB 9020 2580 LOCATE 10, 25: PRINT "Enter LAUNCH LUG length:"; : INPUT " ", u1$: u1 = VAL(u1$) IF u1 = 0 THEN GOTO 2580 IF u1 > B1 THEN LOCATE 14, 5 PRINT "YOU CAN'T HAVE A LAUNCHING LUG THAT " LOCATE 15, 5 PRINT "IS LONGER THAN THE BODY TUBE." LOCATE 17, 5 PRINT "THE BODY TUBE IS"; B1; "INCHES LONG." LOCATE 10, 48: PRINT " " GOTO 2580 END IF C(3) = (1.2 * .005 + .0045 * u1) / A1 2590 CLS : GOSUB heading: LOCATE 10, 25: PRINT "Enter FINISH QUALITY number:" LOCATE 12, 28: PRINT "1. None"; LOCATE 13, 28: PRINT "2. Good"; LOCATE 14, 28: PRINT "3. Excellent"; 2595 LOCATE 16, 32: PRINT "(1-3):"; : INPUT " ", Q1$: Q1 = VAL(Q1$): QUALITY = Q1 IF Q1 < 1 OR Q1 > 3 THEN LOCATE 16, 39: PRINT " ": GOTO 2595 CLS ON Q1 GOTO 2660, 2660, 2670: GOTO 2595 2660 F1 = 10 ^ (-1.4 - LOG(R1) / LOG(10) * .16): GOTO 2680 'turbulent flow 2670 F1 = 10 ^ (.1836 - LOG(R1) / LOG(10) * .51) 'laminar flow 2680 C(1) = 1.02 * F1 * (1 + 1.5 / ((L1 / D1) ^ 1.5)) * K2 2690 GOSUB heading LOCATE 10, 25: PRINT "Enter base SHAPE number:" LOCATE 12, 28: PRINT "1. Blunt"; LOCATE 13, 28: PRINT "2. Boat tail"; GOSUB 4860 'DRAW BASES 2750 LOCATE 15, 32: PRINT "(1-2):"; : INPUT " ", I1$: I1 = VAL(I1$): BASESHAPE = I1 IF I1 < 1 OR I1 > 2 THEN LOCATE 15, 39: PRINT " ": GOTO 2750 CLS ON I1 GOTO 2760, 2770 2760 Z1 = D1: GOTO 2790 2770 GOSUB heading GOSUB boat COLOR 14, 4 LOCATE 21, 49: PRINT CHR$(24): LOCATE 21, 46: PRINT CHR$(24) LINE (365, 290)-(387, 290) COLOR 15, 4 LOCATE 10, 25: PRINT "Enter boat tail BASE diameter:"; : INPUT " ", Z1$: Z1 = VAL(Z1$) IF Z1 = 0 THEN GOTO 2770 2790 C(2) = .029 / SQR(C(1)) * (Z1 / D1) ^ 3: CLS 2810 GOSUB heading LOCATE 12, 30: PRINT "Typical fin stock :" LOCATE 13, 35: PRINT ".0625": LOCATE 14, 35: PRINT ".09375": LOCATE 15, 35: PRINT ".125" 2870 LOCATE 10, 29: PRINT "Enter fin THICKNESS:"; : INPUT " ", T1$: T1 = VAL(T1$) IF T1 = 0 THEN GOTO 2870 IF T1 > .5 THEN LOCATE 20, 23: PRINT "THAT'S KIND OF THICK, ISN'T IT ?": GOTO 2870 CLS : GOSUB 4540: GOSUB heading 2900 LOCATE 10, 25: PRINT "Enter fin ROOT LENGTH:"; : INPUT " ", Y1$ Y1 = VAL(Y1$) IF Y1 = 0 THEN GOTO 2900 LOCATE 10, 25: PRINT " " 2930 LOCATE 10, 25: PRINT "Enter fin RADIAL WIDTH:"; : INPUT " ", W1$ W1 = VAL(W1$) IF W1 = 0 THEN GOTO 2930 LOCATE 10, 25: PRINT " " 2960 LOCATE 10, 25: PRINT "Enter NUMBER of fins:"; : INPUT " ", M1$ M1 = VAL(M1$) IF M1 = 0 THEN GOTO 2960 LOCATE 10, 25: PRINT " " 2990 GOSUB 4720: LOCATE 10, 25: PRINT "Enter fin PROFILE number:" LOCATE 12, 28: PRINT "1. Rectangle" LOCATE 13, 28: PRINT "2. Triangle" LOCATE 14, 28: PRINT "3. Tapered" LOCATE 15, 28: PRINT "4. Elliptical" 3000 LOCATE 17, 32: PRINT "(1-4):"; : INPUT " ", I1$: I1 = VAL(I1$) PROFILE = I1 IF I1 < 0 OR I1 > 4 THEN GOTO 3000 ON I1 GOTO 3070, 3080, 3090, 3120: GOTO 2990 3070 H1 = Y1: GOTO 3130 3080 H1 = Y1 / 2: GOTO 3130 3090 FOR x = 10 TO 17: FOR Y = 28 TO 48 'clear text LOCATE x, Y: PRINT " ": NEXT Y: NEXT x COLOR 14, 4 LOCATE 18, 56: PRINT CHR$(27) LOCATE 20, 62: PRINT CHR$(27) LINE (435, 246)-(486, 277) COLOR 15, 4 'GOSUB 4820 LOCATE 10, 25: PRINT "Enter tapered FIN TIP LENGTH:"; INPUT " ", X1$: X1 = VAL(X1$): TAPEREDLENGTH = X1 IF X1 = 0 THEN GOTO 3090 H1 = (Y1 + X1) / 2: GOTO 3130 3120 H1 = .785 * Y1 3130 S1 = H1 * W1 * M1 3140 CLS : GOSUB heading: GOSUB 4540 LOCATE 10, 25: PRINT "Enter fin EDGE SHAPE number:" LOCATE 12, 28: PRINT "1. Square" LOCATE 13, 28: PRINT "2. Rounded" LOCATE 14, 28: PRINT "3. Streamlined" 3150 LOCATE 16, 32: PRINT "(1-3):"; : INPUT " ", I1$: I1 = VAL(I1$) IF I1 < 1 OR I1 > 3 THEN LOCATE 16, 37: PRINT " ": GOTO 3150 EDGESHAPE = I1 CLS ON I1 GOTO 3210, 3220, 3230: GOTO 3140 3210 E1 = T1 / Y1 * .875: GOTO 3240 'square fin 3220 E1 = T1 / Y1 * .5: GOTO 3240 'rounded fin 3230 E1 = .01 'streamlined fin 3240 C(4) = S1 / A1 * E1 'fin surface drag C(5) = E1 * Y1 / A1 * D1 / 2 * M1 'fin interference drag ON Q1 GOTO 3260, 3280, 3280 3260 FOR J = 1 TO 5: C(J) = C(J) * 1.25: NEXT J 'finish quality adjustment CLS 3280 C(6) = C(1) + C(2) + C(3) + C(4) + C(5) 'total drag LINE (55, 65)-(302, 200), , B LINE (50, 60)-(307, 205), , B LINE (55, 175)-(302, 175) LINE (55, 90)-(302, 90) LOCATE 6, 9 PRINT ROCKETNAME$ LOCATE 8, 8 PRINT " Nose + Body:"; TAB(30); : PRINT USING "#.###"; C(1) LOCATE 9, 8 PRINT " Base:"; TAB(30); : PRINT USING "#.######"; C(2) LOCATE 10, 8 PRINT " Fin Surface:"; TAB(30); : PRINT USING "#.###"; C(4) LOCATE 11, 8 PRINT " Fin Interfer:"; TAB(30); : PRINT USING "#.###"; C(5) LOCATE 12, 8 PRINT " Launch Lug:"; TAB(30); : PRINT USING "#.###"; C(3) COLOR 11 LOCATE 14, 8 PRINT " TOTAL DRAG:"; : PRINT TAB(30); : PRINT USING "#.###"; C(6); COLOR 15 C = C(6): GOSUB 9050: RETURN '----- MENU SUBROUTINE---- '-----SET COLORS,REVERSE COLORS,SCREEN POSITION----- 3460 COLOR FM, BM: WM = 0 em$(1) = "-ACCESS FILE-" em$(2) = " NEW ENTRY" em$(3) = " ** EXIT **" GOSUB 3570 GOTO 200 '-----MAIN MENU----- 3570 COLOR FM, BM: WM = 0 '-----PRINT MENU ITEMS------ EN = 3 'number of items in main menu 3640 FOR SM = 1 TO EN LOCATE SM + MY - 1, MX, 0: PRINT em$(SM) IF LEN(em$(SM)) > WM THEN WM = LEN(em$(SM)) NEXT SM WM = WM + 1: GOSUB 3790 '------MENU ITEM SELECTION LOOP----- 3700 AM$ = INKEY$ IF AM$ = CHR$(13) THEN RETURN IF AM$ = "" OR LEN(AM$) = 1 THEN 3700 AM = ASC(RIGHT$(AM$, 1)) IF AM = 80 THEN GOSUB 3780 IF AM = 72 THEN GOSUB 3840 GOTO 3700 '-----MOVE CURSOR BAR DOWN----- 3780 GOSUB 3900 3790 SM = SM + 1 IF SM > EN THEN SM = 1 GOSUB 3930 RETURN '-----MOVE CURSOR BAR UP----- 3840 GOSUB 3900 SM = SM - 1 IF SM < 1 THEN SM = EN GOSUB 3930 RETURN '-----NORMAL COLOR BAR----- 3900 LOCATE SM + MY - 1, MX - 1: PRINT " "; em$(SM); TAB(MX + WM); RETURN '-----REVERSE COLOR BAR----- 3930 COLOR BMR, FMR LOCATE SM + MY - 1, MX - 1 PRINT " "; em$(SM); TAB(MX + WM); COLOR FM, BM RETURN 'MENU ADAPTED FROM "PC RESOURCE" 4/89,PAGE 104 3990 ' ------------------------ EGA GRAPH OF ROCKET PATH -------------------- ' version 2.3 VIEW SCREEN (300, 6)-(636, 35), 0, 9: VIEW SCREEN (300, 203)-(636, 267), 0, 9 CLS LOCATE 2, 42: PRINT " CALCULATED ROCKET PATH " COLOR 14: LOCATE 16, 40: PRINT "Total altitude: "; PRINT USING "####.#"; H; PRINT " feet.": COLOR 15 LOCATE 17, 40, 0: PRINT "Ejection altitude: "; PRINT USING "####.#"; CE; PRINT " feet." IF CE <= 0 THEN GOTO 4070 LOCATE 18, 40, 0: PRINT "Ejection velocity: "; PRINT USING "###.#"; VE; PRINT " feet/sec.": GOTO 4080 4070 LOCATE 18, 40, 0: PRINT "IMPACT velocity: "; PRINT USING "###.#"; VE; PRINT " ft./sec." 4080 VIEW SCREEN (300, 40)-(636, 197), 3, 9 'screen for rocket path ' NOTE: If coasting time is zero, K, KTIME, and REALCOASTTIME are ' all equal to zero. ' ' K= actual coasting time allowing for premature chute ejection. ' - will equal engine time delay (TD) in some cases. ' ' KTIME= calaculated coasting time neglecting premature chute ejection ' ' REALCOASTTIME= actual coast time. May equal K or KTIME EK = K IF EK < 5 THEN EK = 5 IF AN = 0 THEN AI = 90 ELSE AI = ANGLE TU = (90 - AI) * .1 RK = KTIME IF RK = 0 THEN RK = EK IF EK < RK THEN T3 = 0 ELSE T3 = REALCOASTTIME 'T4 = (5.36 * EK ^ 2): IF T4 <> 197 THEN T4 = 197 - T4 T4 = 64 'start bottom of line RET = RK - EK - T3 IF RET > (.5 * EK) THEN RET = RET / 2: REM extends loop '---scale line to actual rocket height--- IF DI > 0 THEN 'DI= distance rocket falls RATIO = H / DI NGX = (1 / RATIO) * EK * (-1) NGX = NGX + (-.2) ' adjustment to make the line a little longer END IF IF DI = 0 THEN NGX = 0 '---draw rocket path--- PSET (20, 200) IF AI <= 90 THEN STARTLINE = 468 ' STARTLINE = X coordinate to start line IF AI <= 88 THEN STARTLINE = 410 IF AI <= 80 THEN STARTLINE = 310 FOR GX = EK TO RET STEP -.05 TX = 1 / 2 * (10.717 * GX ^ 2) STARTLINE = STARTLINE + TU '...ADDS THE LAUNCH ANGLE LINEHEIGHT = TX + T4 IF GX < NGX THEN GOTO 4250 IF GX < 0 THEN LINE -(STARTLINE, LINEHEIGHT), 12 GOTO 4240 ELSE LINE -(STARTLINE, LINEHEIGHT), 15 END IF 4240 NEXT GX 4250 IF CE = 0 THEN LOCATE 21, 14 COLOR 4 PRINT "**CAUTION!**"; COLOR 7, 8: PRINT " ROCKET IMPACTS AT "; PRINT USING "###.#"; VE; PRINT " FT/SEC " END IF LOCATE 23, 20: PRINT "ANOTHER CALCULATION ? (Y)es/(N)o/(S)hell" GOTO CLOCK 4280 IF ASK$ = "N" OR ASK$ = "n" THEN GOTO 4910 IF ASK$ = "S" OR ASK$ = "s" THEN SCREEN 0, 0, 0 PRINT " TYPE 'EXIT' TO RETURN TO THE ROCKET PROGRAM" SHELL GOTO RETURNFROMSHELL END IF GOTO 60 4320 '----------------SINGLE STAGE ENGINE NOT IN DATA BASE------------------ 4330 CALL WHATENGINE 'menu...read file or enter new engine data IF SELECTION = 3 THEN COLOR 15, 4 CLS MENUREAD = 0 RETURN 340 END IF IF SELECTION = 1 THEN CALL READFILE2 'read the engine data file IF SELECTION = 2 THEN GOTO PUTDATA1 'input engine data IF ENGINEPIC = 0 THEN 'no engine picked from data file MENUREAD = 0 COLOR 15, 4 CLS GOTO 4330 END IF IF ENGINEPIC = 1 THEN 'engine picked from data file E = XE: L = XL: I = XI: P = XP: TD = XTD 'actual engine data EDATA = E: LDATA = L: IDATA = I: PDATA = P 'data for engine data box T$ = XENGINENAME$ IF STAGE$ = "Y" THEN MENUREAD = 1: GOTO 11000 GOSUB 6050 IF R > 0 THEN CALL RKTWINDOW COLOR 15, 4 RETURN 770 END IF PUTDATA1: COLOR 15, 4 CLS CALL BOX3 COLOR 1, 7 4350 LOCATE 10, 16 INPUT "ENTER ENGINE TOTAL IMPULSE IN POUND-SECONDS: ", E$: E = VAL(E$): EDATA = E IF E = 0 THEN GOTO 4350 COLOR 1, 7 4380 LOCATE 11, 16 INPUT "ENTER THRUST DURATION IN SECONDS: ", L$ L = VAL(L$): LDATA = L: IF L = 0 THEN 4380 4390 LOCATE 12, 16 INPUT "ENTER INITIAL ENGINE WEIGHT IN OUNCES: ", I$ I = VAL(I$): IDATA = I: IF I = 0 THEN 4390 4400 LOCATE 13, 16 INPUT "ENTER PROPELLENT WEIGHT IN OUNCES: ", P$ P = VAL(P$): PDATA = P: IF P = 0 THEN 4400 IF P > I THEN LOCATE 12, 54: COLOR 17, 7 PRINT I: COLOR 1, 7 GOTO 4400 END IF LOCATE 12, 54: PRINT I 'turn off blinking initial weight if P>I LOCATE 14, 16 INPUT "ENTER TIME DELAY IN SECONDS: ", TD$ TD = VAL(TD$): TDDATA = TD CALL BOX4 LOCATE 20, 28 PRINT "WRITE DATA TO FILE ? Y/(N):" LOCATE 21, 53: INPUT "", ASK$ ASK$ = UCASE$(LEFT$(ASK$, 1)) IF ASK$ = "Y" THEN CALL BOX4 LOCATE 20, 31: PRINT "ENTER NAME OF ENGINE" LOCATE 21, 35: PRINT "__________" LOCATE 21, 35: INPUT "", T$ T$ = UCASE$(LEFT$(T$, 10)) IF T$ = "" THEN T$ = "UN-NAMED" ENGINENAME$ = T$ CALL ENGINEWRITE END IF COLOR 15, 4 CLS IF ASK$ = "Y" THEN CALL SAVEDBOX IF R > 0 THEN CALL RKTWINDOW RETURN 490 'don't read engine data array 4410 '-----------------BOOSTER ENGINE NOT IN DATA BASE--------------- 4412 CALL WHATENGINE 'menu...read file or enter new engine data IF SELECTION = 3 THEN COLOR 15, 4 CLS MENUREAD = 1 RETURN 340 END IF IF SELECTION = 1 THEN CALL READFILE2 'read the engine data file IF SELECTION = 2 THEN GOTO PUTDATA2 'input engine data IF ENGINEPIC = 0 THEN 'no engine picked from data file COLOR 15, 4 CLS GOTO 4412 END IF IF ENGINEPIC = 1 THEN 'engine picked from data file E2 = XE: L2 = XL: I2 = XI: P2 = XP: TD2 = 0 'actual engine data EDATA = E: LDATA = L: IDATA = I: PDATA = P 'data for engine data box T2$ = XENGINENAME$ GOSUB 6050 IF R > 0 THEN CALL RKTWINDOW COLOR 15, 4 GOTO 770 END IF PUTDATA2: COLOR 15, 4 CLS CALL BOX3 COLOR 1, 7 4415 LOCATE 10, 16 INPUT "ENTER ENGINE TOTAL IMPULSE IN POUND-SECONDS: ", E2$ E2 = VAL(E2$): EDATA = E2 IF E2 = 0 THEN GOTO 4415 4420 LOCATE 11, 16 INPUT "ENTER THRUST DURATION IN SECONDS: ", L2$ L2 = VAL(L2$): LDATA = L2: IF L2 = 0 THEN 4420 4425 LOCATE 12, 16 INPUT "ENTER INITIAL ENGINE WEIGHT IN OUNCES: ", I2$ I2 = VAL(I2$): IDATA = I2: IF I2 = 0 THEN 4425 4430 LOCATE 13, 16 INPUT "ENTER PROPELLENT WEIGHT IN OUNCES: ", P2$ P2 = VAL(P2$): PDATA = P2: IF P2 = 0 THEN 4430 IF P2 > I2 THEN LOCATE 12, 54: COLOR 17, 7 PRINT I2: COLOR 1, 7 GOTO 4430 END IF CALL BOX4 LOCATE 20, 28 PRINT "WRITE DATA TO FILE ? Y/(N):" LOCATE 21, 53: INPUT "", ASK$ ASK$ = UCASE$(LEFT$(ASK$, 1)) IF ASK$ = "Y" THEN CALL BOX4 LOCATE 20, 31: PRINT "ENTER NAME OF ENGINE" LOCATE 21, 35: PRINT "__________" LOCATE 21, 35: INPUT "", T2$ T2$ = UCASE$(LEFT$(T2$, 10)) IF T2$ = "" THEN T2$ = "UN-NAMED" ENGINENAME2$ = T2$ CALL BOOSTERWRITE END IF COLOR 15, 4: CLS IF ASK$ = "Y" THEN CALL SAVEDBOX IF R > 0 THEN CALL RKTWINDOW RETURN 11050 'don't read engine data array 4540 '--- DRAW ROCKET IN EGA --- VIEW PRINT 1 TO 25 CIRCLE (100, 100), 46, 15, 6, 3.4, 2 LINE (77, 113)-(123, 113) DRAW "D170;U70;F70;D25" LINE (123, 283)-(192, 307): LINE (77, 283)-(123, 283): LINE (77, 113)-(77, 283) DRAW "U70;G70;D25" LINE (8, 307)-(77, 283) DRAW "F10;R27;E10" COLOR 14, 4: LOCATE 20, 11: PRINT CHR$(25) LOCATE 17, 11: PRINT CHR$(24) LOCATE 18, 10: PRINT "ROOT" LOCATE 19, 9: PRINT "LENGTH" COLOR 1, 4: LINE (78, 213)-(88, 213): LINE (78, 283)-(88, 283): COLOR 14, 4 LOCATE 24, 15: PRINT "RADIAL WIDTH" LOCATE 23, 17: PRINT CHR$(27); "------"; CHR$(26): COLOR 15, 4 RETURN ' --- DRAW FINS IN EGA --- 4720 COLOR 14, 4: LOCATE 24, 30: PRINT "RECTANGLE TRIANGLE TAPERED ELLIPTICAL" COLOR 15 LINE (237, 310)-(300, 310): DRAW "U30;L63;D30": PAINT (250, 300), 1, 15 LINE (388, 310)-(338, 310): DRAW "U50;F50": PAINT (350, 300), 1, 15 LINE (435, 300)-(485, 310): LINE (435, 300)-(435, 250) LINE (435, 250)-(485, 280): LINE (485, 280)-(485, 310): PAINT (450, 300), 1, 15 CIRCLE (545, 285), 45, 15, 4.5, 1.8, .5 LINE (535, 307)-(535, 263): COLOR 15, 4: PAINT (545, 285), 1, 15 RETURN '---- BASE SHAPES IN EGA ---- 4860 LOCATE 22, 27: PRINT "BLUNT": LOCATE 22, 43: PRINT "BOAT TAIL" 'BLUNT LINE (200, 220)-(200, 275): DRAW "r50;u50" GOSUB BASESHADOW PAINT (210, 250), 1, 15 PAINT (210, 220), 8, 15 boat: 'BOAT TAIL LINE (350, 250)-(360, 275): DRAW "r30": LINE (400, 250)-(391, 275) LINE (350, 220)-(350, 250): DRAW "r50;u25" GOSUB BASESHADOW PAINT (360, 240), 1, 15 PAINT (360, 220), 8, 15 PAINT (370, 270), 1, 15 RETURN BASESHADOW: DRAW "l1;u1;l1;u1;l2;u1;l1;d1;l1;d1;l1;d1;l2;d3" DRAW "l2;d2;l3;d2;l3;d1;l1;d1;u1;l2;u1;l2;u1;l1;u2;l2;u1" DRAW "l1;u1;l2;u1;l2;u1;l1;u1;l2;d1;l3;d1;l1;d1" DRAW "l3;u1;l2;u1;l1;u1;l2;u1;l2;u2;l1;u2;l2" DRAW "r1;u1;r1;u1;r2;u1;r2;u1;r2;u1;r3" DRAW "r3;d1;r2;d1;r3;d1;r3;d1;r3;d1;r3;d1;r3;d1" DRAW "r2;d1;r2;d1;r1;u1;r2;u1;r2;u1;r2;u1;r2" DRAW "r2;d1;r3;d1;r1;d3" RETURN '---- EARTH AND MOON IN EGA ---- 4910 IF CGA = 1 GOTO 5058 CLS : COLOR 15, 0: LOCATE 23, 3: PRINT SPACE$(70) IF GOODBYE$ = "" THEN LOCATE 23, 35: PRINT "PRESS ANY KEY" CALL EARTHMOON IF GOODBYE$ = "EGA" THEN GOTO 5060 5055 PROMPT$ = INKEY$: IF PROMPT$ = "" THEN GOTO 5055 5058 SCREEN 0: COLOR 3, 0: LOCATE 2, 20: PRINT "CREDITS:" 5060 LOCATE 6, 1 PRINT " The calculations used to determine BURNOUT ALTITUDE, BURNOUT" PRINT " VELOCITY, COASTING DISTANCE, COASTING TIME, TOTAL ALTITUDE" PRINT " and COEFICIENT OF DRAG were written by MICHAEL L. GASPERI and" PRINT " were courtesy of ESTES INDUSTRIES. " PRINT " " PRINT " All other calculations, and this program itself were written" PRINT " by "; NAM2$; " and "; NAM1$ PRINT : PRINT "" PRINT : PRINT " Please report any bugs, comments or suggestions to:" LOCATE 18, 32: PRINT NAM1$ LOCATE 19, 32: PRINT NAM2$ LOCATE 20, 32: PRINT "P.O. BOX " + PO$ LOCATE 21, 32: PRINT CITY1$ + " " + CITY2$ + ", PA" + ZIP$ COLOR 14, 0 LOCATE 19, 10: PRINT "'THE KEEP' BBS" LOCATE 20, 10: PRINT "(215) " + PHONE1$ + "-0" + PHONE2$ LOCATE 23, 1 IF GOODBYE$ = "EGA" THEN COLOR 7, 0 LOCATE 23, 27 PRINT "PRESS ANY KEY TO EXIT TO DOS" COLOR 0, 0 INPUT "", END$ END IF END '---------------------------------------------------------------------------- 5240 ' error subroutine for calculations RESUME 5230 5230 ON ERROR GOTO 5250 SCREEN 9 COLOR 3, 0: CLS VIEW SCREEN (125, 20)-(500, 220), 0, 1 GOTO TEXT 5250 SCREEN 2 VIEW SCREEN (125, 20)-(500, 130), 0, 1 TEXT: LOCATE 5, 26: PRINT "AN ERROR HAS BEEN DETECTED !" LOCATE 7, 31: PRINT "PROGRAM TERMINATED." LOCATE 9, 23: PRINT "Press to begin again." LOCATE 10, 23: PRINT "Please make sure you have entered" LOCATE 11, 23: PRINT "correct values to all questions" LOCATE 12, 23: PRINT "pertaining to engine specifications" LOCATE 13, 23: PRINT "or rocket size and weight." 5350 ER$ = INKEY$: IF ER$ = "" THEN 5350 GOTO 60 REM ---------------------------------READ FILE FROM DISK------------------- 5500 COLOR 1, 15: CLS PRINT TAB(0); "RECORD"; TAB(10); "ROCKET NAME"; TAB(33); "WEIGHT"; PRINT TAB(46); "DIAMETER"; TAB(60); "DRAG"; TAB(69); "STAGES"; PRINT STRING$(80, 223): LOCATE 23, 1: PRINT STRING$(80, 223): COLOR 4, 15 DF = 0 '--number of rockets on the screen VIEW PRINT 3 TO 22 '------OPEN FILE AND PRINT ALL ROCKETS TO THE SCREEN------ 5510 OPEN "R", #1, "ROKET.DAT", 80 FIELD 1, 80 AS AA$ P1 = (LOF(1) / 80) FOR G = 1 TO P1 GET #1, G: XX$ = INPUT$(80, 1) GOSUB READFILE IF STAGE$ = "Y" THEN STAGES = 2 ELSE STAGES = 1 PRINT TAB(0); G; TAB(11); ROCKETNAME$; COLOR 0, 15 PRINT TAB(32); USING "##.## oz."; VAL(R$) + VAL(BOOSTERWEIGHT$); PRINT TAB(46); USING "##.### in."; VAL(DIA$); PRINT TAB(59); USING "##.##"; VAL(C$); PRINT TAB(71); STAGES COLOR 4, 15 DF = DF + 1 IF DF = 19 OR DF = 38 OR DF = 57 OR DF = 76 THEN VIEW PRINT 3 TO 25: LOCATE 24, 17 INPUT "ENTER RECORD NUMBER OR PRESS TO CONTINUE ", ENTER$ LOCATE 24, 17: PRINT SPACE$(50) IF ENTER$ <> "" THEN RC$ = ENTER$: GOTO 5690 VIEW PRINT 3 TO 22: CLS 2 END IF 5650 NEXT G IF P1 = 0 THEN CLOSE #1: CALL NOFILES: GOTO 60 VIEW PRINT 1 TO 25 LOCATE 24, 30: PRINT "Enter record number: "; COLOR 14, 1: LINE INPUT RC$: COLOR 4, 15 IF RC$ = "" THEN CLOSE #1: VIEW PRINT 1 TO 25: GOTO 60 5690 '------PICK A ROCKET AND PUT SPECS INTO MEMORY------ RC = VAL(RC$) IF RC > P1 OR RC = 0 THEN CALL NOSUCHFILE CLS : VIEW PRINT 1 TO 25 CLOSE #1 GOTO 5500 END IF GET #1, RC XX$ = INPUT$(80, 1) GOSUB READFILE BOOSTERWEIGHT = VAL(BOOSTERWEIGHT$) D = VAL(DIA$) C = VAL(C$) R = VAL(R$) REED = 1'FILE HAS BEEN READ VIEW PRINT 1 TO 25 RED = 0 IF R > 0 THEN CALL RKTWINDOW RED = 1 COLOR 15, 4 CALL BOX4 LOCATE 19, 31: PRINT "1. USE THIS FILE" LOCATE 20, 31: PRINT "2. PICK ANOTHER ENTRY" LOCATE 21, 31: PRINT "3. DELETE THIS FILE" 5700 LOCATE 21, 53: PRINT "1." LOCATE 21, 53: INPUT "", FYL$: FYL = VAL(FYL$) IF FYL = 2 THEN CLOSE #1: GOTO 5500 IF FYL = 3 THEN CALL DELFILE DELFILENAME$ = "ROCKET" CALL FILEMAN GOTO 5500 END IF IF FYL = 0 THEN FYL = 1 IF FYL = 1 THEN CLOSE #1: CLS : GOTO 210 IF FYL > 3 THEN LOCATE 21, 53: PRINT " ": GOTO 5700 READFILE: ROCKETNAME$ = LEFT$(XX$, 20) R$ = MID$(XX$, 21, 10) DIA$ = MID$(XX$, 31, 10) C$ = MID$(XX$, 41, 10) STAGE$ = MID$(XX$, 51, 1) BOOSTERWEIGHT$ = MID$(XX$, 60, 10) RETURN 6050 '---------------------WINDOW WITH ENGINE DATA----------------------------- FOR SND = 100 TO 1000 STEP 100: SOUND SND, .1: NEXT SND COLOR 4, 4 LOCATE 18, 25: PRINT SPACE$(50) 'erase comment on engine selection screen COLOR 15, 3 CALL BOX6 COLOR 1, 3 LOCATE 14, 38: IF MENUREAD = 1 THEN PRINT T$ ELSE PRINT T2$ LOCATE 15, 28: PRINT "TOTAL IMPULSE="; EDATA; "LB-SEC." LOCATE 16, 28: PRINT "THRUST DURATION="; LDATA; "SEC." LOCATE 17, 28: PRINT "INITIAL WEIGHT="; IDATA; "OZ." LOCATE 18, 28: PRINT "PROPELLENT WEIGHT="; PDATA; "OZ." COLOR 15, 4 IF TD2 > 0 THEN SOUND 400, 2 COLOR 23, 1 LOCATE 24, 22: PRINT "BOOSTER ENGINE TIME DELAY WILL BE IGNORED." SOUND 300, 2 COLOR 15, 4 END IF RETURN '--------------------HEY ! SOMEBODY CHANGED OUR NAMES !-------------- 6250 SCREEN 0, 0, 0: CLS LOCATE 10, 20: PRINT "YOU SHOULD NOT CHANGE THE AUTHORS' NAMES !" 6270 FOR SND = 1000 TO 9000 STEP 1000: SOUND SND, .5: NEXT SND: GOTO 6270 '-------------------------CGA SCREEN--------------------------------- 6290 CGA = 1 SCREEN 2: CLS PRINT "ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸" LOCATE 2, 1: PRINT "³": LOCATE 3, 1: PRINT "³" LOCATE 2, 37: PRINT "³": LOCATE 3, 37: PRINT "³" LOCATE 2, 4: PRINT ROCKETNAME$ LOCATE 4, 1: PRINT "ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;" IF STAGE$ = "Y" THEN IF RE > 1 THEN LOCATE 3, 4: PRINT "ENGINE TYPE: "; T2$; " ("; RE; "ENGINES)": GOTO 6360 LOCATE 3, 4: PRINT "ENGINE TYPE: "; T2$; " "; T$ ELSE IF RE > 1 THEN LOCATE 3, 4: PRINT "ENGINE TYPE: "; T$; " ("; RE; "ENGINES)": GOTO 6360 LOCATE 3, 4: PRINT "ENGINE TYPE: "; T$ END IF 6360 PRINT PRINT " TOTAL ALTITUDE="; H; "FEET" PRINT " DOWN RANGE "; DR; "FEET" IF STAGE$ = "Y" THEN PRINT " FIRST STAGE:" PRINT "BURNOUT VELOCITY="; BOOSTERVELOCITY; "FT/SEC" PRINT "BURNOUT ALTITUDE="; BOOSTERBURNOUT; "FEET" PRINT " SECOND STAGE:" END IF PRINT "BURNOUT VELOCITY="; V; "FT/SEC" PRINT "BURNOUT ALTITUDE="; S; "FEET" PRINT " COASTING DISTANCE="; G; "FEET" IF DI > 0 THEN PRINT " ROCKET FALLS "; DI; "FEET" CE = H - DI: IF CE < 0 THEN CE = 0 PRINT " CHUTE EJECTS AT"; CE; "FEET" IF CE = 0 THEN VE = SQR(2 * (32.15223097# * H)): GOTO 6470 PRINT " CHUTE EJECTS AT"; VE; "FT/SEC" 6470 PRINT " COASTING TIME="; K; "SEC." PRINT " LAUNCH ANGLE="; AG; "DEGREES" IF STAGE$ = "Y" THEN PRINT "LIFTOFF WEIGHT IS"; TWOSTAGEWEIGHT; "OUNCES" ELSE PRINT : PRINT : PRINT " AVERAGE THRUST="; T; "OUNCES" PRINT " THRUST DURATION="; L; "SEC." PRINT " LIFTOFF WEIGHT IS"; I + P + R; "OUNCES" END IF GOTO 7630 '---------------- CGA DRAG PREDICTION SCREENS --------------- 6540 SCREEN 2: CLS VIEW PRINT 1 TO 25 CGA = 1'PROGRAM IS IN CGA MODE 6550 LOCATE 6, 30: PRINT "Nose cone style:" LOCATE 8, 33: PRINT "1. Ogive"; LOCATE 9, 33: PRINT "2. Cone"; LOCATE 10, 33: PRINT "3. Hemisphere"; LOCATE 22, 17: PRINT "OGIVE CONE HEMISPHERE" CIRCLE (150, 140), 46, 3, 6, 3.4, 2: LINE (127, 152)-(170, 152), 3'OGIVE DRAW "l2;d10;l35;u10" LINE (300, 152)-(320, 100): LINE (320, 100)-(340, 152): LINE (300, 152)-(340, 152)'CONE DRAW "l2;d10;l35;u10" CIRCLE (490, 150), 21, 3, 6, 3.4: LINE (470, 152)-(510, 152)' HEMISPHERE DRAW "l2;d10;l35;u10" LOCATE 2, 11: PRINT "ANSWER ALL QUESTIONS CONCERNING LENGTH, WIDTH OR DIAMETER" LOCATE 3, 12: PRINT "IN INCHES. ANSWER ALL QUESTIONS ABOUT WEIGHT IN OUNCES." LOCATE 12, 32: PRINT "(1-3):"; : INPUT " ", I1$: I1 = VAL(I1$): CLS IF I1 < 1 OR I1 > 3 THEN GOTO 6540 ON I1 GOTO 6710, 6740, 6770: GOTO 6550 6710 LOCATE 10, 25: PRINT "Enter ogive nose length:"; : INPUT " ", N1$: N1 = VAL(N1$) IF N1 = 0 THEN GOTO 6710 O1 = 2.67 * N1 / D1: CLS : GOTO 6780 6740 LOCATE 10, 25: PRINT "Enter nose cone length:"; : INPUT " ", N1$: N1 = VAL(N1$) IF N1 = 0 THEN GOTO 6740 O1 = 2 * SQR((D1 / 2) ^ 2 + N1 ^ 2) / D1: CLS : GOTO 6780 6770 N1 = D1 / 2: O1 = 2: CLS 6780 LOCATE 10, 25: PRINT "Enter body tube length:"; : INPUT " ", B1$: B1 = VAL(B1$) IF B1 = 0 THEN GOTO 6780 P1 = 4 * B1 / D1: L1 = N1 + B1: K2 = O1 + P1: R1 = 50855! * L1: CLS 6810 LOCATE 10, 25: PRINT "Enter finish quality number:" LOCATE 12, 28: PRINT "1. None"; LOCATE 13, 28: PRINT "2. Good"; LOCATE 14, 28: PRINT "3. Excellent"; LOCATE 16, 32: PRINT "(1-3):"; : INPUT " ", Q1$: Q1 = VAL(Q1$): CLS IF Q1 < 1 OR Q1 > 3 THEN GOTO 6810 ON Q1 GOTO 6880, 6880, 6890: GOTO 6810 6880 F1 = 10 ^ (-1.4 - LOG(R1) / LOG(10) * .16): GOTO 6900 6890 F1 = 10 ^ (.1836 - LOG(R1) / LOG(10) * .51) 6900 C(1) = 1.02 * F1 * (1 + 1.5 / ((L1 / D1) ^ 1.5)) * K2 6910 LOCATE 10, 25: PRINT "Enter base shape number:" LOCATE 12, 28: PRINT "1. Blunt"; LOCATE 13, 28: PRINT "2. Boat tail"; GOSUB 8220 'DRAW BASES LOCATE 15, 32: PRINT "(1-2):"; : INPUT " ", I1$: I1 = VAL(I1$): CLS IF I1 < 1 OR I1 > 2 THEN GOTO 6910 ON I1 GOTO 6980, 6990, 7290 6980 Z1 = D1: GOTO 7010 6990 LOCATE 10, 25: PRINT "Enter boat tail base diameter:", : INPUT " ", Z1$: Z1 = VAL(Z1$) IF Z1 = 0 THEN GOTO 6990 7010 CLS : C(2) = .029 / SQR(C(1)) * (Z1 / D1) ^ 3 LOCATE 10, 25: PRINT " " 7030 LOCATE 10, 25: PRINT "Enter launch lug length:"; : INPUT " ", u1$: u1 = VAL(u1$) IF u1 = 0 THEN GOTO 7030 IF u1 > B1 THEN LOCATE 14, 5 PRINT "YOU CAN'T HAVE A LAUNCHING LUG THAT " LOCATE 15, 5 PRINT "IS LONGER THAN THE BODY TUBE." LOCATE 17, 5 PRINT "THE BODY TUBE IS"; B1; "INCHES LONG." LOCATE 10, 48: PRINT " " GOTO 7030 END IF C(3) = (1.2 * .005 + .0045 * u1) / A1 CLS LOCATE 10, 25: PRINT " " LOCATE 12, 25: PRINT "Typical fin stock :" LOCATE 13, 30: PRINT ".0625": LOCATE 14, 30: PRINT ".09375": LOCATE 15, 30: PRINT ".125" 7090 LOCATE 10, 25: PRINT "Enter fin thickness:"; : INPUT " ", T1$: T1 = VAL(T1$) IF T1 = 0 THEN GOTO 7090 IF T1 > .5 THEN LOCATE 20, 23: PRINT "THAT'S KIND OF THICK, ISN'T IT ?": T1 = 0: GOTO 7090 CLS : GOSUB 7910 7120 LOCATE 10, 25: PRINT "Enter fin root length:"; : INPUT " ", Y1$: Y1 = VAL(Y1$) IF Y1 = 0 THEN GOTO 7120 LOCATE 10, 25: PRINT " " 7150 LOCATE 10, 25: PRINT "Enter fin radial width:"; : INPUT " ", W1$: W1 = VAL(W1$) IF W1 = 0 THEN GOTO 7150 LOCATE 10, 25: PRINT " " 7180 LOCATE 10, 25: PRINT "Enter number of fins:"; : INPUT " ", M1$: M1 = VAL(M1$) IF M1 = 0 THEN GOTO 7180 LOCATE 10, 25: PRINT " " 7210 GOSUB 8090: LOCATE 4, 27: PRINT "Enter fin profile number:" LOCATE 6, 29: PRINT "1. Triangle"; LOCATE 7, 29: PRINT "2. Rectangle"; LOCATE 8, 29: PRINT "3. Tapered"; LOCATE 9, 29: PRINT "4. Elliptical"; LOCATE 11, 34: PRINT "(1-4):"; : INPUT " ", I1$: I1 = VAL(I1$): CLS : GOSUB 7910 IF I1 < 0 OR I1 > 4 THEN GOTO 7210 ON I1 GOTO 7290, 7300, 7310, 7340: GOTO 7210 7290 H1 = Y1 / 2: GOTO 7350 7300 H1 = Y1: GOTO 7350 7310 GOSUB 8180: LOCATE 10, 25: PRINT "Enter tapered fin tip length:"; INPUT " ", X1$ X1 = VAL(X1$): CLS : GOSUB 7910 IF X1 = 0 THEN GOTO 7310 H1 = (Y1 + X1) / 2: GOTO 7350 7340 H1 = .785 * Y1 7350 S1 = H1 * W1 * M1 7360 LOCATE 10, 25: PRINT "Enter fin edge shape number:" LOCATE 12, 28: PRINT "1. Square"; LOCATE 13, 28: PRINT "2. Rounded"; LOCATE 14, 28: PRINT "3. Streamlined"; LOCATE 16, 32: PRINT "(1-3):"; : INPUT " ", I1$: I1 = VAL(I1$): CLS IF I1 < 1 OR I1 > 3 THEN GOSUB 7910: GOTO 7360 ON I1 GOTO 7430, 7440, 7450: GOTO 7360 7430 E1 = T1 / Y1 * .875: GOTO 7460 7440 E1 = T1 / Y1 * .5: GOTO 7460 7450 E1 = .01 7460 C(4) = S1 / A1 * E1: C(5) = E1 * Y1 / A1 * D1 / 2 * M1 ON Q1 GOTO 7480, 7490, 7490 7480 FOR J = 1 TO 5: C(J) = C(J) * 1.25: NEXT J 7490 C(6) = C(1) + C(2) + C(3) + C(4) + C(5) LINE (45, 28)-(302, 115), , B LINE (41, 25)-(307, 118), , B LINE (45, 98)-(302, 98) LINE (45, 43)-(302, 43) LOCATE 5, 9 PRINT ROCKETNAME$ LOCATE 7, 8 PRINT " Nose + Body:"; TAB(30); : PRINT USING "#.######"; C(1) LOCATE 8, 8 PRINT " Base:"; TAB(30); : PRINT USING "#.######"; C(2) LOCATE 9, 8 PRINT " Fin Surface:"; TAB(30); : PRINT USING "#.######"; C(4) LOCATE 10, 8 PRINT " Fin Interfer:"; TAB(30); : PRINT USING "#.######"; C(5) LOCATE 11, 8 PRINT " Launch Lug:"; TAB(30); : PRINT USING "#.######"; C(3) LOCATE 14, 8 PRINT " TOTAL DRAG:"; : PRINT TAB(30); : PRINT USING "#.######"; C(6); C = C(6): GOTO 270 7630 REM ------------------------ CGA GRAPH OF ROCKET PATH -------------------- VIEW SCREEN (300, 2)-(600, 20), 0, 1 LOCATE 2, 42: PRINT "CALCULATED ROCKET PATH VER 2.1" VIEW SCREEN (300, 22)-(600, 197), 0, 1 EK = K 'actual coasting time allowing for premature chute ejection IF EK < 5 THEN EK = 5 IF AN = 0 THEN AI = 90 ELSE AI = ANGLE RK = KTIME 'calculated coasting time neglecting premature chute ejection IF RK = 0 THEN RK = EK TU = (90 - AI) * .1: IF EK < RK THEN T3 = 0 ELSE T3 = REALCOASTTIME T4 = (5.36 * EK ^ 2): IF T4 <> 197 THEN T4 = 197 - T4 RET = RK - EK - T3 IF RET > (.5 * EK) THEN RET = RET / 2: REM extends loop '---scale line to actual rocket height--- IF DI > 0 THEN RATIO = H / DI NGX = (1 / RATIO) * EK * (-1) IF DI = 0 THEN NGX = 0 END IF '---adjustment--- IF DI > 0 THEN NGX = NGX + (-.2) '---draw rocket path--- PSET (20, 200) STARTLINE = 310 FOR GX = EK TO RET STEP -.05 TX = 1 / 2 * (10.717 * GX ^ 2) STARTLINE = STARTLINE + TU '...adds the launch angle to the line LINEHEIGHT = TX + T4 IF GX < NGX THEN GOTO 7840 IF GX < 0 THEN LINE -(STARTLINE, LINEHEIGHT), 7 GOTO 7830 ELSE LINE -(STARTLINE, LINEHEIGHT), 7 END IF 7830 NEXT GX 7840 IF CE = 0 THEN LOCATE 21, 14 PRINT "**CAUTION!** ROCKET IMPACTS AT"; VE; "FT/SEC " END IF IF CE > 0 AND K = TD AND VE > 25 THEN LOCATE 21, 6 PRINT "***CAUTION!*** ROCKET IS STILL CLIMBING AT TIME OF CHUTE EJECTION" END IF LOCATE 23, 1: PRINT "ANOTHER CALCULATION ? " GOTO CLOCK 7910 '--- DRAW ROCKET IN CGA --- SCREEN 2 CIRCLE (110, 40), 40, 15, 6, 3.4, 2 LINE (91, 50)-(130, 50) DRAW "D110;U50;F50;D15" LINE (130, 160)-(180, 174) LINE (91, 160)-(130, 160) LINE (90, 50)-(90, 160) DRAW "U50;G50;D15" LINE (41, 174)-(91, 160) DRAW "F10;R19;E10" LOCATE 20, 11: PRINT CHR$(25) LOCATE 17, 11: PRINT CHR$(24) LOCATE 18, 10: PRINT "ROOT" LOCATE 19, 9: PRINT "LENGTH" LOCATE 23, 15: PRINT "RADIAL WIDTH" LOCATE 22, 17: PRINT CHR$(27); "-----"; CHR$(26) LOCATE 10, 10 RETURN ' --- DRAW FINS IN CGA --- 8090 LOCATE 22, 27: PRINT " TRIANGLE RECTANGLE TAPERED ELLIPTICAL" LINE (320, 160)-(370, 160): DRAW "U15;L51;D15": 'RECTANGLE LINE (270, 160)-(230, 160): DRAW "U40;F40": 'TRIANGLE LINE (410, 150)-(460, 160): LINE (410, 150)-(410, 120) LINE (410, 120)-(460, 150): LINE (460, 160)-(460, 150) CIRCLE (525, 145), 65, 15, 4.5, 1.8, .2 LINE (510, 157)-(510, 133) RETURN '---- TAPERED FIN IN CGA ----- 8180 LINE (300, 120)-(350, 130): LINE (300, 120)-(300, 90): LINE (350, 130)-(350, 120) LINE (300, 90)-(350, 120) LOCATE 12, 40: PRINT CHR$(27): LOCATE 15, 45: PRINT CHR$(27) RETURN '---- DRAW BASES IN CGA ---- 8220 LINE (200, 150)-(200, 180): DRAW "r60;u30" LINE (380, 150)-(380, 160): DRAW "r60;u10" LINE (380, 160)-(390, 180): DRAW "r40": LINE (431, 180)-(440, 160) LOCATE 22, 17: PRINT "BLUNT": LOCATE 22, 60: PRINT "BOAT TAIL" RETURN 9000 '...A FONT FOR EGA DRAG SCREENS FOR font = 1 TO 13 READ L$ L$(font) = L$ + "BR14" NEXT font '...DATA STATEMENTS NEEDED TO DRAW THE WORDS "DRAG ESTIMATION" '...THE LETTERS A, D, E, G, I, M, N, O, R, S, AND T DATA "BR4U2R2D2L2BL4" DATA " " DATA "U6E4R2F4D6L2U4L6D4L2BU6BR3R4H2G2BL3BD6" DATA "U10R9F1D8G1L9BE2U6R6D6L6BG2" DATA "U10R10D2L8D2R6D2L6D2R8D2L10" DATA "BU1U8E1R8F1D2L2U1L6D6R6U2L2U2R4D5G1L8H1BD1" DATA "U2R4U6L4U2R10D2L4D6R4D2L10" DATA "U10R2F3E3R2D10L2U8G3H3D8L2" DATA "U10R2F6U6R2D10L2H6D6L2" DATA "BU1U8E1R8F1D8G1L8H1BU1BR2U6R6D6L6BG2" DATA "U10R9F1D4G1L3F4L2H4L2D4L2BU6BR2U2R6D2L6BL2BD6" DATA "BU1U2R2D1R6U2L7H1U4E1R8F1D2L2U1L6D2R7F1D4G1L8H1BD1" DATA "BR4U8L4U2R10D2L4D8L2BL4" RETURN 9010 ' EGA BODY TUBE CIRCLE (470, 70), 20, 15, , , .2: LINE (450, 70)-(450, 300) CIRCLE (470, 300), 20, 15, 3, 6, .2: LINE (490, 70)-(490, 300) PAINT (470, 70), 8, 15: PAINT (470, 200), 1, 15 RETURN 9020 ' EGA LAUNCHING LUG CIRCLE (447, 220), 2, 15, , , .2 CIRCLE (447, 275), 2, 15, 3, 6, .2 LINE (445, 220)-(445, 275) PAINT (446, 250), 3, 15 LOCATE 18, 55: PRINT CHR$(26) LINE (275, 145)-(275, 175): DRAW "R152D69R10" RETURN 9050 ' --------------------------DRAG SCREEN SET UP-------------------------- IF NOSETYPE = 1 THEN NOSHAPE$ = "OGIVE" IF NOSETYPE = 2 THEN NOSHAPE$ = "CONE" IF NOSETYPE = 3 THEN NOSHAPE$ = "HEMISPHERE" IF QUALITY = 1 THEN QUALITY$ = "NONE" IF QUALITY = 2 THEN QUALITY$ = "GOOD" IF QUALITY = 3 THEN QUALITY$ = "EXCELLENT" IF PROFILE = 1 THEN PROFILE$ = "RECTANGLE" IF PROFILE = 2 THEN PROFILE$ = "TRIANGLE" IF PROFILE = 3 THEN PROFILE$ = "TAPERED" IF PROFILE = 4 THEN PROFILE$ = "ELLIPTICAL" IF BASESHAPE = 1 THEN BASESHAPE$ = "BLUNT" IF BASESHAPE = 2 THEN BASESHAPE$ = "BOAT TAIL" IF EDGESHAPE = 1 THEN EDGESHAPE$ = "SQUARE" IF EDGESHAPE = 2 THEN EDGESHAPE$ = "ROUNDED" IF EDGESHAPE = 3 THEN EDGESHAPE$ = "STREAMLINED" LINE (350, 8)-(605, 230), , B LINE (345, 3)-(610, 235), , B COLOR 14 ROCKETMASS = R: IF STAGE$ = "Y" THEN ROCKETMASS = R + BOOSTERWEIGHT LOCATE 2, 46, 0: PRINT "Rocket weight: "; ROCKETMASS; "Oz." LOCATE 3, 46, 0: PRINT "Nose type: "; NOSHAPE$ IF NOSETYPE = 3 THEN LOCATE 4, 46: PRINT "Nose length: "; DIAMETER1; "in.": GOTO 9075 IF NOSETYPE < 3 THEN LOCATE 4, 46, 0: PRINT "Nose length: "; NOSELENGTH; "in." 9075 LOCATE 5, 46, 0: PRINT "Body tube length: "; B1; "in." LOCATE 6, 46, 0: PRINT "Finish quality: "; QUALITY$ LOCATE 7, 46, 0: PRINT "Base type: "; BASESHAPE$ LOCATE 8, 46, 0: PRINT "Base diameter: "; Z1; "in." LOCATE 9, 46, 0: PRINT "Launch lug length: "; u1; "in." LOCATE 10, 46, 0: PRINT "Fin thickness: "; T1; "in." LOCATE 11, 46, 0: PRINT "Fin root length: "; Y1; "in." LOCATE 12, 46, 0: PRINT "Fin radial width: "; W1; "in." LOCATE 13, 46, 0: PRINT "Number of fins: "; M1 LOCATE 14, 46, 0: PRINT "Fin profile: "; PROFILE$ IF TAPEREDLENGTH = 0 THEN LOCATE 15, 46: PRINT "Tapered fin length: N/A": GOTO 9090 LOCATE 15, 46, 0: PRINT "Tapered fin length:"; TAPEREDLENGTH 9090 LOCATE 16, 46, 0: PRINT "Fin edge shape "; EDGESHAPE$ COLOR 15 RETURN 10000 ' DRAW OGIVE NOSECONE IN EGA CIRCLE (148, 275), 66, 15, 6, 3.42, 3: LINE (127, 294)-(168, 294), 15'OGIVE DRAW "l2;d10;l35;u10": PAINT (148, 275), 1, 15: PAINT (148, 298), 8, 15 RETURN 10010 ' DRAW CONE SHAPED NOSECONE IN EGA LINE (300, 294)-(320, 210): LINE (320, 210)-(340, 294): LINE (300, 294)-(340, 294)'CONE DRAW "l2;d10;l35;u10": PAINT (310, 291), 1, 15: PAINT (310, 300), 8, 15 RETURN 11000 '-------------GET BOOSTER ENGINE INFO------------------ UPPERENGINE = 1 'upper stage engine has already been picked CLS : CALL RKTWINDOW: COLOR 15, 4: GOSUB 2120: REM MENU SUBROUTINE 11001 T2$ = em$(SM) LOCATE 3, 30: PRINT " " 11005 IF T2$ = "OTHER" THEN LOCATE 18, 25: PRINT SPACE$(50) 'clear comment GOSUB 4410 END IF F2 = LEN(T2$): FOR X1 = 1 TO Q1 IF LEFT$(A$(X1), F2) = T2$ THEN 11010 NEXT X1 11010 E2$ = MID$(A$(X1), 9, 4): E2 = VAL(E2$): EDATA = E2 L2$ = MID$(A$(X1), 14, 4): L2 = VAL(L2$): LDATA = L2 I2$ = MID$(A$(X1), 19, 4): I2 = VAL(I2$): IDATA = I2 P2$ = MID$(A$(X1), 24, 5): P2 = VAL(P2$): PDATA = P2 TD2 = VAL(RIGHT$(T2$, 1)) 11050 GOSUB 6050 ' window with engine data COLOR 15, 4 GOTO 500 heading: DRAW "C14BM220,20": DRAW L$(4) + L$(11) + L$(3) + L$(6) DRAW L$(2) + L$(5) + L$(12) + L$(13) + L$(7) + L$(8) DRAW L$(3) + L$(13) + L$(7) + L$(10) + L$(9) RETURN ENGINECHOICE: LOCATE 21, 25 INPUT ; "IS THIS THE ENGINE YOU WANT ? (Y)/N ", CHOICE$ CHOICE$ = UCASE$(LEFT$(CHOICE$, 1)) RETURN CLOCK: DAY$ = "AM" DO ASK$ = INKEY$ CLOCK$ = LEFT$(TIME$, 2) CLOCK = VAL(CLOCK$) IF CLOCK > 11 THEN DAY$ = "PM": CLOCK = CLOCK - 12 IF CLOCK = 0 THEN CLOCK = 12 IF CGA = 1 THEN LOCATE 23, 60 ELSE LOCATE 23, 3 PRINT USING "##"; CLOCK; PRINT RIGHT$(TIME$, 6); " "; DAY$ IF ASK$ <> "" THEN 4280 LOOP SUB BOOSTERWRITE REM --------------------------------WRITE FILE TO DISK--------------------- SS$ = SPACE$(30) OPEN "R", #1, "ENGINE.DAT", 80 FIELD 1, 80 AS AA$ IF LOF(1) = 0 THEN P1 = 1: GOTO NXT P1 = (LOF(1) / 80) + 1 NXT: ENGINE2FILENAME$ = LEFT$(ENGINENAME2$ + SS$, 20) E2FILE$ = LEFT$(E2$ + SS$, 10) L2FILE$ = LEFT$(L2$ + SS$, 10) I2FILE$ = LEFT$(I2$ + SS$, 10) P2FILE$ = LEFT$(P2$ + SS$, 10) TD2FILE$ = "0" XX$ = ENGINE2FILENAME$ + E2FILE$ + L2FILE$ + I2FILE$ + P2FILE$ + TD2FILE$ LSET AA$ = XX$: PUT #1, P1 CLOSE #1 END SUB SUB BOX1 '---- BOX AROUND MAIN MENU ---- LOCATE 6, 13: PRINT CHR$(218) + STRING$(15, 196) + CHR$(191) FOR Y = 7 TO 9: LOCATE Y, 13: PRINT CHR$(179): LOCATE Y, 29: PRINT CHR$(179): NEXT Y LOCATE 10, 13: PRINT CHR$(192) + STRING$(15, 196) + CHR$(217) FOR COLR = 7 TO 9: LOCATE COLR, 14: PRINT SPACE$(15): NEXT COLR COLOR 0, 4: FOR SHAD = 7 TO 10: LOCATE SHAD, 30: PRINT "Û": NEXT SHAD LOCATE 11, 15: PRINT "ßßßßßßßßßßßßßßßß": COLOR 15, 4 END SUB SUB BOX2 '---- BOX AROUND ROCKET DIAMETER MENU ---- COLOR 15, 3 LOCATE 5, 8: PRINT CHR$(218) + STRING$(15, 196) + CHR$(191) FOR Y = 6 TO 13: LOCATE Y, 8: PRINT CHR$(179): LOCATE Y, 24: PRINT CHR$(179): NEXT Y LOCATE 14, 8: PRINT CHR$(192) + STRING$(15, 196) + CHR$(217) FOR COLR = 6 TO 13: LOCATE COLR, 9: PRINT SPACE$(15): NEXT COLR COLOR 0, 4: FOR SHAD = 6 TO 15: LOCATE SHAD, 25: PRINT "Û": NEXT SHAD LOCATE 15, 10: PRINT "ßßßßßßßßßßßßßßßß": COLOR 1, 3 END SUB SUB BOX3 COLOR 1, 7 LOCATE 9, 14: PRINT CHR$(218) + STRING$(51, 196) + CHR$(191) FOR Y = 10 TO 15: LOCATE Y, 14: PRINT CHR$(179): LOCATE Y, 66: PRINT CHR$(179): NEXT Y LOCATE 15, 14: PRINT CHR$(192) + STRING$(51, 196) + CHR$(217) FOR COLR = 10 TO 14: LOCATE COLR, 15: PRINT SPACE$(51): NEXT COLR COLOR 0, 4: FOR SHAD = 10 TO 15: LOCATE SHAD, 67: PRINT "Û": NEXT SHAD LOCATE 16, 16: PRINT STRING$(52, 223) END SUB SUB BOX4 LOCATE 19, 27: PRINT "³ ³" LOCATE 20, 27: PRINT "³ ³" LOCATE 21, 27: PRINT "³ ³" LOCATE 18, 27: PRINT "ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸" LOCATE 22, 27: PRINT "ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;" END SUB SUB BOX5 FOR SND = 100 TO 1000 STEP 100: SOUND SND, .1: NEXT SND LOCATE 7, 27 PRINT "ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸" LOCATE 14, 27 PRINT "ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;" FOR COL = 8 TO 13: LOCATE COL, 28: PRINT SPACE$(28) LOCATE COL, 27: PRINT "³": LOCATE COL, 55: PRINT "³": NEXT COL IF RED = 1 THEN COLOR 0, 4 ELSE COLOR 0, 7 FOR COL = 8 TO 14: LOCATE COL, 56: PRINT "Û": NEXT COL LOCATE 15, 28 PRINT STRING$(29, 223) END SUB SUB BOX6 LOCATE 13, 26: PRINT "ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸" LOCATE 19, 26: PRINT "ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;" FOR COL = 14 TO 18 LOCATE COL, 27: PRINT SPACE$(29) LOCATE COL, 26: PRINT "³" LOCATE COL, 56: PRINT "³" NEXT COL COLOR 0, 4 FOR COL = 14 TO 19 LOCATE COL, 57: PRINT "Û" NEXT COL LOCATE 20, 27: PRINT STRING$(31, 223) END SUB SUB DELFILE IF RC = 0 THEN CLOSE #1: CLS : EXIT SUB FOR x = RC + 1 TO LOF(1) / 80 GET #1, x: XX$ = INPUT$(80, 1): LSET AA$ = XX$: PUT #1, x - 1 NEXT x: x = LOF(1) / 80: LSET AA$ = SPACE$(80): PUT #1, x CLOSE #1 END SUB SUB EARTHMOON STAR$ = MID$(TIME$, 4, 2) + MID$(TIME$, 7) RANDOMIZE VAL(STAR$) FOR x = 1 TO 10: PSET (620 * RND, 400 * RND), 4: NEXT x FOR x = 1 TO 10: PSET (620 * RND, 400 * RND), 3: NEXT x FOR x = 1 TO 50: PSET (620 * RND, 400 * RND), 7: NEXT x FOR x = 1 TO 10: PSET (620 * RND, 400 * RND), 15: NEXT x IF GOODBYE$ = "EGA" THEN CIRCLE (507, 283), 30, 1: PAINT (507, 283), 1 DRAW "c7bm502,262r7d1r4l13d1l4r22d1l24g1r23l3d1l20" ELSE CIRCLE (497, 133), 30, 1: PAINT (497, 133), 1 DRAW "c3bm492,112r7d1r4l13d1l4r22d1l24g1r23l3d1l20" END IF DRAW "r3d1r14l4d1l8c2l3u1l1d2r18e3l1g1l2f1l5d2r4" DRAW "l16d1r14d1l15d1r14g1l13d1r13g1l13" DRAW "d1r13f2l1h3l3g1l8d1r6g1l4f1r3f1l3f1r6u2l1d1l1" DRAW "d2l3r5d1r1g1r13l2u1l7e1r3d3r7l15f1r15f1l16" DRAW "g1r21d1l21f1r20g1l18f1r17g1l15" DRAW "f1r13d1l13d1r11d1l11d1r9g1l7g1r6g1l4d1r2l5" DRAW "bh2e1r4e1r7l3e2r1" CIRCLE (337, 50), 8, 7: PAINT (337, 50), 7 END SUB SUB ENGINEWRITE REM --------------------------------WRITE FILE TO DISK--------------------- SS$ = SPACE$(30) OPEN "R", #1, "ENGINE.DAT", 80 FIELD 1, 80 AS AA$ IF LOF(1) = 0 THEN P1 = 1: GOTO ENG P1 = (LOF(1) / 80) + 1 ENG: ENGINEFILENAME$ = LEFT$(ENGINENAME$ + SS$, 20) EFILE$ = LEFT$(E$ + SS$, 10) LFILE$ = LEFT$(L$ + SS$, 10) IFILE$ = LEFT$(I$ + SS$, 10) PFILE$ = LEFT$(P$ + SS$, 10) TDFILE$ = LEFT$(TD$ + SS$, 10) XX$ = ENGINEFILENAME$ + EFILE$ + LFILE$ + IFILE$ + PFILE$ + TDFILE$ LSET AA$ = XX$: PUT #1, P1 CLOSE #1 END SUB SUB FILEMAN 'THIS PROGRAM REMOVES RECORDS THAT ARE ALL BLANK BECAUSE THEY 'HAVE BEEN DELETED. FILE2$ = "" 'flag for *.TMP . FILE2$="OPEN" when file is open. '---------------OPEN *.DAT AND GET DATA--------------- IF DELFILENAME$ = "ROCKET" THEN OPEN "R", #1, "ROKET.DAT", 80 ELSE IF DELFILENAME$ = "ENGINE" THEN OPEN "R", #1, "ENGINE.DAT", 80 END IF END IF FIELD 1, 80 AS AA$ P1 = (LOF(1) / 80) FOR G = 1 TO P1 GET #1, G: XX$ = INPUT$(80, 1) IF XX$ = SPACE$(80) THEN GOTO 6000 FIELD1$ = LEFT$(XX$, 20) FIELD2$ = MID$(XX$, 21, 10) FIELD3$ = MID$(XX$, 31, 10) FIELD4$ = MID$(XX$, 41, 10) FIELD5$ = MID$(XX$, 51, 9) FIELD6$ = MID$(XX$, 60, 10) '-------OPEN *.TMP AND WRITE FILE TO DISK------- IF FILE2$ = "OPEN" THEN GOTO 2000 IF DELFILENAME$ = "ROCKET" THEN OPEN "R", #2, "ROKET.TMP", 80 ELSE IF DELFILENAME$ = "ENGINE" THEN OPEN "R", #2, "ENGINE.TMP", 80 END IF END IF FILE2$ = "OPEN" 2000 FIELD 2, 80 AS NEWFILE$ IF LOF(2) = 0 THEN P2 = 1: GOTO WRITEDATA P2 = (LOF(2) / 80) + 1 WRITEDATA: NEWDATA$ = FIELD1$ + FIELD2$ + FIELD3$ + FIELD4$ + FIELD5$ + FIELD6$ IF NEWDATA$ = SPACE$(80) THEN NEWDATA$ = "" 'remove blank lines LSET NEWFILE$ = NEWDATA$: PUT #2, P2 6000 NEXT G CLOSE #1 CLOSE #2 IF DELFILENAME$ = "ROCKET" THEN SHELL "IF EXIST ROKET.BAK DEL ROKET.BAK" SHELL "REN ROKET.DAT ROKET.BAK" SHELL "REN ROKET.TMP ROKET.DAT" END IF IF DELFILENAME$ = "ENGINE" THEN SHELL "IF EXIST ENGINE.BAK DEL ENGINE.BAK" SHELL "REN ENGINE.DAT ENGINE.BAK" SHELL "REN ENGINE.TMP ENGINE.DAT" END IF END SUB SUB NOFILES '---------------------WINDOW FOR NO AVAILABLE FILE---------------------- FOR SND = 100 TO 1000 STEP 100: SOUND SND, .1: NEXT SND COLOR 15, 1 LOCATE 12, 26: PRINT "ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸" LOCATE 18, 26: PRINT "ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;" COLOR 0, 7: LOCATE 19, 27: PRINT STRING$(31, 223) FOR COL = 13 TO 18: LOCATE COL, 57: PRINT "Û": NEXT COL: COLOR 15, 1 FOR COL = 13 TO 17: LOCATE COL, 27: PRINT SPACE$(29) LOCATE COL, 26: PRINT "³": LOCATE COL, 56: PRINT "³": NEXT COL LOCATE 13, 33: PRINT "THERE ARE NO FILES" LOCATE 14, 35: PRINT "AVAILABLE YET. " LOCATE 16, 28: INPUT "PRESS TO CONTINUE", NOPE END SUB SUB NOSUCHFILE '-----------------------FILE NUMBER PICKED WAS TOO LARGE----------------- COLOR 15, 4: FOR SND = 1000 TO 100 STEP -50: SOUND SND, .2: NEXT SND LOCATE 10, 22: PRINT "ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸" LOCATE 13, 22: PRINT "ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;" COLOR 0, 7: LOCATE 14, 23: PRINT STRING$(39, 223) FOR COL = 11 TO 13: LOCATE COL, 61: PRINT "Û": NEXT COL: COLOR 15, 4 LOCATE 11, 22: PRINT "³ THERE IS NO RECORD WITH THAT NUMBER ³" LOCATE 12, 22: INPUT "³ press ³", NUN END SUB SUB OPENSCREEN SCREEN 0, 0, 0: COLOR 15, 4, 0: WIDTH 80: VIEW PRINT 1 TO 25: CLS COLOR 15, 1: PRINT CHR$(201) + STRING$(78, 205) + CHR$(187); PRINT CHR$(186); TAB(17); "MODEL ROCKET PERFORMANCE PREDICTION PROGRAM"; PRINT " ver 7.3 (EGA-CGA)"; TAB(80); CHR$(186); PRINT CHR$(200) + STRING$(78, 205) + CHR$(188): COLOR 15, 3, 0 END SUB SUB READFILE2 REM ---------------------------------READ FILE FROM DISK------------------- STRT: COLOR 1, 15: CLS PRINT TAB(0); "RECORD"; TAB(10); "ENGINE"; TAB(25); "IMPULSE"; PRINT TAB(36); "THRUST DURATION"; TAB(56); "WEIGHT."; PRINT TAB(67); "TIME DELAY"; PRINT STRING$(80, 223): LOCATE 23, 1: PRINT STRING$(80, 223): COLOR 4, 15 DF = 0 '--number of engines on the screen VIEW PRINT 3 TO 22 '------OPEN FILE AND PRINT ALL ENGINES TO THE SCREEN------ OPEN "R", #1, "ENGINE.DAT", 80 FIELD 1, 80 AS AA$ P1 = (LOF(1) / 80) FOR G = 1 TO P1 GET #1, G: XX$ = INPUT$(80, 1) GOSUB READFILE2 IF VAL(XTD$) > 0 THEN COLOR 1, 15 IF VAL(XTD$) = 0 THEN COLOR 4, 15 'booster engines a different color PRINT TAB(0); G; TAB(9); XENGINENAME$; 'IF VAL(XTD$) > 0 THEN COLOR 0, 15 'IF VAL(XTD$) = 0 THEN COLOR 0, 3 COLOR 0, 15 PRINT TAB(22); USING "##.## lb/sec"; VAL(XE$); PRINT TAB(39); USING "##.## sec."; VAL(XL$); PRINT TAB(55); USING "##.## oz."; VAL(XI$); IF VAL(XTD$) = 0 THEN COLOR 4, 15 PRINT TAB(68); USING "##.# sec. "; VAL(XTD$) COLOR 4, 15 DF = DF + 1 IF DF = 19 OR DF = 38 OR DF = 57 OR DF = 76 THEN VIEW PRINT 3 TO 25: LOCATE 24, 17 INPUT "ENTER RECORD NUMBER OR PRESS TO CONTINUE ", ENTER$ LOCATE 24, 17: PRINT SPACE$(50) IF ENTER$ <> "" THEN RC$ = ENTER$: GOTO PICK VIEW PRINT 3 TO 22: CLS 2 END IF SKIP: NEXT G IF P1 = 0 THEN '....... no files found CLOSE #1 VIEW PRINT 1 TO 25 CALL NOFILES EXIT SUB END IF VIEW PRINT 1 TO 25 LOCATE 24, 30: PRINT "Enter record number: "; COLOR 14, 1: LINE INPUT RC$: COLOR 4, 15 IF RC$ = "" THEN CLOSE #1 VIEW PRINT 1 TO 25 ENGINEPIC = 0 EXIT SUB END IF PICK: '------PICK AN ENGINE AND PUT SPECS INTO MEMORY------ RC = VAL(RC$) IF RC > P1 OR RC = 0 THEN VIEW PRINT 1 TO 25 CLOSE #1 CALL NOSUCHFILE GOTO STRT END IF GET #1, RC XX$ = INPUT$(80, 1) GOSUB READFILE2 XE = VAL(XE$) XL = VAL(XL$) XI = VAL(XI$) XP = VAL(XP$) XTD = VAL(XTD$) VIEW PRINT 1 TO 25 RED = 0 ' we're on a gray screen COLOR 15, 3 CALL BOX5 RED = 1 COLOR 1, 3 LOCATE 8, 37: PRINT XENGINENAME$ LOCATE 9, 28: PRINT "TOTAL IMPULSE="; XE; "LB-SEC." LOCATE 10, 28: PRINT "THRUST DURATION="; XL; "SEC." LOCATE 11, 28: PRINT "INITIAL WEIGHT="; XI; "OZ." LOCATE 12, 28: PRINT "PROPELLENT WEIGHT="; XP; "OZ." IF UPPERENGINE = 0 THEN LOCATE 13, 28: PRINT "TIME DELAY="; XTD; "SEC." ELSEIF UPPERENGINE > 0 AND XTD > 0 THEN COLOR 4, 3 LOCATE 13, 28: PRINT "TIME DELAY WILL BE IGNORED" COLOR 1, 3 END IF COLOR 15, 4 CALL BOX4 LOCATE 19, 31: PRINT "1. USE THIS FILE" LOCATE 20, 31: PRINT "2. PICK ANOTHER ENTRY" LOCATE 21, 31: PRINT "3. DELETE THIS FILE" INPT: LOCATE 21, 53: PRINT "1." LOCATE 21, 53: INPUT "", FYL$: FYL = VAL(FYL$) IF FYL = 2 THEN CLOSE #1: GOTO STRT IF FYL = 3 THEN CALL DELFILE DELFILENAME$ = "ENGINE" CALL FILEMAN GOTO STRT END IF IF FYL = 0 THEN FYL = 1 IF FYL = 1 THEN CLOSE #1 ENGINEPIC = 1 VIEW PRINT 1 TO 25 CLS EXIT SUB END IF IF FYL > 3 THEN LOCATE 21, 53: PRINT " ": GOTO INPT READFILE2: XENGINENAME$ = LEFT$(XX$, 9) XE$ = MID$(XX$, 21, 5) XL$ = MID$(XX$, 31, 5) XI$ = MID$(XX$, 41, 5) XP$ = MID$(XX$, 51, 5) XTD$ = MID$(XX$, 60, 5) RETURN END SUB SUB RKTNAMEBOX COLOR 15, 3 LOCATE 6, 47: PRINT CHR$(218) + STRING$(19, 196) + CHR$(191) FOR Y = 7 TO 8: LOCATE Y, 47: PRINT CHR$(179): LOCATE Y, 67: PRINT CHR$(179): NEXT Y LOCATE 9, 47: PRINT CHR$(192) + STRING$(19, 196) + CHR$(217) FOR COLR = 7 TO 8: LOCATE COLR, 48: PRINT SPACE$(19): NEXT COLR COLOR 0, 4: FOR SHAD = 7 TO 9: LOCATE SHAD, 68: PRINT "Û": NEXT SHAD LOCATE 10, 48: PRINT STRING$(21, 223) COLOR 1, 3 LOCATE 7, 48 PRINT "ENTER ROCKET NAME :" END SUB SUB RKTWINDOW REM ----------------------WINDOW WITH ROCKET DATA-------------------------- FOR SND = 100 TO 1000 STEP 100: SOUND SND, .1: NEXT SND COLOR 15, 1 IF STAGE$ = "Y" THEN LOCATE 4, 27 ELSE LOCATE 5, 27 PRINT "ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸" IF STAGE$ = "Y" THEN LOCATE 11, 27 ELSE LOCATE 10, 27 PRINT "ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;" IF STAGE$ = "Y" THEN ENDSIZ = 10 ELSE ENDSIZ = 9 IF STAGE$ = "Y" THEN STRTSIZ = 5 ELSE STRTSIZ = 6 FOR COL = STRTSIZ TO ENDSIZ: LOCATE COL, 28: PRINT SPACE$(28) LOCATE COL, 27: PRINT "³": LOCATE COL, 55: PRINT "³": NEXT COL IF RED = 1 THEN COLOR 0, 4 ELSE COLOR 0, 7 IF STAGE$ = "Y" THEN SIZ = 11 ELSE SIZ = 10 FOR COL = 6 TO SIZ: LOCATE COL, 56: PRINT "Û": NEXT COL IF STAGE$ = "Y" THEN LOCATE 12, 28 ELSE LOCATE 11, 28 PRINT STRING$(29, 223): COLOR 15, 1 IF STAGE$ = "Y" THEN LOCATE 5, 35: PRINT ROCKETNAME$ LOCATE 6, 30: PRINT "UPPER STAGE = "; : PRINT USING "##.##"; R; : PRINT " OZ." LOCATE 7, 30: PRINT "BOOSTER STAGE ="; : PRINT USING "##.##"; BOOSTERWEIGHT; : PRINT " OZ" LOCATE 8, 30: PRINT "TOTAL WEIGHT = "; : PRINT USING "##.##"; R + BOOSTERWEIGHT; : PRINT " OZ" LOCATE 9, 30: PRINT "DIAMETER ="; : PRINT USING "##.###"; D; : PRINT " in." LOCATE 10, 30: PRINT "COEF. OF DRAG ="; : PRINT USING "##.###"; C ELSE LOCATE 6, 35: PRINT ROCKETNAME$ LOCATE 7, 31: PRINT "WEIGHT="; : PRINT USING "##.###"; R; : PRINT " OZ." LOCATE 8, 31: PRINT "DIAMETER="; : PRINT USING "##.###"; D; : PRINT " in." LOCATE 9, 31: PRINT "COEF. OF DRAG="; : PRINT USING "##.###"; C END IF FOR SND = 100 TO 1000 STEP 100: SOUND SND, .1: NEXT SND END SUB SUB SAVEDBOX IF CGA = 0 THEN COLOR 14 LOCATE 22, 65: PRINT "ºFILE SAVEDº" LOCATE 21, 65: PRINT "ÉÍÍÍÍÍÍÍÍÍÍ»" LOCATE 23, 65: PRINT "ÈÍÍÍÍÍÍÍÍÍͼ" IF CGA = 0 THEN COLOR 15 END SUB SUB WHATENGINE COLOR 1, 7 CALL BOX6 COLOR 1, 7 ENTER: LOCATE 15, 28 PRINT "1. READ ENGINE DATA FILE" LOCATE 16, 28 PRINT "2. ENTER NEW ENGINE DATA" LOCATE 17, 28 PRINT "3. EXIT THIS MENU" LOCATE 18, 53: PRINT "1" LOCATE 18, 53: INPUT "", SELECT$ SELECTION = VAL(SELECT$) IF SELECT$ = "" THEN SELECTION = 1 IF SELECTION < 1 OR SELECTION > 3 GOTO ENTER END SUB SUB WRITEFILE1 REM --------------------------------WRITE FILE TO DISK--------------------- TEMPNAME$ = ROCKETNAME$ 'preserve length of origonal ROCKETNAME$ SS$ = SPACE$(30) OPEN "R", #1, "ROKET.DAT", 80 FIELD 1, 80 AS AA$ IF LOF(1) = 0 THEN P1 = 1: GOTO RKT P1 = (LOF(1) / 80) + 1 RKT: ROCKETNAME$ = LEFT$(ROCKETNAME$ + SS$, 20) R$ = LEFT$(STR$(R) + SS$, 10) DIA$ = LEFT$(STR$(D) + SS$, 10) C$ = LEFT$(STR$(C) + SS$, 10) STA$ = STAGE$ + " " BOOSTERWEIGHT$ = LEFT$(STR$(BOOSTERWEIGHT) + SS$, 10) XX$ = ROCKETNAME$ + R$ + DIA$ + C$ + STA$ + BOOSTERWEIGHT$ LSET AA$ = XX$: PUT #1, P1 CLOSE #1 ROCKETNAME$ = TEMPNAME$ END SUB