> Write800 0.10  (C) J.G.Harston / Write an 2*80*5*1024 image to floppy disk : J: "Disk Image Copier"''"Copies 800k image of 1024/5/80/2 MFM disks"' H bytes/sectors/tracks/sides  : : : -bufsz%=20*256: diskrec% 256,data% bufsz% : "Source image file: "in$ &"Dest. drive: "drv$:drive%= drv$ .in%=(in$): in%=0:"Can't open '"in$"'":  "Formatting drive ";drive% !"adfs:Format "+ drive%+" D"  "Copying disk image "; #FDC_Init(diskrec%,10,5,1,2,80) : ' Temp body to quickly get working:  image% 400*1024  head%=0 1  track%=0 79  8;8;"0"+track%,2); & ș "OS_GBPB",4,in%,image%,5*1024 [ ș "XADFS_DiscOp",0,2,((track%*2+head%)*5+0-0)*1024+0+(drive%<<29),image%,5*1024 r%  track%  head%  #in%:in%=0  :  head% =0 1 ! track% =0 79 " sector%=0 9 # $< 13;sector%;":";track%;":";head%;":";drive%;" "; % byte% =0 255 & data%?byte%=#in% ' byte% (N FDC_Op(data%,sector%,track%,head%,drive%,2,1,diskrec%):"- error" ) * sector% + track% , head% -#in%:in%=0: . /: 0 FDC Routines 1 ============ 2: 3C FDC_Init - Initialise disk record block for passed disk shape 4: 5P FDC_Init(dskrec%,bps%,spt%,hds%,den%,trks%): Initialise FDC Record Block 6 i% 7.dskrec%?0=bps% : 2^bps bytes per sector 8)dskrec%?1=spt% : sectors per track 9&dskrec%?2=hds% : num of heads-1 :$dskrec%?3=den% : density 1=FM ;6 i%=4 59 4:dskrec%!i%=0:: Clear disk record #FDC_bps%=2^bps% : Extern: b/s ?&FDC_trks%=trks% : Extern: tracks @ A: B> FDC_Op - Passed absolute sector addressing information C: D4 FDC_Op(mem%,sec%,trk%,hd%,drv%,num%,op%,rec%) E3trk%=((hd%+1)*FDC_trks%*FDC_spt%+sec%)*FDC_bps% Fop%=op%+(rec%<<6) Grec%?34=drv% H?ș "XADFS_DiscOp",0,op%,trk%+(drv%<<29),mem%,256*num% op% I=op% J: K! ------- do later --------- L: M% Passed absolute sector address: N: O: FDC_Rd(addr%,absSec%,drv%,num%):=FDC_Access(read%) P; FDC_Wr(addr%,absSec%,drv%,num%):=FDC_Access(write%) Q: R$ FDC_Access(type%): num%=0:= S: Convert absSec% to sec/trk/head, pass to lower level T: Ur fdc_access(data%,sec%,length%,type%): IF(test%AND1) VDU4:PRINT"S:";~sec_start%,sec_start%,~length%,length% V length%=0:= W% sec%<1600 sec%+length%>1600 X3 fdc_access(data%,sec%,1600-sec%,type%):= YH =fdc_access(data%+256*(1600-sec%),1600,length%-(1600-sec%),type%) Z [" I don't know if I need this: \# sec%<800 sec%+length%>800 ]2 fdc_access(data%,sec%,800-sec%,type%):= ^E =fdc_access(data%+256*(800-sec%),800,length%-(800-sec%),type%) _ `& r%,hd%,dr%,reason%,disc_address% adr%=drive%: MOD 2 b3 dr%>3 =partition(data%,sec%,length%,type%) c8 sec%>1599 warning("Can't do tracks 1599+ yet"):= d(hd%=0: sec%>799 hd%=1:sec%=sec%-800 eB sec%>799 sec%=sec%-800:hd%=(sec% 10) 1:sec%=800+sec% 20 f: g&track%=(hd%*FDC_trks%*10+sec%)*256 h: i hd%=(sec%>799) AND 1 j IFsec%>799 sec%=sec%-800 kI IFsec%>799 sec%=sec%-800:hd%=(sec% DIV 10)AND 1:sec%=800+sec%DIV 20 l( track%=(hd%*FDC_trks%*10+sec%)*256 mreason%=type%+(diskrec%<<6) n$ disc_address%=track%+(dr%<<29) oSdiskrec%?34=dr%: IFtest%AND2 PRINT"Head:";hd%,"Trk:";~track%,"Sec:";sec_start% pFș"XADFS_DiscOp",0,reason%,track%+(dr%<<29),data%,256*length% r% q3 r%<>0 err%=:warning(memtostr(r%+4,100)):= r= s: t0 partition(data%,sec_start%,length%,type%) u# type%=1, read; type%=2, write v! GBPB 1, write; GBPB 3, read w, DiskChn%=0 warning(mess("Err14")):= xDș "OS_GBPB",5-type%*2,DiskChn%,data%,length%*256,sec_start%*256 yX sec_start%=70 type%=1 type%=(#DiskChn%)256:data%?28=type%:data%?29=type%256 z= {: |: }: ~ sectors<=bufsec% - dum=fdc_access(data%,start%,sectors,1) < "SAVE "+pathname$+" "+~(data%)+" "+~(data%+length)  < dum=fdc_access(data%,start%,bufsec%,1): do first bit A "SAVE "+pathname$+" "+~(data%)+" "+~(data%+bufsec%*256)  out%= pathname$  #out%=#out% M endsec%=sectors bufsec%: endsec%=sectors/bufsec% endsec%=endsec%-1 ' saveloop%=1 endsec%: do rest N saveloop%=endsec% size=length (bufsec%*256) size = bufsec%*256 Q dum=fdc_access(data%,start%+bufsec%*saveloop%,(size+255) 256,1): 1=RD & ș "OS_GBPB",2,out%,data%,size  #in%    "Disk image file: