boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs

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:
MMakefile | 10+++++++++-
Msrc/lisp.M1 | 4319+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Msrc/p1_gen.py | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
Atests/lisp/11-list.expected | 1+
Atests/lisp/11-list.scm | 25+++++++++++++++++++++++++
Atests/lisp/12-string.expected | 1+
Atests/lisp/12-string.scm | 9+++++++++
Atests/lisp/13-vector.expected | 1+
Atests/lisp/13-vector.scm | 10++++++++++
Atests/lisp/14-io.expected | 4++++
Atests/lisp/14-io.scm | 12++++++++++++
Atests/lisp/15-list.expected | 1+
Atests/lisp/15-list.scm | 30++++++++++++++++++++++++++++++
Atests/lisp/15-pred.expected | 1+
Atests/lisp/15-pred.scm | 11+++++++++++
Atests/lisp/16-prelude.expected | 1+
Atests/lisp/16-prelude.scm | 7+++++++
Atests/lisp/io-read.txt | 1+
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