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