DO-CALC is a multi-function scientific and business calculator program written in BASIC, offering six main modules: a general expression evaluator, N-factorial computation, accounting/statistics, running balance, transformation/regression analysis, and compound interest calculation. The program makes extensive use of numeric constants encoded as variables initialised via PI and EXP arithmetic at startup (lines 4–57), avoiding literal numbers throughout the code to save token space. Memory registers M() and C() with string annotation arrays A$() and B$() provide a ten-slot scratchpad accessible across modules. A printer-aware design threads optional LPRINT and COPY calls throughout every module, and a flicker-prompt subroutine at line 9906 animates the status line by repeatedly printing and clearing a string. The GOTO arithmetic idiom—computing branch targets by summing Boolean expressions multiplied by line numbers—appears frequently as a compact alternative to IF/THEN chains.
Program Analysis
Program Structure
DO-CALC is organised as a menu-driven shell with six independently re-entrant modules. Initialisation (lines 3–79) runs once; the main menu loop lives at line 200; and each module occupies a distinct line-number block chosen so that VAL X$*CT (where CT=1400) jumps directly to the correct module entry point when the user enters a digit 1–7.
| Line range | Module |
|---|---|
| 1400–1815 | Calculator / expression evaluator |
| 1816–1898 | Recall / register display |
| 1900–2662 | Clear / exchange register management |
| 2800–2936 | N-Factorial |
| 4200–5520 | Accounting / Statistics |
| 5600–6995 | Running Balance |
| 7000–8362 | Transformation / Regression |
| 8400–8610 | Compound Interest |
| 9000–9085 | Continuation dispatcher |
| 9500–9999 | Shared utility subroutines |
Constant Initialisation via PI Arithmetic
Lines 4–57 construct every numeric constant used in the program from PI, avoiding literal integers. A=PI/PI gives 1; subsequent additions build 2–10 and composite values like LN=T+A (21, the bottom display line). This shrinks each stored number to a short token sequence and is a well-known ZX81/TS1000 memory optimisation.
Z=0, A=1, B=2, C=3, D=4, E=5, F=6, G=7, H=8, I=9, J=10T=20, U=30, LN=21(note:LNshadows the built-inLNfunction — see Anomalies)NU4=LN J= ln(10) ≈ 2.3026;LG4=EXP A/J= e^0.1 ≈ 1.1052 (log conversion constants, unused in the visible listing)FU4=PI/180;DG4=A/FU4— degree↔radian factors
GOTO Arithmetic Idiom
Throughout the program, conditional branches are collapsed into a single GOTO by summing Boolean-times-line-number products. On the ZX81/TS1000, a false condition evaluates to 0, so only the true term contributes to the target address.
Example at line 1425:
GOTO (1702 AND L$="M")+(1487 AND L$="P" AND TP AND L)+(1600 AND L$="A")+(DS AND L$="Q")+(RC AND L$="R")+(CL AND L$="C")+(CT AND L$="*")+(CT AND L$="-")
This replaces seven separate IF/THEN lines with one, saving significant RAM.
Shared Utility Subroutines
Several high-line-number routines serve multiple modules:
PT(9906) — animated prompt: printsS$atAT LN,PPwith a flicker effect using a blankDIM T$(LEN S$). TheFOR W=A TO Aloop at 9908 executes exactly once — the loop is just a structured way to run the body; there is no actual iteration.XS(9900) — Y/N input filter: loops until the user enters exactly “Y” or “N”.LP(9942) — conditional LPRINT with scroll, used for printer output in statistics and balance modules.5300— statistics accumulator reset (TO, NU, SX2).8350— regression accumulator reset (CX, CY, CX2, CY2, CXY, NM).
Memory Registers
Ten memory (M) and ten constant (C) registers are provided, each with a 12-character string annotation stored in parallel arrays A$(J) and B$(J). A third array D(J) is used during the Exchange function (line 2500) as a temporary swap buffer for C() values, with C$(J,J+B) used for annotation exchange.
Printer Support
The flag variable TP (0 or 1) gates all LPRINT and COPY calls throughout the program. It is set at line 196/198 by a Y/N prompt at startup. Every module checks TP before sending output, making the printer entirely optional.
Continuation / Re-entry
Flags T1, T2, T3 record whether the accounting, balance, and regression modules have been entered before. The Disposition menu (line 9800) offers a “Continuation” option that routes to line 9000, which inspects these flags and re-enters the appropriate module mid-session, preserving accumulators.
Running Balance Negative Indicator
When the running balance BA goes to zero or below, subroutine 6975 converts each character of the string representation to its inverse-video equivalent by adding 128 to its character code (CODE Y$(P)+128). This gives a visual warning directly in the printed balance without any separate flag or branch.
Regression Module
The regression module (lines 7000–8362) supports linear regression of transformed variables. The user supplies BASIC expressions D$ for F(X) and E$ for G(Y); the program evaluates them with VAL D$ and VAL E$ after setting X and Y. Slope, intercept, standard error, and R² are computed at line 7370–7415 using standard single-pass formulae. A delete mode (DE=-A) allows data points to be removed by subtracting from the accumulators.
Error-Recovery String
The string G$ (line 33) holds an inverse-video message ending with “GOTO ” and is concatenated with a line-number string wherever a recovery instruction is displayed on screen — for example G$+"%1%4%0%0" at line 1813 and G$+"%4%2%9%1" at line 5515. This lets the user manually re-enter a module after an error without restarting the program.
Anomalies and Notable Points
LNvariable shadows built-in: The variableLN(set to 21 at line 54) redefines the natural-logarithm keyword for the rest of the program. Any attempt to use the built-inLNfunction after line 54 would call the variable instead. The program avoids this conflict by storingLN JinNU4during initialisation (line 28), beforeLNis overwritten.FOR W=A TO Aat line 9908: The loop iterates exactly once. This is used purely for structural symmetry, not for repetition.- Line 260 range check:
CODE X$<T+I OR CODE X$>U+Echecks that the entered character is in the range ‘1’–’7′ (codes 29–35 in ZX81 character set), restricting menu input to valid module numbers. - Line 6960:
IF CODE Y$=(LN AND NOT TD)uses the variableLN(21, the newline/enter key code) as the test for an ENTER keypress, which is a neat dual use of the renamed variable. - Line 9020 referenced but not defined: Lines 9060, 9070, and 9080 branch to line 9020 when a continuation flag is not set, but line 9020 does not exist in the listing. This causes a “line not found” error and is likely a latent bug — the intent was probably to branch to the menu at
MN(200).
Content
Source Code
3 FAST
4 LET Z=PI-PI
5 LET A=PI/PI
6 LET B=A+A
7 LET C=B+A
8 LET D=C+A
9 LET E=D+A
10 LET F=E+A
11 LET G=F+A
12 LET H=G+A
13 LET I=H+A
14 LET J=I+A
15 LET T=J+J
16 LET U=T+J
17 LET RX=Z
18 LET LINK=Z
19 LET CT=1400
26 LET L=Z
27 LET RY=Z
28 LET NU4=LN J
29 LET LG4=EXP A/J
30 LET MN=200
31 LET FU4=PI/180
32 LET DG4=A/FU4
33 LET G$="%T%O% %R%E%C%O%V%E%R% %F%R%O%M% %E%S%T%O%P%-%>%G%O%T%O% "
35 LET N=Z
36 LET K=Z
38 LET KD=Z
40 LET OL=Z
41 LET RC=1816
42 LET CL=1900
43 LET BK=CT
44 LET U$="================================"
45 LET PT=9906
46 LET XS=9900
47 LET LP=9942
48 LET XY=7160
50 LET AS=4291
51 LET N$="%O%P%T%I%O%N"
52 LET M$="%E%N%T%E%R"
53 LET DS=9800
54 LET LN=T+A
55 LET T1=Z
56 LET T2=Z
57 LET T3=Z
73 DIM C$(J,J+B)
74 DIM A$(J,J+B)
75 DIM B$(J,J+B)
76 DIM C(J)
77 DIM D(J)
78 DIM M(J)
79 DIM Q$(J+B)
150 CLS
152 SLOW
154 GOSUB 170
156 LET S$=": PRESS ENTER :"
158 LET PP=J+D
160 GOSUB PT
161 LET PP=Z
162 PAUSE 4E4
164 GOSUB 190
165 IF T1 OR T2 OR T3 THEN GOTO DS
166 GOSUB MN
170 PRINT AT A,J+A;".................."
172 PRINT AT B,J+A;": DO-CALC :";AT C,J+A;"''''''''''''''''''";AT E,Z;"COPYRIGHT 1983 BERNARD V. GERBER"
174 PRINT AT G,D;"% % % % % % % % % % % % % % % ";AT H,D;"% %1% % %2% % %3% % %4% % %5% ";AT I,D;"% % % % % % % % % % % % % % % ";
176 PRINT AT J+B,D;"% % % % % % % % % % % % % % % ";AT J+C,D;"% %6% % %7% % %8% % %9% % %0% ";AT J+D,D;"% % % % % % % % % % % % % % % "
178 PRINT AT J+G,D;"% % % % % % % % % % % % % % % ";AT J+H,D;"% %.% % %+% % %-% % %*% % %/% ";AT J+I,D;"% % % % % % % % % % % % % % % "
180 RETURN
190 CLS
191 LET S$="%P%R%I%N%T%E%R% %O%N% %L%I%N%E%? Y/N"
193 GOSUB PT
195 GOSUB XS
196 IF X$="Y" THEN LET TP=A
198 IF X$="N" THEN LET TP=Z
199 RETURN
200 FAST
205 CLS
215 PRINT AT C,J+A;"%M%E%N%U";AT E,E;;"1.CALCULATOR",TAB E;"2.N-FACTORIAL",TAB E;"3.ACCOUNTING/STATISTICS",TAB E;"4.RUNNING BALANCE",TAB E;"5.TRANSFORMATION/",TAB H;"REGRESSION",TAB E;"6.COMPOUND INTEREST",TAB E;"7.DISPOSITION"
250 LET S$=M$+"% "+N$
252 GOSUB PT
255 INPUT X$
260 IF (X$="" OR LEN X$>A OR CODE X$<T+I OR CODE X$>U+E) THEN GOTO 255
262 CLS
265 GOTO VAL X$*CT
1400 CLS
1401 SLOW
1402 LET BK=CT
1404 GOSUB 1800
1405 PRINT AT F,Z;"LINK=";LINK
1410 PRINT AT H,Z;"%E%V%A%L%U%A%T%E%:"
1411 LET S$=M$+"% %C%A%L%C%U%L%A%T%I%O%N"
1413 GOSUB PT
1415 INPUT L$
1416 IF L$="" THEN GOTO 1415
1417 PRINT AT LN,Z;" "
1418 IF L$<>"M" AND L$<>"P" AND L$<>"A" AND L$<>"Q" AND L$<>"R" AND L$<>"C" AND L$<>"*" AND L$<>"-" THEN GOTO 1430
1421 IF L$="-" THEN IF RX=A THEN LET RX=Z
1422 IF L$="*" THEN IF RX=Z THEN LET RX=A
1423 IF L$="P" AND NOT TP THEN GOTO CT
1424 IF L$="P" AND NOT L THEN GOTO CT
1425 GOTO (1702 AND L$="M")+(1487 AND L$="P" AND TP AND L)+(1600 AND L$="A")+(DS AND L$="Q")+(RC AND L$="R")+(CL AND L$="C")+(CT AND L$="*")+(CT AND L$="-")
1430 GOSUB 1800
1435 PRINT AT F,Z;"LINK=";LINK
1441 LET Y$=L$
1450 LET L=VAL Y$
1452 LET OL=LINK
1454 LET LINK=L
1456 PRINT AT F,Z;"LINK=";OL;AT H,Z;"%E%V%A%L%U%A%T%E";AT J,Z;Y$;AT J+D,Z;"%E%Q%U%A%L%S",,,,L;AT J+H,Z;"%W%H%I%C%H% %I%S% %T%H%E% %N%E%W% >LINK"
1458 GOTO 1411
1487 FAST
1490 PRINT AT LN,Z;U$
1495 COPY
1535 IF RX THEN GOTO 1555
1550 GOTO 1415
1555 LET RY=A
1560 GOTO RC
1605 LET N=N+A
1610 IF N=J+A THEN GOTO 1662
1615 LET M(N)=L
1620 CLS
1625 PRINT AT LN,Z;"M(";N;")=";L
1626 LET S$="%R%E%M%A%R%K%:"
1627 LET PP=T
1628 GOSUB PT
1629 LET PP=Z
1631 INPUT A$(N)
1632 PRINT AT LN,J+F;A$(N)
1633 PAUSE U+T
1660 GOTO RC
1662 CLS
1665 PRINT AT J,J+B;"N0 SPACE"
1670 PAUSE U+T
1675 GOTO RC
1705 LET K=K+A
1710 IF K<J+A THEN GOTO 1715
1712 GOTO 1662
1715 CLS
1720 PRINT AT J,Z;"-->INPUT ANY NUMBER/EXPRESSION TO BECOME C(";K;")";" FOR FORMULA USE";AT Z,Z;G$+"%1%7%1%5"
1725 INPUT K$
1730 LET C(K)=VAL K$
1731 LET P$=STR$ C(K)
1735 PRINT AT LN,Z;"C(";K;")=";C(K)
1736 LET S$="%R%E%M%A%R%K%:"
1737 LET PP=T
1738 GOSUB PT
1739 LET PP=Z
1741 INPUT B$(K)
1742 PRINT AT LN,T;B$(K)
1743 PAUSE U+T
1765 LET S$="%A%G%A%I%N%? Y/N "
1767 GOSUB PT
1770 GOSUB XS
1780 IF X$="Y" THEN GOTO 1705
1782 GOTO RC
1800 CLS
1810 PRINT AT Z,Z;" %Q=QUIT %P=PRINT %A=ASSIGN M(N) %M=MAKE C(K) %R=RECALL %C=CLEAR"
1811 IF TP THEN IF RX THEN PRINT AT B,Z;"(-)=PRINT-RECALL %*=PRINT+RECALL"
1812 IF TP THEN IF NOT RX THEN PRINT AT B,Z;" %-=PRINT-RECALL (*)=PRINT+RECALL"
1813 PRINT AT C,Z;G$+"%1%4%0%0"
1815 RETURN
1816 CLS
1817 FAST
1819 PRINT "%R%E%C%A%L%L";TAB T;"%R%E%M%A%R%K%S"
1860 FOR P=A TO J
1861 PRINT "M(";P;")=";M(P);TAB T;A$(P)
1863 NEXT P
1864 FOR P=A TO J
1865 PRINT "C(";P;")=";C(P);TAB T;B$(P)
1870 NEXT P
1871 IF RY THEN GOTO 1892
1872 PRINT AT LN,Z;"%P=PRINT %C=CLEAR %D=DISP %B=BACK"
1873 INPUT X$
1874 IF X$="P" AND NOT TP THEN GOTO 1873
1875 IF X$="P" AND TP THEN GOTO 1892
1876 IF X$<>"C" AND X$<>"P" AND X$<>"D" AND X$<>"B" THEN GOTO 1873
1877 GOTO (DS AND X$="D")+(BK AND X$="B")+(CL AND X$="C")
1892 PRINT AT LN,Z;U$
1894 IF TP THEN LPRINT
1896 IF TP THEN COPY
1897 LET RY=Z
1898 GOTO RC
1900 CLS
1905 FAST
1915 PRINT AT E,J+A;N$,,TAB A;"1.CLEAR MEMORY REGISTER(S)",TAB A;"2.CLEAR CONSTANT REGISTER(S)",TAB A;"3.EXCHANGE",TAB A;"4.RECALL(OTHER GOTO""S)"
1926 LET S$=M$+"% "+N$
1928 GOSUB PT
1930 INPUT X$
1935 IF X$<>"1" AND X$<>"2" AND X$<>"3" AND X$<>"4" THEN GOTO 1930
1940 GOTO (1950 AND X$="1")+(2000 AND X$="2")+(1942 AND X$="3")+(RC AND X$="4")
1942 GOSUB 2500
1944 GOTO RC
1950 LET MC=Z
1955 LET REG=N
1960 GOTO 2050
2000 LET MC=A
2005 LET REG=K
2010 GOTO 2050
2050 GOSUB 2400
2052 INPUT X$
2054 IF X$<>"A" AND X$<>"B" AND X$<>"C" THEN GOTO 2052
2056 GOTO (2058 AND X$="A")+(2076 AND X$="B")+(2100 AND X$="C")
2058 CLS
2060 FOR P=A TO J
2062 IF MC THEN GOTO 2068
2064 LET M(P)=Z
2066 LET A$(P)=" "
2068 LET C(P)=Z
2070 LET B$(P)=" "
2072 NEXT P
2073 IF NOT MC THEN LET N=Z
2074 IF MC THEN LET K=Z
2075 GOTO RC
2076 GOSUB 2130
2082 IF VAL Y$=J THEN GOTO 2058
2084 CLS
2086 FOR P=A TO (J-VAL Y$)
2090 IF MC THEN GOTO 2093
2091 LET M(P)=M(P+VAL Y$)
2092 LET A$(P)=A$(P+VAL Y$)
2093 LET C(P)=C(P+VAL Y$)
2094 LET B$(P)=B$(P+VAL Y$)
2095 NEXT P
2096 IF NOT MC THEN LET N=N-VAL Y$
2097 IF MC THEN LET K=K-VAL Y$
2099 GOTO RC
2100 GOSUB 2130
2102 IF VAL Y$=J THEN GOTO 2058
2104 CLS
2106 IF NOT MC THEN FOR P=N TO N-VAL Y$+A STEP -A
2107 IF MC THEN FOR P=K TO K-VAL Y$+A STEP -A
2108 IF MC THEN GOTO 2114
2110 LET M(P)=Z
2112 LET A$(P)=" "
2114 LET C(P)=Z
2116 LET B$(P)=" "
2118 NEXT P
2120 IF NOT MC THEN LET N=N-VAL Y$
2122 IF MC THEN LET K=K-VAL Y$
2124 GOTO RC
2130 CLS
2132 IF NOT REG THEN GOTO RC
2134 LET S$=M$+"% %N%U%M%B%E%R% %O%F% %R%E%G%I%S%T%E%R%S"
2136 GOSUB PT
2140 INPUT Y$
2142 IF Y$="" THEN GOTO 2140
2144 IF VAL Y$<A OR VAL Y$>J OR VAL Y$>REG THEN GOTO 2140
2146 RETURN
2400 CLS
2410 PRINT AT E,J+A;N$;TAB F;"A. ALL REGISTERS",TAB F;"B. UPPER BLOCK",TAB F;"C. LOWER BLOCK"
2422 LET S$=M$+"% "+N$
2426 GOSUB PT
2427 RETURN
2500 CLS
2505 FAST
2560 FOR P=A TO J
2565 LET DR=D(P)
2570 LET D(P)=C(P)
2575 LET C(P)=DR
2580 LET S$=C$(P)
2585 LET C$(P)=B$(P)
2590 LET B$(P)=S$
2595 NEXT P
2636 PRINT AT J,J+C;"%D%O%N%E"
2646 PAUSE U+T
2648 CLS
2662 RETURN
2800 CLS
2810 LET BK=2800
2852 PRINT AT Z,Z;G$+"%2%8%0%0"
2855 LET S$=M$+" N"
2859 GOSUB PT
2860 INPUT Y$
2861 FAST
2862 IF Y$="" THEN GOTO 2860
2863 CLS
2864 LET P=INT VAL Y$
2865 IF P<A OR P>U+C THEN GOTO 2800
2869 FAST
2875 LET NF=A
2880 FOR R=A TO P
2885 LET NF=NF*R
2890 NEXT R
2915 CLS
2920 PRINT AT Z,Z;U$;AT J,A;"%N%F=";P;" FACTORIAL=";NF;AT LN,Z;"%H%I%T% "+M$
2921 PAUSE 4E4
2922 PRINT AT LN,Z;U$
2923 IF TP THEN COPY
2936 GOTO 9960
4200 FAST
4201 LET T1=Z
4202 LET H$=";"
4203 IF T1=A AND TP AND H$<>";" THEN LPRINT U$;TAB J;"CONTINUATION",,,H$
4204 IF NOT T1 THEN GOSUB 5300
4205 LET R1=Z
4206 IF NOT TP THEN GOTO 4214
4207 GOSUB 5400
4208 LET H$=X$
4210 LPRINT
4212 LPRINT "% %D%A%T%A% % % % % % % % % % % % %R%E%M%A%R%K%S% % % % % % % % "
4214 LET DE=A
4215 LET BK=AS-A
4216 LET T1=A
4290 CLS
4291 FAST
4292 GOSUB 5500
4293 PRINT AT LN,Z;"X=? "
4294 INPUT Y$
4295 IF Y$="" THEN GOTO AS+C
4296 IF Y$<>"X" AND Y$<>"S" AND Y$<>"T" AND Y$<>"Q" AND Y$<>"*" AND Y$<>"-" THEN GOTO 4301
4297 IF Y$="T" THEN LET AC=Z
4298 IF Y$="S" THEN LET AC=A
4300 GOTO (DS AND Y$="Q")+(4322 AND Y$="S")+(4322 AND Y$="T")+(4390 AND Y$="*")+(4390 AND Y$="-")+(4500 AND Y$="X")
4301 PRINT AT LN,Z;" "+Y$;
4302 LET X=VAL Y$
4304 GOSUB 4600
4307 IF R1 THEN IF TP THEN LPRINT Y$;
4308 IF NOT R1 THEN GOSUB XS+U
4310 IF R1 THEN GOSUB PT+J
4312 GOTO AS+A
4322 IF NOT NU THEN GOTO AS-A
4324 LET AV=TO/NU
4325 LET SD=SQR ABS ((SX2-((TO*TO)/NU))/(NU-A))
4326 LET V$="%N%U "
4328 PRINT AT LN,Z;V$;NU
4330 LET Z$=STR$ NU
4332 GOSUB LP
4334 LET V$="%T%O "
4336 PRINT AT T+A,Z;V$;TO
4337 LET Z$=STR$ TO
4338 GOSUB LP
4341 IF AC THEN GOTO 4355
4344 LET S$="%R%E%S%U%M%E%? Y/N"
4346 GOSUB PT
4347 GOSUB XS
4348 IF X$="Y" THEN GOTO AS
4352 IF TP THEN LPRINT U$
4353 FAST
4354 GOTO 9960
4355 LET V$="%A%V "
4356 PRINT AT T+A,Z;V$;AV
4357 LET Z$=STR$ AV
4358 GOSUB LP
4359 LET V$="%S%D "
4360 PRINT AT T+A,Z;V$;SD
4361 LET Z$=STR$ SD
4362 GOSUB LP
4363 LET S$="%R%E%S%U%M%E%? Y/N"
4365 GOSUB PT
4366 GOSUB XS
4367 IF X$="Y" THEN GOTO AS
4368 IF TP THEN LPRINT U$
4372 GOTO 9960
4390 IF Y$="*" THEN LET R1=A
4392 IF Y$="-" THEN LET R1=Z
4394 GOTO AS
4500 IF NOT NU THEN GOTO AS-A
4502 LET DE=-A
4504 LET S$="%X=?"
4508 GOSUB PT
4510 INPUT X$
4512 IF X$="" THEN GOTO 4510
4514 LET X=VAL X$
4516 LET P$=STR$ X
4518 GOSUB 4600
4520 LET DE=A
4522 PRINT AT LN,Z;"%D%E";X
4524 IF TP THEN LPRINT "%D%E";P$
4526 SCROLL
4528 GOTO AS
4600 LET TO=TO+DE*X
4602 LET NU=NU+DE*A
4604 LET X2=X*X
4606 LET SX2=SX2+DE*X2
4608 RETURN
5300 LET TO=Z
5305 LET NU=Z
5310 LET SX2=Z
5325 RETURN
5400 CLS
5401 FAST
5403 LET S$="%E%N%T%E%R% %N%E%W% %H%E%A%D%I%N%G"
5405 GOSUB PT
5406 INPUT X$
5407 IF X$="" THEN LET X$="**"
5408 CLS
5410 LPRINT U$;TAB J;"NEW HEADING",,,X$,TAB J+F,U$
5415 FAST
5416 RETURN
5500 PRINT AT Z,Z;" %T=TOTALS %S=STATISTICS %Q=QUIT "
5502 IF R1 THEN PRINT AT A,Z;"%X=DELETE %*=+REMARKS (-)=-REMARKS"
5504 IF R1=Z THEN PRINT AT A,Z;"%X=DELETE (*)=+REMARKS %-=-REMARKS"
5515 PRINT AT B,Z;G$+"%4%2%9%1"
5520 RETURN
5600 LET T2=Z
5601 LET I$=";"
5602 LET BK=9992
5603 IF T2 AND TP AND I$<>";" THEN LPRINT U$;TAB J;"CONTINUATION",,,I$
5605 IF NOT TP THEN GOTO 5625
5610 GOSUB 5400
5615 LET I$=X$
5620 LPRINT U$,,
5625 LET R1=Z
5630 CLS
5635 GOSUB 6900
5637 IF T2 THEN GOTO 5737
5640 LET S$=M$+"% %I%N%I%T%I%A%L% %B%A%L%A%N%C%E"
5650 LET TD=Z
5655 GOSUB PT
5660 GOTO 6930
5662 IF Y$="*" OR Y$="-" THEN GOTO 5630
5665 CLS
5670 GOSUB 6900
5675 LET BA=VAL Y$
5680 LET V$="%B%A$"
5685 PRINT AT LN,Z;V$;Y$
5686 LET Z$=Y$
5690 GOSUB LP-F
5700 GOSUB 6900
5705 LET V$="-$="
5707 PRINT AT LN,Z;V$;
5708 LET TD=A
5710 GOTO 6930
5712 IF Y$="*" OR Y$="-" THEN GOTO 5700
5713 IF CODE Y$<T+C OR CODE Y$>U+I THEN LET TD=B
5714 IF CODE Y$<T+C OR CODE Y$>U+I THEN GOTO 6930
5715 LET EN=VAL Y$
5716 LET V$="-$"
5720 PRINT AT LN,Z;V$;EN;
5722 IF R1 THEN LPRINT V$;Y$;
5723 LET Z$=Y$
5725 IF NOT R1 THEN GOSUB LP-F
5730 IF R1 THEN GOSUB PT+J
5735 LET BA=BA-EN
5737 LET Y$=STR$ BA
5740 IF BA<=0 THEN GOSUB 6975
5742 LET T2=A
5745 GOTO 5680
5750 LET V$="%+$"
5755 PRINT AT LN,Z;V$;Y$(B TO LEN Y$)
5757 LET Z$=Y$(B TO LEN Y$)
5760 GOSUB LP
5770 LET BA=BA+VAL Y$(B TO LEN Y$)
5772 LET Y$=STR$ BA
5775 IF BA<=0 THEN GOSUB 6975
5780 GOTO 5680
6900 FAST
6901 IF NOT R1 THEN PRINT AT Z,Z;" %Q=QUIT (*)=+REMARKS %-=-REMARKS "
6905 IF R1 THEN PRINT AT Z,Z;" %Q=QUIT %*=+REMARKS (-)=-REMARKS "
6910 PRINT AT A,Z;" PRECEDE DEPOSITS WITH ""+"" "
6912 PRINT AT B,Z;" DELETE ERROR BY DEPOSITING BACK"
6915 PRINT AT B,Z;G$+"%5%6%0%0"
6920 RETURN
6930 INPUT Y$
6932 FAST
6935 IF Y$="" THEN GOTO 6930
6945 IF Y$="Q" THEN LET BK=9992
6947 IF Y$="Q" THEN GOTO 9960
6950 IF Y$="*" THEN LET R1=A
6955 IF Y$="-" THEN LET R1=Z
6960 IF CODE Y$=(LN AND NOT TD) THEN GOTO 5630
6965 IF CODE Y$=(LN AND TD) THEN GOTO 5750
6966 IF NOT TD THEN GOTO 5662
6968 IF TD=A THEN GOTO 5712
6970 IF TD=B THEN GOTO 5714
6975 LET Y$=STR$ BA
6980 FOR P=A TO LEN Y$
6985 LET Y$(P)=CHR$ (CODE Y$(P)+128)
6990 NEXT P
6995 RETURN
7000 FAST
7001 LET T3=Z
7002 LET J$=";"
7003 LET SC=8300
7004 DIM R$(U+B)
7005 DIM W$(U+B)
7006 IF T3 AND TP AND J$<>";" THEN LPRINT U$;TAB J;"CONTINUATION",,,J$
7007 LET TZ=Z
7008 GOSUB SC
7009 LET P$=X$
7010 CLS
7011 IF TP THEN GOSUB 5400
7012 IF TP THEN LET J$=X$
7018 IF T3 THEN GOTO 7420
7019 CLS
7020 LET S$="%T%R%A%N%S%F%O%R%M% %O%N%L%Y%? Y/N"
7025 GOSUB PT
7026 GOSUB XS
7027 FAST
7030 IF X$="Y" THEN LET TT=Z
7035 IF X$="N" THEN LET TT=A
7036 IF NOT TT THEN GOTO 7045
7040 GOSUB 8350
7041 LET DE=A
7042 LET TV=A
7043 LET BK=9995
7044 GOTO 7075
7045 LET S$="%T%W%O% %V%A%R%I%A%B%L%E%S%? Y/N "
7050 GOSUB PT
7055 GOSUB XS
7056 CLS
7060 IF X$="N" THEN LET TV=Z
7065 IF X$="Y" THEN LET TV=A
7075 LET TZ=A
7076 GOSUB SC
7077 LET S$=M$+"% %F%U%N%C%T%I%O%N% %F%(%X%)"
7078 GOSUB PT
7085 INPUT D$
7086 CLS
7095 LET X=J
7102 LET W=VAL D$
7104 LET R$="%F="+D$
7106 IF TP THEN LPRINT U$,,R$
7110 IF (TT OR TV) THEN GOTO 7120
7114 IF TP THEN LPRINT
7115 IF TP THEN LPRINT P$
7116 GOTO XY
7120 LET TZ=B
7121 GOSUB SC
7122 LET S$=M$+"% %F%U%N%C%T%I%O%N% %G%(%Y%)"
7123 GOSUB PT
7124 INPUT E$
7125 CLS
7127 LET Y=J
7130 LET W=VAL E$
7132 LET W$="%G="+E$
7134 IF TP THEN LPRINT W$,,P$
7160 IF NOT TV THEN LET TZ=C
7161 IF TV THEN LET TZ=D
7162 IF TT THEN LET TZ=E
7163 LET BK=9995
7165 GOSUB SC
7170 PRINT AT T,Z;"X=? "
7180 INPUT K$
7185 IF K$="" THEN GOTO XY+T
7190 IF K$="Q" THEN GOTO DS
7192 IF TT THEN IF K$="X" THEN GOTO 8200
7195 IF TT THEN IF K$="C" THEN GOTO 7370
7200 LET X=VAL K$
7205 LET TX=VAL D$
7210 LET V$=STR$ TX
7215 IF LN=T+A THEN PRINT AT T,Z;"X=";X;AT T,J+H;TX
7217 IF LN=T THEN PRINT AT T,Z;"%D%X";X;TAB J+H;"% ";TX
7220 IF TP AND LN=T+A THEN LPRINT K$;TAB J+H;V$
7222 IF TP AND LN=T THEN LPRINT "%D%X";K$;TAB J+H;"% ";V$
7225 IF NOT TV THEN SCROLL
7230 IF NOT TV THEN GOTO XY
7235 GOSUB SC
7240 FAST
7241 IF LN=T+A THEN PRINT AT LN,Z;"Y=? "
7242 IF LN=T THEN PRINT AT T+A,Z;"%Y=? "
7250 INPUT L$
7260 IF L$="" OR L$="Q" OR L$="C" OR L$="X" THEN GOTO 7250
7270 LET Y=VAL L$
7275 LET TY=VAL E$
7276 IF TT THEN LET NM=NM+DE*A
7280 LET O$=STR$ TY
7285 IF LN=T+A THEN PRINT AT LN,Z;;"Y=";Y;TAB J+H;TY
7287 IF LN=T THEN PRINT AT T+A,Z;"%D%Y";Y;TAB J+H;"% ";TY
7306 FAST
7307 SCROLL
7310 SCROLL
7312 SCROLL
7313 IF TP AND LN=T+A THEN LPRINT L$;TAB J+H;O$
7314 IF TP AND LN=T THEN LPRINT "%D%Y";L$;TAB J+H;"% ";O$
7315 IF TP THEN LPRINT
7316 IF TT THEN GOTO 7330
7320 IF TV THEN GOTO XY
7330 LET CX=CX+DE*TX
7335 LET CY=CY+DE*TY
7340 LET C2=TX*TX
7345 LET D2=TY*TY
7350 LET CX2=CX2+DE*C2
7355 LET CY2=CY2+DE*D2
7360 LET CXY=CXY+DE*(TX*TY)
7362 LET DE=A
7364 LET LN=T+A
7366 GOTO XY
7370 IF (NOT NM OR NM-B<=Z) THEN GOTO XY
7375 CLS
7380 FAST
7385 LET NB=CX2-((CX*CX)/NM)
7390 LET NT=CXY-((CX*CY)/NM)
7395 LET SL=NT/NB
7400 LET IN=(CY/NM)-SL*(CX/NM)
7405 LET SP=CY2-((CY*CY)/NM)
7410 LET SE=SQR ABS ((SP-(SL*NT))/(NM-B))
7415 LET R2=((NM*CXY-CX*CY)/SQR ABS ((NM*CX2-(CX*CX))*(NM*CY2-(CY*CY))))**2
7420 CLS
7422 PRINT AT Z,Z;U$;AT D,G;"%S%L=";SL;TAB G;"%I%N=";IN;TAB G;"%S%E=";SE;TAB G;"%R%2=";R2;AT J+A,Z;"%G= ";SL;" *%F+ ";IN;AT J+D,Z;"WHERE:",,,AT J+F,Z;"%G=";E$;AT J+H,Z;"%F=";D$;AT LN,Z;"%H%I%T% "+M$
7423 LET T3=A
7424 PAUSE 4E4
7426 PRINT AT LN,Z;U$
7428 IF TP THEN COPY
7430 LET S$="%R%E%S%U%M%E%? Y/N"
7492 GOSUB PT
7494 GOSUB XS
7500 IF X$="N" THEN GOTO 9960
7501 CLS
7505 GOTO XY
8200 IF NOT NM THEN GOTO XY
8205 LET DE=-A
8210 LET S$="%X=?"
8215 LET LN=T
8220 GOSUB PT
8225 GOTO 7180
8302 FAST
8304 LET X$="####%D%A%T%A########################%T%R%A%N%S%F%O%R%M##########"
8306 IF TZ=A THEN PRINT AT Z,Z;G$+"%7%0%7%5"
8308 IF TZ=B THEN PRINT AT Z,Z;G$+"%7%1%2%0"
8310 IF TZ=C OR TZ=D THEN PRINT AT Z,Z;" %Q=QUIT "
8312 IF TZ=C OR TZ=D OR TZ=E THEN PRINT AT A,Z;G$+"%7%1%6%0"
8314 IF TZ=C THEN PRINT AT B,Z;R$;AT C,Z;X$
8316 IF TZ=D OR TZ=E THEN PRINT AT B,Z;R$;AT C,Z;W$;AT D,Z;X$
8318 IF TZ=E THEN PRINT AT Z,Z;" %X=DELETE %C=COMPUTE %Q=QUIT "
8320 RETURN
8350 LET CX=Z
8352 LET CY=Z
8354 LET CX2=Z
8356 LET CY2=Z
8358 LET CXY=Z
8360 LET NM=Z
8362 RETURN
8400 FAST
8402 LET TJ=Z
8405 CLS
8407 LET BK=8400
8410 LET SK=9600
8415 LET BI=9500
8420 GOSUB SK
8425 LET S$=M$+"% %P%R%E%S% %V%A%L"
8430 GOSUB PT
8435 GOSUB BI
8440 IF X$="?" THEN LET TJ=A
8442 IF X$="?" THEN GOTO 8455
8445 LET PV=VAL X$
8455 GOSUB SK
8460 LET S$="%0%/%0% %I%N%T"
8465 GOSUB PT
8470 GOSUB BI
8475 IF X$="?" THEN LET TJ=B
8477 IF X$="?" THEN GOTO 8490
8480 LET IT=VAL X$/100
8490 GOSUB SK
8495 LET S$="%N%U%M% %P%D%S"
8500 GOSUB PT
8505 GOSUB BI
8510 IF X$="?" THEN LET TJ=C
8515 IF X$="?" THEN GOTO 8522
8520 LET PD=INT VAL X$
8522 GOSUB SK
8525 LET S$="%A%M%O%U%N%T"
8530 GOSUB PT
8535 GOSUB BI
8540 IF X$="?" THEN LET TJ=D
8542 IF X$="?" THEN GOTO 8560
8545 LET AM=VAL X$
8560 IF TJ=D THEN LET AM=PV*(A+IT)**PD
8565 IF TJ=A THEN LET PV=AM*(A+IT)**(-PD)
8570 IF TJ=B THEN LET IT=((AM/PV)**(A/PD))-A
8575 IF TJ=C THEN LET PD=(LN AM-LN PV)/(LN (A+IT))
8580 CLS
8585 PRINT AT Z,Z;U$;AT C,E;"COMPOUND INTEREST";AT G,G;"%P%V=$";PV;TAB G;"%I%T=";IT*100;" %0%/%0";TAB G;"%P%D=";PD;TAB G;"%A%M=$";AM;AT F+TJ,E;"%?>";AT LN,Z;"%H%I%T% "+M$
8590 PAUSE 4E4
8595 PRINT AT LN,Z;U$
8600 IF TP THEN COPY
8610 GOTO 9960
9000 CLS
9022 IF NOT T1 THEN IF NOT T2 THEN IF NOT T3 THEN GOTO MN
9025 FAST
9030 PRINT AT B,J;"%C%O%N%T%I%N%U%A%T%I%O%N";AT D,J+C;N$,,TAB D;"1.ACCOUNTING/STATISTICS",TAB D;"2.RUNNING BALANCE",TAB D;"3.REGRESSION",TAB D;"4.DISPOSITION"
9035 LET S$=M$+"% "+N$
9040 GOSUB PT
9045 INPUT X$
9050 IF X$<>"1" AND X$<>"2" AND X$<>"3" AND X$<>"4" THEN GOTO 9045
9052 FAST
9053 CLS
9055 GOTO (9060 AND X$="1")+(9070 AND X$="2")+(9080 AND X$="3")+(9800 AND X$="4")
9060 IF T1<>A THEN GOTO 9020
9065 GOTO 4203
9070 IF T2<>A THEN GOTO 9020
9075 GOTO 5603
9080 IF T3<>A THEN GOTO 9020
9085 GOTO 7006
9500 INPUT X$
9505 IF X$="" THEN GOTO 9500
9510 IF X$="Q" THEN GOTO DS
9515 FAST
9520 IF TJ AND X$="?" THEN GOTO 9500
9525 RETURN
9600 CLS
9610 FAST
9615 PRINT AT Z,J+B;"%Q=QUIT";AT B,D;M$+"% %?% %F%O%R% %U%N%K%N%O%W%N% %O%N%L%Y";AT D,Z;G$+"%8%4%0%0"
9620 RETURN
9800 FAST
9801 CLS
9802 PRINT AT G,J+A;"%O%P%T%I%O%N%S",,TAB J;"1.MENU",TAB J;"2.RECALL",TAB J;"3.BACK";TAB J;"4.CONTINUATION",TAB J;"5.SAVE ""DO-CALC""",TAB J;"6.STOP"
9808 LET S$=M$+"% "+N$
9810 GOSUB PT
9811 INPUT X$
9812 FAST
9814 IF X$<>"1" AND X$<>"2" AND X$<>"3" AND X$<>"4" AND X$<>"5" AND X$<>"6" THEN GOTO 9811
9816 GOTO (MN AND X$="1")+(RC AND X$="2")+(BK AND X$="3")+(9000 AND X$="4")+(9832 AND X$="5")+(9818 AND X$="6")
9818 CLS
9820 PRINT AT H,D;"OPEN FOR DIRECT COMMANDS";TAB I;"(GOTO DS-AFTER)"
9822 STOP
9832 CLS
9834 PRINT AT J,J+B;"RECORDER?"
9836 LET S$="%H%I%T% "+M$
9838 GOSUB PT
9840 PAUSE 4E4
9842 SAVE "DO-CALC"
9843 GOTO 150
9900 INPUT X$
9902 IF X$<>"Y" AND X$<>"N" THEN GOTO XS
9904 RETURN
9906 DIM T$(LEN S$)
9907 SLOW
9908 FOR W=A TO A
9910 PRINT AT LN,PP;T$;AT LN,PP;S$;AT LN,PP;T$;AT LN,PP;S$
9912 NEXT W
9914 RETURN
9916 LET S$="%R%E%M%A%R%K%:"
9918 LET PP=T
9920 GOSUB PT
9921 LET PP=Z
9922 INPUT Q$
9924 PRINT AT LN,T;Q$
9925 SCROLL
9926 IF TP THEN LPRINT AT LN,T;Q$
9927 FAST
9928 RETURN
9930 IF TP THEN LPRINT Y$
9932 SCROLL
9934 RETURN
9936 IF TP THEN LPRINT V$;Z$
9938 SCROLL
9940 RETURN
9942 IF NOT R1 THEN GOSUB LP-F
9944 IF R1 THEN IF TP THEN LPRINT V$;Z$;
9946 IF R1 THEN GOSUB PT+J
9948 GOSUB 5500
9950 RETURN
9960 LET S$=M$+"% %A%S% %C%O%N%S%T%A%N%T%(%S%)%? Y/N "
9970 GOSUB PT
9975 GOSUB XS
9976 FAST
9980 IF X$="N" THEN GOTO DS
9985 CLS
9990 GOTO 1705
9992 CLS
9993 GOTO 5737
9995 CLS
9996 GOTO XY
9999 STOP
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

