10 REM > HexPatch
   20 DIM ctrl% 31,name% 127,mem% 255
   30 ON ERROR REPORT:PROCCloseAll:PRINTERL:PROCexit(ERR)
   40 A$=FNOS_GetEnv:in1%=0:in2%=0:out%=0:X%=ctrl%:Y%=X%DIV256
   50 in1$=FNcl("",1):in2$=FNcl("",1):out$=FNcl("",1):base$=FNcl("",1)
   60 IFin1$="-?":PRINT"Usage: HexPatch (<infile>) <hexfile> <outfile> (<addr>)":PROCexit(0)
   70 IFout$="":out$=in2$:in2$=in1$:in1$=""
   80 IFASCin1$=34:in1$=""
   90 IFin2$="":INPUT"Base file: "in1$:INPUT"Hexpatch file: "in2$:INPUT"Output file: "out$:INPUT"Base address: &"base$
  100 X%!2=0:IFin1$<>"":IFFNfile(in1$,5)<>1:PRINT"File '"in1$"' not found":PROCexit(214)
  110 load1%=X%!2:exec1%=X%!6:IFbase$<>"":load1%=EVAL("&"+base$):exec1%=load1%
  120 base%=load1%AND&FFFF:IFFNfile(in2$,5)<>1:PRINT"File '"in2$"' not found":PROCexit(214)
  130 IFin1$<>"":in1%=OPENIN(in1$)
  140 in2%=OPENIN(in2$):out%=OPENOUT(out$):IFin1%:PROCCopyTo(in1%,out%)
  150 REPEAT:PROCLine:UNTILEOF#in2%:PROCCloseAll
  160 X%!2=load1%:A%=FNfile(out$,2):X%!6=exec1%:A%=FNfile(out$,3)
  170 PROCexit(0):END
  180 DEFPROCLine
  190 REPEAT:line$=FNrd(in2%):UNTILEOF#in2% OR LEFT$(line$,1)=":"
  200 IFLEFT$(line$,1)<>":":ENDPROC
  210 num%=EVAL("&"+MID$(line$,2,2))
  220 addr%=EVAL("&"+MID$(line$,4,4))
  230 type%=EVAL("&"+MID$(line$,8,2))
  240 line$=MID$(line$,10)
  250 IFtype%<>0:ENDPROC
  260 IFnum%=0:ENDPROC
  270 PTR#out%=addr%-base%:REPEAT
  280   BPUT#out%,EVAL("&"+LEFT$(line$,2))
  290 line$=MID$(line$,3):UNTILLENline$<3
  300 ENDPROC
  310 DEFPROCCopyTo(i%,o%):IFEOF#i%:ENDPROC
  320 LOCAL l%:REPEAT:l%=256:IFPTR#i%+l%>EXT#i%:l%=EXT#i%-PTR#i%
  330   PROCgbpb(4,i%,mem%,l%,0):PROCgbpb(2,o%,mem%,l%,0)
  340 UNTIL EOF#i%:ENDPROC
  350 DEFPROCCloseAll
  360 in1%=in1%:IFin1%:A%=in1%:in1%=0:CLOSE#A%
  370 in2%=in2%:IFin2%:A%=in2%:in2%=0:CLOSE#A%
  380 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  390 ENDPROC
  400 DEFFNOS_GetEnv:LOCALA$,A%,X%,Y%:X%=1:os%=((USR&FFF4)AND&FF00)DIV256:DIMX%-1
  410 IFos%=32:IFPAGE>&FFFF:SYS"GetModuleFileName",0,X%,255:A$=$$X%:run$=A$:=@cmd$
  420 IFos%=32:A$=$&100
  430 IFLENA$=0:IFPAGE>&7FFF:run$=$&8100:SYS"OS_GetEnv"TOA$,,A%:SYS"OS_WriteEnv","",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):IFLENA$=0:A$=run$
  440 IFLENA$=0:IF?(TOP-3):A$=$&600 ELSE IFLENA$=0:A$=$(PAGE-&300)
  450 A%=INSTR(A$+" "," "):run$=LEFT$(A$,A%-1):IFrun$<>"":=MID$(A$,A%+1)
  460 Y%=X%DIV256:A%=9:?X%=0:X%!1=X%+16:X%!16=0:CALL&FFD1:A%=X%+16:IF!A%AND?A%+A%?2<>8:A%?(A%+1)=13:=$(A%+1)
  470 =""
  480 DEFPROCos(A$):IFASCA$=42:OSCLIA$ ELSE IFA$<>"":CHAINA$
  490 ENDPROC
  500 DEFPROCexit(A%):OSCLI"FX1,"+STR$A%:quit$=quit$:A$=quit$:quit$="":PROCos(A$)
  510 IFos%=32:QUIT A%
  520 IFos%<6:END ELSE *Quit
  530 ENDPROC
  540 DEFFNcl(l$,n%):IFl$="":A$=FNs(A$):IFASCA$=34:A%=INSTR(A$+""" ",""" ",2):l$=MID$(A$,2,A%-3):A$=FNs(MID$(A$,A%+1)):=l$
  550 IFl$="":A%=INSTR(A$+" "," "):l$=LEFT$(A$,A%-1):A$=FNs(MID$(A$,A%+1)):=l$
  560 IFn%=0:IFl$<>"":A%=INSTR(A$,l$):IFA%:A$=FNs(LEFT$(A$,A%-1)+MID$(A$,INSTR(A$," ",A%)+1)):=TRUE
  570 IFn%=0:IFl$<>"":=FALSE
  580 A%=INSTR(LEFT$(" ",ASCl$=32)+A$,l$):IFA%=0:=""
  590 A$=LEFT$(A$,A%-1)+FNs(MID$(A$,INSTR(A$," ",A%)+1))
  600 IFASCl$=32:l$=MID$(A$,A%):A$=LEFT$(A$,A%-1):=MID$(l$,1-(ASCl$=34),LENl$+2*(ASCl$=34))
  610 IFASCMID$(A$,A%,1)<>34:l$=MID$(A$,A%,INSTR(A$+" "," ",A%)-A%):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+1):=l$
  620 l$=MID$(A$,A%+1,INSTR(A$+""" ",""" ",A%+1)-A%-1):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+3):=l$
  630 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
  640 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
  650 =A$
  660 DEFFNfile(A$,A%):IFos%<32:$name%=A$:?X%=name%:X%?1=name%DIV256:=(USR&FFDD)AND&FF
  670 IFINSTR(A$,".")=0:A$=A$+"."
  680 IFA%=255 OR A%=5:X%!14=OPENIN(A$):IFX%!14:X%!10=EXT#X%!14:CLOSE#X%!14
  690 IFA%=255:IFX%?6=0:OSCLI"LOAD """+A$+""" "+STR$~X%!2:=1
  700 IFA%=5:IFX%!14:=1 ELSE IF A%=5:=0
  710 IFA%=0:OSCLI"SAVE """+A$+""" "+STR$~X%!10+" "+STR$~X%!14:X%!10=X%!14-X%!10:=1
  720 IFA%=7:OSCLI"SAVE """+A$+""" "+STR$~PAGE+"+"+STR$~X%!10:X%!10=X%!14-X%!10:=1
  730 IFA%=8 THEN
  740   LOCAL ERROR:ON ERROR LOCAL:=2
  750   OSCLI"MKDIR "+A$:=2
  760 ENDIF
  770 =0
  780 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
  790 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IFos%<32:CALL &FFD1:ENDPROC
  800 IFA%=1ORA%=3:PTR#?X%=X%!9
  810 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1 ELSE IFA%=3ORA%=4:?X%!1=BGET#?X%
  820 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X% AND A%>2)OR X%!5<1:ENDPROC
  830 DEFFNrd(i%):LOCALA$:REPEAT
  840   A%=BGET#i%:IFA%<>10 AND A%<>13:A$=A$+CHR$A%
  850 UNTILA%=10 OR A%=13 OR EOF#i%:=A$