> TAPtoMDR 1.00  (C) J.G.Harston 1 Copy Spectrum tapefile to a microdrive file (: 2$ v1.00 Based on FileToMDR v1.03 <: F :CloseAll:End: P3 ctrl% 31,name% 80,mem% 547:X%=ctrl%:Y%=X%256 Z7A$=OS_GetEnv:in$="":out$="":title$="":in%=0:out%=0 d7os%=32:ș "GetStdHandle",-10 @hfile%(1):*INPUT 1 n8os%=32:ș "GetStdHandle",-11 @hfile%(2):*OUTPUT 2 x,os%=32:ș "SetConsoleMode",@hfile%(1),0 2A%=A$+" "," "):A%:in$=A$,A%-1):A$=A$,A%+1) 3A%=A$+" "," "):A%:out$=A$,A%-1):A$=A$,A%+1) 5A%=A$+" "," "):A%:title$=A$,A%-1):A$=A$,A%+1) Tin$="-?" (in$<>"" out$=""):"Usage: TAPtoMDR ()":End: �qin$="": "Source tapefile: "in$: "Destination microdrive file: "out$: "Microdrive cartridge title: "title$ �in$=""out$="":End: �6in%=(in$):in%=0:"File '"in$"' not found":End: �Jout%=(out$):out%=0:"Couldn't open file '"out$"'":#in%:in%=0:End: �: � sect%=255 �7SpType%=0:SpName$="":SpLen%=0:SpStart%=0:SpExtra%=0 �1SpTitle$=title$:title$="":SpTitle$=out$,10) � (num%=(#in%+256*#in%)-1:flag%=#in% 7flag%=&00:RdHeader flag%=&FF:RdData RdSkip  #in% "FillToEnd ,=#out%,0 : Not write protected 6 CloseAll @ End: J: TEnd:os%<6: *Quit ^ h: rRdHeader |;gbpb(4,in%,mem%,num%,0) : Read header block SpType% =mem%?0 SpLen% =(mem%!11)&FFFF SpStart%=(mem%!13)&FFFF SpExtra%=(mem%!15)&FFFF  mem%?11=13:SpName$=$(mem%+1)  :  RdData num%=num%-1  Do first block: ;sect%=sect%-1:block%=0:len%=512-9: num%<len%:len%=num% SecHeader 7mem%!17=len%+9 : Block size 4$(mem%+19)=pad(SpName$,10) : Filename Bmem%?29=chk(15,28) : Checksum next 14 bytes mem%?30=SpType% &mem%!31=SpLen% 0=mem%!33=SpStart%: SpType%=1 SpType%=2:mem%!33=SpExtra% :Nmem%!35=SpExtra%: SpType%=1 SpType%=2:mem%!33=SpStart%:mem%!35=SpExtra% Dmem%!37=SpStart% N:gbpb(4,in%,mem%+30+9,len%,0) : Read first block X<mem%?542=chk(30,541) : Checksum of data b;gbpb(2,out%,mem%,543,0) : Write first block lnum%=num%-len% v1 num%<1:A%=#in%: : Only one block :  Do following blocks:  @sect%=sect%-1:block%=block%+1:len%=512: num%<len%:len%=num% SecHeader 5mem%!17=len% : Block size 2$(mem%+19)=pad(SpName$,10) : Filename @mem%?29=chk(15,28) : Checksum next 14 bytes 4gbpb(4,in%,mem%+30,len%,0) : Read a block :mem%?542=chk(30,541) : Checksum of data 9gbpb(2,out%,mem%,543,0) : Write first block num%=num%-len%  num%<1:A%=#in%   : RdSkip:#in%=#in%+num%:  : *)SecClear: A%=0 542:mem%?A%=0:: 4: >SecHeader H SecClear R/mem%?0=1 : Header block \0mem%?1=sect% : Sector number f0$(mem%+4)=pad(SpTitle$,10): Cartridge name p9mem%?14=chk(0,13) : Checksum first 14 bytes z-mem%?15=4 : Data block + len%=num%: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% : $-ݤpad(A$,L%):A$=A$,L%):=A$+L%- A$," ") .: 8CloseAll:*Exec B#in%=in%: in%:A%=in%:in%=0:#A% L(out%=out%: out%:A%=out%:out%=0:#A% V `: j#gbpb(A%,chn%,addr%,num%,ptr%) t>os%<>32:!X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%: &FFD1: ~A%=1 A%=3:#chn%=ptr% =:A%=1 A%=2:#chn%,?addr% A%=3 A%=4:?addr%=#chn% 'addr%=addr%+1:num%=num%-1:num%<1: : # > BLib.ProgEnv 1.03 22Sep2001 : # Program Environment Functions # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ : ? Return command line tail, sets run$ to execution filename 6 Works with Basic on I/O,T6502,Arc,TZ80bbc,PC,Win ; Needs: 270 free bytes above end of heap for temp. w/s ?ݤOS_GetEnv:A$,A%,X%,Y%:A%=0:X%=1:os%=((&FFF4)&FF00)256 �Aos%=6>&8000:ș"OS_GetEnv"A$:A$=A$,1+A$," ",1+A$," ")))  `X%-1:os%=32:>&FFFF:ș"GetModuleFileName",0,X%,255:X%?255=13:run$=$X%,$X%,0)-1):=@cmd$ os%=32:A$=$&100 2A$=0:?(P-3):A$=$&600 A$=0:A$=$(-&300) (7A%=A$+" "," "):run$=A$,A%-1):run$<>"":=A$,A%+1) 2hX%-1:Y%=X%256:A%=9:?X%=0:X%!1=X%+16:X%!16=0:&FFD1:A%=X%+16:!A%?A%+A%?2<>8:A%?(1+A%)=13:=$(A%+1) <="" F: P. Run a program, passing it a command line Z= If program is *Command, called with OSCLI, else CHAINed d&os(A$):A$=""A$=42:A$: A$