Back to Main page.
Back to Main tapes page.
10 REM: TECO - TEXT EDITOR & CORRECTOR
20 REM: BY STEVE SPEAR. ALL RIGHTS RESERVED.
30 DIM A[2110],B[2,5],A$[255],B$[255]
40 FILES *,*,*
50 B=L=P=R=S=T=0
60 C=D=E=F=M=2100
70 W=1500
80 I=1
90 C$="$"
100 SYSTEM A$,"TIM"
110 PRINT "TECO - V02."A$[I,4]
120 MAT A=ZER
130 A$=""
140 H=I
150 PRINT "*";
160 J=BRK(1)
170 LINPUT B$
180 J=BRK(0)
190 IF LEN(A$)+LEN(B$)>255 THEN 4410
200 A$[LEN(A$)+I]=B$
210 J=POS(A$,"\")
220 IF NOT J THEN 250
230 A$[J-I MAX I]=A$[J+I]
240 GOTO 210
250 IF A$[LEN(A$)-I MAX I]#"??" THEN 300
260 A$[LEN(A$)-I]=""
270 PRINT A$;
280 GOTO 160
290 REM: 'N - CREATE ASCII CHARACTER WITH A VALUE OF N
300 FOR J=I TO LEN(A$)
310 IF A$[J,J]#"'" THEN 390
320 FOR G=I TO 3
330 CONVERT A$[J+I,4+J-G] TO K,380
340 IF K<0 OR K>255 THEN 380
350 A$[J,J]=CHR$(K)
360 A$[J+I]=A$[5+J-G MIN LEN(A$)+I]
370 GOTO 390
380 NEXT G
390 NEXT J
400 REM: ^^ - NORMAL CASE // - LOWER CASE
410 FOR J=I TO LEN(A$)
420 K=POS("^^//",A$[J,J+I])
430 GOTO NOT K MAX (J>LEN(A$))*2 OF 480,500
440 L=K#I
450 A$[J]=A$[J+2]
460 J=J-I
470 GOTO 490
480 A$[J,J]=CHR$(NUM(A$[J])+32*(L AND NUM(A$[J])>64 AND NUM(A$[J])<91))
490 NEXT J
500 IF A$[LEN(A$)-I MAX I]='7'7 THEN 130
510 CHAIN J,A$
520 B$=C$
530 B$[2]=C$
540 IF A$[LEN(A$)-I MAX I]=B$ THEN 580
550 A$[LEN(A$)+I]='13'10
560 GOTO 160
570 REM: GOVERNOR
580 O=0
590 N=Q=I
600 A$[H,H]=UPS$(A$[H])
610 G=POS(A$[H+I],C$[I,I])
620 IF NOT G THEN 130
630 G=H+G
640 B$=C$
650 B$[2]="<>;EJCDVTKLH.Z@ISRMNBQGAYWXFPU ?#!^="
660 IF E THEN 680
670 IF END #2 THEN 4230
680 A=POS(B$,A$[H,H])
690 IF SYS(3) THEN 3680
700 GOTO ((A>24 AND A<27 OR A=29) AND C) MAX ((A=27 OR A=28) AND E)*2 OF 4350,4370
710 IF NOT T OR A<4 OR A=32 THEN 730
720 PRINT "["B$[A,A]"]";
730 GOTO A OF 910,970,1050,910,1190,1740,1810,1850,1910,2000,2110,2000
740 GOTO A-12 OF 2190,2260,2310,2350,2380,2510,2510,130,2720,2760,2760
750 GOTO A-23 OF 2790,2820,2860,3230,3430,2510,3500,2510,880,3590,3620
760 GOTO A-34 OF 3620,880,3650
770 FOR A=H TO G
780 IF NOT POS("-+0123456789",A$[A,A]) THEN 800
790 NEXT A
800 IF A=H THEN 850
810 CONVERT A$[H,A-I] TO N,850
820 H=A
830 Q=0
840 GOTO 600
850 IF A$[H,H]#"-" THEN 4190
860 N=-I
870 Q=0
880 H=H+I
890 GOTO 600
900 REM: RETURN (OPTIONAL $)
910 H=H+I
920 GOTO 590
930 REM: RETURN (MANDATORY $)
940 H=G
950 GOTO 590
960 REM: N< (START ITERATION)
970 IF NOT Q THEN 990
980 N=B
990 IF O>5 THEN 4250
1000 O=O+I
1010 B[O,I]=N
1020 B[O,2]=H
1030 GOTO 910
1040 REM: > (END ITERATION)
1050 IF O
1130 J=POS(A$[G],">")
1140 IF NOT J THEN 4170
1150 H=G+J
1160 O=O-I MAX 0
1170 GOTO 590
1180 REM: E?
1190 A$[H+I,H+I]=UPS$(A$[H+I])
1200 B$=UPS$(A$[H+2,G-I MAX H+2])
1210 A=POS("FCXBRWSMP",A$[H+I,H+I])
1220 GOTO A+I OF 4190,1290,1250,1250,1330,1330,1600,1600,1670,1700
1230 REM: EF - CLOSE OUTPUT FILE EC - OUTPUT REMAINDER & CLOSE
1240 REM: EX - OUTPUT REMAINDER & EXIT
1250 IF C OR E THEN 1290
1260 J=I
1270 K=2
1280 GOSUB 3720
1290 E=I
1300 ASSIGN *,2
1310 GOTO (A=3)+I OF 910,4450
1320 REM: EB - I/O FILE & BACKUP ER - EDIT READ
1330 ASSIGN B$,I,C
1340 IF C>2 THEN 4150
1350 C=0
1360 ASSIGN B$,3,D
1370 D=(D=6)
1380 IF A#4 THEN 1410
1390 J=POS(B$,".")
1400 B$[4 MIN LEN(B$)+I MIN J+ NOT J*100]="BAK"
1410 IF D THEN 1570
1420 IF END #I THEN 1450
1430 READ #I,REC(I)+I
1440 GOTO 1430
1450 R=REC(I)
1460 READ #I,I
1470 IF A#4 THEN 1540
1480 CREATE K,B$,R
1490 GOTO (K=I)*2 MAX (K>I)*3 MAX (D#0) OF 4310,4330,4310
1500 ASSIGN B$,3,Q
1510 J=I
1520 K=3
1530 GOSUB 3720
1540 READ #I,I
1550 CONVERT INT(R*256/1024+I) TO B$
1560 PRINT "["B$"K MEMORY]"
1570 B$=UPS$(A$[H+2,G-I MAX H+2])
1580 IF A#4 THEN 2890
1590 REM: EW - EDIT WRITE ES - EDIT SERIALLY
1600 IF POS(B$,"BAK") THEN 4290
1610 ASSIGN B$,2,E
1620 ASSIGN B$,3,F
1630 E=E#0 AND E#8
1640 R=(A=7)
1650 GOTO ( NOT E+(A=4) MAX (E=3)*3)+I OF 4140,940,2890,4150
1660 REM: NEC FILENAME $ - CREATE FILENAME N RECORDS LONG.
1670 CREATE J,B$,N
1680 GOTO NOT J+I OF 4310,940
1690 REM: EP FILENAME $ - PURGE FILENAME.
1700 PURGE J,B$
1710 GOTO J+I OF 940,4430,4430,4150
1720 REM: NJ - JUMP TO THE NTH CHARACTER
1730 IF N>B OR NB OR P+NB OR P+N0) MIN M
1880 GOSUB 4030
1890 GOTO 910
1900 REM: NV - TYPE OUT N CHARACTERS
1910 FOR J=P MIN P+N MAX I TO P-I MAX P+N-I MIN B
1920 IF NUM(A$[H-I MAX I])#94 OR A[J]>31 THEN 1950
1930 B$="^"
1940 PRINT USING "#,A";B$
1950 B$=CHR$(A[J]+64*(NUM(A$[H-I MAX I])=94 AND A[J]<32))
1960 PRINT USING "#,A";B$
1970 NEXT J
1980 GOTO 910
1990 REM: NT - TYPE N LINES NL - MOVE N LINES
2000 GOSUB 3930
2010 GOTO (A=10)*(P=I AND N <= 0 OR P=B AND N>0)*2 MAX (A=10) OF 2040,910
2020 P=J
2030 GOTO 910
2040 FOR K=P MIN J MAX I TO P-I MAX J MIN B
2050 IF SYS(3) THEN 3680
2060 B$=CHR$(A[K])
2070 PRINT USING "#,A";B$
2080 NEXT K
2090 GOTO 910
2100 REM: NK - KILL N LINES
2110 IF N$ - INSERT AT POINTER
2380 B$=A$[H+I,G-I]
2390 J=LEN(B$)
2400 IF B+J>M THEN 4390
2410 GOSUB 4030
2420 FOR J=I TO LEN(B$)
2430 A[J+P-(P>0)]=NUM(B$[J])
2440 NEXT J
2450 P=P+LEN(B$)
2460 GOTO 940
2470 REM: NS$ - SEARCH FOR THE NTH OCCURENCE OF
2480 REM: NF$ - FIND , OUTPUT TEXT PASSED OVER
2490 REM: NR\$\$ - REPLACE THE NTH OCCURENCE OF \ WITH \
2500 REM: NU\$\$ - REPLACE WHILE OUTPUTING PAGES PASSED OVER
2510 J=P
2520 FOR U=I TO N
2530 FOR V=J+ NOT J TO B
2540 IF SYS(3) THEN 3680
2550 FOR Q=0 TO G-H-2
2560 IF A[V+Q]#NUM(A$[H+I+Q]) THEN 2600
2570 NEXT Q
2580 J=V+Q
2590 GOTO 2630
2600 NEXT V
2610 N=I
2620 GOTO ((POS(A$,";")#0) MAX (A=29 OR A=31)*2)+I OF 4170,1130,3460
2630 NEXT U
2640 P=J MIN B
2650 IF A=18 OR A=29 THEN 940
2660 J=(G-H-I)*-I
2670 GOSUB 4030
2680 H=G
2690 G=POS(A$[H+I],C$[I,I])+H
2700 GOTO 2380
2710 REM: N\ - NEW DELIMITER IS \
2720 H=H+I
2730 C$=A$[H,H]
2740 GOTO 910
2750 REM: B - SHUT OFF Q - ENABLE
2760 S=A#23
2770 GOTO 910
2780 REM: G\$ - TYPE \
2790 PRINT A$[H+I,G-I];
2800 GOTO 940
2810 REM: A - APPEND TO BUFFER
2820 IF END #I THEN 4350
2830 P=B
2840 GOTO 2910
2850 REM: NY - YANK IN THE NTH PAGE
2860 IF END #I THEN 4230
2870 IF D THEN 2890
2880 READ #I,REC(I)+N-I
2890 MAT A=ZER
2900 P=B=0
2910 IF S OR D THEN 2940
2920 CONVERT REC(I) TO B$
2930 PRINT "[RECORD #"B$"]"
2940 GOTO TYP(-I)* NOT D OF 2980,3010,3120,3120
2950 IF END #I THEN 4230
2960 LINPUT #I;B$
2970 GOTO 3020
2980 READ #I;J
2990 CONVERT J TO B$
3000 GOTO 3020
3010 READ #I;B$
3020 IF B+LEN(B$)+2>M THEN 4390
3030 FOR J=I TO LEN(B$)
3040 P=P+I
3050 A[P]=NUM(B$[J])
3060 NEXT J
3070 B=B+LEN(B$)+2
3080 P=P+2
3090 A[P-I]=13
3100 A[P]=10
3110 IF NOT D OR B28 AND A#30)+I OF 880,2530
3220 REM: NW - OUTPUT N LINES FROM BUFFER
3230 GOTO (E#0)*2 MAX (Q#0) OF 3390,4370
3240 GOSUB 3930
3250 B$=""
3260 FOR K=J MIN P MAX I TO J-I MAX P MIN B
3270 IF A[K]=13 AND A[K+I MIN B]=10 THEN 3320
3280 B$[LEN(B$)+I MIN 255]=CHR$(A[K])
3290 NEXT K
3300 PRINT #2; END
3310 GOTO (A#27)+I OF 910,3510
3320 CONVERT B$ TO J,3350
3330 PRINT #2;J
3340 GOTO 3360
3350 PRINT #2;B$
3360 B$=""
3370 K=K+I
3380 GOTO 3290
3390 J=I
3400 P=B
3410 GOTO 3250
3420 REM: NX - RESET OUTPUT FILE
3430 IF E OR F THEN 4350
3440 READ #2,N
3450 GOTO 910
3460 GOTO (C#0)*2+(E=0) OF 3500,4350
3470 MAT A=ZER
3480 GOTO 3510
3490 REM: NP - OUTPUT THROUGH THE NTH PAGE
3500 GOTO ((C#0)*2 MAX (E#0))+I OF 3390,4370,4350
3510 FOR R=I TO N-I
3520 J=I
3530 K=2
3540 GOSUB 3720
3550 NEXT R
3560 N=I
3570 GOTO 2860
3580 REM: ? (TRACE)
3590 T= NOT T
3600 GOTO 910
3610 REM: # - LOWERCASE CHAR. @ PTR. ! - UPPERCASE CHAR. @ PTR.
3620 IF NOT P THEN 4210
3630 A[P]=A[P]+32*(A=34)*(A[P]>64 AND A[P]<91)-32*(A=35)*(A[P]>96)
3640 GOTO 910
3650 REM: N= - ASCII INTAKE
3660 W=N
3670 GOTO 910
3680 ENTER 1,X,A$
3690 PRINT '13'10"Re-entering TECO"
3700 GOTO 130
3710 REM: FILE TRANSFER
3720 N=I
3730 IF END #J THEN 3910
3740 IF END #K THEN 3900
3750 GOTO TYP(-J)* NOT D OF 3800,3830,3860,3860
3760 LINPUT #I;B$
3770 PRINT #K;B$, END
3780 N=N+LEN(B$)
3790 GOTO (N>W AND A>28)+I OF 3730,3910
3800 READ #J;Q
3810 PRINT #K;Q, END
3820 GOTO 3750
3830 READ #J;B$
3840 PRINT #K;B$, END
3850 GOTO 3740
3860 READ #J,REC(J)+I
3870 IF R OR F THEN 3890
3880 READ #K,REC(K)+I
3890 GOTO (A=30)+I OF 3740,3910
3900 PRINT "?OTS OUTPUT TOO SMALL."
3910 RETURN
3920 REM: LINES
3930 IF NOT P THEN 4000
3940 J=P
3950 FOR K=I TO ABS(N)+(NB THEN 4000
3980 IF A[J]#10 THEN 3960
3990 NEXT K
4000 J=(J+(J= P) MAX I MIN B)*(P#0)
4010 RETURN
4020 REM: SHIFT BUFFER J CHARACTERS
4030 GOTO NOT P*2 MAX (J<0) OF 4080,4120
4040 FOR K=B TO P STEP -I
4050 A[K+J MIN M]=A[K]
4060 NEXT K
4070 GOTO 4110
4080 FOR K=P TO B
4090 A[K+J MAX I]=A[K]
4100 NEXT K
4110 P=P+J*(JW< > WITHOUT <."
4280 GOTO 130
4290 PRINT "?NEB NO EDIT ON BACKUP."
4300 GOTO 130
4310 PRINT "?CCB CAN'T CREATE BACKUP."
4320 GOTO 130
4330 PRINT "?EBA NO EB IF EB ACTIVE."
4340 GOTO 130
4350 PRINT "?UIF UNDEFINED INPUT FILE."
4360 GOTO 130
4370 PRINT "?UOF UNDEFINED OUTPUT FILE."
4380 GOTO 130
4390 PRINT "?BOF BUFFER OVERFLOW."
4400 GOTO 130
4410 PRINT "?CTL COMMAND TOO LONG."
4420 GOTO 130
4430 PRINT "?CPF CAN'T PURGE FILE."
4440 GOTO 130
4450 END