10 REM > MkSnap 1.20
   20 REM (C) J.G.Harston
   30 REM Make a SpecSnap snapshot file
   40 REM from spectrum files with load/exec addresses
   50 DIM ctrl% 31,name% 80:X%=ctrl%:Y%=X%DIV256:DIM mem% &10100
   60 :
   70 INPUT "Enter output SpecSnap filename: "out$
   80 PRINT "Enter input filenames, terminated with RETURN"
   90 ON ERROR REPORT:PROCCloseAll:PRINT" at line ";ERL:END
  100 FOR A%=0 TO 255 STEP4:mem%!A%=0:NEXT
  110 :
  120 REPEAT
  130   INPUT "File: "in$
  140   IF in$<>"":PROCStore
  150 UNTIL in$=""
  160 mem%!&20=SpExtra%:REM Set to last file's exec address
  170 mem%?&8E=&FF     :REM Sound ON
  180 OSCLI"Save "+out$+" "+STR$~mem%+"+10100"
  190 OSCLI"SetType "+out$+" 702"
  200 END
  210 :
  220 DEFPROCStore
  230 IFLEFT$(in$,1)="*":OSCLIin$:ENDPROC
  240 A%=INSTR(in$+" "," "):load$=MID$(in$,A%):in$=LEFT$(in$,A%-1)
  250 REPEATload$=MID$(load$,2):UNTILLEFT$(load$,1)<>" "
  260 type%=FNfile(in$,5):load%=X%!2:exec%=X%!6:len%=X%!10:attr%=X%!14
  270 SpName$=in$:A%=INSTR(SpName$,".")
  280 IFA%:REPEATSpName$=MID$(SpName$,A%+1):A%=INSTR(SpName$,"."):UNTILA%=0
  290 IF type%<>1:PRINT"File '"in$"' not found":ENDPROC
  300 IF len%>&FFFF:PRINT"File '"in$"' too long":ENDPROC
  310 IF(load%AND&FFFF0000)=&FFF20000:load%=&FFFF0000+(load%AND&FF00):exec%=load%:IFexec%>&FFFF5FFF:exec%=exec%+3
  320 IF(load%AND&FFFFFF00)=&FFF70000:load%=&30000:exec%=load%
  330 SpType%=(load% AND &30000)DIV&10000
  340 IFSpType%<>3:PRINT"Can only deal with CODE":ENDPROC
  350 SpStart%=(load% AND &FFFF):SpExtra%=(exec% AND &FFFF):SpLen%=len%
  360 IFload$<>"":SpStart%=EVAL("&"+load$)
  370 IFSpStart%+SpLen%>&10000:PRINT"Runs over memory end":ENDPROC
  380 PRINTCHR$11;SPC(LENin$+6);CHR$13;~SpType%;" "SpName$;SPC(11-LENSpName$);
  390 PRINTFNh0(SpStart%,4)" "FNh0(SpExtra%,4)" "FNh0(SpLen%,4);
  400 OSCLI"Load "+in$+" "+STR$~(mem%+SpStart%+&100)
  410 PRINT
  420 ENDPROC
  430 :
  440 DEFPROCCloseAll
  450 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
  460 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  470 ENDPROC
  480 :
  490 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
  500 DEFFNfile(A$,A%):$name%=A$:X%?0=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF