-
Notifications
You must be signed in to change notification settings - Fork 0
/
forthuna.asm
117 lines (93 loc) · 1.76 KB
/
forthuna.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
section .data
xt_run: dq run
xt_loop: dq main_loop
program_stub: dq 0
warning_message: db "Warning: no such word", 0
imode_message: db "Interpreter mode", 0
cmode_message: db "Compiler mode", 0
mode: dq 0
was_branch: db 0
here: dq forth_mem
stack_start: dq 0
section .bss
resq 1023
rstack_start: resq 1
forth_mem: resq 65536
input_buf: resb 1024
user_buf: resb 1024
%include 'io.inc'
%include 'macros.inc'
%include 'utils.inc'
%include 'dictionary/dict.inc'
const here, [here]
global _start
section .data
last_word: dq link
section .text
_start:
mov rstack, rstack_start
mov stack, stack_start
mov qword[mode], 0
mov pc, xt_run
cmp qword [stack_start], 0
je .first
mov rsp, [stack_start]
jmp next
.first:
mov [stack_start], rsp
jmp next
run:
dq docol_impl
main_loop:
dq xt_buffer
dq xt_read
branchif0 exit
dq xt_buffer
dq xt_find
dq xt_pushmode
branchif0 .interpreter_mode
.compiler_mode:
dq xt_dup
branchif0 .compiler_number
dq xt_cfa
dq xt_isimmediate
branchif0 .not_immediate
.immediate:
dq xt_initcmd
branch main_loop
.not_immediate:
dq xt_isbranch
dq xt_comma
branch main_loop
.compiler_number:
dq xt_drop
;dq xt_buffer
dq xt_parsei
branchif0 .warning
dq xt_wasbranch
branchif0 .lit
dq xt_unsetbranch
dq xt_savenum
branch main_loop
.lit:
dq xt_lit, xt_lit
dq xt_comma
dq xt_comma
branch main_loop
.interpreter_mode:
dq xt_dup
branchif0 .interpreter_number
dq xt_cfa
dq xt_initcmd
branch main_loop
.interpreter_number:
dq xt_drop
dq xt_parsei
branchif0 .warning
branch main_loop
.warning:
dq xt_drop
dq xt_warn
branch main_loop
exit:
dq xt_bye