10 REM > SSDtoDSD 1.13
   20 REM Convert disk images
   30 REM From 0:0..0:79,1:0..1:79 to 0:0..0:9,1:0..1:9,etc.
   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
   70 REM v1.13 - fixed -spt16 copying of images <640K
   80 :
   90 A$=FNOS_GetEnv:IFos%=32:PROCWin_TextIO
  100 IFINSTR(A$,"-?"):PRINT"SSDtoDSD <infile> (<outfile>) -spt <num> -[0|1] -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%=-(INSTR(A$," -1")<>0):s1%=-(INSTR(A$," -0")=0)
  170 IFout$=""ORout$="""""":same%=TRUE
  180 IFsame%:IFos%=6:out$="<Wimp$Scrap>/ssd"
  190 IFsame%:IFos%=8:out$="$temp$/scrap.ssd"
  200 IFsame%:IFos%=32:DIM B% 255:SYS "ExpandEnvironmentStrings","%TMP%",B%,255:out$=$$B%+"\scrap.ssd"
  210 ON ERROR PROCClose_All:PROCHour_Glass(-3):REPORT:PRINT:PROCexit(ERR)
  220 in%=OPENIN(in$):IFin%=0:PRINT"File '"in$"' not found":PROCexit(214)
  230 tracks%=((EXT#in%+(256*spt%-1)) DIV (256*spt%))
  240 IFs0%=1:tracks%=tracks%-80 ELSE IFs0%=0:IFtracks%>80:tracks%=80
  250 IFtracks%<1 OR EXT#in%<256:CLOSE#in%:in%=0:PRINT"Input file too short":PROCexit(200)
  260 out%=OPENOUT(out$):IFout%=0:PRINT"Can't open '"out$"'.":CLOSE#in%:in%=0:PROCexit(192)
  270 :
  280 DIM mem% spt%*256-1:side%=s0%:PROCHour_Glass(-1)
  290 REPEAT:track%=0
  300   REPEAT:PROCHour_Glass(100*track% DIV tracks%)
  310     IFvb%:PRINTCHR$13;side%;":";track%;":00";
  320     PROCgbpb(3,in%, mem%,256*spt%,((side%*80+track%)*spt%)*256)
  330     PROCgbpb(1,out%,mem%,256*spt%,((track%*2+side%)*spt%)*256)
  340   track%=track%+1:UNTILtrack%>=tracks% OR EOF#in%:side%=side%+1
  350 UNTILside%>s1% OR EOF#in%
  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 DEFPROCClose_All
  420 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
  430 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  440 ENDPROC
  450 :
  460 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
  470 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IFos%<32:CALL &FFD1:ENDPROC
  480 IFA%=1ORA%=3:PTR#?X%=X%!9
  490 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1 ELSE IFA%=3ORA%=4:?X%!1=BGET#?X%
  500 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X% AND A%>2)ORX%!5<1:ENDPROC
  510 :
  520 DEFPROCHour_Glass(A%):IFos%<>6:ENDPROC
  530 IFA%=-1:SYS"Hourglass_On":ENDPROC
  540 IFA%=-2:SYS"Hourglass_Off":ENDPROC
  550 IFA%=-3:SYS"Hourglass_Smash":ENDPROC
  560 SYS "Hourglass_Percentage",A%
  570 ENDPROC
  580 :
  590 DEFFNOS_GetEnv:LOCALA$,A%,X%,Y%:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
  600 IFos%>31:IFPAGE>&FFFFF:DIMX%LOCAL256:SYS"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$
  610 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
  620 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$
  630 FORY%=-1TO0:A$=" "+A$:REPEATA$=MID$(A$,2):UNTILASCA$<>32
  640   IFY%:IFASCA$=34:A%=INSTR(A$,"""",2)+1 ELSEIFY%:A%=INSTR(A$+" "," ")
  650   IFY%:run$=MID$(A$,1-(ASCA$=34),A%-1+2*(ASCA$=34)):IFrun$<>"":A$=MID$(A$,A%+1)
  660 NEXT:=A$
  670 :
  680 DEFPROCexit(A%):OSCLI"FX1,"+STR$(A%AND255):IFPAGE>&FFFFF:QUIT A%
  690 IFos%<6:END ELSE *Quit
  700 ENDPROC
  710 :
  720 DEFPROCWin_TextIO
  730 SYS"GetStdHandle",-10TO@hfile%(1):*INPUT 1
  740 SYS"GetStdHandle",-11TO@hfile%(2):*OUTPUT 2
  750 SYS"SetConsoleMode",@hfile%(1),0
  760 ENDPROC