10 REM > DSDtoDSS 1.13
   20 REM Convert disk images
   30 REM From 0:0..0:9,1:0..1:9,etc. to 0:0..0:79,1:0..1:79
   40 REM v1.10 - does whole tracks at a time
   50 REM v1.11 - initial try at 80+ tracks
   60 REM v1.12 - -spt 16 will do ADFS images, -0 -1 to do single side, -2 output to two files
   70 REM v1.13 - fixed -spt16 copying of images <640K
   80 :
   90 A$=FNOS_GetEnv:IFos%=32:PROCWin_TextIO
  100 IFINSTR(A$,"-?"):PRINT"DSDtoSSD <infile> (<outfile>) -spt <num> -[0|1|2] -v":PROCexit(0)
  110 same%=FALSE:spt%=10:vb%=FALSE:DIM ctrl% 31:X%=ctrl%:Y%=X%DIV256
  120 IFA$="":INPUT"Input file: "in$:INPUT"Output file: "out$:A$=in$+" "+out$
  130 A%=INSTR(A$+" "," "):in$=LEFT$(A$,A%-1):out$=MID$(A$,A%+1)
  140 A%=INSTR(out$+" "," "):out$=LEFT$(out$,A%-1)
  150 A%=INSTR(A$," -s"):IFA%:spt%=VALMID$(A$,INSTR(A$," ",A%+1))
  160 vb%=INSTR(A$," -v")<>0:s0%=0:s1%=1
  170 s2%=(INSTR(A$," -2")<>0)AND1:s1%=(INSTR(A$," -0")=0)AND1:s0%=(INSTR(A$," -1")<>0)AND1
  180 IFout$=""ORout$="""""":same%=TRUE
  190 IFsame%:IFos%=6:out$="<Wimp$Scrap>/ssd"
  200 IFsame%:IFos%=8:out$="$temp$/scrap.ssd"
  210 IFsame%:IFos%=32:DIM B% 255:SYS"ExpandEnvironmentStrings","%TMP%",B%,255:out$=$$B%+"\scrap.ssd"
  220 ON ERROR PROCClose_All:PROCHour_Glass(-3):REPORT:PRINTERL:PROCexit(ERR)
  230 in%=OPENIN(in$):IFin%=0:PRINT"File '"in$"' not found":PROCexit(214)
  240 tracks%=((EXT#in%+(256*2*spt%-1)) DIV (256*2*spt%))
  250 ext%=LENout$+1:IFos%>31:A%=ext%:REPEAT:A%=A%-1:UNTILMID$(out$,A%,1)="." OR A%<0:IFA%>=0:ext%=A%
  260 PROCopenout
  270 :
  280 DIM mem% 256*spt%:side%=s0%:PROCHour_Glass(-1)
  290 REPEAT:track%=0:IFs2%:IFside%=1:CLOSE#out%:out%=0:PROCopenout
  300   REPEAT:PROCHour_Glass(100*track% DIV tracks%)
  310     IFvb%:PRINTCHR$13;side%;":";track%;":00";
  320     PROCgbpb(3,in%, mem%,256*spt%,((track%*2+side%)*spt%)*256)
  330     PROCgbpb(1,out%,mem%,256*spt%,((track%+side%*80)*spt%)*256)
  340   track%=track%+1:UNTILtrack%>=tracks% OR EOF#in%:side%=side%+1
  350 UNTILside%>s1%
  360 CLOSE#out%:out%=0:CLOSE#in%:in%=0:PROCHour_Glass(-2):IFvb%:PRINT
  370 IFos%<32:OSCLI"SetType "+out$+" "+STR$~(&B22-&4AC*(spt%=16))
  380 IFsame%:OSCLI"Copy "+out$+" "+in$+LEFT$(" ~A~CDF~L~N~P~Q~RS~T~V",os%<>32)
  390 PROCexit(0)
  400 :
  410 DEFPROCopenout
  420 IFs2%:out$=LEFT$(out$,ext%-1)+STR$side%+MID$(out$,ext%+side%)
  430 out%=OPENOUT(out$):IFout%=0:PRINT'"Can't open '"out$"'.":CLOSE#in%:in%=0:PROCexit(192)
  440 ENDPROC
  450 :
  460 DEFPROCClose_All
  470 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
  480 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  490 ENDPROC
  500 :
  510 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
  520 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IFos%<32:CALL &FFD1:ENDPROC
  530 IFA%=1ORA%=3:PTR#?X%=X%!9
  540 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1 ELSE IFA%=3ORA%=4:?X%!1=BGET#?X%
  550 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X% AND A%>2) OR X%!5<1:ENDPROC
  560 :
  570 DEFPROCHour_Glass(A%):IFos%<>6:ENDPROC
  580 IFA%=-1:SYS"Hourglass_On":ENDPROC
  590 IFA%=-2:SYS"Hourglass_Off":ENDPROC
  600 IFA%=-3:SYS"Hourglass_Smash":ENDPROC
  610 SYS"Hourglass_Percentage",A%
  620 ENDPROC
  630 :
  640 DEFFNOS_GetEnv:LOCALA$,A%,X%,Y%:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
  650 IFos%>31:IFPAGE>&FFFFF:DIMX%LOCAL256:SYS"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$
  660 A%=(HIMEM>&FFFF)AND&900:IF?(TOP-3):A%=((PAGE>&9FFF)ANDA%)OR((&1400-PAGE)AND(A%=0))ELSEA%=((A%-&500)OR&200)AND&FFF
  670 A$=$(PAGE-&E00+A%):IFA%=0:run$=A$:SYS16TOA$,,A%:SYS72,"",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):IFLENA$=0:A$=run$
  680 FORY%=-1TO0:A$=" "+A$:REPEATA$=MID$(A$,2):UNTILASCA$<>32
  690   IFY%:IFASCA$=34:A%=INSTR(A$,"""",2)+1 ELSEIFY%:A%=INSTR(A$+" "," ")
  700   IFY%:run$=MID$(A$,1-(ASCA$=34),A%-1+2*(ASCA$=34)):IFrun$<>"":A$=MID$(A$,A%+1)
  710 NEXT:=A$
  720 :
  730 DEFPROCexit(A%):OSCLI"FX1,"+STR$(A%AND255):IFPAGE>&FFFFF:QUIT A%
  740 IFos%<6:END ELSE *Quit
  750 ENDPROC
  760 :
  770 DEFPROCWin_TextIO
  780 SYS"GetStdHandle",-10TO@hfile%(1):*INPUT 1
  790 SYS"GetStdHandle",-11TO@hfile%(2):*OUTPUT 2
  800 SYS"SetConsoleMode",@hfile%(1),0
  810 ENDPROC