The attached patch fixes all of the various combinations of forwards and backwards branches for both bbranch and b?branch. With this patch applied to the latest openbios-svn, I can now run OpenBIOS to the point where it crashes out Qemu checked out a few weeks back. Nice :)
A couple of the fixes in this patch are for bugs introduced in my last commit. Whilst continuing to dig deeper into various bugs, I didn't appreciate at the time that it is not necessarily the description of the branch words that matters, more how they are tokenized by the Fcode evaluator.
For reference, here are the branch test cases I used to verify this behaviour:
\ Testing forward b?branch/bbranch (if/else/then equivalent) \ Forth: 1 if .s else abort then here cc c, \ offset16 a6 c, \ 1 (change to a5 for 0 to pick the else clause) 14 c, 0 c, 7 c, \ b?branch (if) 13 c, 0 c, 4 c, \ bbranch (else) b2 c, \ b(>resolve) 02 c, 16 c, \ abort b2 c, \ b(>resolve) 9f c, \ show stack 00 c, \ end
\ Test backwards b?branch (begin/until equivalent) \ Forth: 0 begin 1 + dup . dup 3 = until drop
here cc c, \ offset16 a5 c, \ 0 b1 c, \ b(<mark) (begin) a6 c, 1e c, \ +1 47 c, \ dup 9d c, 92 c, \ display the number 47 c, \ dup a8 c, \ count to 3 3c c, \ = 14 c, ff c, f7 c, \ b?branch (until) 46 c, \ drop (clear up stack) 0 c, \ End
\ Test backwards bbranch (begin/while/repeat equivalent) \ Forth: 3 begin dup . dup while 1 - repeat drop
here cc c, \ offset16 a8 c, \ 3 b1 c, \ b(<mark) (begin) 47 c, \ dup 9d c, 92 c, \ display the number 47 c, \ dup 14 c, 00 c, 06 c, \ b?branch (while) a6 c, 1f c, \ -1 13 c, ff c, f6 c, \ bbranch (repeat) b2 c, \ b(>resolve) 46 c, \ drop 00 c, \ end