> MDRtoBIN 1.14  (C) J.G.Harston " Extract files from MDR files (" v1.11 - Uses CmdLine library 27 v1.12 - Updated ProgEnv library for BB4Wv6+Brandy <' v1.14 - Spectrum filename cleaned FC To do: needs to make a second pass to set dest file addresses P: Z" :Close_All::exit(): d1A$=OS_GetEnv+" ":f_init:os%>31:Win_TextIO nQseclen%=543: ctrl% 31,name% 80,secbuf% seclen%-1,type$(4):X%=ctrl%:Y%=X%256 xXtype$(0)="Print":type$(1)="Basic":type$(2)="Num ":type$(3)="Char ":type$(4)="Bytes" xA$=" ": "Source microdrive file: "in$: "Destination dir: "outd$: "Options/flags: "A$:A$=in$+" "+outd$+" "+A$ $dst%=cl("-d",0):ro%=cl("-r",0) 7 CmdLine bugfix requires space before final option A$=A$+" ":vb%=cl("-v",0) Qin$=cl("",1):outd$=cl("",1):outd$<>"":outd$,1)=d$:outd$=outd$,outd$-1) Gin$="-?":"Usage: MDRtoBIN () -d -v -ro":exit(0): in$="":exit(0): : Din%=f_openin(in$):in%=0:"File '"in$"' not found":exit(214): ,outd$<>"":f_cdir(outd$):outd$=outd$+d$ 4vb%: "Filename Type Start Extr Line Len";  $f_gbpb(4,in%,secbuf%,seclen%,0) 'secbuf%?14=13:SpTitle$=$(secbuf%+4) SpFlag%=secbuf%?15 SpRec% =secbuf%?16 "SpNum% =(secbuf%!17)&FFFF ,'secbuf%?29=13:SpName$=$(secbuf%+19) 6% SpRec%=0:RdHeader RdData(0) @#in%:#in%:in%=0:vb%: Jexit(0): T: ^RdHeader h SpFlag%=0: SpNum%=0: rSpType% =secbuf%?30 |SpLen% =secbuf%!31 &FFFF SpStart%=secbuf%!33 &FFFF SpExtra%=secbuf%!35 &FFFF SpLine% =secbuf%!37 &FFFF  SpType%=0:SpStart%=SpLine% P SpType%=1:SpExtra%=SpStart%:SpStart%=256*secbuf%?35+secbuf%?36: Bigendian P SpType%=2:SpExtra%=SpStart%:SpStart%=256*secbuf%?35+secbuf%?36: Bigendian C (SpFlag% 4)=0:SpType%=-1:SpStart%=-1:SpExtra%=-1:SpLine%=-1 D vb%:'fn_clean(SpName$)" ";: ro%:HeaderRO vb%:HeaderZX ( SpType%=-1:RdData(0) RdData(9)  : HeaderZX > SpType%<4: type$(SpType%+1); " &"h0(SpType%,2)" "; O " "h0(SpStart%,4)" "h0(SpExtra%,4)" "h0(SpLine%,4)" "h0(SpLen%,4);  : &HeaderRO 0V hi(SpType%);h0(SpStart%,4);" ";hi(SpType%);h0(SpExtra%,4);" ";h0(SpLen%,4); : D: NRdData(off%) X SpFlag%=0: SpNum%=0: b8SpTitle$=s(SpTitle$):SpName$=s(SpName$):out$=outd$ l SpName$="":"null": vRdst%:SpTitle$<>"":out$=outd$+fn_unspec(SpTitle$):f_cdir(out$):out$=out$+d$ !out$=out$+fn_unspec(SpName$) 6out%=f_openup(out$):out%=0:out%=f_openout(out$) 'out%=0:"Couldn't open '"out$"'": 8ptr%=SpRec%*512: SpRec%>0: SpFlag% 4:ptr%=ptr%-9 4f_gbpb(1,out%,secbuf%+30+off%,SpNum%-off%,ptr%) 9#out%:out%=0: SpRec%<>0:: Set attrs when record 0 ( SpType%=-1:SpStart%=-1:SpExtra%=-1 A%=file(out$,5) "X%!2=SpType%*&10000 SpStart% "X%!6=SpType%*&10000 SpExtra% A%=file(out$,1)  :  ݤfn_unspec(B$): B$="":="_"  =B%,C$:A$="""#$%&:<>*.@[\]^{|}~":C$="'?S;+;()+/=(/)'(')'" M(os%-24):A$=""":<>?*/\|":C$="';()#+..'":(os%-32):A$="""?*/":C$="'#+."  # A%=1 B$:B%=A$,B$,A%,1)) *) B%:B$=B$,A%-1)+C$,B%,1)+B$,A%+1) 4> B$,A%,1)<"!" B$,A%,1)>"~":B$=B$,A%-1)+"_"+B$,A%+1) > :=B$ H: Rݤfn_clean(A$): A$="":="" \L A%=1 A$: A$,A%,1)<" " A$,A%,1)>"~":A$=A$,A%-1)+"_"+A$,A%+1) f :=A$ p: z ݤhi(A%) " A%<3:=h0(A%,2) =h0(-1,2) #ݤh0(A%,N%)="0000000"+~A%,N%) /ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " +A$,1)=" ":A$=A$,A$-1):A$,1)<>" " =A$ : Close_All:*Exec "in%=in%:in%:A%=in%:in%=0:#A% 'out%=out%:out%:A%=out%:out%=0:#A%  : Lݤfile(A$,A%):<&FFFFF:$name%=A$:?X%=name%:X%?1=name%256:=(&FFDD)&FF =0 :  f_init 6d$=".":s$="/":os%40:d$="/":s$=".":os%>31:d$="\" $ .: 8!ݤf_openin(A$)=(f_name(A$)) B"ݤf_openout(A$)=(f_name(A$)) L!ݤf_openup(A$)=(f_name(A$)) VVݤf_name(A$):os%>31:A%,B%:B%=A%:A%=A$,"\",A%+1):A%=0:A$,".",B%)=0:A$=A$+"." `=A$ j: tf_cdir(A$) ~,(os%40):A$="mkdir "+A$ A$="cdir "+A$   A$:   : : A$  : 0f_gbpb(A%,chn%,addr%,num%,ptr%): num%=0: ??X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:<&FFFFF: &FFD1: A%=1A%=3:#?X%=X%!9 5:A%=1A%=2:#?X%,?X%!1 A%=3A%=4:?X%!1=#?X% 5X%!1=X%!1+1:X%!5=X%!5-1:(#?X% A%>2) X%!5<1: :  cݤcl(l$,n%):l$="":A$=s(A$):A$=34:A%=A$+" "" ",""" ",2):l$=A$,2,A%-2):A$=s(A$,A%+1)):=l$ "":A%=A$,l$):A%:A$=s(A$,A%-1)+A$,A$," ",A%)+1))+" ":= (n%=0:l$<>"":= 2%A%=" ",l$=32)+A$,l$):A%=0:="" <'A$=A$,A%-1)+s(A$,A$," ",A%)+1)) FCl$=32:l$=A$,A%):A$=A$,A%-1):=l$,1-(l$=34),l$+2*(l$=34)) PPA$,A%,1)<>34:l$=A$,A%,A$+" "," ",A%)-A%):A$=A$,A%-1)+A$,A%+l$+1):=l$ ZJl$=A$,A%+1,A$+""" ",""" ",A%+1)-A%-1):A$=A$,A%-1)+A$,A%+l$+3):=l$ d/ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " n+A$,1)=" ":A$=A$,A$-1):A$,1)<>" " x=A$ : BݤOS_GetEnv:A%,X%,Y%,P%,A$:X%=1:os%=((&FFF4)&FF00)256:X% d!=&D7C1C7C5:run$=ARGV$(0):ARGC:A%=1ARGC:A$=A$+ARGV$(A%)+" "::=A$,A$-1)!=&D7C1C7C5:="" _>&FFFFF:X%256:A$=@cmd$:ș"GetModuleFileName",0,X%,255:run$=$$X%:Y%=@lib$,@tmp$)=0:P%= P%=0:>&FFFF:run$=$&8100:ș"OS_GetEnv"A$,,A%:ș"OS_WriteEnv","",A%:A$=A$,1+A$+" "," ",1+A$," "))):P%=:Y%=:A$," ")=0:A$=run$+" " P%=0:P%=X%:[OPT 0:NOP:]:P%=?X%:Y%=:P%=&EAP%=18:A$=$&600 P%=0:A$=$(-&300)P%=&A0:A$=$(^@%-256):Y%=?(-2)64P%=&90:A$=$&100:Y%=!&200 KA$=" "+A$:A$=A$,2):A$<>32:A$=34:A%=A$,"""",2)+1A%=A$+" "," ") (Y%:run$=A$,A%-1):A$=A$,A%+1):Y%=0 A$<>32:=A$ : &os(A$):A$=42:A$ A$<>"":A$  : Fexit(A%):"FX1,"+(A%255):quit$=quit$:A$=quit$:quit$="":os(A$) >&FFFFF:Ș A%  ": ,Win_TextIO 60ș "GetStdHandle",-10 @hfile%(1):*INPUT 13 @1ș "GetStdHandle",-11 @hfile%(2):*OUTPUT 14 J&ș "SetConsoleMode",@hfile%(1),0: T: