The ms and get-msecs words don't appear to be implemented correctly on OpenBIOS. 10000 ms should pause OpenBIOS for 10 seconds. It does not.
I did find a function called udelay() in the drivers/timer.c file. Maybe I can implement the word us using udelay(). Then the ms word could be implemented using the us word.
See what you can do about : us, but we maybe running into an issue with Qemu/mac99. Every version of the Mac OS reports a different bus and cpu speed, so we maybe having trouble with the way the timebase is calculated in Qemu.
I imagine it is difficult to emulate a fixed frequency isolator, or I’m way off base and people should just ignore me;-)
Just spitballing, really.
I tried to implement the us word but I couldn't figure out how to solve the problem of making udelay() work from forth.c. Any hints would be appreciated.
Here is my work-in-progress patch:
From deba6065416cda16198092f4c5dac0ecab8e0f46 Mon Sep 17 00:00:00 2001 From: John Arbuckle programmingkidx@gmail.com Date: Thu, 21 Dec 2017 11:58:10 -0500 Subject: [PATCH] Attempt to implement the us word
--- kernel/bootstrap.c | 2 +- kernel/forth.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/kernel/bootstrap.c b/kernel/bootstrap.c index b7658ab..6838b40 100644 --- a/kernel/bootstrap.c +++ b/kernel/bootstrap.c @@ -89,7 +89,7 @@ static const char *wordnames[] = { "here", "here!", "dobranch", "do?branch", "unaligned-w@", "unaligned-w!", "unaligned-l@", "unaligned-l!", "ioc@", "iow@", "iol@", "ioc!", "iow!", "iol!", "i", "j", "call", "sys-debug", - "$include", "$encode-file", "(debug", "(debug-off)" + "$include", "$encode-file", "(debug", "(debug-off)", "us" };
/* diff --git a/kernel/forth.c b/kernel/forth.c index 61dd70d..19df6b2 100644 --- a/kernel/forth.c +++ b/kernel/forth.c @@ -12,6 +12,7 @@ #include "kernel/stack.h" #include "kernel/kernel.h" #include "dict.h" +#include "../drivers/timer.h"
/* * cross platform abstraction @@ -1848,6 +1849,15 @@ static void loop_j(void) PUSH(rstack[rstackcnt - 2]); }
+/* implements the forth word us */ +static void microseconds(void) +{ + int time; /* in microseconds or one millionth of a second */ + time = POP(); + printk("Hello from microseconds: %d\n", time); + //udelay(time); +} + /* words[] is a function array of all native code functions used by * the dictionary, i.e. CFAs and primitives. * Any change here needs a matching change in the primitive word's @@ -1963,4 +1973,5 @@ static forth_word * const words[] = { do_encode_file, /* $encode-file */ do_debug_xt, /* (debug */ do_debug_off, /* (debug-off) */ + microseconds /* us */ };