X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=main.asm;h=e5444b87a58ba20ad0f984627d05ef0e99efecec;hb=ad2d7300c0ec7b547259fdfd682bb7f0ee6a01ab;hp=d206134c08b968bee7d52fb94564de5c4bff8c6f;hpb=8bbafbbf07642341c7134325e8e743259cb159b0;p=rrq%2Fjonasforth.git diff --git a/main.asm b/main.asm index d206134..e5444b8 100644 --- a/main.asm +++ b/main.asm @@ -50,6 +50,16 @@ EXIT: popr rsi next +;; LIT is a special word that reads the next "word pointer" and causes it to be +;; placed on the stack rather than executed. +LIT: + dq .start +.start: + lodsq + push rax + next + +;; Expects a character on the stack and prints it to standard output. EMIT: dq .start .start: @@ -65,15 +75,10 @@ EMIT: popr rsi next -PUSH_NEWLINE_CHAR: - dq .start -.start: - push $A - next - +;; Prints a newline to standard output. NEWLINE: dq docol - dq PUSH_NEWLINE_CHAR + dq LIT, $A dq EMIT dq EXIT @@ -131,6 +136,8 @@ READ_WORD: ; 400170 next +;; Takes a string (in the form of a pointer and a length on the stack) and +;; prints it to standard output. TYPE: dq .start .start: @@ -147,16 +154,23 @@ TYPE: mov rsi, rbx next -PUSH_HELLO_CHARS: +;; Exit the program cleanly. +TERMINATE: dq .start .start: - push $A - push 'o' - push 'l' - push 'l' - push 'e' - push 'H' - next + mov rax, $3C + mov rdi, 0 + syscall + +PUSH_HELLO_CHARS: + dq docol + dq LIT, $A + dq LIT, 'o' + dq LIT, 'l' + dq LIT, 'l' + dq LIT, 'e' + dq LIT, 'H' + dq EXIT PUSH_YOU_TYPED: dq .start @@ -167,27 +181,21 @@ PUSH_YOU_TYPED: HELLO: dq docol - dq PUSH_HELLO_CHARS - dq EMIT - dq EMIT - dq EMIT - dq EMIT - dq EMIT - dq EMIT + 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 -TERMINATE: - dq .start - .start: - mov rax, $3C - mov rdi, 0 - syscall - MAIN: dq docol dq HELLO dq READ_WORD - dq PUSH_YOU_TYPED + dq LIT, you_typed_string + dq LIT, you_typed_string.length dq TYPE dq TYPE dq NEWLINE @@ -206,7 +214,6 @@ READ_WORD.buffer rb READ_WORD.max_size READ_WORD.length db ? READ_WORD.char_buffer db ? - ;; Return stack rq $2000 return_stack_top: