diff --git a/wipforth.wat b/wipforth.wat index a248a78..8191fc9 100644 --- a/wipforth.wat +++ b/wipforth.wat @@ -1119,13 +1119,13 @@ "\64\05\00\00" "\04HERE\00\00\00" "\02\00\00\00" - "\e0\0d\00\00") + "\30\0e\00\00") (data (i32.const 0x058c) "\78\05\00\00" "\06LATEST\00" "\02\00\00\00" - "\b4\0d\00\00") + "\e0\0d\00\00") (data (i32.const 0x05a0) "\8c\05\00\00" @@ -1136,9 +1136,9 @@ (data (i32.const 0x05d0) "\a0\05\00\00" - "\05ERROR\00\00" - "\02\00\00\00" - "\00\00\00\00") + "\07WNFHOOK" + "\01\00\00\00" + "\f0\0d\00\00") ;; And now, it's time for some hand-compiled colon words. It ;; probably would have made more sense to write most of these @@ -1637,11 +1637,8 @@ ;; LIT-CFA , , \ If compiling, append LIT and the value ;; EXIT ;; - ;; \ Word was not found and also not a number. Ideally we'd print the - ;; \ word that wasn't found here but I haven't implemented such things - ;; \ yet so for now we'll just discard the word's length, set ERROR to - ;; \ 1 and exit. - ;; DROP 1 ERROR ! + ;; \ Word was not found + ;; WNFHOOK EXECUTE ;; ; (data (i32.const 0x0ac0) @@ -1686,14 +1683,15 @@ "\5c\0a\00\00" ;; , "\5c\0a\00\00" ;; , "\0c\04\00\00" ;; EXIT - "\18\02\00\00" ;; DROP - "\18\04\00\00" ;; LIT - "\01\00\00\00" ;; 1 - "\dc\05\00\00" ;; ERROR - "\c0\03\00\00" ;; ! + "\dc\05\00\00" ;; WNFHOOK + "\bc\0b\00\00" ;; EXECUTE "\0c\04\00\00") ;; EXIT - ;; => 0xc4 bytes + ;; => 0xb8 bytes + + ;; The previous version of INTERPRET was 0xc4 bytes, so we have 12 + ;; unused bytes here. Could fit an extra codeword definition in + ;; here, if the name is less than 4 bytes long. ;; : QUIT R0 RSP! INTERPRET BRANCH [-8] ; @@ -1928,7 +1926,7 @@ ;; [ ;; ; IMMEDIATE - (data (i32.const 0xdb4) + (data (i32.const 0x0db4) "\78\0d\00\00" "\81;\00\00" "\00\00\00\00" @@ -1943,6 +1941,34 @@ ;; => 0x2c bytes + ;; : WNF-HANDLER + ;; DROP \ Discard word length + ;; 87 EMIT 78 EMIT 70 EMIT 10 EMIT \ Print WNF + ;; QUIT \ Reset return stack + ;; ; + + (data (i32.const 0x0de0) + "\b4\0d\00\00" + "\0bWNF-HANDLER" + "\00\00\00\00" + "\18\02\00\00" ;; DROP + "\18\04\00\00" ;; LIT + "\57\00\00\00" ;; 87 + "\94\04\00\00" ;; EMIT + "\18\04\00\00" ;; LIT + "\4e\00\00\00" ;; 78 + "\94\04\00\00" ;; EMIT + "\18\04\00\00" ;; LIT + "\46\00\00\00" ;; 70 + "\94\04\00\00" ;; EMIT + "\18\04\00\00" ;; LIT + "\0a\00\00\00" ;; 10 + "\94\04\00\00" ;; EMIT + "\90\0b\00\00" ;; QUIT + "\0c\04\00\00") ;; EXIT + + ;; => 0x50 bytes + ;; The trampoline is a workaround for WebAssembly's lack of indirect ;; jumps and code addresses. Instead of jumping into the next ;; codeword, NEXT sets the $fn global to the function index of the