cleanup, compilation semantics
[watForth.git] / forth.wat
index 61cbb22..666cc81 100644 (file)
--- a/forth.wat
+++ b/forth.wat
   (import "env" "sys_fetch" (func $sys_fetch (param i32 i32) (result i32)))
   (import "env" "sys_listen" (func $sys_listen (param i32) (result i32)))  
   (import "env" "sys_write" (func $sys_write (param i32 i32 i32) (result i32)))
   (import "env" "sys_fetch" (func $sys_fetch (param i32 i32) (result i32)))
   (import "env" "sys_listen" (func $sys_listen (param i32) (result i32)))  
   (import "env" "sys_write" (func $sys_write (param i32 i32 i32) (result i32)))
-  (import "env" "sys_echo" (func $sys_echo (param i32)))
+  (import "env" "sys_echo" (func $sys_echo (param i32 i32)))
   (import "env" "sys_echochar" (func $sys_echochar (param i32)))  
   (import "env" "sys_reflect" (func $sys_reflect (param i32)))
   (import "env" "vocab_get" (func $vocab_get (param i32 i32) (result i32)))
   (import "env" "vocab_set" (func $vocab_set (param i32 i32 i32)))
   (import "env" "sys_echochar" (func $sys_echochar (param i32)))  
   (import "env" "sys_reflect" (func $sys_reflect (param i32)))
   (import "env" "vocab_get" (func $vocab_get (param i32 i32) (result i32)))
   (import "env" "vocab_set" (func $vocab_set (param i32 i32 i32)))
-  (import "env" "does_get" (func $does_get (param i32) (result i32)))
-  (import "env" "does_set" (func $does_set (param i32 i32)))
+  (import "env" "does_get" (func $does_get (param i32 i32) (result i32)))
+  (import "env" "does_set" (func $does_set (param i32 i32 i32)))
   (import "env" "is_whitespace" (func $is_whitespace (param i32) (result i32)))
   (import "env" "sys_parsenum" (func $sys_parsenum (param i32 i32 i32) (result i32)))
   (import "env" "sys_stack" (func $sys_stack))
   (import "env" "is_whitespace" (func $is_whitespace (param i32) (result i32)))
   (import "env" "sys_parsenum" (func $sys_parsenum (param i32 i32 i32) (result i32)))
   (import "env" "sys_stack" (func $sys_stack))
     i32.const 14340
     i32.load
     set_local $here
     i32.const 14340
     i32.load
     set_local $here
+    (; Load "start" into esi, then restore "start" to "quit" ;)
     i32.const 14344
     i32.load
     set_local $esi
     i32.const 14344
     i32.load
     set_local $esi
+    i32.const 14344
+    i32.const 16384
+    i32.store
+    (; "start" will be a normal quit, unless cirumvented in this run ;)
     get_global $inbuf_data
     set_local $inbuf_head
     i32.const 14352
     get_global $inbuf_data
     set_local $inbuf_head
     i32.const 14352
       block $words block $here block $dictset block $dup2 block $rot block $drop2
       block $comma block $subtract block $keychan block $sethere block $eqbool
       block $echostring block $strstart block $strput block $strend block $fetchinc
       block $words block $here block $dictset block $dup2 block $rot block $drop2
       block $comma block $subtract block $keychan block $sethere block $eqbool
       block $echostring block $strstart block $strput block $strend block $fetchinc
-      block $setinc block $finddoes block $definedoes
+      block $setinc block $finddoes block $definedoes block $stacktrace
         get_local $eax
         br_table $op0 $ret (;2;)$lit $rinit (;4;)$word $key (;6;)$dup $plus
         (;8;)$jmp $emit (;10;)$fetch $set (;12;)$execute $noop (;14;)$jz $jnz
         get_local $eax
         br_table $op0 $ret (;2;)$lit $rinit (;4;)$word $key (;6;)$dup $plus
         (;8;)$jmp $emit (;10;)$fetch $set (;12;)$execute $noop (;14;)$jz $jnz
         (;28;)$here $dictset (;30;)$dup2 $rot (;32;)$drop2 $comma
         (;34;)$subtract $keychan (;36;)$sethere $eqbool (;38;)$echostring $strstart
         (;40;)$strput $strend (;42;)$fetchinc $setinc (;44;)$finddoes $definedoes
         (;28;)$here $dictset (;30;)$dup2 $rot (;32;)$drop2 $comma
         (;34;)$subtract $keychan (;36;)$sethere $eqbool (;38;)$echostring $strstart
         (;40;)$strput $strend (;42;)$fetchinc $setinc (;44;)$finddoes $definedoes
-        (;46;)$default
+        (;46;)$stacktrace $default
+      end ;; stacktrace
+        call $sys_stack
+        get_local $esi
+        call $sys_reflect
+        br $next
       end ;; definedoes
       end ;; definedoes
+        call $pop
+        call $rpush
         call $pop
         set_local $eax
         call $pop
         get_local $eax
         call $pop
         set_local $eax
         call $pop
         get_local $eax
+        call $rpop
         call $does_set
         br $next
       end ;; finddoes
         call $pop
         call $does_set
         br $next
       end ;; finddoes
         call $pop
+        set_local $eax
+        call $pop
+        get_local $eax
         call $does_get
         call $push
         br $next
         call $does_get
         call $push
         br $next
         br $next
       end ;; emit (.)
         call $pop
         br $next
       end ;; emit (.)
         call $pop
+        i32.const 14348
+        i32.load
         call $sys_echo
         br $next
       end ;; noop2
         call $sys_echo
         br $next
       end ;; noop2