Updates to CPM and Microsoft BASIC to configure the new Video Module and system board speed

This commit is contained in:
Philip Smart
2020-09-06 17:06:53 +01:00
parent 837786d2e4
commit 0b40f88088
58 changed files with 1650 additions and 4 deletions

Binary file not shown.

BIN
software/BAS/CIRCOM.BAS Normal file

Binary file not shown.

412
software/BAS/DEMOGRAF.BAS Normal file
View File

@@ -0,0 +1,412 @@
REM THIS IS A DEMONSTRATION PROGRAM FOR
REM CBASIC GRAPHICS EXTENSIONS
REM
REM PROGRAM NAME: DEMOGRAF
REM
%INCLUDE GRAPHCOM.BAS
DEF PAUSE
REM UTILITY TO SUSPEND PROGRAM EXECUTION UNTIL CHARACTER IS
REM ENTERED AT CONSOLE, STOPPING PROGRAM IF CTRL-C IS ENTERED,
REM OTHERWISE RETURNING INTEGER VALUE OF CHARACTER ENTERED.
REM CHARACTER IS NOT DISPLAYED.
INTEGER PAUSE,CHOICE
CHOICE = INKEY
IF CHOICE = 3 THEN STOP
PAUSE = CHOICE
FEND
GRAPHIC OPEN 1
CLEAR
BEEM: GRAPHIC PRINT AT (0,.9): "BEAM STATEMENT"
SET BEAM "OFF"
PLOT (0,1),(1,1),(1,0),(0,0)
KEY% = PAUSE REM WAIT FOR CONSOLE INPUT
CLEAR
SET BEAM "ON"
PLOT (0,1),(1,1),(1,0),(0,0)
KEY% = PAUSE
REM ILLUSTRATE TECHNIQUE OF SQUARING A DISPLAY
BOWNDS: CLEAR
GRAPHIC PRINT AT (0,.9): "BOUNDS STATEMENT"
ASK DEVICE X.AXIS,Y.AXIS
PRINT "THE ASPECT RATIO IS = ";Y.AXIS;"/";X.AXIS
KEY% = PAUSE
PLOT (0,0),(0,1),(1,1),(1,0),(0,0)
KEY% = PAUSE
CLEAR
SET BOUNDS Y.AXIS,X.AXIS
PLOT (0,0),(0,1),(1,1),(1,0),(0,0)
SET BOUNDS 1,1
KEY% = PAUSE
REM DEMONSTRATE CONTROL OF GRAPHIC CHARACTER HEIGHT
REM AND MINIMUM HEIGHT FOR GRAPHIC CHARACTERS
HIGH: CLEAR
SET CHARACTER HEIGHT 0
GRAPHIC PRINT AT (0,.9): "CHARACTER HEIGHT STATEMENT"
SET CHARACTER HEIGHT .1
GRAPHIC PRINT AT (0,.7): "10 PERCENT"
KEY% = PAUSE
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 15
GRAPHIC PRINT AT (0,40): "15 PERCENT"
KEY% = PAUSE
SET CHARACTER HEIGHT 0
ASK CHARACTER HEIGHT CH
PRINT "MINIMUM CHARACTER HEIGHT IS = "; CH
GRAPHIC PRINT AT (0,20): "MINIMUM HEIGHT"
REM DISPLAY SEVERAL RANDOM LINES ON SCREEN, THEN MAKE
REM THEM DISAPPEAR VIA "CLEAR" STATEMENT
INPUT ""; LINE SEED$
RANDOMIZE
CLR: CLEAR
GRAPHIC PRINT AT (0,90): "CLEAR STATEMENT"
SET WINDOW 0,1,0,1
FOR I.INT% = 1 TO 10
PLOT (RND,RND),(RND,RND)
NEXT I.INT%
KEY% = PAUSE
CLEAR
REM ILLUSTRATE EFFECT OF AUTOMATIC CLIPPING WHEN FIGURE
REM EXCEEDS ALLOWABLE BOUNDARIES
CLP: SET WINDOW 0,100,0,100
GRAPHIC PRINT AT (0,90): "CLIP STATEMENT"
PLOT (25,10),(50,150),(75,10),(25,10)
KEY% = PAUSE
REM DRAW BORDER IN EACH AVAILABLE COLOR (NUMBER OF
REM COLORS VARIES WITH RESOLUTION)
COLR: CLEAR
GRAPHIC PRINT AT (0,90): \
"COLOR AND COLOR COUNT STATEMENTS"
SET WINDOW 0,1,0,1
ASK COLOR COUNT CT%
FOR I.INT% = 1 TO CT%
SET COLOR I.INT%
PLOT (0,0),(0,1),(1,1),(1,0),(0,0)
KEY% = PAUSE
NEXT I.INT%
REM RETRIEVE AND DISPLAY SPECIFICATIONS FOR CURRENT DEVICE
DEVC: CLEAR
SET CHARACTER HEIGHT 0
SET COLOR 1
GRAPHIC PRINT AT (0,.8): "DEVICE STATEMENT"
ASK DEVICE X.AXIS,Y.AXIS
PRINT "THE VERTICAL AXIS IS "; \
Y.AXIS*100.0/X.AXIS;"PERCENT OF THE";
PRINT " HORIZONTAL AXIS"
PRINT "X= ";X.AXIS;" Y= ";Y.AXIS
KEY% = PAUSE
REM MENTION "GRAPHIC CLOSE" STATEMENT
GCLOSE: CLEAR
GRAPHIC PRINT AT (0,.9): "GRAPHIC CLOSE STATEMENT"
GRAPHIC PRINT AT (0,.5): "GRAPHIC CLOSE HAS NO DEMO"
KEY% = PAUSE
REM ILLUSTRATE GRAPHIC INPUT VIA CURSOR POSITIONING
GIN: CLEAR
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 0
GRAPHIC PRINT AT (0,80): "GRAPHIC INPUT STATEMENT"
GRAPHIC PRINT AT (0,25): "OPTION 1 ."
SET COLOR 2
GRAPHIC PRINT AT (0,50): "OPTION 2 ."
SET COLOR 3
GRAPHIC PRINT AT (0,75): "OPTION 3 ."
GRAPHIC INPUT X.AXIS,Y.AXIS,A$
N = INT((Y.AXIS+5)/25)
IF N = 0 THEN N = 1 REM NO OPTION ZERO
IF N > 3 THEN N = 3 REM ONLY THREE OPTIONS
PRINT "THE CURSOR WAS POSITIONED AT: "; X.AXIS,Y.AXIS
PRINT "YOU SELECTED OPTION: "; N
PRINT "THE TERMINATING KEY WAS: "; A$
KEY% = PAUSE
REM MENTION "GRAPHIC OPEN" STATEMENT
GOPEN: CLEAR
SET COLOR 1
SET CHARACTER HEIGHT 0
GRAPHIC PRINT AT (0,90): "GRAPHIC OPEN STATEMENT"
GRAPHIC PRINT AT (0,50): \
"THE GRAPHIC OPEN HAS NO DEMONSTRATION"
KEY% = PAUSE
REM DEMONSTRATE CENTERING AND JUSTIFICATION
GPRT: CLEAR
SET WINDOW 0,1,0,1
SET CHARACTER HEIGHT 0
GRAPHIC PRINT AT (0,.9): "GRAPHIC PRINT STATEMENT"
SET JUSTIFY 0,0
GRAPHIC PRINT AT (.5,.5): "BEGINS AT CENTER"
KEY% = PAUSE
SET JUSTIFY .5,0
GRAPHIC PRINT AT (.5,.3): "THIS IS CENTERED"
KEY% = PAUSE
SET JUSTIFY .5,.5
GRAPHIC PRINT AT (.5,.3): "THIS IS CENTERED"
KEY% = PAUSE
SET JUSTIFY 1.0,1.0
GRAPHIC PRINT AT (.5,.5): "ENDS AT CENTER"
KEY% = PAUSE
JUST: CLEAR
SET JUSTIFY 0,0
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 0
GRAPHIC PRINT AT (0,90): "JUSTIFY STATEMENT"
PLOT (20,80),(20,20),(80,20)
PLOT (15,40),(20,40)
PLOT (15,60),(20,60)
PLOT (15,80),(20,80)
PLOT (40,15),(40,20)
PLOT (60,15),(60,20)
PLOT (80,15),(80,20)
SET JUSTIFY 1,.5
GRAPHIC PRINT AT (14,20): "20"
GRAPHIC PRINT AT (14,40): "40"
GRAPHIC PRINT AT (14,60): "60"
GRAPHIC PRINT AT (14,80): "80"
SET JUSTIFY .5,1
GRAPHIC PRINT AT (20,14): "20"
GRAPHIC PRINT AT (40,14): "40"
GRAPHIC PRINT AT (60,14): "60"
GRAPHIC PRINT AT (80,14): "80"
KEY% = PAUSE
REM EXHIBIT VARIATION OF LINE STYLE
STYL: CLEAR
SET JUSTIFY 0,0
SET WINDOW 0,1,0,1
GRAPHIC PRINT AT (0,.9): "LINE STYLE STATEMENT"
SET LINE STYLE 3
SET JUSTIFY 1,0
GRAPHIC PRINT AT (.5,.5): "Sign here"
PLOT (0.5,0.5),(0.8,0.5)
KEY% = PAUSE
REM ILLUSTRATE VARIATION IN SIZE OF MARKERS
MHIGH: CLEAR
SET WINDOW 0,1,0,1
SET CHARACTER HEIGHT 0
SET LINE STYLE 1
SET JUSTIFY 0,0
GRAPHIC PRINT AT (0,.9): "MARKER HEIGHT STATEMENT"
DIM MX(5)
DIM MY(5)
MX(0) = .3 : MY(0) = .7
MX(1) = .7 : MY(1) = .7
SET MARKER HEIGHT .1
MAT MARKER 1: MX,MY
SET WINDOW 0,100,0,100
MX(0) = 30 : MY(0) = 50
MX(1) = 70 : MY(1) = 50
SET MARKER HEIGHT 15
MAT MARKER 1: MX,MY
SET MARKER HEIGHT 0
ASK MARKER HEIGHT MK
PRINT "MINIMUM MARKER HEIGHT IS = "; MK
KEY% = PAUSE
REM DEMONSTRATE ALL MARKER SHAPES
MTYPE: CLEAR
SET WINDOW 0,1,0,1
SET MARKER HEIGHT 0
GRAPHIC PRINT AT (0,.9): "MARKER TYPE STATEMENT"
MX(0) = .5 : MY(0) = .7
FOR I.INT% = 1 TO 5
SET MARKER TYPE I.INT%
MAT MARKER 0: MX,MY
MY(0) = MY(0) - .1
NEXT I.INT%
KEY% = PAUSE
REM DEMONSTRATE FILLED POLYGON
MFILL: CLEAR
SET LINE STYLE 1
SET JUSTIFY 0,0
GRAPHIC PRINT AT (0,.9): "MAT FILL STATEMENT"
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 0
SET COLOR 1
DIM X.ARRAY(10)
DIM Y.ARRAY(10)
X.ARRAY(0) = 40 : Y.ARRAY(0) = 10
X.ARRAY(1) = 35 : Y.ARRAY(1) = 25
X.ARRAY(2) = 50 : Y.ARRAY(2) = 40
X.ARRAY(3) = 65 : Y.ARRAY(3) = 25
X.ARRAY(4) = 60 : Y.ARRAY(4) = 10
MAT FILL 4: X.ARRAY,Y.ARRAY
KEY% = PAUSE
REM ILLUSTRATE POSITIONING OF MARKERS VIA AN ARRAY
MMARK: CLEAR
SET WINDOW 0,100,0,100
GRAPHIC PRINT AT (0,90): "MAT MARKER STATEMENT"
SET MARKER HEIGHT 0
SET MARKER TYPE 1
SET COLOR 1
MAT MARKER 4: X.ARRAY,Y.ARRAY
KEY% = PAUSE
REM DEMONSTRATE DRAWING POLYGON OUTLINE VIA AN ARRAY
MPLOT: CLEAR
GRAPHIC PRINT AT (0,90): "MAT PLOT STATEMENT"
SET COLOR 1
SET WINDOW 0,1,0,1
SET CHARACTER HEIGHT 0
FOR I.INT% = 0 TO 4
X.ARRAY(I.INT%) = .01 * X.ARRAY(I.INT%)
Y.ARRAY(I.INT%) = .01 * Y.ARRAY(I.INT%)
NEXT I.INT%
X.ARRAY(5) = .40 : Y.ARRAY(5) = .10
SET BEAM "OFF"
MAT PLOT 4: X.ARRAY,Y.ARRAY
KEY% = PAUSE
CLEAR
MAT PLOT 5: X.ARRAY,Y.ARRAY
KEY% = PAUSE
REM DO POLYGON VIA "PLOT" STATEMENTS
PLT: CLEAR
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 0
SET COLOR 1
GRAPHIC PRINT AT (0,90): "PLOT STATEMENT"
PLOT (40,10),(35,25);
SET COLOR 2
PLOT (35,25),(50,40);
SET LINE STYLE 2
PLOT (50,40),(65,25);
SET LINE STYLE 1
SET COLOR 3
PLOT (65,25),(60,10),(40,10)
KEY% = PAUSE
REM EXERCISE ARBITRARY POSITIONING OF GRAPHIC BEAM
POSIT: CLEAR
GRAPHIC PRINT AT (0,90): "POSITION STATEMENT"
SET BEAM "OFF"
SET POSITION 50,50
SET POSITION 50,100
SET BEAM "ON"
SET POSITION 0,0
SET POSITION 50,50
KEY% = PAUSE
REM SHOW ALL LINE STYLES
STCNT: CLEAR
GRAPHIC PRINT AT (0,90): "STYLE COUNT STATEMENT"
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 0
ASK STYLE COUNT ST%
PRINT "THE NUMBER OF LINE STYLES IS: "; ST%
FOR I.INT% = 1 TO ST%
SET LINE STYLE I.INT%
SET BEAM "OFF"
PLOT (10*I.INT%,10),(10*I.INT%,90)
NEXT I.INT%
KEY% = PAUSE
SET LINE STYLE 1
REM DEMONSTRATE ROTATION OF TEXT
ANGEL: CLEAR
GRAPHIC PRINT AT (0,90): "TEXT ANGLE STATEMENT"
SET WINDOW 0,1,0,1
SET CHARACTER HEIGHT 0
PI = 3.1415926
RAD = PI*2
DEG = RAD/360
FOR I.INT% = 90 TO 360 STEP 90
SET TEXT ANGLE I.INT%*DEG
GRAPHIC PRINT AT (.5,.5): "ROTATE ME"
NEXT I.INT%
KEY% = PAUSE
SET TEXT ANGLE 0
REM ILLUSTRATE EFFECT OF VARYING VIEWPORT
VYOU: CLEAR
GRAPHIC PRINT AT (0,.9): "VIEWPORT STATEMENT"
X.ARRAY(0) = 0 : Y.ARRAY(0) = 0
X.ARRAY(1) = 0 : Y.ARRAY(1) = 100
X.ARRAY(2) = 100 : Y.ARRAY(2) = 100
X.ARRAY(3) = 100 : Y.ARRAY(3) = 0
X.ARRAY(4) = 0 : Y.ARRAY(4) = 0
SET VIEWPORT 0,1,0,1
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 0
MAT PLOT 4: X.ARRAY,Y.ARRAY
SET VIEWPORT .1,.9,.1,.9
MAT PLOT 4: X.ARRAY,Y.ARRAY
SET VIEWPORT .2,.8,.2,.8
MAT PLOT 4: X.ARRAY,Y.ARRAY
SET VIEWPORT .3,.5,.3,.5
MAT PLOT 4: X.ARRAY,Y.ARRAY
SET VIEWPORT .5,.7,.5,.7
MAT PLOT 4: X.ARRAY,Y.ARRAY
KEY% = PAUSE
REM ILLUSTRATE EFFECT OF VARYING WINDOW
WINDW: CLEAR
SET VIEWPORT 0,1,0,1
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 0
GRAPHIC PRINT AT (0,90): "WINDOW STATEMENT"
PLOT (0,0),(60,60),(60,0),(0,0)
SET WINDOW 0,200,0,200
SET CHARACTER HEIGHT 0
PLOT (0,0),(60,60),(60,0),(0,0)
SET VIEWPORT 0,.5,.5,1.0
PLOT (0,0),(60,60),(60,0),(0,0)
KEY% = PAUSE
REM FINISH DEMONSTRATION AND END PROGRAM
FIN: CLEAR
SET WINDOW 0,100,0,100
SET CHARACTER HEIGHT 0
SET VIEWPORT 0,1,0,1
SET COLOR 1
FOR I.INT% = 1 TO CT%
SET COLOR I.INT%
MAT PLOT 5: X.ARRAY,Y.ARRAY
SET VIEWPORT .01*I.INT%,1-(I.INT%*.01), \
.01*I.INT%,1-(I.INT%*.01)
NEXT I.INT%
SET JUSTIFY .5,.5
SET COLOR 1
SET VIEWPORT 0,1,0,1
GRAPHIC PRINT AT (50,50): "THANKS FOR THE VIEWING"
KEY% = PAUSE
STOP
END


