dexpr//1
This commit is contained in:
parent
afea54bf08
commit
f201cd6bb3
|
|
@ -1,188 +1,189 @@
|
||||||
[word(0),
|
[word(0),
|
||||||
do_offset(A),
|
do_offset(A),
|
||||||
allocate(_, 20),
|
allocate(_, 20),
|
||||||
label(A),
|
label(A),
|
||||||
mov_imm(0, 0),
|
mov_imm(0, 0),
|
||||||
store_word(0, 0, 0),
|
store_word(0, 0, 0),
|
||||||
mov_imm(0, 4096),
|
mov_imm(0, 4096),
|
||||||
mov_imm(1, I1),
|
mov_imm(1, I1),
|
||||||
mov_imm(2, 0),
|
mov_imm(2, 0),
|
||||||
mov_imm(3, 0),
|
mov_imm(3, 0),
|
||||||
store_word(2, 0, 0),
|
store_word(2, 0, 0),
|
||||||
label(H),
|
label(H),
|
||||||
sub_imm(1, 1, 0),
|
sub_imm(1, 1, 0),
|
||||||
eq_offset(I),
|
eq_offset(I),
|
||||||
load_word(4, 1, 0),
|
load_word(4, 1, 0),
|
||||||
lsl_imm(5, 4, 2),
|
lsl_imm(5, 4, 2),
|
||||||
asr_imm(5, 5, 17),
|
asr_imm(5, 5, 17),
|
||||||
eq_offset(B),
|
eq_offset(B),
|
||||||
add(5, 5, 1),
|
add(5, 5, 1),
|
||||||
label(B),
|
label(B),
|
||||||
lsl_imm(6, 4, 17),
|
lsl_imm(6, 4, 17),
|
||||||
asr_imm(6, 6, 17),
|
asr_imm(6, 6, 17),
|
||||||
eq_offset(C),
|
eq_offset(C),
|
||||||
add(6, 6, 1),
|
add(6, 6, 1),
|
||||||
label(C),
|
label(C),
|
||||||
load_word(3, 5, 0),
|
load_word(3, 5, 0),
|
||||||
mov(1, 6),
|
mov(1, 6),
|
||||||
asr_imm(6, 3, 30),
|
asr_imm(6, 3, 30),
|
||||||
and_imm(6, 6, 2),
|
and_imm(6, 6, 2),
|
||||||
sub_imm(6, 6, 2),
|
sub_imm(6, 6, 2),
|
||||||
ne_offset(D),
|
ne_offset(D),
|
||||||
mov_imm_with_shift(6, 16383),
|
mov_imm_with_shift(6, 16383),
|
||||||
ior_imm(6, 6, 65535),
|
ior_imm(6, 6, 65535),
|
||||||
and(6, 6, 3),
|
and(6, 6, 3),
|
||||||
do(6),
|
do(6),
|
||||||
label(D),
|
label(D),
|
||||||
sub_imm(0, 0, 4),
|
sub_imm(0, 0, 4),
|
||||||
sub_imm(5, 5, 0),
|
sub_imm(5, 5, 0),
|
||||||
eq_offset(F),
|
eq_offset(F),
|
||||||
sub(2, 5, 0),
|
sub(2, 5, 0),
|
||||||
hi_offset(E),
|
hi_offset(E),
|
||||||
and_imm(2, 2, 32767),
|
and_imm(2, 2, 32767),
|
||||||
label(E),
|
label(E),
|
||||||
lsl_imm(2, 2, 15),
|
lsl_imm(2, 2, 15),
|
||||||
ior_imm(2, 2, 4),
|
ior_imm(2, 2, 4),
|
||||||
do_offset(G),
|
do_offset(G),
|
||||||
label(F),
|
label(F),
|
||||||
mov_imm(2, 4),
|
mov_imm(2, 4),
|
||||||
label(G),
|
label(G),
|
||||||
store_word(2, 0, 0),
|
store_word(2, 0, 0),
|
||||||
do_offset(H),
|
do_offset(H),
|
||||||
label(I),
|
label(I),
|
||||||
do_offset(I),
|
do_offset(I),
|
||||||
label(J),
|
label(J),
|
||||||
symbol(J),
|
symbol(J),
|
||||||
lsl_imm(6, 2, 2),
|
lsl_imm(6, 2, 2),
|
||||||
asr_imm(6, 6, 17),
|
asr_imm(6, 6, 17),
|
||||||
eq_offset(K),
|
eq_offset(K),
|
||||||
add(6, 6, 0),
|
add(6, 6, 0),
|
||||||
label(K),
|
label(K),
|
||||||
lsl_imm(2, 2, 17),
|
lsl_imm(2, 2, 17),
|
||||||
asr_imm(2, 2, 17),
|
asr_imm(2, 2, 17),
|
||||||
eq_offset(L),
|
eq_offset(L),
|
||||||
add(2, 2, 0),
|
add(2, 2, 0),
|
||||||
label(L),
|
label(L),
|
||||||
load_word(7, 2, 0),
|
load_word(7, 2, 0),
|
||||||
lsl_imm(8, 7, 2),
|
lsl_imm(8, 7, 2),
|
||||||
asr_imm(8, 8, 17),
|
asr_imm(8, 8, 17),
|
||||||
eq_offset(M),
|
eq_offset(M),
|
||||||
add(8, 8, 2),
|
add(8, 8, 2),
|
||||||
label(M),
|
label(M),
|
||||||
lsl_imm(9, 7, 17),
|
lsl_imm(9, 7, 17),
|
||||||
asr_imm(9, 9, 17),
|
asr_imm(9, 9, 17),
|
||||||
eq_offset(N),
|
eq_offset(N),
|
||||||
add(9, 9, 2),
|
add(9, 9, 2),
|
||||||
label(N),
|
label(N),
|
||||||
sub_imm(0, 0, 4),
|
sub_imm(0, 0, 4),
|
||||||
sub_imm(8, 8, 0),
|
sub_imm(8, 8, 0),
|
||||||
eq_offset(O),
|
eq_offset(O),
|
||||||
sub(8, 8, 0),
|
sub(8, 8, 0),
|
||||||
and_imm(8, 8, 32767),
|
and_imm(8, 8, 32767),
|
||||||
label(O),
|
label(O),
|
||||||
sub_imm(6, 6, 0),
|
sub_imm(6, 6, 0),
|
||||||
eq_offset(P),
|
eq_offset(P),
|
||||||
sub(6, 6, 0),
|
sub(6, 6, 0),
|
||||||
and_imm(6, 6, 32767),
|
and_imm(6, 6, 32767),
|
||||||
label(P),
|
label(P),
|
||||||
lsl_imm(8, 8, 15),
|
lsl_imm(8, 8, 15),
|
||||||
ior(8, 8, 6),
|
ior(8, 8, 6),
|
||||||
store_word(8, 0, 0),
|
store_word(8, 0, 0),
|
||||||
sub_imm(0, 0, 4),
|
sub_imm(0, 0, 4),
|
||||||
sub_imm(9, 9, 0),
|
sub_imm(9, 9, 0),
|
||||||
eq_offset(Q),
|
eq_offset(Q),
|
||||||
sub(9, 9, 0),
|
sub(9, 9, 0),
|
||||||
and_imm(9, 9, 32767),
|
and_imm(9, 9, 32767),
|
||||||
label(Q),
|
label(Q),
|
||||||
mov_imm_with_shift(2, 2),
|
mov_imm_with_shift(2, 2),
|
||||||
ior(2, 2, 9),
|
ior(2, 2, 9),
|
||||||
do_offset(G),
|
do_offset(G),
|
||||||
label(R),
|
label(R),
|
||||||
symbol(R),
|
symbol(R),
|
||||||
lsl_imm(5, 2, 2),
|
lsl_imm(5, 2, 2),
|
||||||
asr_imm(5, 5, 17),
|
asr_imm(5, 5, 17),
|
||||||
do_offset(D),
|
do_offset(D),
|
||||||
label(S),
|
label(S),
|
||||||
symbol(S),
|
symbol(S),
|
||||||
lsl_imm(6, 2, 2),
|
lsl_imm(6, 2, 2),
|
||||||
asr_imm(6, 6, 17),
|
asr_imm(6, 6, 17),
|
||||||
eq_offset(T),
|
eq_offset(T),
|
||||||
add(6, 6, 0),
|
add(6, 6, 0),
|
||||||
label(T),
|
label(T),
|
||||||
lsl_imm(2, 2, 17),
|
lsl_imm(2, 2, 17),
|
||||||
asr_imm(2, 2, 17),
|
asr_imm(2, 2, 17),
|
||||||
eq_offset(U),
|
eq_offset(U),
|
||||||
add(2, 2, 0),
|
add(2, 2, 0),
|
||||||
label(U),
|
label(U),
|
||||||
sub_imm(6, 6, 0),
|
sub_imm(6, 6, 0),
|
||||||
eq_offset(D1),
|
eq_offset(D1),
|
||||||
sub_imm(10, 0, 4),
|
sub_imm(10, 0, 4),
|
||||||
mov_imm(9, 4),
|
mov_imm(9, 4),
|
||||||
label(B1),
|
label(B1),
|
||||||
load_word(3, 6, 0),
|
load_word(3, 6, 0),
|
||||||
lsl_imm(7, 3, 2),
|
lsl_imm(7, 3, 2),
|
||||||
asr_imm(7, 7, 17),
|
asr_imm(7, 7, 17),
|
||||||
eq_offset(V),
|
eq_offset(V),
|
||||||
add(7, 7, 6),
|
add(7, 7, 6),
|
||||||
label(V),
|
label(V),
|
||||||
lsl_imm(8, 3, 17),
|
lsl_imm(8, 3, 17),
|
||||||
asr_imm(8, 8, 17),
|
asr_imm(8, 8, 17),
|
||||||
eq_offset(W),
|
eq_offset(W),
|
||||||
add(8, 8, 6),
|
add(8, 8, 6),
|
||||||
label(W),
|
label(W),
|
||||||
mov(6, 8),
|
mov(6, 8),
|
||||||
sub_imm(0, 0, 4),
|
sub_imm(0, 0, 4),
|
||||||
sub_imm(8, 8, 0),
|
sub_imm(8, 8, 0),
|
||||||
eq_offset(X),
|
eq_offset(X),
|
||||||
lsl_imm(7, 7, 15),
|
lsl_imm(7, 7, 15),
|
||||||
ior(7, 7, 9),
|
ior(7, 7, 9),
|
||||||
store_word(7, 0, 0),
|
store_word(7, 0, 0),
|
||||||
do_offset(A1),
|
do_offset(A1),
|
||||||
label(X),
|
label(X),
|
||||||
sub_imm(7, 7, 0),
|
sub_imm(7, 7, 0),
|
||||||
eq_offset(Y),
|
eq_offset(Y),
|
||||||
sub(7, 7, 0),
|
sub(7, 7, 0),
|
||||||
and_imm(7, 7, 32767),
|
and_imm(7, 7, 32767),
|
||||||
label(Y),
|
label(Y),
|
||||||
sub_imm(1, 1, 0),
|
sub_imm(1, 1, 0),
|
||||||
eq_offset(Z),
|
eq_offset(Z),
|
||||||
sub(1, 1, 0),
|
sub(1, 1, 0),
|
||||||
and_imm(1, 1, 32767),
|
and_imm(1, 1, 32767),
|
||||||
label(Z),
|
label(Z),
|
||||||
lsl_imm(7, 7, 15),
|
lsl_imm(7, 7, 15),
|
||||||
ior(7, 7, 1),
|
ior(7, 7, 1),
|
||||||
store_word(7, 0, 0),
|
store_word(7, 0, 0),
|
||||||
label(A1),
|
label(A1),
|
||||||
sub_imm(6, 6, 0),
|
sub_imm(6, 6, 0),
|
||||||
eq_offset(C1),
|
eq_offset(C1),
|
||||||
do_offset(B1),
|
do_offset(B1),
|
||||||
label(C1),
|
label(C1),
|
||||||
mov(1, 10),
|
mov(1, 10),
|
||||||
label(D1),
|
label(D1),
|
||||||
load_word(7, 2, 0),
|
load_word(7, 2, 0),
|
||||||
lsl_imm(6, 7, 2),
|
lsl_imm(6, 7, 2),
|
||||||
asr_imm(6, 6, 17),
|
asr_imm(6, 6, 17),
|
||||||
eq_offset(E1),
|
eq_offset(E1),
|
||||||
add(6, 6, 2),
|
add(6, 6, 2),
|
||||||
label(E1),
|
label(E1),
|
||||||
lsl_imm(7, 7, 17),
|
lsl_imm(7, 7, 17),
|
||||||
asr_imm(7, 7, 17),
|
asr_imm(7, 7, 17),
|
||||||
eq_offset(F1),
|
eq_offset(F1),
|
||||||
add(7, 7, 2),
|
add(7, 7, 2),
|
||||||
label(F1),
|
label(F1),
|
||||||
sub_imm(0, 0, 4),
|
sub_imm(0, 0, 4),
|
||||||
sub_imm(6, 6, 0),
|
sub_imm(6, 6, 0),
|
||||||
eq_offset(G1),
|
eq_offset(G1),
|
||||||
sub(6, 6, 0),
|
sub(6, 6, 0),
|
||||||
and_imm(6, 6, 32767),
|
and_imm(6, 6, 32767),
|
||||||
label(G1),
|
label(G1),
|
||||||
sub_imm(7, 7, 0),
|
sub_imm(7, 7, 0),
|
||||||
eq_offset(H1),
|
eq_offset(H1),
|
||||||
sub(7, 7, 0),
|
sub(7, 7, 0),
|
||||||
and_imm(7, 7, 32767),
|
and_imm(7, 7, 32767),
|
||||||
label(H1),
|
label(H1),
|
||||||
lsl_imm(6, 6, 15),
|
lsl_imm(6, 6, 15),
|
||||||
ior(6, 6, 7),
|
ior(6, 6, 7),
|
||||||
store_word(6, 0, 0),
|
store_word(6, 0, 0),
|
||||||
label(I1),
|
label(I1),
|
||||||
expr_cell(R, 0)].
|
expr_cell(R, 4),
|
||||||
|
expr_cell(S, 0)].
|
||||||
|
|
@ -157,15 +157,13 @@ Mark II
|
||||||
incr(SP),
|
incr(SP),
|
||||||
sub_base_from_offset(TEMP0, SP),
|
sub_base_from_offset(TEMP0, SP),
|
||||||
sub_base_from_offset(TEMP1, SP),
|
sub_base_from_offset(TEMP1, SP),
|
||||||
merge_and_store(TEMP0, TEMP1, SP)
|
merge_and_store(TEMP0, TEMP1, SP),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% ======================================
|
|
||||||
]),[
|
% ======================================
|
||||||
label(Expression),
|
label(Expression)
|
||||||
expr_cell(Dup, 0)
|
]),
|
||||||
].
|
dexpr([Dup, I]).
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -262,11 +260,9 @@ language.
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
The add_label/3 relation is a meta-logical construct that accepts a comparision
|
The add_label/3 relation is a meta-logical construct that accepts a comparision
|
||||||
predicate (e.g. if_zero/2) and "patches" it by adding the Label logic variable
|
predicate (e.g. if_zero/2) and "patches" it by adding the Label logic variable
|
||||||
to the end.
|
to the end.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
add_label(CmpIn, Label, CmpOut) :-
|
add_label(CmpIn, Label, CmpOut) :-
|
||||||
|
|
@ -275,6 +271,18 @@ add_label(CmpIn, Label, CmpOut) :-
|
||||||
CmpOut =.. G.
|
CmpOut =.. G.
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
The dexpr//1 DCG establishes a sequence of labeled expr_cell/2 pseudo-assembly
|
||||||
|
memory locations as a linked list that encodes a Prolog list of Joy function
|
||||||
|
labels comprising e.g. the body of some Joy definition.
|
||||||
|
*/
|
||||||
|
% This is simpler now that link offsets are just 4.
|
||||||
|
|
||||||
|
dexpr([]) --> !, [].
|
||||||
|
dexpr([Func]) --> !, [expr_cell(Func, 0)].
|
||||||
|
dexpr([Func|Rest]) --> !, [expr_cell(Func, 4)], dexpr(Rest).
|
||||||
|
|
||||||
|
|
||||||
do :-
|
do :-
|
||||||
compile_program(Binary),
|
compile_program(Binary),
|
||||||
write_binary('joy_asmii.bin', Binary).
|
write_binary('joy_asmii.bin', Binary).
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
s = ''''''
|
||||||
|
s = s.splitlines()
|
||||||
|
s = ' '.join(s)
|
||||||
|
s = s.replace('), ', '),\n')
|
||||||
|
with open('thun/asm-dump.txt', 'wb') as f:
|
||||||
|
f.write(s)
|
||||||
Binary file not shown.
Loading…
Reference in New Issue