10 REM > SJFiler
   20 os%=FNfx(0,1)AND&FF:VDU10,8:A%=POS:VDU13:IFA%<50:MODE&83:IFHIMEM>&4000:MODE&80
   30 IFHIMEM<&FFFF:HIMEM=FNfx(132,0)
   40 PROCinit:PRINT"SJFiler v"ver$" by J.G.Harston"':ONERRORIFFNerr:END
   50 REPEAT:fs%=FNfs:X%=ctrl%:Y%=X%DIV256
   60   IFdrv$="":PRINTCHR$(D%+48);"> ";ELSEPRINT"[";drv$;"] ";
   70   INPUTLINE""A$:PROCdo(FNs(A$))
   80 UNTIL0
   90 DEFPROCinit:ver$="1.30"
  100 cmd$=":MOUNT:DIR:CAT:EX:INFO:TYPE:DUMP:COPY:BLOCK:INF:HELP:QUIT:"
  110 hlp$=":<drive>|<image>:<dir>|&<blocknum>:::<file>:<file> [CTRLS]:<file> [7BIT]:<source> <dest> (<opts>):<blocknum>:FULL|SHORT:::<opts>:"
  120 DIMctrl% 127,name% 255,thisdir% 63,bitmap% 63,object% 63,dir% &3FF,alloc% &3FF,data% &3FF:X%=ctrl%:Y%=X%DIV256
  130 D%=0:drv$="":path$="":csd%=-1:valid$="SJ Research MDFS disk ":res%=0:opt%=0:fullinf%=TRUE
  140 d$=".":s$="/":IFos%AND-24:d$="/":s$=".":IFos%AND-32:d$="\"
  150 ENDPROC
  160 DEFFNerr:OSCLI"FX229":REPORT:IFFNfs<>fs%:OSCLI"FX143,18,"+STR$fs%
  170 PROCCloseAll:PRINTLEFT$(" "+STR$ERL,ERR<128ANDERR<>17):=INKEY-1ANDERR<>17
  180 DEFPROCCloseAll:in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
  190 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  200 ENDPROC
  210 DEFPROCdo(A$):IFA$="?":A$="HELP"
  220 IFLEFT$(A$,1)=";"ORA$="":ENDPROC
  230 IFLEFT$(A$,1)="*":OSCLIMID$(A$,2):ENDPROC
  240 IFLEFT$(A$,1)=".":A$="CAT "+MID$(A$,2)
  250 A%=INSTR(A$+" "," "):B$=FNuc(LEFT$(A$,A%-1)):A$=FNs(MID$(A$,A%+1))
  260 IFLENB$=1ANDINSTR("01234567",B$):drv$="":D%=VALB$AND(((os%<6)OR3)AND7):csd%=-1:ENDPROC
  270 A%=INSTR(cmd$,":"+B$+":"):IFA%=0:PRINT"Bad command":ENDPROC
  280 A%=EVAL("FN_"+B$+"("""+A$+""")"):ENDPROC
  290 DEFFN_QUIT(A$):PRINT"Quit"
  300 ONERROREND
  310 IFos%>5:*QUIT
  320 END
  330 DEFFN_HELP(A$):p%=2:q%=2:REPEAT
  340   A%=INSTR(cmd$,":",p%):PRINT"  ";MID$(cmd$,p%,A%-p%);:p%=A%+1
  350   A%=INSTR(hlp$,":",q%):PRINT" ";MID$(hlp$,q%,A%-q%):q%=A%+1
  360 UNTILp%>LENcmd$:=0
  370 DEFFN_OPT(A$):IFA$="":PRINT"OPT=";opt%'"1:"'"2:"'"4:"'"8:":=0
  380 opt%=VAL(A$):=0
  390 DEFFN_INF(A$):IFA$="":PRINT"Output ";LEFT$("FULL",fullinf%);LEFT$("SHORT",NOTfullinf%);" .inf info":=0
  400 fullinf%=FNuc(A$)="S":=0
  410 DEFFN_MOUNT(A$):IFLENA$<2:PROCdo(A$):=0ELSEdrv$=FNs(A$):D%=-1:csd%=-1:=0
  420 DEFFN_CAT(A$):PROCLstDir(0):=0
  430 DEFFN_EX(A$):PROCLstDir(1):=0
  440 DEFFN_DIR(A$):curr%=-1:IFA$="":PRINT"Syntax: DIR <dir>|&<blocknum>":=TRUE
  450 IFLEFT$(A$,1)="&":IFFNMount:=0
  460 IFLEFT$(A$,1)="&":csd%=EVAL(FNuc(A$)):path$="&"+FNh0(csd%,6):=0
  470 IFINSTR(A$,".")+INSTR(A$,"^")=0:=FNdir(A$)
  480 PRINT"DIR <Unsupported>":=0
  490 DEFFNdir(A$):IFA$="$":A%=FNMount:=0
  500 IFFNlook:=TRUE
  510 IF(fptr%?&17AND&20)=0:PRINT"'"A$"' not a directory":=0
  520 FORA%=0TO63STEP4:thisdir%!A%=ptr%!A%:NEXT
  530 path$=path$+"."+$(ptr%+1):csd%=thisdir%!32AND&FFFF
  540 =0
  550 DEFFN_BLOCK(A$):LOCALln%,p%,blk%,cols%:cols%=16:IFA$="":PRINT"Syntax: BLOCK <blocknum>":=TRUE
  560 blk%=EVAL("&"+FNuc(A$)):PROCRdBlocks(data%,blk%,D%,1):O%=data%:ln%=1024:PROCdump(FALSE)
  570 =0
  580 DEFFN_DUMP(A$):LOCALln%,p%,ptr%,cols%:cols%=16:IFA$="":PRINT"Syntax: DUMP <fsp>":=TRUE
  590 IFFNlook:=TRUE
  600 PROCdump(TRUE)
  610 =0
  620 DEFPROCdump(F%)
  630 FORP%=0TOln%-1STEPcols%:B$=""
  640   PRINTFNh0(P%,6);" ";:IFF%:IF(P%AND&3FF)=0:PROCReadData(P%):O%=data%
  650   FORQ%=P%TOP%+cols%-1
  660     IFQ%<ln%:PRINTFNh0(?O%,2);" ";ELSE?O%=32:PRINTSPC3;
  670     A$=CHR$(?O%AND&7F):IFA$>=" "ANDA$<="~" B$=B$+A$ELSEB$=B$+"."
  680 O%=O%+1:NEXT:PRINTB$:NEXT:ENDPROC
  690 DEFFN_TYPE(A$):LOCALln%,p%,ptr%:IFA$="":PRINT"Syntax: TYPE <fsp>":=TRUE
  700 msk%=INSTR(A$," [")<>0:msk%=(msk%AND&80)OR&7F:src$=LEFT$(A$,INSTR(A$+" "," ")-1)
  710 IFFNlook:=TRUE
  720 last%=0
  730 FORP%=0TOln%-1:IF(P%AND&3FF)=0:PROCReadData(P%):O%=data%
  740   Q%=?O%ANDmsk%:IFmsk%=255:VDUQ%ELSEIFQ%=10ORQ%=13ORQ%>31VDUQ%
  750   IF(Q%=10ORQ%=13)ANDQ%<>last%:VDU23-Q%
  760   IFQ%=9:PRINTSPC(8-(POSMOD8));
  770 last%=?O%:O%=O%+1:NEXT:IFPOS:PRINT
  780 =0
  790 DEFFN_INFO(A$):LOCALln%,p%,ptr%:src$=A$
  800 IFsrc$="":IFcsd%=-1:IFFNMount:=TRUE
  810 IFsrc$="":PRINT"Disk: MDFS::";title$
  820 IFsrc$="":PRINT"Root: &"FNh0(root%,6)"  Size: &"FNh0(dsize%,6)"  CrDate: "FNdate(idate%)" "FNtime(itime%):=0
  830 IFFNlook:=TRUE
  840 fptr%=object%:x%=0:PROCListFile(1)
  850 FORp%=0TO31STEP2:PRINTFNh0(object%?p%,2);FNh0(object%?(p%+1),2);" ";:NEXT:PRINTCHR$8
  860 FORp%=32TO63STEP2:PRINTFNh0(object%!p%,4);" ";:NEXT:PRINTCHR$8
  870 =0
  880 DEFFN_COPY(A$):IFA$="":PRINT"Syntax: COPY <mdfs source> (inf:)<host dest> (<C>onfirm)":=TRUE
  890 p%=INSTR(A$," "):src$=LEFT$(A$,p%-1):A$=MID$(A$,p%+1)
  900 inf%=0:cnf%=0:dst$=A$
  910 IFFNuc(LEFT$(A$,4))="INF:":inf%=TRUE:dst$=MID$(A$,5)
  920 IFFNuc(RIGHT$(dst$,2))=" C":cnf%=TRUE:dst$=LEFT$(dst$,LENdst$-2)
  930 A$=src$:IFA$<>"$":IFFNlook:=TRUE
  940 IFsrc$="$":A%=FNMount:ptr%=thisdir%:IFA%<0:=TRUE
  950 cblk%=ptr%
  960 IF((object%?&17)AND&20)=0:fptr%=object%:leaf$=src$:PROCCopyOneFile(src$,dst$):=0
  970 IFdst$<>"":PROCf_cdir(dst$)
  980 IFdst$<>"":dst$=dst$+d$
  990 path$="":PROCCopyDirectory(dst$)
 1000 =0
 1010 DEFPROCCopyDirectory(dst$):LOCALentry%,bit%,fptr%
 1020 FORA%=0TO63STEP4:thisdir%!A%=cblk%!A%:NEXT
 1030 ptr%=32:cblk%=thisdir%!ptr%AND&FFFF
 1040 PROCRdBlocks(dir%,cblk%,D%,1)
 1050 FORA%=0TO63STEP4:bitmap%!A%=dir%!A%:NEXT
 1060 bit%=?bitmap%DIV2:fptr%=dir%+64
 1070 FORentry%=1TO255
 1080   IF(entry%AND7)=0:bit%=bitmap%?(entry%DIV8)
 1090   IF(entry%AND15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr%AND&FFFF:IFcblk%:PROCRdBlocks(dir%,cblk%,D%,1):fptr%=dir%
 1100   IF(bit%AND1)<>0:PROCCopyObject
 1110 bit%=bit%DIV2:fptr%=fptr%+64:NEXTentry%
 1120 ENDPROC
 1130 DEFPROCCopyObject:LOCALptr%,bit%,old_cblk%,thisdir$,bitmap$,object$
 1140 PROCFileInfo(fptr%):IFfname$="":ENDPROC
 1150 IFcnf%:PRINT"Copy ";fname$;:cnf%=FNyna(cnf%):IFcnf%>0:PRINT:ENDPROCELSEVDU13
 1160 leaf$=fname$:fname$=FNfn_todos(fname$)
 1170 IF(access%AND&20)=0:PROCCopyOneFile(fname$,dst$+fname$):ENDPROC
 1180 PRINT"Copying ";fname$;SPC(10-LENfname$);" to ";dst$+fname$
 1190 old_cblk%=cblk%
 1200 FORA%=0TO63:thisdir$=thisdir$+CHR$thisdir%?A%:NEXT
 1210 FORA%=0TO63:bitmap$ =bitmap$ +CHR$bitmap%?A%:NEXT
 1220 FORA%=0TO63:object$ =object$ +CHR$fptr%?A%:NEXT
 1230 cblk%=fptr%
 1240 PROCf_cdir(dst$+fname$)
 1250 PROCCopyDirectory(dst$+fname$+d$)
 1260 FORA%=0TO63:object%?A%=ASCMID$(object$,A%+1):NEXT
 1270 PROCFileInfo(object%):PROCSetInfo(dst$+fname$)
 1280 FORA%=0TO63:thisdir%?A%=ASCMID$(thisdir$,A%+1):NEXT
 1290 FORA%=0TO63:bitmap%?A% =ASCMID$(bitmap$ ,A%+1):NEXT
 1300 cblk%=old_cblk%:PROCRdBlocks(dir%,cblk%,D%,1)
 1310 ENDPROC
 1320 DEFPROCCopyOneFile(src$,dst$):LOCALcblk%
 1330 PRINT"Copying ";src$;SPC(10-LENsrc$);" to ";dst$;SPC4;
 1340 FORA%=0TO63STEP4:object%!A%=fptr%!A%:NEXT
 1350 PROCFileInfo(object%):IFFNfile(dst$,5):X%!14=&33:A%=FNfile(dst$,4)
 1360 X%!2=load%:X%!6=exec%:X%!10=0:X%!14=length%:A%=FNfile(dst$,7)
 1370 IFlength%:PROCCopyData
 1380 PROCSetInfo(dst$):PRINTCHR$127;CHR$127;CHR$127:ENDPROC
 1390 DEFPROCCopyData
 1400 out%=FNf_openout(dst$):P%=0:REPEAT
 1410   PROCReadData(P%):PRINTCHR$8;CHR$8;CHR$8;FNd0(100*P%DIVlength%,2);"%";
 1420   num%=1024:IFP%+num%>length%:num%=length%-P%
 1430 PROCgbpb(2,out%,data%,num%,0):P%=P%+1024:UNTILP%>length%
 1440 CLOSE#out%:out%=0:ENDPROC
 1450 DEFPROCSetInfo(dst$):X%!2=load%:X%!6=exec%:X%!10=length%:X%!14=attr%:A%=FNfile(dst$,1)
 1460 A$=leaf$+STRING$(11-LENleaf$," ")+FNh0(load%,8)+" "+FNh0(exec%,8)+" "+FNh0(length%,8)
 1470 IFfullinf%:A$=A$+" "+FNh0(attr%AND255,2)+" "+FNh0(mdate%,4)+" "+FNh0(mtime%,6)
 1480 IFfullinf%:A$=A$+" "+FNh0(cdate%,4)+" "+FNh0(ctime%,6)+" "+FNh0(acc%,4)+" "+FNh0(aux%,4)
 1490 A$=A$+CHR$13+CHR$10
 1500 IFinf%:out%=OPENOUT(dst$+s$+"inf"):FORp%=1TOLENA$:BPUT#out%,ASCMID$(A$,p%,1):NEXT:CLOSE#out%:out%=0
 1510 IFfs%<>5:ENDPROC
 1520 X%!8=cdate%:A%=FNNetFS_OpN(19,5,10,dst$)
 1530 X%!8=cdate%:X%!10=ctime%:X%!13=mdate%:X%!15=mtime%
 1540 A%=FNNetFS_OpN(19,64,18,dst$)
 1550 A%=FNNetFS_Op(19,CHR$4+CHR$access%+dst$)
 1560 A%=FNNetFS_Op(0,"ACCOUNT "+dst$+" "+STR$~acc%+" ("+STR$~aux%+")")
 1570 ENDPROC
 1580 DEFPROCLstDir(cflg%):x%=0:IFcsd%=-1:IFFNMount:PRINT"Not an MDFS disk":ENDPROC
 1590 PRINT"Path: MDFS::";title$;".";path$'
 1600 ptr%=32:cblk%=thisdir%!ptr%AND&FFFF
 1610 PROCRdBlocks(dir%,cblk%,D%,1)
 1620 FORA%=0TO63STEP4:bitmap%!A%=dir%!A%:NEXT
 1630 bit%=?bitmap%DIV2:fptr%=dir%+64
 1640 FORentry%=1TO255
 1650   IF(entry%AND7)=0:bit%=bitmap%?(entry%DIV8)
 1660   IF(entry%AND15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr%AND&FFFF:IFcblk%:PROCRdBlocks(dir%,cblk%,D%,1):fptr%=dir%
 1670   IF(bit%AND1)<>0THENPROCListFile(cflg%)
 1680 bit%=bit%DIV2:fptr%=fptr%+64:NEXTentry%
 1690 IF(x%AND3):IF(cflg%AND1)=0:PRINT
 1700 ENDPROC
 1710 DEFPROCListFile(cflg%)
 1720 PROCFileInfo(fptr%):PRINTfname$;SPC(11-LENfname$);
 1730 IF(cflg%AND1):PRINTFNh0(load%,8);" ";FNh0(exec%,8);" ";FNh0(length%,6);" ";
 1740 PRINTFNattr(access%);
 1750 IF(cflg%AND1):PRINTFNdate(cdate%);" ";FNdate(mdate%);" ";FNtime(mtime%);" ";
 1760 IF(cflg%AND1):PRINTFNh0(acc%,3);" (";FNh0(aux%,3);")":ENDPROC
 1770 x%=x%+1:IF(x%AND3)=0:PRINTELSEPRINT" ";
 1780 ENDPROC
 1790 DEFFNattr(A%):A$=""
 1800 IF(A%AND1):A$="r"+A$
 1810 IF(A%AND2):A$="w"+A$
 1820 A$="/"+A$
 1830 IF(A%AND4):A$="R"+A$
 1840 IF(A%AND8):A$="W"+A$
 1850 IF(A%AND16):A$="L"+A$
 1860 IF(A%AND32):A$="D"+A$
 1870 IF(A%AND64):A$="P"+A$
 1880 IF(A%AND128):A$="M"+A$
 1890 =A$+STRING$(8-LENA$," ")
 1900 DEFFNdate(A%)=FNd0(A%AND31,2)+"/"+FNd0((A%DIV256)AND15,2)+"/"+FNd0(1981+(A%DIV4096)+((A%AND&E0)/2),2)
 1910 DEFFNtime(A%)=FNd0(A%AND255,2)+":"+FNd0(A%DIV256,2)
 1920 DEFFNlook:src$=A$:ptr%=FNfind(src$):IFptr%=0:PRINT"'"src$"' not found":=TRUE
 1930 FORA%=0TO63STEP4:object%!A%=ptr%!A%:NEXT
 1940 ln%=object%!&14AND&FFFFFF:=FALSE
 1950 DEFFNfind(A$):match$=FNuc(LEFT$(A$,10)):match%=0:IFcsd%=-1:IFFNMount:=0
 1960 ptr%=32:cblk%=thisdir%!ptr%AND&FFFF
 1970 PROCRdBlocks(data%,cblk%,D%,1)
 1980 FORA%=0TO63STEP4:bitmap%!A%=data%!A%:NEXT
 1990 bit%=?bitmap%DIV2:fptr%=data%+64
 2000 entry%=1:REPEAT
 2010   IF(entry%AND7)=0:bit%=bitmap%?(entry%DIV8)
 2020   IF(entry%AND15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr%AND&FFFF:IFcblk%:PROCRdBlocks(data%,cblk%,D%,1):fptr%=data%
 2030   IF(bit%AND1)<>0THENfptr%?11=13:fname$=$(fptr%+1):match%=(FNuc(fname$)=match$)
 2040   IFNOTmatch%:bit%=bit%DIV2:fptr%=fptr%+64:entry%=entry%+1
 2050 UNTILentry%>255ORmatch%:IFmatch%:=fptr%ELSE=0
 2060 DEFPROCFileInfo(f%)
 2070 A%=f%?&B:f%?&B=13:fname$=FNs($(f%+1)):f%?&B=A%
 2080 FORA%=1TOLENfname$:IFMID$(fname$,A%,1)<"!"ORMID$(fname$,A%,1)>"~":fname$=""
 2090 NEXTA%
 2100 acc%=?f%
 2110 load%=f%!&C:exec%=f%!&10
 2120 length%=f%!&14AND&FFFFFF
 2130 access%=f%?&17
 2140 cdate%=f%!&18AND&FFFF:ctime%=0
 2150 mdate%=f%!&1AAND&FFFF:mtime%=f%!&1CAND&FFFF
 2160 aux%=f%?&1E:vec%=f%?&1FAND1
 2170 acc%=acc%OR(f%?&1FAND&0E)*128
 2180 aux%=aux%OR(f%?&1FAND&70)*8
 2190 attr%=(access%AND3)*16+(access%AND&C)/4+(access%AND16)/2+mdate%*256
 2200 ENDPROC
 2210 DEFFNMount
 2220 res%=0:data%!&40=0:PROCRdBlocks(data%,0,D%,1)
 2230 data%?&56=13:IF$(data%+&40)<>valid$:res%=1:PROCRdBlocks(data%,0,D%,1)
 2240 data%?&56=13:IF$(data%+&40)<>valid$:=-1
 2250 FORA%=0TO63STEP4:thisdir%!A%=data%!A%:NEXT:path$="$":root%=thisdir%!32AND&FFFF:csd%=root%
 2260 data%?&61=13:title$=$(data%+&57):dsize%=data%!&62AND&FFFF
 2270 idate%=data%!&7AAND&FFFF:itime%=data%!&7CAND&FFFFFF
 2280 =0
 2290 DEFPROCReadData(ptr%):LOCALp%:vec%=object%?&1FAND1
 2300 IFvec%=0:p%=32+(ptr%DIV1024)*2:cblk%=object%!p%AND&FFFF:PROCRdBlocks(data%,cblk%,D%,1):ENDPROC
 2310 p%=32+(ptr%DIV(512*1024))*2
 2320 cblk%=object%!p%AND&FFFF
 2330 PROCRdBlocks(alloc%,cblk%,D%,1)
 2340 p%=(ptr%AND(512*1024-1))
 2350 p%=(p%DIV1024)*2
 2360 cblk%=alloc%!p%AND&FFFF
 2370 PROCRdBlocks(data%,cblk%,D%,1)
 2380 ENDPROC
 2390 DEFPROCRdBlocks(addr%,block%,drive%,number%):LOCALp%
 2400 FORp%=0TOnumber%-1:PROCfdcRd(addr%+p%*1024,block%+res%+p%,drive%,1)
 2410 NEXT:ENDPROC
 2420 DEFPROCfdcRd(ad%,sc%,drv%,nm%)
 2430 FORA%=0TO1023STEP4:ad%!A%=0:NEXT:drv%=drv%AND-5:IFdrv%>7:ENDPROC
 2440 IFdrv$<>"":in%=OPENIN(drv$):IFin%=0:in%=OPENIN(drv$+s$):IFin%=0:ENDPROC
 2450 IFdrv$<>"":IFsc%*1024>EXT#in%:CLOSE#in%:in%=0:PRINT"Disk error: past end of image":ENDPROC
 2460 IFdrv$<>"":PROCgbpb(3,in%,ad%,nm%*1024,sc%*1024):CLOSE#in%:in%=0:ENDPROC
 2470 REPEAT:PROCfdcOp(1):ad%=ad%+1024:sc%=sc%+1:nm%=nm%-1:UNTILnm%<1
 2480 ENDPROC
 2490 DEFPROCfdcOp(op%):LOCALr%:r%=-1
 2500 IFos%=6:trk%=sc%DIV5:hd%=trk%AND1:trk%=trk%DIV2:sec%=sc%MOD5:SYS"XADFS_DiscOp",,op%,((trk%*2+hd%)*5+sec%)*1024+0+(drv%<<29),ad%,1024TOr%
 2510 IFos%<6:IFop%=1:trk%=sc%DIV5:trk%=trk%DIV2+80*(trk%AND1):r%=FNscsi(addr%,&08,drv%OR4,trk%*16+sc%MOD5,1)
 2520 IFcsd%=-1:ENDPROC
 2530 IFr%:IFPOS:PRINT
 2540 IFr%=-1:PRINT"Unsupported":ENDPROC
 2550 IFr%:PRINT"Disk error &";FNh0(r%,2);" at ";drv%":";~sc%
 2560 ENDPROC
 2570 DEFFNscsi(addr%,cmd%,drv%,sect%,num%):LOCALfs%
 2580 fs%=FNfs:IFfs%<>8:*FADFS
 2590 X%?0=0:X%!1=addr%:X%?5=cmd%:X%?6=drv%*32+((sect%AND&1F0000)DIV65536)
 2600 X%?7=((sect%AND&FF00)DIV256):X%?8=sect%:X%!9=num%:X%!11=0
 2610 A%=&72:CALL&FFF1:A%=?X%:IFfs%<>8:OSCLI"FX143,18,"+STR$fs%
 2620 =A%
 2630 DEFFNfn_todos(A$):LOCALB%:IF(os%AND-32)=0:=A$
 2640 FORA%=1TOLENA$:B%=INSTR("/?<>+=;\",MID$(A$,A%,1)):IFB%:A$=LEFT$(A$,A%-1)+MID$(".#$^&@%~",B%,1)+MID$(A$,A%+1)
 2650 NEXT:=A$
 2660 DEFFNyna(A%):IFA%=0:=0
 2670 PRINT"? (Y/N/A)";:REPEAT:A%=INSTR("YAN",CHR$(GETAND&DF)):UNTILA%
 2680 PRINTSTRING$(7,CHR$127);MID$("YesAllNo ",A%*3-2,3);:=A%-2
 2690 DEFFNfx(A%,X%):LOCALY%:Y%=X%DIV256:=((USR&FFF4)AND&FFFF00)DIV256
 2700 DEFFNh0(A%,N%):=RIGHT$("0000000"+STR$~A%,N%)
 2710 DEFFNd0(A%,N%):=RIGHT$("00000000"+STR$A%,N%)
 2720 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
 2730 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
 2740 =A$
 2750 DEFFNuc(A$):LOCALB$:IFA$="":=""
 2760 REPEATB$=B$+CHR$(ASCA$AND((A$<"@")OR&DF)):A$=MID$(A$,2):UNTILA$="":=B$
 2770 DEFFNfile(A$,A%):IFPAGE<&FFFFF:$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF
 2780 A$=FNf_name(A$):IFA%=255ORA%=5:X%!14=OPENIN(A$):IFX%!14:X%!10=EXT#X%!14:CLOSE#X%!14:X%!14=&33
 2790 IFA%=255:IFX%?6=0:OSCLI"LOAD """+A$+""" "+STR$~X%!2:=1
 2800 IFA%=5:IFX%!14:=1ELSEIFA%=5:=0
 2810 IFA%=0:OSCLI"SAVE """+A$+""" "+STR$~X%!10+" "+STR$~X%!14:X%!10=X%!14-X%!10:=1
 2820 IFA%=7:OSCLI"SAVE """+A$+""" "+STR$~PAGE+"+"+STR$~X%!10:X%!10=X%!14-X%!10:=1
 2830 IFA%=8THEN
 2840   LOCALERROR:ONERRORLOCAL:=2
 2850   OSCLI"mkdir "+A$:=2
 2860 ENDIF
 2870 =0
 2880 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
 2890 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IFPAGE<&FFFFF:CALL&FFD1:ENDPROC
 2900 IFA%=1ORA%=3:PTR#?X%=X%!9
 2910 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1ELSEIFA%=3ORA%=4:?X%!1=BGET#?X%
 2920 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X%ANDA%>2)ORX%!5<1:ENDPROC
 2930 DEFFNfs:IF(os%AND-32)=0:LOCALA%,Y%,E%:=(USR&FFDA)AND&FF
 2940 =29
 2950 DEFPROCf_cdir(A$):IF(os%AND-24):A$="mkdir "+A$ELSEA$="cdir "+A$
 2960 IFFALSETHEN
 2970   OSCLIA$:ENDPROC
 2980 ENDIF
 2990 LOCALERROR:ONERRORLOCAL:ENDPROC
 3000 OSCLIA$
 3010 ENDPROC
 3020 DEFFNf_openout(A$)=OPENOUT(FNf_name(A$))
 3030 DEFFNf_name(A$):IFos%AND-32:LOCALA%,B%:REPEATB%=A%:A%=INSTR(A$,"\",A%+1):UNTILA%=0:IFINSTR(A$,".",B%)=0:A$=A$+"."
 3040 =A$
 3050 DEFFNNetFS_Op(A%,A$)=FNNetFS_OpN(A%,0,7,A$)
 3060 DEFFNNetFS_OpN(A%,T%,O%,A$):!X%=0:X%?1=O%+1+LENA$:X%!3=A%:X%?7=T%:$(X%+O%)=A$
 3070 IFHIMEM>&FFFF:SYS&60048,A%,X%+7,X%?1,120TOA%:IFA%=0:X%?3=0:=0
 3080 IFHIMEM>&FFFF:IFA%>&FFFF:X%?3=?A%:SYS&2002B,A%+4TO$(X%+4):=X%?3
 3090 A%=&14:CALL&FFF1:=X%?3