View File

@@ -0,0 +1,4 @@
COMMON ?VIEW(2),?WIND(2),?P(2),?P1(2),?KAPU(2)
COMMON ?PTSI%(1),?PTSO%(1),?CONT%(1),?INTI%(1),?INTO%(1)
COMMON ?VWTX(2),?RVIW(2),?VX(1),?XN,?YN,?XW,?YW


321
software/BAS/GRAPHR.BAS Normal file
View File

@@ -0,0 +1,321 @@
REM THIS IS A DEMONSTRATION PROGRAM FOR DRAWING
REM PIE AND BAR CHARTS.
REM
REM PROGRAM NAME: GRAPHR.BAS
REM
%INCLUDE GRAPHCOM.BAS
GRAPHIC OPEN 1
CLEAR
REM If the device supports color fill, MAT FILL
REM statements are used. Otherwise, MAT PLOT
REM is used to draw figures.
IN.FL: INPUT "DOES THIS DEVICE SUPPORT COLOR FILL? Y/N: ";FILL.FLG$
IF FILL.FLG$ = "Y" OR FILL.FLG$ = "N" THEN GOTO OK.FL
PRINT "ENTER Y OR N, PLEASE"
GOTO IN.FL
OK.FL: PRINT "THANK-YOU"
REM Initialize the arrays used for drawing the
REM slices in the pie chart. Two 100 element arrays
REM are constructed for drawing a full circle. Each
REM point in the arrays then represents one percent.
PRINT "CALCULATING OCCURRING --- PLEASE WAIT"
DIM X.ARRAY(100)
DIM Y.ARRAY(100)
DIM A.ARRAY(72)
DIM B.ARRAY(72)
A.ARRAY(0) = .5
B.ARRAY(0) = .5
L.CIR = 0
FOR I.ANGLE = 0 TO 6.28-.0628 STEP .0628
X.ARRAY(L.CIR) = .5 + (.5 * COS(I.ANGLE))
Y.ARRAY(L.CIR) = .5 + (.5 * SIN(I.ANGLE))
L.CIR = L.CIR + 1
NEXT I.ANGLE
REM Close the circle
X.ARRAY(L.CIR) = X.ARRAY(0)
Y.ARRAY(L.CIR) = Y.ARRAY(0)
GOTO START.IT
REM This function draws a slice beginning at the
REM point represented by BEG.PER and extending
REM through PER.CENT points. The color is set to
REM COL.OR and the ASCII.ID prints as an identifier
REM for the slice.
REM The function extracts the points from X.ARRAY
REM and Y.ARRAY and places them in A.ARRAY and
REM B.ARRAY. MAT FILL and MAT PLOT always begin
REM drawing at the first elements of the arrays, so
REM the slice must be extracted from the arrays.
REM The function makes provision for slices that
REM exceed 71 points. MAT FILL and MAT PLOT allow
REM a maximum element number of 72.
DEF DRAW.SLICE (BEG.PER,PER.CENT,COL.OR,ASCII.ID)
REAL BEG.PER,PER.CENT,COL.OR
STRING ASCII.ID
L.CIR = 1
SET COLOR COL.OR
OVR.FLOW = 0
REM Setup for slices greater than 71 percent.
IF PER.CENT > 71 THEN SAVE.PER = 71:OVR.FLOW = 1\
ELSE SAVE.PER = PER.CENT
REM Extract points from circle array.
BAK.UP: FOR CNT.ER = BEG.PER TO BEG.PER + SAVE.PER
IN.DEX = CNT.ER
IF CNT.ER > 100 THEN IN.DEX = CNT.ER - 100
A.ARRAY(L.CIR) = X.ARRAY(IN.DEX)
B.ARRAY(L.CIR) = Y.ARRAY(IN.DEX)
L.CIR = L.CIR + 1
NEXT CNT.ER
REM OVER.FLOW is 1 for a more than 71 percent slice.
IF OVR.FLOW <> 1 THEN GOTO OVER.A
REM FILL.FLG$ is "N" for non-color-fill devices.
IF FILL.FLG$ = "N" THEN MAT PLOT L.CIR-1: A.ARRAY,B.ARRAY\
ELSE MAT FILL L.CIR-1: A.ARRAY,B.ARRAY
OVR.FLOW = 0
BEG.PER = BEG.PER + 71
SAVE.PER = PER.CENT - 71
IF FILL.FLG$ = "N" THEN L.CIR = 0 ELSE L.CIR = 1
GOTO BAK.UP
OVER.A: A.ARRAY(0) = .5
B.ARRAY(0) = .5
REM The slice must be closed for MAT PLOT. MAT FILL
REM closes automatically.
IF FILL.FLG$ = "N" THEN\
A.ARRAY(L.CIR) = .5: \
B.ARRAY(L.CIR) = .5: \
MAT PLOT L.CIR: A.ARRAY,B.ARRAY \
ELSE \
MAT FILL L.CIR-1: A.ARRAY,B.ARRAY
REM Expand the viewport for printing the slice ID.
REM The minimum character height is used to adjust
REM the window so the slice ID will appear outside
REM the slice perimeter.
SET VIEWPORT 1.0-Y.AXIS,1,0,1
ADJ.IT = MIN.HGT/1.45
SET WINDOW -ADJ.IT,1+ADJ.IT,-ADJ.IT,1+ADJ.IT
REM MID.PT is the center elements in the slice. This
REM is the position where the ID is printed.
MID.PT = INT(BEG.PER+(PER.CENT/2))
X.AXIS = X.ARRAY(MID.PT)
Y.AXIS = Y.ARRAY(MID.PT)
GRAPHIC PRINT AT (X.AXIS,Y.AXIS): ASCII.ID
SET WINDOW 0,1,0,1
RETURN
FEND
REM The first portion of the program allows entry
REM of up to 9 slices. Enter the item number (1-9)
REM and press the return key. Then type the slice
REM description (up to 6 characters), the dollar
REM value of the slice, and the color code for
REM the slice.
REM The following entries are a good sample:
REM 1 <return>
REM RENT,550,1 <return>
REM 2 <return>
REM FOOD,450,2 <return>
REM 3 <return>
REM CAR,225,3 <return>
REM 4 <return>
REM OTHER,750,4 <return>
REM This sets up a graph of four items--rent of
REM $550 in color 1, food for $450 in color 2, etc.
REM Terminate the input by typing 0 in response
REM to the ITEM NUMBER(0 TO FINISH): prompt.
REM After the 0 entry, the program calculates the
REM percentages and prints a listing of the entries.
REM Corrections may be made by entering the
REM item number to be corrected and inputting
REM the correct data.
START.IT: PRINT
DIM ITM.DESC$(9)
DIM ITM.VALUE(9)
DIM ITM.COLOR(9)
DIM ITM.PERC(9)
GO.A: PRINT "ENTER AN ITEM NUMBER FROM 1 TO 9 TO ADD OR CHANGE"
PRINT
PRINT "THEN ENTER--DESCRIPTION,AMOUNT,COLOR,RETURN"
PRINT
PRINT " DESCRIPTION IS THE SLICE DESCRIPTION"
PRINT " AMOUNT IS THE QUANTITY/AMOUNT OF THE SLICE"
PRINT " COLOR IS THE COLOR NUMBER TO USE FOR THE SLICE"
PRINT " RETURN MEANS TO PRESS THE RETURN KEY"
PRINT
PRINT "THE FIELDS ARE SEPARATED BY COMMAS"
PRINT
IN.IT: INPUT "ITEM NUMBER(0 TO FINISH): "; ITM.NUMBER%
IF ITM.NUMBER% = 0 THEN GOTO PRT.EM
IF ITM.NUMBER% > 0 AND ITM.NUMBER% < 10 THEN GOTO OKAY.IN
PRINT "THE ITEM NUMBER MUST BE FROM 1 TO 9"
GOTO IN.IT
OKAY.IN: IF ITM.VALUE(ITM.NUMBER%) = 0 THEN GOTO NEW.IN
PRINT ITM.DESC$(ITM.NUMBER%),ITM.VALUE(ITM.NUMBER%),
PRINT ITM.COLOR(ITM.NUMBER%)
NEW.IN: INPUT "DESC,AMOUNT,COLOR: ";DESC.IN$,VAL.IN,CLR.IN%
ITM.DESC$(ITM.NUMBER%) = DESC.IN$
ITM.VALUE(ITM.NUMBER%) = VAL.IN
ITM.COLOR(ITM.NUMBER%) = CLR.IN%
PRINT
GOTO IN.IT
PRT.EM: TOT.VAL = 0
REM Calculate the total for percentages.
FOR CNT.R = 1 TO 9
TOT.VAL = TOT.VAL + ITM.VALUE(CNT.R)
NEXT CNT.R
PRINT
REM Print the item list with percentages.
FOR CNT.R = 1 TO 9
IF ITM.VALUE(CNT.R) <> 0 THEN\
ITM.PERC(CNT.R) = ITM.VALUE(CNT.R)/TOT.VAL:\
ITM.PERC(CNT.R) = INT((100*ITM.PERC(CNT.R))+.5):\
PRINT CNT.R;"-";ITM.DESC$(CNT.R),ITM.VALUE(CNT.R),:\
PRINT ITM.COLOR(CNT.R);" ";ITM.PERC(CNT.R);"%"
NEXT CNT.R
PRINT:PRINT "TOTAL VALUE: ";TOT.VAL
PRINT:INPUT "DRAW THE GRAPH? ";Y.N$
IF Y.N$ <> "Y" THEN GOTO IN.IT
CLEAR
BEG.PER = 0
REM THE MINIMUM CHARACTER HEIGHT FOR THE DEVICE
REM IS USED TO ESTABLISH A BORDER AROUND THE CIRCLE
REM WHERE THE SLICE ID (THE ITEM NUMBER) CAN BE
REM PRINTED.
SET CHARACTER HEIGHT 0
ASK CHARACTER HEIGHT MIN.HGT
MIN.HGT = 2 * MIN.HGT
FOR CNT.R = 1 TO 9
IF ITM.VALUE(CNT.R) = 0 THEN GOTO NXT.CNT
REM Determine the aspect ratio and square the device.
REM A border is left around the viewport for the
REM slice ID. The viewport is set to the right
REM of the device.
ASK DEVICE X.AXIS,Y.AXIS
SET VIEWPORT 1-Y.AXIS+MIN.HGT,1-MIN.HGT,MIN.HGT,1-MIN.HGT
DESC.IN$ = ITM.DESC$(CNT.R)
VAL.IN = ITM.VALUE(CNT.R)
CLR.IN% = ITM.COLOR(CNT.R)
PER.CENT = ITM.PERC(CNT.R)
CALL DRAW.SLICE (BEG.PER,PER.CENT,CLR.IN%,STR$(CNT.R))
BEG.PER = BEG.PER + PER.CENT
SET VIEWPORT 0,1,0,1
S.1$ = DESC.IN$+" "+STR$(PER.CENT)+"%"
GRAPHIC PRINT AT (0,1-(CNT.R/10)):S.1$
NXT.CNT: NEXT CNT.R
REM Is the graph filled? The percentage calculation
REM can be less than 100 percent due to roundoff.
IF BEG.PER >= 100 THEN GOTO BAR.A
PER.CENT = 100 - BEG.PER
DESC.IN$ = " "
ASK DEVICE X.AXIS,Y.AXIS
SET VIEWPORT 1-Y.AXIS+MIN.HGT,1-MIN.HGT,MIN.HGT,1-MIN.HGT
CALL DRAW.SLICE (BEG.PER,PER.CENT,CLR.IN%,DESC.IN$)
REM This routine draws a simple bar chart of the
REM data. The window range is set to 1/3 greater
REM than the largest item in the array. This
REM technique makes the largest bar draw across
REM 75% of the viewport.
BAR.A: KEY%=CONCHAR%
DIM BAR.X(4)
DIM BAR.Y(4)
SET VIEWPORT 0,1,0,1
SET WINDOW 0,1,0,1
SET CHARACTER HEIGHT 0
ASK CHARACTER HEIGHT MIN.HGT
CLEAR
SET JUSTIFY .5,0
SET COLOR 1
GRAPHIC PRINT AT (.5,.99-MIN.HGT):"BAR CHART"
SET JUSTIFY 0,0
MAX.VAL = 0
REM Determine the maximum percentage.
FOR CNT.R = 1 TO 9
IF MAX.VAL < ITM.PERC(CNT.R) THEN\
MAX.VAL = ITM.PERC(CNT.R)
NEXT CNT.R
MAX.VAL = 1.33 * MAX.VAL
REM Scale the window. The X axis is 1/3 larger
REM than the largest item to be graphed.
REM The Y axis is scaled to 10 lines.
SET WINDOW 0,MAX.VAL,0,10
SET CHARACTER HEIGHT 0
ASK CHARACTER HEIGHT MIN.HGT
REM Draw the items.
FOR CNT.R = 1 TO 9
IF ITM.VALUE(CNT.R) = 0 THEN GOTO NXT.A
SET COLOR ITM.COLOR(CNT.R)
P.LINE = 10 - CNT.R
S.1$ = ITM.DESC$(CNT.R)+"-"+STR$(ITM.PERC(CNT.R))+"%"
IF ITM.VALUE(CNT.R) <> ITM.PERC(CNT.R) THEN\
S.1$ = S.1$+" $"+STR$(ITM.VALUE(CNT.R))
GRAPHIC PRINT AT (0,P.LINE): S.1$
REM Setup the BAR.X and BAR.Y arrays to draw the
REM bar. MAX.VAL is the percentage for the item.
REM The window scaling automatically scales the
REM bar. No special calculations are required.
MAX.VAL = ITM.PERC(CNT.R)
TOP = P.LINE - .1
BOT = TOP - .4
BAR.Y(0) = BOT
BAR.Y(1) = TOP
BAR.X(2) = MAX.VAL
BAR.Y(2) = TOP
BAR.X(3) = MAX.VAL
BAR.Y(3) = BOT
BAR.Y(4) = BOT
IF FILL.FLG$ = "N" THEN MAT PLOT 4: BAR.X,BAR.Y\
ELSE MAT FILL 3: BAR.X,BAR.Y
NXT.A: NEXT CNT.R
KEY% = CONCHAR%
STOP
END


