From: Jonas Hvid Date: Tue, 3 Dec 2019 18:54:21 +0000 (+0100) Subject: Automatically parse integers in INTERPRET X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=412aa1087846d432ddc5bb93c3dcb2acf292010c;p=rrq%2Fjonasforth.git Automatically parse integers in INTERPRET --- diff --git a/main.asm b/main.asm index edcba0a..183be74 100644 --- a/main.asm +++ b/main.asm @@ -242,15 +242,55 @@ forth HELLO, 'HELLO' dq NEWLINE dq EXIT +;; Duplicate a pair of elements. +forth_asm PAIRDUP, '2DUP' + pop rbx + pop rax + push rax + push rbx + push rax + push rbx + next + +;; Swap the top two elements on the stack. +forth_asm SWAP, 'SWAP' + pop rax + pop rbx + push rax + push rbx + next + +;; Remove the top element from the stack. +forth_asm DROP, 'DROP' + add rsp, 8 + next + ;; The INTERPRET word reads and interprets user input. It's behavior depends on ;; the current STATE. It provides special handling for integers. (TODO) forth INTERPRET, 'INTERPRET' + ;; Read word dq READ_WORD - dq FIND + dq PAIRDUP + ;; Stack is (word length word length). + dq FIND ; Try to find word + dq DUP_ + dq ZBRANCH, 8 * 8 ; Check if word is found + + ;; Word is found, execute it dq TCFA + ;; Stack is (word length addr) + dq SWAP, DROP + dq SWAP, DROP + ;; Stack is (addr) dq EXEC dq EXIT + ;; No word is found, assume it is an integer literal + ;; Stack is (word length addr) + dq DROP + dq PARSE_NUMBER + dq EXIT + ;; .U prints the value on the stack as an unsigned integer in hexadecimal. forth_asm DOTU, '.U' mov [.length], 0