Mercurial > hg > Applications > Tokio
diff Examples/6502/run.tokio @ 0:cfb7c6b24319
Initial revision
author | kono |
---|---|
date | Thu, 30 Aug 2007 14:57:44 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Examples/6502/run.tokio Thu Aug 30 14:57:44 2007 +0900 @@ -0,0 +1,91 @@ +/* + + 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). +