balaton at eik.bme.hu
Thu Dec 21 18:56:42 CET 2017
On Thu, 21 Dec 2017, Jd Lyons wrote:
>> On Dec 21, 2017, at 9:59 AM, Programmingkid <programmingkidx at gmail.com> wrote:
>>> On Dec 21, 2017, at 9:36 AM, Jd Lyons <lyons_dj at yahoo.com> wrote:
>>> I don’t know, this maybe an issue with the way we have defined “us”.
I'm not sure the us word is related to problems with b?branch but I don't
know anything about this other than reading the conversation here. They
look unrelated to me but it could well be I did not undersand this at all.
>>> Looking through the SLOF code it seems they call it like this in the timebase.fs:
>>> : tb@ ( -- tb )
>>> BEGIN tbu@ tbl@ tbu@ rot over <> WHILE 2drop REPEAT
>>> 20 lshift swap ffffffff and or
>>> : milliseconds ( -- ms ) tb@ d# 1000 * tb-frequency / ;
>>> : microseconds ( -- us ) tb@ d# 1000000 * tb-frequency / ;
>>> : ms ( ms-to-wait -- ) milliseconds + BEGIN milliseconds over >= UNTIL drop ;
>>> : get-msecs ( -- n ) milliseconds ;
>>> : us ( us-to-wait -- ) microseconds + BEGIN microseconds over >= UNTIL drop ;
>>> Not sure if I can port/hack this code over, the copier seems to have trouble with tbu@ tbl@?
>> 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 think you have two choices for this:
1. Either export udelay (or _wait_ticks it's based on) to Forth and
implement these words based on that. But this comment in drivers/timer.c:
* TODO: pass via lb table
unsigned long timer_freq = 10000000 / 4;
suggests you may need to fix this first to take into accound the actual TB
frequency from the CPU instead of some hardcoded value.
2. Alternatively, you could either add new helpers (maybe in
arch/ppc/timebase.S) to implement tbl@ and tbu@ which probably should just
do mftb and mftbu respectively or export to Forth the already existing
_get_ticks which returns these as a combined 64 bit value and derive the
lower and upper 32 bits from Forth and then maybe you can use the above
implementation from SLOF.
More information about the OpenBIOS