OSDN Git Service

dexpr//1
authorSimon Forman <sforman@hushmail.com>
Tue, 12 Nov 2019 17:02:19 +0000 (09:02 -0800)
committerSimon Forman <sforman@hushmail.com>
Tue, 12 Nov 2019 17:02:19 +0000 (09:02 -0800)
thun/asm-dump.txt
thun/compiler.markII.pl
thun/dump-asm.py [new file with mode: 0644]
thun/joy_asmii.bin

index c9a85ca..150cfaa 100644 (file)
-[word(0),\r
-do_offset(A),\r
-allocate(_, 20),\r
-label(A),\r
-mov_imm(0, 0),\r
-store_word(0, 0, 0),\r
-mov_imm(0, 4096),\r
-mov_imm(1, I1),\r
-mov_imm(2, 0),\r
-mov_imm(3, 0),\r
-store_word(2, 0, 0),\r
-label(H),\r
-sub_imm(1, 1, 0),\r
-eq_offset(I),\r
-load_word(4, 1, 0),\r
-lsl_imm(5, 4, 2),\r
-asr_imm(5, 5, 17),\r
-eq_offset(B),\r
-add(5, 5, 1),\r
-label(B),\r
-lsl_imm(6, 4, 17),\r
-asr_imm(6, 6, 17),\r
-eq_offset(C),\r
-add(6, 6, 1),\r
-label(C),\r
-load_word(3, 5, 0),\r
-mov(1, 6),\r
-asr_imm(6, 3, 30),\r
-and_imm(6, 6, 2),\r
-sub_imm(6, 6, 2),\r
-ne_offset(D),\r
-mov_imm_with_shift(6, 16383),\r
-ior_imm(6, 6, 65535),\r
-and(6, 6, 3),\r
-do(6),\r
-label(D),\r
-sub_imm(0, 0, 4),\r
-sub_imm(5, 5, 0),\r
-eq_offset(F),\r
-sub(2, 5, 0),\r
-hi_offset(E),\r
-and_imm(2, 2, 32767),\r
-label(E),\r
-lsl_imm(2, 2, 15),\r
-ior_imm(2, 2, 4),\r
-do_offset(G),\r
-label(F),\r
-mov_imm(2, 4),\r
-label(G),\r
-store_word(2, 0, 0),\r
-do_offset(H),\r
-label(I),\r
-do_offset(I),\r
-label(J),\r
-symbol(J),\r
-lsl_imm(6, 2, 2),\r
-asr_imm(6, 6, 17),\r
-eq_offset(K),\r
-add(6, 6, 0),\r
-label(K),\r
-lsl_imm(2, 2, 17),\r
-asr_imm(2, 2, 17),\r
-eq_offset(L),\r
-add(2, 2, 0),\r
-label(L),\r
-load_word(7, 2, 0),\r
-lsl_imm(8, 7, 2),\r
-asr_imm(8, 8, 17),\r
-eq_offset(M),\r
-add(8, 8, 2),\r
-label(M),\r
-lsl_imm(9, 7, 17),\r
-asr_imm(9, 9, 17),\r
-eq_offset(N),\r
-add(9, 9, 2),\r
-label(N),\r
-sub_imm(0, 0, 4),\r
-sub_imm(8, 8, 0),\r
-eq_offset(O),\r
-sub(8, 8, 0),\r
-and_imm(8, 8, 32767),\r
-label(O),\r
-sub_imm(6, 6, 0),\r
-eq_offset(P),\r
-sub(6, 6, 0),\r
-and_imm(6, 6, 32767),\r
-label(P),\r
-lsl_imm(8, 8, 15),\r
-ior(8, 8, 6),\r
-store_word(8, 0, 0),\r
-sub_imm(0, 0, 4),\r
-sub_imm(9, 9, 0),\r
-eq_offset(Q),\r
-sub(9, 9, 0),\r
-and_imm(9, 9, 32767),\r
-label(Q),\r
-mov_imm_with_shift(2, 2),\r
-ior(2, 2, 9),\r
-do_offset(G),\r
-label(R),\r
-symbol(R),\r
-lsl_imm(5, 2, 2),\r
-asr_imm(5, 5, 17),\r
-do_offset(D),\r
-label(S),\r
-symbol(S),\r
-lsl_imm(6, 2, 2),\r
-asr_imm(6, 6, 17),\r
-eq_offset(T),\r
-add(6, 6, 0),\r
-label(T),\r
-lsl_imm(2, 2, 17),\r
-asr_imm(2, 2, 17),\r
-eq_offset(U),\r
-add(2, 2, 0),\r
-label(U),\r
-sub_imm(6, 6, 0),\r
-eq_offset(D1),\r
-sub_imm(10, 0, 4),\r
-mov_imm(9, 4),\r
-label(B1),\r
-load_word(3, 6, 0),\r
-lsl_imm(7, 3, 2),\r
-asr_imm(7, 7, 17),\r
-eq_offset(V),\r
-add(7, 7, 6),\r
-label(V),\r
-lsl_imm(8, 3, 17),\r
-asr_imm(8, 8, 17),\r
-eq_offset(W),\r
-add(8, 8, 6),\r
-label(W),\r
-mov(6, 8),\r
-sub_imm(0, 0, 4),\r
-sub_imm(8, 8, 0),\r
-eq_offset(X),\r
-lsl_imm(7, 7, 15),\r
-ior(7, 7, 9),\r
-store_word(7, 0, 0),\r
-do_offset(A1),\r
-label(X),\r
-sub_imm(7, 7, 0),\r
-eq_offset(Y),\r
-sub(7, 7, 0),\r
-and_imm(7, 7, 32767),\r
-label(Y),\r
-sub_imm(1, 1, 0),\r
-eq_offset(Z),\r
-sub(1, 1, 0),\r
-and_imm(1, 1, 32767),\r
-label(Z),\r
-lsl_imm(7, 7, 15),\r
-ior(7, 7, 1),\r
-store_word(7, 0, 0),\r
-label(A1),\r
-sub_imm(6, 6, 0),\r
-eq_offset(C1),\r
-do_offset(B1),\r
-label(C1),\r
-mov(1, 10),\r
-label(D1),\r
-load_word(7, 2, 0),\r
-lsl_imm(6, 7, 2),\r
-asr_imm(6, 6, 17),\r
-eq_offset(E1),\r
-add(6, 6, 2),\r
-label(E1),\r
-lsl_imm(7, 7, 17),\r
-asr_imm(7, 7, 17),\r
-eq_offset(F1),\r
-add(7, 7, 2),\r
-label(F1),\r
-sub_imm(0, 0, 4),\r
-sub_imm(6, 6, 0),\r
-eq_offset(G1),\r
-sub(6, 6, 0),\r
-and_imm(6, 6, 32767),\r
-label(G1),\r
-sub_imm(7, 7, 0),\r
-eq_offset(H1),\r
-sub(7, 7, 0),\r
-and_imm(7, 7, 32767),\r
-label(H1),\r
-lsl_imm(6, 6, 15),\r
-ior(6, 6, 7),\r
-store_word(6, 0, 0),\r
-label(I1),\r
-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
index 02fef20..be9be7d 100644 (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).
diff --git a/thun/dump-asm.py b/thun/dump-asm.py
new file mode 100644 (file)
index 0000000..8c0eda6
--- /dev/null
@@ -0,0 +1,6 @@
+s = ''''''\r
+s = s.splitlines()\r
+s = ' '.join(s)\r
+s = s.replace('), ', '),\n')\r
+with open('thun/asm-dump.txt', 'wb') as f:\r
+    f.write(s)
\ No newline at end of file
index 07f8a72..a9b23b8 100644 (file)
Binary files a/thun/joy_asmii.bin and b/thun/joy_asmii.bin differ