> MkMDR 1.20  (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 0 v1.20 Renamed to MkMDR, updated parameters : ! :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$=nul(out$)+" "+nul(in$)+" -t "+nul(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) 'out$=cl("",1):out$="""""":out$="" $in$=cl("",1):in$="""""":in$="" ;nm$=cl("",1):ld$=cl("",1):ex$=cl("",1):tp$=cl("",1) %ld%=-1:ex%=-1:tp%=-1:in%=0:out%=0 !ld$<>"":ld%=("&"+ld$):tp%=0 "!ex$<>"":ex%=("&"+ex$):tp%=3 ,tp$<>"":tp%=("&"+tp$) 6:out$=("-?")out$="":syntax:exit(220 (out$<>0)): @: JCin$<>"":A%=file(in$,5):(A%1):in%=f_openin(in$):in%=0:A%=0 T9in$<>"":A%=0:"File '"in$"' not found":exit(214): ^apnd%:out%=f_openup(out$) h!out%=0:out%=f_openout(out$) rBout%=0:"Couldn't open file '"out$"'":Close_All:exit(192): |Gos%<8:A%=file(out$,5):X%?5=&FF:X%?4=&FF:X%?3=&FD:A%=file(out$,1) ok%=: ok%= 6os%<8:ok%:"SetType "+out$+" 054":"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: 0-"Dir "+in$:i%=0::in$=gbpb8(i%):i%=X%!9 :1in$<>"":A%=file(in$,5):(A%1):nm$="":File Din$="" sect%<0: N: X File b0load%=X%!2:exec%=X%!6:len%=X%!10:attr%=X%!14 lO(load%&FFFFFF00)=&FFF70000:load%=&30000:exec%=load%: Speculator ROM file vV(load%&FFFF0000)=&FFF20000:load%=(load%&FFFF)&30000:exec%=load%: Z80Tube file *len%>&EFFF:"File '"in$"' too long": +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 4USpType%=2:SpStart%=SpExtra%:SpExtra%=(SpLine%256)+256*(SpLine%255): Bigendian >: HUvb%: SpName$" ";:SpType%<4: type$(SpType%+1); vb%: " &"h0(SpType%,2)" "; ROvb%: " "h0(len%,4)" "h0(SpStart%,4)" "h0(SpExtra%,4)" "h0(SpLine%,4); \: f Do first block: poff%=9: SpType%=-1:off%=0 zmem%?14=sum(0,13) : Checksum first 14 bytes (9mem%?15=(SpType%<>-1) 4 : Data or Print block 2/ num%=len%:mem%?15=mem%?15 2: EOF block <mem%?16=rec% F P: ZFillToEnd d) sect%<1: : Microdrive full n#SpType%=-1:rec%=0:num%=0:len%=0 x:sect%=sect%-1 &SecHeader:mem%?15=0 : Free block f_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 6&chk%=chk%&FF:chk%<>0:chk%=chk%-1 @ :=chk% J: Tasyntax:"Usage: MkMDR outfile infile -append -embed -t title [name [load [exec [type]]]]": ^: h!ݤnul(A$): A$:=A$ ="""""" r-ݤpad(A$,L%):A$=A$,L%):=A$+L%- A$," ") |%ݤfn_unbbc(A$):A$="" os%>7:="" 7A%=1A$:A$,A%,1)="/":A$=A$,A%-1)+"."+A$,A%+1)  :=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 0"MKDIR "+A$:=2 : D=0 N: X!ݤ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$ : %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%):>&FFFFF:="" 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)) 4Cl$=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$ HJl$=A$,A%+1,A$+""" ",""" ",A%+1)-A%-1):A$=A$,A%-1)+A$,A%+l$+3):=l$ R/ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " \+A$,1)=" ":A$=A$,A$-1):A$,1)<>" " f=A$ p: zBݤ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 $0ș "GetStdHandle",-10 @hfile%(1):*INPUT 13 .1ș "GetStdHandle",-11 @hfile%(2):*OUTPUT 14 8&ș "SetConsoleMode",@hfile%(1),0: B: