10 ' SPREADSHEET dated : 20-06-87 20 OPTION RUN:z1=10:s1=1 30 m2$="#####.##":y1=FIX(85/z1) 40 DIM b$(25,y1),b(25,y1) 50 esc$=CHR$(27) 60 inv$=esc$+"p":norm$=esc$+"q":con$=esc$+"e":coff$=esc$+"f":bs$=esc$+"D" 70 savcur$=esc$+"j":rescur$=esc$+"k":cleol$=esc$+"K":cls$=esc$+"H"+esc$+"E" 80 DELETE 20010-34999,90 90 DELETE 60010-64999,110 110 GOSUB 5000 1000 ' Draw Spreadsheet 1010 PRINT esc$"E"esc$"H"; 1020 PRINT" "; 1030 FOR x1=65 TO y1+63:PRINT CHR$(x1);SPACE$(z1-1);:NEXT:PRINT CHR$(x1) 1040 PRINT" "CHR$(134)STRING$(y1*z1,CHR$(138))CHR$(140) 1050 FOR x1=1 TO 25:PRINT FN loc$(2+x1,1);:PRINT USING "##";x1;:PRINT" ";CHR$(133):PRINT FN loc$(2+x1,5+y1*z1);CHR$(133):NEXT 1060 PRINT FN loc$(28,4)CHR$(131)STRING$(y1*z1,CHR$(138))CHR$(137) 1070 IF lo2=1 THEN PRINT FN loc$(30,20)"Loading file "UPPER$(fl$)" from disk" 1080 IF lo2=1 THEN 17060 2000 ' Position Cursor 2010 r1=1:c1=1:r2=1:c2=1 2020 PRINT FN loc$(30,1)cleol$:GOSUB 4160:PRINT FN cell$(r1,c1); 2030 p1$=INPUT$(1):p1=ASC(p1$) 2035 IF p1=3 THEN PRINT FN com$("Are you Sure (Y/N)? ");:LINE INPUT;z$:IF UPPER$(z$)<>"Y" THEN 2020 ELSE OPTION STOP:PRINT cls$:END 2040 IF p1=186 THEN GOSUB 16010:GOTO 2020 2050 IF p1=190 THEN GOTO 17010 2060 IF p1=9 THEN GOSUB 4220:IF z1$="" THEN 2020 ELSE ERASE b$,b:GOTO 30 2070 IF p1=165 THEN GOSUB 18000:GOTO 2020 2080 IF p1=164 THEN GOSUB 19000:GOTO 2020 2090 IF p1=18 THEN GOSUB 60000:GOTO 2020 2100 IF p1=3 THEN PRINT FN loc$(30,0);:END 2110 IF p1=8 THEN 2240 2120 IF p1=28 AND s1=0 THEN s1=1:GOTO 2020 ELSE IF p1=28 AND s1=1 THEN s1=0:GOTO 2020 2130 IF p1=6 THEN c1=c1+1:IF c1>y1 THEN c1=1:r1=r1-(r1<=24):GOTO 2020 ELSE 2020 2140 IF p1=1 THEN c1=c1-1:IF c1<1 THEN c1=y1:r1=r1+(r1>1):GOTO 2020 ELSE 2020 2150 IF p1=23 THEN GOSUB 4100:GOTO 2250 2160 IF p1=13 THEN in1$="#=":c1$="Numeric":i1=3:GOSUB 6040:GOTO 2250 2170 IF p1=30 THEN r1=r1-(r1<=24):GOTO 2020 2180 IF p1=31 THEN r1=r1+(r1>1):GOTO 2020 2190 IF p1=29 THEN c1$="Find ¬": GOSUB 6000:GOSUB 4170:GOTO 2020 2200 IF p1=27 AND e1=0 THEN 2220 ELSE IF p1=27 THEN e1=0:GOTO 2240 2210 IF p1<32 OR p1=127 THEN PRINT CHR$(7);:GOTO 2020 2220 IF p1=35 OR LEFT$(b$(r1,c1),1)="#" THEN c1$="Numeric" ELSE IF LEFT$(b$(r1,c1),1)="¦" THEN c1$="Basic " ELSE c1$="Textual" 2230 IF p1=166 THEN c1$="Basic " 2240 GOSUB 6000 2250 b$(r1,c1)=in1$:m1$(0)=in1$ 3000 ' Calculate and Print Routine 3010 IF lo2=1 AND in1$="" THEN 3270 3020 co1=0:br1$=RIGHT$(STR$(r1),LEN(STR$(r1))-1):bc1$=RIGHT$(STR$(c1),LEN(STR$(c1))-1):lin1$="3"+RIGHT$("0"+br1$,2)+RIGHT$("0"+bc1$,2)+" ":lin2$="6"+RIGHT$(lin1$,5) 3030 IF in1$="¦" OR in1$="#" OR in1$="#=" THEN GOTO 2020 3050 IF LEFT$(b$(r1,c1),1)="¦" THEN pr1=0:co1=1:buf1$=in1$:lin1$="6"+RIGHT$(lin1$,5):GOTO 3160 3060 IF LEFT$(b$(r1,c1),1)<>"#" THEN b$(r1,c1)=LEFT$(b$(r1,c1)+SPACE$(20),z1):PRINT FN cell$(r1,c1);b$(r1,c1):IF b(r1,c1)<>0 THEN OPEN "O",1,"m:temp.fil":PRINT #1,lin1$" '"CHR$(13)lin2$" '":PRINT FN cell$(r1,c1);b$(r1,c1):b(r1,c1)=0:GOTO 3210 ELSE 3260 3070 eq1=2:ll2$=LOWER$(b$(r1,c1)):ll2=LEN(ll2$):IF ll2>1 THEN IF MID$(ll2$,2,1)="=" THEN buf1$="b("+br1$+","+bc1$+")":buf1$=buf1$+" = ":pr1=1:GOTO 3090 ELSE IF ll2>1 THEN eq1=INSTR(ll2$,"="):IF eq1=0 THEN ERROR 99 3080 buf1$="":pr1=0:eq1=1 3090 FOR x1=eq1+1 TO ll2 3100 IF x1>ll2 THEN 3150 3110 GOSUB 4070 3120 IF b2=63 THEN buf1$=buf1$+STR$(r1):GOTO 3150 3130 IF b2=33 THEN b2=c1+96:b2$=CHR$(b2) 3140 IF b2<97 OR b2>122 THEN buf1$=buf1$+b2$ ELSE GOSUB 4010 3150 NEXT 3160 IF lo2=0 THEN OPEN "O",1,"m:temp.fil" 3170 PRINT #1,lin1$;buf1$;:IF pr1>0 THEN PRINT #1," :r3=";r1;":c3=";c1;":gosub 8000" ELSE PRINT #1 3200 IF lo2=1 THEN 3270 3210 CLOSE #1 3220 CHAIN MERGE "m:temp.fil",3230,ALL 3230 GOSUB 5000 3240 GOSUB 20000:GOSUB 20000:GOSUB 60000 3250 IF lo2=1 THEN lo2=0 3260 GOSUB 5000:IF s1=1 THEN 2020 3270 c1=c1+1:IF c1>y1 THEN c1=1:r1=r1-(r1<=24) 3280 IF lo2=1 THEN 17100 3290 GOTO 2020 4000 ' General Purpose Subroutines 4010 b3$=b2$:x1=x1+1:IF x1>ll2 THEN buf1$=buf1$+b3$:GOTO 4060 ELSE GOSUB 4070:IF (b2<48 OR b2>57) AND b2<>63 THEN buf1$=buf1$+b3$+b2$:GOTO 4060 4020 IF b2=63 THEN b2=r1:b2$=STR$(b2) 4030 b3$=b3$+b2$:x1=x1+1:IF x1>ll2 THEN GOSUB 4080:GOTO 4060 ELSE GOSUB 4070:IF b2<48 OR b2>57 THEN GOSUB 4080:x1=x1-1:GOTO 4060 4040 b3$=b3$+b2$:GOSUB 4080:GOTO 4060 4050 co1=1 4060 RETURN 4070 b2$= MID$(ll2$,x1,1):b2=ASC(b2$):RETURN 4080 b4$="b(":b4$=b4$+RIGHT$(b3$,LEN(b3$)-1)+","+STR$(ASC(LEFT$(b3$,1))-96)+")" 4090 buf1$=buf1$+b4$:co1=1:RETURN 4100 PRINT FN loc$(30,1)"M "esc$"D"; 4110 j2$=INPUT$(1):j2=ASC(j2$):IF j2=13 THEN RETURN 4120 IF j2<48 OR j2>57 THEN PRINT CHR$(7);:GOTO 6280 4130 PRINT j2$; 4140 in1$=m1$(j2-48) 4150 RETURN 4160 PRINT coff$;:PRINT FN loc$(r2+2,0);:PRINT USING "##";r2:PRINT FN loc$(r1+2,0)inv$;:PRINT USING "##";r1;:PRINT norm$:r2=r1:PRINT FN loc$(0,(c2-1)*z1+5)CHR$(c2+64):PRINT FN loc$(0,(c1-1)*z1+5)inv$CHR$(c1+64)norm$:c2=c1:PRINT con$:RETURN 4170 in1$=LOWER$(in1$):in1$=RIGHT$(in1$,LEN(in1$)-1):IF in1$="#" THEN 4230 ELSE IF in1$="" THEN RETURN ELSE IF ASC(in1$)<97 OR ASC(in1$)>96+y1 THEN 4200 ELSE c1=ASC(in1$)-96 4180 in1$=RIGHT$(in1$,LEN(in1$)-1):IF VAL(in1$)<1 OR VAL(in1$)>25 THEN RETURN 4190 r1=VAL(in1$):g1=1:RETURN 4200 IF ASC(in1$)<48 OR ASC(in1$)>57 THEN RETURN ELSE in1$="x"+in1$:GOTO 4180 4210 PRINT FN loc$(30,1)cleol$" File-name you wish to "c9$" ";:LINE INPUT "";fl$:fl$=fl$+".SSS":RETURN 4220 PRINT FN loc$(30,1)cleol$"Enter number of cells horizontally... WARNING Current Spreadsheet will be lost!!! ";:LINE INPUT ;"";z1$:IF z1$="" OR VAL(z1$)=0 THEN RETURN ELSE z1=INT(85/VAL(z1$)):IF z1<8 OR z1>85 THEN PRINT CHR$(7);:GOTO 4220 ELSE RETURN 4230 IF h1=1 THEN 4270 ELSE FOR j1=1 TO 25:FOR k1=1 TO y1 4240 IF LEFT$(b$(j1,k1),1)="¦" THEN PRINT FN cell$(j1,k1)"¦" 4250 IF LEFT$(b$(j1,k1),1)="#" AND MID$(b$(j1,k1),2,1)<>"=" THEN PRINT FN cell$(j1,k1)"#" 4260 NEXT k1,j1:h1=1:RETURN 4270 FOR j1=1 TO 25:FOR k1=1 TO y1 4280 IF LEFT$(b$(j1,k1),1)="¦" OR (LEFT$(b$(j1,k1),1)="#" AND MID$(b$(j1,k1),2,1)<>"=") THEN PRINT FN cell$(j1,k1)" " 4290 NEXT k1,j1:h1=0:RETURN 5000 ' Remember after Merge 5010 DEF FN loc$(r1,c1)=esc$+"Y"+CHR$(r1+31)+CHR$(c1+31) 5020 DEF FN cell$(r1,c1)=esc$+"Y"+CHR$(r1+33)+CHR$((c1-1)*z1+36) 5023 DEF FN nor$(r1,c1,c9$)=esc$+"Y"+CHR$(r1+33)+CHR$((c1-1)*z1+36)+c9$ 5025 DEF FN rev$(r1,c1,c9$)=inv$+esc$+"Y"+CHR$(r1+33)+CHR$((c1-1)*z1+36)+c9$+norm$ 5027 DEF FN fl1$(r1,c1,c9$)=inv$+esc$+"Y"+CHR$(r1+33)+CHR$((c1-1)*z1+36)+c9$+norm$+CHR$(7)+CHR$(7)+CHR$(7)+esc$+"Y"+CHR$(r1+33)+CHR$((c1-1)*z1+36)+c9$+CHR$(7)+CHR$(7) 5029 DEF FN fl2$(r1,c1,c9$)=inv$+esc$+"Y"+CHR$(r1+33)+CHR$((c1-1)*z1+36)+c9$+norm$+CHR$(7)+CHR$(7)+CHR$(7)+esc$+"Y"+CHR$(r1+33)+CHR$((c1-1)*z1+36)+c9$+CHR$(7)+CHR$(7)+inv$+esc$+"Y"+CHR$(r1+33)+CHR$((c1-1)*z1+36)+c9$ 5030 DEF FN com$(c1$)=esc$+"Y"+CHR$(30+31)+CHR$(35)+c1$+" "+esc$+"K" 5040 ON ERROR GOTO 15000 5050 RETURN 6000 ' Line Editor 6010 en1=0:IF p1=27 THEN in1$=b$(r1,c1):i1=1 ELSE in1$=p1$:i1=2 6020 IF p1=8 AND LEFT$(b$(r1,c1),1)="¦" THEN b(r1,c1)=1 6030 IF p1=8 THEN in1$="":GOTO 6260 6040 l2=LEN(c1$):PRINT FN com$(c1$)in1$:PRINT FN loc$(30,4+l2+i1); 6050 tg1=1:PRINT savcur$inv$:PRINT FN loc$(30,1)"In"norm$rescur$; 6060 j1$=INPUT$(1):j1=ASC(j1$):PRINT savcur$:PRINT rescur$; 6070 IF j1=13 THEN 6260 6080 IF j1=21 THEN in1$=LEFT$(in1$,i1-1):PRINT cleol$;:GOTO 6060 6090 IF j1=127 AND i1=1 THEN GOTO 6060 6100 IF j1=127 AND LEN(in1$)=0 THEN 6060 6110 IF j1=127 AND i1>1 AND i1<=LEN(in1$) THEN l1=LEN(in1$)-i1+1:jl1$=LEFT$(in1$,i1-2):jr1$=RIGHT$(in1$,l1):in1$=jl1$+jr1$:i1=i1-1:PRINT rescur$bs$jr1$cleol$:PRINT FN loc$(30,4+l2+i1);:GOTO 6060 6120 IF j1=127 THEN i1=i1+(i1>2):l1=LEN(in1$)-1:in1$=LEFT$(in1$,l1):PRINT esc$"D"cleol$;:GOTO 6060 6130 IF j1=8 THEN in1$=b$(r1,c1):GOTO 6260 6140 IF j1=23 THEN 6270 6150 IF j1=29 AND en1=1 THEN i1=1:en1=0:GOTO 6040 ELSE IF j1=29 AND en1=0 THEN en1=1:i1=LEN(in1$)+1:GOTO 6040 6160 IF j1=6 THEN i1=i1-(i1<=LEN(in1$)):PRINT FN loc$(30,4+l2+i1);:GOTO 6060 6170 IF j1=1 THEN i1=i1+(i1>1):PRINT FN loc$(30,4+l2+i1);:GOTO 6060 6180 IF j1=7 AND i1<=LEN(in1$) THEN l1=LEN(in1$)-i1:jl1$=LEFT$(in1$,i1-1):jr1$=RIGHT$(in1$,l1):in1$=jl1$+jr1$:PRINT rescur$jr1$cleol$:PRINT FN loc$(30,4+l2+i1);:GOTO 6060 ELSE IF j1=7 THEN 6060 6190 IF j1=22 AND tg1=1 THEN tg1=0:PRINT savcur$inv$:PRINT FN loc$(30,1)"Ov"norm$rescur$;:GOTO 6060 ELSE IF j1=22 AND tg1=0 THEN tg1=1:PRINT savcur$inv$:PRINT FN loc$(30,1)"In"norm$rescur$;:GOTO 6060 6200 IF j1<32 OR p1=127 THEN PRINT CHR$(7);:GOTO 6060 6210 IF i1>=z1 AND LEFT$(c1$,1)="T" THEN in1$=in1$+j1$:S1=0:GOTO 6260 6220 IF LEN(in1$)>=75 AND LEFT$(c1$,1)<>"T" THEN PRINT rescur$CHR$(7);:GOTO 6060 6230 IF tg1=1 AND i1<=LEN(in1$) THEN jl1$=LEFT$(in1$,i1-1):l1=LEN(in1$)-i1+1:jr1$=RIGHT$(in1$,l1):in1$=jl1$+j1$+jr1$:i1=i1+1:PRINT j1$jr1$:PRINT FN loc$(30,4+l2+i1);:GOTO 6060 6240 IF tg1=0 AND i1<=LEN(in1$) THEN MID$(in1$,i1,1)=j1$:PRINT j1$;:i1=i1+1:GOTO 6060 6250 PRINT j1$;:in1$=in1$+j1$:i1=i1+1:GOTO 6060 6260 RETURN 6270 PRINT FN loc$(30,1)"M "esc$"D"; 6280 j2$=INPUT$(1):j2=ASC(j2$):IF j2=13 THEN RETURN 6290 IF j2<48 OR j2>57 THEN PRINT CHR$(7);:GOTO 6280 6300 PRINT j2$; 6310 m1$(j2-48)=in1$ 6320 GOTO 6260 8000 ' Print subroutine 8010 PRINT FN cell$(r3,c3);:PRINT USING m2$;b(r3,c3):RETURN 12000 ' Test Routine 12010 a=ASC(INPUT$(1)):PRINT a:IF a=13 THEN END ELSE GOTO 12010 15000 ' Error Routine 15010 IF ERL=3070 OR (ERL>20000 AND ERL<64999) THEN c1$="ERR "+DEC$(ERR,"###"):p1=27:e1=1:OPEN "O",1,"m:temp.fil":PRINT #1,lin1$;"'":CLOSE #1 ELSE 15040 15020 CHAIN MERGE "m:temp.fil",15030,ALL 15030 GOSUB 5000:PRINT CHR$(7):GOTO 2200 15040 IF ERL=17010 OR ERL=16010 THEN PRINT CHR$(7);:lo2=0:RESUME 2020 15050 ON ERROR GOTO 0 16000 ' Save Routine 16010 c9$="save":GOSUB 4210:OPEN "O",2,fl$ 16020 PRINT #2,z1 16030 FOR j1= 1 TO 25 16040 FOR k1=1 TO y1 16050 PRINT #2,b$(j1,k1) 16060 NEXT k1,j1 16070 CLOSE 16080 RETURN 17000 ' Recall Routine 17010 s1=0:c9$="recall":GOSUB 4210:lo2=1:OPEN "I",2,fl$:ERASE b$,b 17020 PRINT coff$; 17030 OPEN "O",1,"m:temp.fil" 17040 INPUT #2,z1 17050 GOTO 30 17060 r1=1:c1=1 17070 LINE INPUT #2,in1$ 17080 b$(r1,c1)=in1$ 17090 GOTO 3000 17100 IF EOF(2)=0 THEN 17070 17110 CLOSE 17120 PRINT con$; 17130 r1=1:c1=1:r2=1:c2=1:s1=1:GOTO 3210 18000 ' Printer driver 1 18010 m9$=m2$+SPACE$(z1-LEN(m2$)) 18020 FOR j1= 1 TO 25 18030 FOR k1=1 TO y1 18040 IF b$(j1,k1)="" OR LEFT$(b$(j1,k1),1)="¦" OR (LEFT$(b$(j1,k1),1)="#" AND MID$(b$(j1,k1),2,1)<>"=") THEN LPRINT SPACE$(z1); 18050 IF LEFT$(b$(j1,k1),2)="#=" THEN LPRINT USING m9$;b(j1,k1);:GOTO 18090 18060 IF LEFT$(b$(j1,k1),1)="¦" THEN 18090 18070 IF LEFT$(b$(j1,k1),1)="#" AND MID$(b$(j1,k1),2,1)<>"=" THEN 18090 18080 LPRINT b$(j1,k1); 18090 NEXT k1:LPRINT:NEXT j1 18100 RETURN 19000 ' Printer driver 2 19010 FOR j1= 1 TO 25 19020 FOR k1=1 TO y1 19030 x1$=b$(j1,k1) 19040 x2$=CHR$(k1+64)+DEC$(j1,"##")+" " 19050 IF x1$="" OR x1$=SPACE$(z1) THEN IF te2=0 THEN 19120 ELSE te2=0:LPRINT:GOTO 19120 19060 IF LEFT$(x1$,1)<>"#" AND LEFT$(x1$,1)<>"¦" THEN te1=1 ELSE te1=0 19070 IF te1=1 AND te2=0 THEN LPRINT x2$;x1$;:te2=1:GOTO 19120 19080 IF te1=1 AND te2=1 THEN LPRINT x1$;:GOTO 19120 19090 IF te1=0 AND te2=1 THEN LPRINT:LPRINT x2$;x1$:te2=0:GOTO 19120 19100 IF te1=0 AND te2=0 THEN LPRINT x2$;x1$ 19120 NEXT k1: IF te2=1 THEN te2=0:LPRINT 19130 NEXT j1 19140 RETURN 20000 ' Runtime Program 35000 RETURN 60000 REM 65000 RETURN 1: IF te2=1 THEN te2=0:LPRINT 19130 NEXT