X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=main.asm;h=edcba0ae9421c712218041e64d4fc0872370f8d9;hb=2d2c007e5b5e2f9b79271d638863d77338969f38;hp=21a911cf164675d6dba7fc201559d3c77fdb43a3;hpb=2cd770b4f9a46cbc7ff07b26f4851bba1ea36a7d;p=rrq%2Fjonasforth.git diff --git a/main.asm b/main.asm index 21a911c..edcba0a 100644 --- a/main.asm +++ b/main.asm @@ -242,6 +242,15 @@ forth HELLO, 'HELLO' dq NEWLINE dq EXIT +;; 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' + dq READ_WORD + dq FIND + dq TCFA + dq EXEC + dq EXIT + ;; .U prints the value on the stack as an unsigned integer in hexadecimal. forth_asm DOTU, '.U' mov [.length], 0 @@ -303,16 +312,40 @@ forth_asm DOTU, '.U' pop rsi next +;; Takes a value and an address, and stores the value at the given address. +forth_asm PUT, '!' + pop rbx ; Address + pop rax ; Value + mov [rbx], rax + next + +;; Takes an address and returns the value at the given address. +forth_asm GET, '@' + pop rax + mov rax, [rax] + push rax + next + +;; Get the location of the STATE variable. It can be set with '!' and read with +;; '@'. +forth STATE, 'STATE' + dq LIT, var_STATE + dq EXIT + forth MAIN, 'MAIN' dq HELLO - dq READ_WORD, FIND, TCFA, EXEC - dq BRANCH, -8 * 5 + dq INTERPRET + dq BRANCH, -8 * 2 dq TERMINATE segment readable writable latest_entry dq initial_latest_entry +;; The STATE variable is 0 when the interpreter is executing, and non-zero when +;; it is compiling. +var_STATE dq 0 + FIND.rsi dq ? READ_WORD.rsi dq ?