Blame


1 b0948a21 2024-04-29 benni // s5 - data stack pointer
2 b0948a21 2024-04-29 benni // s6 - return stack pointer
3 b0948a21 2024-04-29 benni // s7 - program counter
4 b0948a21 2024-04-29 benni
5 b0948a21 2024-04-29 benni #define DSP s5
6 b0948a21 2024-04-29 benni #define RSP s6
7 b0948a21 2024-04-29 benni #define PC s7
8 b0948a21 2024-04-29 benni
9 b0948a21 2024-04-29 benni .set F_HIDDEN, 0x80
10 b0948a21 2024-04-29 benni .set F_IMMED, 0x40
11 b0948a21 2024-04-29 benni .set F_LENMASK, 0x1f
12 b0948a21 2024-04-29 benni .set WORDLEN, 32
13 b0948a21 2024-04-29 benni .set name_0, 0
14 b0948a21 2024-04-29 benni
15 b0948a21 2024-04-29 benni .macro def name, namelen, label, prev, flags=0
16 b0948a21 2024-04-29 benni .section .rodata
17 b0948a21 2024-04-29 benni .align 8
18 b0948a21 2024-04-29 benni .global name_\label
19 b0948a21 2024-04-29 benni .type name_\label, @object
20 b0948a21 2024-04-29 benni name_\label :
21 b0948a21 2024-04-29 benni .quad name_\prev
22 b0948a21 2024-04-29 benni .byte \flags + \namelen
23 b0948a21 2024-04-29 benni .ascii "\name"
24 b0948a21 2024-04-29 benni .skip (8 - ((\namelen + 1) & 7)) & 7
25 b0948a21 2024-04-29 benni .global \label
26 b0948a21 2024-04-29 benni .type \label, @object
27 b0948a21 2024-04-29 benni \label:
28 b0948a21 2024-04-29 benni .endm
29 b0948a21 2024-04-29 benni
30 b0948a21 2024-04-29 benni .macro defword name, namelen, label, prev, flags=0
31 b0948a21 2024-04-29 benni def "\name", \namelen, \label, \prev, \flags
32 b0948a21 2024-04-29 benni .quad DOCOL
33 b0948a21 2024-04-29 benni .endm
34 b0948a21 2024-04-29 benni
35 b0948a21 2024-04-29 benni .macro defcode name, namelen, label, prev, flags=0
36 b0948a21 2024-04-29 benni def "\name", \namelen, \label, \prev, \flags
37 b0948a21 2024-04-29 benni .quad code_\label
38 b0948a21 2024-04-29 benni .section .text
39 b0948a21 2024-04-29 benni .align 4
40 b0948a21 2024-04-29 benni .global code_\label
41 b0948a21 2024-04-29 benni code_\label:
42 b0948a21 2024-04-29 benni .endm
43 b0948a21 2024-04-29 benni
44 b0948a21 2024-04-29 benni .macro defvar name, namelen, label, prev, initial=0, flags=0
45 b0948a21 2024-04-29 benni defcode \name, \namelen, \label, \prev, \flags
46 b0948a21 2024-04-29 benni la t0, var_\name
47 b0948a21 2024-04-29 benni PUSH t0
48 b0948a21 2024-04-29 benni NEXT
49 b0948a21 2024-04-29 benni
50 b0948a21 2024-04-29 benni .section .data
51 b0948a21 2024-04-29 benni var_\name:
52 b0948a21 2024-04-29 benni .quad \initial
53 b0948a21 2024-04-29 benni .endm
54 b0948a21 2024-04-29 benni
55 b0948a21 2024-04-29 benni .macro defconst name, namelen, label, prev, value, flags=0
56 b0948a21 2024-04-29 benni defcode \name, \namelen, \label, \prev, \flags
57 b0948a21 2024-04-29 benni la t0, \value
58 b0948a21 2024-04-29 benni PUSH t0
59 b0948a21 2024-04-29 benni NEXT
60 b0948a21 2024-04-29 benni .endm
61 b0948a21 2024-04-29 benni
62 b0948a21 2024-04-29 benni .macro NEXT
63 b0948a21 2024-04-29 benni ld t0, 0(PC)
64 b0948a21 2024-04-29 benni addi PC, PC, 8
65 b0948a21 2024-04-29 benni ld t1, 0(t0)
66 b0948a21 2024-04-29 benni jr t1
67 b0948a21 2024-04-29 benni .endm
68 b0948a21 2024-04-29 benni
69 b0948a21 2024-04-29 benni .macro PUSH, reg
70 b0948a21 2024-04-29 benni addi DSP, DSP, -8
71 b0948a21 2024-04-29 benni sd \reg, 0(DSP)
72 b0948a21 2024-04-29 benni .endm
73 b0948a21 2024-04-29 benni
74 b0948a21 2024-04-29 benni .macro POP, reg
75 b0948a21 2024-04-29 benni ld \reg, 0(DSP)
76 b0948a21 2024-04-29 benni addi DSP, DSP, 8
77 b0948a21 2024-04-29 benni .endm
78 b0948a21 2024-04-29 benni
79 b0948a21 2024-04-29 benni .macro PUSHRSP, reg
80 b0948a21 2024-04-29 benni addi RSP, RSP, -8
81 b0948a21 2024-04-29 benni sd \reg, 0(RSP)
82 b0948a21 2024-04-29 benni .endm
83 b0948a21 2024-04-29 benni
84 b0948a21 2024-04-29 benni .macro POPRSP, reg
85 b0948a21 2024-04-29 benni ld \reg, 0(RSP)
86 b0948a21 2024-04-29 benni addi RSP, RSP, 8
87 305019da 2024-04-29 benni .endm
88 305019da 2024-04-29 benni
89 305019da 2024-04-29 benni .macro GOTO, label
90 305019da 2024-04-29 benni .quad BRANCH
91 305019da 2024-04-29 benni .quad (\label - .)
92 305019da 2024-04-29 benni .endm
93 305019da 2024-04-29 benni
94 305019da 2024-04-29 benni .macro GOTOZ, label
95 305019da 2024-04-29 benni .quad ZBRANCH
96 305019da 2024-04-29 benni .quad (\label - .)
97 b0948a21 2024-04-29 benni .endm
98 b0948a21 2024-04-29 benni
99 c7d7ae29 2024-04-29 benni .macro GOTONZ, label
100 c7d7ae29 2024-04-29 benni .quad EQZ
101 c7d7ae29 2024-04-29 benni .quad ZBRANCH
102 c7d7ae29 2024-04-29 benni .quad (\label - .)
103 c7d7ae29 2024-04-29 benni .endm
104 c7d7ae29 2024-04-29 benni
105 b0948a21 2024-04-29 benni .section .text
106 b0948a21 2024-04-29 benni .global DOCOL
107 b0948a21 2024-04-29 benni .type DOCOL, @function
108 b0948a21 2024-04-29 benni DOCOL:
109 b0948a21 2024-04-29 benni PUSHRSP PC
110 b0948a21 2024-04-29 benni add t0, t0, 8
111 b0948a21 2024-04-29 benni mv PC, t0
112 b0948a21 2024-04-29 benni NEXT
113 b0948a21 2024-04-29 benni
114 b0948a21 2024-04-29 benni .global main
115 b0948a21 2024-04-29 benni .type main, @function
116 b0948a21 2024-04-29 benni main:
117 b0948a21 2024-04-29 benni addi sp, sp, -64
118 b0948a21 2024-04-29 benni sd ra, 0(sp)
119 b0948a21 2024-04-29 benni sd DSP, 8(sp)
120 b0948a21 2024-04-29 benni sd RSP, 16(sp)
121 b0948a21 2024-04-29 benni sd PC, 24(sp)
122 b0948a21 2024-04-29 benni sd s0, 32(sp)
123 b0948a21 2024-04-29 benni sd s1, 40(sp)
124 b0948a21 2024-04-29 benni sd s2, 48(sp)
125 b0948a21 2024-04-29 benni sd s3, 56(sp)
126 b0948a21 2024-04-29 benni
127 b0948a21 2024-04-29 benni la DSP, data_stack
128 b0948a21 2024-04-29 benni la RSP, return_stack
129 b0948a21 2024-04-29 benni la PC, cold_start
130 b0948a21 2024-04-29 benni la t0, var_S0
131 b0948a21 2024-04-29 benni sd DSP, 0(t0)
132 b0948a21 2024-04-29 benni NEXT
133 b0948a21 2024-04-29 benni .size main, . - main
134 b0948a21 2024-04-29 benni
135 b0948a21 2024-04-29 benni return:
136 b0948a21 2024-04-29 benni mv a0, zero
137 b0948a21 2024-04-29 benni ld s3, 56(sp)
138 b0948a21 2024-04-29 benni ld s2, 48(sp)
139 b0948a21 2024-04-29 benni ld s1, 40(sp)
140 b0948a21 2024-04-29 benni ld s0, 32(sp)
141 b0948a21 2024-04-29 benni ld PC, 24(sp)
142 b0948a21 2024-04-29 benni ld RSP, 16(sp)
143 b0948a21 2024-04-29 benni ld DSP, 8(sp)
144 b0948a21 2024-04-29 benni ld ra, 0(sp)
145 b0948a21 2024-04-29 benni addi sp, sp, 64
146 b0948a21 2024-04-29 benni jr ra
147 b0948a21 2024-04-29 benni .size return, . - return
148 b0948a21 2024-04-29 benni
149 b0948a21 2024-04-29 benni .section .rodata
150 b0948a21 2024-04-29 benni .align 8
151 b0948a21 2024-04-29 benni cold_start:
152 b0948a21 2024-04-29 benni .quad QUIT
153 b0948a21 2024-04-29 benni
154 b0948a21 2024-04-29 benni .section .text
155 b0948a21 2024-04-29 benni
156 b0948a21 2024-04-29 benni // return:
157 b0948a21 2024-04-29 benni // a0 - word
158 b0948a21 2024-04-29 benni // a1 - wordlen
159 b0948a21 2024-04-29 benni _WORD:
160 b0948a21 2024-04-29 benni addi sp, sp, -32
161 b0948a21 2024-04-29 benni sd ra, 0(sp)
162 b0948a21 2024-04-29 benni sd s0, 8(sp)
163 b0948a21 2024-04-29 benni sd s1, 16(sp)
164 b0948a21 2024-04-29 benni
165 b0948a21 2024-04-29 benni la s0, wordbuf
166 b0948a21 2024-04-29 benni mv s1, zero
167 b0948a21 2024-04-29 benni
168 b0948a21 2024-04-29 benni 1:
169 b0948a21 2024-04-29 benni jal _KEY
170 b0948a21 2024-04-29 benni li t0, ' '
171 b0948a21 2024-04-29 benni beq a0, t0, 1b
172 b0948a21 2024-04-29 benni li t0, '\n'
173 b0948a21 2024-04-29 benni beq a0, t0, 1b
174 b0948a21 2024-04-29 benni li t0, '\r'
175 b0948a21 2024-04-29 benni beq a0, t0, 1b
176 b0948a21 2024-04-29 benni li t0, '\b'
177 b0948a21 2024-04-29 benni beq a0, t0, 1b
178 b0948a21 2024-04-29 benni j 3f
179 b0948a21 2024-04-29 benni
180 b0948a21 2024-04-29 benni 2:
181 b0948a21 2024-04-29 benni li t0, ' '
182 b0948a21 2024-04-29 benni beq a0, t0, nl
183 b0948a21 2024-04-29 benni li t0, '\n'
184 b0948a21 2024-04-29 benni beq a0, t0, nl
185 b0948a21 2024-04-29 benni li t0, '\b'
186 b0948a21 2024-04-29 benni beq a0, t0, bs
187 b0948a21 2024-04-29 benni li t0, '\r'
188 b0948a21 2024-04-29 benni beq a0, t0, 1f
189 b0948a21 2024-04-29 benni 3:
190 b0948a21 2024-04-29 benni li t0, -1
191 b0948a21 2024-04-29 benni beq a0, t0, nl
192 b0948a21 2024-04-29 benni
193 b0948a21 2024-04-29 benni add t0, s0, s1
194 b0948a21 2024-04-29 benni sb a0, 0(t0)
195 b0948a21 2024-04-29 benni addi s1, s1, 1
196 b0948a21 2024-04-29 benni
197 b0948a21 2024-04-29 benni 1:
198 b0948a21 2024-04-29 benni jal _KEY
199 b0948a21 2024-04-29 benni j 2b
200 b0948a21 2024-04-29 benni
201 b0948a21 2024-04-29 benni nl:
202 b0948a21 2024-04-29 benni add t0, s0, s1
203 b0948a21 2024-04-29 benni sb zero, 0(t0)
204 b0948a21 2024-04-29 benni
205 b0948a21 2024-04-29 benni la t0, wordlen
206 b0948a21 2024-04-29 benni sd s1, 0(t0)
207 b0948a21 2024-04-29 benni mv a0, s0
208 b0948a21 2024-04-29 benni mv a1, s1
209 b0948a21 2024-04-29 benni
210 b0948a21 2024-04-29 benni ld s1, 16(sp)
211 b0948a21 2024-04-29 benni ld s0, 8(sp)
212 b0948a21 2024-04-29 benni ld ra, 0(sp)
213 b0948a21 2024-04-29 benni addi sp, sp, 32
214 b0948a21 2024-04-29 benni jr ra
215 b0948a21 2024-04-29 benni
216 b0948a21 2024-04-29 benni bs:
217 b0948a21 2024-04-29 benni beq s1, zero, _WORD
218 b0948a21 2024-04-29 benni jal _EMIT
219 b0948a21 2024-04-29 benni li a0, ' '
220 b0948a21 2024-04-29 benni jal _EMIT
221 b0948a21 2024-04-29 benni li a0, '\b'
222 b0948a21 2024-04-29 benni jal _EMIT
223 b0948a21 2024-04-29 benni addi s1, s1, -1
224 b0948a21 2024-04-29 benni j 1b
225 b0948a21 2024-04-29 benni .size _WORD, . - _WORD
226 b0948a21 2024-04-29 benni
227 b0948a21 2024-04-29 benni _EMIT:
228 b0948a21 2024-04-29 benni j putchar
229 b0948a21 2024-04-29 benni .size _EMIT, . - _EMIT
230 b0948a21 2024-04-29 benni
231 b0948a21 2024-04-29 benni _KEY:
232 b0948a21 2024-04-29 benni j getchar
233 b0948a21 2024-04-29 benni .size _KEY, . - _KEY
234 b0948a21 2024-04-29 benni
235 b0948a21 2024-04-29 benni defcode "DONE", 4, DONE, 0
236 b0948a21 2024-04-29 benni POP a0
237 b0948a21 2024-04-29 benni jal exit
238 b0948a21 2024-04-29 benni
239 b0948a21 2024-04-29 benni defcode "EXIT", 4, EXIT, DONE
240 b0948a21 2024-04-29 benni POPRSP PC
241 b0948a21 2024-04-29 benni NEXT
242 b0948a21 2024-04-29 benni
243 b0948a21 2024-04-29 benni defcode "DROP", 4, DROP, EXIT
244 305019da 2024-04-29 benni addi DSP, DSP, 8
245 b0948a21 2024-04-29 benni NEXT
246 b0948a21 2024-04-29 benni
247 4c79a926 2024-04-29 benni defword "2DROP", 5, TDROP, DROP
248 4c79a926 2024-04-29 benni .quad DROP
249 4c79a926 2024-04-29 benni .quad DROP
250 4c79a926 2024-04-29 benni .quad EXIT
251 305019da 2024-04-29 benni
252 305019da 2024-04-29 benni defcode "SWAP", 4, SWAP, TDROP
253 4c79a926 2024-04-29 benni ld t0, 0(DSP)
254 4c79a926 2024-04-29 benni ld t1, 8(DSP)
255 4c79a926 2024-04-29 benni sd t0, 8(DSP)
256 4c79a926 2024-04-29 benni sd t1, 0(DSP)
257 b0948a21 2024-04-29 benni NEXT
258 b0948a21 2024-04-29 benni
259 c4d2dd8a 2024-04-29 benni defcode "OVER", 4, OVER, SWAP
260 c4d2dd8a 2024-04-29 benni ld t0, 8(DSP)
261 c4d2dd8a 2024-04-29 benni PUSH t0
262 c4d2dd8a 2024-04-29 benni NEXT
263 c4d2dd8a 2024-04-29 benni
264 305019da 2024-04-29 benni // ( X Y Z -- Z X Y )
265 c4d2dd8a 2024-04-29 benni defcode "ROT", 3, ROT, OVER
266 4c79a926 2024-04-29 benni ld t0, 0(DSP)
267 4c79a926 2024-04-29 benni ld t1, 8(DSP)
268 4c79a926 2024-04-29 benni ld t2, 16(DSP)
269 4c79a926 2024-04-29 benni sd t1, 16(DSP)
270 4c79a926 2024-04-29 benni sd t0, 8(DSP)
271 4c79a926 2024-04-29 benni sd t2, 0(DSP)
272 c4d2dd8a 2024-04-29 benni NEXT
273 c4d2dd8a 2024-04-29 benni
274 305019da 2024-04-29 benni // ( X Y Z -- Y Z X )
275 305019da 2024-04-29 benni // ( Z X Y ) -- ( X Y Z )
276 c4d2dd8a 2024-04-29 benni defcode "-ROT", 4, NROT, ROT
277 4c79a926 2024-04-29 benni ld t0, 0(DSP)
278 4c79a926 2024-04-29 benni ld t1, 8(DSP)
279 4c79a926 2024-04-29 benni ld t2, 16(DSP)
280 4c79a926 2024-04-29 benni sd t0, 16(DSP)
281 4c79a926 2024-04-29 benni sd t2, 8(DSP)
282 2318c267 2024-04-29 benni sd t1, 0(DSP)
283 b0948a21 2024-04-29 benni NEXT
284 b0948a21 2024-04-29 benni
285 c4d2dd8a 2024-04-29 benni defcode "DUP", 3, DUP, NROT
286 305019da 2024-04-29 benni ld t0, 0(DSP)
287 c4d2dd8a 2024-04-29 benni PUSH t0
288 305019da 2024-04-29 benni NEXT
289 305019da 2024-04-29 benni
290 305019da 2024-04-29 benni defcode "2DUP", 3, TDUP, DUP
291 305019da 2024-04-29 benni ld t0, 8(DSP)
292 305019da 2024-04-29 benni ld t1, 0(DSP)
293 c4d2dd8a 2024-04-29 benni PUSH t0
294 305019da 2024-04-29 benni PUSH t1
295 c4d2dd8a 2024-04-29 benni NEXT
296 c4d2dd8a 2024-04-29 benni
297 305019da 2024-04-29 benni defcode "?DUP", 4, QDUP, TDUP
298 c4d2dd8a 2024-04-29 benni ld t0, 0(DSP)
299 c4d2dd8a 2024-04-29 benni beq t0, zero, 1f
300 c4d2dd8a 2024-04-29 benni PUSH t0
301 c4d2dd8a 2024-04-29 benni 1:
302 c4d2dd8a 2024-04-29 benni NEXT
303 c4d2dd8a 2024-04-29 benni
304 4c79a926 2024-04-29 benni defword "1+", 2, INC, QDUP
305 4c79a926 2024-04-29 benni .quad LIT, 1
306 4c79a926 2024-04-29 benni .quad ADD
307 4c79a926 2024-04-29 benni .quad EXIT
308 305019da 2024-04-29 benni
309 4c79a926 2024-04-29 benni defword "1-", 2, DEC, INC
310 4c79a926 2024-04-29 benni .quad LIT, 1
311 4c79a926 2024-04-29 benni .quad SUB
312 4c79a926 2024-04-29 benni .quad EXIT
313 305019da 2024-04-29 benni
314 305019da 2024-04-29 benni defcode "+", 1, ADD, DEC
315 b0948a21 2024-04-29 benni POP t1
316 b0948a21 2024-04-29 benni POP t0
317 b0948a21 2024-04-29 benni add t0, t0, t1
318 b0948a21 2024-04-29 benni PUSH t0
319 b0948a21 2024-04-29 benni NEXT
320 b0948a21 2024-04-29 benni
321 b0948a21 2024-04-29 benni defcode "-", 1, SUB, ADD
322 b0948a21 2024-04-29 benni POP t1
323 b0948a21 2024-04-29 benni POP t0
324 b0948a21 2024-04-29 benni sub t0, t0, t1
325 b0948a21 2024-04-29 benni PUSH t0
326 b0948a21 2024-04-29 benni NEXT
327 b0948a21 2024-04-29 benni
328 b0948a21 2024-04-29 benni defcode "*", 1, MUL, SUB
329 b0948a21 2024-04-29 benni POP t1
330 b0948a21 2024-04-29 benni POP t0
331 b0948a21 2024-04-29 benni mul t0, t0, t1
332 b0948a21 2024-04-29 benni PUSH t0
333 b0948a21 2024-04-29 benni NEXT
334 b0948a21 2024-04-29 benni
335 b0948a21 2024-04-29 benni defcode "AND", 3, AND, MUL
336 b0948a21 2024-04-29 benni POP t1
337 b0948a21 2024-04-29 benni POP t0
338 b0948a21 2024-04-29 benni and t0, t0, t1
339 b0948a21 2024-04-29 benni PUSH t0
340 b0948a21 2024-04-29 benni NEXT
341 b0948a21 2024-04-29 benni
342 b0948a21 2024-04-29 benni defcode "OR", 2, OR, AND
343 b0948a21 2024-04-29 benni POP t1
344 b0948a21 2024-04-29 benni POP t0
345 b0948a21 2024-04-29 benni or t0, t0, t1
346 b0948a21 2024-04-29 benni PUSH t0
347 b0948a21 2024-04-29 benni NEXT
348 b0948a21 2024-04-29 benni
349 b0948a21 2024-04-29 benni defcode "XOR", 3, XOR, OR
350 b0948a21 2024-04-29 benni POP t1
351 b0948a21 2024-04-29 benni POP t0
352 b0948a21 2024-04-29 benni xor t0, t0, t1
353 b0948a21 2024-04-29 benni PUSH t0
354 b0948a21 2024-04-29 benni NEXT
355 b0948a21 2024-04-29 benni
356 b6e62660 2024-04-30 benni defcode "RSHIFT", 6, RSHIFT, XOR
357 b6e62660 2024-04-30 benni POP t1
358 b0948a21 2024-04-29 benni POP t0
359 b6e62660 2024-04-30 benni srl t0, t0, t1
360 b6e62660 2024-04-30 benni PUSH t0
361 b6e62660 2024-04-30 benni NEXT
362 b6e62660 2024-04-30 benni
363 b6e62660 2024-04-30 benni defcode "0=", 2, EQZ, RSHIFT
364 b6e62660 2024-04-30 benni POP t0
365 b0948a21 2024-04-29 benni beq t0, zero, 1f
366 b0948a21 2024-04-29 benni PUSH zero
367 b0948a21 2024-04-29 benni NEXT
368 b0948a21 2024-04-29 benni
369 b0948a21 2024-04-29 benni 1:
370 b0948a21 2024-04-29 benni li t0, -1
371 b0948a21 2024-04-29 benni PUSH t0
372 b0948a21 2024-04-29 benni NEXT
373 b0948a21 2024-04-29 benni
374 c7d7ae29 2024-04-29 benni // ( x y -- b )
375 c7d7ae29 2024-04-29 benni defword "=", 1, EQ, EQZ
376 c7d7ae29 2024-04-29 benni .quad SUB
377 c7d7ae29 2024-04-29 benni .quad EQZ
378 c7d7ae29 2024-04-29 benni .quad EXIT
379 c7d7ae29 2024-04-29 benni
380 c7d7ae29 2024-04-29 benni // ( x y -- b )
381 c7d7ae29 2024-04-29 benni defcode "<", 1, LT, EQ
382 c7d7ae29 2024-04-29 benni POP t0
383 c7d7ae29 2024-04-29 benni POP t1
384 c7d7ae29 2024-04-29 benni sltu t0, t0, t1
385 c7d7ae29 2024-04-29 benni PUSH t0
386 c7d7ae29 2024-04-29 benni NEXT
387 c7d7ae29 2024-04-29 benni
388 b6e62660 2024-04-30 benni defword ">", 1, GT, LT
389 b6e62660 2024-04-30 benni .quad SWAP
390 b6e62660 2024-04-30 benni .quad LT
391 b6e62660 2024-04-30 benni .quad EXIT
392 b6e62660 2024-04-30 benni
393 b6e62660 2024-04-30 benni defcode "KEY", 3, KEY, GT
394 b0948a21 2024-04-29 benni jal _KEY
395 b0948a21 2024-04-29 benni PUSH a0
396 b0948a21 2024-04-29 benni NEXT
397 b0948a21 2024-04-29 benni
398 305019da 2024-04-29 benni // ( -- word wordlen )
399 b0948a21 2024-04-29 benni defcode "WORD", 4, WORD, KEY
400 b0948a21 2024-04-29 benni jal _WORD
401 b0948a21 2024-04-29 benni PUSH a1
402 b0948a21 2024-04-29 benni PUSH a0
403 b0948a21 2024-04-29 benni NEXT
404 b0948a21 2024-04-29 benni
405 34149a21 2024-04-29 benni // ( s1 s2 len -- eql )
406 34149a21 2024-04-29 benni defword "MEMEQ", 5, MEMEQ, WORD
407 34149a21 2024-04-29 benni .quad ROT // ( len s1 s2 )
408 34149a21 2024-04-29 benni .quad DUP // ( len len s1 s2 )
409 34149a21 2024-04-29 benni GOTOZ 4f // ( len s1 s2 )
410 34149a21 2024-04-29 benni
411 34149a21 2024-04-29 benni .quad TOR // ( s1 s2 -- len )
412 34149a21 2024-04-29 benni
413 34149a21 2024-04-29 benni 1: // ( s1 s2 -- len )
414 34149a21 2024-04-29 benni .quad DUP // ( s1 s1 s2 -- len )
415 34149a21 2024-04-29 benni .quad FETCHBYTE // ( c1 s1 s2 -- len )
416 34149a21 2024-04-29 benni .quad TOR // ( s1 s2 -- c1 len )
417 34149a21 2024-04-29 benni .quad SWAP // ( s2 s1 -- c1 len )
418 34149a21 2024-04-29 benni .quad DUP // ( s2 s2 s1 -- c1 len )
419 34149a21 2024-04-29 benni .quad FETCHBYTE // ( c2 s2 s1 -- c1 len )
420 34149a21 2024-04-29 benni .quad FROMR // ( c1 c2 s2 s1 -- len )
421 34149a21 2024-04-29 benni .quad SUB // ( eql s2 s1 -- len )
422 34149a21 2024-04-29 benni GOTONZ 3f // ( s2 s1 -- len )
423 34149a21 2024-04-29 benni
424 34149a21 2024-04-29 benni .quad FROMR // ( len s2 s1 )
425 34149a21 2024-04-29 benni .quad DEC // ( len-1 s2 s1 )
426 34149a21 2024-04-29 benni .quad DUP // ( len-1 len-1 s2 s1 )
427 34149a21 2024-04-29 benni GOTOZ 4f // ( len-1 s2 s1 )
428 34149a21 2024-04-29 benni
429 34149a21 2024-04-29 benni .quad TOR // ( s2 s1 -- len-1 )
430 34149a21 2024-04-29 benni .quad INC // ( s2+1 s1 -- len-1 )
431 34149a21 2024-04-29 benni .quad SWAP // ( s1 s2+1 -- len-1 )
432 34149a21 2024-04-29 benni .quad INC // ( s1+1 s2+1 -- len-1 )
433 34149a21 2024-04-29 benni GOTO 1b
434 34149a21 2024-04-29 benni
435 34149a21 2024-04-29 benni
436 34149a21 2024-04-29 benni 3: // not equal // ( s2 s1 -- len )
437 34149a21 2024-04-29 benni .quad FROMR // ( len s2 s1 )
438 34149a21 2024-04-29 benni .quad TDROP // ( s1 )
439 34149a21 2024-04-29 benni .quad DROP // ( )
440 34149a21 2024-04-29 benni .quad LIT, 0 // ( 0 )
441 34149a21 2024-04-29 benni .quad EXIT
442 b0948a21 2024-04-29 benni
443 34149a21 2024-04-29 benni 4: // equal // ( len s2 s1 )
444 34149a21 2024-04-29 benni .quad TDROP // ( s1 )
445 34149a21 2024-04-29 benni .quad DROP // ( )
446 34149a21 2024-04-29 benni .quad LIT, -1 // ( 0 )
447 34149a21 2024-04-29 benni .quad EXIT
448 34149a21 2024-04-29 benni
449 9fbaab72 2024-04-29 benni // ( name namelen -- &word )
450 9fbaab72 2024-04-29 benni defword "FIND", 4, FIND, MEMEQ
451 9fbaab72 2024-04-29 benni .quad TOR // ( namelen -- name )
452 9fbaab72 2024-04-29 benni .quad TOR // ( -- namelen name )
453 9fbaab72 2024-04-29 benni .quad LATEST // ( &LATEST -- namelen name )
454 9fbaab72 2024-04-29 benni .quad FETCH // ( LATEST -- namelen name )
455 9fbaab72 2024-04-29 benni
456 9fbaab72 2024-04-29 benni 1: // ( &word -- namelen name )
457 9fbaab72 2024-04-29 benni .quad DUP // ( &word &word -- namelen name )
458 9fbaab72 2024-04-29 benni .quad LIT, 8 // ( 8 &word &word -- namelen name )
459 9fbaab72 2024-04-29 benni .quad ADD // ( &flags &word -- namelen name )
460 9fbaab72 2024-04-29 benni .quad FETCHBYTE // ( flags &word -- namelen name )
461 b6e62660 2024-04-30 benni .quad DUP // ( flags flags &word -- namelen name )
462 b6e62660 2024-04-30 benni .quad LIT, F_HIDDEN // ( F_HIDDEN flags flags &word -- namelen name )
463 b6e62660 2024-04-30 benni .quad AND // ( hidden flags &word -- namelen name )
464 b6e62660 2024-04-30 benni GOTONZ 4f // ( flags &word -- namelen name )
465 b6e62660 2024-04-30 benni .quad LIT, F_LENMASK // ( F_LENMASK flags &word -- namelen name )
466 b6e62660 2024-04-30 benni .quad AND // ( len &word -- namelen name )
467 b6e62660 2024-04-30 benni .quad RSPFETCH // ( RSP len &word -- namelen name )
468 b6e62660 2024-04-30 benni .quad FETCH // ( namelen len &word -- namelen name )
469 b6e62660 2024-04-30 benni .quad SUB // ( eql &word -- namelen name )
470 9fbaab72 2024-04-29 benni GOTONZ 2f // ( &word -- namelen name )
471 9fbaab72 2024-04-29 benni
472 9fbaab72 2024-04-29 benni .quad DUP // ( &word &word -- namelen name )
473 9fbaab72 2024-04-29 benni .quad LIT, 9 // ( 9 &word &word -- namelen name )
474 9fbaab72 2024-04-29 benni .quad ADD // ( &wname &word -- namelen name )
475 9fbaab72 2024-04-29 benni
476 9fbaab72 2024-04-29 benni .quad RSPFETCH // ( &namelen wname &word -- namelen name )
477 9fbaab72 2024-04-29 benni .quad FETCH // ( namelen wname &word -- namelen name )
478 9fbaab72 2024-04-29 benni .quad SWAP // ( &wname namelen &word -- namelen name )
479 9fbaab72 2024-04-29 benni .quad RSPFETCH // ( RSP wname namelen &word -- namelen name )
480 9fbaab72 2024-04-29 benni .quad LIT, 8 // ( 8 RSP wname namelen &word -- namelen name )
481 9fbaab72 2024-04-29 benni .quad ADD // ( &name wname namelen &word -- namelen name )
482 9fbaab72 2024-04-29 benni .quad FETCH // ( name wname namelen &word -- namelen name )
483 9fbaab72 2024-04-29 benni .quad MEMEQ // ( eql &word -- namelen name )
484 9fbaab72 2024-04-29 benni GOTOZ 2f // ( &word -- namelen name )
485 9fbaab72 2024-04-29 benni
486 9fbaab72 2024-04-29 benni 3:
487 9fbaab72 2024-04-29 benni .quad RDROP // ( &word -- name )
488 9fbaab72 2024-04-29 benni .quad RDROP // ( &word )
489 9fbaab72 2024-04-29 benni .quad EXIT // noreturn
490 b6e62660 2024-04-30 benni
491 b6e62660 2024-04-30 benni 4: // hidden // ( flags &word -- namelen name )
492 b6e62660 2024-04-30 benni .quad DROP // ( &word -- namelen name )
493 9fbaab72 2024-04-29 benni
494 9fbaab72 2024-04-29 benni 2: // hidden or not equal // ( &word -- namelen name )
495 9fbaab72 2024-04-29 benni .quad FETCH // ( &next -- namelen name )
496 9fbaab72 2024-04-29 benni .quad DUP // ( &next &next -- namelen name )
497 9fbaab72 2024-04-29 benni GOTONZ 1b // ( &next -- namelen name )
498 9fbaab72 2024-04-29 benni GOTO 3b // ( 0 -- namelen name )
499 9fbaab72 2024-04-29 benni
500 b0948a21 2024-04-29 benni defcode "BRANCH", 6, BRANCH, FIND
501 b0948a21 2024-04-29 benni ld t0, 0(PC)
502 b0948a21 2024-04-29 benni add PC, PC, t0
503 b0948a21 2024-04-29 benni NEXT
504 b0948a21 2024-04-29 benni
505 b0948a21 2024-04-29 benni defcode "0BRANCH", 7, ZBRANCH, BRANCH
506 b0948a21 2024-04-29 benni POP a0
507 b0948a21 2024-04-29 benni beq a0, zero, code_BRANCH
508 b0948a21 2024-04-29 benni addi PC, PC, 8
509 b0948a21 2024-04-29 benni NEXT
510 b0948a21 2024-04-29 benni
511 c4d2dd8a 2024-04-29 benni defcode ">R", 2, TOR, ZBRANCH
512 c4d2dd8a 2024-04-29 benni POP t0
513 c4d2dd8a 2024-04-29 benni PUSHRSP t0
514 c4d2dd8a 2024-04-29 benni NEXT
515 c4d2dd8a 2024-04-29 benni
516 c4d2dd8a 2024-04-29 benni defcode "R>", 2, FROMR, TOR
517 c4d2dd8a 2024-04-29 benni POPRSP t0
518 c4d2dd8a 2024-04-29 benni PUSH t0
519 c4d2dd8a 2024-04-29 benni NEXT
520 c4d2dd8a 2024-04-29 benni
521 c4d2dd8a 2024-04-29 benni defcode "RSP!", 4, RSPSTORE, FROMR
522 b0948a21 2024-04-29 benni POP RSP
523 b0948a21 2024-04-29 benni NEXT
524 b0948a21 2024-04-29 benni
525 c4d2dd8a 2024-04-29 benni defcode "RSP@", 4, RSPFETCH, RSPSTORE
526 c4d2dd8a 2024-04-29 benni PUSH RSP
527 c4d2dd8a 2024-04-29 benni NEXT
528 b0948a21 2024-04-29 benni
529 c4d2dd8a 2024-04-29 benni defcode "RDROP", 5, RDROP, RSPFETCH
530 c4d2dd8a 2024-04-29 benni POPRSP t0
531 c4d2dd8a 2024-04-29 benni NEXT
532 b0948a21 2024-04-29 benni
533 c4d2dd8a 2024-04-29 benni defcode "DSP!", 4, DSPSTORE, RDROP
534 c4d2dd8a 2024-04-29 benni POP DSP
535 c4d2dd8a 2024-04-29 benni NEXT
536 b0948a21 2024-04-29 benni
537 c4d2dd8a 2024-04-29 benni defcode "DSP@", 4, DSPFETCH, DSPSTORE
538 c4d2dd8a 2024-04-29 benni mv t0, DSP
539 c4d2dd8a 2024-04-29 benni PUSH t0
540 c4d2dd8a 2024-04-29 benni NEXT
541 b0948a21 2024-04-29 benni
542 c4d2dd8a 2024-04-29 benni // ( src dest len -- )
543 305019da 2024-04-29 benni defword "CMOVE", 5, CMOVE, DSPFETCH
544 305019da 2024-04-29 benni
545 b0948a21 2024-04-29 benni 1:
546 305019da 2024-04-29 benni .quad ROT // ( len src dest )
547 305019da 2024-04-29 benni .quad DUP // ( len len src dest )
548 305019da 2024-04-29 benni GOTOZ 2f // ( len src dest )
549 305019da 2024-04-29 benni .quad NROT // ( src dest len )
550 305019da 2024-04-29 benni .quad TDUP // ( src dest src dest len )
551 305019da 2024-04-29 benni .quad FETCHBYTE // ( byte dest src dest len )
552 305019da 2024-04-29 benni .quad SWAP // ( dest byte src dest len )
553 305019da 2024-04-29 benni .quad STORE // ( src dest len )
554 305019da 2024-04-29 benni .quad INC // ( src+1 dest len )
555 305019da 2024-04-29 benni .quad NROT // ( dest len src+1 )
556 305019da 2024-04-29 benni .quad INC // ( dest+1 len src+1 )
557 305019da 2024-04-29 benni .quad NROT // ( len src+1 dest+1 )
558 305019da 2024-04-29 benni .quad DEC // ( len-1 src+1 dest+1 )
559 305019da 2024-04-29 benni .quad NROT // ( src+1 dest+1 len-1 )
560 305019da 2024-04-29 benni GOTO 1b // noreturn
561 c4d2dd8a 2024-04-29 benni
562 305019da 2024-04-29 benni 2: // ( len src dest )
563 305019da 2024-04-29 benni .quad TDROP // ( dest )
564 305019da 2024-04-29 benni .quad DROP // ( )
565 305019da 2024-04-29 benni .quad EXIT
566 b0948a21 2024-04-29 benni
567 c4d2dd8a 2024-04-29 benni // ( name namelen -- )
568 c4d2dd8a 2024-04-29 benni defword "CREATE", 6, CREATE, CMOVE
569 c4d2dd8a 2024-04-29 benni // store the link pointer
570 c4d2dd8a 2024-04-29 benni .quad LATEST, FETCH
571 c4d2dd8a 2024-04-29 benni .quad HERE, FETCH
572 c4d2dd8a 2024-04-29 benni .quad STORE
573 c4d2dd8a 2024-04-29 benni
574 c4d2dd8a 2024-04-29 benni // update LATEST
575 c4d2dd8a 2024-04-29 benni .quad HERE, FETCH
576 c4d2dd8a 2024-04-29 benni .quad LATEST
577 c4d2dd8a 2024-04-29 benni .quad STORE
578 c4d2dd8a 2024-04-29 benni
579 c4d2dd8a 2024-04-29 benni // store name length
580 c4d2dd8a 2024-04-29 benni .quad OVER
581 c4d2dd8a 2024-04-29 benni .quad HERE, FETCH
582 c4d2dd8a 2024-04-29 benni .quad LIT, 8
583 c4d2dd8a 2024-04-29 benni .quad ADD
584 c4d2dd8a 2024-04-29 benni .quad STOREBYTE
585 b0948a21 2024-04-29 benni
586 c4d2dd8a 2024-04-29 benni // HERE += 9
587 c4d2dd8a 2024-04-29 benni .quad HERE
588 c4d2dd8a 2024-04-29 benni .quad DUP
589 c4d2dd8a 2024-04-29 benni .quad FETCH
590 c4d2dd8a 2024-04-29 benni .quad LIT, 9
591 c4d2dd8a 2024-04-29 benni .quad ADD
592 c4d2dd8a 2024-04-29 benni .quad SWAP
593 c4d2dd8a 2024-04-29 benni .quad STORE
594 c4d2dd8a 2024-04-29 benni
595 c4d2dd8a 2024-04-29 benni // copy name
596 c4d2dd8a 2024-04-29 benni .quad OVER
597 c4d2dd8a 2024-04-29 benni .quad SWAP
598 c4d2dd8a 2024-04-29 benni .quad HERE, FETCH
599 c4d2dd8a 2024-04-29 benni .quad SWAP
600 c4d2dd8a 2024-04-29 benni .quad CMOVE
601 c4d2dd8a 2024-04-29 benni
602 c4d2dd8a 2024-04-29 benni // update HERE
603 c4d2dd8a 2024-04-29 benni .quad HERE // ( &HERE namelen )
604 c4d2dd8a 2024-04-29 benni .quad DUP // ( &HERE &HERE namelen )
605 c4d2dd8a 2024-04-29 benni .quad FETCH // ( HERE &HERE namelen )
606 c4d2dd8a 2024-04-29 benni .quad ROT // ( namelen HERE &HERE )
607 c4d2dd8a 2024-04-29 benni .quad ADD // ( newHERE &HERE )
608 c4d2dd8a 2024-04-29 benni .quad LIT, 7 // ( 7 newHERE &HERE )
609 c4d2dd8a 2024-04-29 benni .quad ADD // ( newHERE &HERE)
610 c4d2dd8a 2024-04-29 benni .quad LIT, ~7 // ( ~7 newHERE &HERE )
611 c4d2dd8a 2024-04-29 benni .quad AND // ( newHERE &HERE )
612 c4d2dd8a 2024-04-29 benni .quad SWAP // ( &HERE newHERE )
613 c4d2dd8a 2024-04-29 benni .quad STORE // ( )
614 c4d2dd8a 2024-04-29 benni
615 c4d2dd8a 2024-04-29 benni .quad EXIT
616 c4d2dd8a 2024-04-29 benni
617 c7d7ae29 2024-04-29 benni // ( str len -- err val )
618 c7d7ae29 2024-04-29 benni defword "NUMBER", 6, NUMBER, CREATE
619 c7d7ae29 2024-04-29 benni .quad OVER // ( len str len )
620 c7d7ae29 2024-04-29 benni GOTOZ 1f // ( str len )
621 b0948a21 2024-04-29 benni
622 c7d7ae29 2024-04-29 benni .quad DUP // ( str str len )
623 c7d7ae29 2024-04-29 benni .quad FETCHBYTE // ( ch str len )
624 c7d7ae29 2024-04-29 benni .quad LIT, '-' // ( '-' ch str len )
625 c7d7ae29 2024-04-29 benni .quad EQ // ( eql str len )
626 c7d7ae29 2024-04-29 benni GOTOZ 2f // ( str len )
627 c7d7ae29 2024-04-29 benni
628 c7d7ae29 2024-04-29 benni .quad LIT, -1 // ( -1 str len )
629 c7d7ae29 2024-04-29 benni .quad TOR // ( str len -- -1 )
630 c7d7ae29 2024-04-29 benni .quad INC // ( str+1 len -- -1 )
631 c7d7ae29 2024-04-29 benni .quad SWAP // ( len str+1 -- -1 )
632 c7d7ae29 2024-04-29 benni .quad DEC // ( len-1 str+1 -- -1 )
633 c7d7ae29 2024-04-29 benni .quad SWAP // ( str+1 len -- -1 )
634 c7d7ae29 2024-04-29 benni .quad OVER // ( len str+1 len -- -1 )
635 c7d7ae29 2024-04-29 benni .quad EQZ // ( !len str+1 len -- -1 )
636 c7d7ae29 2024-04-29 benni GOTOZ 3f // ( str+1 len -- -1 )
637 c7d7ae29 2024-04-29 benni
638 c7d7ae29 2024-04-29 benni .quad RDROP // ( str len )
639 c7d7ae29 2024-04-29 benni GOTO 1f // noreturn
640 c7d7ae29 2024-04-29 benni
641 c7d7ae29 2024-04-29 benni 2:
642 c7d7ae29 2024-04-29 benni .quad LIT, 1 // ( 1 str len )
643 c7d7ae29 2024-04-29 benni .quad TOR // ( str len -- 1 )
644 c7d7ae29 2024-04-29 benni
645 c7d7ae29 2024-04-29 benni 3:
646 c7d7ae29 2024-04-29 benni .quad LIT, 0 // ( 0 str len -- neg )
647 c7d7ae29 2024-04-29 benni .quad TOR // ( str len -- 0 neg )
648 c7d7ae29 2024-04-29 benni
649 c7d7ae29 2024-04-29 benni 4: // ( str len -- 0 neg )
650 c7d7ae29 2024-04-29 benni .quad DUP // ( str str len -- val neg )
651 c7d7ae29 2024-04-29 benni .quad FETCHBYTE // ( ch str len -- val neg )
652 c7d7ae29 2024-04-29 benni .quad LIT, '0' // ( '0' ch str len -- val neg )
653 c7d7ae29 2024-04-29 benni .quad OVER // ( ch '0' ch str len -- val neg )
654 c7d7ae29 2024-04-29 benni .quad LT // ( lt ch str len -- val neg )
655 c7d7ae29 2024-04-29 benni GOTONZ 5f // ( ch str len -- val neg )
656 c7d7ae29 2024-04-29 benni
657 c7d7ae29 2024-04-29 benni // ( ch str len -- val neg )
658 c7d7ae29 2024-04-29 benni .quad DUP // ( ch ch str len -- val neg )
659 c7d7ae29 2024-04-29 benni .quad LIT, '9' // ( '9' ch ch str len -- val neg )
660 c7d7ae29 2024-04-29 benni .quad LT // ( lt ch str len -- val neg )
661 c7d7ae29 2024-04-29 benni GOTONZ 5f // ( ch str len -- val neg )
662 c7d7ae29 2024-04-29 benni
663 c7d7ae29 2024-04-29 benni .quad LIT, '0' // ( '0' ch str len -- val neg )
664 c7d7ae29 2024-04-29 benni .quad SUB // ( dig str len -- val neg )
665 c7d7ae29 2024-04-29 benni .quad FROMR // ( val dig str len -- neg )
666 c7d7ae29 2024-04-29 benni .quad LIT, 10 // ( 10 val dig str len -- neg )
667 c7d7ae29 2024-04-29 benni .quad MUL // ( val dig str len -- neg )
668 c7d7ae29 2024-04-29 benni .quad ADD // ( val str len -- neg )
669 c7d7ae29 2024-04-29 benni .quad TOR // ( str len -- val neg )
670 c7d7ae29 2024-04-29 benni
671 c7d7ae29 2024-04-29 benni .quad INC // ( str+1 len -- val neg )
672 c7d7ae29 2024-04-29 benni .quad SWAP // ( len str+1 -- val neg )
673 c7d7ae29 2024-04-29 benni .quad DEC // ( len-1 str+1 -- val neg )
674 c7d7ae29 2024-04-29 benni .quad SWAP // ( str+1 len-1 -- val neg )
675 c7d7ae29 2024-04-29 benni .quad OVER // ( len-1 str+1 len-1 -- val neg )
676 c7d7ae29 2024-04-29 benni GOTONZ 4b // ( str+1 len-1 -- val neg )
677 c7d7ae29 2024-04-29 benni
678 c7d7ae29 2024-04-29 benni .quad TDROP // ( -- val neg )
679 c7d7ae29 2024-04-29 benni .quad FROMR // ( val -- neg )
680 c7d7ae29 2024-04-29 benni .quad FROMR // ( neg val )
681 c7d7ae29 2024-04-29 benni .quad MUL // ( val )
682 c7d7ae29 2024-04-29 benni .quad LIT, -1 // ( -1 val )
683 c7d7ae29 2024-04-29 benni .quad EXIT
684 c7d7ae29 2024-04-29 benni
685 c7d7ae29 2024-04-29 benni 5: // invalid char ( ch str len -- val neg )
686 c7d7ae29 2024-04-29 benni .quad DROP // ( str len -- val neg )
687 c7d7ae29 2024-04-29 benni .quad RDROP // ( str len -- neg )
688 c7d7ae29 2024-04-29 benni .quad RDROP // ( str len )
689 c7d7ae29 2024-04-29 benni GOTO 1f // noreturn
690 c7d7ae29 2024-04-29 benni
691 c7d7ae29 2024-04-29 benni 1: // empty string ( str len )
692 c7d7ae29 2024-04-29 benni .quad TDROP // ( )
693 c7d7ae29 2024-04-29 benni .quad LIT, 0 // ( 0 )
694 c7d7ae29 2024-04-29 benni .quad DUP // ( 0 0 )
695 c7d7ae29 2024-04-29 benni .quad EXIT // noreturn
696 c7d7ae29 2024-04-29 benni
697 c7d7ae29 2024-04-29 benni
698 305019da 2024-04-29 benni defcode "ERROR", 5, ERROR, NUMBER
699 305019da 2024-04-29 benni la a0, .Lerr
700 305019da 2024-04-29 benni jal puts
701 305019da 2024-04-29 benni la PC, cold_start
702 305019da 2024-04-29 benni NEXT
703 b0948a21 2024-04-29 benni
704 305019da 2024-04-29 benni defcode "TELL", 4, TELL, ERROR
705 305019da 2024-04-29 benni li a0, 1
706 305019da 2024-04-29 benni POP a1
707 305019da 2024-04-29 benni POP a2
708 305019da 2024-04-29 benni jal write
709 b0948a21 2024-04-29 benni NEXT
710 b0948a21 2024-04-29 benni
711 305019da 2024-04-29 benni defcode "ENTER", 5, ENTER, TELL
712 305019da 2024-04-29 benni POP t0
713 b0948a21 2024-04-29 benni ld a0, 0(t0)
714 b0948a21 2024-04-29 benni jr a0
715 b0948a21 2024-04-29 benni
716 305019da 2024-04-29 benni defword "INTERPRET", 9, INTERPRET, ENTER
717 305019da 2024-04-29 benni .quad WORD // ( word wordlen )
718 305019da 2024-04-29 benni
719 305019da 2024-04-29 benni // check if length=0
720 305019da 2024-04-29 benni .quad OVER // ( wordlen word wordlen )
721 305019da 2024-04-29 benni .quad EQZ // ( wordlen==0 word wordlen )
722 305019da 2024-04-29 benni GOTOZ 1f // ( word wordlen )
723 305019da 2024-04-29 benni .quad LIT, 0 // ( 0 )
724 305019da 2024-04-29 benni .quad DONE // noreturn
725 305019da 2024-04-29 benni
726 305019da 2024-04-29 benni 1: // find word in dictionary
727 305019da 2024-04-29 benni .quad TDUP // ( name namelen name namelen )
728 305019da 2024-04-29 benni .quad FIND // ( word name namelen )
729 b0948a21 2024-04-29 benni
730 305019da 2024-04-29 benni // word == NULL ?
731 305019da 2024-04-29 benni .quad DUP // ( word word name namelen )
732 305019da 2024-04-29 benni GOTOZ 2f // ( word name namelen )
733 305019da 2024-04-29 benni
734 305019da 2024-04-29 benni // clean up stack
735 305019da 2024-04-29 benni .quad TOR // ( name namelen -- word )
736 305019da 2024-04-29 benni .quad TDROP // ( -- word )
737 305019da 2024-04-29 benni .quad FROMR // ( word )
738 305019da 2024-04-29 benni
739 305019da 2024-04-29 benni // check if word is immediate
740 305019da 2024-04-29 benni .quad DUP // ( word word )
741 305019da 2024-04-29 benni .quad LIT, 8 // ( 8 word word )
742 305019da 2024-04-29 benni .quad ADD // ( word+8 word )
743 305019da 2024-04-29 benni .quad FETCHBYTE // ( nf word )
744 305019da 2024-04-29 benni .quad LIT, F_IMMED // ( F_IMMED nf word )
745 305019da 2024-04-29 benni .quad AND // ( imm word )
746 305019da 2024-04-29 benni .quad EQZ // ( !imm word )
747 305019da 2024-04-29 benni GOTOZ 3f // ( word )
748 b0948a21 2024-04-29 benni
749 305019da 2024-04-29 benni // check if were compiling
750 305019da 2024-04-29 benni .quad STATE, FETCH // ( state word )
751 305019da 2024-04-29 benni GOTOZ 3f // ( word )
752 b0948a21 2024-04-29 benni
753 305019da 2024-04-29 benni .quad TCFA // ( *cw )
754 305019da 2024-04-29 benni .quad COMMA // ( )
755 305019da 2024-04-29 benni .quad EXIT // noreturn
756 b0948a21 2024-04-29 benni
757 305019da 2024-04-29 benni 3: // execute word
758 305019da 2024-04-29 benni .quad TCFA // ( &cw )
759 305019da 2024-04-29 benni .quad ENTER // noreturn
760 305019da 2024-04-29 benni .quad EXIT
761 b0948a21 2024-04-29 benni
762 305019da 2024-04-29 benni 2: // not found, maybe number ( word name namelen )
763 305019da 2024-04-29 benni .quad DROP // ( name namelen )
764 305019da 2024-04-29 benni .quad NUMBER // ( err value )
765 305019da 2024-04-29 benni GOTOZ 4f // ( value )
766 305019da 2024-04-29 benni
767 305019da 2024-04-29 benni .quad STATE, FETCH // ( imm value )
768 305019da 2024-04-29 benni GOTOZ 5f // ( value )
769 b0948a21 2024-04-29 benni
770 305019da 2024-04-29 benni // compile number
771 305019da 2024-04-29 benni .quad LIT, LIT // ( LIT value )
772 305019da 2024-04-29 benni .quad COMMA // ( value )
773 305019da 2024-04-29 benni .quad COMMA // ( )
774 305019da 2024-04-29 benni .quad EXIT // noreturn
775 b0948a21 2024-04-29 benni
776 305019da 2024-04-29 benni 5: // push number
777 305019da 2024-04-29 benni .quad EXIT // ( value ), noreturn
778 305019da 2024-04-29 benni
779 305019da 2024-04-29 benni 4: // not found
780 305019da 2024-04-29 benni .quad DROP // ( )
781 305019da 2024-04-29 benni .quad ERROR // noreturn
782 305019da 2024-04-29 benni
783 b0948a21 2024-04-29 benni defword "QUIT", 4, QUIT, INTERPRET
784 b0948a21 2024-04-29 benni .quad R0, RSPSTORE
785 b0948a21 2024-04-29 benni .quad INTERPRET
786 b0948a21 2024-04-29 benni .quad BRANCH, -16
787 b0948a21 2024-04-29 benni
788 b0948a21 2024-04-29 benni defcode "!", 1, STORE, QUIT
789 b0948a21 2024-04-29 benni POP t0
790 b0948a21 2024-04-29 benni POP t1
791 b0948a21 2024-04-29 benni sd t1, 0(t0)
792 b0948a21 2024-04-29 benni NEXT
793 b0948a21 2024-04-29 benni
794 b0948a21 2024-04-29 benni defcode "@", 1, FETCH, STORE
795 b0948a21 2024-04-29 benni POP t0
796 b0948a21 2024-04-29 benni ld t0, 0(t0)
797 b0948a21 2024-04-29 benni PUSH t0
798 b0948a21 2024-04-29 benni NEXT
799 b0948a21 2024-04-29 benni
800 b0948a21 2024-04-29 benni defcode "C!", 2, STOREBYTE, FETCH
801 b0948a21 2024-04-29 benni POP t0
802 b0948a21 2024-04-29 benni POP t1
803 b0948a21 2024-04-29 benni sb t1, 0(t0)
804 b0948a21 2024-04-29 benni NEXT
805 b0948a21 2024-04-29 benni
806 b0948a21 2024-04-29 benni defcode "C@", 2, FETCHBYTE, STOREBYTE
807 b0948a21 2024-04-29 benni POP t0
808 b0948a21 2024-04-29 benni lbu t0, 0(t0)
809 b0948a21 2024-04-29 benni PUSH t0
810 b0948a21 2024-04-29 benni NEXT
811 b0948a21 2024-04-29 benni
812 b0948a21 2024-04-29 benni defcode ".", 1, PRINT, FETCHBYTE
813 b0948a21 2024-04-29 benni POP a1
814 b0948a21 2024-04-29 benni la a0, .Lfmt
815 b0948a21 2024-04-29 benni jal printf
816 b0948a21 2024-04-29 benni NEXT
817 b0948a21 2024-04-29 benni
818 4c79a926 2024-04-29 benni // ( word )
819 4c79a926 2024-04-29 benni defword ",", 1, COMMA, PRINT
820 4c79a926 2024-04-29 benni .quad HERE // ( &HERE word )
821 4c79a926 2024-04-29 benni .quad SWAP // ( word &HERE )
822 4c79a926 2024-04-29 benni .quad OVER // ( &HERE word &HERE )
823 4c79a926 2024-04-29 benni .quad FETCH // ( HERE word &HERE )
824 4c79a926 2024-04-29 benni .quad SWAP // ( word HERE &HERE )
825 4c79a926 2024-04-29 benni .quad OVER // ( HERE word HERE &HERE )
826 4c79a926 2024-04-29 benni .quad STORE // ( HERE &HERE )
827 4c79a926 2024-04-29 benni .quad LIT, 8 // ( 8 HERE &HERE )
828 4c79a926 2024-04-29 benni .quad ADD // ( HERE+8 &HERE )
829 4c79a926 2024-04-29 benni .quad SWAP // ( &HERE HERE+8 )
830 4c79a926 2024-04-29 benni .quad STORE // ( )
831 4c79a926 2024-04-29 benni .quad EXIT // noreturn
832 b0948a21 2024-04-29 benni
833 b0948a21 2024-04-29 benni defcode "'", 1, TICK, COMMA
834 b0948a21 2024-04-29 benni ld a0, 0(PC)
835 b0948a21 2024-04-29 benni addi PC, PC, 8
836 b0948a21 2024-04-29 benni PUSH a0
837 b0948a21 2024-04-29 benni NEXT
838 b0948a21 2024-04-29 benni
839 b6e62660 2024-04-30 benni defword "[']", 3, BTICK, TICK, F_IMMED
840 b6e62660 2024-04-30 benni .quad WORD
841 b6e62660 2024-04-30 benni .quad FIND
842 b6e62660 2024-04-30 benni .quad TCFA
843 b6e62660 2024-04-30 benni .quad EXIT
844 b6e62660 2024-04-30 benni
845 b6e62660 2024-04-30 benni defword "[", 1, LBRACK, BTICK, F_IMMED
846 b0948a21 2024-04-29 benni .quad LIT, 0
847 b0948a21 2024-04-29 benni .quad STATE
848 b0948a21 2024-04-29 benni .quad STORE
849 b0948a21 2024-04-29 benni .quad EXIT
850 b0948a21 2024-04-29 benni
851 b0948a21 2024-04-29 benni defword "]", 1, RBRACK, LBRACK
852 b0948a21 2024-04-29 benni .quad LIT, 1
853 b0948a21 2024-04-29 benni .quad STATE
854 b0948a21 2024-04-29 benni .quad STORE
855 b0948a21 2024-04-29 benni .quad EXIT
856 b0948a21 2024-04-29 benni
857 b0948a21 2024-04-29 benni defword "HIDDEN", 6, HIDDEN, RBRACK
858 b0948a21 2024-04-29 benni .quad LIT, 8
859 b0948a21 2024-04-29 benni .quad ADD
860 b0948a21 2024-04-29 benni .quad DUP
861 b0948a21 2024-04-29 benni .quad FETCHBYTE
862 b0948a21 2024-04-29 benni .quad LIT, F_HIDDEN
863 b0948a21 2024-04-29 benni .quad XOR
864 b0948a21 2024-04-29 benni .quad SWAP
865 b0948a21 2024-04-29 benni .quad STOREBYTE
866 b0948a21 2024-04-29 benni .quad EXIT
867 b0948a21 2024-04-29 benni
868 b0948a21 2024-04-29 benni defword "HIDE", 4, HIDE, HIDDEN
869 b0948a21 2024-04-29 benni .quad LATEST, FETCH
870 b0948a21 2024-04-29 benni .quad HIDDEN
871 b0948a21 2024-04-29 benni .quad EXIT
872 b0948a21 2024-04-29 benni
873 b0948a21 2024-04-29 benni defword "IMMEDIATE", 9, IMMEDIATE, HIDE
874 b0948a21 2024-04-29 benni .quad LATEST, FETCH
875 b0948a21 2024-04-29 benni .quad LIT, 8
876 b0948a21 2024-04-29 benni .quad ADD
877 b0948a21 2024-04-29 benni .quad DUP
878 b0948a21 2024-04-29 benni .quad FETCHBYTE
879 b0948a21 2024-04-29 benni .quad LIT, F_IMMED
880 b0948a21 2024-04-29 benni .quad XOR
881 b0948a21 2024-04-29 benni .quad SWAP
882 b0948a21 2024-04-29 benni .quad STOREBYTE
883 b0948a21 2024-04-29 benni .quad EXIT
884 b0948a21 2024-04-29 benni
885 b0948a21 2024-04-29 benni defcode "LIT", 3, LIT, IMMEDIATE
886 b0948a21 2024-04-29 benni ld t0, 0(PC)
887 b0948a21 2024-04-29 benni addi PC, PC, 8
888 b0948a21 2024-04-29 benni PUSH t0
889 b0948a21 2024-04-29 benni NEXT
890 b0948a21 2024-04-29 benni
891 b0948a21 2024-04-29 benni defword ":", 1, COLON, LIT
892 b0948a21 2024-04-29 benni .quad WORD
893 b0948a21 2024-04-29 benni .quad CREATE
894 b0948a21 2024-04-29 benni .quad LIT, DOCOL, COMMA
895 b0948a21 2024-04-29 benni .quad LATEST, FETCH, HIDDEN
896 b0948a21 2024-04-29 benni .quad RBRACK
897 b0948a21 2024-04-29 benni .quad EXIT
898 b0948a21 2024-04-29 benni
899 b0948a21 2024-04-29 benni defword ";", 1, SEMICOLON, COLON, F_IMMED
900 b0948a21 2024-04-29 benni .quad LIT, EXIT, COMMA
901 b0948a21 2024-04-29 benni .quad LATEST, FETCH, HIDDEN
902 b0948a21 2024-04-29 benni .quad LBRACK
903 b0948a21 2024-04-29 benni .quad EXIT
904 b0948a21 2024-04-29 benni
905 b0948a21 2024-04-29 benni defcode "EXECUTE", 7, EXECUTE, SEMICOLON
906 b0948a21 2024-04-29 benni POP a0
907 b0948a21 2024-04-29 benni jr a0
908 b0948a21 2024-04-29 benni
909 b0948a21 2024-04-29 benni defcode "EMIT", 4, EMIT, EXECUTE
910 b0948a21 2024-04-29 benni POP a0
911 b0948a21 2024-04-29 benni jal _EMIT
912 b0948a21 2024-04-29 benni NEXT
913 b0948a21 2024-04-29 benni
914 b0948a21 2024-04-29 benni defcode "CHAR", 4, CHAR, EMIT
915 b0948a21 2024-04-29 benni jal _WORD
916 b0948a21 2024-04-29 benni lbu a0, 0(a0)
917 b0948a21 2024-04-29 benni PUSH a0
918 b0948a21 2024-04-29 benni NEXT
919 b0948a21 2024-04-29 benni
920 58a4e61d 2024-04-29 benni // ( word -- &cw )
921 58a4e61d 2024-04-29 benni defword "TCFA", 4, TCFA, CHAR
922 58a4e61d 2024-04-29 benni .quad LIT, 8 // ( 8 word )
923 58a4e61d 2024-04-29 benni .quad ADD // ( &flags )
924 58a4e61d 2024-04-29 benni .quad DUP // ( &flags &flags )
925 58a4e61d 2024-04-29 benni .quad FETCHBYTE // ( flags &flags )
926 58a4e61d 2024-04-29 benni .quad LIT, F_LENMASK // ( F_LENMASK flags &flags )
927 58a4e61d 2024-04-29 benni .quad AND // ( len &flags )
928 58a4e61d 2024-04-29 benni .quad ADD // ( ptr )
929 58a4e61d 2024-04-29 benni .quad LIT, 8 // ( 8 ptr )
930 58a4e61d 2024-04-29 benni .quad ADD // ( ptr )
931 58a4e61d 2024-04-29 benni .quad LIT, ~7 // ( ~7 ptr )
932 58a4e61d 2024-04-29 benni .quad AND // ( &cw )
933 58a4e61d 2024-04-29 benni .quad EXIT
934 b0948a21 2024-04-29 benni
935 b0948a21 2024-04-29 benni defword "RECURSE", 7, RECURSE, TCFA, F_IMMED
936 b0948a21 2024-04-29 benni .quad LATEST, FETCH
937 b0948a21 2024-04-29 benni .quad TCFA
938 b0948a21 2024-04-29 benni .quad COMMA
939 b0948a21 2024-04-29 benni .quad EXIT
940 b0948a21 2024-04-29 benni
941 b0948a21 2024-04-29 benni defvar "LATEST", 6, LATEST, RECURSE, name_R0
942 b0948a21 2024-04-29 benni defvar "HERE", 4, HERE, LATEST, memory
943 b0948a21 2024-04-29 benni defvar "STATE", 5, STATE, HERE
944 b0948a21 2024-04-29 benni defvar "S0", 2, S0, STATE
945 b0948a21 2024-04-29 benni defconst "R0", 2, R0, S0, return_stack
946 b0948a21 2024-04-29 benni
947 b0948a21 2024-04-29 benni .section .rodata
948 b0948a21 2024-04-29 benni .Lerr:
949 b0948a21 2024-04-29 benni .asciz "not found"
950 b0948a21 2024-04-29 benni .Lfmt:
951 b0948a21 2024-04-29 benni .asciz "%d\n"
952 b0948a21 2024-04-29 benni .Lhex:
953 b0948a21 2024-04-29 benni .asciz "%#x\n"
954 b0948a21 2024-04-29 benni
955 b0948a21 2024-04-29 benni .section .bss
956 b0948a21 2024-04-29 benni wordlen:
957 b0948a21 2024-04-29 benni .skip 8
958 b0948a21 2024-04-29 benni wordbuf:
959 b0948a21 2024-04-29 benni .skip WORDLEN + 1
960 b0948a21 2024-04-29 benni
961 305019da 2024-04-29 benni .align 8
962 b0948a21 2024-04-29 benni .skip 4096
963 b0948a21 2024-04-29 benni return_stack:
964 b0948a21 2024-04-29 benni .skip 4096
965 b0948a21 2024-04-29 benni data_stack:
966 b0948a21 2024-04-29 benni .align 8
967 b0948a21 2024-04-29 benni memory:
968 b0948a21 2024-04-29 benni .skip 65536