10
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$