; memory map M[.]
; code 0..500
; global 1000..1100
; symtab 2000..2999

; global
; 1000 CH
; 1001 CS
; 1002 CP

1 call boot2
2 call testlex
3 end

; isNum c
20 fun 1
21 get 1
22 lit 48
23 ge
24 get 1
25 lit 57
26 le
27 and
28 ret 2

;; isSpace c
29 fun 1
30 get 1
31 lit 32
32 eq
33 get 1
34 lit 10
35 eq
36 or
37 get 1
38 lit 0
39 lt
40 or
41 ret 2

;; readc {c}
60 fun 2
61 sys 3
62 put 1
63 get 1
64 st 1000
65 get 1
66 sys 2
67 get 1
68 ret 2

;65 get 1
;66 ret 2

;; readi c { n pos}
70 fun 3
71 get 3
72 lit 48
73 sub
74 put 2
75 get 2
76 put 1
77 jmp x
loop:
78 get 2
79 lit 10
80 mul
81 ld 1000
82 add
83 lit 48
84 sub
85 put 2
x: 
86 call readc
87 call isspace
88 not
89 jt loop
90 get 1
91 jf y
92 get 2
93 ret 4
y:
94 lit 0
95 get 2
96 sub
97 ret 4

;; boot {op arg i}
100 fun 4
101 call readc
102 call readi
103 put 3
104 jmp x
loop:
105 call readc
106 call readi
107 put 2
108 get 3
109 sys 1
110 lit 32
111 sys 2
112 get 2
113 sys 1
114 lit 10
115 sys 2
116 call readc
117 call readi
118 put 3
x:
119 get 3
120 lit 0
121 ne
122 jt loop
123 ret 4

; test boot 
; with some s-object

; 32 17
; 23 0
; 38 1
; 0

; 130 boot2 {op arg i}
130 fun 4
131 lit 301000
132 st CS
133 lit 159
134 put 1
135 call readc
136 call readi
137 put 3
138 jmp x
loop:
139 call readc
140 call readi
141 put 2
142 ld CS
143 get 1
144 get 2
145 lit 8
146 shl
147 get 3
148 or
149 stx
150 inc 1
151 call readc
152 call readi
153 put 3
x:
154 get 3
155 lit 0
156 ne
157 jt loop
158 ret 4

; test boot2 with simple
; program

; testboot2
; 159 fun 1
; 160 lit 1
; 161 lit 2
; 162 add
; 163 sys 1
; 164 ret 1

; global
; 1003 freecell
; 1004 base ads of symtab
; 1005 tkval

; newcell c { k }
170 fun 2
171 ld 1003
172 put 1
173 ld 1003
174 lit 4
175 add
176 st 1003
177 ld 1004
178 get 1
179 get 2
180 stx
181 get 1
182 ret 3

; 183 search i c
183 fun 1
184 ld 1004
185 get 2
186 ldx
187 lit 0
188 eq
189 jf x
190 ld 1004
191 get 2
192 get 1
193 call 170
194 stx
x:
195 ld 1004
196 get 2
197 ldx
198 ret 3

; 200 lex { i }
200 fun 2
201 jmp x
loop:
202 ld 1000
203 lit 0
204 lt
205 jt y 
x:
206 call readc
207 call isspace
208 jt loop
y:
209 ld 1000
210 call isnum
211 jf z
212 ld 1000
213 call readi
214 st 1005
215 lit 1
216 ret 2
z:
217 lit 0
218 put 1
219 jmp w
loop2:
220 get 1
221 lit 2
222 add
223 ld 1000
224 call search
225 put 1
226 jmp v
loop3:
227 get 1
228 lit 1
229 add
230 ld 1000
231 call search
232 put 1
v:
233 ld 1004
234 get 1
235 ldx
236 ld 1000
237 ne
238 jt loop3
239 call readc
240 st 1000
w:
241 ld 1000
242 call isspace
243 not
244 jt loop2
245 get 1
246 ret 2

; 250 testlex { i }
250 fun 2
251 lit 100
252 array
253 st sym
254 call lex
255 put 1
256 jmp x
loop:
257 get 1
258 sys 1
259 lit 32
260 sys 2
261 call lex
262 put 1
x:
263 ld tkval
264 lit 0
265 ne
266 jt loop
267 ret 2

; testlex with simple input
1 2 3 aa bb x 9
0

