10 REM > Scroll 20 REM Scrolling text file display 30 : 40 ver$="1.00b":c$="128" 50 MODE&80:h%=31:w%=79:IFHIMEM<&8000:MODE&83:h%=24 60 PROCinit:A$=FNOS_GetEnv:*disp ON 70 I%=INSTR(A$," -q"):quit$="":IFI%:quit$=MID$(A$,INSTR(A$," ",I%+1)+1) 80 IFLEFT$(A$,2)="-?":PRINT"Syntax: Scroll (-quit (*))":PROCend:END 90 A$=LEFT$(A$,INSTR(A$+" "," ")-1):cat%=A$="":IFmax%<2500:PRINT"Not enough memory to run":PROCend:END 100 lp$=FNFindLP 110 ON ERROR IFFNerr OR A$<>"":PROCend:END 120 IFpr% AND f$<>"":pr%=FALSE:OSCLI"disp ON":OSCLI"CODE 251":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$="":INPUTLINE"File: "f$:IF LEFT$(f$,1)="*":OSCLI"CODE 253":OSCLIf$:OSCLI"CODE 251" 150 UNTILLEFT$(f$,1)<>"*":cat%=FNlp(f$):f$="":UNTILA$<>"" 160 PROCend:END 170 : 180 DEFPROCend:*FX4 185 CLOSE#0 190 *FX229 200 *FX225,1 210 *CODE 253 220 IFquit$<>"":VDU13:PRINT"Exit"; 230 IFLEFT$(quit$,1)="*":OSCLIquit$:ENDPROC 240 I%=INSTR(quit$," "):IFI%:OSCLI"KEY0 |@"+MID$(quit$,I%+1)+"|M":*FX138,0,192 250 IFquit$<>"":CHAINquit$ 260 ENDPROC 270 : 280 DEFFNerr:IFERR<>17:REPORT:IFERR<128 AND ERR<>17:PRINT" at line ";ERL; ELSE IFERR<>17:PRINT 290 cat%=ERR=17:IFch%:A%=ch%:ch%=0:CLOSE#A% 300 =INKEY-1 310 : 320 DEFPROCinit:cat%=TRUE:ch%=0:pr%=FALSE:f$="" 330 max%=HIMEM-TOP-800:DIM ctrl% 20,data% max%+4:end%=data%+max% 340 ENDPROC 350 : 360 DEFFNlp(f$):IFf$="":=FALSE 370 ch%=OPENIN(f$):IFch%=0:PRINT"File '"f$"' not found":=FALSE 380 len%=EXT#ch%:IFlen%end% ANDch%:PROCdown 470 IFi%=8 ANDptr%end% ANDch%:PROCdown 510 IFI%=2 ANDptr%0:fst%=0:PROCgbpb(max%,0) 580 IFI%=5:top%=data%:PROCpage:UNTIL0 590 IF(I%AND&FE)=6:c$=STR$(VALc$EOR32):OSCLI"CODE "+c$:PROCpage:UNTIL0 600 IF(I%AND&FE)=16:PROCpr 610 UNTILI%=1:*FX229 620 *FX225,1 630 =TRUE 640 : 650 DEFPROCpage:CLS:VDU13:ptr%=top%:REPEATPRINT$ptr%:ptr%=ptr%+1+LEN$ptr%:UNTILVPOS>=h% OR ptr%>=data%+len%:IFVPOS13 PRINT"*** LF terminated text file.";CHR$13; 670 PROCline:ENDPROC 680 : 690 DEFPROCback:IFtop%<=data%:PROCline:ENDPROC 700 t%=top%-100:IFt%=top%:IFdata%+1+LEN$data%=top%:t%=data% 720 top%=t%:t%=ptr%-100:REPEATt%=t%+1+LEN$t%:UNTILt%+1+LEN$t%=ptr%:ptr%=t% 730 PRINTCHR$30;CHR$11;CHR$13;$top%;TAB(0,h%);:PROCline:ENDPROC 740 : 750 DEFPROCdown:IFfst%+max%>=len%:ENDPROC 760 f%=fst%+max%DIV2:IFf%+max%>len%:f%=len%-max% 770 off%=f%-fst%:IFoff%=0:ENDPROC 780 top%=top%-off%:ptr%=ptr%-off%:fst%=f%:PROCgbpb(max%,fst%):ENDPROC 790 : 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 : 850 DEFPROCline:IFADVAL(-1)=0:OSCLI"CODE 0":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:OSCLI"CODE "+c$ 860 ENDPROC 870 : 880 DEFPROCgbpb(n%,p%):LOCAL A%,X%,Y%:X%=ctrl%:Y%=X%DIV256:A%=3:PRINT"Read"; 890 ?X%=ch%:X%!1=data%:X%!5=n%:X%!9=p%:CALL&FFD1:data%?max%=13:*FX21 900 ENDPROC 910 : 920 DEFPROCpr:PRINTSPC(79);CHR$13;"Print out ";f$;" Printout with *";:IFlp$<>"":FORi%=1TO LENlp$:OSCLI"FX138,0,"+STR$ASCMID$(lp$,i%):NEXT 930 INPUT""lp$:IFlp$="":VDU7:PRINT"No printout command found";:A%=INKEY(200):PROCpage:ENDPROC 940 pr%=TRUE:OSCLI"CODE 253":PRINT"Printing...";:OSCLIlp$+" "+f$:OSCLI"disp ON":OSCLI"CODE "+c$:pr%=FALSE:PROCpage 950 ENDPROC 960 : 970 DEFFNFindLP:IFFNi("lp")=1:="lp" 980 A%=FNi("%.lp"):IFA%=1:="%.lp" 990 IFA%=2:IFFNi("%.lp.#"):="%.lp.#" 1000 IFA%=2:IFFNi("%.lp.*"):="%.lp.*" 1010 IFFNi("$.lp"):="$.lp" 1020 IFFNi(":0.$.lp"):=":0.$.lp" 1030 ="" 1040 DEFFNi(f$):LOCALA%,X%,Y%:$data%=f$:X%=ctrl%:Y%=X%DIV256:A%=5:!X%=data%:=(USR&FFDD)AND&FF 1050 : 1060 DEFFNOS_GetEnv:LOCALA$,A%,X%,Y% 1070 IFINKEY(0)=0:REPEAT A%=INKEY(0):A$=A$+CHR$A%:UNTIL A%=-1:OSCLI"KEY0":=LEFT$(A$,LENA$-1+(RIGHT$(A$,2)<" ")) 1080 IF(INKEY-256 AND &F0)=&A0 AND PAGE>&8000:LOADATN "OS_GetEnv" TO A$:=MID$(A$,1+INSTR(A$," ",1+INSTR(A$," ",1 +INSTR(A$," ")))) 1090 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) 1100 =""