This commit is contained in:
Simon Forman 2019-11-12 09:02:19 -08:00
parent afea54bf08
commit f201cd6bb3
4 changed files with 213 additions and 198 deletions

View File

@ -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)].

View File

@ -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).

6
thun/dump-asm.py Normal file
View File

@ -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.