16
software/BAS/GSXPREP.BAS Normal file
View File

@@ -0,0 +1,16 @@
100 REM GSXPREP.BAS
110 REM
120 REM
130 REM
140 GSX%=&H30
150 POKE GSX%+0,
160 POKE GSX%+1,&H59
170 POKE GSX%+2,&HE
180 POKE GSX%+3,115
190 POKE GSX%+4,&HC3
200 POKE GSX%+5,&H5
210 POKE GSX%+6,&H0
220 NEW
SX%+1,&H59
170 POKE GSX%+2,&HE
180

46
software/BAS/TSTCIR.BAS Normal file
View File

@@ -0,0 +1,46 @@
REM DEMONSTRATION PROGRAM FOR CIRCLE DRAWING FUNCTIONS
REM
REM PROGRAM NAME: TSTCIR.BAS
REM
%INCLUDE GRAPHCOM.BAS
%INCLUDE CIRCOM.BAS
GRAPHIC OPEN 1
CLEAR
PRINT "COMPUTING"
CALL BEG.CIR
PRINT "ENDED"
CALL PLOT.CIR
KEY% = CONCHAR% REM WAIT FOR KEYBOARD
REM SCALE THE WINDOW TO DRAW A PROPERLY PROPORTIONED CIRCLE
ASK DEVICE X.AXIS,Y.AXIS
PRINT X.AXIS,Y.AXIS
SET WINDOW 0,X.AXIS/Y.AXIS,0,1
CALL PLOT.CIR
KEY%=CONCHAR%
CALL FILL.CIR
KEY%=CONCHAR%
REM CHANGE THE VIEWPORT TO REPOSITION THE CIRCLE
SET VIEWPORT 0,.5,0,.5 REM LOWER LEFT QUARTER
CLEAR
CALL PLOT.CIR
KEY%=CONCHAR%
SET VIEWPORT .5,1,0,.5 REM LOWER RIGHT QUARTER
CALL PLOT.CIR
KEY%=CONCHAR%
SET VIEWPORT 0,.5,.5,1 REM UPPER LEFT QUARTER
CALL PLOT.CIR
KEY%=CONCHAR%
SET VIEWPORT .5,1,.5,1 REM UPPER RIGHT QUARTER
CALL PLOT.CIR
KEY%=CONCHAR%
STOP
END


23
software/BAS/asciart.bas Normal file
View File

@@ -0,0 +1,23 @@
1 REM asciiart.bas benchmark for Rienk's sbc-2g-512 7.3728Mhz Z80 board running NASCOM ROM BASIC Ver 4.7
2 REM https://www.retrobrewcomputers.org/forum/index.php?t=msg&th=201&goto=4704&#msg_4704
3 REM 2m43s
4 REM
10 FOR Y=-12 TO 12
20 FOR X=-39 TO 39
30 CA=X*0.0458
40 CB= Y*0.08333
50 A=CA
60 B=CB
70 FOR I=0 TO 15
80 T=A*A-B*B+CA
90 B=2*A*B+CB
100 A=T
110 IF (A*A+B*B)>4 THEN GOTO 200
120 NEXT I
130 PRINT " ";
140 GOTO 210
200 IF I>9 THEN I=I+7
205 PRINT CHR$(48+I);
210 NEXT X
220 PRINT
230 NEXT Y

BIN
software/BAS/cosubs.bas Normal file

Binary file not shown.

BIN
software/BAS/daycash.bas Normal file

Binary file not shown.

BIN
software/BAS/daycash2.bas Normal file

Binary file not shown.

BIN
software/BAS/daycash3.bas Normal file

Binary file not shown.

BIN
software/BAS/daycashp.bas Normal file

Binary file not shown.

BIN
software/BAS/daycred.bas Normal file

Binary file not shown.

BIN
software/BAS/daycredp.bas Normal file

Binary file not shown.

BIN
software/BAS/daycrin.bas Normal file

Binary file not shown.

BIN
software/BAS/daycrin2.bas Normal file

Binary file not shown.

BIN
software/BAS/daycrin3.bas Normal file

Binary file not shown.

BIN
software/BAS/dayi.bas Normal file

Binary file not shown.

BIN
software/BAS/dayicni1.bas Normal file

Binary file not shown.

BIN
software/BAS/dayicni2.bas Normal file

Binary file not shown.

BIN
software/BAS/dayicni3.bas Normal file

Binary file not shown.

BIN
software/BAS/daymend.bas Normal file

Binary file not shown.

BIN
software/BAS/daymisc.bas Normal file

Binary file not shown.

BIN
software/BAS/daymisc2.bas Normal file

Binary file not shown.

BIN
software/BAS/daymisc3.bas Normal file

Binary file not shown.

BIN
software/BAS/daymisc4.bas Normal file

Binary file not shown.

BIN
software/BAS/daymiscp.bas Normal file

Binary file not shown.

BIN
software/BAS/daynlup.bas Normal file

Binary file not shown.

BIN
software/BAS/daynlup2.bas Normal file

Binary file not shown.

BIN
software/BAS/dayparam.bas Normal file

Binary file not shown.

BIN
software/BAS/dayplvat.bas Normal file

Binary file not shown.

BIN
software/BAS/dayprt.bas Normal file

Binary file not shown.

BIN
software/BAS/dayslvat.bas Normal file

Binary file not shown.

61
software/BAS/gpeled.bas Normal file
View File

@@ -0,0 +1,61 @@
01 REM ************************************************
02 REM
03 REM Z80-MBC2 GPE led blink demo:
04 REM
05 REM Blink a led attached to PIN 8 (GPA5) of the GPIO
06 REM connector (J7) until USER key is pressed
07 REM (see A040618 schematic).
08 REM The GPE option must be installed.
09 REM
10 REM ************************************************
11 REM
12 REM Demo HW wiring (see A040618 schematic):
13 REM
14 REM GPIO
15 REM (J7)
16 REM +-----+
17 REM | 1 2 |
18 REM | 3 4 | LED RESISTOR
19 REM | 5 6 | 680
20 REM | 7 8-+--->|-----------/\/\/--+
21 REM | 9 10| |
22 REM |11 12| |
23 REM |13 14| |
24 REM |15 16| |
25 REM |17 18| |
26 REM |19 20+-----------------------+ GND
27 REM +-----+
28 REM
29 REM ************************************************
30 REM
31 PRINT "Press USER key to exit"
32 REM
33 REM * * * * SET USED OPCODES FOR I/O
34 REM
35 KEYUSER = 128 : REM USER KEY read Opcode (0x80)
36 IODIRA = 5 : REM IODIRA write Opcode (0x05)
37 GPIOA = 3 : REM GPIOA write Opcode (0x03)
38 REM
50 OUT 1,IODIRA : OUT 0,0 : REM Set all GPAx as output (IODIRA=0x00)
60 PRINT "Now blinking GPA5 (GPIO port pin 8)..."
64 REM
65 REM * * * * * BLINK LOOP
66 REM
70 OUT 1,GPIOA : OUT 0,32 : REM Set GPA5=1, GPAx=0 (GPIOA=B00100000=32)
80 GOSUB 505 : REM Delay sub
90 OUT 1,GPIOA : OUT 0,0 : REM Clear all pins GPAx (MCP23017)
100 GOSUB 505 : REM Delay sub
130 GOTO 70
490 REM
500 REM * * * * * DELAY SUB
501 REM
505 FOR J=0 TO 150
506 OUT 1,KEYUSER : REM Write the USER KEY read Opcode
507 IF INP(0)=1 THEN GOTO 700 : REM Exit if USER key is pressed
510 NEXT J
520 RETURN
690 REM
691 REM * * * * * PROGRAM END
692 REM
700 OUT 1,GPIOA : OUT 0,0 : REM Clear all pins GPAx (MCP23017)
720 PRINT "Terminated by USER Key"

82
software/BAS/gpio.bas Normal file
View File

@@ -0,0 +1,82 @@
1 REM * * * GPIO EXPANSION MODULE (A080117) DEMO * * *
2 REM
3 REM (USER Key -> slow led, GPIO-A(9) Key -> fast led)
4 REM --------------------------------------------------
5 REM Demo HW wiring (see A080117 schematic):
6 REM
7 REM GPIO-B
8 REM (J3)
9 REM +----+ LED
10 REM | 2 |--->|---+
11 REM | 3 |--->|---+ RESISTOR
12 REM | 4 |--->|---+ 680
13 REM | 5 |--->|---+-------/\/\/-----o GND
14 REM | 6 |--->|---+
15 REM | 7 |--->|---+
16 REM | 8 |--->|---+
17 REM | 9 |--->|---+
18 REM +----+ |
19 REM |
20 REM |
21 REM GPIO-A |
22 REM (J4) |
23 REM +----+ LED |
24 REM | 2 |--->|---+
25 REM | 3 |--->|---+
26 REM | 4 |x
27 REM | 5 |x
28 REM | 6 |x
29 REM | 7 |x PUSH BUTTON RESISTOR
30 REM | 8 |x --- 1K
31 REM | 9 |---------o o------------------/\/\/-----o GND
32 REM +----+
33 REM
34 REM
35 REM
36 REM --------------------------------------------------
37 REM
38 REM Set MCP23017 GPIOB all pins as output (IODIRB=0x00)
39 OUT 6, 0
40 REM Set MCP23017 GPIOA 0-1 as output, others as input (IODIRA=0xFC)
41 OUT 5, 252
42 REM Set MCP23017 GPIOA 2-7 pull-up resistor on (GPPUA=0xFC)
43 OUT 7, 252
45 REM Left Shift user funcion definition
50 DEF FNLSH(X)=((X*2) AND 255)
55 REM Init GPIO output ports
60 OUT 3, 0 : REM Clear MCP23017 GPIOA port
62 OUT 4, 0 : REM Clear MCP23017 GPIOB port
64 GOSUB 700 : REM Set slow shift
68 REM Main
70 A=1
80 FOR I=0 TO 7
90 OUT 4, A : REM Write to MCP23017 GPIOB port
100 GOSUB 500
110 A=FNLSH(A)
120 NEXT I
130 OUT 4, 0 : REM Clear MCP23017 GPIOB port
135 A=1
140 FOR I=0 TO 1
150 OUT 3, A : REM Write to MCP23017 GPIOA port
160 GOSUB 500
170 A=FNLSH(A)
190 NEXT I
200 OUT 3, 0 : REM Clear MCP23017 GPIOA port
210 GOTO 70 : REM Play it again, Sam...
220 REM
500 REM * * * * * DELAY SUB
505 FOR J=0 TO K
507 IF INP(0)=1 THEN GOSUB 700 : REM Read USER key
508 IF (INP(3) AND 128)=0 THEN GOSUB 600 : REM Read MCP23017 GPIOA 7 key
510 NEXT J
520 RETURN
530 REM
600 REM * * * * * SET FAST SHIFT SUB
610 K=1
620 OUT 0, 1 : REM USER led ON
630 RETURN
640 REM
700 REM * * * * * SET SLOW SHIFT SUB
710 K=30
720 OUT 0, 0 : REM USER led OFF
730 RETURN

BIN
software/BAS/menu.bas Normal file

Binary file not shown.

BIN
software/BAS/nlbudge.bas Normal file

Binary file not shown.

BIN
software/BAS/nlenq.bas Normal file

Binary file not shown.

BIN
software/BAS/nlformat.bas Normal file

Binary file not shown.

BIN
software/BAS/nlformup.bas Normal file

Binary file not shown.

BIN
software/BAS/nljnl.bas Normal file

Binary file not shown.

BIN
software/BAS/nljnl2.bas Normal file

Binary file not shown.

BIN
software/BAS/nlmfup.bas Normal file

Binary file not shown.

BIN
software/BAS/nlprint.bas Normal file

Binary file not shown.

BIN
software/BAS/nltb.bas Normal file

Binary file not shown.

BIN
software/BAS/nltl.bas Normal file

Binary file not shown.

17
software/BAS/rantest.bas Normal file
View File

@@ -0,0 +1,17 @@
00100 defint i-n
00200 recsiz%=32
00300 open "R",1,"B:RANTEST.ASC",recsiz%
00400 for i=1 to 20
00500 print #1, using "$$#,###.## ";1000*i,102.34*i*i
00600 put 1,i
00700 next i
00800 for i=1 to 20
00900 get 1,i
01000 line input #1, prices$
01100 print i,prices$
01200 next i
01300 close 1
01400 end
r i=1 to 20
00900 get 1,i
01000 line input #1, prices

19
software/BAS/rtc.bas Normal file
View File

@@ -0,0 +1,19 @@
15 OUT 1,132 : REM Write the DATETIME read Opcode
20 SEC = INP(0) : REM Read a RTC parameter
30 MINUTES = INP(0) : REM Read a RTC parameter
40 HOURS = INP(0) : REM Read a RTC parameter
50 DAY = INP(0) : REM Read a RTC parameter
60 MNTH = INP(0) : REM Read a RTC parameter
70 YEAR = INP(0) : REM Read a RTC parameter
80 TEMP = INP(0) : REM Read a RTC parameter
83 IF TEMP < 128 THEN 90 : REM Two complement correction
85 TEMP = TEMP - 256
90 PRINT
100 PRINT "THE TIME IS: ";
110 PRINT HOURS; : PRINT ":"; : PRINT MINUTES; : PRINT ":"; : PRINT SEC
120 PRINT "THE DATE IS: ";
125 YEAR= YEAR+ 2000
130 PRINT DAY; : PRINT "/"; : PRINT MNTH; : PRINT "/"; : PRINT YEAR
135 PRINT "THE TEMPERATURE IS: ";
140 PRINT TEMP; : PRINT "C"
145 PRINT

2
software/BAS/sample.bas Normal file
View File

@@ -0,0 +1,2 @@
00010 PRINT "This is an example of BASIC-80"


446
software/BAS/startrek.bas Normal file
View File

