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