# > CPMFiler v1.31b 29-Aug-2020 Kos%=fx(0,1)&FF:10,8:A%=:13:A%<50:&87:>&7C00:&83:>&4000:&80 <&FFFF:=fx(132,0) (7init:"CPMFiler v"ver$" by J.G.Harston"':err: 2:X%=ctrl%:Y%=X%256:: <8:wdt%=+1: FRdrv$="":(D%+65);user%,user%>-1);pmt$;"["drv$;":"+user%,user%>-1)"] "; P""A$:do(s(A$)) Z d+init:pmt$=">":ver$="1.31a":max%=&0FFF n?ctrl% 31,name% 19,store% 255,data% max%:X%=ctrl%:Y%=X%256 x;D%=0:drv$="":user%=-1:CPN%=:bsz%=0:os%=6:diskrec% 67 @fs%=fs:d$=".":s$="/":os%-24:d$="/":s$=".":os%-32:d$="\" Rcmd$=":MOUNT:USER:DIR:STAT:INFO:TYPE:DUMP:DISS:COPY:FREE:MAP:BLOCK:HELP:QUIT:" hlp$=":|:::():(): [CTRLS]: [7BIT]: (): ()::::::"  ݤerr:"FX229":: !:fs<>fs%:"FX143,18,"+fs% ?CloseAll:A%=<>17<>28:" at line "+Þ,<128A%):=-1A% CloseAll 'out%=out%:out%:A%=out%:out%=0:#A% 'dsk%=dsk%:dsk%:A%=dsk%:dsk%=0:#A%  do(A$):A$="?":A$="HELP" A$,1)=";"A$="": A$,1)="*":A$,2):  A$,1)=".":A$="CAT "+A$,2) 6A%=A$+" "," "):B$=uc(A$,A%-1)):A$=s(A$,A%+1)) "-B$=2B$,1)=":"B$<":":B$=(B$+17)+":" ,>B$=2B$,1)=":"B$>"@"B$<"Q":D%=B$-65:drv$="":bsz%=0: 6/A%=cmd$,":"+B$+":"):A%=0:"Bad command": @#A%=("FN_"+B$+"("""+A$+""")"): J-ݤsyn(S$):A$="":"Syntax: "B$" "S$:== Tݤ_QUIT(A$):"Quit" ^ hos%>5:*QUIT r |ݤ_HELP(A$):p%=2:q%=2: 2A%=cmd$,":",p%):" "cmd$,p%,A%-p%);:p%=A%+1 0A%=hlp$,":",q%):8)hlp$,q%,A%-q%):q%=A%+1 p%>cmd$:=0 Hݤ_MOUNT(A$):bsz%=0:A$="":=0A$=1:do(A$+":"):=0D%=-1:drv$=A$:=0 %ݤ_USER(A$):user%=A$(A$<"0"):=0 ݤ_DIR(A$):LstDir(1):=0 ݤ_STAT(A$):LstDir(3):=0 'ݤ_BLOCK(A$):syn(""):= #sect%=("&"+uc(A$)):Mount:= ?ptr%=store%:!store%=sect%:store%!16=sect%:ln%=bsz%:dump:=0 "ݤ_DUMP(A$):syn(""):=  look:=  dump:=0 file0:ext%=0:M%=bsz%-1: 7file1:(P%M%)=0:ReadData(P%bsz%,ptr%):O%=data%  &bfile2:CPN%=0:ln%=bsz%*16:ext%=ext%+exm%+1:ptr%=find(src$,ext%):ptr%:ln%=len(ptr%)ln%=0 0 :)dump:cols%=16:B%=0:wdt%<80:cols%=8 D6file0::Q%=0ln%-1cols%:B$="":h0(Q%+B%,6)" "; N@P%=Q%Q%+cols%-1:file1:P%=" "A$<="~" B$=B$+A$B$=B$+"." b-O%=O%+1::B$::B%=B%+ln%:file2:ln%<1: l"ݤ_TYPE(A$):syn(""):= v3msk%=A$," [")<>0:msk%=(msk%&80)&7F:look:= file0:last%=0 8:P%=0ln%-1:file1:Q%=?O%msk%:?O%=26:P%=ln%:Q%=0 -msk%=&FF:Q%Q%>31Q%<>127:Q%:last%=Q% 8msk%=&7F:Q%=10Q%=13:last%<>23-Q%:10,13:last%=Q% )msk%=&7F:Q%=9:(8-(8));:last%=Q% O%=O%+1::file2:ln%<1:=0 "ݤ_DISS(A$):syn(""):= KA%=A$," "):A%:addr%=("&"+uc(A$,A%+1))):A$=s(A$,A%-1))addr%=&100  look:= UA%=190:!X%=&502004:X%!4=0:&FFF1:$(X%+4),"Z80")=0:"No Z80 DisAssem routine":= Hfile0::P%=0::file1:!X%=&50200C:X%!4=addr%:X%!8=!O%:A%=190:&FFF1 Eh0(addr%,4)" ";:Q%=0X%?3-1:h0(O%?Q%,2)" ";::(12-3*X%?3); =Q%=0X%?3-1:c(O%?Q%)::(5-X%?3);$(X%+4):(X%?264): (A%=O%-data%:A%+X%?3>M%:X%?3=M%-O%+1  Eaddr%=addr%+X%?3:O%=O%+X%?3:P%=P%+X%?3:P%>ln%-1:file2:ln%<1:=0 ݤ_FREE(A$):Mount:=  CPN%:"Not yet done.":=0 *0):A% 4free%=dsize%bsz%-used%: >:h0(free%,4)" Blocks = "d(free%*bsz%,9)" bytes free" H:h0(used%,4)" Blocks = "d(used%*bsz%,9)" bytes used" R=0 \ݤ_MAP(A$):Mount:= fCPN%:"Not yet done.":=0 p3map(4):A%=0dmx%:(A%31)=0:'h0(A%,2*alz%); z32:tst(A%):3546 : =0  map(A%) ."FREE SPACE"" MAP",A%)" ON "(D%+65)":"; A%=02554:store%!A%=0:A% ,A%=0(drm%+1)/(blm%+1)/4-1:set(A%):A% %dmx%8>255:'"Buffer overflow": 'p%=0drm%:(p%15)=0:RdDir(p%16) (q%=(p%15)*32+16(p%15)*32+31alz% 'A%=data%!q%&FFFF:alz%=1:A%=A%&FF A%:set(A%)  q%:p%: 6set(A%):store%?(A%8)=store%?(A%8)(2^(A%7)): 'ݤtst(A%):=store%?(A%8)(2^(A%7)) #ݤ_INFO(A$):A$<>"":=_STAT(A$) Mount:= $"Disk Information:" .L"exm= "d(exm%,2)" stp="d(stp%,4)" drm="d(drm%,5)" alz="d(alz%,5) 8L"bsh= "d(bsh%,2)" blm="d(blm%,4)" bsz="d(bsz%,5)" dmx="d(dmx%,5) B"res= "d(res%,2)" spt="d(spt%*ltp%*(2^bps%)128,4)" hds="d(hds%,5)" tks=";d(hds%/ltp%*(dsize%/hds%/spt%/ssz%+0.9),5) LU"den= "d(den%,2)" sec0="d(sec0%,3)" psec="d(ssz%/ltp%,4)" lsec="d(ssz%,4) VX"skew="d(skew%,2)" flip="d(flip%,3)" trk= ""INTSEQ",(seq%1)*3+1,3)" "type$' `2"Directory starts at &"h0(res%*ssz%/ltp%,6) j8"Directory entries:"4;(drm%+1);" x ";stp%;" bytes" t&"Directory size:"7;(drm%+1)*stp% ~@"Data area starts at &"h0(res%*ssz%/ltp%+(drm%+1)*stp%,6) #"Block size:"10"&"h0(bsz%,4) 0"Disk size:"12;dsize%" (";dsize%1024;"K)" =0 @ݤ_COPY(A$):syn(" (onfirm)"):= 5A%=A$+" "," "):src$=A$,A%-1):dst$=s(A$,A%+1)) 9cnf%=uc(dst$,2))=" C":cnf%:dst$=s(dst$,dst$-2)) @os%<6:dst$,"::")dst$,1)="-":"FS prefix unsupported":= 7src$="*"src$="*.*":CopyDirectoryCopyOneFile(1) =0 CopyDirectory  Mount: :dest$=dst$:dest$<>"":A%=file(dest$,8):dest$=dest$+d$ /m%=(stp%48)-1:p%=0drm%:RdDir(p%(m%+1))  1ptr%=data%+(p%m%)*stp%+(CPN%4):A$="":A%=1: .ptr%?A%<>32:A$=A$+(ptr%?A%):A%=A%+1A%=9 AA%>8:A$=A$+"."::ptr%?A%<>32:A$=A$+(ptr%?A%):A%=A%+1A%=12 ((A%>11:user%>=0:?ptr%<>user%:A$="" 2$CPN%:ptr%=ptr%-4:!ptr%=0:A$="" <"CPN%=0:ptr%?12(exm%):A$="" FCPN%=0:?ptr%>127:A$="" P8A$<>"":src$=A$:dst$=dest$+fn_undos(A$):CopyObject Z p%: dCopyObject n7cnf%:"Copy "src$;:cnf%=yna(cnf%):cnf%>0::13 xptr%=info:CopyOneFile(0)  CopyOneFile(one%) )dst$="":" filename missing": *"Copying "src$;(12-src$)" to "dst$; 6one%:ptr%=find(src$,0):ptr%=0:" - not found": Hln%=len(ptr%):open:"Save "+dst$+" "+~+"+"+~ln%+" 0 0":ln%=0: 0out%=(dst$):out%=0:" - can't open dest": (file0:" **%";::P%=0ln%-1:file1 0(P%1023)=0:8;8;8;d(100*P%ln%,2);"%"; &#out%,?O%:O%=O%+1::file2:ln%<1 ##out%:out%=0:127;127;127: LstDir(cflg%):Mount: Aptr%=0:A$<>"":ptr%=find(A$,0):ptr%=0:"'"A$"' not found": (cflg%3)=3:"D:"; x%=1(wdt%32)(CPN%<>0) o(cflg%3)=3:"FILENAME.EXT U LENGTH RSA ";:CPN%=0:"EX <- -- -- -- -- -- ALLOCATION -- -- -- -- -- ->"; "#(cflg%3)=3:CPN%:"Sect "; , x%:x%=0:8:ptr%:PrInfo: 6:m%=(stp%48)-1:p%=0drm%:(p%m%)=0:RdDir(p%(m%+1)) @#ptr%=data%+(p%m%)*stp%:PrInfo J p%:: T ^ PrInfo hCPN%=0:?ptr%>127: r,CPN%:?ptr%+ptr%?1=0?ptr%+ptr%?1=510: |%user%>=0:ptr%?(CPN%4)<>user%: x%=0:(65+D%)":"; 7PrN(ptr%+(CPN%4)+1):x%=x%+1:x%>=wdt%16:x%=0:: (cflg%2)=0:" : ";: ;d(ptr%?(CPN%4),3);d(len(ptr%),7)" "attr(ptr%)" "; xCPN%=0:h0(ptr%?12,2);:q%=ptr%+16:" "h0(!q%,2*alz%);:q%=q%+alz%:?q%=0?(q%+alz%-1)=0q%>ptr%+31:q%>ptr%+31:8 )CPN%:h0(!ptr%,4);4;:x%127),1)+"-S",1-(ptr%?10>127),1)+"-A",1-(ptr%?11>127),1) ,ݤc(A%):A%=A%127:A%>31:A%<127:=A%=46 Cݤlook:src$=A$:ptr%=find(src$,0):ptr%:ln%=len(ptr%):open:= "'"src$"' not found":= ݤfind(A$,ext%):p%,ptr% -A$,2,1)=":":D%=(A$,1)15)-1:A$=A$,3) Mount:=0 &9A%=A$+".","."):A%<9:A$=A$,A%-1)+9-A%," ")+A$,A%) 02A%=A$+".","."):A$=A$,8)+A$+" ",A%+1),11) :?$name%=user%+A$:A%=111:name%?A%>95:name%?A%=name%?A%-32 D>A%:m%=(stp%48)-1:p%=0drm%:(p%m%)=0:RdDir(p%(m%+1)) N:ptr%=data%+(p%m%)*stp%+(CPN%4):user%<0:?name%=?ptr% X(ptr%!0&7F7F7F1F)=name%!0:(ptr%!4&7F7F7F7F)=name%!4:(ptr%!8&7F7F7F7F)=name%!8:CPN%(ptr%?12(exm%))=ext%:p%=drm%+1ptr%=0 b'p%:ptr%:ptr%=ptr%-(CPN%4):=info l=0 v)ݤlen(p%):CPN%:=(p%!2&FFFF)*128+128 6=16384*(p%?12exm%)+128*p%?15+p%?13+128*(p%?13<>0) 3ݤinfo:A%=0314:store%!A%=ptr%!A%:A%:=store% open:CPN%=0: link%=ptr%!0&FFFF (link%&C0)=&00 (link%&C0)=&80 #ReadCPN(store%,cpn(link%),D%)  -ݤcpn(A%):A%=A%&3FFF:=(A%15)+10*(A%16) .RdDir(dir%):ReadBigSector(data%,dir%): ݤMount:bsz%:=0 dbsz%=0:drm%=2:res%=0:sec0%=0:spt%=10:den%=1:ssz%=256:hds%=1:skew%=1:flip%=0:ltp%=1:seq%=1:CPN%= +dsz%=0:res%=dir:type$="":res%<0:=res% Rres%=&00:type$="AmstradDOS":bsh%=3:exm%=0:dmx%=&0B3:bps%=9:sec0%=&C1:spt%=036  Ures%=&01:type$="HardDisk":bsh%=5:exm%=1:dmx%=2046:bps%=8:sec0%=0:spt%=256:drm%=8 Wres%=&12:type$="Spectrum+3":bsh%=3:exm%=0:dmx%=&0AE:bps%=9:sec0%=1:spt%=036:hds%=2  Ires%=&1A:type$="IBM":bsh%=3:exm%=0:dmx%=&000:bps%=7:sec0%=1:spt%=026 *lres%=&1E:type$="AcornCPM":bsh%=4:exm%=1:dmx%=0195:bps%=8:sec0%=0:spt%=020:hds%=2:flip%=1:skew%=2:ltp%=2 4Rres%=&24:type$="AmstradSYS":bsh%=3:exm%=0:dmx%=&0AA:bps%=9:sec0%=&41:spt%=036 >Nres%=&28:type$="Einstein":bsh%=3:exm%=1:dmx%=0189:bps%=9:sec0%=1:spt%=040 Hhres%=&3C:type$="SloggerCPM":bsh%=5:exm%=3:dmx%=0195:bps%=9:sec0%=0:spt%=040:hds%=2:flip%=1:skew%=-2 RQCPN%:type$="TorchCPN":bsh%=1:exm%=0:dmx%=1599:bps%=8:sec0%=0:spt%=020:hds%=2 \ares%=0:dsz%>&FFFFF:type$="AcornCPMv2":bsh%=5:exm%=1:dmx%=512:bps%=8:sec0%=0:spt%=256:drm%=4 f:type$="":pr(0):"Unrecognised disk &"h0(res%,2):=-5 pCbps%<8bps%>9:"Can only do 256-byte and 512-byte sectors":=-6 zdmx%<256:alz%=1alz%=2 Tres%=&28:fdcRd(data%,D%,-&28,1):alz%=2-((data%?12)2):bsh%=2+alz%:drm%=3-alz% blm%=2^bsh%-1 bsz%=2^(7+bsh%) drm%=bsz%*drm%/32-1 ssz%=2^bps%*ltp% !spt%=(spt%*128)(2^bps%)ltp% CPN%:stp%=16stp%=32 bps%<9:den%=1den%=2 HCPN%:drm%=159:seq%=1:fdcRd(data%,D%,18,1):!data%=&D9D8D7D6:seq%=0 res%=res%*256/(ssz%/ltp%) 'dsize%=(dmx%+1)*bsz%+res%*ssz%/ltp% =0 /ݤdir:fdcRd(data%,D%,0,1):err%:=err%-256 'data%!16=0:chk(data%+4):CPN%=:=0 +data%?8=13:uc($data%)="ACORN CP":=&1E  uc($data%)="SLOGGER ":=&3C $ ptr%=-1: .'ptr%=ptr%+1:fdcRd(data%,D%,ptr%,1) 8Herr%:den%=3-den%:bps%=bps%1:ssz%=ssz%&300:fdcRd(data%,D%,ptr%,1) Bfnd%=chk(data%) L)fnd%ptr%>&FE:err%:=err%-256=ptr% Vݤchk(p%):p%?0>&22:= `p%!12&E080E0:= jp%?15>128:= tCA%=1::fnd%=""":=?*,.",c(p%?A%)):A%=A%+1:A%=12fnd%:=fnd%=0 ~ReadData(q%,ptr%) 2CPN%:ReadCPN(data%,cpn(store%!(q%*2)),D%): -alz%=1:ReadCPM(data%,ptr%?(q%+16),D%): -ReadCPM(data%,ptr%!(q%*2+16)&FFFF,D%): "ReadCPN(addr%,block%,drive%) Oseq%:Sc%=block%10:Hd%=(block%10)2:Tk%=block%20:sec%=Sc%+Tk%*10+Hd%*800 Pseq%=0:Sc%=block%10:Hd%=(block%10)2:Tk%=block%20:sec%=Sc%+Tk%*40+Hd%*20 fdcRd(addr%,drive%,sec%,1)  "ReadCPM(addr%,block%,drive%) HS%=0(bsz%512)-1:ReadBigSector(addr%+S%*512,block%*(bsz%512)+S%) : ReadBigSector(ad%,sec512%) .fdcRd(ad%,D%,sec512%*(512/ssz%),512/ssz%)  !fdcRd(addr%,drv%,sec%,num%) ]err%=0:sec%=sec%+res%/ltp%::fdcRdOne:addr%=addr%+ssz%:sec%=sec%+1:num%=num%-1:num%<1: (fdcRdOne:s0%=sec% 2Daddr%>data%+max%+1addr%+ssz%>data%+max%+2:"Buffer overflow": <)A%=0ssz%-14:addr%!A%=0::drv%>7: F:Tk%=sec%spt%:Sc%=sec%spt%:flip%:Tk%>79:Tk%=239-Tk% P=seq%=0:hds%>1:Hd%=Tk%1:Tk%=Tk%2Hd%=Tk%80:Tk%=Tk%80 Zskew%>1:Sc%=Sc%*skew%spt% d*skew%<0:Sc%=(Sc%*-skew%spt%)-(Sc%>4) nsec%=(Hd%*80+Tk%)*spt%+Sc% xdrv$="":fdcOp(1): Fdsk%=f_openin(drv$):dsk%=0:err%=-2:pr(27):"image not found";: Wdsz%=#dsk%:sec%*ssz%>dsz%:#dsk%:dsk%=0:err%=-3:pr(33):"past end of image"4;: 6f_gbpb(3,dsk%,addr%,ssz%,sec%*ssz%):#dsk%:dsk%=0  pr(A%):<>A%: 13;"Disk error: ";: fdcOp(op%):err%=-1 os%=6:err%=fdcArc os%<6:err%=fdcBBC bsz%=0: err%:: err%=-1:"Unsupported": =err%:"Disk error &"h0(err%,2)" at ";drv%":"h0(sec%,6)  :fdcInit(dskrec%,bps%,spt%,hds%,den%,trks%,sec0%):i% Ddskrec%?0=bps%:dskrec%?1=spt%*ltp%:dskrec%?2=hds%:dskrec%?3=den% "2i%=4594:dskrec%!i%=0::dskrec%!64=&20000000 ,1:op%=1:=scsi(addr%,&08,drv%,sec0%+sec%,1) =-1 %ݤfn_undos(A$):B%:(os%-32):=A$ TA%=1A$:B%=".#$^&@%~",A$,A%,1)):B%:A$=A$,A%-1)+"/?<>+=;\",B%,1)+A$,A%+1) :=A$ ݤyna(A%):A%=0:=0 +"? (Y/N/A)";::A%="YAN",(&DF)):A% +7,127);"YesAllNo ",A%*3-2,3);:=A%-2 7ݤdisk(addr%,cmd%,drv%,trk%,sec%,num%,den%):fs%,n% fs%=fs:fs%<>4:*FX143,18,4 $:n%=num%:sec%+n%>10:n%=10-sec% D:X%?0=drv%+den%*24+8+2*(trk%80):X%!1=addr%:X%?5=3-7*(cmd%>127) @X%?6=cmd%:X%?7=trk%80:X%?8=sec%:X%!9=n%&1E20:A%=127:&FFF1 YA%=X%?(7+X%?5):A%<>&10:addr%=addr%+n%*256:num%=num%-n%:sec%=(sec%+n%)10:trk%=trk%+1 +A%<>0num%<1:fs%<>4:"FX143,18,"+fs% &=A% 0+ݤscsi(addr%,cmd%,drv%,sect%,num%):fs% :fs%=fs:fs%<>8:*FADFS DDX%?0=0:X%!1=addr%:X%?5=cmd%:X%?6=drv%*32+((sect%&1F0000)65536) N9X%?7=((sect%&FF00)256):X%?8=sect%:X%!9=num%:X%!11=0 X2A%=&72:&FFF1:A%=?X%:fs%<>8:"FX143,18,"+fs% b=A% l5ݤfx(A%,X%):Y%:Y%=X%256:=((&FFF4)&FFFF00)256 v$ݤh0(A%,N%):="0000000"+~A%,N%) $ݤd(A%,N%):=" "+A%,N%) /ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " +A$,1)=" ":A$=A$,A$-1):A$,1)<>" " =A$ ݤuc(A$):B$:A$="":="" 5B$=B$+(A$((A$<"@")&DF)):A$=A$,2):A$="":=B$ &ݤc0(A%):A%>127:="|!"+c0(A%127) 7A%<32A%=127:="|"+(A%64)="|",A%=34A%=124)+A% Rݤfile(A$,A%):A%-8:<&FFFFF:$name%=A$:?X%=name%:X%?1=name%256:=(&FFDD)&FF RA$=f_name(A$):A%=255A%=5:X%!14=(A$):X%!14:X%!10=#X%!14:#X%!14:X%!14=&33 1A%=255:X%?6=0:"LOAD """+A$+""" "+~X%!2:=1 A%=5:X%!14:=1A%=5:=0 FA%=0:"SAVE """+A$+""" "+~X%!10+" "+~X%!14:X%!10=X%!14-X%!10:=1 BA%=7:"SAVE """+A$+""" "+~+"+"+~X%!10:X%!10=X%!14-X%!10:=1 A%-8:=0 +(os%-24):A$="mkdir "+A$A$="cdir "+A$ >&FFFF:::=0 * A$:=2 4%f_gbpb(A%,chn%,addr%,num%,ptr%) >>?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:<&FFFFF:&FFD1: HA%=1A%=3:#?X%=X%!9 R3:A%=1A%=2:#?X%,?X%!1A%=3A%=4:?X%!1=#?X% \2X%!1=X%!1+1:X%!5=X%!5-1:(#?X%A%>2)X%!5<1: f-ݤfs:(os%-32)=0:A%,Y%,E%:=(&FFDA)&FF p=29 z!ݤf_openin(A$)=(f_name(A$)) Wݤf_name(A$):os%-32:A%,B%:B%=A%:A%=A$,"\",A%+1):A%=0:A$,".",B%)=0:A$=A$+"." =A$