Initial
[watForth.git] / forth.wat
1 (module
2 (type $FUNCSIGi (func (result i32)))
3 (type $FUNCSIGii (func (param i32)))
4 (type $FUNCSIGiii (func))
5 (type $FUNCSIGiv (func (param i32 i32) (result i32)))
6 (type $FUNCSIG$v (func (param i32) (result i32)))
7 (import "env" "pop" (func $pop (result i32)))
8 (import "env" "push" (func $push (param i32)))
9 (import "env" "rinit" (func $rinit))
10 (import "env" "rpop" (func $rpop (result i32)))
11 (import "env" "rpush" (func $rpush (param i32)))
12 (import "env" "sys_read" (func $sys_read (param i32 i32) (result i32)))
13 (import "env" "sys_fetch" (func $sys_fetch (param i32 i32) (result i32)))
14 (import "env" "sys_listen" (func $sys_listen (param i32) (result i32)))
15 (import "env" "sys_write" (func $sys_write (param i32 i32) (result i32)))
16 (import "env" "sys_echo" (func $sys_echo (param i32)))
17 (import "env" "sys_echochar" (func $sys_echochar (param i32)))
18 (import "env" "sys_reflect" (func $sys_reflect (param i32)))
19 (import "env" "vocab_get" (func $vocab_get (param i32) (result i32)))
20 (import "env" "vocab_set" (func $vocab_set (param i32) (param i32) (result i32)))
21 (import "env" "is_whitespace" (func $is_whitespace (param i32) (result i32)))
22 (import "env" "sys_parsenum" (func $sys_parsenum (param i32) (result i32)))
23 (import "env" "sys_stack" (func $sys_stack))
24 (import "env" "sys_words" (func $sys_words))
25 (table (;0;) 0 anyfunc)
26 (memory $0 1)
27 (global $inbuf i32 (i32.const 8))
28 (global $inbuf_size i32 (i32.const 12))
29 (global $inbuf_data i32 (i32.const 16))
30 (global $wbuf i32 (i32.const 256))
31 (global $wbuf_data i32 (i32.const 260))
32 (data (i32.const 8) "\f4\00\00\00") ;; STDIN buf, 244 len
33 (data (i32.const 256) "\7c\00\00\00") ;; WBUF, 124 len
34 (data (i32.const 384) "\20\03\00\00") ;; MODE
35 (data (i32.const 388) "\18\04\00\00") ;; HERE
36 (data (i32.const 392) "\58\02\00\00") ;; START
37 (data (i32.const 396) "\0a\00\00\00") ;; BASE
38 (; Interpret ;)
39 (data (i32.const 512) "\b8\02\00\00") ;; WORD xt (696)
40 (data (i32.const 516) "\06\00\00\00") ;; DUP
41 (data (i32.const 520) "\0a\00\00\00") ;; @
42 (data (i32.const 524) "\0e\00\00\00") ;; JZ:
43 (data (i32.const 528) "\2c\02\00\00") ;; INTERP-END addr (556)
44 (data (i32.const 532) "\02\00\00\00") ;; LIT xt
45 (data (i32.const 536) "\80\01\00\00") ;; MODE addr (384)
46 (data (i32.const 540) "\0a\00\00\00") ;; @ (fetch) xt
47 (data (i32.const 544) "\0c\00\00\00") ;; EXECUTE xt
48 (data (i32.const 548) "\0d\00\00\00") ;; NOOP xt
49 (data (i32.const 552) "\01\00\00\00") ;; RET
50 (data (i32.const 556) "\10\00\00\00") ;; DROP <-- INTERP-END
51 (data (i32.const 560) "\19\00\00\00") ;; BYE
52 (; Quit ;)
53 (data (i32.const 600) "\03\00\00\00") ;; RINIT xt
54 (data (i32.const 604) "\00\02\00\00") ;; INTERPRET xt (512)
55 (data (i32.const 608) "\12\00\00\00") ;; JMP xt
56 (data (i32.const 612) "\58\02\00\00") ;; quit location (600)
57 (; Test instructions ;)
58 (data (i32.const 640) "\02\00\00\00") ;; LIT
59 (data (i32.const 644) "\02\00\00\00") ;; 2
60 (data (i32.const 648) "\06\00\00\00") ;; DUP
61 (data (i32.const 652) "\07\00\00\00") ;; +
62 (data (i32.const 656) "\09\00\00\00") ;; .
63 (data (i32.const 660) "\12\00\00\00") ;; JMP
64 (data (i32.const 664) "\58\02\00\00") ;; quit addr
65 (; Word ;)
66 (data (i32.const 696) "\14\00\00\00") ;; WB0
67 (data (i32.const 700) "\05\00\00\00") ;; KEY <-- KEYLOOP
68 (data (i32.const 704) "\06\00\00\00") ;; DUP
69 (data (i32.const 708) "\18\00\00\00") ;; J-1: 18
70 (data (i32.const 712) "\0c\03\00\00") ;; addr of WORDEND
71 (data (i32.const 716) "\11\00\00\00") ;; WS?
72 (data (i32.const 720) "\0e\00\00\00") ;; JZ:
73 (data (i32.const 724) "\00\03\00\00") ;; addr of DOCHAR
74 (data (i32.const 728) "\10\00\00\00") ;; DROP
75 (data (i32.const 732) "\12\00\00\00") ;; JMP:
76 (data (i32.const 736) "\bc\02\00\00") ;; addr of KEYLOOP
77 (data (i32.const 740) "\05\00\00\00") ;; KEY <-- WORDLOOP
78 (data (i32.const 744) "\11\00\00\00") ;; WS?
79 (data (i32.const 748) "\0f\00\00\00") ;; JNZ:
80 (data (i32.const 752) "\0c\03\00\00") ;; addr of WORDEND
81 (data (i32.const 756) "\06\00\00\00") ;; DUP
82 (data (i32.const 760) "\18\00\00\00") ;; J-1:
83 (data (i32.const 764) "\0c\03\00\00") ;; addr of WORDEND
84 (data (i32.const 768) "\13\00\00\00") ;; WPUTC <-- DOCHAR
85 (data (i32.const 772) "\12\00\00\00") ;; JMP:
86 (data (i32.const 776) "\e4\02\00\00") ;; addr of WORDLOOP
87 (data (i32.const 780) "\10\00\00\00") ;; DROP <-- WORDEND
88 (data (i32.const 784) "\02\00\00\00") ;; LIT (push addr of wbuf, 256)
89 (data (i32.const 788) "\00\01\00\00") ;; wbuf addr (utf16 string)
90 (data (i32.const 792) "\17\00\00\00") ;; WB!LEN
91 (data (i32.const 796) "\01\00\00\00") ;; RET
92 (; Exec Mode ;)
93 (data (i32.const 800) "\06\00\00\00") ;; DUP
94 (data (i32.const 804) "\15\00\00\00") ;; DICT_GET
95 (data (i32.const 808) "\06\00\00\00") ;; DUP
96 (data (i32.const 812) "\0e\00\00\00") ;; JZ:
97 (data (i32.const 816) "\44\03\00\00") ;; donum (832)
98 (data (i32.const 820) "\1a\00\00\00") ;; SWAP
99 (data (i32.const 824) "\10\00\00\00") ;; DROP
100 (data (i32.const 828) "\0c\00\00\00") ;; EXECUTE
101 (data (i32.const 832) "\01\00\00\00") ;; RET
102 (data (i32.const 836) "\10\00\00\00") ;; DROP (xt from dictionary)
103 (data (i32.const 840) "\16\00\00\00") ;; NUMBER <-- donum, pushes NUM, UNPARSED
104 (data (i32.const 844) "\06\00\00\00") ;; DUP
105 (data (i32.const 848) "\0f\00\00\00") ;; JNZ:
106 (data (i32.const 852) "\60\03\00\00") ;; donum_err (864)
107 (data (i32.const 856) "\10\00\00\00") ;; DROP
108 (data (i32.const 860) "\01\00\00\00") ;; RET
109 (data (i32.const 864) "\10\00\00\00") ;; PARSE_ERR <-- donum_err
110 (data (i32.const 868) "\10\00\00\00") ;; ( DROP DROP )
111 (data (i32.const 872) "\19\00\00\00") ;; BYE
112 (; : definition ;)
113 (data (i32.const 900) "\b8\02\00\00") ;; WORD
114 (data (i32.const 904) "\1c\00\00\00") ;; HERE
115 (data (i32.const 908) "\1d\00\00\00") ;; VOCAB_SET
116 (data (i32.const 912) "\01\00\00\00") ;; RET
117 (data (i32.const 1000) "\08\00\00\00") ;; "word" size
118 (data (i32.const 1004) "w\00o\00r\00d\00") ;; utf16
119 (data (i32.const 1012) "\12\00\00\00") ;; "interpret" size
120 (data (i32.const 1016) "i\00n\00t\00e\00r\00p\00r\00e\00t\00") ;; utf16
121 (data (i32.const 1034) "\00\00") ;; align 32-bit
122 (data (i32.const 1036) "\08\00\00\00") ;; "quit" size
123 (data (i32.const 1040) "q\00u\00i\00t\00") ;; utf16
124 (;HERE ---> 1048;)
125 (export "memory" (memory $0))
126 (export "main" (func $main))
127 (func $main (result i32)
128 call $interpret
129 )
130 (func $interpret (result i32)
131 (local $here i32)
132 (local $eax i32)
133 (local $esi i32)
134 (local $inbuf_head i32)
135 (local $wbuf_head i32)
136 i32.const 388
137 i32.load
138 set_local $here
139 i32.const 392
140 i32.load
141 set_local $esi
142 i32.const 16
143 set_local $inbuf_head
144 i32.const 260
145 set_local $wbuf_head
146 block $bye
147 loop $next
148 call $sys_stack
149 get_local $esi
150 call $sys_reflect
151 get_local $esi
152 get_local $esi
153 i32.const 4
154 i32.add
155 set_local $esi
156 i32.load
157 set_local $eax
158 loop $execloop
159 block $default block $op0 block $ret block $lit block $rinit
160 block $word block $key block $dup block $plus block $noop2 block $emit
161 block $fetch block $set block $execute block $noop block $jz block $jnz
162 block $drop block $wsbool block $jmp block $wputc block $wbzero
163 block $dictget block $parsenum block $wbsetlen block $jneg1 block $swap
164 block $words block $here block $dictset
165 get_local $eax
166 br_table $op0 $ret (;2;)$lit $rinit (;4;)$word $key (;6;)$dup $plus
167 (;8;)$jmp $emit (;10;)$fetch $set (;12;)$execute $noop (;14;)$jz $jnz
168 (;16;)$drop $wsbool (;18;)$jmp $wputc (;20;)$wbzero $dictget
169 (;22;)$parsenum $wbsetlen (;24;)$jneg1 $bye (;26;)$swap $words
170 (;28;)$here $dictset $default
171 end ;; dictset
172 call $pop
173 set_local $eax
174 call $pop
175 get_local $eax
176 call $vocab_set
177 drop
178 br $next
179 end ;; here
180 get_local $here
181 call $push
182 br $next
183 end ;; words
184 call $sys_words
185 br $next
186 end ;; swap
187 call $pop
188 call $pop
189 set_local $eax
190 call $push
191 get_local $eax
192 call $push
193 br $next
194 end ;; jneg1
195 block $jneg1if
196 call $pop
197 i32.const -1
198 i32.eq
199 br_if $jneg1if
200 get_local $esi
201 i32.const 4
202 i32.add
203 set_local $esi
204 br $next
205 end
206 get_local $esi
207 i32.load
208 set_local $esi
209 br $next
210 end ;; wbsetlen
211 get_global $wbuf
212 get_local $wbuf_head
213 get_global $wbuf_data
214 i32.sub
215 i32.store
216 get_global $wbuf
217 call $sys_reflect
218 br $next
219 end ;; parsenum
220 i32.const 396 (; load BASE ;)
221 i32.load
222 call $pop
223 tee_local $eax
224 call $sys_parsenum
225 call $push
226 get_local $eax
227 i32.load
228 call $push
229 br $next
230 end ;; dictget
231 call $pop
232 call $vocab_get
233 call $push
234 br $next
235 end ;; wbzero
236 get_global $wbuf_data
237 set_local $wbuf_head
238 get_global $wbuf
239 i32.const 0
240 i32.store
241 br $next
242 end ;; wputc
243 get_local $wbuf_head
244 call $pop
245 i32.store16
246 get_local $wbuf_head
247 i32.const 2
248 i32.add
249 set_local $wbuf_head
250 br $next
251 end ;; jmp
252 get_local $esi
253 i32.load
254 set_local $esi
255 br $next
256 end ;; wsbool
257 call $pop
258 tee_local $eax
259 call $is_whitespace
260 get_local $eax
261 call $push
262 call $push
263 call $sys_stack
264 br $next
265 end ;; drop
266 call $pop
267 drop
268 br $next
269 end ;; jnz
270 block $jnzif
271 call $pop
272 i32.eqz
273 br_if $jnzif
274 get_local $esi
275 i32.load
276 set_local $esi
277 br $next
278 end
279 get_local $esi
280 i32.const 4
281 i32.add
282 set_local $esi
283 br $next
284 end ;; jz
285 block $jzif
286 call $pop
287 i32.eqz
288 br_if $jzif
289 get_local $esi
290 i32.const 4
291 i32.add
292 set_local $esi
293 br $next
294 end
295 get_local $esi
296 i32.load
297 set_local $esi
298 br $next
299 end ;; noop
300 br $next
301 end ;; execute
302 call $pop
303 tee_local $eax
304 i32.const 256
305 i32.lt_u
306 br_if $execloop
307 get_local $esi
308 call $rpush
309 get_local $eax
310 set_local $esi
311 br $next
312 end ;; set
313 call $pop
314 set_local $eax
315 call $pop
316 get_local $eax
317 i32.store
318 br $next
319 end ;; fetch
320 call $pop
321 i32.load
322 call $push
323 br $next
324 end ;; emit (.)
325 call $pop
326 call $sys_echo
327 br $next
328 end ;; noop2
329 br $next
330 end ;; plus
331 call $pop
332 call $pop
333 i32.add
334 call $push
335 br $next
336 end ;; dup
337 call $pop
338 tee_local $eax
339 get_local $eax
340 call $push
341 call $push
342 br $next
343 end ;; key
344 loop $key_loop
345 block $key_read
346 get_global $inbuf_size
347 i32.load
348 get_local $inbuf_head
349 get_global $inbuf_data
350 i32.sub
351 i32.le_u
352 br_if $key_read
353 get_local $inbuf_head
354 i32.load16_u
355 call $push
356 get_local $inbuf_head
357 i32.const 2
358 i32.add
359 set_local $inbuf_head
360 br $next
361 end ;; key_read
362 i32.const 0
363 get_global $inbuf
364 call $sys_read
365 block $nullread
366 get_global $inbuf_size
367 i32.load
368 i32.eqz
369 br_if $nullread
370 br $key_loop
371 end ;; nullread
372 i32.const -1 ;; <- keyval sent if sz == 0
373 call $push
374 br $next
375 end ;; key_loop
376 end ;; word
377 br $next
378 end ;; rinit
379 call $rinit
380 br $next
381 end ;; lit
382 get_local $esi
383 get_local $esi
384 i32.const 4
385 i32.add
386 set_local $esi
387 i32.load
388 call $push
389 br $next
390 end ;; ret
391 call $rpop
392 set_local $esi
393 br $next
394 end ;; op0
395 get_local $esi
396 call $sys_reflect
397 br $next
398 end ;; default
399 get_local $esi
400 call $rpush
401 get_local $eax
402 set_local $esi
403 br $next
404 end ;; execloop
405 end ;; nextl
406 end ;; bye
407 get_local $here
408 )
409 )