@@ -0,0 +1,446 @@
10 REM SUPER STARTREK - MAY 16,1978 - REQUIRES 24K MEMORY (AT LEAST)
30 REM
40 REM **** **** STAR TREK **** ****
50 REM **** SIMULATION OF A MISSION OF THE STARSHIP ENTERPRISE,
60 REM **** AS SEEN ON THE STAR TREK TV SHOW.
70 REM **** ORIGINAL PROGRAM BY MIKE MAYFIELD, MODIFIED VERSION
80 REM **** PUBLISHED IN DEC'S "101 BASIC GAMES", BY DAVE AHL.
90 REM **** MODIFICATIONS TO THE LATTER (PLUS DEBUGGING) BY BOB
100 REM *** LEEDOM - APRIL & DECEMBER 1974,
110 REM *** WITH A LITTLE HELP FROM HIS FRIENDS . . .
120 REM *** COMMENTS, EPHITETS, AND SUGGESTIONS SOLICITED --
130 REM *** SEND TO: R.C. LEEDOM
140 REM *** WESTINGHOSE DEFENSE & ELECTRONICS SYSTEMS CNIR
150 REM *** BOX 746, M.S. 338
160 REM *** BALTIMORE, MD 21203
170 REM ***
180 REM *** CONVERTED TO MICROSOFT 8 K BASIC 3/16/78 BY JOHN BORDERS
190 REM *** LINE NUMBERS FROM VERSION TREK7 OF 1/12/75 PRESERVED AS
200 REM *** MUCH AS POSSIBLE WHILE USING MULTIPLE STATEMENTS PER LINE
201 REM *** - MODIFIED TO RUN ON GRANT SEARLE'S 9-CHIP Z80 COMPUTER
202 REM *** AND DERIVATIVES 04-AUG-2018 BY N.KENDRICK
203 REM *** (LINKER3000-AT-GMAIL.COM)
205 WIDTH 80
209 REM NK: POSITIONING USING ANSI ESCAPE SEQUENCES...
210 PRINT CHR$(27);"[2J";:PRINT CHR$(27);"[3;1H";
211 PRINT "THE USS ENTERPRISE --- NCC-1701"
212 PRINT CHR$(27);"[4;1H";:PRINT
222 FOR YY=1 TO 40 STEP 2:FOR XX=1 TO 200 : NEXT XX
223 PRINT TAB(YY);" ,------*------,"
224 PRINT TAB(YY);" ,------------- '--- ------'"
225 PRINT TAB(YY);" '-------- --' / /"
226 PRINT TAB(YY);" ,---' '-------/ /--,"
227 PRINT TAB(YY);" '----------------'"
228 PRINT CHR$(27);"[4;1H";:PRINT:NEXT YY
229 PRINT CHR$(27);"[11;1H";
260 CLEAR 600
270 Z$=" "
330 DIM G(8,8),C(9,2),K(3,3),N(3),Z(8,8),D(8)
370 T=INT(RND(1)*20+20)*100:T0=T:T9=25+INT(RND(1)*10):D0=0:E=3000:E0=E
440 P=10:P0=P:S9=200:S=0:B9=0:K9=0:X$="":X0$=" IS "
470 DEF FND(D)=SQR((K(I,1)-S1)^2+(K(I,2)-S2)^2)
475 DEF FNR(R)=INT(RND(R)*7.98+1.01)
490 Q1=FNR(1):Q2=FNR(1):S1=FNR(1):S2=FNR(1)
530 FOR I=1 TO 9:C(I,1)=0:C(I,2)=0:NEXT I
540 C(3,1)=-1:C(2,1)=-1:C(4,1)=-1:C(4,2)=-1:C(5,2)=-1:C(6,2)=-1
600 C(1,2)=1:C(2,2)=1:C(6,1)=1:C(7,1)=1:C(8,1)=1:C(8,2)=1:C(9,2)=1
670 FOR I=1 TO 8:D(I)=0:NEXT I
710 A1$="NAVSRSLRSPHATORSHEDAMCOMXXX"
820 FOR I=1 TO 8:FOR J=1 TO 8:K3=0:Z(I,J)=0:R1=RND(1)
850 IF R1>.98 THEN K3=3:K9=K9+3:GOTO 980
860 IF R1>.95 THEN K3=2:K9=K9+2:GOTO 980
870 IF R1>.8 THEN K3=1:K9=K9+1
980 B3=0:IF RND(1)>.96 THEN B3=1:B9=B9+1
1040 G(I,J)=K3*100+B3*10+FNR(1):NEXT J:NEXT I:IF K9>T9 THEN T9=K9+1
1100 IF B9<>0 THEN 1200
1150 IF G(Q1,Q2)<200 THEN G(Q1,Q2)=G(Q1,Q2)+100:K9=K9+1
1160 B9=1:G(Q1,Q2)=G(Q1,Q2)+10:Q1=FNR(1):Q2=FNR(1)
1200 K7=K9:IF B9<>1 THEN X$="S":X0$=" ARE "
1230 PRINT"YOUR ORDERS ARE AS FOLLOWS:"
1235 PRINT "--------------------------"
1240 PRINT" DESTROY THE";K9;"KLINGON WARSHIPS WHICH HAVE INVADED"
1250 PRINT" THE GALAXY BEFORE THEY CAN ATTACK FEDERATION HEADQUARTERS"
1260 PRINT" ON STARDATE";T0+T9;CHR$(8);". THIS GIVES YOU";T9;
1261 PRINT"DAYS. THERE";X0$
1270 PRINT" ";B9;
1271 PRINT"STARBASE";X$;" IN THE GALAXY FOR RESUPPLYING YOUR SHIP."
1280 PRINT: PRINT "PRESS Y TO ACCEPT COMMAND";
1300 INPUT I5$:
1302 IF LEFT$(I5$,1)="Y" OR LEFT$(I5$,1)="y" THEN 1310
1303 GOTO 1280
1310 PRINT CHR$(26)
1320 Z4=Q1:Z5=Q2:K3=0:B3=0:S3=0:G5=0:D4=.5*RND(1):Z(Q1,Q2)=G(Q1,Q2)
1390 IF Q1<1 OR Q1>8 OR Q2<1 OR Q2>8 THEN 1600
1430 GOSUB 9030:PRINT:IF T0<>T THEN 1490
1460 PRINT"YOUR MISSION BEGINS WITH YOUR STARSHIP LOCATED"
1470 PRINT"IN THE GALACTIC QUADRANT, '";G2$;"'.":GOTO 1500
1490 PRINT"NOW ENTERING ";G2$;" QUADRANT . . ."
1500 PRINT:K3=INT(G(Q1,Q2)*.01):B3=INT(G(Q1,Q2)*.1)-10*K3
1540 S3=G(Q1,Q2)-100*K3-10*B3:IF K3=0 THEN 1590
1560 PRINT TAB(3);CHR$(22);" COMBAT AREA CONDITION RED ";CHR$(22)
1561 IF S>200 THEN PRINT:GOTO 1590
1580 PRINT TAB(3);CHR$(22);" SHIELDS DANGEROUSLY LOW ";CHR$(22)
1581 PRINT
1590 FOR I=1 TO 3:K(I,1)=0:K(I,2)=0:NEXT I
1600 FOR I=1 TO 3:K(I,3)=0:NEXT I:Q$=Z$+Z$+Z$+Z$+Z$+Z$+Z$+LEFT$(Z$,17)
1680 A$="<E>":Z1=S1:Z2=S2:GOSUB 8670:IF K3<1 THEN 1820
1720 FOR I=1 TO K3:GOSUB 8590:A$="+K+":Z1=R1:Z2=R2
1780 GOSUB 8670:K(I,1)=R1:K(I,2)=R2:K(I,3)=S9*(.5+RND(1)):NEXT I
1820 IF B3<1 THEN 1910
1880 GOSUB 8590:A$=">B<":Z1=R1:B4=R1:Z2=R2:B5=R2:GOSUB 8670
1910 FOR I=1 TO S3:GOSUB 8590:A$=" * ":Z1=R1:Z2=R2:GOSUB 8670:NEXT I
1980 GOSUB 6430
1990 IF S+E>10 THEN IF E>10 OR D(7)=0 THEN 2060
2020 PRINT:PRINT TAB(10);CHR$(22);"** FATAL ERROR **";CHR$(22)
2021 PRINT"YOU'VE JUST STRANDED YOUR SHIP IN SPACE."
2030 PRINT"YOU HAVE INSUFFICIENT MANEUVERING ENERGY,"
2040 PRINT"AND SHIELD CONTROL IS PRESENTLY INCAPABLE OF"
2050 PRINT"CROSS-CIRCUITING TO ENGINE ROOM!!":PRINT:GOTO 6220
2060 PRINT:INPUT"COMMAND";A$:PRINT
2080 FOR I=1 TO 9:IF LEFT$(A$,3)<>MID$(A1$,3*I-2,3)THEN 2160
2140 ON I GOTO 2300,1980,4000,4260,4700,5530,5690,7290,6270
2160 NEXT I:PRINT"ENTER ONE OF THE FOLLOWING:"
2170 PRINT "--------------------------"
2180 PRINT" NAV (TO SET COURSE)"
2190 PRINT" SRS (FOR SHORT RANGE SENSOR SCAN)"
2200 PRINT" LRS (FOR LONG RANGE SENSOR SCAN)"
2210 PRINT" PHA (TO FIRE PHASERS)"
2220 PRINT" TOR (TO FIRE PHOTON TORPEDOES)"
2230 PRINT" SHE (TO RAISE OR LOWER SHIELDS)"
2240 PRINT" DAM (FOR DAMAGE CONTROL REPORTS)"
2250 PRINT" COM (TO CALL ON LIBRARY-COMPUTER)"
2260 PRINT" XXX (TO RESIGN YOUR COMMAND)":PRINT:GOTO 1990
2300 INPUT"COURSE (0-9)";C1:IF C1=9 THEN C1=1
2310 IF C1>=1 AND C1<9 THEN 2350
2330 PRINT" LT. SULU: 'INCORRECT COURSE DATA, SIR!'":GOTO 1990
2350 X$="8":IF D(1)<0 THEN X$="0.2"
2360 PRINT"WARP FACTOR (0-";X$;")";:INPUT W1:PRINT
2361 IF D(1)<0 AND W1>.2 THEN 2470
2380 IF W1>0 AND W1<=8 THEN 2490
2390 IF W1=0 THEN 1990
2420 PRINT" CHIEF ENGINEER SCOTT: 'THE ENGINES WON'T TAKE";
2430 PRINT" WARP";W1;CHR$(8);"!'":GOTO 1990
2470 PRINT"WARP ENGINES ARE DAMAGED. MAXIUM SPEED = WARP 0.2":GOTO 1990
2490 N=INT(W1*8+.5):IF E-N>=0 THEN 2590
2500 PRINT"ENGINEERING: 'INSUFFICIENT ENERGY AVAILABLE"
2510 PRINT" FOR MANEUVERING AT WARP";W1;CHR$(8);"!'"
2530 IF S<N-E OR D(7)<0 THEN 1990
2550 PRINT"DEFLECTOR CONTROL ROOM: ";S;"UNITS OF ENERGY"
2560 PRINT" PRESENTLY DEPLOYED TO SHIELDS."
2570 GOTO 1990
2590 FOR I=1 TO K3:IF K(I,3)=0 THEN 2700
2610 A$=" ":Z1=K(I,1):Z2=K(I,2):GOSUB 8670:GOSUB 8590
2660 K(I,1)=Z1:K(I,2)=Z2:A$="+K+":GOSUB 8670
2700 NEXT I:GOSUB 6000:D1=0:D6=W1:IF W1>=1 THEN D6=1
2770 FOR I=1 TO 8:IF D(I)>=0 THEN 2880
2790 D(I)=D(I)+D6:IF D(I)>-.1 AND D(I)<0 THEN D(I)=-.1:GOTO 2880
2800 IF D(I)<0 THEN 2880
2810 IF D1<>1 THEN D1=1:PRINT"DAMAGE CONTROL REPORT: ";
2840 PRINT TAB(8);:R1=I:GOSUB 8790:PRINT G2$;" REPAIR COMPLETED."
2880 NEXT I:IF RND(1)>.2 THEN 3070
2910 R1=FNR(1):IF RND(1)>=.6 THEN 3000
2930 D(R1)=D(R1)-(RND(1)*5+1):PRINT"DAMAGE CONTROL REPORT: ";
2960 GOSUB 8790:PRINT G2$;" DAMAGED":PRINT:GOTO 3070
3000 D(R1)=D(R1)+RND(1)*3+1:PRINT"DAMAGE CONTROL REPORT: ";
3030 GOSUB 8790:PRINT G2$;" STATE OF REPAIR IMPROVED":PRINT
3070 A$=" ":Z1=INT(S1):Z2=INT(S2):GOSUB 8670
3110 X1=C(C1,1)+(C(C1+1,1)-C(C1,1))*(C1-INT(C1)):X=S1:Y=S2
3140 X2=C(C1,2)+(C(C1+1,2)-C(C1,2))*(C1-INT(C1)):Q4=Q1:Q5=Q2
3170 FOR I=1 TO N:S1=S1+X1:S2=S2+X2
3171 IF S1<1 OR S1>=9 OR S2<1 OR S2>=9 THEN 3500
3240 S8=INT(S1)*24+INT(S2)*3-26:IF MID$(Q$,S8,2)=" "THEN 3360
3320 S1=INT(S1-X1):S2=INT(S2-X2):PRINT"WARP ENGINES SHUT DOWN AT ";
3350 PRINT"SECTOR";S1;CHR$(8);",";S2;"DUE TO BAD NAVIGATION":GOTO 3370
3360 NEXT I:S1=INT(S1):S2=INT(S2)
3370 A$="<E>":Z1=INT(S1):Z2=INT(S2):GOSUB 8670:GOSUB 3910:T8=1
3430 IF W1<1 THEN T8=.1*INT(10*W1)
3450 T=T+T8:IF T>T0+T9 THEN 6220
3480 GOTO 1980
3500 X=8*Q1+X+N*X1:Y=8*Q2+Y+N*X2:Q1=INT(X/8):Q2=INT(Y/8):S1=INT(X-Q1*8)
3550 S2=INT(Y-Q2*8):IF S1=0 THEN Q1=Q1-1:S1=8
3590 IF S2=0 THEN Q2=Q2-1:S2=8
3620 X5=0:IF Q1<1 THEN X5=1:Q1=1:S1=1
3670 IF Q1>8 THEN X5=1:Q1=8:S1=8
3710 IF Q2<1 THEN X5=1:Q2=1:S2=1
3750 IF Q2>8 THEN X5=1:Q2=8:S2=8
3790 IF X5=0 THEN 3860
3800 PRINT"LT. UHURA: MESSAGE FROM STARFLEET COMMAND --"
3810 PRINT" 'PERMISSION TO ATTEMPT CROSSING OF GALACTIC PERIMETER"
3820 PRINT" IS HEREBY *DENIED*. SHUT DOWN YOUR ENGINES.'"
3830 PRINT"CHIEF ENGINEER SCOTT: 'WARP ENGINES SHUT DOWN"
3840 PRINT" AT SECTOR";S1;CHR$(8);",";S2;"OF QUADRANT";
3841 PRINT Q1;CHR$(8);",";Q2;CHR$(8);".'"
3850 IF T>T0+T9 THEN 6220
3860 IF 8*Q1+Q2=8*Q4+Q5 THEN 3370
3870 T=T+1:GOSUB 3910:GOTO 1320
3910 E=E-N-10:IF E>=0 THEN RETURN
3930 PRINT"SHIELD CONTROL SUPPLIES ENERGY TO COMPLETE THE MANEUVER."
3940 S=S+E:E=0:IF S<=0 THEN S=0
3980 RETURN
4000 IF D(3)<0 THEN PRINT"LONG RANGE SENSORS ARE INOPERABLE.":GOTO 1990
4030 PRINT"LONG RANGE SCAN FOR QUADRANT";Q1;CHR$(8);",";Q2:PRINT
4040 O1$="-------------------":PRINT O1$
4060 FOR I=Q1-1 TO Q1+1:N(1)=-1:N(2)=-2:N(3)=-3:FOR J=Q2-1 TO Q2+1
4120 IF I>0 AND I<9 AND J>0 AND J<9 THEN N(J-Q2+2)=G(I,J):Z(I,J)=G(I,J)
4180 NEXT J:FOR L=1 TO 3:PRINT"| ";
4181 IF N(L)<0 THEN PRINT"*** ";:GOTO 4230
4210 PRINT RIGHT$(STR$(N(L)+1000),3);" ";
4230 NEXT L:PRINT"|":PRINT O1$:NEXT I:GOTO 1990
4260 IF D(4)<0 THEN PRINT"PHASERS INOPERATIVE.":GOTO 1990
4265 IF K3>0 THEN 4330
4270 PRINT"SCIENCE OFFICER SPOCK: 'SENSORS SHOW NO ENEMY SHIPS"
4280 PRINT" IN THIS QUADRANT'":GOTO 1990
4330 IF D(8)<0 THEN PRINT"COMPUTER FAILURE HAMPERS ACCURACY."
4350 PRINT"PHASERS LOCKED ON TARGET; ";
4360 PRINT"ENERGY AVAILABLE =";E;"UNITS"
4370 INPUT"NUMBER OF UNITS TO FIRE";X:IF X<=0 THEN 1990
4400 IF E-X<0 THEN 4360
4410 E=E-X:IF D(7)<0 THEN X=X*RND(1)
4450 H1=INT(X/K3):FOR I=1 TO 3:IF K(I,3)<=0 THEN 4670
4480 H=INT((H1/FND(0))*(RND(1)+2)):IF H>.15*K(I,3)THEN 4530
4500 PRINT"SENSORS SHOW NO DAMAGE TO ENEMY AT";K(I,1);CHR$(8);
4501 PRINT",";K(I,2);CHR$(8);".":GOTO 4670
4530 K(I,3)=K(I,3)-H:PRINT H;"UNIT HIT ON KLINGON AT SECTOR";
4531 PRINT K(I,1);CHR$(8);",";
4550 PRINT K(I,2);CHR$(8);".":IF K(I,3)<=0 THEN PRINT:PRINT CHR$(22);
4551 PRINT"*** KLINGON DESTROYED ***";CHR$(22):PRINT:GOTO 4580
4560 PRINT" (SENSORS SHOW";K(I,3);"UNITS REMAINING)":GOTO 4670
4580 K3=K3-1:K9=K9-1:Z1=K(I,1):Z2=K(I,2):A$=" ":GOSUB 8670
4650 K(I,3)=0:G(Q1,Q2)=G(Q1,Q2)-100:Z(Q1,Q2)=G(Q1,Q2):IF K9<=0 THEN 6370
4670 NEXT I:GOSUB 6000:GOTO 1990
4700 IF P<=0 THEN PRINT"ALL PHOTON TORPEDOES EXPENDED.":GOTO 1990
4730 IF D(5)<0 THEN PRINT"PHOTON TUBES ARE NOT OPERATIONAL.":GOTO 1990
4760 INPUT"PHOTON TORPEDO COURSE (1-9)";C1:IF C1=9 THEN C1=1
4780 IF C1>=1 AND C1<9 THEN 4850
4790 PRINT"ENSIGN CHEKOV: 'INCORRECT COURSE DATA, SIR!'"
4800 GOTO 1990
4850 X1=C(C1,1)+(C(C1+1,1)-C(C1,1))*(C1-INT(C1)):E=E-2:P=P-1
4860 X2=C(C1,2)+(C(C1+1,2)-C(C1,2))*(C1-INT(C1)):X=S1:Y=S2
4910 PRINT"TORPEDO TRACK:"
4920 X=X+X1:Y=Y+X2:X3=INT(X+.5):Y3=INT(Y+.5)
4960 IF X3<1 OR X3>8 OR Y3<1 OR Y3>8 THEN 5490
5000 PRINT" ";X3;CHR$(8);",";Y3:A$=" ":Z1=X:Z2=Y
5001 GOSUB 8830
5050 IF Z3<>0 THEN 4920
5060 A$="+K+":Z1=X:Z2=Y:GOSUB 8830:IF Z3=0 THEN 5210
5110 PRINT:PRINT CHR$(22);"*** KLINGON DESTROYED ***";CHR$(22)
5111 PRINT:K3=K3-1:K9=K9-1:IF K9<=0 THEN 6370
5150 FOR I=1 TO 3:IF X3=K(I,1)AND Y3=K(I,2)THEN 5190
5180 NEXT I:I=3
5190 K(I,3)=0:GOTO 5430
5210 A$=" * ":Z1=X:Z2=Y:GOSUB 8830:IF Z3=0 THEN 5280
5260 PRINT"STAR AT";X3;",";Y3;"ABSORBED TORPEDO ENERGY.":GOSUB 6000
5261 GOTO 1990
5280 A$=">!<":Z1=X:Z2=Y:GOSUB 8830:IF Z3=0 THEN 4760
5330 PRINT CHR$(22);"*** STARBASE DESTROYED ***";CHR$(22)
5331 B3=B3-1:B9=B9-1
5360 IF B9>0 OR K9>T-T0-T9 THEN 5400
5370 PRINT"THAT DOES IT, CAPTAIN!! YOU ARE HEREBY RELIEVED OF COMMAND"
5380 PRINT"AND SENTENCED TO 99 STARDATES AT HARD LABOR ON CYGNUS 12!!"
5390 GOTO 6270
5400 PRINT"STARFLEET COMMAND REVIEWING YOUR RECORD TO CONSIDER"
5410 PRINT"COURT MARTIAL!":D0=0
5430 Z1=X:Z2=Y:A$=" ":GOSUB 8670
5470 G(Q1,Q2)=K3*100+B3*10+S3:Z(Q1,Q2)=G(Q1,Q2):GOSUB 6000:GOTO 1990
5490 PRINT"TORPEDO MISSED.":PRINT:GOSUB 6000:GOTO 1990
5530 IF D(7)<0 THEN PRINT"SHIELD CONTROL INOPERABLE.":GOTO 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>":GOTO 1990
5590 IF X<=E+S THEN 5630
5600 PRINT"SHIELD CONTROL: 'THIS IS NOT THE FEDERATION TREASURY.'"
5610 PRINT"<SHIELDS UNCHANGED>":GOTO 1990
5630 E=E+S-X:S=X:PRINT"DEFLECTOR CONTROL ROOM:"
5660 PRINT" 'SHIELDS NOW AT";INT(S);"UNITS PER YOUR COMMAND.'"
5661 GOTO 1990
5690 IF D(6)>=0 THEN 5910
5700 PRINT"DAMAGE CONTROL REPORT NOT AVAILABLE.":IF D0=0 THEN 1990
5720 D3=0:FOR I=1 TO 8:IF D(I)<0 THEN D3=D3+.1
5760 NEXT I:IF D3=0 THEN 1990
5780 PRINT:D3=D3+D4:IF D3>=1 THEN 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 (Y/N)";A$
5860 IF A$<>"Y"THEN 1990
5870 FOR I=1 TO 8:IF D(I)<0 THEN D(I)=0
5890 NEXT I:T=T+D3+.1
5910 PRINT:PRINT"DEVICE STATE OF REPAIR"
5911 PRINT"------ ---------------":FOR R1=1 TO 8
5920 GOSUB 8790:PRINT G2$;LEFT$(Z$,25-LEN(G2$));INT(D(R1)*100)*.01
5950 NEXT R1:PRINT:IF D0<>0 THEN 5720
5980 GOTO 1990
6000 IF K3<=0 THEN RETURN
6010 IF D0<>0 THEN PRINT"STARBASE SHIELDS PROTECT THE ENTERPRISE."
6011 RETURN
6040 FOR I=1 TO 3:IF K(I,3)<=0 THEN 6200
6060 H=INT((K(I,3)/FND(1))*(2+RND(1)))
6061 S=S-H:K(I,3)=K(I,3)/(3+RND(0))
6080 PRINT:PRINT H;"UNIT HIT ON ENTERPRISE FROM SECTOR";
6081 PRINT K(I,1);CHR$(8);",";K(I,2);CHR$(8);"."
6090 IF S<=0 THEN 6240
6100 PRINT" <SHIELDS DOWN TO";S;"UNITS>":IF H<20 THEN 6200
6120 IF RND(1)>.6 OR H/S<=.02 THEN 6200
6140 R1=FNR(1):D(R1)=D(R1)-H/S-.5*RND(1):GOSUB 8790
6170 PRINT"DAMAGE CONTROL: '";G2$;" DAMAGED BY THE HIT'"
6200 NEXT I:RETURN
6220 PRINT:PRINT"IT IS STARDATE";T;CHR$(8);".":PRINT:GOTO 6270
6240 PRINT:PRINT"THE ENTERPRISE HAS BEEN DESTROYED. THE FEDERATION ";
6250 PRINT"WILL BE CONQUERED.":GOTO 6220
6270 PRINT"THERE WERE";K9;"KLINGON BATTLE CRUISERS LEFT AT"
6280 PRINT"THE END OF YOUR MISSION."
6290 PRINT:PRINT:IF B9=0 THEN 6360
6310 PRINT"THE FEDERATION IS IN NEED OF A NEW STARSHIP COMMANDER"
6320 PRINT"FOR A SIMILAR MISSION -- IF THERE IS A VOLUNTEER,"
6330 INPUT"LET HIM STEP FORWARD AND ENTER 'AYE'";A$:IF A$="AYE"THEN 10
6360 PRINT:PRINT "BACK TO SYSTEM.":END
6370 PRINT"CONGRATULATIONS, CAPTAIN! THE LAST KLINGON BATTLE CRUISER"
6380 PRINT"MENACING THE FEDERATION HAS BEEN DESTROYED.":PRINT
6400 PRINT"YOUR EFFICIENCY RATING IS";1000*(K7/(T-T0))^2:GOTO 6290
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 THEN 6540
6451 IF INT(J+.5)<1 OR INT(J+.5)>8 THEN 6540
6490 A$=">B<":Z1=I:Z2=J:GOSUB 8830:IF Z3=1 THEN 6580
6540 NEXT J:NEXT I:D0=0:GOTO 6650
6580 D0=1:C$="DOCKED":E=E0:P=P0
6620 PRINT"SHIELDS DROPPED FOR DOCKING PURPOSES.":S=0:GOTO 6720
6650 IF K3>0 THEN C$="*RED*":GOTO 6720
6660 C$="GREEN":IF E<E0*.1 THEN C$="YELLOW"
6720 IF D(2)>=0 THEN 6770
6730 PRINT:PRINT"*** SHORT RANGE SENSORS ARE OUT ***":PRINT:RETURN
6770 O1$=" +--1---2---3---4---5---6---7---8-+":PRINT O1$
6771 FOR I=1 TO 8:PRINT I;"|";
6820 FOR J=(I-1)*24+1 TO(I-1)*24+22 STEP 3:PRINT" ";MID$(Q$,J,3);
6821 NEXT J:PRINT"|";I;
6830 ON I GOTO 6850,6900,6960,7020,7070,7120,7180,7240
6850 PRINT" STARDATE ";:PRINT INT(T*10)*.1
6851 GOTO 7260
6900 PRINT" CONDITION ";
6901 IF C$="*RED*" THEN PRINT CHR$(22);"*RED*";CHR$(22):GOTO 7260
6902 IF C$="DOCKED" THEN PRINT CHR$(22);"DOCKED";CHR$(22):GOTO 7260
6903 PRINT C$: GOTO 7260
6960 PRINT" QUADRANT ";Q1;CHR$(8);",";Q2;CHR$(8)
6961 GOTO 7260
7020 PRINT" SECTOR ";S1;CHR$(8);",";S2;CHR$(8)
7021 GOTO 7260
7070 PRINT" PHOTON TORPEDOES ";:PRINT INT(P)
7071 GOTO 7260
7120 PRINT" TOTAL ENERGY ";:PRINT INT(E+S)
7121 GOTO 7260
7180 PRINT" SHIELDS ";:PRINT INT(S)
7181 GOTO 7260
7240 PRINT" KLINGONS REMAINING";:PRINT INT(K9)
7260 NEXT I:PRINT O1$:RETURN
7290 IF D(8)<0 THEN PRINT"COMPUTER DISABLED.":GOTO 1990
7320 INPUT"COMPUTER ACTIVE AND AWAITING COMMAND";A:IF A<0 THEN 1990
7350 PRINT:H8=1:ON A+1 GOTO 7540,7900,8070,8500,8150,7400
7360 PRINT"FUNCTIONS AVAILABLE FROM LIBRARY-COMPUTER:"
7365 PRINT "-----------------------------------------":PRINT
7370 PRINT" 0 = CUMULATIVE GALTIC RECORD"
7372 PRINT" 1 = STATUS REPORT"
7374 PRINT" 2 = PHOTON TORPEDO DATA"
7376 PRINT" 3 = STARBASE NAV DATA"
7378 PRINT" 4 = DIRECTION/DISTANCE CALCULATOR"
7380 PRINT" 5 = GALAXY 'REGION NAME' MAP":PRINT:GOTO 7320
7400 H8=0:G5=1:PRINT" THE GALAXY":GOTO 7550
7540 REM
7542 REM
7543 PRINT:PRINT" ";
7544 PRINT"COMPUTER RECORD OF GALAXY FOR QUADRANT";Q1;CHR$(8);",";Q2
7546 PRINT
7550 PRINT" 1 2 3 4 5 6 7 8"
7560 O1$=" +-----+-----+-----+-----+-----+-----+-----+-----+"
7570 PRINT O1$:FOR I=1 TO 8:PRINT I;" ";:IF H8=0 THEN 7740
7630 FOR J=1 TO 8:PRINT"| ";:IF Z(I,J)=0 THEN PRINT"*** ";:GOTO 7720
7700 PRINT RIGHT$(STR$(Z(I,J)+1000),3);" ";
7720 IF J=8 THEN PRINT "|"
7721 NEXT J:GOTO 7850
7740 Z4=I:Z5=1:GOSUB 9030:J0=INT(15-.5*LEN(G2$)):PRINT TAB(J0);G2$;
7800 Z5=5:GOSUB 9030:J0=INT(39-.5*LEN(G2$)):PRINT TAB(J0);G2$
7850 PRINT O1$:NEXT I:PRINT:GOTO 1990
7900 PRINT " STATUS REPORT:":PRINT " -------------":X$=""
7901 IF K9>1 THEN X$="S"
7940 PRINT K9;"KLINGON";X$;" LEFT."
7960 PRINT" MISSION MUST BE COMPLETED IN";.1*INT((T0+T9-T)*10);
7961 PRINT"STARDATES."
7970 X$="S":IF B9<2 THEN X$="":IF B9<1 THEN 8010
7980 PRINT" THE FEDERATION IS MAINTAINING";B9;
7981 PRINT"STARBASE";X$;" IN THE GALAXY."
7990 GOTO 5690
8010 PRINT"YOUR STUPIDITY HAS LEFT YOU ON YOUR OWN IN"
8020 PRINT" THE GALAXY -- YOU HAVE NO STARBASES LEFT!":GOTO 5690
8070 IF K3<=0 THEN 4270
8080 X$="":IF K3>1 THEN X$="S"
8090 PRINT"FROM ENTERPRISE TO KLINGON BATTLE CRUSER";X$
8100 H8=0:FOR I=1 TO 3:IF K(I,3)<=0 THEN 8480
8110 W1=K(I,1):X=K(I,2)
8120 C1=S1:A=S2:GOTO 8220
8150 PRINT"DIRECTION/DISTANCE CALCULATOR:"
8160 PRINT"YOU ARE AT QUADRANT ";Q1;CHR$(8);",";Q2;" SECTOR ";
8161 PRINT S1;CHR$(8);",";S2;CHR$(8);"."
8170 INPUT"PLEASE ENTER INITIAL COORDINATES (X,Y)";C1,A
8200 INPUT"FINAL COORDINATES (X,Y)";W1,X
8220 X=X-A:A=C1-W1:IF X<0 THEN 8350
8250 IF A<0 THEN 8410
8260 IF X>0 THEN 8280
8270 IF A=0 THEN C1=5:GOTO 8290
8280 C1=1
8290 IF ABS(A)<=ABS(X)THEN 8330
8310 PRINT"DIRECTION =";C1+(((ABS(A)-ABS(X))+ABS(A))/ABS(A)):GOTO 8460
8330 PRINT"DIRECTION =";C1+(ABS(A)/ABS(X)):GOTO 8460
8350 IF A>0 THEN C1=3:GOTO 8420
8360 IF X<>0 THEN C1=5:GOTO 8290
8410 C1=7
8420 IF ABS(A)>=ABS(X)THEN 8450
8430 PRINT"DIRECTION =";C1+(((ABS(X)-ABS(A))+ABS(X))/ABS(X)):GOTO 8460
8450 PRINT"DIRECTION =";C1+(ABS(X)/ABS(A))
8460 PRINT"DISTANCE =";SQR(X^2+A^2):IF H8=1 THEN 1990
8480 NEXT I:GOTO 1990
8500 IF B3<>0 THEN PRINT"FROM ENTERPRISE TO STARBASE:"
8501 W1=B4:X=B5:GOTO 8120
8510 PRINT"MR. SPOCK: 'SENSORS SHOW NO STARBASES IN THIS QUADRANT.'"";
8520 GOTO 1990
8590 R1=FNR(1):R2=FNR(1):A$=" ":Z1=R1:Z2=R2:GOSUB 8830
8591 IF Z3=0 THEN 8590
8600 RETURN
8670 S8=INT(Z2-.5)*3+INT(Z1-.5)*24+1
8675 IF LEN(A$)<>3 THEN PRINT"ERROR":STOP
8680 IF S8=1 THEN Q$=A$+RIGHT$(Q$,189):RETURN
8690 IF S8=190 THEN Q$=LEFT$(Q$,189)+A$:RETURN
8700 Q$=LEFT$(Q$,S8-1)+A$+RIGHT$(Q$,190-S8):RETURN
8790 ON R1 GOTO 8792,8794,8796,8798,8800,8802,8804,8806
8792 G2$="WARP ENGINES":RETURN
8794 G2$="SHORT RANGE SENSORS":RETURN
8796 G2$="LONG RANGE SENSORS":RETURN
8798 G2$="PHASER CONTROL":RETURN
8800 G2$="PHOTON TUBES":RETURN
8802 G2$="DAMAGE CONTROL":RETURN
8804 G2$="SHIELD CONTROL":RETURN
8806 G2$="LIBRARY-COMPUTER":RETURN
8830 Z1=INT(Z1+.5):Z2=INT(Z2+.5):S8=(Z2-1)*3+(Z1-1)*24+1:Z3=0
8890 IF MID$(Q$,S8,3)<>A$THEN RETURN
8900 Z3=1:RETURN
9030 IF Z5<=4 THEN ON Z4 GOTO 9040,9050,9060,9070,9080,9090,9100,9110
9035 GOTO 9120
9040 G2$="ANTARES":GOTO 9210
9050 G2$="RIGEL":GOTO 9210
9060 G2$="PROCYON":GOTO 9210
9070 G2$="VEGA":GOTO 9210
9080 G2$="CANOPUS":GOTO 9210
9090 G2$="ALTAIR":GOTO 9210
9100 G2$="SAGITTARIUS":GOTO 9210
9110 G2$="POLLUX":GOTO 9210
9120 ON Z4 GOTO 9130,9140,9150,9160,9170,9180,9190,9200
9130 G2$="SIRIUS":GOTO 9210
9140 G2$="DENEB":GOTO 9210
9150 G2$="CAPELLA":GOTO 9210
9160 G2$="BETELGEUSE":GOTO 9210
9170 G2$="ALDEBARAN":GOTO 9210
9180 G2$="REGULUS":GOTO 9210
9190 G2$="ARCTURUS":GOTO 9210
9200 G2$="SPICA"
9210 IF G5<>1 THEN ON Z5 GOTO 9230,9240,9250,9260,9230,9240,9250,9260
9220 RETURN
9230 G2$=G2$+" I":RETURN
9240 G2$=G2$+" II":RETURN
9250 G2$=G2$+" III":RETURN
9260 G2$=G2$+" IV":RETURN
9999 END

