> BINtoMDR 1.15  (C) J.G.Harston C Make an MDR file from spectrum files with load/exec addresses ( 2$ v1.00 Based on FileToTAP v1.05 <* FUSE complains about checksums F# v1.01 Only uses sectors 254-1 P7 v1.02 Writes data lengths of &200 instead of &209 Z/ v1.03 Checksums correct 512 bytes of data d5 v1.06 Command line interface, based on BINtoTAP n5 v1.07 Updated ProgEnv library for BB4Wv6+Brandy xa v1.15 Avoids OSCLI to set filetype, cleans source name, adds Print files, defaults to Basic : ! :Close_All::exit(): )A$=OS_GetEnv+" ":os%>31:Win_TextIO < ctrl% 31,name% 80,mem% 542,type$(4):X%=ctrl%:Y%=X%256 Xtype$(0)="Print":type$(1)="Basic":type$(2)="Num ":type$(3)="Char ":type$(4)="Bytes" A$=" ": "Source file/dir: "in$: "Destination file: "out$:"Cartridge title: "SpTitle$:"Options/flags: "A$:A$=in$+" "+out$+" -t "+SpTitle$+" "+A$ 'apnd%=cl("-a",0):spec%=cl("-s",0) *embd%=cl("-e",0):SpTitle$=cl("-t",1) 7 CmdLine bugfix requires space before final option A$=A$+" ":vb%=cl("-v",0) .in$=cl("",1):out$=cl("",1):nm$=cl("",1) -ld$=cl("",1):ex$=cl("",1):tp$=cl("",1) >ld%=-1:ex%=-1:tp%=-1:in%=0:out%=0:out$="":out$=in$:in$="" !ld$<>"":ld%=("&"+ld$):tp%=0 !ex$<>"":ex%=("&"+ex$):tp%=3 tp$<>"":tp%=("&"+tp$) ":out$=("-?")out$="":syntax:exit(220 (out$<>0)): ,: 6Cin$<>"":A%=file(in$,5):(A%1):in%=f_openin(in$):in%=0:A%=0 @9in$<>"":A%=0:"File '"in$"' not found":exit(214): Japnd%:out%=f_openup(out$) T!out%=0:out%=f_openout(out$) ^Bout%=0:"Couldn't open file '"out$"'":Close_All:exit(192): hGos%<8:A%=file(out$,5):X%?5=&FF:X%?4=&FF:X%?3=&FD:A%=file(out$,1) rok%=: ok%= |os%<8:ok%:"Stamp "+out$ : ! :Close_All::exit(): Bsect%=255:in%:A%=file(in$,5):File in$="":Enter Store -FillToEnd:#out%,0: Not write protected #out%:out%=0:exit(0): : 6 This needs to be able to take address parameters  Enter 5 "Enter input filenames, terminated with RETURN" : "File: "in$ "":"Store as: "nm$:Store  in$="": :  Store (file(in$,5)1):File: -"Dir "+in$:i%=0::in$=gbpb8(i%):i%=X%!9 &1in$<>"":A%=file(in$,5):(A%1):nm$="":File 0in$="" sect%<0: :: D File N0load%=X%!2:exec%=X%!6:len%=X%!10:attr%=X%!14 XO(load%&FFFFFF00)=&FFF70000:load%=&30000:exec%=load%: Speculator ROM file bV(load%&FFFF0000)=&FFF20000:load%=(load%&FFFF)&30000:exec%=load%: Z80Tube file l*len%>&EFFF:"File '"in$"' too long": v+len%=0 :"File '"in$"' too short": @in%=0:in%=f_openin(in$):in%=0:"File '"in$"' not found": _embd%:ld%=0:ex%=0:len%>3:#in%=len%-4:ld%=#in%+256*#in%:ex%=#in%+256*#in%:len%=len%-4 -1:load%=&30000+ld%: Should these be AND &3FFFF ? 1ex%<>-1:exec%=&30000+ex% tp%=0:exec%=len% nm$="":nm$=fn_unbbc(in$) : SpName$ =pad(nm$,10) SpStart%=(load%&FFFF) SpExtra%=(exec%&FFFF) SpLine% =SpStart% SpLen% =len% "SpType% =(load%&30000)&10000 ,tp%<>-1:SpType%=tp%:tp%>255:SpType%=-1 )(load%exec%&FFFF)=&FFFF:SpType%=-1  +SpType%=0:SpLine% =SpStart%:SpStart%=0 USpType%=1:SpStart%=SpExtra%:SpExtra%=(SpLine%256)+256*(SpLine%255): Bigendian  USpType%=2:SpStart%=SpExtra%:SpExtra%=(SpLine%256)+256*(SpLine%255): Bigendian *: 4Uvb%: SpName$" ";:SpType%<4: type$(SpType%+1); vb%: " &"h0(SpType%,2)" "; >Ovb%: " "h0(len%,4)" "h0(SpStart%,4)" "h0(SpExtra%,4)" "h0(SpLine%,4); H: R Do first block: \off%=9: SpType%=-1:off%=0 fmem%?14=sum(0,13) : Checksum first 14 bytes 9mem%?15=(SpType%<>-1) 4 : Data or Print block / num%=len%:mem%?15=mem%?15 2: EOF block (mem%?16=rec% 2 <: FFillToEnd P) sect%<1: : Microdrive full Z#SpType%=-1:rec%=0:num%=0:len%=0 d:sect%=sect%-1 n&SecHeader:mem%?15=0 : Free block xf_gbpb(2,out%,mem%,543,0)  sect%<2: : FindFreeSector  #out%=0 :mem%!1=0:mem%?15=0 *ptr%=#out%:f_gbpb(4,out%,mem%,543,0)  mem%!15=0 $#out%=ptr%:sect%=mem%!1 &FFFF  :  ݤchkfull 0 sect%<1:'"Microdrive full":#in%:in%=0:= = : ݤsum(st%,en%): chk% I A%=st% en%:chk%=chk%+mem%?A%: chk%<256:chk%=chk%+1 chk%=chk%+2 "&chk%=chk%&FF:chk%<>0:chk%=chk%-1 , :=chk% 6: @dsyntax:"Usage: BINtoMDR infile outfile -append -embed -t title [name [load [exec [type]]]]": J: T-ݤpad(A$,L%):A$=A$,L%):=A$+L%- A$," ") ^%ݤfn_unbbc(A$):A$="" os%>7:="" h7A%=1A$:A$,A%,1)="/":A$=A$,A%-1)+"."+A$,A%+1) r :=A$ |#ݤh0(A%,N%)="0000000"+~A%,N%) : 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 JA$=f_name(A$):A%=255 A%=5:X%!14=(A$):X%!14:X%!10=#X%!14:#X%!14 1A%=255:X%?6=0:"LOAD """+A$+""" "+~X%!2:=1 A%=5:X%!14:=1 A%=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  : :=2 "MKDIR "+A$:=2  &=0 0: :!ݤf_openin(A$)=(f_name(A$)) D"ݤf_openout(A$)=(f_name(A$)) N!ݤf_openup(A$)=(f_name(A$)) XVݤf_name(A$):os%>31:A%,B%:B%=A%:A%=A$,"\",A%+1):A%=0:A$,".",B%)=0:A$=A$+"." b=A$ l: v%f_gbpb(A%,chn%,addr%,num%,ptr%) ??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: : ݤgbpb8(ptr%):os%>31:="" 7X%!1=name%:X%!5=1:X%!9=ptr%:A%=8:&FFD1:X%!5=1:="" #A%=name%:A%?(1+?A%)=13:=$(A%+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$<>"":= %A%=" ",l$=32)+A$,l$):A%=0:=""  'A$=A$,A%-1)+s(A$,A$," ",A%)+1)) Cl$=32:l$=A$,A%):A$=A$,A%-1):=l$,1-(l$=34),l$+2*(l$=34))  PA$,A%,1)<>34:l$=A$,A%,A$+" "," ",A%)-A%):A$=A$,A%-1)+A$,A%+l$+1):=l$ *Jl$=A$,A%+1,A$+""" ",""" ",A%+1)-A%-1):A$=A$,A%-1)+A$,A%+l$+3):=l$ 4/ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " >+A$,1)=" ":A$=A$,A$-1):A$,1)<>" " H=A$ R: \BݤOS_GetEnv:A%,X%,Y%,P%,A$:X%=1:os%=((&FFF4)&FF00)256:X% fd!=&D7C1C7C5:run$=ARGV$(0):ARGC:A%=1ARGC:A$=A$+ARGV$(A%)+" "::=A$,A$-1)!=&D7C1C7C5:="" p_>&FFFFF:X%256:A$=@cmd$:ș"GetModuleFileName",0,X%,255:run$=$$X%:Y%=@lib$,@tmp$)=0:P%= zP%=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 0ș "GetStdHandle",-10 @hfile%(1):*INPUT 13 1ș "GetStdHandle",-11 @hfile%(2):*OUTPUT 14 &ș "SetConsoleMode",@hfile%(1),0: $: