/* read intel hex data from file :10000000D8A201A00120090000E000D003C8986038 :10001000C000D006CAA0014C09008A488820090007 :05002000A868AACA60F7 :00000001FF write into internal memory. (assert ) */ run0(Filename) :- fname(Filename,".hex",Filename1), ld0(Filename1),!, *p := 0, *reset := 0, *s := 0, *b := 0, *so := 0, *y := 0, *x := 0, *dl := 0, *a := 0, *c := 0, *z := 0, *mem(hex("FFFC")) := 0, *mem(hex("FFFD")) := 0, *mem(hex("FFFE")) := 0, *mem(hex("FFFF")) := 0 && run. run(Filename) :- fname(Filename,".hex",Filename1), ld0(Filename1),!, *p := 0, *reset := 0, *s := 0, *b := 0, *so := 0, *y := 0, *x := 0, *dl := 0, *a := 0, *c := 0, *z := 0, *mem(hex("FFFC")) := 0, *mem(hex("FFFD")) := 0, *mem(hex("FFFE")) := 0, *mem(hex("FFFF")) := 0 && X <- cputime, run, fin(( X1 = cputime - X,nl,write(X1),nl)). fname(Output,Option,Loutput) :- name(Output,L),append(L,Option,LC),name(Loutput,LC). append([H|X],Y,[H|Z]) :- append(X,Y,Z). append([],X,X) . ld0(File) :- seeing(O),ld1(File,Lines),seen,see(O). ld1(File,Lines) :- % abolish(mem,2), see(File), % nofileerrors, get0(Ch),lines(Ch),!,seen. ld1(File,Lines) :- seen, % fileerrors, !,fail. lines(-1) :-!. lines(26) :-!. lines(58) :- !, get0(C), count(N,[C|N],1,I), get0(C0), count(N1,[C0|N1],3,Adr0), get0(C1), count(N2,[C1|N2],1,Adr1), Adr = Adr1*65536+Adr0+I, data(I,Adr), get0(NNC), lines(NNC). lines(X) :- get0(C),lines(C). count([],NC,0,I) :-!, hex(NC,I). count([H|T],NC,N,I) :- N1 = N-1, get0(H), count(T,NC,N1,I). hex(L,V) :- hex(L,V,0). hex([],V,V) :-!. hex([H|T],Y,V) :- H>47,H<58, !,V1 = V*16+H-48,hex(T,Y,V1). hex([H|T],Y,V) :- H>64,H<71, !,V1 = V*16+H-65+10,hex(T,Y,V1). hex([H|T],Y,V) :- H>96,H<103,!,V1 = V*16+H-97+10,hex(T,Y,V1). data(0,_) :-!. data(N,Adr) :- get0(C),count(T,[C|T],1,Data), Adr1 = Adr-N, % assert(mem(Adr1,Data)), *mem(Adr1) := Data, N1 = N-1, data(N1,Adr).