home *** CD-ROM | disk | FTP | other *** search
- 10 REM ************************
- 20 REM * *
- 30 REM * SPREADSHEET *
- 40 REM * BY ROBERT T. YUILLE *
- 50 REM * COPYRIGHT (C) 1989 *
- 60 REM * APPLEDISK & *
- 70 REM * MICROSPARC, INC. *
- 80 REM * *
- 90 REM ************************
- 100 REM INIZIALIZZAZIONE
- 110 G = PEEK( -16298)
- 120 POKE 8,0: POKE 9,0: REM NEWF & PRNTF
- 130 D$ = CHR$(4):B$ = CHR$(7):E$ = CHR$(27):R$ = CHR$(13)
- 140 Q$ = CHR$(17):ST = 6:DR = 1:PR$ = "":FL$ = "SPREADSHEET.OBJ"
- 150 FADDR = 12299: REM FILENAME ($300B)
- 160 BF = 17220: REM SSIDCODE($4344)
- 170 TEXT : HOME : PRINT E$Q$: POKE 2043,255: VTAB 5: NORMAL
- 180 PRINT : PRINT " SPREADSHEET"
- 190 PRINT : PRINT " DI ROBERT T. YUILLE"
- 200 PRINT : PRINT " COPYRIGHT (C) 1989 "
- 210 PRINT : PRINT " BY APPLEDISK "
- 220 GOSUB 2240
- 230 :
- 240 REM REGOLA HIMEM
- 250 :
- 260 PD = PEEK(48896) = 76: ON PD GOTO 280
- 270 HIMEM: 11264:D$ = R$ +D$: GOTO 340
- 280 POKE 768,32: POKE 769,248: POKE 770,190: POKE 771,169
- 290 POKE 772,106: POKE 773,32: POKE 774,245: POKE 775,190
- 300 POKE 776,96: CALL 768
- 310 :
- 320 REM LOAD SS OBJECT FILE
- 330 :
- 340 ONERR GOTO 2700
- 350 LK = 1: PRINT D$"BLOAD SPREADSHEET.OBJ"
- 360 POKE 216,0: REM AZZERA IL FLAG DEGLI ERRORI
- 370 :
- 380 REM INIZIALIZZA E LEGGE I DATI DEL MENU
- 390 :
- 400 READ MITEMS: FOR J = 0 TO MITEMS: READ MENU$(J): NEXT
- 410 DIM X$(1):X$(0) = " ":X$(1) = "-->"
- 420 :
- 430 REM MENU PRINCIPALE
- 440 :
- 450 TEXT : HOME : GOSUB 2400: ONERR GOTO 2480
- 460 PX = 38:SX = 4:SE = SE +(SE = 0):MX = MITEMS: GOSUB 2320: IF Z = 20 THEN PRINT B$: GOTO 450
- 470 ON SE GOTO 510,660,840,1060,1110,1160,1520,1690
- 480 :
- 490 REM NUOVO DOCUMENTO
- 500 :
- 510 IF PEEK(8) = 1 THEN GOSUB 2180: IF ESCF = 1 THEN 450
- 520 GOSUB 1780: IF ESCF = 1 THEN 450
- 530 POKE 8,0: REM SET NEWF FOR NEW FILE
- 540 HOME
- 550 PRINT
- 560 PRINT CHR$(4)"PR#3": PRINT
- 570 ONERR GOTO 2630
- 580 CALL 12288: REM ENTRY ($3000)
- 590 PRF = PEEK(9): IF PRF = 3 THEN 560
- 600 IF PRF = 0 THEN 620
- 610 POKE 35,23: GOTO 570
- 620 PRINT E$Q$: POKE 2043,255: GOTO 450
- 630 :
- 640 REM CARICA NUOVO DOCUMENTO
- 650 :
- 660 IF PEEK(8) = 1 THEN GOSUB 2180: IF ESCF = 1 THEN 450
- 670 GOSUB 1780: IF ESCF = 1 THEN 450
- 680 POKE 8,0: FOR N = 0 TO 4: POKE (BF +N),0: NEXT
- 690 HTAB 1: VTAB 21: PRINT "STO CARICANDO "FL$
- 700 LK = 2: ONERR GOTO 2480
- 710 PRINT D$"BLOAD "FL$",A$4344"
- 720 SSIDF = 0: FOR N = 0 TO 4 STEP 2
- 730 IF PEEK(BF +N) = 255 THEN NEXT : GOTO 750
- 740 SSIDF = 1:N = 4: NEXT
- 750 FOR N = 1 TO 3 STEP 2
- 760 IF PEEK(BF +N) = 0 THEN NEXT : GOTO 780
- 770 SSIDF = 1:N = 3: NEXT
- 780 POKE 216,0: IF SSIDF = 1 THEN MSG$ = "IL FILE (" +FL$ +") NON E'" +R$ +"UN FILE SPREADSHEET": HOME : GOSUB 2130: GOTO 670
- 790 POKE 8,1: REM SET NEWF FOR LOADED FILE
- 800 GOTO 540
- 810 :
- 820 REM SALVA IL DOCUMENTO CORRENTE
- 830 :
- 840 HOME : IF PEEK(8) = 0 THEN MSG$ = "QUESTO NON E' UN DOCUMENTO CORRENTE": GOSUB 2130: GOTO 450
- 850 EF = 256 * PEEK(251) + PEEK(250): REM MP ($FA)
- 860 LN = EF -BF +1
- 870 ONERR GOTO 960
- 880 PRINT D$"VERIFY "FL$
- 890 HOME : VTAB 5: PRINT "IL FILE: ("FL$") ESISTE GIA'"
- 900 VTAB 13: PRINT "PREMI 'S' PER SOSTITUIRE IL FILE": PRINT : PRINT "PREMI 'N' PER RINOMINARE": VTAB 10: PRINT "VUOI SOSTITUIRE IL ": PRINT "FILE ESISTENTE: (S/N)? ";
- 910 GET A$
- 920 IF A$ = "N" OR A$ = "n" THEN POKE 216,0: GOTO 1000
- 930 IF A$ < >"S" AND A$ < >"s" THEN GOTO 910
- 940 LK = 2: ONERR GOTO 2480
- 950 PRINT D$"DELETE "FL$
- 960 HTAB 1: VTAB 21: PRINT "STO SALVANDO "FL$
- 970 LK = 2: ONERR GOTO 2480
- 980 PRINT D$"BSAVE "FL$",A$4344,L"LN
- 990 POKE 216,0: GOTO 450
- 1000 GOSUB 1780: IF ESCF = 1 THEN 450
- 1010 GOTO 870
- 1020 :
- 1030 REM RINOMINA IL DOCUMENTO CORRENTE
- 1040 :
- 1050 IF PEEK(8) = 0 THEN 840
- 1060 GOSUB 1780: IF ESCF = 1 THEN 450
- 1070 GOTO 540
- 1080 :
- 1090 REM CONTINUA CON IL DOCUMENTO CORRENTE
- 1100 :
- 1110 IF PEEK(8) = 0 THEN 840
- 1120 GOTO 540
- 1130 :
- 1140 REM CAMBIA PREFIX/SLOT E DRIVE
- 1150 :
- 1160 HOME : PRINT "CONFIGURAZIONE CORRENTE:"
- 1170 PRINT : IF PD = 1 THEN PRINT "PREFIX= "PR$: GOTO 1190
- 1180 PRINT "SLOT= "ST" DRIVE= "DR
- 1190 PRINT : PRINT "PREMI IL NUMERO DELLA VOCE CHE VUOI"
- 1200 PRINT "CAMBIARE O <ESCAPE> PER RITORNARE AL": PRINT "MENU PRINCIPALE"
- 1210 PRINT : PRINT : HTAB 10: PRINT "1. DRIVE"
- 1220 PRINT : HTAB 10: PRINT "2. SLOT"
- 1230 IF PD = 0 THEN 1250
- 1240 PRINT : HTAB 10: PRINT "3. PREFIX"
- 1250 PRINT : PRINT : HTAB 10: PRINT "SCEGLI? ";
- 1260 GET A$
- 1270 IF A$ = E$ THEN 450
- 1280 ON VAL(A$) GOTO 1310,1410
- 1290 IF A$ = "3" AND PD = 1 THEN 1460
- 1300 GOTO 1260
- 1310 HOME
- 1320 VTAB 14: PRINT "QUALE DRIVE? (1/2) ";
- 1330 GET A$
- 1340 IF A$ = "1" OR A$ = "2" THEN PRINT A$:DR = VAL(A$): GOTO 1360
- 1350 GOTO 1330
- 1360 LK = 3: ONERR GOTO 2480
- 1370 ON PD GOTO 1390
- 1380 PRINT D$"VERIFY CHGSD,S"ST",D"DR: GOTO 450
- 1390 PRINT D$"PREFIX ,S"ST",D"DR: POKE 216,0
- 1400 PRINT D$"PREFIX": INPUT PR$: GOTO 450
- 1410 HOME : VTAB 10: PRINT "QUALE SLOT? (2-7) ";
- 1420 ON PD GOTO 1430: HOME : VTAB 10: PRINT "QUALE SLOT? (3-6) ";
- 1430 GET A$
- 1440 IF A$ = > CHR$(51 -PD) AND A$ < = CHR$(54 +PD) THEN PRINT A$:ST = VAL(A$): GOTO 1320
- 1450 GOTO 1430
- 1460 HOME : VTAB 8: PRINT "CONTROLLA CHE IL PREFIX": PRINT "INIZI E FINISCA CON /": VTAB 11: INPUT "PREFIX ";PR$
- 1470 LK = 3: ONERR GOTO 2480
- 1480 PRINT D$"PREFIX "PR$: POKE 216,0: GOTO 450
- 1490 :
- 1500 REM HELP SCREEN
- 1510 :
- 1520 PRINT D$"PR#3"
- 1530 PRINT
- 1540 HOME : HTAB 34: PRINT "AIUTO"
- 1550 PRINT : HTAB 6: PRINT "<ESCAPE> - Esegue il comando": PRINT "Indicato nella prima linea in alto sullo Schermo"
- 1560 PRINT : PRINT "TASTI FRECCIA- Muove il Cursore sulle Celle"
- 1570 PRINT : HTAB 3: PRINT "<CTRL>-A - Commuta tra Calcolo Automatico e Manuale"
- 1580 PRINT : HTAB 3: PRINT "<CTRL>-B - Cancella il contenuto della Cella Corrente"
- 1590 PRINT : HTAB 3: PRINT "<CTRL>-C - Esegue il Calcolo dello Spreadsheet"
- 1600 PRINT : HTAB 3: PRINT "<CTRL>-D - Cancella la Riga o Colonna Corrente"
- 1610 PRINT : HTAB 3: PRINT "<CTRL>-F - Commuta tra Formato Decimale e Intero dei numeri"
- 1620 PRINT : HTAB 3: PRINT "<CTRL>-I - Inserisce una Riga o Colonna prima di quella Corrente"
- 1630 PRINT : HTAB 3: PRINT "<CTRL>-P - Invia alla Stampante i dati presenti sul Video"
- 1640 PRINT : HTAB 3: PRINT "<CTRL>-W - Entra nel Modo Larghezza Colonne"
- 1650 GOSUB 2240: GOTO 620
- 1660 :
- 1670 REM QUIT
- 1680 :
- 1690 HOME : VTAB 10: PRINT "SIE SICURO DI VOLER FINIRE (S/N)? ";
- 1700 GET A$
- 1710 IF A$ = "S" OR A$ = "s" THEN 1740
- 1720 IF A$ = "N" OR A$ = "n" THEN 450
- 1730 GOTO 1700
- 1740 TEXT : HOME : PRINT CHR$(21): PRINT CHR$(4)"RUN APDSK": END
- 1750 :
- 1760 REM FILENAME INPUT ROUTINE
- 1770 :
- 1780 HOME :N$ = "":ESCF = 0
- 1790 HTAB 1: VTAB 2: PRINT "SCRIVI IL NOME DEL DOCUMENTO": PRINT : PRINT
- 1800 PRINT "PREMI '?' PER IL CATALOG": PRINT
- 1810 PRINT "<ESCAPE> = PRIMO CARATTERE RIPORTA AL": PRINT "MENU PRINCIPALE": PRINT
- 1820 PRINT "<ESCAPE> NEI CARATTERI SEGUENTI": PRINT " CANCELLA I DATI INSERITI": PRINT
- 1830 PRINT "FRECCIA SINISTRA RITORNA DI UNA": PRINT "POSIZIONE": PRINT
- 1840 PRINT "<RETURN> ACCETTA L'INPUT"
- 1850 VTAB 17: PRINT "NOME FILE: ";
- 1860 GET C$: IF C$ = CHR$(8) THEN 1860
- 1870 IF C$ = E$ THEN 450
- 1880 IF C$ < >"?" THEN 1910
- 1890 LK = 4: ONERR GOTO 2480
- 1900 PRINT D$ LEFT$("CATALOG",7 -4 *PD): GOSUB 2240: GOTO 1780
- 1910 AN = PEEK(49152)
- 1920 IF AN >96 AND AN <123 THEN AN = AN -32
- 1930 IF AN <65 OR AN >90 THEN MSG$ = "IL PRIMO CARATTERE DEVE ESSERE UNA LETTERA ": GOSUB 2130: GOTO 1780
- 1940 PRINT CHR$(AN):N$ = CHR$(AN)
- 1950 FOR K = 1 TO 15
- 1960 VTAB 17: HTAB (12 +K): GET C$
- 1970 IF C$ = E$ THEN K = 15: NEXT : GOTO 1780
- 1980 IF C$ = CHR$(8) AND K = 1 THEN K = 15: NEXT : GOTO 1790
- 1990 IF C$ = CHR$(8) THEN K = K -1: HTAB (12 +K): PRINT " ":N$ = LEFT$(N$,K): GOTO 1960
- 2000 IF C$ = R$ THEN K = 15: GOTO 2050
- 2010 AN = PEEK(49152)
- 2020 IF AN >96 AND AN <123 THEN AN = AN -32
- 2030 IF (AN <65 OR AN >90) AND (AN <48 OR AN >57) AND AN < >46 THEN MSG$ = "CARATTERE NON UTILIZZABILE NEL NOME": GOSUB 2130: GOTO 1960
- 2040 PRINT CHR$(AN):N$ = N$ + CHR$(AN)
- 2050 NEXT
- 2060 IF C$ < >R$ THEN MSG$ = "NOME FILE TROPPO LUNGO - MAX 15 CAR.": GOSUB 2130: GOTO 1780
- 2070 FL$ = N$
- 2080 FOR I = 0 TO 15: POKE FADDR +I,0: NEXT
- 2090 FOR K = 1 TO LEN(N$): POKE FADDR -1 +K, ASC( MID$ (N$,K,1)) +128: NEXT : RETURN
- 2100 :
- 2110 REM STAMPA MESSAGGI ERRORE
- 2120 :
- 2130 PRINT B$: HTAB 1: VTAB 19: PRINT MSG$: PRINT : PRINT
- 2140 PRINT "PREMI <RETURN> E RIPROVA: ";: GET A$: HTAB 1: VTAB 19: CALL -958: RETURN
- 2150 :
- 2160 REM CANCELLI IL DOCUMENTO CORRENTE?
- 2170 :
- 2180 HOME :ESCF = 0: VTAB 8: PRINT "STAI PER CANCELLARE": PRINT "IL DOCUMENTO CORRENTE."
- 2190 VTAB 12: PRINT "SEI SICURO DI VOLER": PRINT "FARE CIO' (S/N) ";
- 2200 GET A$
- 2210 IF A$ = "N" OR A$ = "n" THEN ESCF = 1: RETURN
- 2220 IF A$ = "S" OR A$ = "s" THEN RETURN
- 2230 GOTO 2200
- 2240 HTAB 1: VTAB 24: PRINT "PREMI <RETURN> PER CONTINUARE: ";: GET A$: RETURN
- 2250 :
- 2260 REM DATA PER IL MENU PRINCIPALE
- 2270 :
- 2280 DATA 8,MENU PRINCIPALE,NUOVO DOCUMENTO,CARICA DOCUMENTO,SALVA DOCUMENTO CORRENTE,RINOMINA DOCUMENTO CORRENTE,CONTINUA CON DOCUMENTO CORR.,CAMBIA PREFIX/SLOT/DRIVE,AIUTO,FINE
- 2290 :
- 2300 REM MENU HANDLER
- 2310 :
- 2320 SL = SE
- 2330 N = SL:OS = SL: GOSUB 2360:Z = 0: VTAB 24: HTAB PX: CALL -868: POKE -16368,0
- 2340 VTAB 24: HTAB PX: PRINT SL;: WAIT -16384,128:Z = PEEK( -16384) -128: IF Z > = 49 AND Z < = MX +48 THEN SL = Z -48:N = OS: GOSUB 2360: GOTO 2330
- 2350 Z = (Z = 21 OR Z = 10) -(Z = 8 OR Z = 11) +10 *(Z = 13) +20 *(Z = 27): ON NOT Z GOTO 2340:SL = SL +Z *(Z <10):SL = SL -MX *(SL >MX) +MX *(SL <1):N = OS: GOSUB 2360: ON Z <10 GOTO 2330:SE = SL: POKE -16368,0: RETURN
- 2360 VTAB 3 +2 *N: HTAB SX: PRINT X$(SL = OS);: RETURN
- 2370 :
- 2380 REM PRINT A MENU
- 2390 :
- 2400 HOME :TL$ = MENU$(0)
- 2410 VTAB 2: HTAB INT((40 - LEN(TL$))/2): PRINT TL$
- 2420 FOR I = 1 TO MITEMS: VTAB 3 +2 *I: HTAB 8: PRINT I". "MENU$(I): NEXT
- 2430 VTAB 24: HTAB 1: PRINT "USA FRECCE/NUMERI E PREMI RETURN";
- 2440 RETURN
- 2450 :
- 2460 REM ERRORI DISCO
- 2470 :
- 2480 HOME : VTAB 10: POKE 216,0:EN = PEEK(222):EL = PEEK(218) +256 * PEEK(219)
- 2490 IF EN = 6 AND EL = 1400 THEN CALL -3288: GOTO 450
- 2500 IF (EN = 6 OR EN = 7) AND LK = 3 THEN MSG$ = "IL PREFIX NON ESISTEFOUND":PR$ = "": GOTO 2590
- 2510 IF (EN = 6 OR EN = 7) AND LK = 4 THEN MSG$ = "I/O ERROR": GOTO 2590
- 2520 IF EN = 3 THEN MSG$ = "NESSUN APPARECCHIO IN SLOT":ST = 6: GOTO 2590
- 2530 IF EN = 6 OR EN = 7 THEN MSG$ = "FILE (" +FL$ +")" +R$ +"NON E' SU QUESTO DISCO.": GOTO 2590
- 2540 IF EN = 8 THEN MSG$ = "I/O ERROR": GOTO 2590
- 2550 IF EN = 13 THEN MSG$ = "FILE (" +FL$ +")" +R$ +"NON E' UN FILE BINARIO.": GOTO 2590
- 2560 IF EN = 9 OR EN = 17 THEN MSG$ = "DISCO O DIRECTORY COMPLETA.": GOTO 2590
- 2570 IF EN = 10 THEN MSG$ = "IL FILE (" +FL$ +") E' BLOCCATO.": GOTO 2590
- 2580 PRINT "UN ERRORE N."EN" E' AVVENUTO": PRINT "ALLA LINEA N."EL:MSG$ = "":LK = 2
- 2590 GOSUB 2130: CALL -3288: ON LK GOTO 340,450,1160,1780
- 2600 :
- 2610 REM FORMULA EVALUATION ERRORS
- 2620 :
- 2630 POKE 216,0: POKE 1403,0: VTAB 24: CALL -868
- 2640 IF PEEK(222) = 16 THEN PRINT "ERRORE DI SINTASSI IN CELLA: ";
- 2650 IF PEEK(222) = 53 THEN PRINT "QUANTITA' ILLEGALE IN CELLA: ";
- 2660 IF PEEK(222) = 69 THEN PRINT "NUMERO TROPPO GRANDE IN CELLA: ";
- 2670 IF PEEK(222) = 133 THEN PRINT "DIVISIONE PER ZERO IN CELLA :";
- 2680 PRINT CHR$( PEEK(238)); PEEK(239)" - PREMI <RETURN> E CORREGGI LA FORMULA ";
- 2690 GET A$: CALL -3288: GOTO 540
- 2700 HOME : PRINT "NON TROVO IL FILE SPREADSHEET.OBJ": VTAB 23: END