Screen-Calc

Products: Screen-Calc
Developer(s): Andrew Banta
Date: 1983
Type: Program
Platform(s): TS 2068

SCREEN-CALC is a spreadsheet application that allows users to define a grid of up to 1,008 cells (configurable as columns × rows), enter numeric values and text labels, and assign formula functions to cells. Formulas support row totals, column totals, running averages, and conditional IF logic with comparison operators encoded as character codes (60, 61, 62, 199, 200, 201). The program uses three parallel arrays — A() for numeric values, A$() for text labels, and P$() for formula pointers — with a separate F$() array storing up to 150 function strings of up to 82 characters each. Navigation uses cursor keys and single-letter commands, with column insertion and deletion supported by shifting array contents in BASIC loops. Data can be saved and loaded via tape in either full-program or data-only modes, and a hardcopy print routine formats output for a printer using LPRINT.


Program Analysis

Program Structure

The program is organized into a set of functional subroutines reached by GO SUB from a central navigation loop. The main flow initialises variables (lines 1–25), prompts for grid size (lines 350–590), allocates arrays (lines 670–820), then enters a display-and-command loop at line 1070. Key subroutines are:

Line rangeFunction
1070–1490Main display loop and command dispatcher
2000–2910Replace / formula display
3000–3990Insert (text, number, function, loop, data load)
4000–4130Jump to cell by coordinate
4290–4550Column range clear / formula fill
4700–4820Recalculate all cells
5000–5870Formula evaluation engine
6000–6250Save / load (tape)
7000–7520Column insert / delete
8000–8120Find cell by label text
8200–8670Print (LPRINT) formatted report
8700–8750Convert column number to two-character display string
8800–8810Flash “CALCULATING” indicator
8900Invalid-entry error beep
9000–9200LPRINT helpers (print line, set/clear INVERSE)
9300Constants: CELM=1008, FUNL=80, FUNM=150

Array Architecture

Three parallel 2-D arrays hold cell data. A(MA,Y1) stores numeric values; A$(MA,Y1,8) stores text labels up to 8 characters; P$(MA,Y1) stores a single character whose code is an index into F$(FUNM,FUNL+2), the formula store. A zero byte in P$ means no formula. This indirection lets many cells share the same formula string.

The array dimension MA is computed at lines 670–700 by repeatedly incrementing until MA*Y1 > CELM-Y1, effectively calculating the largest number of columns that fits within the 1,008-cell limit while leaving one row of headroom.

Formula Evaluation Engine (lines 5000–5870)

The engine walks a formula string character by character using an index C. It recognises the following function tokens by letter:

  • R — row sum (GO SUB 5100), optionally followed by A for average
  • C — column sum (GO SUB 5200), optionally followed by A for average
  • I — IF conditional (GO SUB 5500)

Cell references within formulas are recognised by the pattern x,y, (a comma at position C+2), which are expanded at line 5030 into A(x,y) strings for evaluation by VAL at line 5400. This means the formula evaluator ultimately uses VAL B$ to let the BASIC interpreter compute the numeric result, a technique that turns formula strings into executable BASIC expressions at runtime.

The IF subroutine (lines 5500–5870) parses a comparison operator by its character code: 60 (<), 61 (=), 62 (>), 199 (<=), 200 (>=), 201 (<>). Based on the result, it either continues with the THEN branch or skips to the E (ELSE) token.

Navigation and Display

The display loop at lines 1200–1490 shows a window of rows centred on cursor position Y, controlled by the range -I1 TO I1+A (normally ±2 rows). Three columns centred on X are shown. The variable BOX toggles an on-screen box overlay (lines 1265) using block-graphic characters; it is toggled by pressing B, with even/odd parity tested by BOX/2=INT(BOX/2).

Keyboard navigation uses both BASIC cursor key codes (8–11) and digit keys 5–8, providing coarse (3-step) and fine (1-step) movement in all four directions. Line 1427 uses SCREEN$ to detect whether a digit is showing in the top-left corner of the screen, as a proxy for whether the insert mode header is still displayed.

Variable Aliasing

Several numeric constants are stored in single-letter variables to save memory and speed up repeated evaluation:

VariableValueUsed for
Z0Zero constant throughout
A1One constant throughout
H10Row 10 and divisor for column label formatting
K11Column 11 for display layout
T20Row 20 (menu bar row)
U21Row 21 (prompt/status row)

This is a classic Sinclair BASIC memory-saving idiom: variable lookup is faster and shorter than repeated literal parsing, and single-letter names occupy less space in the variables area.

Save and Load (lines 6000–6250)

Saving supports two modes: A saves the entire program with SAVE S$ LINE 10 (auto-starting at line 10 on load), while D saves only the numeric array A() and label array A$() as data files. Loading data (line 6200) performs two sequential LOAD … DATA operations. The save name is user-supplied at runtime and stored in S$, which is also displayed in the header at line 1202.

Column Insert and Delete (lines 7000–7310)

Column deletion at lines 7090–7150 shifts all three arrays (A, A$, P$) left by one position from the deleted column onwards, then decrements X1. Insertion (lines 7210–7300) shifts rightward from X1 down to the insertion point, then clears the new column. Both operations run in pure BASIC nested loops, which will be slow for large grids but require no machine code.

Print Formatting (lines 8200–8410)

The LPRINT routine formats a range of cells into a tabular report. A header row of column labels is built by concatenating two-character column identifiers (from GO SUB 8700) padded with spaces from Z$. For each row, text labels and numeric values are printed on separate lines. The INVERSE subroutines at 9100 and 9200 bracket the header row to produce inverse-video column headings on the printer.

Bugs and Anomalies

  • Line 1000 is referenced by GO TO 1000 (line 330, “OLD” option) but does not appear in the listing. This would cause a “line does not exist” crash if the user pressed O at the startup prompt, suggesting the “load existing file” branch is unimplemented or was accidentally omitted from this listing.
  • Lines 3600 and 3610 are both reached after the validation loop at 3540–3580 passes, but 3600 checks LEN B$ < FUNL+1 and falls through to 3610 which prints “TOO LONG” — the logic is inverted. A formula that is too long would reach 3610 after failing the 3600 check; however, valid short formulas would fall from 3600 past 3610 to 3800 (“BAD FUNCTION”), meaning valid functions are incorrectly rejected. This appears to be a genuine logic bug: a GO TO 3900 is missing at the end of line 3600.
  • Mixed case in variable names: x$ at lines 1200 and 1430 versus X$ elsewhere. On the Spectrum/TS2068, variable names are case-insensitive for numeric variables but string variable names canonically use upper case; the lowercase x$ references the same variable as X$ and will work correctly.
  • Similarly, x6 and x5 at line 8225 are lowercase but refer to the same variables as X6 and X5.
  • The program listing appears twice (lines 1–9300 are fully duplicated), which is likely a template/export artifact rather than a program feature.

Content

Appears On

Related Products

Electronic spreadsheet. 1008 cells, each can hold an 8 letter label and a number. The 180 functions, up to 80...

Related Articles

Related Content

Image Gallery

Screen-Calc

