> FileToMDR 1.03  (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 d: n$ :CloseAll:" at line ";: x= ctrl% 31,name% 80,mem% 547:X%=ctrl%:Y%=X%256:sect%=255 ' "Enter output MDR filename: "out$ @in%=0:out%=(out$): out%=0:"Can't open '"out$"'":"Exec": 2"SetType "+out$+" FFD": Need an MDR filetype & "Enter cartridge name: "SpTitle$ 5 "Enter input filenames, terminated with RETURN" $ :CloseAll:" at line ";: :   "File: "in$  in$<>"":Store in$="" FillToEnd "#out%,0: Not write protected #out%:out%=0  : " Store , in$,1)="*": in$: 6(type%=file(in$,5): type%=1:File: @"Dir "+in$ J0i%=0::gbpb(8,0,name%,1,i%):i%=X%!9:r%=X%!5 TR r%=0:name%?(1+?name%)=13:in$=$(name%+1):type%=file(in$,5):in$=in$+",":File ^ r%<>0: h: r File |0load%=X%!2:exec%=X%!6:len%=X%!10:attr%=X%!14 Q IF(load%AND&FFFF0000)=&FFF20000:load%=&FFFF0000+(load%AND&FF00):exec%=load% QA%=in$,","): A%::SpName$=in$,A%+1):in$=in$,A%-1) "Store as: "SpName$  SpName$="":SpName$=in$ #SpType%=(load% &30000)&10000 SpStart%=(load% &FFFF) SpExtra%=(exec% &FFFF) SpLen%=len% !SpName$=SpName$+10," "),10) * type%<>1:"File '"in$"' not found": 8 len%>&10000 SpType%<4:"File '"in$"' too long": ( len%=0:"File '"in$"' too short": .in%=(in$): in%=0:"Can't open '"in$"'": j 11;(10+ SpName$);13;11;~SpType%;" "SpName$" "h0(SpStart%,4)" "h0(SpExtra%,4)" "h0(SpLen%,4); :  Do first block: ;sect%=sect%-1:block%=0:num%=512-9: len%mem%?29=chk(15,28) : Checksum next 14 bytes Nmem%?30=SpType% Xmem%!31=SpLen% b=mem%!33=SpStart%: SpType%=1 SpType%=2:mem%!33=SpExtra% lNmem%!35=SpExtra%: SpType%=1 SpType%=2:mem%!33=SpStart%:mem%!35=SpExtra% vmem%!37=SpStart% 6gbpb(4,in%,mem%+30+9,num%,0) : Read first block 8mem%?542=chk(30,541) : Checksum of data 7gbpb(2,out%,mem%,543,0) : Write first block len%=len%-num% - len%<1:#in%:in%=0::: Only one block :  @sect%=sect%-1:block%=block%+1:num%=512: len%SecClear H A%=0 542:mem%?A%=0:: R: \SecHeader f SecClear p/mem%?0=1 : Header block z0mem%?1=sect% : Sector number 0$(mem%+4)=pad(SpTitle$,10): Cartridge name 9mem%?14=chk(0,13) : Checksum first 14 bytes -mem%?15=4 : Data block + num%=len%:mem%?15=6 : EOF block mem%?16=block%  : FillToEnd block%=0: sect%<0: :sect%=sect%-1 *SecHeader:mem%?15=0 : Free block gbpb(2,out%,mem%,543,0)  sect%<2: : ݤchk(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% 8: B-ݤpad(A$,L%):A$=A$,L%):=A$+L%- A$," ") L: VCloseAll:*Exec `#in%=in%: in%:A%=in%:in%=0:#A% j(out%=out%: out%:A%=out%:out%=0:#A% t ~: #ݤh0(A%,N%)="0000000"+~A%,N%) Cݤfile(A$,A%):$name%=A$:X%?0=name%:X%?1=name%256:=(&FFDD)&FF #gbpb(A%,chn%,addr%,num%,ptr%) 5!X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%: &FFD1: ݤuc(A$): A$="":="" H A%=1 A$: A$,A%,1)>"_":A$=A$,A%-1)+( A$,A%,1)-32)+A$,A%+1)  :=A$