10
20
30
40
50
60
70
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