Jump to content

Program:Led.bas

From Philosophical Research
Revision as of 04:40, 19 July 2025 by Vidak (talk | contribs) (Created page with "<syntaxhighlight lang="bbcbasic"> 0 REM LINE EDITOR (c)1980 ABACUS SOFTWARE 10 DIM T$(500):REM BUFFER SPACE 20 L$="":REM CURRENT LINE 30 LL=1:REM LAST LINE # 40 SP$=" ":DL$=CHR$(20) 50 EE=0:REM DISK ERROR CHANNEL CLOSED 60 PR=0: REM PRINT CHANNEL 90 POKE 144,49:REM DISABLE STOP KEY 100 PRINT " ABACUS SOFTWARE LINE EDITOR" 110 PRINT " FUNCTIONS:" 130 PRINT 140 PRINT TAB(8);"A)PPEND-TO END OF TEXT" 150 PRINT TAB(8);"C)HANGE-STRING" 160 PRINT TAB(8);"D)ELETE LINE...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
0 REM LINE EDITOR (c)1980 ABACUS SOFTWARE
10 DIM T$(500):REM BUFFER SPACE
20 L$="":REM CURRENT LINE
30 LL=1:REM LAST LINE #
40 SP$=" ":DL$=CHR$(20)
50 EE=0:REM DISK ERROR CHANNEL CLOSED
60 PR=0: REM PRINT CHANNEL
90 POKE 144,49:REM DISABLE STOP KEY
100 PRINT "       ABACUS SOFTWARE LINE EDITOR"
110 PRINT "      FUNCTIONS:"
130 PRINT
140 PRINT TAB(8);"A)PPEND-TO END OF TEXT"
150 PRINT TAB(8);"C)HANGE-STRING"
160 PRINT TAB(8);"D)ELETE LINE(S)"
170 PRINT TAB(8);"F)ILER COMMANDS"
180 PRINT TAB(8);"I)NSERT BEFORE LINE"
190 PRINT TAB(8);"L)IST LINE(S)"
200 PRINT TAB(8);"M)ENU DISPLAY"
210 PRINT TAB(8);"P)RINT LINE(S)"
220 PRINT TAB(8);"Q)UIT LEAVE EDITOR"
230 PRINT TAB(8);"R)EPLACE LINE"
240 PRINT:PRINT "    ENTER SELECTION-> ";
250 GOTO 510
500 PRINT:PRINT "ENTER A,C,D,F,I,L,P,Q,R,M)ENU->";
510 GET A$:IF A$="" THEN 510
520 J=0:FOR I=1 TO 10
530 IF A$=MID$("ACDFILRMQP",I,1) THEN J=I:I=10
540 NEXT I
550 PRINT A$
560 IF J=0 THEN 500
570 ON J GOTO 1000,2000,3000,4000,5000,6000,7000,100,8000,9000
1000 PRINT
1005 PRINT "APPEND TO END OF TEXT"
1010 PRINT:PRINT LL ">";
1020 GOSUB 10000:REM GO READ LINE
1030 IF LEN(L$)=0 THEN 500
1040 T$(LL)=L$
1050 LL=LL+1
1060 GOTO 1010
2000 REM CHANGE STRING
2010 PRINT:PRINT "CHANGE";:GOSUB 16000:REM GET RANGE
2020 IF HI=0 THEN 500
2025 PRINT "CHANGE STRING->";:GOSUB 10000:REM GET STRING
2030 L=LEN(L$)
2040 IF L=0 THEN 500
2050 IF L<4 THEN 2000
2060 DM$=LEFT$(L$,1):REM DELIMITER
2070 IF RIGHT$(L$,1)<>DM$ THEN 2000
2080 J=0: FOR I=2 TO L-1
2090     IF MID$(L$,I,1)=DM$ THEN J=I
2100 NEXT I
2110 IF J=0 THEN 2000
2120 IF J=2 THEN 2000
2130 FR$=MID$(L$,2,J-2)
2140 IF J+1=L THEN TS$="":GOTO 2160
2150 TS$=MID$(L$,J+1,L-J-1)
2160 F=LEN(FR$)
2170 FOR I=LO TO HI
2180     T=LEN(T$(I)):S=1:NL$=""
2190     FOR J=1 TO T-F+1
2200         IF MID$(T$(I),J,F)<>FR$ THEN 2230
2210         NL$=NL$+MID$(T$(I),S,J-S)+TS$
2220         S=J+F:J=S-1
2230     NEXT J
2240     IF S<>1 THEN NL$=NL$+RIGHT$(T$(I),T=S+1):T$(I)=NL$
2250 NEXT I
2260 GOTO 500
3000 REM DELETE LINES(S)
3005 PRINT:PRINT "DELETE ";:GOSUB 16000:REM GET RANGE
3010 IF NOT DF THEN 3015:REM NOT DEFAULT ON ENTIRE FILE
3011 PRINT "DELETE ENTIRE FILE? ";
3012 GET A$:IF A$="" THEN 3012
3013 PRINT A$:IF A$="N" THEN 500
3014 IF A$<>"Y" THEN 3011
3015 IF HI>LL-1 THEN 500
3020 IF HI=LL-1 THEN LL=LO:GOTO 500
3030 J=HI-LO+1
3040 FOR I=LO TO LL-J-1
3050     T$(I)=T$(I+J)
3060 NEXT I
3070 LL=LL-(HI-LO)-1
3080 GOTO 500
4000 REM FILER
4010 PRINT "FILER ENTER L)OAD OR S)AVE-> ";
4020 GET A$:IF A$="" THEN 4020
4030 IF A$<>"L" AND A$<>"S" THEN PRINT:GOTO 4000
4040 PRINT A$:M$=A$
4050 PRINT "ENTER FILENAME-> ";
4070 GOSUB 10000
4075 IF LEN(L$)=0 THEN 500
4076 IF LEN(L$)>12 THEN 4050
4080 FI$=L$
4090 PRINT "ENTER D)ISK OR T)APE-> ";
4100 GET A$:IF A$="" THEN 4100
4110 PRINT A$
4120 IF A$<>"D" AND A$<>"T" THEN 4090
4130 IF A$="D" THEN 4160:REM DISK ROUTINES
4140 IF M$="L" THEN 4400
4150 GOTO 4200
4160 DR$="":IF LEFT$(FI$,2)<>"0:" AND LEFT$(FI$,2)<>"1:" THEN DR$="0:"
4170 GOTO 4600
4200 REM TAPE SAVE
4210 IF LL=1 THEN PRINT "NO FILE TO SAVE":GOTO 500
4220 OPEN 2,1,2,FI$+".SOURCE"
4230 FOR I=1 TO LL-1
4230     FOR J=1 TO LEN(T$(I))
4250         PRINT# 2,MID$(T$(I),J,1);
4260	 NEXT J
4270     PRINT# 2,CHR$(255);
4280 NEXT I
4290 CLOSE 2
4300 PRINT SPC(6);FI$;" SAVED"
4310 GOTO 500
4400 REM TAPE LOAD
4410 OPEN 2,1,0,FI$+".SOURCE"
4430 IF=L0:REM LINE COUNT
4440 LL=LL+1:T$(LL)=""
4450 GET# 2,A$
4460 IF ST=64 THEN 4500:REM END OF FILE
4465 IF ST<>0 THEN PRINT "*** LOAD ERROR ***":GOTO 500
4470 IF A$=CHR$(255) THEN 4440:REM END OF LINE
4480 T$(LL)=T$(LL)+A$
4490 GOTO 4450
4500 CLOSE 2
4510 PRINT SPC(6);FI$;" LOADED"
4520 LL+LL+1
4530 GOTO 500
4600 REM DISK SAVE
4610 IF M$="L" THEN 4800
4620 IF LL=1 THEN PRINT "NO FILE TO SAVE":GOTO 500
4630 FL$="@0"+DR$+FI$+".SOURCE,S,W"
4640 OPEN 2,8,2,FL$
4650 GOSUB 20000:REM ERROR CHECK
4655 IF E1<>0 THEN 500
4660 FOR I=1 TO LL-1
4670     FOR J=1 TO LEN(T$(I))
4680         PRINT# 2,MID$(T$(I),J,1);
4690     NEXT J
4700     PRINT# 2,CHR$(255);
4710 NEXT I
4720 CLOSE 2
4730 PRINT SPC(6);FI$;" SAVED"
4740 GOTO 500
4800 REM DISK LOAD
4810 FL$=DR$+FI$+".SOURCE,S,R"
4820 OPEN 2,8,2,FL$
4830 GOSUB 20000:REM ERROR CHECK
4835 IF E1<>0 THEN 500
4840 LL=0:REM LINE COUNT
4850 LL=LL+1:T$(LL)=""
4860 GET# 2,A$
4870 IF ST=64 THEN 4500: REM END OF FILE
4880 IF ST<>0 THEN GOSUB 20000:GOTO 500
4890 IF A$=CHR$(255) THEN 4850:REM END OF LINE
4900 T$(LL)=T$(LL)+A$
4910 GOTO 4860
4920 CLOSE 2
4930 PRINT SPC(6);FI$;" LOADED"
4940 LL=LL+1
4950 GOTO 500
5000 REM INSERT LINE
5010 PRINT:PRINT "INSERT BEFORE ";:GOSUB 17000:REM GET LINE #
5015 IF LO>LL OR LO<1 THEN 5000
5020 PRINT:PRINT LO;">";
5030 GOSUB 10000:REM READ LINE
5040 IF LEN(L$)=0 THEN 500
5050 LL=LL+1
5060 FOR I=LL TO LO STEP -1
5070     T$(LO)=L$
5080 NEXT I
5090 T$(LO)=L$
5100 LO=LO+1
5110 GOTO 5020
6000 REM LIST LINES
6010 PRINT:PRINT "LIST ";:GOSUB 16000:REM GET RANGE
6020 IF HI=0 THEN 500
6030 SS$="N":PRINT:FOR I=LO TO HI:REM PERFORM LIST
6040 PRINT I;">";T$(I)
6050 GET A$:OF A$=CHR$(18) THEN FOR J=1 TO 1024:NEXT J
6060 IF A$<>CHR$(3) THEN 6110
6070 SS$="Y"
6080 GET A$:IF A$=CHR$(13) THEN SS$="N":GOTO 6110
6090 IF A$<>CHR$(32) THEN 6070
6100 GOTO 6120
6110 IF SS$="Y" THEN 6070
6120 NEXT I
6130 GOTO 500
7000 REM REPLACE LINE
7010 PRINT:PRINT "REPLACE ";:GOSUB 17000:REM GET LINE #
7020 IF LO>=LL OR LO<1 THEN 7000
7030 PRINT:PRINT LO;">";
7040 GOSUB 10000:REM READ LINE
7050 IF LEN(L$)=0 THEN 500
7060 T$(LO)=L$
7070 GOTO 500
8000 REM QUIT
8010 PRINT:PRINT "     LEAVE EDITOR-ARE YOU SURE? ";
8020 GET A$:IF A$="" THEN 8020
8030 PRINT A$
8040 IF A$<>"Y" AND A$<>"N" THEN 8000
8050 IF A$="N" THEN 500
8060 PRINT:PRINT "           ** END LINE EDITOR **"
8070 POKE 144,46:REM ENABLE STOP KEY
8080 END
9000 REM PRINT LINE
9010 IF PR=0 THEN PR=4 OPEN PR,PR
9020 PRINT "PRINT ";:GOSUB 16000:REM GET RANGE
9030 IF HI=0 THEN 500
9040 FOR I=LO TO HI:REM PERFORM PRINT
9050     PRINT# PR,I;": ";T$(I)
9060 NEXT I
9070 PRINT# PR
9080 PRINT# PR,"***";LL-1;"LINES IN BUFFER ***"
9090 PRINT #PR
9100 GOTO 500
10000 REM INPUT A LINE OF TEXT
10010 L$=""
10020 PRINT "$<-";
10030 GET A$:IF A$="" THEN 10030
10040 IF A$=CHR$(13) THEN PRINT " ":RETURN
10050 IF LEN(L$)>80 THEN GOTO 15000
10060 IF A$>=SP$ AND A$<=CHR$(95) THEN 10100
10065 IF A$>=CHR$(161) AND A$<=CHR$(223) THEN 10100
10070 IF A$<>DL$ THEN GOTO 10030
10080 IF LEN(L$)>0 THEN PRINT A$;:L$=LEFT$(L$,LEN(L$)-1)
10090 GOTO 10020
10100 L$=L$+A$:PRINT A$;:GOTO 10020
15000 REM LINE INPUT ERROR
15010 PRINT:PRINT "ERROR LINE TRUNCATED"
15020 RETURN
16000 PRINT "RANGE(LOW,HIGH)-> ";
16010 GOSUB 10000:REM INPUT RANGE
16020 LO=1:HI=LL-1:REM DEFAULT LIST ALL
16025 L=LEN(L$)
16030 DF=0:IF L=0 THEN DF=-1:GOTO 16150
16040 J=0:FOR I=1 TO L
16050 A$=MID$(L$,I,1)
16060 IF A$>="0" AND A$<="9" THEN 16090
16070 IF A$="-" THEN J=I:GOTO 16090
16080 J=99:I=99
16090 NEXT I
16100 IF J=99 THEN 16000
16110 IF J=0 THEN LO=VAL(L$):HI=LO:RETURN
16120 IF J>1 THEN LO=VAL(LEFT$(L$,J-1))
16130 IF J<L THEN HI=VAL(RIGHT$(L$,L-J))
16140 IF LO>HI THEN 16000
16150 RETURN
17000 PRINT "-LINE#->";
17010 GOSUB 10000:REM INPUT LINE#
17020 L=LEN(L$)
17030 IF L=0 THEN 17000
17040 J=0
17050 FOR I=1 TO L
17060     A$=MID$(L$,I,1)
17070     IF A$>="0" AND A$<="9" THEN 17090
17080     J=99:I=L
17090 NEXT I
17100 IF J=99 THEN 17000
17110 LO=VAL(L$)
17120 RETURN
20000 IF EE=0 THEN EE=15:OPEN EE,8,EE
20010 INPUT# EE,E1,E2$,E3,E4
20020 IF E1=0 THEN RETURN
20030 PRINT E1;",";E2$;",";E3:",";E4
20040 PRINT "*** DISK ERROR ***"
20050 CLOSE 2
20060 RETURN