10 REM > UnImg v1.12
   20 DIMctrl%127,name%79,zp%9:A$=FNOS_GetEnv+" ":IFos%=32:PROCWin_TextIO
   30 quit$=FNcl(" -qu",1):debug%=FNcl("-de",0):ONERRORREPORT:PRINT:PROCexit(ERR)
   40 IFFNcl("-help",0):PRINT"UnImg v1.12 (C)J.G.Harston 2017";:A$="-?":PRINT" Single disk only"
   50 IFFNcl("-?",0):PRINT"Syntax: UnImg infile -d outdir -fs type -dsd -s -e -i -X -q -quit command":PROCexit(0)
   60 dsd%=FNcl("-ds",0):dst$=FNcl("-d",1):type$=FNcl("-f",1):sub%=FNcl("-s",0):ext%=FNcl("-e",0)
   70 vb%=NOTFNcl("-q",0):inf%=FNcl("-i",0):full%=FNcl("-X",0)
   80 in$=FNcl("",0):drv$=FNcl("",0)
   90 d$=".":s$="/":IFos%AND-24:d$="/":s$=".":IFos%AND-32:d$="\"
  100 ONERRORREPORT:PRINTLEFT$(" at line "+STR$ERL,ERR<128ANDERR<>17):PROCClose_All:PROCexit(ERR)
  110 X%=ctrl%:Y%=X%DIV256:fln%=11:fmx%=-1:IF(os%AND-24):fln%=256
  120 DIMA%-1:max%=HIMEM-A%-2048+4096*(HIMEM>&FFFF):DIMmem% max%:wr%=2:rd%=4
  130 IFin$="":INPUT"File to extract from: "in$:INPUT"Image type:"SPC11type$:IFdst$="":INPUT"Destination path:"SPC5dst$
  140 in%=FNf_openin(in$):IFin%=0:PRINT"File '"in$"' not found":PROCexit(214)
  150 IFtype$="":fstype%=FNchkdiskELSEfstype%=INSTR("HADFS",FNuc(type$))
  160 IFfstype%=0:CLOSE#in%:in%=0:PRINT"Unrecognised disk image":PROCexit(225)
  170 IFfstype%<2:tsz%=10:dsz%=&300:root%=&47
  180 IFfstype%=2:tsz%=16:dsz%=&500:root%=&02
  190 IFfstype%>2:tsz%=10:dsz%=&200:root%=&00
  200 DIMdir% dsz%-1
  210 PROCsavedir(root%,dst$):CLOSE#in%:in%=0:PROCexit(0):END
  220 DEFFNchkdisk
  230 PROCf_gbpb(rd%-1,in%,mem%,4,&201):IF!mem%=&6F677548:=2
  240 PROCf_gbpb(rd%-1,in%,mem%,8,&4610):IF!mem%=&29432800:=1
  250 =3
  260 DEFPROCmkdir:IFdst$<>"":PROCf_cdir(dst$):dst$=dst$+d$
  270 ENDPROC
  280 DEFPROCsavedir(csd%,dst$)
  290 LOCALnum%,r0%,f%:PROCmkdir:REPEAT:PROCRdDir(csd%)
  300   IFnum%:f%=fn0%:REPEAT:num%=num%-FNsaveobject(f%):f%=f%+fsz%:UNTILnum%<1
  310   csd%=0:IFfstype%<2:csd%=dir%!14AND&FFFF:IF(dir%?12)>127:csd%=dir%!23AND&FFFFFF
  320 UNTILcsd%=0:ENDPROC
  330 DEFFNsaveobject(fptr%)
  340 LOCALfn$,lf$,ld%,ex%,nm%
  350 N%=0:REPEAT:A%=dir%?(fptr%+N%)AND127:IFA%>32:lf$=lf$+CHR$A%
  360 N%=N%+1:UNTILN%=10ORA%<33
  370 IFlf$="":IFfstype%<2:=0
  380 IFlf$="":=num%
  390 IFfstype%>2:lf$=CHR$(dir%?(fptr%+7)AND127)+"/"+LEFT$(lf$,7):IF(ASClf$AND-5)=32:lf$=MID$(lf$,3)
  400 A%=(fstype%>2)AND(MID$(lf$,2,1)="/")
  410 IFA%:IFsub%:lf$=LEFT$(lf$,1)+"."+MID$(lf$,3)
  420 IFA%:IFext%:lf$=MID$(lf$,3)+"/"+LEFT$(lf$,1)
  430 PROCgetattrs:fn$=FNf_name(FNfn_unbbc(lf$))
  440 IFvb%:PRINTlf$SPC(11-LENlf$)FNh0(ld%,8)" "FNh0(ex%,8)" "FNh0(nm%,6)
  450 IFattr%AND256:PROCsavedir(sec%,dst$+fn$):PROCRdDir(csd%)ELSEPROCsavefile
  460 PROCsetattrs:=1
  470 DEFPROCsavefile
  480 A%=INSTR(fn$,d$):IFA%:PROCf_cdir(dst$+LEFT$(fn$,A%-1))
  490 X%!2=ld%:X%!6=ex%:X%!10=0:X%!14=nm%:A%=FNfile(dst$+fn$,7):len%=nm%
  500 out%=OPENOUT(dst$+fn$):REPEAT:cnt%=len%:IFlen%>max%:cnt%=max%AND-256
  510   PROCRdData(mem%,sec%,(cnt%+255)DIV256):PROCf_gbpb(wr%,out%,mem%,cnt%,0)
  520 sec%=sec%+(cnt%+255)DIV256:len%=len%-cnt%:UNTILlen%<1:CLOSE#out%:out%=0
  530 ENDPROC
  540 DEFPROCgetattrs
  550 cdate%=0:mdate%=0:mtime%=0:usr%=0:IFfstype%>2:PROCdfsattrs:ENDPROC
  560 ld%=dir%!(fptr%+10):ex%=dir%!(fptr%+14):nm%=dir%!(fptr%+18)
  570 sec%=dir%!(fptr%+22)AND&FFFFFF:attr%=FNattr(fptr%)
  580 IFfstype%=2:attr%=(attr%AND3)+(attr%AND4)*2+(attr%AND8)*32+(attr%AND&1E0)DIV2:ENDPROC
  590 attr%=attr%EOR&33:usr%=dir%?19OR(dir%?18DIV16)OR(dir%!20AND&FFFF0000)
  600 mdate%=dir%!(fptr%+26):mtime%=dir%!(fptr%+28):cdate%=dir%!(fptr%+30)
  610 IFdir%?12>127:ENDPROC
  620 nm%=nm%AND&7FFFF
  630 sec%=sec%AND&FFFF
  640 mdate%=dir%!(fptr%+20)AND&FFF8
  650 mdate%=mdate%OR((dir%?(fptr%+9)AND&80)DIV128)
  660 mdate%=mdate%OR((dir%?(fptr%+13)AND&C0)DIV32)
  670 cdate%=mdate%:ld%=(ld%AND&3FFFFFFF):IF(ld%AND&20000000):ld%=ld%OR&C0000000
  680 ENDPROC
  690 DEFPROCdfsattrs
  700 ld%=dir%!(fptr%+256)AND&FFFF:ex%=dir%!(fptr%+258)AND&FFFF
  710 nm%=dir%!(fptr%+260)AND&FFFF:sec%=dir%?(fptr%+263)
  720 A%=dir%!(fptr%+261)AND&FF00
  730 ld%=ld%OR((A%AND&0C00)*64):IFld%>&2FFFF:ld%=ld%OR&FFFF0000
  740 ex%=ex%OR((A%AND&C000)*4):IFex%>&2FFFF:ex%=ex%OR&FFFF0000
  750 nm%=nm%OR((A%AND&3000)*16):sec%=sec%OR(A%AND&0300)
  760 attr%=&33:IFdir%?(fptr%+7)>127:attr%=&19
  770 ENDPROC
  780 DEFPROCsetattrs
  790 X%!2=ld%:X%!6=ex%:X%!14=attr%AND&7F:X%!15=mdate%:A%=FNfile(dst$+fn$,1)
  800 IFinf%=0:IF(os%AND-24)=0:ENDPROC
  810 inf$=FNfn_unbbc(lf$)+s$+"inf":IF(os%AND-24)=0:inf$=LEFT$(LEFT$(lf$,8)+s$+"inf",10)
  820 inf$=dst$+inf$:IF(os%AND-24)=0:IFASCinf$=45:inf$="@."+inf$
  830 IFfstype%>2:IFASCMID$(lf$,2,1)=47:lf$=LEFT$(lf$,1)+"."+MID$(lf$,3)
  840 A$=lf$+" ":IFLENA$<11:A$=A$+STRING$(10-LENlf$," ")
  850 A$=A$+FNh0(ld%,8)+" "+FNh0(ex%,8)+" "+FNh0(nm%,6)+" "+FNh0(attr%,2)
  860 IFfull%:IFfstype%<2:A$=A$+" "+FNh0(mdate%,4):IFdir%?12>127:A$=A$+" "+FNh0(mtime%,6)+" "+FNh0(cdate%,4)+" "+FNh0(cdate%,6)+" "+FNh0(acc%,4)+" "+FNh0(aux%,4)
  870 A$=A$+CHR$13+CHR$10:out%=FNf_openout(inf$):FORA%=1TOLENA$:BPUT#out%,ASCMID$(A$,A%,1):NEXT:CLOSE#out%:out%=0
  880 A%=FNfile(inf$,5):X%!3=X%!3OR&FFFFFF:A%=FNfile(inf$,2)
  890 ENDPROC
  900 DEFFNattr(f%):LOCALa%,n%:FORn%=0TO7:a%=a%DIV2+(dir%?(f%+n%)AND&80):NEXT:=a%OR((dir%?(f%+8)*2)AND&100)
  910 DEFPROCRdDir(sect%)
  920 PROCRdData(dir%,sect%,dsz%DIV256)
  930 IFfstype%>2:fn0%=8:fsz%=8:num%=(dir%?&105)DIV8:ENDPROC
  940 IFfstype%=2:fn0%=5:fsz%=26:num%=47:ENDPROC
  950 IFfstype%<2:fn0%=24:fsz%=24:num%=(dir%?12)AND31:IFdir%?12>127:fn0%=32:fsz%=32
  960 ENDPROC
  970 DEFPROCRdData(ad%,sc%,nm%):LOCALn%
  980 FORn%=0TOnm%-1:PROCrd(ad%+256*n%,sc%+n%):NEXT:ENDPROC
  990 DEFPROCrd(ad%,sc%):LOCALt%,s%,h%
 1000 IFdsd%:t%=sc%DIVtsz%:s%=sc%MODtsz%:h%=t%DIV80:t%=t%MOD80:sc%=s%+h%*tsz%+t%*tsz%*2
 1010 PROCf_gbpb(rd%-1,in%,ad%,256,sc%*256)
 1020 ENDPROC
 1030 DEFFNfn_unbbc(B$):IF(os%AND-24)=0:=B$
 1040 LOCALB%:A$="#?./$<^>&+@=%; "
 1050 FORA%=1TOLENB$:B%=INSTR(A$,MID$(B$,A%,1))-1
 1060   IFB%>TRUE:B$=LEFT$(B$,A%-1)+MID$(A$+"_",(B%EOR1)+1,1)+MID$(B$,A%+1)
 1070 NEXT:=B$
 1080 DEFFNh0(A%,N%):=RIGHT$("0000000"+STR$~A%,N%)
 1090 DEFPROCClose_All:*EXEC
 1100 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
 1110 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
 1120 ENDPROC
 1130 DEFFNOS_GetEnv:LOCALA$,A%,X%,Y%:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
 1140 IFos%>31:IFPAGE>&FFFFF:DIMX%LOCAL256:SYS"GetModuleFileName",0,X%,255:run$=$$X%:=@cmd$
 1150 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
 1160 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$
 1170 FORY%=-1TO0:A$=" "+A$:REPEATA$=MID$(A$,2):UNTILASCA$<>32
 1180   IFY%:IFASCA$=34:A%=INSTR(A$,"""",2)+1ELSEIFY%:A%=INSTR(A$+" "," ")
 1190   IFY%:run$=MID$(A$,1-(ASCA$=34),A%-1+2*(ASCA$=34)):IFrun$<>"":A$=MID$(A$,A%+1)
 1200 NEXT:=A$
 1210 DEFPROCos(A$):IFASCA$=42:OSCLIA$ELSEIFA$<>"":CHAINA$
 1220 ENDPROC
 1230 DEFPROCexit(A%):OSCLI"FX1,"+STR$(A%AND255):quit$=quit$:A$=quit$:quit$="":PROCos(A$)
 1240 IFPAGE>&FFFFF:QUITA%
 1250 IFos%<6:ENDELSE*Quit
 1260 ENDPROC
 1270 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$
 1280 IFl$="":A%=INSTR(A$+" "," "):l$=LEFT$(A$,A%-1):A$=FNs(MID$(A$,A%+1)):=l$
 1290 IFn%=0:IFl$<>"":A%=INSTR(A$,l$):IFA%:A$=FNs(LEFT$(A$,A%-1)+MID$(A$,INSTR(A$," ",A%)+1))+" ":=TRUE
 1300 IFn%=0:IFl$<>"":=FALSE
 1310 A%=INSTR(LEFT$(" ",ASCl$=32)+A$,l$):IFA%=0:=""
 1320 A$=LEFT$(A$,A%-1)+FNs(MID$(A$,INSTR(A$," ",A%)+1))
 1330 IFASCl$=32:l$=MID$(A$,A%):A$=LEFT$(A$,A%-1):=MID$(l$,1-(ASCl$=34),LENl$+2*(ASCl$=34))
 1340 IFASCMID$(A$,A%,1)<>34:l$=MID$(A$,A%,INSTR(A$+" "," ",A%)-A%):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+1):=l$
 1350 l$=MID$(A$,A%+1,INSTR(A$+""" ",""" ",A%+1)-A%-1):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+3):=l$
 1360 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
 1370 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
 1380 =A$
 1390 DEFFNuc(A$):LOCALB$:IFA$="":=""
 1400 REPEATB$=B$+CHR$(ASCA$AND((A$<"@")OR&DF)):A$=MID$(A$,2):UNTILA$="":=B$
 1410 DEFPROCf_gbpb(A%,chn%,addr%,num%,ptr%):?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:CALL&FFD1:ENDPROC
 1420 DEFFNf_openin(A$)=OPENIN(A$)
 1430 DEFFNf_openout(A$)=OPENOUT(A$)
 1440 DEFFNf_name(A$)=A$
 1450 DEFPROCf_cdir(A$):OSCLI"cdir "+A$:ENDPROC
 1460 DEFFNfile(A$,A%):$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)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{,zELLIPSE0EVALELLIPSEPOSINTERRORLNLOADPOSINTERRORLOGEVALTRUE,aTIMELNLOADPAGERETURNGCOLLOGONDEG{EXITPRINT
  352   PTR QUITMOUSEPAGERUNLENELLIPSEeINTLNLENeLENINTLENCIRCLE QUITMOUSEEVAL ENDPROCENDPROC{TRUE,a2302PAGEPRINTONENDWHILE{EXITMOVELENPTR QUITMOUSELENCIRCLE`O