From: Jonas Hvid Date: Sun, 8 Mar 2020 14:48:18 +0000 (+0100) Subject: Implement POP-WORD X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=bb3723bbe99455e7b95d5376758047563bd72eed;p=rrq%2Fjonasforth.git Implement POP-WORD --- diff --git a/example.f b/example.f index 547887f..f5215db 100644 --- a/example.f +++ b/example.f @@ -25,9 +25,12 @@ S" 10 FIB = " TELL 10 FIB .U SPACE S" (Expected: 59)" TELL NEWLINE -S" Word:" TELL NEWLINE -SYSCODE POP-WORD TELL NEWLINE -S" Remaining:" TELL NEWLINE -TELL +SYSCODE +S" Word: " TELL POP-WORD TELL NEWLINE +S" Word: " TELL POP-WORD TELL NEWLINE +S" Word: " TELL POP-WORD TELL NEWLINE +S" Word: " TELL POP-WORD TELL NEWLINE +S" Word: " TELL POP-WORD TELL NEWLINE +S" Word: " TELL POP-WORD TELL NEWLINE TERMINATE diff --git a/impl.asm b/impl.asm index c713036..070ad2a 100644 --- a/impl.asm +++ b/impl.asm @@ -142,11 +142,41 @@ read_word: ;; * rdi = Word buffer ;; * rdx = Length of word buffer pop_word: - mov rdi, rsi - mov rdx, 10 +.skip_whitespace: + mov al, [rsi] + cmp al, ' ' + je .got_whitespace + cmp al, $A + je .got_whitespace + jmp .alpha +.got_whitespace: + ;; The buffer starts with whitespace; discard the first character from the buffer. + inc rsi + dec rcx + jmp .skip_whitespace - add rsi, 10 - sub rcx, 10 +.alpha: + ;; We got a character that wasn't whitespace. Now read the actual word. + mov rdi, rsi ; This is where the word starts + mov rdx, 1 ; Length of word + +.read_alpha: + ;; Extract character from original buffer: + inc rsi + dec rcx + + ;; When we hit whitespace, we are done with this word + mov al, [rsi] + cmp al, ' ' + je .end + cmp al, $A + je .end + + ;; It wasn't whitespace; add it to word buffer + inc rdx + jmp .read_alpha + +.end: ret