From 851f212fb219f213eae16d1ee5f165d082e480c3 Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Tue, 12 Nov 2019 16:09:13 -0800 Subject: [PATCH] "swap" word. --- thun/asm-dump.txt | 56 +++++++++++++++++++++++++++++++++++++++- thun/compiler.markII.pl | 17 +++++++++++- thun/joy_asmii.bin | Bin 668 -> 848 bytes thun/markII.rst | 11 ++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) diff --git a/thun/asm-dump.txt b/thun/asm-dump.txt index cd7d796..794d706 100644 --- a/thun/asm-dump.txt +++ b/thun/asm-dump.txt @@ -5,7 +5,7 @@ label(A), mov_imm(0, 0), store_word(0, 0, 0), mov_imm(0, 4096), -mov_imm(1, J1), +mov_imm(1, S1), mov_imm(2, 0), mov_imm(3, 0), store_word(2, 0, 0), @@ -190,7 +190,61 @@ symbol(I1), mov_imm(5, 0), do_offset(D), label(J1), +symbol(J1), +lsl_imm(6, 2, 2), +asr_imm(6, 6, 17), +eq_offset(K1), +add(6, 6, 0), +label(K1), +lsl_imm(7, 2, 17), +asr_imm(7, 7, 17), +eq_offset(L1), +add(7, 7, 0), +label(L1), +load_word(8, 7, 0), +lsl_imm(9, 2, 2), +asr_imm(9, 9, 17), +eq_offset(M1), +add(9, 9, 0), +label(M1), +lsl_imm(10, 2, 17), +asr_imm(10, 10, 17), +eq_offset(N1), +add(10, 10, 0), +label(N1), +sub_imm(0, 0, 4), +sub_imm(6, 6, 0), +eq_offset(O1), +sub(6, 6, 0), +and_imm(6, 6, 32767), +label(O1), +sub_imm(10, 10, 0), +eq_offset(P1), +sub(10, 10, 0), +and_imm(10, 10, 32767), +label(P1), +lsl_imm(6, 6, 15), +ior(6, 6, 10), +store_word(6, 0, 0), +mov_imm(6, 4), +sub_imm(0, 0, 4), +sub_imm(9, 9, 0), +eq_offset(Q1), +sub(9, 9, 0), +and_imm(9, 9, 32767), +label(Q1), +sub_imm(6, 6, 0), +eq_offset(R1), +sub(6, 6, 0), +and_imm(6, 6, 32767), +label(R1), +lsl_imm(9, 9, 15), +ior(9, 9, 6), +store_word(9, 0, 0), +do_offset(H), +label(S1), expr_cell(I1, 4), expr_cell(R, 4), +expr_cell(J1, 4), expr_cell(J, 4), expr_cell(S, 0)]. \ No newline at end of file diff --git a/thun/compiler.markII.pl b/thun/compiler.markII.pl index e7e7221..39e3bf9 100644 --- a/thun/compiler.markII.pl +++ b/thun/compiler.markII.pl @@ -153,9 +153,24 @@ Mark II asm(mov_imm(TermAddr, 0)), % Rely on push machinery. jump(PUSH), + definition(Swap), % ====================================== + unpack_pair(TOS, TEMP0, TEMP1, SP), + % TEMP0 = Address of the first item on the stack. + % TEMP1 = Address of the stack tail. + load(TEMP2, TEMP1), % TEMP1 contains the record of the second stack cell. + unpack_pair(TOS, TEMP3, TEMP4, SP), + % TEMP3 = Address of the second item on the stack. + % TEMP4 = Address of the stack tail. + incr(SP), + sub_base_merge_and_store(TEMP0, TEMP4, SP), % Push first item onto stack. + asm(mov_imm(TEMP0, 4)), % Used for linking to previous cell. + incr(SP), + sub_base_merge_and_store(TEMP3, TEMP0, SP), % Push first item onto stack. + jump(Main), + % ====================================== label(Expression), - dexpr([New, Dup, Cons, I]) + dexpr([New, Dup, Swap, Cons, I]) ]). diff --git a/thun/joy_asmii.bin b/thun/joy_asmii.bin index 3dbcebc44717b9eb2fe5af839ae7ede7d57d5db8..5e85ec7f1d7740b4d23c7bea72ed3d712f97d15e 100644 GIT binary patch delta 230 zcmZ9GF%AJy7=%A-J=u+fC!%))Q7Hv^vU>nM5up>6ZWRhG5>Y5bHeyRxZ~|9QxrOJC zO%(oQikW|AGRNFQmAYAemxI?vR|~X6I#Hrk&)yn+Ct5iy9co51G#PlpL}_Y0&AgZL zMIL5r@dTP}kZK1{JfY?sru^!=cv3wz&bMQ#Y&0^Egegya8^vLff$rxiPg8LgPR(^Z{9W^lv delta 62 zcmcb>HiuPU0uuuqure?_pC~BC!{7iETEHN{;LyOd(I|{bgoWYPe-?%;AeQ;hz>o*T G3=9BXa}2=% diff --git a/thun/markII.rst b/thun/markII.rst index f6d5a02..92c496e 100644 --- a/thun/markII.rst +++ b/thun/markII.rst @@ -386,8 +386,19 @@ the library code. ペ, write_cell(TOS, SP) +------------------------------------------ + [ナ,ズ,セ,ネ,ヒ,ド,ャ,ペ],ワ(swap), + + ナ, low_half(TEMP0, TOS) + ズ, deref(TEMP0) + セ, chop_word(TEMP1, TEMP0) + ネ, chop_word(TEMP2, TOS) + ヒ, or_inplace(TEMP0, TEMP2) + ド, write_cell(TEMP0, SP) + ャ, asm(ior(TOS, TEMP1, SP)) + ペ, write_cell(TOS, SP)