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),
do_offset(A),
allocate(_, 20),
label(A),
mov_imm(0, 0),
store_word(0, 0, 0),
mov_imm(0, 4096),
mov_imm(1, I1),
mov_imm(2, 0),
mov_imm(3, 0),
store_word(2, 0, 0),
label(H),
sub_imm(1, 1, 0),
eq_offset(I),
load_word(4, 1, 0),
lsl_imm(5, 4, 2),
asr_imm(5, 5, 17),
eq_offset(B),
add(5, 5, 1),
label(B),
lsl_imm(6, 4, 17),
asr_imm(6, 6, 17),
eq_offset(C),
add(6, 6, 1),
label(C),
load_word(3, 5, 0),
mov(1, 6),
asr_imm(6, 3, 30),
and_imm(6, 6, 2),
sub_imm(6, 6, 2),
ne_offset(D),
mov_imm_with_shift(6, 16383),
ior_imm(6, 6, 65535),
and(6, 6, 3),
do(6),
label(D),
sub_imm(0, 0, 4),
sub_imm(5, 5, 0),
eq_offset(F),
sub(2, 5, 0),
hi_offset(E),
and_imm(2, 2, 32767),
label(E),
lsl_imm(2, 2, 15),
ior_imm(2, 2, 4),
do_offset(G),
label(F),
mov_imm(2, 4),
label(G),
store_word(2, 0, 0),
do_offset(H),
label(I),
do_offset(I),
label(J),
symbol(J),
lsl_imm(6, 2, 2),
asr_imm(6, 6, 17),
eq_offset(K),
add(6, 6, 0),
label(K),
lsl_imm(2, 2, 17),
asr_imm(2, 2, 17),
eq_offset(L),
add(2, 2, 0),
label(L),
load_word(7, 2, 0),
lsl_imm(8, 7, 2),
asr_imm(8, 8, 17),
eq_offset(M),
add(8, 8, 2),
label(M),
lsl_imm(9, 7, 17),
asr_imm(9, 9, 17),
eq_offset(N),
add(9, 9, 2),
label(N),
sub_imm(0, 0, 4),
sub_imm(8, 8, 0),
eq_offset(O),
sub(8, 8, 0),
and_imm(8, 8, 32767),
label(O),
sub_imm(6, 6, 0),
eq_offset(P),
sub(6, 6, 0),
and_imm(6, 6, 32767),
label(P),
lsl_imm(8, 8, 15),
ior(8, 8, 6),
store_word(8, 0, 0),
sub_imm(0, 0, 4),
sub_imm(9, 9, 0),
eq_offset(Q),
sub(9, 9, 0),
and_imm(9, 9, 32767),
label(Q),
mov_imm_with_shift(2, 2),
ior(2, 2, 9),
do_offset(G),
label(R),
symbol(R),
lsl_imm(5, 2, 2),
asr_imm(5, 5, 17),
do_offset(D),
label(S),
symbol(S),
lsl_imm(6, 2, 2),
asr_imm(6, 6, 17),
eq_offset(T),
add(6, 6, 0),
label(T),
lsl_imm(2, 2, 17),
asr_imm(2, 2, 17),
eq_offset(U),
add(2, 2, 0),
label(U),
sub_imm(6, 6, 0),
eq_offset(D1),
sub_imm(10, 0, 4),
mov_imm(9, 4),
label(B1),
load_word(3, 6, 0),
lsl_imm(7, 3, 2),
asr_imm(7, 7, 17),
eq_offset(V),
add(7, 7, 6),
label(V),
lsl_imm(8, 3, 17),
asr_imm(8, 8, 17),
eq_offset(W),
add(8, 8, 6),
label(W),
mov(6, 8),
sub_imm(0, 0, 4),
sub_imm(8, 8, 0),
eq_offset(X),
lsl_imm(7, 7, 15),
ior(7, 7, 9),
store_word(7, 0, 0),
do_offset(A1),
label(X),
sub_imm(7, 7, 0),
eq_offset(Y),
sub(7, 7, 0),
and_imm(7, 7, 32767),
label(Y),
sub_imm(1, 1, 0),
eq_offset(Z),
sub(1, 1, 0),
and_imm(1, 1, 32767),
label(Z),
lsl_imm(7, 7, 15),
ior(7, 7, 1),
store_word(7, 0, 0),
label(A1),
sub_imm(6, 6, 0),
eq_offset(C1),
do_offset(B1),
label(C1),
mov(1, 10),
label(D1),
load_word(7, 2, 0),
lsl_imm(6, 7, 2),
asr_imm(6, 6, 17),
eq_offset(E1),
add(6, 6, 2),
label(E1),
lsl_imm(7, 7, 17),
asr_imm(7, 7, 17),
eq_offset(F1),
add(7, 7, 2),
label(F1),
sub_imm(0, 0, 4),
sub_imm(6, 6, 0),
eq_offset(G1),
sub(6, 6, 0),
and_imm(6, 6, 32767),
label(G1),
sub_imm(7, 7, 0),
eq_offset(H1),
sub(7, 7, 0),
and_imm(7, 7, 32767),
label(H1),
lsl_imm(6, 6, 15),
ior(6, 6, 7),
store_word(6, 0, 0),
label(I1),
expr_cell(R, 0)].
[word(0),
do_offset(A),
allocate(_, 20),
label(A),
mov_imm(0, 0),
store_word(0, 0, 0),
mov_imm(0, 4096),
mov_imm(1, I1),
mov_imm(2, 0),
mov_imm(3, 0),
store_word(2, 0, 0),
label(H),
sub_imm(1, 1, 0),
eq_offset(I),
load_word(4, 1, 0),
lsl_imm(5, 4, 2),
asr_imm(5, 5, 17),
eq_offset(B),
add(5, 5, 1),
label(B),
lsl_imm(6, 4, 17),
asr_imm(6, 6, 17),
eq_offset(C),
add(6, 6, 1),
label(C),
load_word(3, 5, 0),
mov(1, 6),
asr_imm(6, 3, 30),
and_imm(6, 6, 2),
sub_imm(6, 6, 2),
ne_offset(D),
mov_imm_with_shift(6, 16383),
ior_imm(6, 6, 65535),
and(6, 6, 3),
do(6),
label(D),
sub_imm(0, 0, 4),
sub_imm(5, 5, 0),
eq_offset(F),
sub(2, 5, 0),
hi_offset(E),
and_imm(2, 2, 32767),
label(E),
lsl_imm(2, 2, 15),
ior_imm(2, 2, 4),
do_offset(G),
label(F),
mov_imm(2, 4),
label(G),
store_word(2, 0, 0),
do_offset(H),
label(I),
do_offset(I),
label(J),
symbol(J),
lsl_imm(6, 2, 2),
asr_imm(6, 6, 17),
eq_offset(K),
add(6, 6, 0),
label(K),
lsl_imm(2, 2, 17),
asr_imm(2, 2, 17),
eq_offset(L),
add(2, 2, 0),
label(L),
load_word(7, 2, 0),
lsl_imm(8, 7, 2),
asr_imm(8, 8, 17),
eq_offset(M),
add(8, 8, 2),
label(M),
lsl_imm(9, 7, 17),
asr_imm(9, 9, 17),
eq_offset(N),
add(9, 9, 2),
label(N),
sub_imm(0, 0, 4),
sub_imm(8, 8, 0),
eq_offset(O),
sub(8, 8, 0),
and_imm(8, 8, 32767),
label(O),
sub_imm(6, 6, 0),
eq_offset(P),
sub(6, 6, 0),
and_imm(6, 6, 32767),
label(P),
lsl_imm(8, 8, 15),
ior(8, 8, 6),
store_word(8, 0, 0),
sub_imm(0, 0, 4),
sub_imm(9, 9, 0),
eq_offset(Q),
sub(9, 9, 0),
and_imm(9, 9, 32767),
label(Q),
mov_imm_with_shift(2, 2),
ior(2, 2, 9),
do_offset(G),
label(R),
symbol(R),
lsl_imm(5, 2, 2),
asr_imm(5, 5, 17),
do_offset(D),
label(S),
symbol(S),
lsl_imm(6, 2, 2),
asr_imm(6, 6, 17),
eq_offset(T),
add(6, 6, 0),
label(T),
lsl_imm(2, 2, 17),
asr_imm(2, 2, 17),
eq_offset(U),
add(2, 2, 0),
label(U),
sub_imm(6, 6, 0),
eq_offset(D1),
sub_imm(10, 0, 4),
mov_imm(9, 4),
label(B1),
load_word(3, 6, 0),
lsl_imm(7, 3, 2),
asr_imm(7, 7, 17),
eq_offset(V),
add(7, 7, 6),
label(V),
lsl_imm(8, 3, 17),
asr_imm(8, 8, 17),
eq_offset(W),
add(8, 8, 6),
label(W),
mov(6, 8),
sub_imm(0, 0, 4),
sub_imm(8, 8, 0),
eq_offset(X),
lsl_imm(7, 7, 15),
ior(7, 7, 9),
store_word(7, 0, 0),
do_offset(A1),
label(X),
sub_imm(7, 7, 0),
eq_offset(Y),
sub(7, 7, 0),
and_imm(7, 7, 32767),
label(Y),
sub_imm(1, 1, 0),
eq_offset(Z),
sub(1, 1, 0),
and_imm(1, 1, 32767),
label(Z),
lsl_imm(7, 7, 15),
ior(7, 7, 1),
store_word(7, 0, 0),
label(A1),
sub_imm(6, 6, 0),
eq_offset(C1),
do_offset(B1),
label(C1),
mov(1, 10),
label(D1),
load_word(7, 2, 0),
lsl_imm(6, 7, 2),
asr_imm(6, 6, 17),
eq_offset(E1),
add(6, 6, 2),
label(E1),
lsl_imm(7, 7, 17),
asr_imm(7, 7, 17),
eq_offset(F1),
add(7, 7, 2),
label(F1),
sub_imm(0, 0, 4),
sub_imm(6, 6, 0),
eq_offset(G1),
sub(6, 6, 0),
and_imm(6, 6, 32767),
label(G1),
sub_imm(7, 7, 0),
eq_offset(H1),
sub(7, 7, 0),
and_imm(7, 7, 32767),
label(H1),
lsl_imm(6, 6, 15),
ior(6, 6, 7),
store_word(6, 0, 0),
label(I1),
expr_cell(R, 4),
expr_cell(S, 0)].

View File

@ -157,15 +157,13 @@ Mark II
incr(SP),
sub_base_from_offset(TEMP0, SP),
sub_base_from_offset(TEMP1, SP),
merge_and_store(TEMP0, TEMP1, SP)
merge_and_store(TEMP0, TEMP1, SP),
% ======================================
]),[
label(Expression),
expr_cell(Dup, 0)
].
% ======================================
label(Expression)
]),
dexpr([Dup, I]).
/*
@ -262,11 +260,9 @@ language.
/*
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
to the end.
*/
add_label(CmpIn, Label, CmpOut) :-
@ -275,6 +271,18 @@ add_label(CmpIn, Label, CmpOut) :-
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 :-
compile_program(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.