home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib42a.dsk
/
FEBRUARY.1992
/
PRINT.MASTER.bas
next >
Wrap
BASIC Source File
|
2023-02-26
|
17KB
|
422 lines
10 REM *************************
20 REM * PRINT MASTER *
30 REM * by Charles T. Hill *
40 REM * Copyright (C) 1992 *
50 REM * Mindcraft Publ. Corp. *
60 REM * Lincoln, MA 01773 *
70 REM *************************
80 :
90 REM INITIALIZE VARIABLES
100 ONERR GOTO 3990
110 IF PEEK(48640) < >76 THEN PRINT "PROGRAM REQUIRES PRODOS": END
120 D$ = CHR$(4): PRINT D$;"PR#3":HT = 1403:DL = 20
130 RI = 0:A = 0:RT = 0:MD$ = "":P$ = "":PL = 0
140 DIM FI$(100),L(255),BT$(128),SV$(1100),SN(1100)
150 NZ = 0:N1 = 1:N2 = 2:N3 = 3:N4 = 4:N5 = 5:N6 = 6:N8 = 8
160 NS = 32:NE = 127:NR = 178:ND = 131:NA = 64:NU = 95:NQ = 34
170 LM = 10:WL = 96:WL = WL -LM -8
180 GOTO 1100
190 :
200 REM READ LINE FROM INPUT BUFFER
210 IF B <512 THEN 250
220 RI = 1: REM SET FLAG FOR ERROR 2 AT EOF
230 PRINT D$;"READ";PI$;",B512": REM MORE
240 B = NZ:X = FRE(0)
250 A = A +N1:K = NZ:K = PEEK(38400 +B):B = B +N1
260 GOSUB 2470: REM CHECK FOR ESCAPE OR PAUSE
270 IF A = N2 AND K = NZ THEN EOF = N1: GOTO 3620: REM END OF FILE
280 IF A <N3 THEN 210: REM SKIP MEMORY BITS
290 IF A = N3 THEN LN = K: GOTO 210: REM LINE NUMBER LOW BIT
300 IF A = N4 THEN LN = LN +K *256: GOTO 210: REM LINE NUMBER
310 IF K = NZ THEN 360: REM END OF LINE
320 L(A -N5) = K: REM STORE LINE IN ARRAY
330 GOTO 210: REM GET NEXT CHARACTER
340 :
350 REM END OF LINE
360 IF PC = 6 THEN 700: REM CROSS-REFERENCE
370 IF PC < >3 THEN 400
380 VTAB 23: POKE HT,0: INVERSE : PRINT "LINE ";LN: NORMAL
390 PRINT D$;"WRITE";PW$
400 GOSUB 460: REM PRINT LINE
410 IF PC = 1 THEN GOSUB 630
420 IF PC = 3 THEN PRINT D$: REM RETURN TO SCREEN
430 A = 0: GOTO 210: REM READ NEXT LINE
440 :
450 REM PRINT LINE ROUTINE
460 IF PC = N1 THEN PRINT SPC( LM);: REM LEFT MARGIN
470 PRINT LN;" ";: REM LINE NUMBER
480 PK = NZ:LL = LEN( STR$(LN)) +N1
490 FOR I = NZ TO A -N6
500 K = L(I)
510 IF K = NS AND (PK = NR OR PK = ND) THEN 610: REM OMIT EXCESS SPACES
520 PK = K: REM STORE CHARACTER
530 IF K >NE THEN PRINT BT$(K -NE);:LL = LL + LEN(BT$(K -NE))
540 IF K > = NS AND K < = NE THEN PRINT CHR$(K);
550 IF K <NS AND PC = N1 THEN PRINT CHR$(K +NA); CHR$(N8); CHR$(NU);
560 IF K <NS AND PC = N2 THEN INVERSE : PRINT CHR$(K +NA);: NORMAL
570 IF K <NS AND PC = N3 THEN PRINT CHR$(K);
580 IF K <128 THEN LL = LL +N1
590 WW = LM + LEN( STR$(LN))
600 IF LL >WL AND PC = N1 THEN PRINT CHR$(13); SPC( WW);:LL = NZ:PL = PL +N1
610 NEXT I
620 PRINT : RETURN
630 PL = PL +1
640 IF PL >55 THEN FOR J = 1 TO (66 -PL): PRINT : NEXT :PL = 0
650 RETURN
660 :
670 REM CROSS-REFERENCE ROUTINE
680 INVERSE : PRINT "READING VARIABLES IN ";PI$: NORMAL
690 NJ = 0:A = 0: GOTO 210: REM READ LINE
700 PRINT : PRINT LN;" - ";
710 BV = 0:RM = 0:QT = 0:DT = 0:VN$ = "": REM RESET FLAGS
720 FOR I = 0 TO A -6
730 K = L(I)
740 IF RM = 1 OR QT = 1 OR DT = 1 THEN 850: REM SKIP VARIABLE
750 IF BV = 0 AND K <65 THEN 840: REM NOT INITIAL LETTER
760 IF K = 36 OR K = 37 OR K = 40 THEN 810: REM $ OR % OR (
770 IF K <48 OR K >122 THEN 840: REM NOT LETTER OR NUMBER
780 IF K >57 AND K <65 THEN 840: REM NOT LETTER OR NUMBER
790 IF K >90 AND K <97 THEN 840: REM NOT LETTER OR NUMBER
800 BV = 1: REM LETTER FOUND
810 VN$ = VN$ + CHR$(K)
820 IF K = 40 OR I = A -6 THEN 840
830 GOTO 900: REM NEXT
840 IF BV >0 THEN GOSUB 950: REM STORE VARIABLE
850 IF K = NR THEN RM = N1: GOTO 900: REM REM STATEMENT
860 IF K = ND THEN DT = N1: GOTO 900: REM DATA STATEMENT
870 IF K = NQ AND QT = NZ THEN QT = N1: GOTO 900: REM BEGIN QUOTE
880 IF K = NQ AND QT = N1 THEN QT = NZ: GOTO 900: REM END QUOTE
890 IF K = 58 THEN DT = NZ: GOTO 900: REM COLON ENDS DATA
900 NEXT I
910 IF NJ >1000 THEN 3680: REM PRINT VARIABLES
920 A = 0: GOTO 210: REM READ LINE
930 :
940 REM STORE VARIABLE IN ARRAY
950 PRINT VN$;" ";
960 LJ = 1:HJ = NJ
970 IF HJ <LJ THEN SJ = LJ: GOTO 1020
980 CJ = INT((HJ -LJ)/2 +.5) +LJ
990 IF VN$ = SV$(CJ) AND LN = INT(SN(CJ)) THEN SN(CJ) = SN(CJ) +.01: GOTO 1070
1000 IF VN$ <SV$(CJ) THEN HJ = CJ -1: GOTO 970
1010 LJ = CJ +1: GOTO 970
1020 IF LJ >NJ THEN 1060
1030 FOR J = NJ TO LJ STEP -1
1040 SV$(J +1) = SV$(J):SN(J +1) = SN(J)
1050 NEXT J
1060 SV$(SJ) = VN$:SN(SJ) = LN:NJ = NJ +1
1070 BV = 0:VN$ = "": RETURN
1080 :
1090 REM GREETING
1100 HOME : PRINT : VTAB 2
1110 PRINT SPC( 31);"PRINT MASTER"
1120 PRINT SPC( 28);"By Charles T. Hill": PRINT
1130 PRINT SPC( 28);"Copyright (C) 1992"
1140 PRINT SPC( 24);"Mindcraft Publishing Corp."
1150 PRINT SPC( 28);"Lincoln, MA 01773"
1160 PRINT : PRINT
1170 PRINT SPC( 12);"This program prints Applesoft files with left margin,"
1180 PRINT SPC( 12);"line wrap, and page breaks. It can also display, write"
1190 PRINT SPC( 12);"as a TXT file, load, or RUN any Applesoft file, or"
1200 PRINT SPC( 12);"cross-reference variables with line numbers."
1210 PRINT
1220 PRINT SPC( 12);"For file selection, use letters or Up- or Down-Arrows"
1230 PRINT SPC( 12);"to change lines or Left-and Rioght-Arrows for next or"
1240 PRINT SPC( 12);"previous page. Return selects file or opens subdirectory"
1250 PRINT SPC( 12);"Space pauses listings, and Escape backs up or exits."
1260 PRINT : PRINT
1270 :
1280 REM INPUT PREFIX
1290 LA$ = "": REM RESET LABELS TO INDICATE DIR NOT READ FOR RESTART
1300 PRINT : PRINT SPC( 8);"PREFIX OR SLOT NUMBER: ";
1310 IS = 1: GOSUB 2080: REM GET LINE
1320 IF GL$ = "" OR GL$ = CHR$(27) THEN 2750: REM CHECK FOR END
1330 PS$ = GL$:SN = VAL(PS$)
1340 IF (SN <1 OR SN >7) THEN P$ = PS$: GOTO 1400: REM not a slot
1350 PRINT : PRINT SPC( 17);"DRIVE NUMBER: ";
1360 IS = 0: GOSUB 2080: REM GET LINE
1370 IF GL$ = CHR$(27) THEN 2750: REM CHECK FOR END
1380 PD$ = GL$
1390 P$ = ",S" +PS$ +",D" +PD$: REM CONSTRUCT PATH USING SLOT,DRIVE
1400 PRINT D$;"PREFIX";P$: REM ENTER PATH
1410 PRINT D$;"PREFIX": INPUT P$: REM RETRIEVE FULL PREFIX
1420 P$ = LEFT$(P$, LEN(P$) -1): REM strip trailing slash
1430 :
1440 REM OPEN DIRECTORY
1450 VTAB 23: POKE HT,79: PRINT : REM AVOID BLANK LINE ABOVE
1460 PG = 0:EOD = 0: REM RESET FLAGS FOR BEGIN AND END OF DIRECTORY
1470 X = FRE(0): REM CLEAR MEMORY OF OLD VALUES OF CHANGED STRINGS
1480 PRINT D$;"CLOSE";P$
1490 PRINT D$;"OPEN ";P$;",TDIR"
1500 PRINT D$;"READ";P$: IF FS = 1 THEN 1570
1510 INPUT A$: INPUT LA$: INPUT A$: REM READ HEADER
1520 :
1530 REM READ DIRECTORY FILES
1540 IF EOD = 1 THEN GOTO 1660: REM NO MORE FILES TO DISPLAY
1550 PG = PG +1
1560 VTAB 23: POKE HT,79: PRINT : REM AVOID BLANK LINE ABOVE
1570 FOR J = 1 TO DL: REM NUMBER OF DISPLAY LINES
1580 INPUT FI$(J): REM READ FILEINFO
1590 GOSUB 2470: REM CHECK FOR ESCAPE
1600 IF FI$(J) = "" THEN INPUT "";ST$:EOD = 1: GOTO 1620: REM END OF DIR
1610 NEXT
1620 NL = J -1: REM NUMBER OF LINES READ
1630 OI = 1: REM RESET DISPLAY LINE
1640 :
1650 REM SELECT DIRECTORY ENTRY
1660 HOME : IF PC = 1 THEN PRINT : PRINT CHR$(4);"PR#3"
1670 PRINT P$: VTAB 2: PRINT SPC( 1);LA$
1680 FOR I = 1 TO NL: GOSUB 1900: NEXT :
1690 GOSUB 1970:I = OI: GOSUB 1890
1700 IF EOD = 1 THEN VTAB NL +3: IF NL <20 THEN PRINT
1710 IF EOD = 1 THEN PRINT ST$
1720 VTAB 1: POKE HT,68: PRINT "PAGE ";PG;: POKE HT,77: PRINT "-->";
1730 IF EOD = 1 THEN VTAB 1: POKE HT,77: PRINT "<--";
1740 GOSUB 2010: REM GET KEY
1750 IF K = 13 THEN K = I: GOTO 2310: REM RETURN -- CHECK FILETYPE
1760 IF K = 8 THEN GOSUB 1900: GOTO 1450: REM LEFT
1770 IF K = 11 THEN GOSUB 1900:I = I -1: REM UP
1780 IF K = 21 THEN GOSUB 1900: GOTO 1540: REM RIGHT
1790 IF K = 10 THEN GOSUB 1900:I = I +1: REM DOWN
1800 IF K = 27 THEN 2530: REM ESC -- RESTART
1810 IF K >96 AND K <123 THEN K = K -32: REM SMALL LETTERS
1820 IF K >64 AND K <85 THEN GOSUB 1900:I = K -64: REM LETTERS A-T
1830 IF I >NL THEN I = NL
1840 IF I <1 THEN I = 1
1850 OI = I
1860 GOSUB 1890: GOTO 1740
1870 :
1880 REM DISPLAY DIRECTORY FILES
1890 INVERSE
1900 V = I +2
1910 VTAB V: POKE HT,1: PRINT FI$(I);: NORMAL
1920 INVERSE :VA = I +64
1930 VTAB V: POKE HT,0: PRINT CHR$(VA);
1940 NORMAL : RETURN
1950 :
1960 REM DISPLAY PROGRAM TITLE
1970 VTAB 23: POKE HT,0: INVERSE : PRINT SPC( 2);"PRINT.BAS ";
1980 RETURN
1990 :
2000 REM GET KEY FROM KEYBOARD
2010 K = PEEK(49152): IF K <128 THEN 2010
2020 K = K -128: POKE 49168,0: RETURN
2030 :
2040 REM CLEAR LINE
2050 VTAB 24: POKE HT,0: PRINT SPC( 79);: RETURN
2060 :
2070 REM GET LINE FROM KEYBOARD
2080 V = PEEK(37) +1:H = 30
2090 GL$ = ""
2100 GOSUB 2010: REM GET KEY
2110 IF K = 13 THEN RETURN : REM RETURN
2120 LL = LEN(GL$)
2130 IF K = 27 THEN 2260: REM ESC -- BACKUP
2140 IF K < >8 AND K < >127 THEN 2200: REM NOT LEFT
2150 LL = LL -1: REM LEFT
2160 IF LL >0 THEN GL$ = LEFT$(GL$,LL)
2170 IF LL = 0 THEN GL$ = ""
2180 VTAB V: POKE HT,H +LL +1: PRINT " ";
2190 GOTO 2100: REM GET ANOTHER CHARACTER
2200 IF LL = 40 THEN 2100: REM LIMIT 40 CHARACTERS
2210 IF IS = 0 AND K >47 AND K <58 THEN GL$ = GL$ + CHR$(K): REM #
2220 IF IS = 1 AND K >31 THEN GL$ = GL$ + CHR$(K): REM STRING
2230 VTAB V: POKE HT,H +LL +1
2240 IF LEN(GL$) >LL THEN PRINT CHR$(K);
2250 GOTO 2100: REM ANOTHER CHARACTER
2260 IF LL >0 THEN VTAB V: POKE HT,H: PRINT SPC( LL +1): GOTO 2090
2270 GL$ = CHR$(27)
2280 RETURN : REM escape when blank
2290 :
2300 REM CHECK FILETYPE
2310 NM$ = MID$ (FI$(I),2,16): REM GET PRODOS FILENAME
2320 FOR J = 1 TO 15: REM TO STRIP TRAILING BLANKS
2330 IF RIGHT$(NM$,1) = " " THEN NM$ = LEFT$(NM$, LEN(NM$) -1)
2340 NEXT J
2350 MD$ = MID$ (FI$(I),31,15): REM GET MODIFICATION DATE AND TIME
2360 FT$ = MID$ (FI$(I),18,3): REM GET PRODOS FILETYPE
2370 IF FT$ = "DIR" THEN P$ = P$ +"/" +NM$: GOTO 2720: REM READ NEW DIR
2380 PI$ = P$ +"/" +NM$: REM PATH FOR INPUT FILE
2390 IF FT$ = "BAS" THEN 2820: REM DISPLAY OPTIONS
2400 IF FT$ = "SYS" THEN 3030
2410 VTAB 24: POKE HT,0: INVERSE
2420 PRINT "Filetype is not BAS -- Press any key";
2430 NORMAL : GOSUB 2010
2440 GOSUB 2050: GOTO 1740
2450 :
2460 REM CHECK FOR ESCAPE
2470 E = PEEK(49152):E = E -128: POKE 49168,0
2480 IF E = 27 THEN POP : GOTO 2530: REM ESCAPE
2490 IF E = 32 AND FT$ = "BAS" THEN GOSUB 2010: REM PAUSE
2500 RETURN
2510 :
2520 REM RESTART
2530 IF PR = 1 THEN PRINT D$;"PR#3": PRINT : VTAB 22: POKE HT,0:PR = 0
2540 PRINT D$;"CLOSE": GOSUB 2050:PL = 0
2550 IF LA$ = "" THEN 2750: REM DIRECTORY NOT READ
2560 IF FT$ < >"BAS" THEN 2620: REM NO INPUT FILE YET
2570 VTAB 24: POKE HT,0
2580 INVERSE : PRINT "SAME INPUT FILE? <Y>";: NORMAL
2590 GOSUB 2010: IF K = 78 OR K = 110 OR K = 27 THEN GOSUB 2050: GOTO 2620
2600 IF K < >89 AND K < >121 AND K < >13 THEN 2570
2610 GOTO 2820: REM DISPLAY OPTIONS
2620 VTAB 24: POKE HT,0
2630 INVERSE : PRINT "DISPLAY PREVIOUS DIRECTORY? <Y>";: NORMAL
2640 GOSUB 2010: IF K = 78 OR K = 110 OR K = 27 THEN GOSUB 2050: GOTO 2750
2650 IF K < >89 AND K < >121 AND K < >13 THEN 2620
2660 GOSUB 2050
2670 NP$ = P$
2680 NP$ = LEFT$(NP$, LEN(NP$) -1): REM STRIP SUBDIRECTORY NAME
2690 IF RIGHT$(NP$,1) < >"/" THEN 2680
2700 IF LEN(NP$) = 1 THEN 2720: REM WAS ROOT DIRECTORY
2710 P$ = LEFT$(NP$, LEN(NP$) -1): REM STRIP TRAILING SLASH
2720 VTAB 23: POKE HT,0: PRINT SPC( 80);
2730 VTAB 23: POKE HT,0: INVERSE : PRINT "READING DIRECTORY ";P$;
2740 NORMAL : GOTO 1400: REM RESET PREFIX
2750 POKE HT,0
2760 VTAB 24: INVERSE : PRINT "RESTART? <Y> ";
2770 NORMAL : GOSUB 2010: IF K = 78 OR K = 110 OR K = 27 THEN END
2780 IF K < >89 AND K < >121 AND K < >13 THEN 2750
2790 GOTO 1100: REM GREETING
2800 :
2810 REM DISPLAY OPTIONS MENU
2820 HOME
2830 PRINT "INPUT FILE: ";PI$
2840 PRINT
2850 PRINT "(1) Print file"
2860 PRINT "(2) Display file"
2870 PRINT "(3) Write TXT"
2880 PRINT "(4) Load file"
2890 PRINT "(5) Run file"
2900 PRINT "(6) Cross-reference"
2910 PRINT "(7) Quit"
2920 PRINT : PRINT "CHOICE? <1> ";
2930 GOSUB 2010: REM get key
2940 IF K = 27 THEN 2530: REM RESTART
2950 IF K = 13 THEN K = 49: GOTO 2970: REM return
2960 IF K <49 OR K >56 THEN 2930: REM NOT 1-7
2970 PRINT CHR$(K):PC = K -48
2980 IF PC <7 THEN PRINT "READING ";PI$: PRINT
2990 PRINT D$;"CLOSE": REM CLOSE DIR FILE
3000 ON PC GOTO 3080,3080,3080,3010,3030,3080,3050
3010 HOME : PRINT CHR$(21): PRINT "LOADING ";PI$
3020 PRINT D$;"LOAD";PI$
3030 HOME : PRINT CHR$(21): PRINT "RUNNING ";PI$
3040 PRINT D$;"-";PI$
3050 END
3060 :
3070 REM OPEN INPUT FILE
3080 X = FRE(0): REM CLEAR MEMORY OF OLD STRINGS
3090 EOF = 0:B = 0
3100 PRINT D$;"OPEN ";PI$;",T";FT$
3110 REM IF ERROR THEN GOTO RESTART
3120 A = 0: REM CHARACTER COUNTER FOR LINE CODES
3130 IF PC <3 THEN 3380: REM READ BASIC TOKENS
3140 IF PC = 6 THEN 680: REM CROSS-REFERENCE
3150 :
3160 REM OUTPUT PATHNAME
3170 PRINT
3180 PRINT "PATHNAME OF TXT FILE: ";
3190 IS = 1: GOSUB 2080:PW$ = GL$: REM GET LINE
3200 PRINT
3210 IF GL$ = CHR$(27) THEN 2820: REM DISPLAY OPTIONS
3220 PRINT
3230 VF = 1: PRINT D$;"VERIFY";PW$:VF = 0
3240 REM IF ERROR=6 THEN FILE DOES NOT EXIST
3250 PRINT "FILE ALREADY EXISTS. DELETE IT? <N> "
3260 GOSUB 2010: REM GET KEY
3270 IF K = 121 OR K = 89 THEN PRINT D$;"DELETE";PW$: GOTO 3320
3280 IF K < >78 AND K < >1120 AND K < >27 AND K < >13 THEN 3260
3290 GOTO 3170: REM GET OUTPUT PATHNAME IF NOT YES
3300 :
3310 REM OPEN OUTPUT FILE
3320 PRINT D$;"OPEN";PW$
3330 CM$ = "": REM CHECK FOR COMMA IN NAME WITH DRIVE NUMBER
3340 IF LEN(PW$) >3 THEN CM$ = MID$ (PW$, LEN(PW$) -2,1)
3350 IF CM$ = CHR$(44) THEN PW$ = LEFT$(PW$, LEN(PW$) -3)
3360 :
3370 REM READ IN BASIC TOKENS
3380 IF RT = 1 THEN 3480: REM ALREADY READ
3390 RESTORE
3400 FOR I = 1 TO 107: READ BT$(I)
3410 IF I = 36 OR I = 37 THEN BT$(I) = BT$(I) + CHR$(58): REM ADD COLON TO HIMEM,LOMEM
3420 BT$(I) = " " +BT$(I) +" ": REM ADD SPACES
3430 NEXT I
3440 FOR I = 108 TO 128:BT$(I) = "": NEXT I
3450 RT = 1: REM SET FLAG
3460 :
3470 REM PRINT PROGRAM TITLE
3480 ON PC GOTO 3490,3550,3560
3490 HOME : PRINT CHR$(21): REM TURN OFF 80-COL FOR PRINTER
3500 INVERSE : PRINT "PRINTING ";PI$: NORMAL :PR = 1
3510 PRINT D$;"PR#1": REM SEND TO PRINTER
3520 POKE HT,0: PRINT SPC( LM);: GOSUB 3540
3530 PL = PL +2: GOTO 210
3540 PRINT "REM";PI$; SPC( WL -20 - LEN(PI$));MD$: PRINT : RETURN
3550 INVERSE : GOSUB 3540: NORMAL : GOTO 210
3560 INVERSE : PRINT "WRITING";PW$: NORMAL
3570 PRINT D$;"WRITE";PW$
3580 GOSUB 3540
3590 PRINT D$: GOTO 210: REM RETURN TO SCREEN
3600 :
3610 REM END OF FILE
3620 IF PR = 1 THEN PRINT : PRINT
3630 IF PR = 1 THEN PRINT D$;"PR#3": PRINT : VTAB 22: POKE HT,0:PR = 0
3640 IF PC = 6 THEN PRINT
3650 INVERSE : PRINT "END OF FILE ";PI$;: NORMAL : PRINT : PRINT
3660 IF PC <6 THEN 2530: REM RESTART
3670 IF NJ = 0 THEN PRINT "NO VARIABLES FOUND": GOTO 2530
3680 HOME : PRINT CHR$(21): REM TURN OFF 80-COL FOR PRINTER
3690 INVERSE : PRINT "PRINTING VARIABLES": NORMAL :PR = 1
3700 PRINT D$;"PR#1"
3710 POKE HT,0: PRINT SPC( LM);"VARIABLES IN ";PI$;" ";MD$
3720 NV = 0: GOSUB 630
3730 FOR I = 1 TO NJ: IF I = 1 THEN GOTO 3750: REM FIRST VARIABLE
3740 IF SV$(I) = SV$(I -1) THEN 3770
3750 PRINT : GOSUB 630: PRINT SPC( LM);SV$(I);" - ";:NV = NV +1
3760 VV = LM + LEN(SV$(I)) +3:LV = VV: REM RESET LENGTH OF VARIABLES PRINTED
3770 IF SN(I) > INT(SN(I)) THEN SN(I) = SN(I) +.01
3780 IF LV >WL THEN PRINT : GOSUB 630: PRINT SPC( VV):LV = VV
3790 PRINT SN(I);" ";:LV = LV + LEN( STR$(SN(I))) +1: NEXT I: PRINT : PRINT
3800 PRINT SPC( LM);NV;" VARIABLES - ";NJ;" NUMBERS"
3810 PRINT : PRINT :PL = PL +4: GOSUB 630
3820 IF EOF = 0 THEN PRINT D$;"PR#3": PRINT : VTAB 22: POKE HT,0:PR = 0: GOTO 680
3830 GOTO 2530: REM RESTART
3840 :
3850 REM BASIC TOKENS
3860 DATA END,FOR,NEXT,DATA,INPUT,DEL,DIM,READ,GR,TEXT
3870 DATA PR#,IN#,CALL,PLOT,HLIN,VLIN,HGR2,HGR,HCOLOR=,HPLOT
3880 DATA DRAW,XDRAW,HTAB,HOME,ROT=,SCALE=,SHLOAD,TRACE,NOTRACE,NORMAL
3890 DATA INVERSE,FLASH,COLOR=,POP,VTAB,HIMEM,LOMEM,ONERR,RESUME,RECALL
3900 DATA STORE,SPEED=,LET,GOTO,RUN,IF,RESTORE,&,GOSUB,RETURN
3910 DATA REM,STOP,ON,WAIT,LOAD,SAVE,DEF,POKE,PRINT,CONT
3920 DATA LIST,CLEAR,GET,NEW,TAB(,TO,FN,SPC(,THEN,AT
3930 DATA NOT,STEP,+,-,*,/,^,AND,OR,>
3940 DATA =,<,SGN,INT,ABS,USR,FRE,SCRN(,PDL,POS
3950 DATA SQR,RND,LOG,EXP,COS,SIN,TAN,ATN,PEEK,LEN
3960 DATA STR$,VAL,ASC,CHR$,LEFT$,RIGHT$,MID$
3970 :
3980 REM ERROR ROUTINE
3990 EN = PEEK(222): REM GET ERROR NUMBER
4000 EL = PEEK(219) *256 + PEEK(218): REM GET LINE
4010 POKE 216,0: CALL -3288
4020 ONERR GOTO 3990: REM SET ERROR TRAPPING
4030 IF EN = 2 AND RI = 1 THEN EOF = 1:RI = 0: GOTO 3620
4040 IF EN = 6 AND VF = 1 THEN VF = 0: GOTO 3320: REM OUTPUT FILE NOT FOUND
4050 IF EN = 255 THEN END : REM TRAPPED CTRL-C
4060 PRINT CHR$(4);"CLOSE": REM CLOSE ALL FILES
4070 IF PR = 1 THEN PRINT D$;"PR#0":PR = 0: REM TURN OFF PRINTER
4080 VTAB 23: POKE HT,0
4090 INVERSE : PRINT "ERROR ";EN;" ON LINE ";EL;
4100 IF EN = 254 THEN 2530: REM TRAPPED ESC
4110 IF EN = 2 THEN PRINT " -- RANGE ERROR";
4120 IF EN = 4 THEN PRINT " -- WRITE PROTECTED";
4130 IF EN = 6 THEN PRINT " -- PATH NOT FOUND";
4140 IF EN = 8 THEN PRINT " -- I/O ERROR";
4150 IF EN = 9 THEN PRINT " -- DISK FULL";
4160 IF EN = 10 THEN PRINT " -- FILE LOCKED";
4170 IF EN = 11 OR EN = 16 THEN PRINT " -- SYNTAX ERROR";
4180 PRINT " -- ";: NORMAL
4190 INVERSE
4200 PRINT "PRESS ANY KEY ";: NORMAL : PRINT " ";
4210 GOSUB 2010: REM GET KEY
4220 GOTO 2530: REM RESTART