[OpenBIOS] [PATCH 1/3] bootstrap.fs: add pseudo r-stack implementation for interpret mode

Segher Boessenkool segher at kernel.crashing.org
Sun Jul 17 21:37:56 CEST 2016


On Sun, Jul 17, 2016 at 08:21:58PM +0100, Mark Cave-Ayland wrote:
> >>>> +: >r state @ if ['] >r , exit then r> swap prstack-push >r ; immediate
> >>>> +: r> state @ if ['] r> , exit then r> prstack-pop swap >r ; immediate
> >>>> +: r@ state @ if ['] r@ , exit then r> prstack-pop dup prstack-push swap >r ; immediate
> >>
> >> Btw, why do you need those  r> ... smth ... >r  gymnastics?
> > 
> > Hrm, okay, coffee helps thinking...  Could use some documenting ;-)
> 
> As you've already worked out, the reason is that : calls the primitive
> docol which always pushes the caller onto the r-stack when calling
> another Forth word. Hence there's an extra parameter on the r-stack that
> needs to be juggled to make sure the >r primword and the resulting
> parameter are placed back correctly on the r-stack.
> 
> Regarding the documentation, I wasn't too worried about this since it's
> fairly obvious that calling another word is going to involve another
> r-stack push from the caller (and indeed it was the first thing that
> stood out when I tried your code in the debugger).

It surprises me every. single. time.

> If you would like to suggest something suitable in a maximum of a couple
> of lines you think would help then I don't mind adding it in a v2,
> however compared to other undocumented gotchas in the Forth code I've
> come across whilst working on OpenBIOS this was very easy to figure out
> so I can't get too excited about it.

\ WARNING: Deep magic ahead!


Segher



More information about the OpenBIOS mailing list