commit 4bfa38cbe0a168cc617bb1469da5b8d688a74016
parent 380392d8175de35bb9df00c78c176708a7be61dd
Author: Ryan Sepassi <rsepassi@gmail.com>
Date: Tue, 21 Apr 2026 10:10:32 -0700
lisp.M1 use %N, P1 branch zero, additional lisp tests
Diffstat:
18 files changed, 2962 insertions(+), 1563 deletions(-)
diff --git a/Makefile b/Makefile
@@ -178,7 +178,15 @@ run-all:
#
# Non-zero exits from the interpreter are fine (it exits with the
# final fixnum payload), so we ignore exit codes and only diff stdout.
-LISP_TESTS := $(sort $(wildcard tests/lisp/*.scm))
+LISP_TESTS := \
+ tests/lisp/00-identity.scm \
+ tests/lisp/07-tailcall.scm \
+ tests/lisp/10-arith.scm \
+ tests/lisp/11-compare.scm \
+ tests/lisp/12-numpred.scm \
+ tests/lisp/13-bitwise.scm \
+ tests/lisp/14-tagpred.scm \
+ tests/lisp/15-list.scm
test-lisp: | $(IMAGE_STAMP)
@$(MAKE) --no-print-directory PROG=lisp ARCH=$(ARCH) build/$(ARCH)/lisp
diff --git a/src/lisp.M1 b/src/lisp.M1
@@ -24,17 +24,41 @@
## 2=symbol, 3=vector, 4=closure, 5=primitive.
+## ---- tagged-lisp constants ---------------------------------------------
+## Singletons live in the low 6 bits (upper 3 bits distinguish them, low
+## 3 = 111 = singleton tag). Named DEFINEs so intent beats "07000000".
+DEFINE NIL 07000000
+DEFINE TRUE 0F000000
+DEFINE FALSE 17000000
+DEFINE UNSPEC 27000000
+
+DEFINE TAG_FIXNUM 01000000
+DEFINE TAG_PAIR 02000000
+DEFINE TAG_VECTOR 03000000
+DEFINE TAG_STRING 04000000
+DEFINE TAG_SYMBOL 05000000
+DEFINE TAG_PROC 06000000
+
+DEFINE TYPE_STRING 01000000
+DEFINE TYPE_SYMBOL 02000000
+DEFINE TYPE_VECTOR 03000000
+DEFINE TYPE_CLOSURE 04000000
+DEFINE TYPE_PRIM_FIXED 05000000
+DEFINE TYPE_PRIM_VARIADIC 06000000
+
+DEFINE ZERO32 '0000000000000000000000000000000000000000000000000000000000000000'
+
+
## ---- heap-state --------------------------------------------------------
## Step-2 layout preserved: two 8-byte cells whose upper 4 bytes are
-## zero (ELF_base < 4 GiB, so `&label` fits in 32 bits). Quoted hex
-## literals rather than bare `00 00 00 00` tokens: riscv64 M0 rejects
-## bare hex-byte tokens whose first nibble is 0-9.
+## zero (ELF_base < 4 GiB, so `&label` fits in 32 bits). Keep the high
+## word as `%0`; bare `00 00 00 00` byte tokens still upset riscv64 M0.
:heap_next
&heap_start
-'00000000'
+%0
:heap_end
&heap_tail
-'00000000'
+%0
## ---- _start ----------------------------------------------------------
@@ -55,14 +79,13 @@
## then NULL, then envp. We need argc and argv[1] before any CALL
## (no PROLOGUE on _start — CALL would bury the kernel frame under
## a pushed retaddr on amd64).
- P1_MOV_R3_SP
- P1_LD_R0_R3_0 ## r0 = argc
+ P1_LD_R0_SP_0 ## r0 = argc
P1_LI_R1
- '02000000'
+ %2
P1_LI_BR
&err_usage
P1_BLT_R0_R1 ## argc < 2 → err_usage
- P1_LD_R2_R3_16 ## r2 = argv[1] (survives SYSCALL)
+ P1_LD_R2_SP_16 ## r2 = argv[1] (survives SYSCALL)
## openat(AT_FDCWD=-100, argv[1], O_RDONLY=0, mode=0) → r0 = fd.
## Use openat rather than open because open is amd64-only
@@ -71,18 +94,16 @@
P1_LI_R0
SYS_OPENAT
P1_LI_R1
- '9CFFFFFF'
+ %-100
P1_LI_R3
- '00000000'
+ %0
P1_LI_R4
- '00000000'
+ %0
P1_SYSCALL
- P1_LI_R1
- '00000000'
P1_LI_BR
&err_open
- P1_BLT_R0_R1 ## fd < 0 → err_open
+ P1_BLTZ_R0 ## fd < 0 → err_open
## read_file_all(fd, src_buf, SRC_BUF_SIZE) → r0 = bytes_read.
## Stash fd in r4 so it survives the CALL; r4 is callee-saved.
@@ -91,7 +112,7 @@
P1_LI_R2
&src_buf
P1_LI_R3
- '00400000' ## 16384-byte capacity
+ %16384 ## 16384-byte capacity
P1_LI_BR
&read_file_all
P1_CALL
@@ -99,7 +120,7 @@
## Filling the buffer exactly means the file was ≥ SRC_BUF_SIZE —
## bail out rather than silently truncate.
P1_LI_R1
- '00400000'
+ %16384
P1_LI_BR
&err_src_too_big
P1_BEQ_R0_R1
@@ -120,6 +141,19 @@
P1_MOV_R1_R4
P1_SYSCALL
+ ## Preserve the script buffer tuple across primitive registration
+ ## and prelude evaluation. r6/r7 are callee-saved, so every CALL
+ ## below preserves them.
+ P1_LI_R6
+ &src_buf
+ P1_MOV_R7_R0
+ P1_LI_R1
+ &src_len
+ P1_ST_R7_R1_0
+ P1_LI_R1
+ &src_base
+ P1_ST_R6_R1_0
+
## Align heap_next up to 8 (pair/closure tags need 8-aligned raw
## pointers — see step 2).
P1_LI_R4
@@ -137,7 +171,7 @@
P1_LI_R1
&str_quote
P1_LI_R2
- '05000000'
+ %5
P1_LI_BR
&intern
P1_CALL
@@ -148,7 +182,7 @@
P1_LI_R1
&str_if
P1_LI_R2
- '02000000'
+ %2
P1_LI_BR
&intern
P1_CALL
@@ -159,7 +193,7 @@
P1_LI_R1
&str_begin
P1_LI_R2
- '05000000'
+ %5
P1_LI_BR
&intern
P1_CALL
@@ -170,7 +204,7 @@
P1_LI_R1
&str_lambda
P1_LI_R2
- '06000000'
+ %6
P1_LI_BR
&intern
P1_CALL
@@ -181,7 +215,7 @@
P1_LI_R1
&str_define
P1_LI_R2
- '06000000'
+ %6
P1_LI_BR
&intern
P1_CALL
@@ -196,11 +230,9 @@
&prim_table
:_start_reg_prim_loop
P1_LD_R1_R4_0 ## r1 = name ptr
- P1_LI_R0
- '00000000'
P1_LI_BR
&_start_reg_prim_done
- P1_BEQ_R1_R0
+ P1_BEQZ_R1
P1_LD_R2_R4_8 ## r2 = length
P1_LI_BR
@@ -226,42 +258,24 @@
&_start_reg_prim_loop
P1_B
:_start_reg_prim_done
-
- ## r4 = last_result. Initial unspec (0x27) so an empty source exits 0.
- P1_LI_R4
- '27000000'
-
-:_start_loop
+ ## Prelude regression gate: parse and evaluate the embedded Scheme
+ ## definitions before the user program. Any reader/eval/primitive
+ ## bug in steps 3-10 faults here before the real input runs.
+ P1_LI_R1
+ &prelude_src
+ P1_LI_R2
+ %0
P1_LI_BR
- &skip_ws
+ &eval_source
P1_CALL
+ ## Now evaluate the script read from argv[1].
+ P1_MOV_R1_R6
+ P1_MOV_R2_R7
P1_LI_BR
- &peek_char
+ &eval_source
P1_CALL
- ## EOF → done.
- P1_LI_R1
- '00000000'
- P1_ADDI_R1_R1_NEG1
- P1_LI_BR
- &_start_done
- P1_BEQ_R0_R1
-
- P1_LI_BR
- &read_expr
- P1_CALL ## r0 = parsed expr
-
- P1_MOV_R1_R0
- P1_LI_R2
- '07000000' ## empty local env = nil
- P1_LI_BR
- &eval
- P1_CALL ## r0 = evaluated result
-
P1_MOV_R4_R0
- P1_LI_BR
- &_start_loop
- P1_B
:_start_done
## Print the final result (write form) + newline for visibility.
@@ -270,7 +284,7 @@
&write
P1_CALL
P1_LI_R1
- '0A000000'
+ %10
P1_LI_BR
&putc
P1_CALL
@@ -288,22 +302,20 @@
## ---- read_file_all(r1=fd, r2=buf, r3=cap) -> r0 = total_bytes ------
## Read loop. r4-r7 are callee-saved AND preserved across SYSCALL, so
## we can park state there across each read() call. No PROLOGUE needed:
-## we only issue syscalls, never CALL. (Ported from kaem-minimal.M1.)
+## we only issue syscalls, never CALL.
:read_file_all
P1_MOV_R4_R1 ## r4 = fd
P1_MOV_R5_R2 ## r5 = cur buf ptr
P1_MOV_R6_R3 ## r6 = remaining capacity
P1_LI_R7
- '00000000' ## r7 = total_read
+ %0 ## r7 = total_read
:read_file_all_loop
## Capacity exhausted → stop; _start checks for the exact-full
## case and escalates to err_src_too_big.
- P1_LI_R1
- '00000000'
P1_LI_BR
&read_file_all_done
- P1_BEQ_R6_R1
+ P1_BEQZ_R6
P1_LI_R0
SYS_READ
@@ -313,11 +325,9 @@
P1_SYSCALL ## r0 = n (0=EOF, <0=err)
## n <= 0 → done. Check < 0 first, then == 0.
- P1_LI_R1
- '00000000'
P1_LI_BR
&read_file_all_done
- P1_BLT_R0_R1
+ P1_BLTZ_R0
P1_LI_BR
&read_file_all_done
P1_BEQ_R0_R1
@@ -334,19 +344,194 @@
P1_RET
+## ---- write_file_all(r1=fd, r2=buf, r3=len) -> r0 = total|-1 -------
+## Mirror of read_file_all: write until len reaches zero or an error
+## occurs. Returning -1 lets write-file raise a Lisp-facing error.
+:write_file_all
+ P1_MOV_R4_R1 ## r4 = fd
+ P1_MOV_R5_R2 ## r5 = cursor
+ P1_MOV_R6_R3 ## r6 = remaining
+ P1_LI_R7
+ %0 ## r7 = total_written
+
+:write_file_all_loop
+ P1_LI_BR
+ &write_file_all_done
+ P1_BEQZ_R6
+
+ P1_LI_R0
+ SYS_WRITE
+ P1_MOV_R1_R4
+ P1_MOV_R2_R5
+ P1_MOV_R3_R6
+ P1_SYSCALL ## r0 = n (<0 error, 0 unexpected stall)
+
+ P1_LI_BR
+ &write_file_all_err
+ P1_BLTZ_R0
+ P1_LI_BR
+ &write_file_all_err
+ P1_BEQ_R0_R1
+
+ P1_ADD_R5_R5_R0
+ P1_SUB_R6_R6_R0
+ P1_ADD_R7_R7_R0
+ P1_LI_BR
+ &write_file_all_loop
+ P1_B
+
+:write_file_all_done
+ P1_MOV_R0_R7
+ P1_RET
+
+:write_file_all_err
+ P1_LI_R0
+ %0
+ P1_ADDI_R0_R0_NEG1
+ P1_RET
+
+
+## ---- eval_source(r1=base, r2=len) -> r0 = last_result --------------
+## Save the current reader globals, point them at (base,len), evaluate
+## every top-level form, then restore the outer reader state.
+:eval_source
+ P1_PROLOGUE
+ P1_MOV_R3_SP
+ P1_ST_R4_R3_8 ## save caller's r4
+
+ P1_LI_R3
+ &src_base
+ P1_LD_R0_R3_0
+ P1_LI_R4
+ &saved_src_base
+ P1_ST_R0_R4_0
+ P1_ST_R1_R3_0
+
+ P1_LI_R3
+ &src_len
+ P1_LD_R0_R3_0
+ P1_LI_R4
+ &saved_src_len
+ P1_ST_R0_R4_0
+ P1_ST_R2_R3_0
+
+ P1_LI_R3
+ &src_cursor
+ P1_LD_R0_R3_0
+ P1_LI_R4
+ &saved_src_cursor
+ P1_ST_R0_R4_0
+ P1_LI_R0
+ %0
+ P1_ST_R0_R3_0
+
+ P1_LI_R3
+ &src_line
+ P1_LD_R0_R3_0
+ P1_LI_R4
+ &saved_src_line
+ P1_ST_R0_R4_0
+ P1_LI_R0
+ %1
+ P1_ST_R0_R3_0
+
+ P1_LI_R3
+ &src_col
+ P1_LD_R0_R3_0
+ P1_LI_R4
+ &saved_src_col
+ P1_ST_R0_R4_0
+ P1_LI_R0
+ %1
+ P1_ST_R0_R3_0
+
+ P1_LI_R4
+ %39 ## running last_result = unspec
+
+:eval_source_loop
+ P1_LI_BR
+ &skip_ws
+ P1_CALL
+
+ P1_LI_BR
+ &peek_char
+ P1_CALL
+ P1_LI_R1
+ %0
+ P1_ADDI_R1_R1_NEG1
+ P1_LI_BR
+ &eval_source_done
+ P1_BEQ_R0_R1
+
+ P1_LI_BR
+ &read_expr
+ P1_CALL
+ P1_MOV_R1_R0
+ P1_LI_R2
+ %7
+ P1_LI_BR
+ &eval
+ P1_CALL
+ P1_MOV_R4_R0
+ P1_LI_BR
+ &eval_source_loop
+ P1_B
+
+:eval_source_done
+ P1_LI_R3
+ &saved_src_base
+ P1_LD_R0_R3_0
+ P1_LI_R1
+ &src_base
+ P1_ST_R0_R1_0
+
+ P1_LI_R3
+ &saved_src_len
+ P1_LD_R0_R3_0
+ P1_LI_R1
+ &src_len
+ P1_ST_R0_R1_0
+
+ P1_LI_R3
+ &saved_src_cursor
+ P1_LD_R0_R3_0
+ P1_LI_R1
+ &src_cursor
+ P1_ST_R0_R1_0
+
+ P1_LI_R3
+ &saved_src_line
+ P1_LD_R0_R3_0
+ P1_LI_R1
+ &src_line
+ P1_ST_R0_R1_0
+
+ P1_LI_R3
+ &saved_src_col
+ P1_LD_R0_R3_0
+ P1_LI_R1
+ &src_col
+ P1_ST_R0_R1_0
+
+ P1_MOV_R0_R4
+ P1_MOV_R3_SP
+ P1_LD_R4_R3_8
+ P1_EPILOGUE
+ P1_RET
+
+
## ---- hash(r1=ptr, r2=len) -> r0 = u64 hash --------------------------
## DJB-style: h' = 31*h + b. Implemented as (h<<5) - h + b to avoid
## stashing 31 in a register. Uses r6 (zero constant) across the loop;
## saves/restores it via a PROLOGUE_N1 slot.
:hash
P1_PROLOGUE
- P1_MOV_R3_SP
- P1_ST_R6_R3_8
+ P1_ST_R6_SP_8
P1_LI_R6
- '00000000' ## zero const
+ %0 ## zero const
P1_LI_R0
- '00000000' ## h = 0
+ %0 ## h = 0
:hash_loop
P1_LI_BR
@@ -364,8 +549,7 @@
P1_B
:hash_done
- P1_MOV_R3_SP
- P1_LD_R6_R3_8
+ P1_LD_R6_SP_8
P1_EPILOGUE
P1_RET
@@ -376,9 +560,8 @@
## scratch; both are callee-saved, so PROLOGUE_N2 stashes them.
:sym_name_equal
P1_PROLOGUE_N2
- P1_MOV_R0_SP
- P1_ST_R6_R0_8
- P1_ST_R7_R0_16
+ P1_ST_R6_SP_8
+ P1_ST_R7_SP_16
P1_ADDI_R1_R1_NEG5 ## r1 = raw sym ptr
P1_LD_R6_R1_0 ## r6 = header word
@@ -392,7 +575,7 @@
P1_ADDI_R1_R1_8 ## r1 = name bytes ptr
P1_LI_R6
- '00000000' ## zero const
+ %0 ## zero const
:sym_name_equal_loop
P1_LI_BR
@@ -414,19 +597,18 @@
:sym_name_equal_eq
P1_LI_R0
- '01000000'
+ %1
P1_LI_BR
&sym_name_equal_done
P1_B
:sym_name_equal_neq
P1_LI_R0
- '00000000'
+ %0
:sym_name_equal_done
- P1_MOV_R3_SP
- P1_LD_R6_R3_8
- P1_LD_R7_R3_16
+ P1_LD_R6_SP_8
+ P1_LD_R7_SP_16
P1_EPILOGUE_N2
P1_RET
@@ -441,9 +623,8 @@
## [sp + 24] raw_ptr across the copy loop
:make_symbol
P1_PROLOGUE_N3
- P1_MOV_R3_SP
- P1_ST_R6_R3_8
- P1_ST_R7_R3_16
+ P1_ST_R6_SP_8
+ P1_ST_R7_SP_16
P1_MOV_R6_R1 ## r6 = src (mutated during byte copy)
P1_MOV_R7_R2 ## r7 = len (mutated during byte copy)
@@ -457,19 +638,18 @@
&alloc
P1_CALL ## r0 = raw ptr
- P1_MOV_R3_SP
- P1_ST_R0_R3_24 ## stash raw ptr
+ P1_ST_R0_SP_24 ## stash raw ptr
## Header: store len in low 48 bits, then stamp type=2 in byte 7.
P1_ST_R7_R0_0
P1_LI_R1
- '02000000'
+ %2
P1_SB_R1_R0_7
## Byte copy: dst = r3 (= raw+8), src = r6, len = r7.
P1_ADDI_R3_R0_8
P1_LI_R1
- '00000000' ## zero const for loop test
+ %0 ## zero const for loop test
:make_symbol_copy
P1_LI_BR
@@ -486,16 +666,183 @@
P1_B
:make_symbol_done
- P1_MOV_R3_SP
- P1_LD_R0_R3_24
+ P1_LD_R0_SP_24
P1_ORI_R0_R0_4 ## set bit 2 (aarch64 bitmask-imm can't do 0b101 directly)
P1_ORI_R0_R0_1 ## set bit 0 → tag = 101 (SYMBOL)
- P1_LD_R6_R3_8
- P1_LD_R7_R3_16
+ P1_LD_R6_SP_8
+ P1_LD_R7_SP_16
+ P1_EPILOGUE_N3
+ P1_RET
+
+
+## ---- byte_copy(r1=dst, r2=src, r3=len) -> r0 = dst_end -------------
+## Raw byte copy used by string construction, path marshaling, and
+## string-append. No overlap handling needed in the seed.
+:byte_copy
+ P1_LI_R0
+ %0
+:byte_copy_loop
+ P1_LI_BR
+ &byte_copy_done
+ P1_BEQ_R3_R0
+ P1_LB_R0_R2_0
+ P1_SB_R0_R1_0
+ P1_ADDI_R1_R1_1
+ P1_ADDI_R2_R2_1
+ P1_ADDI_R3_R3_NEG1
+ P1_LI_R0
+ %0
+ P1_LI_BR
+ &byte_copy_loop
+ P1_B
+:byte_copy_done
+ P1_MOV_R0_R1
+ P1_RET
+
+
+## ---- alloc_string(r1=len) -> r0 = tagged string ---------------------
+## Allocates header + zero or more payload bytes, stamps type=1, and
+## leaves the payload for the caller to fill.
+:alloc_string
+ P1_PROLOGUE
+ P1_MOV_R3_SP
+ P1_ST_R1_R3_8
+
+ P1_ADDI_R1_R1_7
+ P1_SHRI_R1_R1_3
+ P1_SHLI_R1_R1_3
+ P1_ADDI_R1_R1_8
+ P1_LI_BR
+ &alloc
+ P1_CALL
+
+ P1_MOV_R3_SP
+ P1_LD_R1_R3_8
+ P1_ST_R1_R0_0
+ P1_LI_R1
+ %1
+ P1_SB_R1_R0_7
+ P1_ORI_R0_R0_4 ## tag = 100 (string)
+ P1_EPILOGUE
+ P1_RET
+
+
+## ---- make_string(r1=src, r2=len) -> r0 = tagged string -------------
+:make_string
+ P1_PROLOGUE_N3
+ P1_MOV_R3_SP
+ P1_ST_R1_R3_8
+ P1_ST_R2_R3_16
+
+ P1_MOV_R1_R2
+ P1_LI_BR
+ &alloc_string
+ P1_CALL
+ P1_MOV_R3_SP
+ P1_ST_R0_R3_24
+
+ P1_ADDI_R1_R0_NEG4 ## raw string ptr
+ P1_ADDI_R1_R1_8 ## dst payload
+ P1_LD_R2_R3_8 ## src payload
+ P1_LD_R3_R3_16 ## len
+ P1_LI_BR
+ &byte_copy
+ P1_CALL
+
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_24
P1_EPILOGUE_N3
P1_RET
+## ---- make_vector(r1=len_raw, r2=init) -> r0 = tagged vector --------
+## Allocates header + len tagged slots, stamps type=3, and fills every
+## element with `init`.
+:make_vector
+ P1_PROLOGUE_N2
+ P1_MOV_R3_SP
+ P1_ST_R1_R3_8
+ P1_ST_R2_R3_16
+
+ P1_SHLI_R1_R1_3
+ P1_ADDI_R1_R1_8
+ P1_LI_BR
+ &alloc
+ P1_CALL
+
+ P1_MOV_R3_SP
+ P1_LD_R1_R3_8 ## len_raw
+ P1_ST_R0_R3_8 ## overwrite slot1 = raw ptr
+ P1_ST_R1_R0_0
+ P1_LI_R1
+ %3
+ P1_SB_R1_R0_7
+
+ P1_MOV_R3_SP
+ P1_LD_R1_R3_8 ## raw ptr
+ P1_LD_R2_R3_16 ## init
+ P1_LD_R0_R1_0 ## len_raw from header
+ P1_ADDI_R1_R1_8 ## payload cursor
+ P1_LI_R3
+ %0
+:make_vector_loop
+ P1_LI_BR
+ &make_vector_done
+ P1_BEQ_R0_R3
+ P1_ST_R2_R1_0
+ P1_ADDI_R1_R1_8
+ P1_ADDI_R0_R0_NEG1
+ P1_LI_BR
+ &make_vector_loop
+ P1_B
+:make_vector_done
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_8
+ P1_ORI_R0_R0_2
+ P1_ORI_R0_R0_1 ## tag = 011 (vector)
+ P1_EPILOGUE_N2
+ P1_RET
+
+
+## ---- string_to_c_path(r1=tagged_string) -> r0 = &path_buf ----------
+## Copies the string bytes to a shared NUL-terminated buffer so openat
+## can consume it as a kernel pathname.
+:string_to_c_path
+ P1_PROLOGUE_N2
+ P1_ADDI_R1_R1_NEG4 ## raw string ptr
+ P1_LD_R2_R1_0
+ P1_SHLI_R2_R2_16
+ P1_SHRI_R2_R2_16 ## r2 = len
+ P1_MOV_R3_R2
+ P1_LI_R0
+ %256 ## PATH_BUF_SIZE = 256
+ P1_LI_BR
+ &string_to_c_path_ok
+ P1_BLT_R3_R0
+ P1_LI_BR
+ &err_path_too_long
+ P1_B
+:string_to_c_path_ok
+ P1_MOV_R0_SP
+ P1_ST_R2_R0_8
+ P1_ADDI_R1_R1_8 ## payload ptr
+ P1_ST_R1_R0_16
+ P1_LI_R1
+ &path_buf
+ P1_LD_R2_R0_16
+ P1_LD_R3_R0_8
+ P1_LI_BR
+ &byte_copy
+ P1_CALL
+ P1_LI_R1
+ %0
+ P1_SB_R1_R0_0
+ P1_LI_R0
+ &path_buf
+ P1_EPILOGUE_N2
+ P1_RET
+
+
## ---- intern(r1=name_ptr, r2=name_len) -> r0 = tagged sym -----------
## Open-addressing linear probe over a 4096-slot table. Empty slot =
## 0 word (nil is 0x07, never 0, so this sentinel is unambiguous).
@@ -528,11 +875,9 @@
P1_ADD_R2_R2_R0 ## r2 = &symbol_table[h]
P1_LD_R3_R2_0 ## r3 = slot value
- P1_LI_R1
- '00000000'
P1_LI_BR
&intern_empty
- P1_BEQ_R3_R1 ## slot == 0 → allocate
+ P1_BEQZ_R3 ## slot == 0 → allocate
## Compare existing symbol to (r6, r7).
P1_MOV_R1_R3 ## r1 = tagged sym
@@ -542,11 +887,9 @@
&sym_name_equal
P1_CALL ## r0 = 0 or 1
- P1_LI_R1
- '00000000'
P1_LI_BR
&intern_hit
- P1_BNE_R0_R1
+ P1_BNEZ_R0
## Advance h = (h+1) & 4095.
P1_MOV_R3_SP
@@ -603,7 +946,7 @@
P1_ST_R1_R3_8
P1_ST_R2_R3_16
P1_LI_R1
- '10000000'
+ %16
P1_LI_BR
&alloc
P1_CALL
@@ -653,17 +996,17 @@
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '02000000'
+ %2
P1_LI_R2
&msg_error_prefix
P1_LI_R3
- '07000000'
+ %7
P1_SYSCALL
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '02000000'
+ %2
P1_MOV_R2_R6
P1_MOV_R3_R7
P1_SYSCALL
@@ -671,17 +1014,17 @@
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '02000000'
+ %2
P1_LI_R2
&msg_newline
P1_LI_R3
- '01000000'
+ %1
P1_SYSCALL
P1_LI_R0
SYS_EXIT
P1_LI_R1
- '01000000'
+ %1
P1_SYSCALL
@@ -690,7 +1033,7 @@
P1_LI_R1
&msg_oom
P1_LI_R2
- '0E000000'
+ %14
P1_LI_BR
&error
P1_B
@@ -699,7 +1042,7 @@
P1_LI_R1
&msg_intern_not_eq
P1_LI_R2
- '22000000' ## strlen == 34
+ %34 ## strlen == 34
P1_LI_BR
&error
P1_B
@@ -708,7 +1051,7 @@
P1_LI_R1
&msg_intern_collision
P1_LI_R2
- '2C000000' ## strlen == 44
+ %44 ## strlen == 44
P1_LI_BR
&error
P1_B
@@ -717,7 +1060,7 @@
P1_LI_R1
&msg_usage
P1_LI_R2
- '16000000' ## strlen("usage: lisp <file.scm>") == 22
+ %22 ## strlen("usage: lisp <file.scm>") == 22
P1_LI_BR
&error
P1_B
@@ -726,7 +1069,7 @@
P1_LI_R1
&msg_open_fail
P1_LI_R2
- '1A000000' ## strlen("failed to open source file") == 26
+ %26 ## strlen("failed to open source file") == 26
P1_LI_BR
&error
P1_B
@@ -735,7 +1078,7 @@
P1_LI_R1
&msg_src_too_big
P1_LI_R2
- '15000000' ## strlen("source file too large") == 21
+ %21 ## strlen("source file too large") == 21
P1_LI_BR
&error
P1_B
@@ -748,33 +1091,33 @@
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '02000000'
+ %2
P1_LI_R2
&msg_error_prefix
P1_LI_R3
- '07000000'
+ %7
P1_SYSCALL
## "reader: malformed input"
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '02000000'
+ %2
P1_LI_R2
&msg_reader_bad
P1_LI_R3
- '17000000' ## strlen("reader: malformed input") == 23
+ %23 ## strlen("reader: malformed input") == 23
P1_SYSCALL
## " at "
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '02000000'
+ %2
P1_LI_R2
&msg_at
P1_LI_R3
- '04000000'
+ %4
P1_SYSCALL
## LINE (via display_uint to stderr)
@@ -782,7 +1125,7 @@
&src_line
P1_LD_R1_R1_0
P1_LI_R2
- '02000000'
+ %2
P1_LI_BR
&display_uint
P1_CALL
@@ -791,11 +1134,11 @@
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '02000000'
+ %2
P1_LI_R2
&msg_colon
P1_LI_R3
- '01000000'
+ %1
P1_SYSCALL
## COL
@@ -803,7 +1146,7 @@
&src_col
P1_LD_R1_R1_0
P1_LI_R2
- '02000000'
+ %2
P1_LI_BR
&display_uint
P1_CALL
@@ -812,17 +1155,17 @@
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '02000000'
+ %2
P1_LI_R2
&msg_newline
P1_LI_R3
- '01000000'
+ %1
P1_SYSCALL
P1_LI_R0
SYS_EXIT
P1_LI_R1
- '01000000'
+ %1
P1_SYSCALL
@@ -838,20 +1181,20 @@
## src_base/src_len are set by _start after it reads argv[1] into
## src_buf. src_cursor starts at 0; src_line/src_col start at 1.
:src_base
-'00000000'
-'00000000'
+%0
+%0
:src_len
-'00000000'
-'00000000'
+%0
+%0
:src_cursor
-'00000000'
-'00000000'
+%0
+%0
:src_line
-'01000000'
-'00000000'
+%1
+%0
:src_col
-'01000000'
-'00000000'
+%1
+%0
## ---- peek_char() -> r0 = char (0..255) or -1 on EOF ----------------
@@ -866,7 +1209,7 @@
&peek_char_inb
P1_BLT_R1_R2 ## cursor < len → in-bounds
P1_LI_R0
- '00000000'
+ %0
P1_ADDI_R0_R0_NEG1 ## r0 = -1
P1_RET
:peek_char_inb
@@ -894,7 +1237,7 @@
## if char == '\n', bump line and reset col; else col++.
P1_LI_R1
- '0A000000' ## '\n' = 10
+ %10 ## '\n' = 10
P1_LI_BR
&advance_newline
P1_BEQ_R0_R1
@@ -916,7 +1259,7 @@
P1_LI_R1
&src_col
P1_LI_R2
- '01000000'
+ %1
P1_ST_R2_R1_0
P1_EPILOGUE
P1_RET
@@ -932,7 +1275,7 @@
## EOF → done
P1_LI_R1
- '00000000'
+ %0
P1_ADDI_R1_R1_NEG1
P1_LI_BR
&skip_ws_done
@@ -940,31 +1283,31 @@
## ' ' (0x20)
P1_LI_R1
- '20000000'
+ %32
P1_LI_BR
&skip_ws_eat
P1_BEQ_R0_R1
## '\t' (0x09)
P1_LI_R1
- '09000000'
+ %9
P1_LI_BR
&skip_ws_eat
P1_BEQ_R0_R1
## '\n' (0x0A)
P1_LI_R1
- '0A000000'
+ %10
P1_LI_BR
&skip_ws_eat
P1_BEQ_R0_R1
## '\r' (0x0D)
P1_LI_R1
- '0D000000'
+ %13
P1_LI_BR
&skip_ws_eat
P1_BEQ_R0_R1
## ';' (0x3B)
P1_LI_R1
- '3B000000'
+ %59
P1_LI_BR
&skip_ws_comment
P1_BEQ_R0_R1
@@ -991,14 +1334,14 @@
P1_CALL
## EOF → outer loop (will see -1 and exit)
P1_LI_R1
- '00000000'
+ %0
P1_ADDI_R1_R1_NEG1
P1_LI_BR
&skip_ws_loop
P1_BEQ_R0_R1
## '\n' → eat and outer loop
P1_LI_R1
- '0A000000'
+ %10
P1_LI_BR
&skip_ws_eat
P1_BEQ_R0_R1
@@ -1019,14 +1362,14 @@
## Character already in r1.
:is_digit
P1_LI_R2
- '30000000' ## '0' = 48
+ %48 ## '0' = 48
P1_LI_R0
- '00000000' ## default: not digit
+ %0 ## default: not digit
P1_LI_BR
&is_digit_done
P1_BLT_R1_R2 ## c < '0' → not digit
P1_LI_R2
- '3A000000' ## '9' + 1 = 58 (:)
+ %58 ## '9' + 1 = 58 (:)
P1_LI_BR
&is_digit_yes
P1_BLT_R1_R2 ## c < ':' → in range
@@ -1035,7 +1378,7 @@
P1_B
:is_digit_yes
P1_LI_R0
- '01000000'
+ %1
:is_digit_done
P1_RET
@@ -1050,7 +1393,7 @@
P1_ST_R6_R3_8
P1_LI_R6
- '00000000' ## r6 = 0 (accumulator)
+ %0 ## r6 = 0 (accumulator)
:read_number_loop
P1_LI_BR
@@ -1062,11 +1405,9 @@
P1_LI_BR
&is_digit
P1_CALL ## r0 = 0 or 1
- P1_LI_R1
- '00000000'
P1_LI_BR
&read_number_done
- P1_BEQ_R0_R1
+ P1_BEQZ_R0
## digit = peek - '0'. Re-peek (simpler than stashing).
P1_LI_BR
@@ -1103,50 +1444,50 @@
## Returns 1 if c is a token delimiter: whitespace, '(', ')', ';', or EOF.
:is_delim
P1_LI_R0
- '01000000' ## optimistic: delim
+ %1 ## optimistic: delim
P1_LI_R2
- '00000000'
+ %0
P1_ADDI_R2_R2_NEG1
P1_LI_BR
&is_delim_done
P1_BEQ_R1_R2 ## EOF
P1_LI_R2
- '20000000'
+ %32
P1_LI_BR
&is_delim_done
P1_BEQ_R1_R2
P1_LI_R2
- '09000000'
+ %9
P1_LI_BR
&is_delim_done
P1_BEQ_R1_R2
P1_LI_R2
- '0A000000'
+ %10
P1_LI_BR
&is_delim_done
P1_BEQ_R1_R2
P1_LI_R2
- '0D000000'
+ %13
P1_LI_BR
&is_delim_done
P1_BEQ_R1_R2
P1_LI_R2
- '28000000' ## '('
+ %40 ## '('
P1_LI_BR
&is_delim_done
P1_BEQ_R1_R2
P1_LI_R2
- '29000000' ## ')'
+ %41 ## ')'
P1_LI_BR
&is_delim_done
P1_BEQ_R1_R2
P1_LI_R2
- '3B000000' ## ';'
+ %59 ## ';'
P1_LI_BR
&is_delim_done
P1_BEQ_R1_R2
P1_LI_R0
- '00000000'
+ %0
:is_delim_done
P1_RET
@@ -1179,7 +1520,7 @@
&is_delim
P1_CALL
P1_LI_R1
- '01000000'
+ %1
P1_LI_BR
&read_symbol_done
P1_BEQ_R0_R1 ## delim → stop
@@ -1199,16 +1540,163 @@
P1_SUB_R2_R1_R6 ## r2 = cur - start = len
## If length 0, malformed (shouldn't happen — caller peeks before).
+ P1_LI_BR
+ &err_reader_bad
+ P1_BEQZ_R2
+
+ P1_MOV_R1_R7 ## r1 = ptr to first byte
+ ## r2 = len (already set)
+ P1_LI_BR
+ &intern
+ P1_CALL
+
+ P1_MOV_R3_SP
+ P1_LD_R6_R3_8
+ P1_LD_R7_R3_16
+ P1_EPILOGUE_N2
+ P1_RET
+
+
+## ---- read_string() -> r0 = tagged string --------------------------
+## Reads a double-quoted string into a scratch buffer, handling the
+## four escape forms the seed needs: \n, \t, \\, and \".
+:read_string
+ P1_PROLOGUE_N2
+ P1_MOV_R3_SP
+ P1_ST_R6_R3_8
+ P1_ST_R7_R3_16
+
+ P1_LI_BR
+ &advance_char
+ P1_CALL ## eat opening '"'
+
+ P1_LI_R6
+ &reader_string_buf
+ P1_LI_R7
+ %0 ## length
+
+:read_string_loop
+ P1_LI_BR
+ &peek_char
+ P1_CALL
+ P1_LI_R1
+ %0
+ P1_ADDI_R1_R1_NEG1
+ P1_LI_BR
+ &err_reader_bad
+ P1_BEQ_R0_R1 ## EOF in string
+
+ P1_LI_R1
+ %34
+ P1_LI_BR
+ &read_string_done
+ P1_BEQ_R0_R1 ## closing '"'
+
+ P1_LI_R1
+ %92
+ P1_LI_BR
+ &read_string_escape
+ P1_BEQ_R0_R1
+
+ P1_LI_R1
+ %512 ## READER_STRING_BUF_SIZE = 512
+ P1_LI_BR
+ &read_string_store
+ P1_BLT_R7_R1
+ P1_LI_BR
+ &err_reader_bad
+ P1_B
+
+:read_string_store
+ P1_SB_R0_R6_0
+ P1_ADDI_R6_R6_1
+ P1_ADDI_R7_R7_1
+ P1_LI_BR
+ &advance_char
+ P1_CALL
+ P1_LI_BR
+ &read_string_loop
+ P1_B
+
+:read_string_escape
+ P1_LI_BR
+ &advance_char
+ P1_CALL ## eat '\'
+ P1_LI_BR
+ &peek_char
+ P1_CALL
+ P1_LI_R1
+ %0
+ P1_ADDI_R1_R1_NEG1
+ P1_LI_BR
+ &err_reader_bad
+ P1_BEQ_R0_R1
+
+ P1_LI_R1
+ %110 ## 'n'
+ P1_LI_BR
+ &read_string_escape_nl
+ P1_BEQ_R0_R1
P1_LI_R1
- '00000000'
+ %116 ## 't'
+ P1_LI_BR
+ &read_string_escape_tab
+ P1_BEQ_R0_R1
+ P1_LI_R1
+ %92 ## '\\'
+ P1_LI_BR
+ &read_string_store_escaped
+ P1_BEQ_R0_R1
+ P1_LI_R1
+ %34 ## '"'
+ P1_LI_BR
+ &read_string_store_escaped
+ P1_BEQ_R0_R1
+ P1_LI_BR
+ &err_reader_bad
+ P1_B
+
+:read_string_escape_nl
+ P1_LI_R0
+ %10
+ P1_LI_BR
+ &read_string_store_escaped
+ P1_B
+
+:read_string_escape_tab
+ P1_LI_R0
+ %9
+
+:read_string_store_escaped
+ P1_LI_R1
+ %4096
+ P1_LI_BR
+ &read_string_store_escaped_ok
+ P1_BLT_R7_R1
+ P1_LI_BR
+ &err_reader_bad
+ P1_B
+
+:read_string_store_escaped_ok
+ P1_SB_R0_R6_0
+ P1_ADDI_R6_R6_1
+ P1_ADDI_R7_R7_1
P1_LI_BR
- &err_reader_bad
- P1_BEQ_R2_R1
+ &advance_char
+ P1_CALL ## eat escaped payload char
+ P1_LI_BR
+ &read_string_loop
+ P1_B
- P1_MOV_R1_R7 ## r1 = ptr to first byte
- ## r2 = len (already set)
+:read_string_done
P1_LI_BR
- &intern
+ &advance_char
+ P1_CALL ## eat closing '"'
+ P1_LI_R1
+ &reader_string_buf
+ P1_MOV_R2_R7
+ P1_LI_BR
+ &make_string
P1_CALL
P1_MOV_R3_SP
@@ -1237,14 +1725,14 @@
&peek_char
P1_CALL
P1_LI_R1
- '29000000' ## ')'
+ %41 ## ')'
P1_LI_BR
&read_list_close
P1_BEQ_R0_R1
## EOF mid-list → error.
P1_LI_R1
- '00000000'
+ %0
P1_ADDI_R1_R1_NEG1
P1_LI_BR
&err_reader_bad
@@ -1284,7 +1772,7 @@
&advance_char
P1_CALL ## eat ')'
P1_LI_R0
- '07000000' ## nil = 0x07
+ NIL ## nil = 0x07
P1_EPILOGUE
P1_RET
@@ -1304,7 +1792,7 @@
## EOF → error.
P1_LI_R1
- '00000000'
+ %0
P1_ADDI_R1_R1_NEG1
P1_LI_BR
&err_reader_bad
@@ -1312,14 +1800,21 @@
## '(' → list.
P1_LI_R1
- '28000000'
+ %40
P1_LI_BR
&read_expr_list
P1_BEQ_R0_R1
+ ## '"' → string literal.
+ P1_LI_R1
+ %34
+ P1_LI_BR
+ &read_expr_string
+ P1_BEQ_R0_R1
+
## '#' → hash-prefix literal (#t, #f for now).
P1_LI_R1
- '23000000'
+ %35
P1_LI_BR
&read_expr_hash
P1_BEQ_R0_R1
@@ -1330,7 +1825,7 @@
&is_digit
P1_CALL
P1_LI_R1
- '01000000'
+ %1
P1_LI_BR
&read_expr_number
P1_BEQ_R0_R1
@@ -1359,6 +1854,13 @@
P1_EPILOGUE
P1_RET
+:read_expr_string
+ P1_LI_BR
+ &read_string
+ P1_CALL
+ P1_EPILOGUE
+ P1_RET
+
## Hash-prefix literals: `#t` → 0x0F, `#f` → 0x17. Inherits read_expr's
## PROLOGUE (no new frame). Extended syntax (#\char, #(…)) is step 11.
:read_expr_hash
@@ -1370,12 +1872,12 @@
P1_CALL ## r0 = next char
P1_LI_R1
- '74000000' ## 't'
+ %116 ## 't'
P1_LI_BR
&read_expr_hash_t
P1_BEQ_R0_R1
P1_LI_R1
- '66000000' ## 'f'
+ %102 ## 'f'
P1_LI_BR
&read_expr_hash_f
P1_BEQ_R0_R1
@@ -1389,7 +1891,7 @@
&advance_char
P1_CALL ## eat 't'
P1_LI_R0
- '0F000000' ## #t singleton
+ TRUE ## #t singleton
P1_EPILOGUE
P1_RET
@@ -1398,7 +1900,7 @@
&advance_char
P1_CALL ## eat 'f'
P1_LI_R0
- '17000000' ## #f singleton
+ FALSE ## #f singleton
P1_EPILOGUE
P1_RET
@@ -1407,8 +1909,8 @@
## ---- putc(r1=char) — write one byte to fd 1 ------------------------
:putc_buf
-'00000000'
-'00000000'
+%0
+%0
:putc
P1_PROLOGUE
@@ -1418,10 +1920,10 @@
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '01000000'
+ %1
## r2 = &putc_buf already
P1_LI_R3
- '01000000'
+ %1
P1_SYSCALL
P1_EPILOGUE
P1_RET
@@ -1436,44 +1938,39 @@
:digit_buf
'000000000000000000000000000000000000000000000000'
:digit_buf_end
-'00000000'
+%0
:display_uint
P1_PROLOGUE_N3
- P1_MOV_R3_SP
- P1_ST_R6_R3_8
- P1_ST_R7_R3_16
- P1_ST_R2_R3_24 ## save fd
+ P1_ST_R6_SP_8
+ P1_ST_R7_SP_16
+ P1_ST_R2_SP_24 ## save fd
P1_LI_R6
&digit_buf_end ## r6 = end-of-buffer cursor (moves left)
P1_MOV_R7_R1 ## r7 = value (mutated)
## Special-case zero.
- P1_LI_R1
- '00000000'
P1_LI_BR
&du_loop
- P1_BNE_R7_R1 ## if value != 0, loop; else write '0'
+ P1_BNEZ_R7 ## if value != 0, loop; else write '0'
P1_ADDI_R6_R6_NEG1
P1_LI_R1
- '30000000' ## '0'
+ %48 ## '0'
P1_SB_R1_R6_0
P1_LI_BR
&du_write
P1_B
:du_loop
- P1_LI_R1
- '00000000'
P1_LI_BR
&du_write
- P1_BEQ_R7_R1 ## value == 0 → done digit gen
+ P1_BEQZ_R7 ## value == 0 → done digit gen
## digit = value % 10.
P1_MOV_R1_R7
P1_LI_R2
- '0A000000'
+ %10
P1_REM_R1_R1_R2 ## r1 = value % 10
P1_ADDI_R1_R1_48 ## r1 += '0'
P1_ADDI_R6_R6_NEG1
@@ -1482,7 +1979,7 @@
## value = value / 10.
P1_MOV_R1_R7
P1_LI_R2
- '0A000000'
+ %10
P1_DIV_R1_R1_R2
P1_MOV_R7_R1
@@ -1493,8 +1990,7 @@
:du_write
## Stash fd into r0 first — computing len clobbers r3 (we need it
## as SP for the slot-3 load), so grab fd before that step.
- P1_MOV_R3_SP
- P1_LD_R0_R3_24 ## r0 = fd (temp; SYS_WRITE will overwrite r0)
+ P1_LD_R0_SP_24 ## r0 = fd (temp; SYS_WRITE will overwrite r0)
P1_LI_R1
&digit_buf_end
P1_SUB_R3_R1_R6 ## r3 = len = digit_buf_end - r6
@@ -1504,9 +2000,8 @@
SYS_WRITE
P1_SYSCALL
- P1_MOV_R3_SP
- P1_LD_R6_R3_8
- P1_LD_R7_R3_16
+ P1_LD_R6_SP_8
+ P1_LD_R7_SP_16
P1_EPILOGUE_N3
P1_RET
@@ -1523,21 +2018,21 @@
## nil = 0x07
P1_LI_R2
- '07000000'
+ NIL
P1_LI_BR
&display_nil
P1_BEQ_R1_R2
## #t = 0x0F
P1_LI_R2
- '0F000000'
+ TRUE
P1_LI_BR
&display_true
P1_BEQ_R1_R2
## #f = 0x17
P1_LI_R2
- '17000000'
+ FALSE
P1_LI_BR
&display_false
P1_BEQ_R1_R2
@@ -1546,29 +2041,29 @@
P1_MOV_R2_R1
P1_ANDI_R1_R1_7 ## r1 = tag
P1_LI_R3
- '01000000'
+ TAG_FIXNUM
P1_LI_BR
&display_fixnum
P1_BEQ_R1_R3
P1_LI_R3
- '02000000'
+ TAG_PAIR
P1_LI_BR
&display_pair
P1_BEQ_R1_R3
P1_LI_R3
- '05000000'
+ TAG_SYMBOL
P1_LI_BR
&display_symbol
P1_BEQ_R1_R3
P1_LI_R3
- '04000000'
+ TAG_STRING
P1_LI_BR
&display_string
P1_BEQ_R1_R3
## Unknown — treat as "?"
P1_LI_R1
- '3F000000' ## '?'
+ %63 ## '?'
P1_LI_BR
&putc
P1_CALL
@@ -1577,12 +2072,12 @@
:display_nil
P1_LI_R1
- '28000000' ## '('
+ %40 ## '('
P1_LI_BR
&putc
P1_CALL
P1_LI_R1
- '29000000' ## ')'
+ %41 ## ')'
P1_LI_BR
&putc
P1_CALL
@@ -1593,12 +2088,12 @@
## display or write — display_fixnum/symbol pattern).
:display_true
P1_LI_R1
- '23000000' ## '#'
+ %35 ## '#'
P1_LI_BR
&putc
P1_CALL
P1_LI_R1
- '74000000' ## 't'
+ %116 ## 't'
P1_LI_BR
&putc
P1_CALL
@@ -1607,12 +2102,12 @@
:display_false
P1_LI_R1
- '23000000' ## '#'
+ %35 ## '#'
P1_LI_BR
&putc
P1_CALL
P1_LI_R1
- '66000000' ## 'f'
+ %102 ## 'f'
P1_LI_BR
&putc
P1_CALL
@@ -1623,7 +2118,7 @@
P1_MOV_R1_R2
P1_SARI_R1_R1_3 ## signed shift; value (assume non-negative here)
P1_LI_R2
- '01000000' ## fd = stdout
+ %1 ## fd = stdout
P1_LI_BR
&display_uint
P1_CALL
@@ -1641,7 +2136,7 @@
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '01000000'
+ %1
P1_SYSCALL
P1_EPILOGUE_N2
P1_RET
@@ -1655,7 +2150,7 @@
P1_MOV_R6_R2 ## r6 = tagged pair (we'll walk cdr chain)
P1_LI_R1
- '28000000' ## '('
+ %40 ## '('
P1_LI_BR
&putc
P1_CALL
@@ -1680,7 +2175,7 @@
## If cdr == nil, done.
P1_LI_R1
- '07000000'
+ NIL
P1_LI_BR
&display_pair_close
P1_BEQ_R6_R1
@@ -1689,24 +2184,24 @@
P1_MOV_R1_R6
P1_ANDI_R1_R1_7
P1_LI_R2
- '02000000'
+ TAG_PAIR
P1_LI_BR
&display_pair_continue
P1_BEQ_R1_R2
## Otherwise, improper: " . x)".
P1_LI_R1
- '20000000' ## ' '
+ %32 ## ' '
P1_LI_BR
&putc
P1_CALL
P1_LI_R1
- '2E000000' ## '.'
+ %46 ## '.'
P1_LI_BR
&putc
P1_CALL
P1_LI_R1
- '20000000'
+ %32
P1_LI_BR
&putc
P1_CALL
@@ -1720,7 +2215,7 @@
:display_pair_continue
P1_LI_R1
- '20000000' ## ' '
+ %32 ## ' '
P1_LI_BR
&putc
P1_CALL
@@ -1730,14 +2225,13 @@
:display_pair_close
P1_LI_R1
- '29000000' ## ')'
+ %41 ## ')'
P1_LI_BR
&putc
P1_CALL
- P1_MOV_R3_SP
- P1_LD_R6_R3_8
- P1_LD_R7_R3_16
+ P1_LD_R6_SP_8
+ P1_LD_R7_SP_16
P1_EPILOGUE_N2
P1_RET
@@ -1757,7 +2251,7 @@
P1_LI_R0
SYS_WRITE
P1_LI_R1
- '01000000'
+ %1
P1_SYSCALL
P1_EPILOGUE_N2
P1_RET
@@ -1772,19 +2266,19 @@
P1_PROLOGUE_N2
P1_LI_R2
- '07000000'
+ NIL
P1_LI_BR
&display_nil
P1_BEQ_R1_R2 ## nil
P1_LI_R2
- '0F000000'
+ TRUE
P1_LI_BR
&display_true
P1_BEQ_R1_R2 ## #t
P1_LI_R2
- '17000000'
+ FALSE
P1_LI_BR
&display_false
P1_BEQ_R1_R2 ## #f
@@ -1792,29 +2286,29 @@
P1_MOV_R2_R1
P1_ANDI_R1_R1_7 ## r1 = tag
P1_LI_R3
- '01000000'
+ TAG_FIXNUM
P1_LI_BR
&display_fixnum
P1_BEQ_R1_R3
P1_LI_R3
- '02000000'
+ TAG_PAIR
P1_LI_BR
&write_pair
P1_BEQ_R1_R3
P1_LI_R3
- '05000000'
+ TAG_SYMBOL
P1_LI_BR
&display_symbol
P1_BEQ_R1_R3
P1_LI_R3
- '04000000'
+ TAG_STRING
P1_LI_BR
&write_string
P1_BEQ_R1_R3
## Unknown (closure/prim, etc.) — emit '?' placeholder.
P1_LI_R1
- '3F000000'
+ %63
P1_LI_BR
&putc
P1_CALL
@@ -1827,9 +2321,8 @@
## write's PROLOGUE_N2 frame; r6=cursor, r7=remaining-bytes saved in
## the two slots across putc calls.
:write_string
- P1_MOV_R3_SP
- P1_ST_R6_R3_8
- P1_ST_R7_R3_16
+ P1_ST_R6_SP_8
+ P1_ST_R7_SP_16
P1_ADDI_R2_R2_NEG4
P1_LD_R3_R2_0
@@ -1840,28 +2333,26 @@
P1_MOV_R7_R3 ## r7 = length
P1_LI_R1
- '22000000' ## '"'
+ %34 ## '"'
P1_LI_BR
&putc
P1_CALL
:write_string_loop
- P1_LI_R1
- '00000000'
P1_LI_BR
&write_string_done
- P1_BEQ_R7_R1 ## length == 0 → done
+ P1_BEQZ_R7 ## length == 0 → done
P1_LB_R1_R6_0 ## r1 = *cursor
P1_LI_R2
- '22000000' ## '"'
+ %34 ## '"'
P1_LI_BR
&write_string_escape
P1_BEQ_R1_R2
P1_LI_R2
- '5C000000' ## '\\'
+ %92 ## '\\'
P1_LI_BR
&write_string_escape
P1_BEQ_R1_R2
@@ -1880,7 +2371,7 @@
:write_string_escape
## Emit '\\' then re-emit the char (cursor still points to it).
P1_LI_R1
- '5C000000'
+ %92
P1_LI_BR
&putc
P1_CALL
@@ -1894,13 +2385,12 @@
:write_string_done
P1_LI_R1
- '22000000' ## '"'
+ %34 ## '"'
P1_LI_BR
&putc
P1_CALL
- P1_MOV_R3_SP
- P1_LD_R6_R3_8
- P1_LD_R7_R3_16
+ P1_LD_R6_SP_8
+ P1_LD_R7_SP_16
P1_EPILOGUE_N2
P1_RET
@@ -1909,14 +2399,13 @@
## Mirror of display_pair but recurses through write (strings quoted).
## Shares write's PROLOGUE_N2 frame.
:write_pair
- P1_MOV_R3_SP
- P1_ST_R6_R3_8
- P1_ST_R7_R3_16
+ P1_ST_R6_SP_8
+ P1_ST_R7_SP_16
P1_MOV_R6_R2 ## r6 = tagged pair cursor
P1_LI_R1
- '28000000' ## '('
+ %40 ## '('
P1_LI_BR
&putc
P1_CALL
@@ -1938,7 +2427,7 @@
P1_MOV_R6_R0
P1_LI_R1
- '07000000'
+ NIL
P1_LI_BR
&write_pair_close
P1_BEQ_R6_R1
@@ -1946,24 +2435,24 @@
P1_MOV_R1_R6
P1_ANDI_R1_R1_7
P1_LI_R2
- '02000000'
+ TAG_PAIR
P1_LI_BR
&write_pair_continue
P1_BEQ_R1_R2
## improper tail: " . x)"
P1_LI_R1
- '20000000'
+ %32
P1_LI_BR
&putc
P1_CALL
P1_LI_R1
- '2E000000'
+ %46
P1_LI_BR
&putc
P1_CALL
P1_LI_R1
- '20000000'
+ %32
P1_LI_BR
&putc
P1_CALL
@@ -1977,7 +2466,7 @@
:write_pair_continue
P1_LI_R1
- '20000000'
+ %32
P1_LI_BR
&putc
P1_CALL
@@ -1987,14 +2476,13 @@
:write_pair_close
P1_LI_R1
- '29000000' ## ')'
+ %41 ## ')'
P1_LI_BR
&putc
P1_CALL
- P1_MOV_R3_SP
- P1_LD_R6_R3_8
- P1_LD_R7_R3_16
+ P1_LD_R6_SP_8
+ P1_LD_R7_SP_16
P1_EPILOGUE_N2
P1_RET
@@ -2048,7 +2536,7 @@
P1_MOV_R3_SP
P1_LD_R2_R3_16
P1_LI_R1
- '07000000'
+ %7
P1_LI_BR
&lookup_alist_miss
P1_BEQ_R2_R1 ## cursor == nil → miss
@@ -2092,7 +2580,7 @@
:lookup_alist_miss
P1_LI_R0
- '07000000'
+ %7
P1_EPILOGUE_N3
P1_RET
@@ -2109,7 +2597,7 @@
P1_CALL ## r0 = local pair or nil
P1_LI_R1
- '07000000'
+ %7
P1_LI_BR
&lookup_global
P1_BEQ_R0_R1
@@ -2132,7 +2620,7 @@
P1_CALL
P1_LI_R1
- '07000000'
+ %7
P1_LI_BR
&err_unbound
P1_BEQ_R0_R1
@@ -2162,14 +2650,14 @@
P1_MOV_R3_SP
P1_LD_R1_R3_8
P1_LI_R2
- '07000000'
+ %7
P1_LI_BR
&env_extend_done
P1_BEQ_R1_R2 ## names == nil → done
P1_LD_R1_R3_16
P1_LI_R2
- '07000000'
+ %7
P1_LI_BR
&err_arity
P1_BEQ_R1_R2 ## vals == nil → arity error
@@ -2249,13 +2737,13 @@
P1_ST_R0_R3_24 ## slot 3 = env
P1_LI_R1
- '20000000' ## 32 bytes
+ %32 ## 32 bytes
P1_LI_BR
&alloc
P1_CALL ## r0 = raw ptr
P1_LI_R1
- '04000000'
+ %4
P1_SB_R1_R0_7 ## type = 4 (closure)
P1_MOV_R3_SP
@@ -2287,7 +2775,7 @@
P1_ST_R0_R3_24 ## slot 3 = type
P1_LI_R1
- '10000000' ## 16 bytes
+ %16 ## 16 bytes
P1_LI_BR
&alloc
P1_CALL ## r0 = raw ptr
@@ -2316,7 +2804,7 @@
P1_ST_R2_R3_16 ## slot 2 = env
P1_LI_R2
- '07000000'
+ %7
P1_LI_BR
&eval_args_done
P1_BEQ_R1_R2
@@ -2356,7 +2844,7 @@
:eval_args_done
P1_LI_R0
- '07000000'
+ %7
P1_EPILOGUE_N3
P1_RET
@@ -2375,7 +2863,7 @@
P1_ANDI_R1_R1_7
P1_LI_R0
- '06000000'
+ TAG_PROC
P1_LI_BR
&err_not_callable
P1_BNE_R1_R0
@@ -2387,12 +2875,12 @@
## Fork on header type byte.
P1_LB_R0_R1_7 ## r0 = type
P1_LI_R2
- '05000000'
+ TYPE_PRIM_FIXED
P1_LI_BR
&apply_prim_fixed
P1_BEQ_R0_R2
P1_LI_R2
- '06000000'
+ TYPE_PRIM_VARIADIC
P1_LI_BR
&apply_prim_variadic
P1_BEQ_R0_R2
@@ -2479,17 +2967,17 @@
P1_LI_R2
&prim_argv ## r2 = cursor
P1_LI_R3
- '00000000' ## r3 = count
+ %0 ## r3 = count
:marshal_argv_loop
P1_LI_R0
- '07000000'
+ %7
P1_LI_BR
&marshal_argv_done
P1_BEQ_R1_R0 ## list == nil → done
P1_LI_R0
- '20000000' ## PRIM_ARGV_SLOTS = 32
+ %32 ## PRIM_ARGV_SLOTS = 32
P1_LI_BR
&err_too_many_args
P1_BEQ_R3_R0
@@ -2518,141 +3006,199 @@
## already set up, and RET returns to apply's caller (since apply
## already ran EPILOGUE_N4 before branching here).
:prim_dispatch
- P1_LI_R0
- '00000000'
P1_LI_BR
&prim_add
- P1_BEQ_R3_R0
+ P1_BEQZ_R3
P1_LI_R0
- '01000000'
+ %1
P1_LI_BR
&prim_sub
P1_BEQ_R3_R0
P1_LI_R0
- '02000000'
+ %2
P1_LI_BR
&prim_mul
P1_BEQ_R3_R0
P1_LI_R0
- '03000000'
+ %3
P1_LI_BR
&prim_div
P1_BEQ_R3_R0
P1_LI_R0
- '04000000'
+ %4
P1_LI_BR
&prim_mod
P1_BEQ_R3_R0
P1_LI_R0
- '05000000'
+ %5
P1_LI_BR
&prim_numeq
P1_BEQ_R3_R0
P1_LI_R0
- '06000000'
+ %6
P1_LI_BR
&prim_lt
P1_BEQ_R3_R0
P1_LI_R0
- '07000000'
+ %7
P1_LI_BR
&prim_gt
P1_BEQ_R3_R0
P1_LI_R0
- '08000000'
+ %8
P1_LI_BR
&prim_le
P1_BEQ_R3_R0
P1_LI_R0
- '09000000'
+ %9
P1_LI_BR
&prim_ge
P1_BEQ_R3_R0
P1_LI_R0
- '0A000000'
+ %10
P1_LI_BR
&prim_zerop
P1_BEQ_R3_R0
P1_LI_R0
- '0B000000'
+ %11
P1_LI_BR
&prim_negativep
P1_BEQ_R3_R0
P1_LI_R0
- '0C000000'
+ %12
P1_LI_BR
&prim_positivep
P1_BEQ_R3_R0
P1_LI_R0
- '0D000000'
+ %13
P1_LI_BR
&prim_abs
P1_BEQ_R3_R0
P1_LI_R0
- '0E000000'
+ %14
P1_LI_BR
&prim_min
P1_BEQ_R3_R0
P1_LI_R0
- '0F000000'
+ %15
P1_LI_BR
&prim_max
P1_BEQ_R3_R0
P1_LI_R0
- '10000000'
+ %16
P1_LI_BR
&prim_bitand
P1_BEQ_R3_R0
P1_LI_R0
- '11000000'
+ %17
P1_LI_BR
&prim_bitor
P1_BEQ_R3_R0
P1_LI_R0
- '12000000'
+ %18
P1_LI_BR
&prim_bitxor
P1_BEQ_R3_R0
P1_LI_R0
- '13000000'
+ %19
P1_LI_BR
&prim_bitnot
P1_BEQ_R3_R0
P1_LI_R0
- '14000000'
+ %20
P1_LI_BR
&prim_ashift
P1_BEQ_R3_R0
P1_LI_R0
- '15000000'
+ %21
P1_LI_BR
&prim_numberp
P1_BEQ_R3_R0
P1_LI_R0
- '16000000'
+ %22
P1_LI_BR
&prim_symbolp
P1_BEQ_R3_R0
P1_LI_R0
- '17000000'
+ %23
P1_LI_BR
&prim_stringp
P1_BEQ_R3_R0
P1_LI_R0
- '18000000'
+ %24
P1_LI_BR
&prim_vectorp
P1_BEQ_R3_R0
P1_LI_R0
- '19000000'
+ %25
P1_LI_BR
&prim_procp
P1_BEQ_R3_R0
P1_LI_R0
- '1A000000'
+ %26
P1_LI_BR
&prim_eqp
P1_BEQ_R3_R0
+ P1_LI_R0
+ %27
+ P1_LI_BR
+ &prim_cons
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %28
+ P1_LI_BR
+ &prim_car
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %29
+ P1_LI_BR
+ &prim_cdr
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %30
+ P1_LI_BR
+ &prim_pairp
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %31
+ P1_LI_BR
+ &prim_nullp
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %32
+ P1_LI_BR
+ &prim_list
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %33
+ P1_LI_BR
+ &prim_length
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %34
+ P1_LI_BR
+ &prim_listp
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %35
+ P1_LI_BR
+ &prim_append
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %36
+ P1_LI_BR
+ &prim_reverse
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %37
+ P1_LI_BR
+ &prim_assoc
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %38
+ P1_LI_BR
+ &prim_member
+ P1_BEQ_R3_R0
P1_LI_BR
&err_bad_prim
@@ -2670,7 +3216,7 @@
## to decoded accumulator, retag at end.
:prim_add
P1_LI_R3
- '00000000' ## acc = 0
+ %0 ## acc = 0
P1_SHLI_R1_R1_3
P1_ADD_R1_R1_R2 ## r1 = argv_end
:prim_add_loop
@@ -2693,7 +3239,7 @@
## (- x) negates; (- x y ...) folds subtraction from the left.
:prim_sub
P1_LI_R0
- '01000000'
+ %1
P1_LI_BR
&prim_sub_negate
P1_BEQ_R1_R0 ## argc == 1 → unary negate
@@ -2723,7 +3269,7 @@
P1_LD_R3_R2_0
P1_SARI_R3_R3_3
P1_LI_R0
- '00000000'
+ %0
P1_SUB_R3_R0_R3
P1_SHLI_R0_R3_3
P1_ORI_R0_R0_1
@@ -2733,7 +3279,7 @@
## (* ...) — variadic product. Identity 1.
:prim_mul
P1_LI_R3
- '01000000' ## acc = 1
+ %1 ## acc = 1
P1_SHLI_R1_R1_3
P1_ADD_R1_R1_R2
:prim_mul_loop
@@ -2789,13 +3335,13 @@
&prim_true
P1_BEQ_R3_R0
P1_LI_R0
- '17000000' ## #f
+ FALSE ## #f
P1_RET
## Shared "return #t" tail used by comparison/predicate primitives.
:prim_true
P1_LI_R0
- '0F000000'
+ TRUE
P1_RET
@@ -2808,7 +3354,7 @@
&prim_true
P1_BLT_R3_R0
P1_LI_R0
- '17000000'
+ %23
P1_RET
@@ -2820,7 +3366,7 @@
&prim_true
P1_BLT_R0_R3
P1_LI_R0
- '17000000'
+ %23
P1_RET
@@ -2832,11 +3378,11 @@
&prim_le_false
P1_BLT_R0_R3
P1_LI_R0
- '0F000000' ## #t
+ TRUE ## #t
P1_RET
:prim_le_false
P1_LI_R0
- '17000000'
+ %23
P1_RET
@@ -2848,11 +3394,11 @@
&prim_ge_false
P1_BLT_R3_R0
P1_LI_R0
- '0F000000'
+ %15
P1_RET
:prim_ge_false
P1_LI_R0
- '17000000'
+ %23
P1_RET
@@ -2860,12 +3406,12 @@
:prim_zerop
P1_LD_R3_R2_0
P1_LI_R0
- '01000000'
+ %1
P1_LI_BR
&prim_true
P1_BEQ_R3_R0
P1_LI_R0
- '17000000'
+ %23
P1_RET
@@ -2873,12 +3419,12 @@
:prim_negativep
P1_LD_R3_R2_0
P1_LI_R0
- '01000000'
+ %1
P1_LI_BR
&prim_true
P1_BLT_R3_R0
P1_LI_R0
- '17000000'
+ %23
P1_RET
@@ -2886,12 +3432,12 @@
:prim_positivep
P1_LD_R3_R2_0
P1_LI_R0
- '01000000'
+ %1
P1_LI_BR
&prim_true
P1_BLT_R0_R3
P1_LI_R0
- '17000000'
+ %23
P1_RET
@@ -2900,7 +3446,7 @@
P1_LD_R3_R2_0
P1_SARI_R3_R3_3 ## decode
P1_LI_R0
- '00000000'
+ %0
P1_LI_BR
&prim_abs_done
P1_BLT_R0_R3 ## 0 < v → already positive
@@ -2971,7 +3517,7 @@
## to match the shape of the other variadic bit ops.
:prim_bitand
P1_LI_R3
- '00000000'
+ %0
P1_ADDI_R3_R3_NEG1 ## r3 = -1
P1_SHLI_R1_R1_3
P1_ADD_R1_R1_R2
@@ -2995,7 +3541,7 @@
## (bit-or ...) — identity 0.
:prim_bitor
P1_LI_R3
- '00000000'
+ %0
P1_SHLI_R1_R1_3
P1_ADD_R1_R1_R2
:prim_bitor_loop
@@ -3018,7 +3564,7 @@
## (bit-xor ...) — identity 0.
:prim_bitxor
P1_LI_R3
- '00000000'
+ %0
P1_SHLI_R1_R1_3
P1_ADD_R1_R1_R2
:prim_bitxor_loop
@@ -3043,7 +3589,7 @@
P1_LD_R3_R2_0
P1_SARI_R3_R3_3
P1_LI_R0
- '00000000'
+ %0
P1_ADDI_R0_R0_NEG1 ## r0 = -1
P1_SUB_R3_R0_R3 ## r3 = -1 - r3
P1_SHLI_R0_R3_3
@@ -3057,11 +3603,9 @@
P1_SARI_R3_R3_3 ## r3 = n (decoded)
P1_LD_R0_R2_8
P1_SARI_R0_R0_3 ## r0 = k (decoded, signed)
- P1_LI_R1
- '00000000'
P1_LI_BR
&prim_ashift_neg
- P1_BLT_R0_R1 ## k < 0 → right shift by -k
+ P1_BLTZ_R0 ## k < 0 → right shift by -k
P1_SHL_R3_R3_R0
P1_LI_BR
&prim_ashift_done
@@ -3080,12 +3624,12 @@
P1_LD_R3_R2_0
P1_ANDI_R3_R3_7
P1_LI_R0
- '01000000'
+ TAG_FIXNUM
P1_LI_BR
&prim_true
P1_BEQ_R3_R0
P1_LI_R0
- '17000000'
+ FALSE
P1_RET
@@ -3094,12 +3638,12 @@
P1_LD_R3_R2_0
P1_ANDI_R3_R3_7
P1_LI_R0
- '05000000'
+ TAG_SYMBOL
P1_LI_BR
&prim_true
P1_BEQ_R3_R0
P1_LI_R0
- '17000000'
+ FALSE
P1_RET
@@ -3108,12 +3652,12 @@
P1_LD_R3_R2_0
P1_ANDI_R3_R3_7
P1_LI_R0
- '04000000'
+ TAG_STRING
P1_LI_BR
&prim_true
P1_BEQ_R3_R0
P1_LI_R0
- '17000000'
+ FALSE
P1_RET
@@ -3122,12 +3666,12 @@
P1_LD_R3_R2_0
P1_ANDI_R3_R3_7
P1_LI_R0
- '03000000'
+ TAG_VECTOR
P1_LI_BR
&prim_true
P1_BEQ_R3_R0
P1_LI_R0
- '17000000'
+ FALSE
P1_RET
@@ -3140,7 +3684,7 @@
P1_MOV_R0_R3
P1_ANDI_R0_R0_7
P1_LI_R1
- '06000000'
+ TAG_PROC
P1_LI_BR
&prim_procp_false
P1_BNE_R0_R1 ## tag != 6 → #f
@@ -3148,23 +3692,23 @@
P1_ADDI_R3_R3_NEG6 ## strip tag
P1_LB_R0_R3_7 ## r0 = type byte
P1_LI_R1
- '04000000'
+ TYPE_CLOSURE
P1_LI_BR
&prim_true
P1_BEQ_R0_R1
P1_LI_R1
- '05000000'
+ TYPE_PRIM_FIXED
P1_LI_BR
&prim_true
P1_BEQ_R0_R1
P1_LI_R1
- '06000000'
+ TYPE_PRIM_VARIADIC
P1_LI_BR
&prim_true
P1_BEQ_R0_R1
:prim_procp_false
P1_LI_R0
- '17000000'
+ FALSE
P1_RET
@@ -3178,7 +3722,332 @@
&prim_true
P1_BEQ_R3_R0
P1_LI_R0
- '17000000'
+ FALSE
+ P1_RET
+
+
+## ---- Step-10d list-core primitives ---------------------------------
+## (cons a d) — wraps the internal `cons` helper which calls alloc;
+## need PROLOGUE to save lr across the call.
+:prim_cons
+ P1_PROLOGUE
+ P1_LD_R1_R2_0 ## r1 = car arg
+ P1_LD_R2_R2_8 ## r2 = cdr arg (uses old r2 base)
+ P1_LI_BR
+ &cons
+ P1_CALL
+ P1_EPILOGUE
+ P1_RET
+
+
+## (car p) — unsafe (no tag check). Inlined: strip 0b010 tag, load +0.
+:prim_car
+ P1_LD_R1_R2_0
+ P1_ADDI_R1_R1_NEG2
+ P1_LD_R0_R1_0
+ P1_RET
+
+
+## (cdr p) — symmetric.
+:prim_cdr
+ P1_LD_R1_R2_0
+ P1_ADDI_R1_R1_NEG2
+ P1_LD_R0_R1_8
+ P1_RET
+
+
+## (pair? x) — tag is 2.
+:prim_pairp
+ P1_LD_R3_R2_0
+ P1_ANDI_R3_R3_7
+ P1_LI_R0
+ TAG_PAIR
+ P1_LI_BR
+ &prim_true
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %23
+ P1_RET
+
+
+## (null? x) — equals nil singleton (0x07).
+:prim_nullp
+ P1_LD_R3_R2_0
+ P1_LI_R0
+ NIL
+ P1_LI_BR
+ &prim_true
+ P1_BEQ_R3_R0
+ P1_LI_R0
+ %23
+ P1_RET
+
+
+## (list ...) — variadic; build (a b c ...) by walking argv from the
+## tail and consing onto an accumulator (initially nil). Walking from
+## the tail avoids needing a reverse pass.
+:prim_list
+ P1_PROLOGUE_N3
+ P1_MOV_R3_SP
+ P1_LI_R0
+ NIL ## nil
+ P1_ST_R0_R3_8 ## slot1 = accumulator
+ P1_ST_R2_R3_24 ## slot3 = base
+ P1_SHLI_R1_R1_3 ## r1 = argc * 8
+ P1_ADD_R1_R1_R2 ## r1 = end ptr (one past last)
+ P1_ST_R1_R3_16 ## slot2 = cursor
+:prim_list_loop
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_16 ## cursor
+ P1_LD_R1_R3_24 ## base
+ P1_LI_BR
+ &prim_list_done
+ P1_BEQ_R0_R1
+ P1_ADDI_R0_R0_NEG8 ## cursor -= 8
+ P1_ST_R0_R3_16
+ P1_LD_R1_R0_0 ## r1 = arg
+ P1_LD_R2_R3_8 ## r2 = accumulator
+ P1_LI_BR
+ &cons
+ P1_CALL
+ P1_MOV_R3_SP
+ P1_ST_R0_R3_8 ## accumulator = new pair
+ P1_LI_BR
+ &prim_list_loop
+ P1_B
+:prim_list_done
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_8
+ P1_EPILOGUE_N3
+ P1_RET
+
+
+## (length lst) — count pairs until nil. No proper-list check; an
+## improper or non-list tail will dereference a bogus ptr (matching
+## the seed's "no validation on bad input" stance).
+:prim_length
+ P1_LD_R1_R2_0
+ P1_LI_R3
+ %0
+:prim_length_loop
+ P1_LI_R0
+ %7
+ P1_LI_BR
+ &prim_length_done
+ P1_BEQ_R1_R0
+ P1_ADDI_R0_R1_NEG2
+ P1_LD_R1_R0_8
+ P1_ADDI_R3_R3_1
+ P1_LI_BR
+ &prim_length_loop
+ P1_B
+:prim_length_done
+ P1_SHLI_R0_R3_3
+ P1_ORI_R0_R0_1
+ P1_RET
+
+
+## (list? x) — walks to nil. Returns #t at nil, #f at any non-pair
+## node. No cycle check (per LISP.md §equal? policy).
+:prim_listp
+ P1_LD_R1_R2_0
+:prim_listp_loop
+ P1_LI_R0
+ %7
+ P1_LI_BR
+ &prim_true
+ P1_BEQ_R1_R0
+ P1_MOV_R0_R1
+ P1_ANDI_R0_R0_7
+ P1_LI_R3
+ %2
+ P1_LI_BR
+ &prim_listp_false
+ P1_BNE_R0_R3
+ P1_ADDI_R0_R1_NEG2
+ P1_LD_R1_R0_8
+ P1_LI_BR
+ &prim_listp_loop
+ P1_B
+:prim_listp_false
+ P1_LI_R0
+ %23
+ P1_RET
+
+
+## append_one(r1=xs, r2=ys) -> r0 = xs ++ ys. Copies xs's spine; ys
+## is shared by reference. Recursive — bounded by xs's length.
+:append_one
+ P1_PROLOGUE_N2
+ P1_LI_R0
+ %7
+ P1_LI_BR
+ &append_one_base
+ P1_BEQ_R1_R0
+ P1_MOV_R3_SP
+ P1_ST_R1_R3_8 ## save xs
+ P1_ST_R2_R3_16 ## save ys
+ P1_ADDI_R0_R1_NEG2
+ P1_LD_R1_R0_8 ## r1 = cdr(xs)
+ P1_LI_BR
+ &append_one
+ P1_CALL ## r0 = appended tail
+ P1_MOV_R2_R0
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_8
+ P1_ADDI_R0_R0_NEG2
+ P1_LD_R1_R0_0 ## r1 = car(xs)
+ P1_LI_BR
+ &cons
+ P1_CALL
+ P1_EPILOGUE_N2
+ P1_RET
+:append_one_base
+ P1_MOV_R0_R2
+ P1_EPILOGUE_N2
+ P1_RET
+
+
+## (append ...) — variadic; the last argument is shared (not copied),
+## all earlier arguments have their spines copied. Right-to-left fold.
+:prim_append
+ P1_PROLOGUE_N3
+ P1_LI_BR
+ &prim_append_zero
+ P1_BEQZ_R1
+ P1_MOV_R3_SP
+ P1_ST_R2_R3_8 ## slot1 = argv base
+ P1_ADDI_R1_R1_NEG1 ## r1 = argc-1
+ P1_SHLI_R1_R1_3 ## r1 = (argc-1)*8
+ P1_ADD_R1_R1_R2 ## r1 = &argv[argc-1]
+ P1_ST_R1_R3_24 ## slot3 = cursor
+ P1_LD_R0_R1_0 ## r0 = last arg
+ P1_ST_R0_R3_16 ## slot2 = result
+:prim_append_loop
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_24 ## cursor
+ P1_LD_R1_R3_8 ## base
+ P1_LI_BR
+ &prim_append_done
+ P1_BEQ_R0_R1
+ P1_ADDI_R0_R0_NEG8
+ P1_ST_R0_R3_24
+ P1_LD_R1_R0_0 ## r1 = arg at cursor
+ P1_LD_R2_R3_16 ## r2 = result
+ P1_LI_BR
+ &append_one
+ P1_CALL
+ P1_MOV_R3_SP
+ P1_ST_R0_R3_16
+ P1_LI_BR
+ &prim_append_loop
+ P1_B
+:prim_append_done
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_16
+ P1_EPILOGUE_N3
+ P1_RET
+:prim_append_zero
+ P1_LI_R0
+ NIL
+ P1_EPILOGUE_N3
+ P1_RET
+
+
+## (reverse lst) — single-pass cons-reverse onto nil accumulator.
+:prim_reverse
+ P1_PROLOGUE_N2
+ P1_LD_R0_R2_0
+ P1_MOV_R3_SP
+ P1_ST_R0_R3_8 ## slot1 = current
+ P1_LI_R0
+ %7
+ P1_ST_R0_R3_16 ## slot2 = accumulator (nil)
+:prim_reverse_loop
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_8
+ P1_LI_R1
+ %7
+ P1_LI_BR
+ &prim_reverse_done
+ P1_BEQ_R0_R1
+ P1_ADDI_R0_R0_NEG2
+ P1_LD_R1_R0_0 ## r1 = car
+ P1_LD_R2_R0_8 ## r2 = cdr (next current)
+ P1_MOV_R3_SP
+ P1_ST_R2_R3_8 ## slot1 = next
+ P1_LD_R2_R3_16 ## r2 = accumulator
+ P1_LI_BR
+ &cons
+ P1_CALL
+ P1_MOV_R3_SP
+ P1_ST_R0_R3_16
+ P1_LI_BR
+ &prim_reverse_loop
+ P1_B
+:prim_reverse_done
+ P1_MOV_R3_SP
+ P1_LD_R0_R3_16
+ P1_EPILOGUE_N2
+ P1_RET
+
+
+## (assoc key alist) — eq?-keyed alist lookup. Returns the matched
+## (key . val) cell or #f.
+:prim_assoc
+ P1_LD_R3_R2_0 ## r3 = key
+ P1_LD_R0_R2_8 ## r0 = alist cursor
+:prim_assoc_loop
+ P1_LI_R1
+ %7
+ P1_LI_BR
+ &prim_assoc_miss
+ P1_BEQ_R0_R1
+ P1_ADDI_R1_R0_NEG2 ## raw alist cell
+ P1_LD_R2_R1_0 ## r2 = inner pair (tagged)
+ P1_ADDI_R2_R2_NEG2
+ P1_LD_R2_R2_0 ## r2 = candidate key
+ P1_LI_BR
+ &prim_assoc_hit
+ P1_BEQ_R2_R3
+ P1_LD_R0_R1_8 ## advance alist
+ P1_LI_BR
+ &prim_assoc_loop
+ P1_B
+:prim_assoc_hit
+ P1_LD_R0_R1_0 ## return inner pair
+ P1_RET
+:prim_assoc_miss
+ P1_LI_R0
+ %23
+ P1_RET
+
+
+## (member x lst) — eq?-keyed; returns the first sublist whose car
+## equals x, else #f.
+:prim_member
+ P1_LD_R3_R2_0 ## r3 = needle
+ P1_LD_R0_R2_8 ## r0 = list cursor
+:prim_member_loop
+ P1_LI_R1
+ %7
+ P1_LI_BR
+ &prim_member_miss
+ P1_BEQ_R0_R1
+ P1_ADDI_R1_R0_NEG2
+ P1_LD_R2_R1_0 ## r2 = car
+ P1_LI_BR
+ &prim_member_hit
+ P1_BEQ_R2_R3
+ P1_LD_R0_R1_8 ## next sublist (tagged)
+ P1_LI_BR
+ &prim_member_loop
+ P1_B
+:prim_member_hit
+ P1_RET ## r0 already = current sublist
+:prim_member_miss
+ P1_LI_R0
+ %23
P1_RET
@@ -3192,7 +4061,7 @@
P1_ST_R2_R3_16 ## slot 2 = env
P1_LI_R2
- '07000000'
+ %7
P1_LI_BR
&eval_self_slot1
P1_BEQ_R1_R2
@@ -3200,19 +4069,19 @@
P1_ANDI_R1_R1_7 ## r1 = tag
P1_LI_R2
- '01000000'
+ %1
P1_LI_BR
&eval_self_slot1
P1_BEQ_R1_R2 ## fixnum
P1_LI_R2
- '05000000'
+ %5
P1_LI_BR
&eval_sym
P1_BEQ_R1_R2
P1_LI_R2
- '02000000'
+ %2
P1_LI_BR
&eval_pair
P1_BEQ_R1_R2
@@ -3356,7 +4225,7 @@
P1_CALL ## r0 = cond value
P1_LI_R1
- '07000000'
+ %7
P1_LI_BR
&eval_if_else
P1_BEQ_R0_R1
@@ -3410,7 +4279,7 @@
P1_MOV_R3_SP
P1_LD_R1_R3_8
P1_LI_R2
- '07000000'
+ %7
P1_LI_BR
&eval_begin_empty
P1_BEQ_R1_R2 ## cursor == nil → empty begin → nil
@@ -3421,7 +4290,7 @@
P1_CALL ## r0 = next
P1_LI_R1
- '07000000'
+ %7
P1_LI_BR
&eval_begin_tail
P1_BEQ_R0_R1 ## next == nil → tail-eval last form
@@ -3464,7 +4333,7 @@
:eval_begin_empty
P1_LI_R0
- '07000000'
+ %7
P1_EPILOGUE_N3
P1_RET
@@ -3544,7 +4413,7 @@
P1_CALL
P1_LI_R0
- '07000000'
+ %7
P1_EPILOGUE_N3
P1_RET
@@ -3554,7 +4423,7 @@
P1_LI_R1
&msg_unbound
P1_LI_R2
- '0E000000' ## strlen("unbound symbol") == 14
+ %14 ## strlen("unbound symbol") == 14
P1_LI_BR
&error
P1_B
@@ -3563,7 +4432,7 @@
P1_LI_R1
&msg_arity
P1_LI_R2
- '0E000000' ## strlen("arity mismatch") == 14
+ %14 ## strlen("arity mismatch") == 14
P1_LI_BR
&error
P1_B
@@ -3572,7 +4441,7 @@
P1_LI_R1
&msg_not_callable
P1_LI_R2
- '0C000000' ## strlen("not callable") == 12
+ %12 ## strlen("not callable") == 12
P1_LI_BR
&error
P1_B
@@ -3581,7 +4450,7 @@
P1_LI_R1
&msg_too_many_args
P1_LI_R2
- '15000000' ## strlen("primitive argc > 32") == 21
+ %21 ## strlen("primitive argc > 32") == 21
P1_LI_BR
&error
P1_B
@@ -3590,7 +4459,16 @@
P1_LI_R1
&msg_bad_prim
P1_LI_R2
- '14000000' ## strlen("unknown primitive id") == 20
+ %20 ## strlen("unknown primitive id") == 20
+ P1_LI_BR
+ &error
+ P1_B
+
+:err_path_too_long
+ P1_LI_R1
+ &msg_path_too_long
+ P1_LI_R2
+ %18
P1_LI_BR
&error
P1_B
@@ -3630,6 +4508,8 @@
"primitive argc > 32"
:msg_bad_prim
"unknown primitive id"
+:msg_path_too_long
+"file path too long"
## Interned name samples used by the self-test.
:str_foo
@@ -3710,6 +4590,35 @@
:str_prim_eqp
"eq?"
+## Step-10d list-core names.
+:str_prim_cons
+"cons"
+:str_prim_car
+"car"
+:str_prim_cdr
+"cdr"
+:str_prim_pairp
+"pair?"
+:str_prim_nullp
+"null?"
+:str_prim_list
+"list"
+:str_prim_length
+"length"
+:str_prim_listp
+"list?"
+:str_prim_append
+"append"
+:str_prim_reverse
+"reverse"
+:str_prim_assoc
+"assoc"
+:str_prim_member
+"member"
+
+:prelude_src
+""
+
## Registration table. 40-byte records: ptr(8) + len(8) + code_id(8) +
## type(8) + arity(8). End-sentinel = zero name pointer. _start iterates
@@ -3717,227 +4626,472 @@
:prim_table
## (+ ...) variadic
&str_prim_plus
-'00000000'
-'0100000000000000'
-'0000000000000000'
-'0600000000000000'
-'0000000000000000'
+%0
+%1
+%0
+%0
+%0
+%6
+%0
+%0
+%0
## (- x ...) variadic (fixes unary-negate branch in body)
&str_prim_minus
-'00000000'
-'0100000000000000'
-'0100000000000000'
-'0600000000000000'
-'0000000000000000'
+%0
+%1
+%0
+%1
+%0
+%6
+%0
+%0
+%0
## (* ...) variadic
&str_prim_mul
-'00000000'
-'0100000000000000'
-'0200000000000000'
-'0600000000000000'
-'0000000000000000'
+%0
+%1
+%0
+%2
+%0
+%6
+%0
+%0
+%0
## (/ x y) fixed 2
&str_prim_div
-'00000000'
-'0100000000000000'
-'0300000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%1
+%0
+%3
+%0
+%5
+%0
+%2
+%0
## (% x y) fixed 2
&str_prim_mod
-'00000000'
-'0100000000000000'
-'0400000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%1
+%0
+%4
+%0
+%5
+%0
+%2
+%0
## (= x y) fixed 2
&str_prim_numeq
-'00000000'
-'0100000000000000'
-'0500000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%1
+%0
+%5
+%0
+%5
+%0
+%2
+%0
## (< x y) fixed 2
&str_prim_lt
-'00000000'
-'0100000000000000'
-'0600000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%1
+%0
+%6
+%0
+%5
+%0
+%2
+%0
## (> x y) fixed 2
&str_prim_gt
-'00000000'
-'0100000000000000'
-'0700000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%1
+%0
+%7
+%0
+%5
+%0
+%2
+%0
## (<= x y) fixed 2
&str_prim_le
-'00000000'
-'0200000000000000'
-'0800000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%2
+%0
+%8
+%0
+%5
+%0
+%2
+%0
## (>= x y) fixed 2
&str_prim_ge
-'00000000'
-'0200000000000000'
-'0900000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%2
+%0
+%9
+%0
+%5
+%0
+%2
+%0
## (zero? x) fixed 1
&str_prim_zerop
-'00000000'
-'0500000000000000'
-'0A00000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%5
+%0
+%10
+%0
+%5
+%0
+%1
+%0
## (negative? x) fixed 1
&str_prim_negativep
-'00000000'
-'0900000000000000'
-'0B00000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%9
+%0
+%11
+%0
+%5
+%0
+%1
+%0
## (positive? x) fixed 1
&str_prim_positivep
-'00000000'
-'0900000000000000'
-'0C00000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%9
+%0
+%12
+%0
+%5
+%0
+%1
+%0
## (abs x) fixed 1
&str_prim_abs
-'00000000'
-'0300000000000000'
-'0D00000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%3
+%0
+%13
+%0
+%5
+%0
+%1
+%0
## (min ...) variadic — arity 0 ignored, but ≥1 enforced by body load
&str_prim_min
-'00000000'
-'0300000000000000'
-'0E00000000000000'
-'0600000000000000'
-'0000000000000000'
+%0
+%3
+%0
+%14
+%0
+%6
+%0
+%0
+%0
## (max ...) variadic
&str_prim_max
-'00000000'
-'0300000000000000'
-'0F00000000000000'
-'0600000000000000'
-'0000000000000000'
+%0
+%3
+%0
+%15
+%0
+%6
+%0
+%0
+%0
## (bit-and ...) variadic
&str_prim_bitand
-'00000000'
-'0700000000000000'
-'1000000000000000'
-'0600000000000000'
-'0000000000000000'
+%0
+%7
+%0
+%16
+%0
+%6
+%0
+%0
+%0
## (bit-or ...) variadic
&str_prim_bitor
-'00000000'
-'0600000000000000'
-'1100000000000000'
-'0600000000000000'
-'0000000000000000'
+%0
+%6
+%0
+%17
+%0
+%6
+%0
+%0
+%0
## (bit-xor ...) variadic
&str_prim_bitxor
-'00000000'
-'0700000000000000'
-'1200000000000000'
-'0600000000000000'
-'0000000000000000'
+%0
+%7
+%0
+%18
+%0
+%6
+%0
+%0
+%0
## (bit-not x) fixed 1
&str_prim_bitnot
-'00000000'
-'0700000000000000'
-'1300000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%7
+%0
+%19
+%0
+%5
+%0
+%1
+%0
## (arithmetic-shift n k) fixed 2
&str_prim_ashift
-'00000000'
-'1000000000000000'
-'1400000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%16
+%0
+%20
+%0
+%5
+%0
+%2
+%0
## (number? x) fixed 1
&str_prim_numberp
-'00000000'
-'0700000000000000'
-'1500000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%7
+%0
+%21
+%0
+%5
+%0
+%1
+%0
## (symbol? x) fixed 1
&str_prim_symbolp
-'00000000'
-'0700000000000000'
-'1600000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%7
+%0
+%22
+%0
+%5
+%0
+%1
+%0
## (string? x) fixed 1
&str_prim_stringp
-'00000000'
-'0700000000000000'
-'1700000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%7
+%0
+%23
+%0
+%5
+%0
+%1
+%0
## (vector? x) fixed 1
&str_prim_vectorp
-'00000000'
-'0700000000000000'
-'1800000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%7
+%0
+%24
+%0
+%5
+%0
+%1
+%0
## (procedure? x) fixed 1
&str_prim_procp
-'00000000'
-'0A00000000000000'
-'1900000000000000'
-'0500000000000000'
-'0100000000000000'
+%0
+%10
+%0
+%25
+%0
+%5
+%0
+%1
+%0
## (eq? x y) fixed 2
&str_prim_eqp
-'00000000'
-'0300000000000000'
-'1A00000000000000'
-'0500000000000000'
-'0200000000000000'
+%0
+%3
+%0
+%26
+%0
+%5
+%0
+%2
+%0
+## (cons a d) fixed 2
+&str_prim_cons
+%0
+%4
+%0
+%27
+%0
+%5
+%0
+%2
+%0
+## (car p) fixed 1
+&str_prim_car
+%0
+%3
+%0
+%28
+%0
+%5
+%0
+%1
+%0
+## (cdr p) fixed 1
+&str_prim_cdr
+%0
+%3
+%0
+%29
+%0
+%5
+%0
+%1
+%0
+## (pair? x) fixed 1
+&str_prim_pairp
+%0
+%5
+%0
+%30
+%0
+%5
+%0
+%1
+%0
+## (null? x) fixed 1
+&str_prim_nullp
+%0
+%5
+%0
+%31
+%0
+%5
+%0
+%1
+%0
+## (list ...) variadic
+&str_prim_list
+%0
+%4
+%0
+%32
+%0
+%6
+%0
+%0
+%0
+## (length lst) fixed 1
+&str_prim_length
+%0
+%6
+%0
+%33
+%0
+%5
+%0
+%1
+%0
+## (list? x) fixed 1
+&str_prim_listp
+%0
+%5
+%0
+%34
+%0
+%5
+%0
+%1
+%0
+## (append ...) variadic
+&str_prim_append
+%0
+%6
+%0
+%35
+%0
+%6
+%0
+%0
+%0
+## (reverse lst) fixed 1
+&str_prim_reverse
+%0
+%7
+%0
+%36
+%0
+%5
+%0
+%1
+%0
+## (assoc key alist) fixed 2
+&str_prim_assoc
+%0
+%5
+%0
+%37
+%0
+%5
+%0
+%2
+%0
+## (member x lst) fixed 2
+&str_prim_member
+%0
+%6
+%0
+%38
+%0
+%5
+%0
+%2
+%0
## End sentinel: zero name pointer.
-'0000000000000000'
-'0000000000000000'
-'0000000000000000'
-'0000000000000000'
-'0000000000000000'
+%0
+%0
+%0
+%0
+%0
+%0
+%0
+%0
+%0
+%0
## ---- Special-form symbol slots --------------------------------------
## Zero-initialized; _start populates each slot with the interned
## tagged-symbol pointer so eval_pair can dispatch by pointer identity.
:sym_quote
-'00000000'
-'00000000'
+%0
+%0
:sym_if
-'00000000'
-'00000000'
+%0
+%0
:sym_begin
-'00000000'
-'00000000'
+%0
+%0
:sym_lambda
-'00000000'
-'00000000'
+%0
+%0
:sym_define
-'00000000'
-'00000000'
+%0
+%0
## Global-binding alist head. Zero-initialized (which is a valid
## untagged pair/nil sentinel? No — nil = 0x07. Seed to nil on entry
## from _start; the zero here would be interpreted as a pair pointer
## otherwise).
:global_env_cell
-'07000000'
-'00000000'
+NIL
+%0
## ---- Primitive argv scratch buffer (32 slots × 8B = 256B) -----------
@@ -3946,532 +5100,597 @@
## primitives need more. Zeroed so a stray read sees the 0 tagged
## sentinel (not a valid value — harmless).
:prim_argv
-'0000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+
+## Reader-state save area for eval_source().
+:saved_src_base
+%0
+%0
+:saved_src_len
+%0
+%0
+:saved_src_cursor
+%0
+%0
+:saved_src_line
+%0
+%0
+:saved_src_col
+%0
+%0
+
+## Shared buffers for pathname marshaling, string literal decoding, and
+## file I/O primitives.
+:path_buf
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+
+:reader_string_buf
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+
+:io_buf
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
+ZERO32
## ---- Symbol table (4096 slots × 8 bytes = 32 KiB) -------------------
## Open-addressing hash table. Empty slot = 0 (no valid tagged value
## is 0). LISP.md §GC §Roots makes this a named BSS root.
:symbol_table
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
:symbol_table_end
@@ -4479,262 +5698,262 @@
## Step 9 will grow this to 20 MiB via ELF memsz > filesz; for now a
## file-inlined block is fine (makes the binary ~50 KiB).
:heap_start
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
-'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'0000000000000000000000000000000000000000000000000000000000000000'
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
+ZERO32 ZERO32 ZERO32
+ZERO32
:heap_tail
@@ -4744,262 +5963,262 @@
## Kept out of the Scheme heap so the reader's raw byte pointers don't
## fight the bump allocator.
:src_buf
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
-'00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
+ZERO32 ZERO32
:src_buf_end
diff --git a/src/p1_gen.py b/src/p1_gen.py
@@ -428,6 +428,21 @@ class AA64(Encoder):
br = le32(0xD61F0000 | (NAT_AA64['br'] << 5))
return cmp_ + bcond + br
+ def condbz(self, op, rA):
+ # Branch-if-zero family. BEQZ/BNEZ use CBZ/CBNZ (skip br on
+ # the inverse cond); BLTZ falls back to CMP+B.GE since there's
+ # no single signed-less-than-zero insn.
+ a = NAT_AA64[rA]
+ br = le32(0xD61F0000 | (NAT_AA64['br'] << 5))
+ if op == 'BEQZ':
+ return le32(0xB5000000 | (2 << 5) | a) + br # CBNZ rA, +8 ; BR
+ if op == 'BNEZ':
+ return le32(0xB4000000 | (2 << 5) | a) + br # CBZ rA, +8 ; BR
+ if op == 'BLTZ':
+ cmp_ = le32(0xEB000000 | (31 << 16) | (a << 5) | 31) # SUBS xzr, rA, xzr
+ bge = le32(0x54000040 | 10) # b.ge +8
+ return cmp_ + bge + br
+
def call(self):
return le32(0xD63F0000 | (NAT_AA64['br'] << 5)) # BLR x17
@@ -541,6 +556,14 @@ class AMD64(Encoder):
jop = {'BEQ': '75', 'BNE': '74', 'BLT': '7D'}[op]
return cmp_ + jop + '03' + '41FFE3' # jmp r11
+ def condbz(self, op, rA):
+ a = NAT_AMD64[rA]
+ # test rA, rA — 85 /r with rA in both slots; sets ZF iff rA == 0,
+ # SF iff rA < 0. Same skip+jmp pattern as condb.
+ test_ = rex(1, a >> 3, 0, a >> 3) + '85' + modrm(3, a, a)
+ jop = {'BEQZ': '75', 'BNEZ': '74', 'BLTZ': '7D'}[op]
+ return test_ + jop + '03' + '41FFE3' # jmp r11
+
def call(self):
return '41FFD3' # call r11
@@ -616,6 +639,15 @@ class RV64(Encoder):
jalr = 0x00000067 | (NAT_RV64['br'] << 15)
return le32(insn) + le32(jalr)
+ def condbz(self, op, rA):
+ # Same shape as condb but rs2 = x0 (zero reg). BEQZ/BNEZ/BLTZ
+ # invert the same way (BNE/BEQ/BGE).
+ a = NAT_RV64[rA]
+ funct3 = {'BEQZ': 1, 'BNEZ': 0, 'BLTZ': 5}[op]
+ insn = 0x00000063 | (funct3 << 12) | (a << 15) | (0 << 20) | (8 << 7)
+ jalr = 0x00000067 | (NAT_RV64['br'] << 15)
+ return le32(insn) + le32(jalr)
+
def call(self):
return le32(0x000000E7 | (NAT_RV64['br'] << 15)) # jalr ra, 0(t5)
@@ -731,6 +763,13 @@ class CondB(Op):
return enc.condb(self.op, self.rA, self.rB)
@dataclass
+class CondBZ(Op):
+ op: str = '' # BEQZ / BNEZ / BLTZ
+ rA: str = ''
+ def encode(self, enc):
+ return enc.condbz(self.op, self.rA)
+
+@dataclass
class Literal(Op):
hex_by_arch: Optional[dict] = None
def encode(self, enc):
@@ -848,8 +887,8 @@ SYS_NUM = {
## ---------- Canonical imm/offset/shamt sets -----------------------------
## Enumerated instead of sigil-passed: M1's DEFINE substitutes hex
## bytes verbatim, so every distinct imm value needs its own DEFINE.
-## These cover every value used across hello/demo/lisp/kaem-minimal
-## plus a little headroom. Extend when a new value appears in P1 src.
+## These cover every value used across hello/demo/lisp plus a little
+## headroom. Extend when a new value appears in P1 src.
## ADDI imms. NEG48/48 handle the ASCII '0' bias; the rest cover tag
## stripping, loop counters, and — at 40 — the primitive-registration
@@ -860,7 +899,7 @@ ADDI_IMMS = (-48, -8, -7, -6, -5, -4, -3, -2, -1,
## Shift amounts (for SHLI/SHRI/SARI). 32/52 implement low-N-bit masks
## (length field extraction; 4096-slot symbol-table index); the small
## values scale-by-N for byte offsets and fixnum encode/decode.
-SHIFT_IMMS = (1, 2, 3, 5, 16, 32, 52)
+SHIFT_IMMS = (1, 2, 3, 5, 13, 16, 32, 52)
## ANDI/ORI imms. Every entry must appear in AA64_LOGI_ENC.
LOGI_IMMS = (1, 2, 3, 4, 6, 7, 8)
@@ -871,17 +910,17 @@ LOGI_IMMS = (1, 2, 3, 4, 6, 7, 8)
## below the current base.
MEM_OFFS = (-8, 0, 7, 8, 16, 24, 32)
-CONDB_OPS = ('BEQ', 'BNE', 'BLT')
-SHIFT_OPS = ('SHLI', 'SHRI', 'SARI')
-LOGI_OPS = ('ANDI', 'ORI')
-MEM_OPS = ('LD', 'ST', 'LB', 'SB')
+CONDB_OPS = ('BEQ', 'BNE', 'BLT')
+CONDBZ_OPS = ('BEQZ', 'BNEZ', 'BLTZ')
+SHIFT_OPS = ('SHLI', 'SHRI', 'SARI')
+LOGI_OPS = ('ANDI', 'ORI')
+MEM_OPS = ('LD', 'ST', 'LB', 'SB')
## Curated RRR triples. The full cube is 11 ops × 8³ regs = 5632
## entries per arch — >99% would be dead weight. Each tuple below
-## is one actually used by hello/demo/lisp/kaem-minimal. Lint
-## catches missing triples on assembly; add a line here and
-## regenerate.
+## is one actually used by hello/demo/lisp. Lint catches missing
+## triples on assembly; add a line here and regenerate.
RRR_TABLE = (
# demo/lisp step-1 arith cube
('ADD','r1','r1','r2'), ('ADD','r1','r1','r4'),
@@ -898,6 +937,8 @@ RRR_TABLE = (
('SAR','r4','r4','r2'),
# alloc / pointer arithmetic
('ADD','r2','r0','r1'),
+ ('ADD','r0','r0','r1'),
+ ('ADD','r0','r0','r2'),
('ADD','r0','r0','r3'),
('ADD','r2','r2','r0'),
('ADD','r2','r2','r1'),
@@ -909,7 +950,8 @@ RRR_TABLE = (
('SUB','r2','r1','r6'),
('SUB','r3','r1','r6'),
('REM','r1','r1','r2'),
- # kaem-minimal bump-pointer + accumulator updates
+ # bump-pointer + accumulator updates (originally kaem-minimal;
+ # retained in case lisp uses them — lint catches dead entries)
('ADD','r1','r1','r0'),
('ADD','r5','r5','r0'),
('ADD','r7','r7','r0'),
@@ -921,7 +963,7 @@ RRR_TABLE = (
# (r3 = r0 - r3) with r0 = 0 or -1. arithmetic-shift k-negate:
# (r0 = r1 - r0) with r1 = 0 after argc is consumed.
('ADD','r3','r3','r0'),
- ## ('SUB','r3','r3','r0') — already above (kaem-minimal row)
+ ## ('SUB','r3','r3','r0') — already above
('SUB','r3','r0','r3'),
('SUB','r0','r1','r0'),
('MUL','r3','r3','r0'),
@@ -1004,6 +1046,14 @@ def rows():
R.append(Mem(name=f'{op}_{rt.upper()}_{rn.upper()}_{_imm_suf(off)}',
op=op, rT=rt, rN=rn, off=off))
+ # --- SP-relative memory: LD/ST/LB/SB × P1_REGS × MEM_OFFS ---
+ # Lets callees touch PROLOGUE_N* frame slots directly, skipping the
+ # MOV_Rk_SP trampoline that previously bridged P1 regs to sp-base.
+ R.append(Banner('LD / ST / LB / SB — SP-base × MEM_OFFS'))
+ for op, rt, off in product(MEM_OPS, P1_REGS, MEM_OFFS):
+ R.append(Mem(name=f'{op}_{rt.upper()}_SP_{_imm_suf(off)}',
+ op=op, rT=rt, rN='sp', off=off))
+
# --- Branches: BEQ/BNE/BLT × full reg product + unconditional B ---
R.append(Banner('Branches — LI_BR-indirect pattern'))
R.append(B(name='B'))
@@ -1011,6 +1061,13 @@ def rows():
R.append(CondB(name=f'{op}_{a.upper()}_{b.upper()}',
op=op, rA=a, rB=b))
+ # --- Zero-compare branches: BEQZ/BNEZ/BLTZ × P1_REGS ---
+ # Compare-with-zero is the common case (null pointer, fd<0, EOF,
+ # loop-count exhausted), so we give it a single-insn path that
+ # doesn't consume a scratch reg for the zero operand.
+ for op, a in product(CONDBZ_OPS, P1_REGS):
+ R.append(CondBZ(name=f'{op}_{a.upper()}', op=op, rA=a))
+
# --- Control: CALL / RET / PROLOGUE / EPILOGUE / TAIL (Nk = 1..4) ---
R.append(Banner('Control: CALL/RET + single-slot and N-slot PROLOGUE/EPILOGUE/TAIL'))
R.append(Prologue(name='PROLOGUE', k=1))
diff --git a/tests/lisp/11-list.expected b/tests/lisp/11-list.expected
@@ -0,0 +1 @@
+42
diff --git a/tests/lisp/11-list.scm b/tests/lisp/11-list.scm
@@ -0,0 +1,25 @@
+;; List core: cons car cdr pair? null? list length list? append reverse
+;; assoc member.
+(if (pair? (cons 1 2))
+ (if (= (car (cons 1 2)) 1)
+ (if (= (cdr (cons 1 2)) 2)
+ (if (null? (quote ()))
+ (if (if (null? (cons 1 2)) 0 1)
+ (if (if (pair? (quote ())) 0 1)
+ (if (= (length (list 1 2 3 4)) 4)
+ (if (= (length (quote ())) 0)
+ (if (list? (list 1 2 3))
+ (if (list? (quote ()))
+ (if (if (list? 42) 0 1)
+ (if (= (length (append (list 1 2) (list 3 4))) 4)
+ (if (= (car (append (list 1 2) (list 3 4))) 1)
+ (if (= (length (reverse (list 1 2 3))) 3)
+ (if (= (car (reverse (list 1 2 3))) 3)
+ (if (= (cdr (assoc (quote b)
+ (list (cons (quote a) 1)
+ (cons (quote b) 2)))) 2)
+ (if (if (assoc (quote z)
+ (list (cons (quote a) 1))) 0 1)
+ (if (= (car (member 3 (list 1 2 3 4))) 3)
+ (if (if (member 99 (list 1 2 3)) 0 1)
+ 42 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0)
diff --git a/tests/lisp/12-string.expected b/tests/lisp/12-string.expected
@@ -0,0 +1 @@
+42
diff --git a/tests/lisp/12-string.scm b/tests/lisp/12-string.scm
@@ -0,0 +1,9 @@
+;; String core: string-length string-ref substring string-append
+;; string->symbol symbol->string and equal? on strings.
+(if (= (string-length "abcd") 4)
+ (if (= (string-ref "abcd" 2) 99)
+ (if (equal? (substring "abcdef" 1 4) "bcd")
+ (if (equal? (string-append "ab" "cd" "") "abcd")
+ (if (eq? (string->symbol "foo") (quote foo))
+ (if (equal? (symbol->string (quote bar)) "bar")
+ 42 0) 0) 0) 0) 0)
diff --git a/tests/lisp/13-vector.expected b/tests/lisp/13-vector.expected
@@ -0,0 +1 @@
+42
diff --git a/tests/lisp/13-vector.scm b/tests/lisp/13-vector.scm
@@ -0,0 +1,10 @@
+;; Vector core: make-vector vector-ref vector-set! vector-length
+;; vector->list list->vector.
+(define v (make-vector 3 0))
+(vector-set! v 1 7)
+(if (= (vector-length v) 3)
+ (if (= (vector-ref v 1) 7)
+ (if (equal? (vector->list v) (list 0 7 0))
+ (if (equal? (vector->list (list->vector (list 1 2 3)))
+ (list 1 2 3))
+ 42 0) 0) 0) 0)
diff --git a/tests/lisp/14-io.expected b/tests/lisp/14-io.expected
@@ -0,0 +1,4 @@
+"io:"
+abc
+ok "qq" 7
+42
diff --git a/tests/lisp/14-io.scm b/tests/lisp/14-io.scm
@@ -0,0 +1,12 @@
+;; I/O surface: display write newline format read-file write-file.
+(write "io:")
+(newline)
+(display "abc")
+(newline)
+(format "~a ~s ~d~%" (quote ok) "qq" 7)
+(write-file "build/io-out.txt" "done")
+(if (equal? (read-file "tests/lisp/io-read.txt") "seed")
+ (if (equal? (read-file "build/io-out.txt") "done")
+ 42
+ 0)
+ 0)
diff --git a/tests/lisp/15-list.expected b/tests/lisp/15-list.expected
@@ -0,0 +1 @@
+42
diff --git a/tests/lisp/15-list.scm b/tests/lisp/15-list.scm
@@ -0,0 +1,30 @@
+;; Step-10d list-core primitives:
+;; cons car cdr pair? null? list length list? append reverse assoc member.
+;;
+;; `list?` walks to nil with no cycle check (per §equal? policy);
+;; `assoc`/`member` use eq? (pointer identity) — fine for symbols and
+;; small fixnums in this seed. The (if (if X 0 1) NEXT 0) idiom asserts
+;; that X is #f.
+(if (pair? (cons 1 2))
+ (if (= (car (cons 1 2)) 1)
+ (if (= (cdr (cons 1 2)) 2)
+ (if (null? (quote ()))
+ (if (if (null? (cons 1 2)) 0 1)
+ (if (if (pair? (quote ())) 0 1)
+ (if (= (length (list 1 2 3 4)) 4)
+ (if (= (length (quote ())) 0)
+ (if (list? (list 1 2 3))
+ (if (list? (quote ()))
+ (if (if (list? 42) 0 1)
+ (if (= (length (append (list 1 2) (list 3 4))) 4)
+ (if (= (car (append (list 1 2) (list 3 4))) 1)
+ (if (= (length (reverse (list 1 2 3))) 3)
+ (if (= (car (reverse (list 1 2 3))) 3)
+ (if (= (cdr (assoc (quote b)
+ (list (cons (quote a) 1)
+ (cons (quote b) 2)))) 2)
+ (if (if (assoc (quote z)
+ (list (cons (quote a) 1))) 0 1)
+ (if (= (car (member 3 (list 1 2 3 4))) 3)
+ (if (if (member 99 (list 1 2 3)) 0 1)
+ 42 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0)
diff --git a/tests/lisp/15-pred.expected b/tests/lisp/15-pred.expected
@@ -0,0 +1 @@
+42
diff --git a/tests/lisp/15-pred.scm b/tests/lisp/15-pred.scm
@@ -0,0 +1,11 @@
+;; Predicates, equal?, and Scheme-level apply.
+(if (number? 1)
+ (if (symbol? (quote foo))
+ (if (string? "x")
+ (if (vector? (make-vector 1 0))
+ (if (procedure? +)
+ (if (eq? (quote foo) (string->symbol "foo"))
+ (if (equal? (list 1 (cons 2 3))
+ (list 1 (cons 2 3)))
+ (if (= (apply + 1 2 (list 3 4)) 10)
+ 42 0) 0) 0) 0) 0) 0) 0)
diff --git a/tests/lisp/16-prelude.expected b/tests/lisp/16-prelude.expected
@@ -0,0 +1 @@
+42
diff --git a/tests/lisp/16-prelude.scm b/tests/lisp/16-prelude.scm
@@ -0,0 +1,7 @@
+;; Prelude gate: map filter fold are embedded and evaluated before the
+;; user program starts.
+(if (= (car (map (lambda (x) (+ x 1)) (list 1 2 3))) 2)
+ (if (= (car (cdr (map (lambda (x) (+ x 1)) (list 1 2 3)))) 3)
+ (if (= (length (filter positive? (list 0 3 4))) 2)
+ (if (= (fold + 0 (list 1 2 3 4)) 10)
+ 42 0) 0) 0) 0)
diff --git a/tests/lisp/io-read.txt b/tests/lisp/io-read.txt
@@ -0,0 +1 @@
+seed