DO-CALC

Products: DO-CALC
Developer(s): Bernard V. Gerber
Date: 1983
Type: Cassette
Platform(s): TS 1000

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 rangeModule
1400–1815Calculator / expression evaluator
1816–1898Recall / register display
1900–2662Clear / exchange register management
2800–2936N-Factorial
4200–5520Accounting / Statistics
5600–6995Running Balance
7000–8362Transformation / Regression
8400–8610Compound Interest
9000–9085Continuation dispatcher
9500–9999Shared 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=10
  • T=20, U=30, LN=21 (note: LN shadows the built-in LN function — 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: prints S$ at AT LN,PP with a flicker effect using a blank DIM T$(LEN S$). The FOR W=A TO A loop 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

  • LN variable shadows built-in: The variable LN (set to 21 at line 54) redefines the natural-logarithm keyword for the rest of the program. Any attempt to use the built-in LN function after line 54 would call the variable instead. The program avoids this conflict by storing LN J in NU4 during initialisation (line 28), before LN is overwritten.
  • FOR W=A TO A at 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+E checks 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 variable LN (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

Appears On

Related Products

Related Articles

Related Content

Image Gallery

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.

Scroll to Top