5 g$=$&A00 10 REM > Scroll 20 REM Scrolling text file display 30 PROCxtr:ver$="1.09":c$="128" 40 MODE&83:h%=24:w%=79:IFHIMEM>&4000:MODE&80:h%=31 50 PROCinit:A$=FNOS_GetEnv:lp$=FNcl("-l"):tt$=FNcl("-4"):ch$=FNcl("-c") 60 quit$=FNcl(" -q"):Z$=FNcl("-?"):A$=FNcl(" "):PROCasm:PROCgo 70 IFINSTR(" "+A$+Z$," -?"):PRINT"Syntax: Scroll (-lp ) (-4 ) |-chan + (-quit )":PROCend(FALSE):END 80 IFA$="""""":A$="" 90 cat%=A$+ch$="":IFmax%<2500:PRINT"Not enough memory to run":PROCend(FALSE):END 100 IFlp$="":lp$=FNFindLP 110 ONERROR IFFNerr OR A$<>"":PROCend(FALSE):END 120 IFpr% ANDf$<>"":pr%=FALSE:PROCgo:PROCcon:cat%=FNlp(f$):f$="" 130 REPEAT:IFcat%:CLS:PRINT">> Scroll Version "ver$" - (C) J.G.Harston Buffer size: &";~max%;" (";max%;" bytes) <<"':OSCLI".":PRINT'"Press SHIFT-Escape to exit.":*FX4 140 REPEAT:cat%=FALSE:f$=A$:IFf$+ch$="":INPUTLINE"File: "f$:IFLEFT$(f$,1)="*":PROCdis:OSCLIf$:PROCcon 150 UNTILLEFT$(f$,1)<>"*":cat%=FNlp:f$="":UNTILA$<>"" 160 PROCend(FALSE):END 170 : 180 DEFPROCend(F%):PROCcl:*FX4 190 *FX229 200 *FX225,1 210 PROCdis:IFF%:ENDPROC 220 IFquit$<>"":VDU13:PRINT"Exit";:PROCos(quit$) 230 ENDPROC 240 DEFFNerr:IFERR<>17:REPORT:IFERR<128 AND ERR<>17:PRINT" at line ";ERL; ELSE IFERR<>17:PRINT 250 cat%=ERR=17:PROCcl:=INKEY-1 260 DEFPROCinit:cat%=TRUE:ch%=0:pr%=FALSE:f$="" 270 max%=HIMEM-LOMEM-900:DIMctrl%20,data% max%+4:end%=data%+max% 280 ENDPROC 290 DEFFNcl(l$):LOCAL I%:IFASCl$=32 AND A$<>"":A$=" "+A$ 300 I%=INSTR(A$,l$):l$="":IFI%:l$=MID$(A$,INSTR(A$," ",I%+1)+1):IFMID$(A$,I%,1)<>" ":l$=LEFT$(l$,INSTR(l$," ")-1) 310 IFI%:IFMID$(A$,I%,1)=" ":A$=LEFT$(A$,I%-1) ELSE IFI%:A$=MID$(A$,INSTR(A$,l$)+1+LENl$) 320 =l$ 330 DEFPROCcl:IFch%:A%=ch%:ch%=0:CLOSE#A% 340 ENDPROC 350 DEFPROCos(c$):IFLEFT$(c$,1)="*":OSCLIc$:ENDPROC 360 I%=INSTR(c$," "):IFI%:OSCLI"KEY0 |@"+MID$(c$,I%+1)+"|M":*FX138,0,192 365 $&A00=f$ 370 CHAINc$:ENDPROC 380 DEFFNlp:len%=0:IFf$+ch$="":=FALSE 390 IFch$<>"":len%=INSTR(ch$,"+"):ch%=VALLEFT$(ch$,len%-1):len%=EVALMID$(ch$,len%+1) 400 IFch$="":ch%=OPENIN(f$):IFch%=0:PRINT"File '"f$"' not found":=FALSE 410 len%=(EXT#ch% AND(len%=0))+len%:pt0%=PTR#ch%:IFlen%end% ANDch%:PROCdn 490 IFi%=8 ANDptr%end% ANDch%:PROCdn 530 IFI%=2 ANDptr%0:fst%=0:PROCgbpb(max%,0) 600 IFI%=5:top%=data%:PROCpg:UNTIL0 610 IF(I%AND&FE)=6:c$=STR$(VALc$EOR32):PROCon:PROCpg:UNTIL0 620 IF(I%AND&FE)=16:PROCpr 630 IFI%=18 ANDtt$<>"":PROCend(TRUE):PRINT"Mode7";:PROCos(tt$+" "+f$) 640 UNTILI%=1:*FX229 650 *FX225,1 660 =TRUE 670 : 680 DEFPROCpg:CLS:VDU13:ptr%=top%:REPEATPROCp(ptr%):ptr%=ptr%+1+LEN$ptr%:UNTILVPOS>=h% ORptr%>=data%+len% ORptr%>=end%:IFVPOS13 PRINT"*** LF terminated text file.";CHR$13; 700 PROCln:ENDPROC 710 DEFPROCbk:IFtop%<=data%:PROCln:ENDPROC 720 t%=top%-100:IFt%=top%:IFdata%+1+LEN$data%=top%:t%=data% 740 top%=t%:t%=ptr%-100:REPEATt%=t%+1+LEN$t%:UNTILt%+1+LEN$t%=ptr%:ptr%=t% 750 VDU30,11,13:PROCp(top%):PRINTTAB(0,h%);:PROCln:ENDPROC 760 DEFPROCdn:IFfst%+max%>=len%:ENDPROC 770 f%=fst%+max%DIV2:IFf%+max%>len%:f%=len%-max% 780 off%=f%-fst%:IFoff%=0:ENDPROC 790 top%=top%-off%:ptr%=ptr%-off%:fst%=f%:PROCgbpb(max%,fst%):ENDPROC 800 DEFPROCup:IFfst%=0:ENDPROC 810 f%=fst%-max%DIV2:IFf%-max%<0:f%=0 820 off%=f%-fst%:IFoff%=0:ENDPROC 830 top%=top%-off%:ptr%=ptr%-off%:fst%=f%:PROCgbpb(max%,fst%):ENDPROC 840 DEFPROCln:IFADVAL(-1)=0:PROCoff:PRINT"File: "RIGHT$(f$,30);SPC(30-LENf$);RIGHT$(" "+STR$(100*(ptr%-data%+fst%-1)DIVlen%),2);"% Cursors move, P: printout, Esc to exit";:VDU13:PROCon 850 ENDPROC 860 DEFPROCgbpb(n%,p%):LOCAL A%,X%,Y%:X%=ctrl%:Y%=X%DIV256:A%=3:PRINT"Read"; 870 ?X%=ch%:X%!1=data%:X%!5=n%:X%!9=p%+pt0%:CALL&FFD1:data%!max%=&D0D0D:*FX21 880 ENDPROC 890 DEFPROCpr:PRINTSPC(79);CHR$13;"Print out ";f$;" Printout with *";:IFlp$<>"":FORi%=1TO LENlp$:OSCLI"FX138,0,"+STR$ASCMID$(lp$,i%):NEXT 900 INPUT""lp$:IFlp$="":VDU7:PRINT"No printout command found";:A%=INKEY(200):PROCpg:ENDPROC 910 pr%=TRUE:PROCdis:PRINT"Printing...";:OSCLIlp$+" "+f$:PROCgo:PROCon:pr%=FALSE:PROCpg:ENDPROC 920 : 930 DEFFNFindLP:IFFNi("lp")=1:="lp" 940 A%=FNi("%.lp"):IFA%=1:="%.lp" 950 IFA%=2:IFFNi("%.lp.#"):="%.lp.#" 960 IFA%=2:IFFNi("%.lp.*"):="%.lp.*" 970 IFFNi("$.lp"):="$.lp" 980 IFFNi(":0.$.lp"):=":0.$.lp" 990 ="" 1000 DEFFNi(f$):LOCALA%,X%,Y%:$data%=f$:X%=ctrl%:Y%=X%DIV256:A%=5:!X%=data%:=(USR&FFDD)AND&FF 1010 : 1020 DEFFNOS_GetEnv:LOCALA$,A%,X%,Y%:X%=1:os%=((USR&FFF4)AND&FF00)DIV256 1030 IFINKEY(0)=0:REPEAT A%=INKEY(0):A$=A$+CHR$A%:UNTIL A%=-1:OSCLI"KEY0":=LEFT$(A$,LENA$-1+(RIGHT$(A$,2)<" ")) 1040 IFos%=6 AND PAGE>&8000:LOADATN "OS_GetEnv" TO A$:=MID$(A$,1+INSTR(A$," ",1+INSTR(A$," ",1 +INSTR(A$," ")))) 1050 X%=ctrl%:Y%=X%DIV256:A%=9:?X%=0:X%!1=data%:!data%=0:CALL&FFD1:IF!data%AND?data%+data%?2<>8:data%?(1+?data%)=13:=$(data%+1) 1060 ="" 1070 : 1080 DEFPROCon:IFm%:OSCLI"CODE "+c$ 1090 ENDPROC 1100 DEFPROCoff:IFm%:OSCLI"CODE 0" 1110 ENDPROC 1120 DEFPROCcon:IFm%:OSCLI"CODE 251" 1130 ENDPROC 1140 DEFPROCdis:IFm%:OSCLI"CODE 253" 1150 ENDPROC 1160 DEFPROCgo:IFm%:OSCLI"disp ON":ENDPROC 1170 PROCc(-1):ENDPROC 1180 DEFPROCp(P%):IFm%:PRINT$P%:ENDPROC 1190 REPEATPROCc(?P%):P%=P%+1:UNTILP%?-1=13:ENDPROC 1200 DEFPROCasm:m%=os%<>6:IFm%:ONERROR:ONERROR OFF:PRINT"Can't find *disp":PROCend(FALSE):END 1210 ENDPROC 1220 DEFPROCxtr:REM 1230 PROCreloc(&500,3):IF(INKEY-256 AND&F0)<>&A0:A%=PAGE:REPEATA%=A%+1+LEN$A%:I%=INSTR($A%,CHR$&DD+CHR$&F2+"xtr:"):UNTILI%:A%!(I%+5)=!(TOP-3+2*(?(TOP-3)=0)):LOMEM=A%+I%+8-2*(?(TOP-3)=0):ENDPROC 1240 ENDPROC:REM Last line MUST end with ENDPROC 1250 DEFPROCc(A%):IF A%<0:flg%=0:out%=1:ENDPROC 1260 IF A%<32:PROCctrl(A%):ENDPROC 1270 IF flg%>127:PROCflg(A%):ENDPROC 1280 out%=out%+1:IF A%=32:A%=9 1290 IF flg%=0:VDU A% ELSE PROCout(A%) 1300 ENDPROC 1310 DEFPROCctrl(A%) 1320 IF A%=9:FOR z%=(out%AND 7)TO 7:PROCc(32):NEXT:ENDPROC 1330 IF A%=13 OR A%=10:PRINT:out%=1:ENDPROC 1340 IF A%=28:flg%=flg%EOR 1:ENDPROC:REM Underline 1350 IF A%=29:flg%=flg%OR 128:ENDPROC:REM Wait for next character 1360 ENDPROC 1370 DEFPROCflg(A%):flg%=flg%AND 127:IF A%<65 OR A%>126:ENDPROC 1380 b%=0:a%=A%<96:A%=A% AND &DF 1390 IF A%=ASC"B":b%=&FD 1400 IF A%=ASC"H":b%=&BF 1410 IF A%=ASC"I":b%=&F7 1420 IF A%=ASC"Q":b%=&BB:REM Almost 1430 IF A%=ASC"S":b%=&EF 1440 IF A%=ASC"W":b%=&FB 1450 IF A%=ASC"X":b%=&BB 1460 IF A%=ASC"Y":b%=&DF 1470 IF b%=0:PRINT"(";CHR$A%;")";:ENDPROC 1480 flg%=(flg%AND b%)OR(a% AND (b% EOR 255)):ENDPROC 1490 DEFPROCout(C%):IF C%=9:C%=32 1500 LOCAL A%,X%,Y%,z%,a% 1510 X%=ctrl%:Y%=X%DIV256:A%=10:?X%=C%:CALL &FFF1 1520 IF(flg%AND 1):X%?8=255:REM or X%?8 EOR 255 1530 IF(flg%AND 2):FOR z%=1 TO 8:X%?z%=X%?z% OR(X%?z% DIV 2):NEXT 1540 IF(flg%AND 8):X%?1=X%?1 DIV4:X%?2=X%?2 DIV4:X%?3=X%?3 DIV2:X%?4=X%?4 DIV2:X%?7=X%?7*2:X%?8=X%?8*2 1550 IF(flg%AND 48):X%?2=X%?3:X%?3=X%?5:X%?4=X%?6:X%?5=X%?7:X%!6=0 1560 IF(flg%AND 32):X%!8=X%!5:X%!4=X%!1:X%?1=0:X%?2=0:X%?3=0 1570 REM Sub/Super need a bit of modification 1580 IF(flg%AND 4):FORz%=1 TO 8:?(X%+9+z%)=X%?z%:X%?z%=(X%?z% AND 128)+(X%?z% AND 128)DIV 2+(X%?z% AND 64)DIV 2+(X%?z% AND 64)DIV4+(X%?z% AND 32)DIV 4+(X%?z% AND 32)DIV 8+(X%?z% AND 16)DIV 8+(X%?z% AND 16)DIV 16:NEXT:PROCoutB 1590 IF(flg%AND 4):FORz%=1 TO 8:X%?z%=?(X%+z%+9):X%?z%=(X%?z% AND 1)+(X%?z% AND 1)*2+(X%?z% AND 2)*2+(X%?z% AND 2)*4+(X%?z% AND 4)*4+(X%?z% AND 4)*8+(X%?z% AND 8)*8+(X%?z% AND 8)*16:NEXT 1600 PROCoutB:ENDPROC 1610 DEFPROCoutB 1620 IF(flg%AND 68)=68:VDU 23,255:FORz%=5 TO 8:VDU X%?z%,X%?z%:NEXT:VDU 10,255,8,11:FORz%=7 TO 0 STEP -2:?(X%+z%+1)=?(X%+1+z%DIV2):?(X%+z%)=?(X%+1+z%DIV2):NEXT 1630 IF(flg%AND 68)=64:VDU 23,255:FORz%=1 TO 4:VDU X%?z%,X%?z%:NEXT:VDU 11,255,8,10:FORz%=0 TO 7 STEP 2:?(X%+z%+1)=?(X%+5+z%DIV2):?(X%+z%+2)=?(X%+5+z%DIV2):NEXT 1640 VDU 23,255:FORz%=1 TO 8:VDUX%?z%:NEXT:VDU 255:ENDPROC 1650 DEFPROCreloc(S%,X%):A%=133:X%=X%OR&80:A%=(USR&FFF4 AND&FFFF00)DIV256:IFA%-LOMEM>S%:ENDPROC 1660 B%=(PAGE+(A%-LOMEM-S%))AND&FF00:PRINT"Relocating to &";~B%:FORA%=0 TO LOMEM-PAGE+4 STEP4:A%!B%=A%!PAGE:NEXT:A$="":REPEATB$=INKEY$(0):IFB$<" " AND B$<>"":B$="|"+CHR$(64+ASCB$) 1670 A$=A$+B$:UNTILB$="":OSCLI"KEY0 RUN|M"+A$:OSCLI"FX138,0,192":PAGE=B%:END 1680 ENDPROC