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 range | Function |
|---|---|
| 1070–1490 | Main display loop and command dispatcher |
| 2000–2910 | Replace / formula display |
| 3000–3990 | Insert (text, number, function, loop, data load) |
| 4000–4130 | Jump to cell by coordinate |
| 4290–4550 | Column range clear / formula fill |
| 4700–4820 | Recalculate all cells |
| 5000–5870 | Formula evaluation engine |
| 6000–6250 | Save / load (tape) |
| 7000–7520 | Column insert / delete |
| 8000–8120 | Find cell by label text |
| 8200–8670 | Print (LPRINT) formatted report |
| 8700–8750 | Convert column number to two-character display string |
| 8800–8810 | Flash “CALCULATING” indicator |
| 8900 | Invalid-entry error beep |
| 9000–9200 | LPRINT helpers (print line, set/clear INVERSE) |
| 9300 | Constants: 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 byAfor averageC— column sum (GO SUB 5200), optionally followed byAfor averageI— 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:
| Variable | Value | Used for |
|---|---|---|
Z | 0 | Zero constant throughout |
A | 1 | One constant throughout |
H | 10 | Row 10 and divisor for column label formatting |
K | 11 | Column 11 for display layout |
T | 20 | Row 20 (menu bar row) |
U | 21 | Row 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 pressedOat 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+1and 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: aGO TO 3900is missing at the end of line 3600. - Mixed case in variable names:
x$at lines 1200 and 1430 versusX$elsewhere. On the Spectrum/TS2068, variable names are case-insensitive for numeric variables but string variable names canonically use upper case; the lowercasex$references the same variable asX$and will work correctly. - Similarly,
x6andx5at line 8225 are lowercase but refer to the same variables asX6andX5. - The program listing appears twice (lines 1–9300 are fully duplicated), which is likely a template/export artifact rather than a program feature.
Content
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.
