0 > DskToUSB45 v0.45 28-Dec-2018 J.G.Harston : v0.20 - Manually sends data 256*max% bytes at a time K v0.30 - Uses machine code USB transfer, dynamically skips disk errors (@ v0.40 - Copies DFS/ADFS/LVFS, allows size to be overridden 2J v0.41 - Selects source FS by command, keeps FS selected for transfer usbfile"' 3max%=(--2048)256:oldfs%=fs: max%<2: &87: 2 ctrl% 31,data% 256*max%-1:X%=ctrl%:Y%=X%256 usb_Init: :end: : #"Source filing system: "type$ ""Source drive: "drv% ""Dest. USB image file: "out$  type$:thisfs%=fs : fs$,fn$,A$,retry%  fs$="*" fs$=thisfs% 4 fs$="*": "Unsupported filing system":oldfs: I 4,disk,7F,3, 8,adfs,72,1, 10,adfs,62,1, 16,hadfs,5A,1, 29,disk,77,1 E DISK ADFS LVFS HADFS RAM  *,*,*,* : = fn$="disk" should examine IDs to check density for DDFS "osw%=("&"+A$):dsize%=size ,N"Total sectors to save (&";~dsize%;"): &";:""A$:A$<>"":dsize%=("&"+A$) 6! : -1:end: abort: @usb_Sync:usb_Flush J%A%=usb_Cmd("IPA"):usb_Flush:13 T usb_Cmd("IPA"):abort: ^$ usb_Cmd("OPW "+out$):abort: h usb_Sync r: |sect%=0:thisnum%=max%  3num%=max%: sect%+num%>dsize%:num%=dsize%-sect% ! thisnum%max%:thisnum%=max% sect%>=dsize% : 13:"Closing";14; usb_Sync:usb_Flush " usb_Cmd("CLF "+out$):abort usb_Cmd("SUD") & usb_Sync 0 oldfs :13:"Done";17 D N: X oldfs b)oldfs%:"FX143,18,"+oldfs%:oldfs%=0 l v:  abort $usb_Flush:usb_Cmd("CLF "+out$) usb_Cmd("SUD"):usb_Flush  end: :  end  oldfs:  : ݤread(sect%,num%)  try%=retry%  A13:"Reading ";h0(drv%,1);":";h0(sect%,6);"+";h0(num%,2);  #err%=attempt(num%):try%=try%-1  try%<1 err%=0   err%:num%=(num%+2)4 * err%=0 num%<1 4=num%-(num%<1) >: Hݤattempt(num%) RJfn$="disk" :err%=disk( data%,&53,drv%,sect%10,sect%10,num%,osw%,1) \10:n%=10-sec% D:X%?0=drv%+den%*24+8+2*(trk%80):X%!1=addr%:X%?5=3-7*(cmd%>127) AX%?6=cmd%:X%?7=trk%80:X%?8=sec%:X%!9=n%&1E20:A%=osw%:&FFF1 $YA%=X%?(7+X%?5):A%<>&10:addr%=addr%+n%*256:num%=num%-n%:sec%=(sec%+n%)10:trk%=trk%+1 .A%<>0num%<1:=A% 8+ݤadfs(addr%,cmd%,drv%,sect%,num%,osw%) BDX%?0=1:X%!1=addr%:X%?5=cmd%:X%?6=drv%*32+((sect%&1F0000)65536) L9X%?7=((sect%&FF00)256):X%?8=sect%:X%!9=num%:X%!11=0 VA%=osw%:&FFF1:=?X% `,ݤhadfs(addr%,cmd%,drv%,sect%,num%,osw%) jB!X%=&600:X%!2=addr%:X%!6=sect%:X%?9=drv%:X%?10=num%:X%?11=cmd% tA%=osw%:&FFF1:=X%?12 ~ݤdisk_err(A%,D%,S%,N%) MA%:"Disk error ";h0(A%,2);" at ";h0(D%,1);":";h0(S%,6);"+";h0(N%,2) =A% :  I/O routines  ============ %ݤh0(A%,N%):="00000000"+~A%,N%) 6ݤfx(A%,X%): Y%:Y%=X%256:=((&FFF4)&FFFF00)256 :  USB access routines  =================== +usb_Sync:A%=?usb_D:(?usb_S 128): !usb_Flush:(?usb_S 128): 2'"Flushing USB";::A%=?usb_D:(?usb_S 128)  $A%=+20:>A%:(?usb_S 128): Vݤusb_Err:?usb_result%=13 usb_result%?1=":":=0 "USB Error: "$usb_result%:= ;usb_Cmd(A$):usb_Sync:usb_WrStr(A$+13):usb_RdStr: ((ݤusb_Cmd(A$):usb_Cmd(A$):=usb_Err 23usb_WrStr(A$): A%=1 A$:(?usb_S 64)=0 <?usb_D=A$,A%,1):: F?usb_RdStr:A%=usb_result%-1:A%=A%+1:?A%=usb_Rd:?A%=13: P.usb_Wr(A%):(?usb_S 64)=0:?usb_D=A%: Z'ݤusb_Rd:(?usb_S 128)=0:=?usb_D dusb_Init nusb_D=&FCF8:usb_S=&FCF9 x+usb_result%=usb_result%: usb_result%:  usb_result% 63,mc% 99  P=0 1:P%=mc%:[OPT P*2 .usb_RdData 'TAY:LDA #data% 255:STA usb_RdLp+4 *LDA #data% 256:STA usb_RdLp+5:LDX #0 5.usb_RdLp:JSR usb_Rd:STA data%,X:INX:BNE usb_RdLp 'INC usb_RdLp+5:DEY:BNE usb_RdLp:RTS 4.usb_Rd:BIT usb_S:BPL usb_Rd2:BIT &FF:BPL usb_Rd .usb_Rd2:LDA usb_D:RTS .usb_WrData 'TAY:LDA #data% 255:STA usb_WrLp+1 *LDA #data% 256:STA usb_WrLp+2:LDX #0 $.usb_WrLp:LDA data%,X:JSR usb_Wr 0.usb_WrLp2:LDA usb_D:BIT usb_S:BPL usb_WrLp2 INX:BNE usb_WrLp 'INC usb_WrLp+2:DEY:BNE usb_WrLp:RTS "4.usb_Wr:BIT usb_S:BVC usb_Wr2:BIT &FF:BPL usb_Wr ,.usb_Wr2:STA usb_D:RTS 6]: @: