1
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 CLGOSCLIPOSPROCATN