Source Code

    1 LET z=0
    2 CLEAR 
    5 LET S$="SAV NAME"
    8 LET I=-1
   10 LET I1=2
   11 LET Z=0
   12 LET A=1
   13 LET FC1=0: LET FF=0
   14 LET H=10
   15 LET K=11
   16 LET T=20
   17 LET U=21
   20 LET J1=A
   21 INK 4
   22 PAPER 0
   23 CLS 
   24 BORDER 0
   25 GO SUB 9300
   30 LET M=A
   40 DIM Y$(8)
   50 LET Z$="                                "
   70 LET M$="████████████████████████████████"
  270 PRINT AT 0,0;Z$
  290 IF I<Z THEN GO TO 350
  300 PRINT AT U,Z;"NEW OR OLD"
  302 POKE 23658,8
  305 PRINT AT H,H;"SCREEN-CALC"
  306 PRINT AT K,Z;" © COPYRIGHT 1983 BANTASOFTWARE"
  307 PRINT TAB 7;"ALL RIGHTS RESERVED"
  310 PAUSE 0
  315 LET K$=INKEY$
  320 IF K$="N" THEN GO TO 2
  330 IF K$="O" THEN GO TO 1000
  340 GO TO 310
  350 CLS 
  360 LET FC=Z
  370 PRINT ,,"SIZE(MAX ";CELM;"):"
  380 LET A$=""
  390 PRINT AT A,17;A$;">"
  410 LET B$="     "
  430 LET K$=INKEY$
  440 IF K$=CHR$ 13 THEN GO TO 500
  450 PAUSE 6
  460 IF K$="" THEN GO TO 390
  465 PRINT AT U,Z;Z$
  470 LET A$=A$+K$
  480 GO TO 390
  500 LET C=Z
  508 PRINT AT A,17;"           "
  510 IF LEN A$<3 THEN GO TO 540
  520 IF A$(2)="X" THEN LET C=2
  530 IF A$(3)="X" THEN LET C=3
  540 IF C=Z THEN PRINT AT 21,Z;"BAD INPUT"
  550 IF C=Z THEN GO TO 380
  560 LET X1=VAL A$(A TO C-A)
  570 LET Y1=VAL A$(C+A TO LEN A$)
  580 IF X1*Y1<=CELM AND X1*Y1>Z THEN GO TO 600
  585 PRINT AT U,Z;"BAD SIZE, TRY AGAIN"
  590 GO TO 380
  600 PRINT AT A,16;A$,"OK?"
  620 PAUSE 0
  660 IF INKEY$="N" THEN GO TO 350
  665 IF INKEY$<>"Y" THEN GO TO 620
  666 GO SUB 8800
  670 LET MA=X1
  680 IF MA*Y1>CELM-Y1 THEN GO TO 720
  690 LET MA=MA+A
  700 GO TO 680
  720 DIM A$(MA,Y1,8)
  725 DIM A(MA,Y1)
  730 DIM F$(FUNM,FUNL+2)
  740 DIM P$(MA,Y1)
  750 FOR I=A TO MA
  760 FOR J=A TO Y1
  770 LET P$(I,J)=CHR$ Z
  780 NEXT J
  790 NEXT I
  800 LET INS=Z
  810 LET CLER=Z
  820 DIM X$(A)
 1040 LET X=A
 1050 LET Y=A
 1060 LET BOX=Z
 1070 CLS 
 1200 IF x$="A" THEN GO TO 1212
 1202 PRINT X1;"X";Y1;TAB 11;S$;TAB 21;"FC=";FC
 1203 PRINT AT A,Z;M$;"██ ";TAB 9;"▌ ▌";TAB  T;"▌ ▌";TAB 30;"██"
 1204 FOR I=-A TO A
 1205 GO SUB 8700
 1206 REM 
 1207 REM 
 1208 REM 
 1209 REM 
 1210 INVERSE 1: PRINT AT A,K*I+14;E$: INVERSE 0
 1211 NEXT I
 1212 FOR I=-I1 TO I1+A
 1214 LET Y3=I+Y
 1215 IF Y3>Y1 OR Y3<=Z THEN GO TO 1260
 1216 DIM E$(2)
 1217 LET E1=INT (Y3/H)
 1218 LET E2=Y3-E1*H
 1219 LET E$(A)=CHR$ (E1+48)
 1220 LET E$(2)=CHR$ (E2+48)
 1221 PRINT AT I*3+8,Z;
 1222 INVERSE 1
 1223 IF I=-I1 THEN PRINT E$;AT 2,30;E$
 1224 INVERSE 0
 1225 IF I=-I1 THEN PRINT AT 2,Z
 1226 IF INS=A THEN PRINT AT 8,Z
 1227 LET INS=Z
 1229 IF X=A THEN GO TO 1250
 1230 IF I>-I1 THEN GO SUB 1480
 1235 PRINT A$(X-A,Y3);"   ";A$(X,Y3);"   ";
 1237 IF X<X1 THEN PRINT A$(X+A,Y3)
 1240 FOR J=-J1 TO J1
 1241 LET X3=J+X
 1243 IF X3<=X1 THEN IF P$(X3,Y3)<>CHR$ Z THEN GO SUB 5000
 1245 NEXT J
 1247 PRINT TAB Z;A(X-A,Y3);TAB K;A(X,Y3);TAB 22;
 1248 IF X<X1 THEN PRINT A(X+A,Y3)
 1249 GO TO 1260
 1250 IF I>-I1 THEN GO SUB 1480
 1254 PRINT TAB K;A$(X,Y3);"   ";A$(X+A,Y3)
 1255 FOR J=Z TO J1
 1256 LET X3=J+X
 1257 IF CODE P$(X3,Y3)<>Z THEN GO SUB 5000
 1258 NEXT J
 1259 PRINT TAB K;A(X,Y3);TAB 22;A(X+A,Y3)
 1260 NEXT I
 1265 IF BOX/2=INT (BOX/2) THEN PRINT AT 8,H;"▌▄▄▄▄▄▄▄▄▄▄▌";AT 9,H;"▌";AT 9,U;"▌";AT H,H;"▌";AT H,U;"▌";AT K,H;"▌▄▄▄▄▄▄▄▄▄▄▌"
 1269 PRINT AT T,Z;Z$;Z$
 1270 PRINT AT T,Z;"A=ALL B=BOX C=COL F=FIND  J=JUMP"
 1280 PRINT "E=END I=INSERT P=PRINT R=REPLACE"
 1285 BEEP .5,16
 1290 PAUSE 0
 1300 LET K$=INKEY$
 1301 LET I1=2
 1302 LET J1=A
 1303 DIM X$(A)
 1304 IF K$="I" THEN LET X$="A"
 1305 IF K$="P" THEN GO SUB 8200
 1306 IF K$="B" THEN LET BOX=BOX+A
 1310 IF K$="5" AND X>A THEN LET X=X-A
 1320 IF K$="6" AND Y<Y1 THEN LET Y=Y+A
 1330 IF K$="7" AND Y>A THEN LET Y=Y-A
 1340 IF K$="8" AND X<X1 THEN LET X=X+A
 1350 IF K$=CHR$ 11 AND Y>6 THEN LET Y=Y-6
 1360 IF K$=CHR$ 10 AND Y<Y1-5 THEN LET Y=Y+6
 1370 IF K$=CHR$ 8 AND X>3 THEN LET X=X-3
 1380 IF K$=CHR$ 9 AND X<X1-2 THEN LET X=X+3
 1390 IF K$="R" THEN GO SUB 2000
 1400 IF K$="E" THEN GO TO 6000
 1410 IF K$="I" THEN GO SUB 3000
 1415 IF K$="C" THEN GO SUB 7000
 1417 IF K$="F" THEN GO SUB 8000
 1420 IF K$="J" THEN GO SUB 4000
 1425 IF K$="A" THEN GO SUB 4700
 1427 IF SCREEN$ (Z,Z)<"0" OR SCREEN$ (Z,Z)>"9" THEN DIM X$(A)
 1430 IF X$<>"A" THEN GO TO 1070
 1440 LET I1=Z
 1450 LET J1=Z
 1460 PRINT AT 9,K;"       "
 1470 PRINT AT H,K;"          "
 1475 GO TO 1200
 1480 INVERSE 1
 1481 PRINT E$;
 1482 INVERSE 0
 1484 PRINT "-------- ---------- --------";: INVERSE 1
 1486 PRINT E$
 1489 INVERSE 0
 1490 RETURN 
 2000 IF CODE P$(X,Y)=Z THEN RETURN 
 2002 GO SUB 2900
 2005 LET FC1=FC
 2010 LET FC=CODE P$(X,Y)-A
 2020 GO TO 3500
 2900 IF CODE P$(X,Y)<>Z THEN PRINT AT 17,Z;F$(CODE P$(X,Y))
 2910 RETURN 
 3000 PRINT AT T,Z;M$;M$
 3002 LET XSAV=X: LET YSAV=Y
 3005 LET INS=A
 3006 REM 
 3010 PRINT AT T,Z;"A=ABORT   N=NUMBER L=LOOP D=DATA";TAB Z;"F=FUNCTION T=TEXT C=CLEAR"
 3030 PAUSE 0
 3040 LET K$=INKEY$
 3050 IF K$="A" THEN GO TO 3960
 3055 IF K$="N" THEN LET FF=A: GO TO 3100
 3060 GO SUB 2900
 3062 LET C=9: LET K1=11
 3065 IF K$="T" THEN GO TO 3100
 3070 IF K$="F" THEN GO TO 3500
 3075 IF K$="D" THEN GO TO 6200
 3080 IF K$="L" THEN GO TO 4300
 3085 IF K$="C" THEN GO TO 4290
 3090 GO TO 3030
 3100 DIM C$(H)
 3102 LET C=9: LET K1=11
 3103 IF K$="N" THEN LET C=H
 3105 LET CT=Z
 3110 PRINT AT C,K1;C$(A TO CT);: FLASH 1: PRINT ">"
 3112 FLASH 0
 3115 PAUSE 0
 3120 LET K$=INKEY$
 3130 IF K$="" THEN GO TO 3120
 3140 IF CODE K$=13 THEN GO TO 3400
 3145 IF CODE K$>7 AND CODE K$<12 AND C<>9 THEN GO TO 3200
 3150 IF CODE K$=12 THEN GO TO 3300
 3160 IF CODE K$=32 THEN LET K$=" "
 3161 IF C<>9 AND K$="M" THEN LET K$="."
 3162 IF C<>9 AND (K$<"0" OR K$>"9") AND K$<>"M" AND K$<>"." AND K$<>"-" THEN GO TO 3110
 3165 LET CT=CT+A
 3170 LET C$(CT)=K$
 3180 GO TO 3110
 3200 LET K2=CODE K$
 3202 IF CT>Z THEN LET A(X,Y)=VAL C$
 3204 PRINT AT C,(K1+CT);" ": LET K$=""
 3205 IF CT=0 THEN PRINT AT C,K1;A(X,Y)
 3210 IF K2=8 AND X>1 AND K1>=K THEN LET X=X-1: LET K1=K1-K
 3220 IF K2=9 AND X<X1 AND K1<22 THEN LET X=X+1: LET K1=K1+K
 3240 IF K2=10 AND Y<Y1 AND C<18 THEN LET Y=Y+1: LET C=C+3: LET K1=K1
 3250 IF K2=11 AND Y>1 AND C>4 THEN LET Y=Y-1: LET C=C-3: LET K1=K1
 3290 GO TO 3105
 3300 LET CT=CT-A
 3310 GO TO 3110
 3400 IF C=9 THEN LET A$(X,Y)=C$: GO TO 3410
 3405 IF CT>0 THEN LET A(X,Y)=VAL C$
 3410 PRINT AT C,(K1+CT);" "
 3412 LET X=XSAV: LET Y=YSAV
 3420 GO TO 3980
 3500 PRINT AT T,Z;M$;M$
 3504 IF FC>=FUNM THEN LET K$="": RETURN 
 3505 REM 
 3510 PRINT AT U,Z;"FUNCTION? FC=";FC+A
 3520 INPUT B$
 3540 FOR I=A TO LEN B$
 3541 LET CH=Z
 3550 IF CODE B$(I)=32 OR (CODE B$(I)>39 AND CODE B$(I)<95) OR (CODE B$(I)>177 AND CODE B$(I)<190) OR B$(I)="PI" OR CODE B$(I)=165 THEN LET CH=A
 3570 IF CH=Z THEN GO TO 3800
 3580 NEXT I
 3600 IF LEN B$<FUNL+1 THEN GO TO 3900
 3610 PRINT AT T,12;"TOO LONG"
 3800 PRINT AT T,Z;"BAD FUNCTION"
 3810 GO TO 3510
 3900 LET FC=FC+A
 3910 LET P$(X,Y)=CHR$ FC
 3920 LET F$(FC)=B$
 3930 IF FC1>Z THEN LET FC=FC1
 3940 LET FC1=Z
 3980 LET K$=""
 3985 IF P$(X,Y)>CHR$ Z AND FF=Z THEN PRINT AT 17,Z;F$(FC)
 3987 IF FF=1 AND (C<>H OR K1<>K) THEN PRINT AT Z,Z;" ": LET INS=Z
 3990 LET FF=Z: RETURN 
 4000 PRINT AT T,Z;M$;M$
 4010 PRINT AT U,Z;"POSITION?"
 4020 INPUT B$
 4030 LET C=Z
 4040 IF LEN B$<3 THEN GO TO 4070
 4050 IF B$(2)="," THEN LET C=2
 4060 IF B$(3)="," THEN LET C=3
 4070 IF C=Z THEN GO TO 4000
 4080 LET X2=VAL B$(A TO C-A)
 4090 LET Y2=VAL B$(C+A TO LEN B$)
 4100 IF X2>Z AND X2<=X1 THEN LET X=X2
 4110 IF Y2>Z AND Y2<=Y1 THEN LET Y=Y2
 4120 IF X<>X2 OR Y<>Y2 THEN GO TO 4000
 4130 RETURN 
 4290 LET CLER=A
 4300 PRINT AT T,Z;M$;M$
 4310 LET B$="      "
 4320 LET C$=""
 4330 PRINT AT U,Z;"FOR COLUMN"
 4340 INPUT C$
 4350 LET B$(A TO 5)=C$
 4360 LET XX1=VAL B$(A TO 2)
 4370 IF B$(3)=" " THEN LET XX2=XX1
 4380 IF B$(3)=" " THEN GO TO 4400
 4390 LET XX2=VAL B$(4 TO 5)
 4400 PRINT AT U,4;"ROW   "
 4420 INPUT C$
 4430 LET B$(A TO 5)=C$
 4440 LET YY1=VAL B$(A TO 2)
 4450 IF B$(3)=" " THEN LET YY2=YY1
 4460 IF B$(3)=" " THEN GO TO 4480
 4470 LET YY2=VAL B$(4 TO 5)
 4480 IF CLER=Z THEN GO SUB 3500
 4490 FOR I=XX1 TO XX2
 4500 FOR J=YY1 TO YY2
 4510 IF CLER=Z THEN LET P$(I,J)=CHR$ FC
 4512 IF CLER=A THEN LET A(I,J)=Z
 4514 IF CLER=A THEN LET A$(I,J,A TO 8)=" "
 4520 NEXT J
 4530 NEXT I
 4540 LET K$=""
 4545 LET CLER=Z
 4550 RETURN 
 4700 GO SUB 8800
 4710 LET XX3=X3
 4720 LET YY3=Y3
 4730 FOR J=A TO Y1
 4740 FOR I=A TO X1
 4750 LET X3=I
 4760 LET Y3=J
 4770 IF CODE P$(X3,Y3)<>Z THEN GO SUB 5000
 4780 NEXT I
 4790 NEXT J
 4800 LET X3=XX3
 4810 LET Y3=YY3
 4820 RETURN 
 4900 LET X3=X
 4910 LET Y3=Y
 5000 LET B$=""
 5001 LET C$=""
 5002 LET YY=Y3
 5003 LET RT=A
 5004 LET XX=X3
 5005 LET C5=A
 5006 LET C=A
 5010 LET D=CODE P$(X3,Y3)
 5012 IF F$(D,C)="I" THEN GO SUB 5500
 5013 LET C=C5
 5015 IF F$(D,C)="R" THEN GO SUB 5100
 5020 IF F$(D,C)="C" THEN GO SUB 5200
 5030 IF F$(D,C+2)="," THEN LET B$=B$+"A("+F$(D,C TO C+4)+")"
 5040 IF F$(D,C+2)="," THEN LET C=C+5
 5050 LET B$=B$+F$(D,C)
 5060 IF F$(D,C+A)=" " OR F$(D,C+A)="E" THEN GO TO 5400
 5070 LET C=C+A
 5080 GO TO 5015
 5100 LET TR=Z
 5105 FOR L=A TO X3-A
 5110 LET TR=TR+A(L,Y3)
 5120 NEXT L
 5130 IF F$(D,C-A)="A" THEN LET AR=TR/(X3-A)
 5140 RETURN 
 5200 LET TC=Z
 5205 FOR L=A TO Y3-A
 5210 LET TC=TC+A(X3,L)
 5220 NEXT L
 5230 IF F$(D,C-A)="A" THEN LET AC=TC/(Y3-A)
 5260 RETURN 
 5400 LET A(X3,Y3)=VAL B$
 5410 RETURN 
 5500 LET RT=Z
 5501 LET C$=""
 5505 IF F$(D,C+4)="," THEN LET B$="A("+F$(D,C+2 TO C+6)+")"
 5510 IF F$(D,C+4)="," THEN GO TO 5545
 5530 LET C=C+A
 5540 GO TO 5505
 5545 LET C=C+7
 5550 IF CODE F$(D,C)>59 AND CODE F$(D,C)<63 OR CODE F$(D,C)>198 AND CODE F$(D,C)<202 THEN GO TO 5580
 5560 LET C=C+A
 5570 GO TO 5550
 5580 LET CK=CODE F$(D,C)
 5585 LET C4=C+A
 5590 LET C2=C+3
 5600 IF F$(D,C+2)="," THEN LET C$="A("+F$(D,C TO C+4)+")"
 5610 IF F$(D,C+2)="," THEN GO TO 5700
 5620 LET C=C+A
 5630 IF C<C2 THEN GO TO 5600
 5640 LET C=C4
 5645 LET D$=" "
 5650 IF F$(D,C)>="." AND F$(D,C)<="9" THEN LET C$=D$+F$(D,C)
 5655 IF F$(D,C)="T" THEN GO TO 5700
 5660 LET C=C+A
 5665 LET D$=C$
 5670 GO TO 5650
 5700 LET C=C+4
 5703 IF F$(D,C-2)="," THEN LET C=C+6
 5705 LET BST=VAL B$
 5710 LET CST=VAL C$
 5720 IF CK=62 AND BST>CST THEN LET RT=A
 5730 IF CK=60 AND BST<CST THEN LET RT=A
 5740 IF CK=61 AND BST=CST THEN LET RT=A
 5750 IF CK=199 AND BST<=CST THEN LET RT=A
 5760 IF CK=200 AND BST>=CST THEN LET RT=A
 5770 IF CK=201 AND BST<>CST THEN LET RT=A
 5780 LET C5=C+A
 5790 LET B$=""
 5800 IF RT=A THEN RETURN 
 5810 IF F$(D,C)="E" THEN GO TO 5850
 5820 LET C=C+A
 5830 GO TO 5810
 5850 LET C5=C+5
 5860 LET B$=""
 5870 RETURN 
 6000 CLS 
 6010 PRINT "ALL OR DATA?"
 6020 INPUT B$
 6030 PRINT "SAVE NAME?"
 6040 INPUT S$
 6045 PRINT AT H,A;"START TAPE PLAYER, MAKE SURE    TAPE IS PAST THE LEADER, PRESS  ANY KEY"  
 6050 IF B$="D" THEN GO TO 6100
 6060 IF B$<>"A" THEN GO TO 6010
 6070 SAVE S$ LINE H
 6080 GO TO H
 6100 SAVE S$ DATA A()
 6105 PRINT AT H,Z;"NUMERIC DATA SAVED PRESS ANY KEYTO SAVE LABELS";Z$
 6110 SAVE S$ DATA A$()
 6115 PRINT AT H,Z;"ALL DATA SAVED";Z$;Z$
 6117 PAUSE 300
 6120 GO TO H
 6200 PRINT AT T,Z;M$;M$
 6210 PRINT AT U,Z;"LOAD NAME?"
 6220 INPUT L$
 6230 LOAD L$ DATA A()
 6240 LOAD L$ DATA A$()
 6250 RETURN 
 7000 PRINT AT T,Z;M$;M$
 7010 PRINT AT U,Z;"COLUMN?"
 7020 INPUT C
 7022 IF C=Z THEN RETURN 
 7025 PRINT  AT T,Z;M$;M$
 7030 IF C>MA THEN PRINT AT T,Z;"NO COLUMN"
 7040 IF C>MA THEN GO TO 7010
 7050 PRINT AT U,Z;"D=DELETE A=ADD"
 7060 PAUSE 0
 7062 LET K$=INKEY$
 7065 GO SUB 8800
 7070 IF K$="A" THEN GO TO 7200
 7080 IF K$<>"D" THEN GO TO 7050
 7090 FOR I=C+A TO X1
 7100 FOR J=A TO Y1
 7110 LET A(I-A,J)=A(I,J)
 7120 LET A$(I-A,J)=A$(I,J)
 7125 LET P$(I-A,J)=P$(I,J)
 7130 NEXT J
 7140 NEXT I
 7150 LET X1=X1-A
 7160 RETURN 
 7200 IF X1=MA THEN GO TO 7500
 7210 FOR I=X1 TO C STEP -A
 7220 FOR J=A TO Y1
 7230 LET A(I+A,J)=A(I,J)
 7240 LET A$(I+A,J)=A$(I,J)
 7245 LET P$(I+A,J)=P$(I,J)
 7250 NEXT J
 7260 NEXT I
 7270 LET X1=X1+A
 7280 FOR I=A TO Y1
 7290 LET A(C,I)=Z
 7295 LET A$(C,I)=""
 7300 NEXT I
 7310 RETURN 
 7500 PRINT AT U,Z;"NO ROOM"
 7510 PAUSE 0
 7520 RETURN 
 8000 PRINT AT T,Z;M$;M$
 8005 PRINT AT U,Z;"KEY?"
 8010 INPUT Y$
 8020 GO SUB 8800
 8030 FOR I=A TO X1
 8040 FOR J=A TO Y1
 8050 IF A$(I,J)=Y$ THEN GO TO 8100
 8060 NEXT J
 8070 NEXT I
 8080 PRINT AT U,Z;"NO MATCH"
 8090 PAUSE 300
 8095 RETURN 
 8100 LET X=I
 8110 LET Y=J
 8120 RETURN 
 8200 INPUT "FIRST COLUMN- 0=THIS SCREEN ";X5
 8210 IF X5=0 THEN GO TO 8600
 8215 IF X5<0 THEN GO SUB 8900: GO TO 8200
 8220 INPUT "LAST COLUMN ";X6
 8225 IF X6>X1 OR x6<x5 THEN GO SUB 8900: GO TO 8220
 8230 INPUT "FIRST ROW ";Y5
 8235 IF Y5<1 THEN GO SUB 8900: GO TO 8230
 8240 INPUT "LAST ROW ";Y6
 8245 IF Y6>Y1 OR Y6<Y5 THEN GO SUB 8900: GO TO 8240
 8246 LET XSAV=X
 8247 LET O$="    ": LET X=0
 8248 FOR I=X5 TO X6-1
 8249 GO SUB 8700
 8250 LET O$=O$+E$(1 TO 2)+Z$(1 TO 9)
 8252 NEXT I
 8254 LET I=X6: GO SUB 8700
 8255 LET O$=O$+E$(1 TO 2)+Z$(A TO 4)
 8257 LET X=XSAV
 8258 GO SUB 9100: GO SUB 9000: GO SUB 9200: LET O$=""
 8260 FOR J=Y5 TO Y6
 8262 IF J<10 THEN LET O$="0"+STR$ J: GO TO 8265
 8263 LET O$=STR$ J
 8265 GO SUB 9100: GO SUB 9000: GO SUB 9200
 8268 LET O$=""
 8270 FOR I=X5 TO X6-1
 8280 LET O$=O$+A$(I,J)+Z$(A TO 3)
 8290 NEXT I
 8295 LET O$=O$+A$(I,J)
 8300 GO SUB 9000
 8305 LET O$=""
 8310 FOR I=X5 TO X6
 8320 LET N$=STR$ A(I,J)
 8330 LET O$=O$+N$+Z$(A TO 10-LEN N$)
 8380 LET O$=O$+" "
 8390 NEXT I
 8395 GO SUB 9000
 8400 NEXT J
 8410 RETURN 
 8600 IF X-1<1 THEN LET X5=1: GO TO 8615
 8610 LET X5=X-1
 8615 IF X+1>X1 THEN LET X6=X1: GO TO 8630
 8620 LET X6=X+1
 8630 IF Y-2<1 THEN LET Y5=1: GO TO 8650
 8640 LET Y5=Y-1
 8650 IF Y+3>Y1 THEN LET Y6=Y1: GO TO 8670
 8660 LET Y6=Y+3
 8670 GO TO 8246
 8700 DIM E$(2)
 8710 LET E1=INT ((X+I)/H)
 8720 LET E2=X+I-E1*H
 8730 LET E$(A)=CHR$ (E1+48)
 8740 LET E$(2)=CHR$ (E2+48)
 8750 RETURN 
 8800 FLASH 1: PRINT AT H,H;">CALCULATING"
 8810 FLASH 0: RETURN 
 8900 PRINT AT U,Z;"INVALID ENTRY": BEEP .5,6: RETURN 
 9000 LPRINT O$: RETURN 
 9100 INVERSE 1: RETURN 
 9200 INVERSE 0: RETURN 
 9300 LET CELM=1008: LET FUNL=80: LET FUNM=150: RETURN 
 9997 SAVE "SCREEN" LINE 9998
 9998 LET I=0
 9999 GO TO 10
    1 LET z=0
    2 CLEAR 
    5 LET S$="SAV NAME"
    8 LET I=-1
   10 LET I1=2
   11 LET Z=0
   12 LET A=1
   13 LET FC1=0: LET FF=0
   14 LET H=10
   15 LET K=11
   16 LET T=20
   17 LET U=21
   20 LET J1=A
   21 INK 4
   22 PAPER 0
   23 CLS 
   24 BORDER 0
   25 GO SUB 9300
   30 LET M=A
   40 DIM Y$(8)
   50 LET Z$="                                "
   70 LET M$="████████████████████████████████"
  270 PRINT AT 0,0;Z$
  290 IF I<Z THEN GO TO 350
  300 PRINT AT U,Z;"NEW OR OLD"
  302 POKE 23658,8
  305 PRINT AT H,H;"SCREEN-CALC"
  306 PRINT AT K,Z;" © COPYRIGHT 1983 BANTASOFTWARE"
  307 PRINT TAB 7;"ALL RIGHTS RESERVED"
  310 PAUSE 0
  315 LET K$=INKEY$
  320 IF K$="N" THEN GO TO 2
  330 IF K$="O" THEN GO TO 1000
  340 GO TO 310
  350 CLS 
  360 LET FC=Z
  370 PRINT ,,"SIZE(MAX ";CELM;"):"
  380 LET A$=""
  390 PRINT AT A,17;A$;">"
  410 LET B$="     "
  430 LET K$=INKEY$
  440 IF K$=CHR$ 13 THEN GO TO 500
  450 PAUSE 6
  460 IF K$="" THEN GO TO 390
  465 PRINT AT U,Z;Z$
  470 LET A$=A$+K$
  480 GO TO 390
  500 LET C=Z
  508 PRINT AT A,17;"           "
  510 IF LEN A$<3 THEN GO TO 540
  520 IF A$(2)="X" THEN LET C=2
  530 IF A$(3)="X" THEN LET C=3
  540 IF C=Z THEN PRINT AT 21,Z;"BAD INPUT"
  550 IF C=Z THEN GO TO 380
  560 LET X1=VAL A$(A TO C-A)
  570 LET Y1=VAL A$(C+A TO LEN A$)
  580 IF X1*Y1<=CELM AND X1*Y1>Z THEN GO TO 600
  585 PRINT AT U,Z;"BAD SIZE, TRY AGAIN"
  590 GO TO 380
  600 PRINT AT A,16;A$,"OK?"
  620 PAUSE 0
  660 IF INKEY$="N" THEN GO TO 350
  665 IF INKEY$<>"Y" THEN GO TO 620
  666 GO SUB 8800
  670 LET MA=X1
  680 IF MA*Y1>CELM-Y1 THEN GO TO 720
  690 LET MA=MA+A
  700 GO TO 680
  720 DIM A$(MA,Y1,8)
  725 DIM A(MA,Y1)
  730 DIM F$(FUNM,FUNL+2)
  740 DIM P$(MA,Y1)
  750 FOR I=A TO MA
  760 FOR J=A TO Y1
  770 LET P$(I,J)=CHR$ Z
  780 NEXT J
  790 NEXT I
  800 LET INS=Z
  810 LET CLER=Z
  820 DIM X$(A)
 1040 LET X=A
 1050 LET Y=A
 1060 LET BOX=Z
 1070 CLS 
 1200 IF x$="A" THEN GO TO 1212
 1202 PRINT X1;"X";Y1;TAB 11;S$;TAB 21;"FC=";FC
 1203 PRINT AT A,Z;M$;"██ ";TAB 9;"▌ ▌";TAB  T;"▌ ▌";TAB 30;"██"
 1204 FOR I=-A TO A
 1205 GO SUB 8700
 1206 REM 
 1207 REM 
 1208 REM 
 1209 REM 
 1210 INVERSE 1: PRINT AT A,K*I+14;E$: INVERSE 0
 1211 NEXT I
 1212 FOR I=-I1 TO I1+A
 1214 LET Y3=I+Y
 1215 IF Y3>Y1 OR Y3<=Z THEN GO TO 1260
 1216 DIM E$(2)
 1217 LET E1=INT (Y3/H)
 1218 LET E2=Y3-E1*H
 1219 LET E$(A)=CHR$ (E1+48)
 1220 LET E$(2)=CHR$ (E2+48)
 1221 PRINT AT I*3+8,Z;
 1222 INVERSE 1
 1223 IF I=-I1 THEN PRINT E$;AT 2,30;E$
 1224 INVERSE 0
 1225 IF I=-I1 THEN PRINT AT 2,Z
 1226 IF INS=A THEN PRINT AT 8,Z

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

Scroll to Top