Reimplement HELLO in Forth
authorJonas Hvid <mail@johv.dk>
Tue, 10 Dec 2019 17:21:41 +0000 (18:21 +0100)
committerJonas Hvid <mail@johv.dk>
Tue, 10 Dec 2019 17:21:41 +0000 (18:21 +0100)
This implementation is a bit awkward right now, but we should be able to clean
it up later.

main.asm
sys.f

index cb2e0d5deb2b08c33e1d7ea4a2bfdc100ae39d12..1a41bb9a2c1dc30f1050200a9e724a56885eff47 100644 (file)
--- a/main.asm
+++ b/main.asm
@@ -235,16 +235,6 @@ forth_asm TERMINATE, 'TERMINATE'
   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
@@ -592,7 +582,6 @@ forth_asm EQL, '='
   next
 
 forth MAIN, 'MAIN'
-  dq HELLO
   dq INTERPRET
   dq BRANCH, -8 * 2
   dq TERMINATE
diff --git a/sys.f b/sys.f
index 09963525c9e3a9f343efdafd87bbf476ca05a252..604d87aa75e71f116f1177d048e18c4028a5b4b6 100644 (file)
--- a/sys.f
+++ b/sys.f
@@ -55,6 +55,29 @@ EXIT [
   DROP SWAP DROP SWAP DROP
 ;
 
+: C,
+  HERE @ C!
+  HERE @ 1 +
+  HERE ! ;
+
+: OVER
+  SWAP DUP ROT ;
+
+: STORE-STRING
+  BEGIN
+    OVER C@ C,
+    SWAP 1 + SWAP
+  1 - DUP 0 = UNTIL
+  DROP DROP ;
+
+S" HELLO-ADDR" CREATE
+S" Hello!" DUP ROT
+STORE-STRING
+: HELLO
+  ' HELLO-ADDR LIT [ , ] TELL NEWLINE ;
+
+HELLO
+
 S" 10 FIB = " TELL
 10 FIB .U
 S"  (Expected: 59)" TELL NEWLINE