1 REM > ImgToDisk v0.24
   50 ONERRORREPORT:PRINT:PROCexit(ERR)
   60 A$=FNOS_GetEnv+" ":fs%=FNfs
   70 IFFNcl("-?",0):PROCsyntax:PROCexit(0)
   80 IFFNcl("-help",0):PROChelp:PROCexit(0)
   90 DIMctrl% 31:X%=ctrl%:Y%=X%DIV256
  100 IFFNs(A$)="":INPUT"Source file: "in$:INPUT"Destination drive: "out$:INPUT"Disk size (K): "sz$:A$=in$+" "+out$+" "+sz$
  110 dbug%=FNcl("-d",0):auto%=FNcl("-a",0):verb%=FNcl("-v",0):size%=VALFNcl("-s",1):mix%=FNcl("-m",0)
  120 inv%=FNcl("-i",0):form%=FNcl("-f",0):in$=FNcl("",0):out$=FNcl("",0)
  130 IFsize%=0:IFVALA$:size%=VALFNcl("",0)
  140 IFsize%<50:size%=size%*100-40*(size%=6)-20*(size%=7ORsize%=3)-40*(size%=14)
  150 IFout$>"@":out$=CHR$(ASCout$-17)
  160 drive%=VALout$:geom$=A$:IFgeom$="":auto%=TRUE
  170 IFdbug%:PRINT"in$  ='"in$"'"'"out$ ='"out$"'"'"geom$='"geom$"'"'"size%=";size%'"auto%=";auto%'"verb%=";verb%'"debug=";dbug%
  180 DIMdiskrec% 255:logbps%=0:max%=0:PROCparameters:size%=(sides%*tracks%*spt%*2^logbps%)/1024:IFauto%:size%=-1
  190 PROCgeom:IFauto%:geom$=""
  200 IFlogbps%=0:PROCsyntax:PROCexit(220)
  220 ONERRORREPORT:OSCLI"FX143,18,"+STR$fs%:PROCClose_All:PROCHour_Glass(-3):PRINT:PROCexit(ERR)
  230 in%=OPENIN(in$):IFin%=0:PRINT"File '"in$"' not found":PROCexit(214)
  240 IFauto%:size%=EXT#in%DIV1024:auto%=0:PROCparameters:PROCgeom
  250 IFdbug%:PRINT"  D:S:H:TK:Z:NM:S0"'"G:"geom$
  260 IFverb%:PRINT"Copy ";LEFT$(STR$size%+"K ",size%>0);"image to ";FNgeom
  270 PROCFDC_Init(diskrec%,logbps%,spt%,heads%,den%,tracks%,sec0%)
  280 bps%=2^logbps%:bsz%=spt%*bps%:DIMdata% bsz%-1:num%=spt%*bps%
  290 drive%=drive%AND3:IFos%<6:IFden%=2:drive%=drive%OR4
  300 PROCformat:PROCdiskwrite:PROCfinish
  310 PROCexit(0):END
  330 DEFPROCformat:IFform%=0:ENDPROC
  340 IFverb%:PRINT"Formatting drive ";drive%
  350 IFgeom$="2:1:2:80:1:16:00":OSCLI"adfs:Format "+STR$drive%+" L Y":ENDPROC
  360 IFgeom$="2:0:2:80:2:09:01":OSCLI"adfs:Format "+STR$drive%+" DOS/M Y":ENDPROC
  370 IFgeom$="2:0:2:80:3:05:00":OSCLI"adfs:Format "+STR$drive%+" D Y":ENDPROC
  380 IFgeom$="4:0:2:80:2:18:01":OSCLI"adfs:Format "+STR$drive%+" DOS/Q Y":ENDPROC
  390 IFgeom$="4:0:2:80:3:10:00":OSCLI"adfs:Format "+STR$drive%+" F Y":ENDPROC
  400 PRINT"Couldn't format"
  410 ENDPROC
  430 DEFPROCdiskwrite
  440 PTR#in%=0:dstep%=(tracks%>63)+2
  450 IFseq%:FORhead%=0TOsides%-1:FORtrack%=0TOtracks%-1:PROCtrack(head%*tracks%*dstep%+track%):NEXTtrack%:NEXThead%:ENDPROC
  460 FORtrack%=0TOtracks%-1:FORhead%=0TOsides%-1:PROCtrack(track%*sides%*dstep%+head%):NEXThead%:NEXTtrack%
  470 ENDPROC
  490 DEFPROCfinish
  500 IFverb%:PRINT
  510 CLOSE#in%:in%=0:PROCexit(0)
  520 ENDPROC
  540 DEFPROCtrack(offset%)
  550 IFverb%:IFPOS=0:PRINT"----";
  560 IFverb%:PRINTCHR$8;CHR$8;CHR$8;CHR$8;head%;":";FNd0(track%,2);
  570 PROCgbpb(4,in%,data%,num%,0)
  580 IFinv%:FORA%=0TOspt%*bps%-1STEP4:data%!A%=NOTdata%!A%:NEXT
  590 r%=FNdiskop(2):IFr%:PRINTLEFT$(" c",verb%);LEFT$("C",NOTverb%);"an't write track";LEFT$(" "+STR$head%+":"+FNd0(track%,2),NOTverb%)
  600 ENDPROC
  620 DEFPROCparameters
  640 logbps%=10:spt%=16:den%=2:IFHIMEM-LOMEM<20480:logbps%=8:spt%=16:den%=1
  650 dstep%=FALSE:tracks%=80:sec0%=0:sides%=2:heads%=1:seq%=TRUE
  660 IFauto%:IFsize%=0:size%=-1:ENDPROC
  670 auto%=FALSE
  700 IFsize%:A$="G:"+FNsize(size%):IFA$="G:":geom$=""
  730 logbps%=8:spt%=10:den%=1:sides%=1
  740 REPEAT:A$=FNs(A$)
  750   A%=FNp("D"):IFA%<>TRUE:den%=A%
  760   A%=FNp("Q"):IFA%<>TRUE:seq%=A%
  770   A%=FNp("H"):IFA%<>TRUE:sides%=A%
  780   A%=FNp("T"):IFA%<>TRUE:tracks%=A%
  790   A%=FNp("S"):IFA%<>TRUE:logbps%=A%+7
  800   A%=FNp("N"):IFA%<>TRUE:spt%=A%
  810   IFLEFT$(A$,1)="Z":sec0%=EVAL("&"+MID$(A$,2)):A$=MID$(A$,2+LENSTR$~A%)
  820   IFLEFT$(A$,1)=":":A$=MID$(A$,2)
  830 UNTILINSTR("DQHTSNZ",LEFT$(A$,1))=0ORA$=""
  840 IFLEFT$(A$,2)<>"G:":PROCgeom:A$="G:"+geom$
  870 IFLEFT$(A$,2)<>"G:":PRINT"Unknown geomtry":PROCexit(220):END
  880 den%=VALMID$(A$,3):seq%=VALMID$(A$,5)<>0:sides%=VALMID$(A$,7)
  890 heads%=sides%:tracks%=VALMID$(A$,9):logbps%=7+VALMID$(A$,12):IFlogbps%>14:logbps%=logbps%-7
  900 spt%=VALMID$(A$,14):sec0%=EVAL("&"+MID$(A$,17,2))
  910 IFseq%:IFheads%=2:heads%=1
  920 ENDPROC
  940 DEFFNp(B$):IFLEFT$(A$,1)<>B$:=TRUE
  950 A%=VALMID$(A$,2):A$=MID$(A$,2+LENSTR$A%):=A%
  970 DEFPROCsyntax:PRINT"ImgToDisk <infile> <dest drive> (<geometry>) (-size <num>) -format -v -help":ENDPROC
  990 DEFPROChelp:PROCsyntax:PRINT$(PAGE+17)" (C)J.G.Harston 2008-2014"
 1000 PRINT" -auto  attempts to autosense dest disk layout"
 1020 PRINT" -inv   invert data"
 1030 PRINT" <geometry> is:"
 1040 PRINT"   G:<den>:<seq>:<heads>:<tracks>:<logsecsize>:<sectors>:<sec0>"
 1050 PRINT" or any combination of:"
 1060 PRINT"   D<den>:Q<seq>:H<heads>:T<tracks>:S<logsecsize>:N<sectors>:Z<sec0>"
 1070 PRINT" known -size options are:"
 1080 FORA%=50TO1600STEP10
 1090   geom$=FNsize(A%):IFgeom$<>"":PRINT" -size ";A%;"K : ";FNgeom
 1100 NEXT:ENDPROC
 1120 DEFFNsize(size%)
 1140 IFsize%=200:="1:1:1:80:1:10:00"
 1150 IFsize%=320:="2:1:1:80:1:16:00"
 1160 IFsize%=400:="1:1:2:80:1:10:00"
 1170 IFsize%=640:="2:1:2:80:1:16:00"
 1180 IFsize%=720:="2:0:2:80:2:09:01"
 1190 IFsize%=800:="2:0:2:80:3:05:00"
 1200 IFsize%=1440:="4:0:2:80:2:18:01"
 1210 IFsize%=1600:="4:0:2:80:3:10:00"
 1230 IFsize%=100:="1:1:1:40:1:10:00"
 1240 IFsize%=160:="2:1:1:40:1:16:00"
 1250 IFsize%=360:="2:0:2:40:2:09:01"
 1260 IFsize%=400:="2:1:2:40:2:10:01"
 1280 IFsize%=070:="1:1:1:35:0:16:01"
 1290 IFsize%=140:="1:1:2:35:0:16:01"
 1300 IFsize%=280:="2:1:1:35:1:16:01"
 1310 =""
 1330 DEFFNgeom
 1340 IFgeom$="":="autosensed disk"
 1360 IFgeom$="1:1:1:40:1:10:00":="1*40*10*256 FM disk (40T DFS)"
 1370 IFgeom$="2:1:1:40:1:16:00":="1*40*16*256 MFM disk (ADFS S)"
 1380 IFgeom$="1:1:1:80:1:10:00":="1*80*10*256 FM disk (80T DFS)"
 1390 IFgeom$="2:1:1:80:1:16:00":="1*80*16*256 MFM disk (ADFS M)"
 1400 IFgeom$="1:1:2:80:1:10:00":="2*80*10*256 FM disk (2xDFS, L2FS, AcornCPM, TorchCPN, HADFS)"
 1410 IFgeom$="2:1:2:80:1:16:00":="2*80*16*256 MFM disk (ADFS L, L3FS, Filestore)"
 1420 IFgeom$="2:0:2:80:1:16:00":="80*2*16*256 MFM disk (interleaved ADFS L, L3FS, Filestore)"
 1430 IFgeom$="2:0:2:80:2:09:01":="80*2*9*512  MFM disk (DOS 720K)"
 1440 IFgeom$="2:0:2:80:3:05:00":="80*2*5*1024 MFM disk (MDFS, AcornDOS, ADFS D,E)"
 1450 IFgeom$="4:0:2:80:2:18:01":="80*2*18*512 MFM disk (DOS 1440K)"
 1460 IFgeom$="4:0:2:80:3:10:00":="80*2*10*1024 MFM disk (ADFS F)"
 1480 IFgeom$="1:1:1:35:0:16:01":="1*35*16*128 FM disk (1xMZ-80K)"
 1490 IFgeom$="1:1:2:35:0:16:01":="2*35*16*128 FM disk (2xMZ-80K)"
 1500 IFgeom$="2:1:1:35:1:16:01":="1*35*16*256 MFM disk (MZ-80A/B)"
 1510 IFgeom$="2:0:2:40:2:09:01":="40*2*9*512 MFM disk (360K DOS)"
 1520 IFgeom$="2:1:2:40:2:10:01":="2*40*10*512 MFM disk (MZ-80A/B CPM)"
 1540 IFgeom$="2:1:2:80:2:10:00":="2*80*10*512 MFM disk (Slogger DDCPM)"
 1550 ="G:"+geom$+" disk"
 1570 DEFPROCgeom
 1580 geom$=STR$den%+":"+STR$(seq%AND1)+":"+STR$sides%+":"+STR$tracks%+":"+STR$(logbps%-7)+":"+RIGHT$("0"+STR$spt%,2)+":"+RIGHT$("0"+STR$~sec0%,2)
 1590 ENDPROC
 1610 DEFFNimgtype(in$)
 1620 in%=OPENIN(in$):IFin%=0:=-1
 1630 PROCgbpb(4,in%,data%,16,0):CLOSE#in%:in%=0
 1640 data%?11=13
 1650 IF$data%="Slogger CPM":=&1A6
 1660 IF$data%="SLOGGER CPM":=&1A6
 1670 data%?8=13
 1680 IF$data%="Acorn CP":=&1A6
 1690 IF$data%="ACORN CP":=&1A6
 1700 IF$(data%+5)="DOS":=&FC8
 1710 =&B22
 1740 DEFPROCFDC_Init(dskrec%,bps%,spt%,hds%,den%,trks%,sec0%)
 1750 LOCALi%:IFos%<>6:ENDPROC
 1760 dskrec%?0=bps%:dskrec%?1=spt%:dskrec%?2=hds%:dskrec%?3=den%
 1770 FORi%=4TO59STEP4:dskrec%!i%=0:NEXT:dskrec%!64=&20000000
 1780 dskrec%?8=sec0%:dskrec%!16=trks%*spt%*(2^bps%)*hds%
 1790 ENDPROC
 1810 DEFFNdiskop(op%)
 1820 IFos%=6:SYS"XADFS_DiscOp",0,op%+64+(diskrec%<<6),offset%*spt%*bps%+(drive%<<29),data%,spt%*bps%TOr%:=r%
 1830 IFden%=1:IFop%=1:=FNdisk(data%,&53,drive%+head%*2,track%,0,spt%,den%)
 1840 IFden%=1:IFop%=2:=FNdisk(data%,&4B,drive%+head%*2,track%,0,spt%,den%)
 1850 IFden%=1:IFop%=3:=FNdisk(data%,&5B,drive%+head%*2,track%,0,spt%,den%)
 1860 IFden%=2:IFop%=1:=FNscsi(data%,&008,drive%,track%*16+head%*80,spt%)
 1870 IFden%=2:IFop%=2:=FNscsi(data%,&10A,drive%,track%*16+head%*80,spt%)
 1880 =-1
 1900 DEFPROCClose_All
 1910 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
 1920 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
 1930 ENDPROC
 1950 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
 1960 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:CALL&FFD1:ENDPROC
 1980 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
 1990 DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%)
 2010 DEFPROCHour_Glass(A%):IFos%<>6:ENDPROC
 2020 IFA%=-1:SYS"Hourglass_On":ENDPROC
 2030 IFA%=-2:SYS"Hourglass_Off":ENDPROC
 2040 IFA%=-3:SYS"Hourglass_Smash":ENDPROC
 2050 SYS"Hourglass_Percentage",A%
 2060 ENDPROC
 2080 DEFFNOS_GetEnv:LOCALA$,A%:X%=1:os%=((USR&FFF4)AND&FF00)DIV256:DIMX%-1
 2090 IFos%=32:IFPAGE>&FFFF:SYS"GetModuleFileName",0,X%,255:A$=$$X%:run$=A$:=@cmd$
 2100 IFos%=32:A$=$&100
 2110 IFLENA$=0:IFPAGE>&7FFF:run$=$&8100:SYS"OS_GetEnv"TOA$,,A%:SYS"OS_WriteEnv","",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):IFLENA$=0:A$=run$
 2120 IFLENA$=0:IF?(TOP-3):A$=$&600ELSEIFLENA$=0:A$=$(PAGE-&300)
 2130 A%=INSTR(A$+" "," "):run$=LEFT$(A$,A%-1):IFrun$<>"":=MID$(A$,A%+1)
 2140 Y%=X%DIV256:A%=9:?X%=0:X%!1=X%+16:X%!16=0:CALL&FFD1:A%=X%+16:IF!A%AND?A%+A%?2<>8:A%?(A%+1)=13:=$(A%+1)
 2150 =""
 2170 DEFPROCexit(A%):OSCLI"FX1,"+STR$A%:END
 2180 ENDPROC
 2200 DEFFNcl(l$,n%):IFl$="":A$=FNs(A$):IFASCA$=34:A%=INSTR(A$+" "" ",""" ",2):l$=MID$(A$,2,A%-2):A$=FNs(MID$(A$,A%+1)):=l$
 2210 IFl$="":A%=INSTR(A$+" "," "):l$=LEFT$(A$,A%-1):A$=FNs(MID$(A$,A%+1)):=l$
 2220 IFn%=0:IFl$<>"":A%=INSTR(A$,l$):IFA%:A$=FNs(LEFT$(A$,A%-1)+MID$(A$,INSTR(A$," ",A%)+1))+" ":=TRUE
 2230 IFn%=0:IFl$<>"":=FALSE
 2240 A%=INSTR(LEFT$(" ",ASCl$=32)+A$,l$):IFA%=0:=""
 2250 A$=LEFT$(A$,A%-1)+FNs(MID$(A$,INSTR(A$," ",A%)+1))
 2260 IFASCl$=32:l$=MID$(A$,A%):A$=LEFT$(A$,A%-1):=MID$(l$,1-(ASCl$=34),LENl$+2*(ASCl$=34))
 2270 IFASCMID$(A$,A%,1)<>34:l$=MID$(A$,A%,INSTR(A$+" "," ",A%)-A%):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+1):=l$
 2280 l$=MID$(A$,A%+1,INSTR(A$+""" ",""" ",A%+1)-A%-1):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+3):=l$
 2290 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
 2300 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
 2310 =A$
 2330 DEFFNdisk(addr%,cmd%,drv%,trk%,sec%,num%,den%):LOCALfs%
 2340 fs%=FNfs:IFfs%<>4:*FX143,18,4
 2350 REPEATX%?0=drv%+den%*24+8:X%!1=addr%:X%?5=3-7*(cmd%>127)
 2360   X%?6=cmd%:X%?7=trk%:X%?8=sec%:X%?9=num%OR&20:A%=127:CALL&FFF1
 2370 A%=X%?(7+X%?5):UNTILA%<>&10:IFfs%<>4:OSCLI"FX143,18,"+STR$fs%
 2380 =A%
 2400 DEFFNscsi(addr%,cmd%,drv%,sect%,num%):LOCALfs%
 2410 fs%=FNfs:IFfs%<>8:*FADFS
 2420 X%?0=0:X%!1=addr%:X%?5=cmd%:X%?6=drv%*32+((sect%AND&1F0000)DIV65536)
 2430 X%?7=((sect%AND&FF00)DIV256):X%?8=sect%:X%!9=num%:X%!11=0
 2440 A%=&72:CALL&FFF1:A%=?X%:IFfs%<>8:OSCLILEFT$("DISMOUNT",cmd%>255):OSCLI"FX143,18,"+STR$fs%
 2450 =A%
 2470 DEFFNfs:LOCALA%,E%,Y%:=(USR&FFDA)AND&FF
65449 
  162  CLGOSCLIPOSPROCATNCIRCLELOADWHEN PAGEREPORTEVALTRUEA{ATNRECTANGLELOADLEFT$( PAGEREPEATEVALORLNTRUECIRCLEATNINSTALLRECTANGLELOADWHEN PAGEREPEATATNINSTALLRECTANGLELEN"  g{N{LQ%=PA.:CH."* BASIC f{Z{{{ORLENFNLNTRUERECTANGLEGCOLLNFNLEN`EVALORIGINTRUEPRIVATEELLIPSELNTRUET{ATNPRIVATEELLIPSETAB(ATNT{STEPEXITVDU`WHENOSCLIPLOTFILLLEN`LINEINTORLEN g{,zELLIPSE0EVALELLIPSEPOSINTERRORLNLOADPOSINTERRORLOGEVALTRUEhXTIMELNLOADPAGERETURNGCOLLOGONDEG{EXITPRINT
  352   PTR QUITMOUSEPAGERUNLENELLIPSEeINTLNLENeLENINTLENCIRCLE QUITMOUSEEVAL ENDPROCENDPROC{TRUEhX2302PAGEPRINTONENDWHILE{EXITMOVELENPTR QUITMOUSELENCIRCLE