133
software/BAS/trekinst.bas Normal file
View File

@@ -0,0 +1,133 @@
10 REM INSTRUCTIONS FOR "SUPER STARTREK" MAR 5, 1978
20 FOR I=1 TO 12:PRINT:NEXT I
25 PRINT CHR$(26)
30 PRINT TAB(10);"*************************************"
40 PRINT TAB(10);"* *"
50 PRINT TAB(10);"* *"
60 PRINT TAB(10);"* * * SUPER STAR TREK * * *"
70 PRINT TAB(10);"* *"
80 PRINT TAB(10);"* *"
90 PRINT TAB(10);"*************************************"
100 FOR I=1 TO 8:PRINT:NEXT I
110 INPUT "DO YOU NEED INSTRUCTIONS (Y/N)";K$:IF K$="N" THEN 1210
120 PRINT CHR$(26)
130 PRINT "NOTE: YOU MUST BE RUNNING 40K CP/M TO RUN STARTREK."
140 PRINT " THIS MEANS THAT BASIC MUST HAVE ABOUT 18K OF FREE MEMORY."
150 PRINT
160 PRINT" INSTRUCTIONS FOR 'SUPER STAR TREK'"
170 PRINT
180 PRINT"1. WHEN YOU SEE \COMMAND ?\ PRINTED, ENTER ONE OF THE LEGAL"
190 PRINT" COMMANDS (NAV,SRS,LRS,PHA,TOR,SHE,DAM,COM, OR XXX)."
200 PRINT"2. IF YOU SHOULD TYPE IN AN ILLEGAL COMMAND, YOU'LL GET A SHORT"
210 PRINT" LIST OF THE LEGAL COMMANDS PRINTED OUT."
220 PRINT"3. SOME COMMANDS REQUIRE YOU TO ENTER DATA (FOR EXAMPLE, THE"
230 PRINT" 'NAV' COMMAND COMES BACK WITH 'COURSE (1-9) ?'.) IF YOU"
240 PRINT" TYPE IN ILLEGAL DATA (LIKE NEGATIVE NUMBERS), THAT COMMAND"
250 PRINT" WILL BE ABORTED"
260 PRINT
270 PRINT" THE GALAXY IS DIVIDED INTO AN 8 X 8 QUADRANT GRID,"
280 PRINT"AND EACH QUADRANT IS FURTHER DIVIDED INTO AN 8 X 8 SECTOR GRID."
290 PRINT
300 PRINT" YOU WILL BE ASSIGNED A STARTING POINT SOMEWHERE IN THE"
310 PRINT"GALAXY TO BEGIN A TOUR OF DUTY AS COMMANDER OF THE STARSHIP"
320 PRINT"\ENTERPRISE\; YOUR MISSION: TO SEEK AND DESTROY THE FLEET OF"
330 PRINT"KLINGON WARWHIPS WHICH ARE MENACING THE UNITED FEDERATION OF"
340 PRINT"PLANETS."
350 PRINT
352 LINE INPUT "ENTER [CR] TO CONTINUE";A$:IF A$="" THEN PRINT CHR$(26)
360 PRINT" YOU HAVE THE FOLLOWING COMMANDS AVAILABLE TO YOU AS CAPTAIN"
370 PRINT"OF THE STARSHIP ENTERPRISE:"
380 PRINT
390 PRINT"\NAV\ COMMAND = WARP ENGINE CONTROL --"
400 PRINT" COURSE IS IN A CIRCULAR NUMERICAL 4 3 2"
410 PRINT" VECTOR ARRANGEMENT AS SHOWN . . ."
420 PRINT" INTEGER AND REAL VALUES MAY BE ..."
430 PRINT" USED. (THUS COURSE 1.5 IS HALF- 5 ---*--- 1"
440 PRINT" WAY BETWEEN 1 AND 2 ..."
450 PRINT" . . ."
460 PRINT" VALUES MAY APPROACH 9.0, WHICH 6 7 8"
470 PRINT" ITSELF IS EQUIVALENT TO 1.0"
480 PRINT" COURSE"
490 PRINT" ONE WARP FACTOR IS THE SIZE OF "
500 PRINT" ONE QUADTANT. THEREFORE, TO GET"
510 PRINT" FROM QUADRANT 6,5 TO 5,5, YOU WOULD"
520 PRINT" USE COURSE 3, WARP FACTOR 1."
530 PRINT:PRINT
531 LINE INPUT "ENTER [CR] TO CONTINUE";A$:IF A$="" THEN PRINT CHR$(26)
540 PRINT"\SRS\ COMMAND = SHORT RANGE SENSOR SCAN"
550 PRINT" SHOWS YOU A SCAN OF YOUR PRESENT QUADRANT."
560 PRINT
570 PRINT" SYMBOLOGY ON YOUR SENSOR SCREEN IS AS FOLLOWS:"
580 PRINT" <*> = YOUR STARSHIP'S POSITION"
590 PRINT" +K+ = KLINGON BATTLE CRUISER"
600 PRINT" >!< = FEDERATION STARBASE (REFUEL/REPAIR/RE-ARM HERE!)"
610 PRINT" * = STAR"
620 PRINT
630 PRINT" A CONDENSED 'STATUS REPORT' WILL ALSO BE PRESENTED."
640 PRINT
650 PRINT"\LRS\ COMMAND = LONG RANGE SENSOR SCAN"
660 PRINT" SHOWS CONDITIONS IN SPACE FOR ONE QUADRANT ON EACH SIDE"
670 PRINT" OF THE ENTERPRISE (WHICH IS IN THE MIDDLE OF THE SCAN)"
680 PRINT" THE SCAN IS CODED IN THE FORM \###\, WHERE TH UNITS DIGIT"
690 PRINT" IS THE NUMBER OF STARS, THE TENS DIGIT IS THE NUMBER OF"
700 PRINT" STARBASES, AND THE HUNDRESDS DIGIT IS THE NUMBER OF"
710 PRINT" KLINGONS."
720 PRINT
730 PRINT" EXAMPLE - 207 = 2 KLINGONS, NO STARBASES, & 7 STARS."
740 PRINT:PRINT
741 LINE INPUT "ENTER [CR] TO CONTINUE";A$:IF A$="" THEN PRINT CHR$(26)
750 PRINT"\PHA\ COMMAND = PHASER CONTROL."
760 PRINT" ALLOWS YOU TO DESTROY THE KLINGON BATTLE CRUISERS BY "
770 PRINT" ZAPPING THEM WITH SUITABLY LARGE UNITS OF ENERGY TO"
780 PRINT" DEPLETE THEIR SHIELD POWER. (REMEMBER, KLINGONS HAVE"
790 PRINT" PHASERS TOO!)"
800 PRINT
810 PRINT"\TOR\ COMMAND = PHOTON TORPEDO CONTROL"
820 PRINT" TORPEDO COURSE IS THE SAME AS USED IN WARP ENGINE CONTROL"
830 PRINT" IF YOU HIT THE KLINGON VESSEL, HE IS DESTROYED AND"
840 PRINT" CANNOT FIRE BACK AT YOU. IF YOU MISS, YOU ARE SUBJECT TO"
850 PRINT" HIS PHASER FIRE. IN EITHER CASE, YOU ARE ALSO SUBJECT TO "
860 PRINT" THE PHASER FIRE OF ALL OTHER KLINGONS IN THE QUADRANT."
870 PRINT
880 PRINT" THE LIBRARY-COMPUTER (\COM\ COMMAND) HAS AN OPTION TO "
890 PRINT" COMPUTE TORPEDO TRAJECTORY FOR YOU (OPTION 2)"
900 PRINT
910 PRINT"\SHE\ COMMAND = SHIELD CONTROL"
920 PRINT" DEFINES THE NUMBER OF ENERGY UNITS TO BE ASSIGNED TO THE"
930 PRINT" SHIELDS. ENERGY IS TAKEN FROM TOTAL SHIP'S ENERGY. NOTE"
940 PRINT" THAT THE STATUS DISPLAY TOTAL ENERGY INCLUDES SHIELD ENERGY"
950 PRINT
951 LINE INPUT "ENTER [CR] TO CONTINUE";A$:IF A$="" THEN PRINT CHR$(26)
960 PRINT"\DAM\ COMMAND = DAMMAGE CONTROL REPORT"
970 PRINT" GIVES THE STATE OF REPAIR OF ALL DEVICES. WHERE A NEGATIVE"
980 PRINT" 'STATE OF REPAIR' SHOWS THAT THE DEVICE IS TEMPORARILY"
990 PRINT" DAMAGED."
1000 PRINT
1010 PRINT"\COM\ COMMAND = LIBRARY-COMPUTER"
1020 PRINT" THE LIBRARY-COMPUTER CONTAINS SIX OPTIONS:"
1030 PRINT" OPTION 0 = CUMULATIVE GALACTIC RECORD"
1040 PRINT" THIS OPTION SHOWES COMPUTER MEMORY OF THE RESULTS OF ALL"
1050 PRINT" PREVIOUS SHORT AND LONG RANGE SENSOR SCANS"
1060 PRINT" OPTION 1 = STATUS REPORT"
1070 PRINT" THIS OPTION SHOWS THE NUMBER OF KLINGONS, STARDATES,"
1080 PRINT" AND STARBASES REMAINING IN THE GAME."
1090 PRINT" OPTION 2 = PHOTON TORPEDO DATA"
1100 PRINT" WHICH GIVES DIRECTIONS AND DISTANCE FROM THE ENTERPRISE"
1110 PRINT" TO ALL KLINGONS IN YOUR QUADRANT"
1115 PRINT:PRINT
1116 LINE INPUT "ENTER [CR] TO CONTINUE";A$:IF A$="" THEN PRINT CHR$(26)
1117 PRINT"\COM\ COMMAND = LIBRARY-COMPUTER"
1118 PRINT
1120 PRINT" OPTION 3 = STARBASE NAV DATA"
1130 PRINT" THIS OPTION GIVES DIRECTION AND DISTANCE TO ANY "
1140 PRINT" STARBASE WITHIN YOUR QUADRANT"
1150 PRINT" OPTION 4 = DIRECTION/DISTANCE CALCULATOR"
1160 PRINT" THIS OPTION ALLOWS YOU TO ENTER COORDINATES FOR"
1170 PRINT" DIRECTION/DISTANCE CALCULATIONS"
1180 PRINT" OPTION 5 = CALACTIC /REGION NAME/ MAP"
1190 PRINT" THIS OPTION PRINTS THE NAMES OF THE SIXTEEN MAJOR "
1200 PRINT" GALACTIC REGIONS REFERRED TO IN THE GAME."
1210 PRINT:PRINT:PRINT
1220 PRINT "...CHAINING TO STARTREK..."
1230 LOAD "STARTREK.BAS",R
1240 END

33
software/BAS/userled.bas Normal file
View File

@@ -0,0 +1,33 @@
01 REM ****************************************
02 REM
03 REM Z80-MBC2 USER led blink demo:
04 REM
05 REM Blink USER led until USER key is pressed
06 REM
07 REM ****************************************
08 REM
13 PRINT "Press USER key to exit"
14 LEDUSER = 0 : REM USER LED write Opcode (0x00)
15 KEYUSER = 128 : REM USER KEY read Opcode (0x80)
16 PRINT "Now blinking..."
18 OUT 1,LEDUSER : REM Write the USER LED write Opcode
20 OUT 0,1 : REM Turn USER LED on
30 GOSUB 505 : REM Delay sub
40 OUT 1,LEDUSER : REM Write the USER LED write Opcode
45 OUT 0,0 : REM Turn USER LED off
50 GOSUB 505 : REM Delay
60 GOTO 18
490 REM
500 REM * * * * * DELAY SUB
501 REM
505 FOR J=0 TO 150
506 OUT 1,KEYUSER : REM Write the USER KEY read Opcode
507 IF INP(0)=1 THEN GOTO 700 : REM Exit if USER key is pressed
510 NEXT J
520 RETURN
690 REM
691 REM * * * * * PROGRAM END
692 REM
700 OUT 1,LEDUSER : REM Write the USER LED write Opcode
710 OUT 0,0 : REM Turn USER LED off
720 PRINT "Terminated by USER Key"

