From f201cd6bb369423b425ad127094dd9c07800ab3d Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Tue, 12 Nov 2019 09:02:19 -0800 Subject: [PATCH] dexpr//1 --- thun/asm-dump.txt | 377 ++++++++++++++++++++-------------------- thun/compiler.markII.pl | 28 +-- thun/dump-asm.py | 6 + thun/joy_asmii.bin | Bin 640 -> 644 bytes 4 files changed, 213 insertions(+), 198 deletions(-) create mode 100644 thun/dump-asm.py diff --git a/thun/asm-dump.txt b/thun/asm-dump.txt index c9a85ca..150cfaa 100644 --- a/thun/asm-dump.txt +++ b/thun/asm-dump.txt @@ -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)]. \ No newline at end of file +[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)]. \ No newline at end of file diff --git a/thun/compiler.markII.pl b/thun/compiler.markII.pl index 02fef20..be9be7d 100644 --- a/thun/compiler.markII.pl +++ b/thun/compiler.markII.pl @@ -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). diff --git a/thun/dump-asm.py b/thun/dump-asm.py new file mode 100644 index 0000000..8c0eda6 --- /dev/null +++ b/thun/dump-asm.py @@ -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) \ No newline at end of file diff --git a/thun/joy_asmii.bin b/thun/joy_asmii.bin index 07f8a72b3884e8b0d0f4257e15250c49ba2ffe3d..a9b23b8c0b20bbc129d4a334d348d9c24a20fd1e 100644 GIT binary patch delta 23 ccmZo*ZDD1s*vMGU#KXc+@}GgB3WymP07%FMuK)l5 delta 19 YcmZo+ZD3_A*~nPV#KFK&@}B_+057EkDgXcg