;; Takes a string on the stack and replaces it with the decimal number that the
;; string represents.
forth_asm PARSE_NUMBER, 'PARSE-NUMBER'
- pop [parse_number.length] ; Length
- pop [parse_number.buffer] ; String pointer
+ pop rcx ; Length
+ pop rdi ; String pointer
push rsi
call parse_number
mov rdi, 0
syscall
-forth HELLO, 'HELLO'
- dq LIT, 'H', EMIT
- dq LIT, 'e', EMIT
- dq LIT, 'l', EMIT
- dq LIT, 'l', EMIT
- dq LIT, 'o', EMIT
- dq LIT, '!', EMIT
- dq NEWLINE
- dq EXIT
-
;; Duplicate a pair of elements.
forth_asm PAIRDUP, '2DUP'
pop rbx
;; Stack is (word length word length).
dq FIND ; Try to find word
dq DUP_
- dq ZBRANCH, 8 * 20 ; Check if word is found
+ dq ZBRANCH, 8 * 22 ; Check if word is found
;; - Word is found -
- dq STATE, GET, ZBRANCH, 8 * 9 ; Check whether we are in compilation or immediate mode
+ dq STATE, GET, ZBRANCH, 8 * 11 ; Check whether we are in compilation or immediate mode
;; (Word found, compilation mode)
- dq DUP_, IS_IMMEDIATE, NOT_, ZBRANCH, 8 * 4 ; If the word is immediate, continue as we would in immediate mode
+ dq DUP_, IS_IMMEDIATE, NOT_, ZBRANCH, 8 * 6 ; If the word is immediate, continue as we would in immediate mode
;; Otherwise, we want to compile this word
dq TCFA
dq COMMA
+ dq DROP, DROP
dq EXIT
;; (Word found, immediate mode)
dq LIT, 1, STATE, PUT_BYTE
dq EXIT
+forth_asm TICK, "'"
+ lodsq
+ push rax
+ next
+
+forth_asm ROT, 'ROT'
+ pop rax
+ pop rbx
+ pop rdx
+ push rax
+ push rdx
+ push rbx
+ next
+
+forth_asm PICK, 'PICK'
+ pop rax
+ lea rax, [rsp + 8 * rax]
+ mov rax, [rax]
+ push rax
+ next
+
+forth_asm EQL, '='
+ pop rax
+ pop rbx
+ cmp rax, rbx
+ je .eq
+.noteq:
+ push 0
+ next
+.eq:
+ push 1
+ next
+
forth MAIN, 'MAIN'
- dq HELLO
dq INTERPRET
dq BRANCH, -8 * 2
dq TERMINATE
;; Reserve space for compiled words, accessed through HERE.
here dq here_top
-here_top rq $2000
+here_top rq $4000
;; Return stack
rq $2000