Binary file not shown.

Binary file not shown.

View File

@@ -155,6 +155,8 @@ INIT80CHAR: IF BUILD_VIDEOMODULE = 1
IN A,(VMCTRL) ; Get current display mode.
OR MODE_80CHAR ; Enable 80 char display.
OUT (VMCTRL),A ; Activate.
LD A, SYSMODE_MZ80B ; Set bus and default CPU speed to 4MHz
OUT (SYSCTRL),A ; Activate.
ELSE
; Change to 80 character mode on the 40/80 Char Colour board v1.0.
LD A, 128 ; 80 char mode.
@@ -8644,6 +8646,19 @@ REBOOTTZ: IF BUILD_TZFS +BUILD_RFS > 0
OUT (MMCFG),A
ENDIF
; Switch machine back to default state.
IF BUILD_VIDEOMODULE = 1
IN A,(VMCTRL) ; Get current display mode.
AND ~MODE_80CHAR ; Disable 80 char display.
OUT (VMCTRL),A ; Activate.
LD A, SYSMODE_MZ80A ; Set bus and default CPU speed to 2MHz
OUT (SYSCTRL),A ; Activate.
ELSE
; Change to 40 character mode on the 40/80 Char Colour board v1.0.
LD A, 0 ; 40 char mode.
LD (DSPCTL), A
ENDIF
REBOOT80A: IF BUILD_MZ80A = 1
ENDIF
JP 0000H ; Now restart in the SA1510 monitor.

View File

@@ -258,12 +258,14 @@ INIT3: ; Setup keyboard buffer control.
LD (FLASHCTL),A
INIT80CHAR: IF BUILD_VIDEOMODULE = 1
IN A,(VMCTRL) ; Get current display mode.
OR MODE_80CHAR ; Enable 80 char display.
OUT (VMCTRL),A ; Activate.
IN A,(VMCTRL) ; Get current display mode.
OR MODE_80CHAR ; Enable 80 char display.
OUT (VMCTRL),A ; Activate.
LD A, SYSMODE_MZ80B ; Set bus and default CPU speed to 4MHz
OUT (SYSCTRL),A ; Activate.
ELSE
; Change to 80 character mode on the 40/80 Char Colour board v1.0.
LD A, 128 ; 80 char mode.
LD A, 128 ; 80 char mode.
LD (DSPCTL), A
ENDIF
;
@@ -2034,6 +2036,20 @@ BOOTSTG1: LD A,TZMM_CPM2
; mode 7 to mode 2, the code continues.
REBOOT: LD A,TZMM_TZFS
OUT (MMCFG),A
; Switch machine back to default state.
IF BUILD_VIDEOMODULE = 1
IN A,(VMCTRL) ; Get current display mode.
AND ~MODE_80CHAR ; Disable 80 char display.
OUT (VMCTRL),A ; Activate.
LD A, SYSMODE_MZ80A ; Set bus and default CPU speed to 2MHz
OUT (SYSCTRL),A ; Activate.
ELSE
; Change to 40 character mode on the 40/80 Char Colour board v1.0.
LD A, 0 ; 40 char mode.
LD (DSPCTL), A
ENDIF
;
JP MROMADDR ; Now restart in the SA1510 monitor.

Binary file not shown.