Limit ourselves to 8-bit branching

I'm planning on going back to 8-bit branching. 16-bit br cells incur
a non-negligible penalty and, while at first 64 words (128 bytes
forward or backward) seemed a bit limiting, I now don't see why one
would ever construct such a big branch. It would be un-forthy.

Also, I looked at using BC instead of IY to hold IP and the transition
would be a lot easier with 8-bit branching.

In this commit, all I do is add overflow checks in IF. The mechanic
below doesn't change. I'll give myself some time to think it over so
that I avoid yet another back and forth.
This commit is contained in:
Virgil Dupras 2020-05-24 10:01:46 -04:00
parent 5bbc256faf
commit ed2b91411a
6 changed files with 22 additions and 10 deletions

View File

@ -1 +1,2 @@
21 How blocks are organized 22 Addressed devices 21 How blocks are organized 22 Addressed devices
23 Branching

11
blk/023 Normal file
View File

@ -0,0 +1,11 @@
Branching
Branching in Collapse OS is limited to 8-bit. This represents
64 word references forward or backward. While this might seem
a bit tight at first, having this limit saves us a non-
negligible amount of resource usage.
The reasoning behind this intentional limit is that huge
branches are generally a indicator that a logic ought to be
simplified. So here's one more constraint for you to help you
towards simplicity.

View File

@ -1,6 +1,7 @@
( Now we have "as late as possible" stuff ) ( Now we have "as late as possible" stuff )
: _bchk DUP 0x7f + 0xff > IF LIT< br-ovfl (print) ABORT THEN ;
: DO COMPILE 2>R H@ ; IMMEDIATE : DO COMPILE 2>R H@ ; IMMEDIATE
: LOOP COMPILE (loop) H@ - , ; IMMEDIATE : LOOP COMPILE (loop) H@ - _bchk , ; IMMEDIATE
( LEAVE is implemented in low xcomp ) ( LEAVE is implemented in low xcomp )
: LITN 32 , , ( 32 == NUMBER ) ; : LITN 32 , , ( 32 == NUMBER ) ;
( gets its name at the very end. can't comment afterwards ) ( gets its name at the very end. can't comment afterwards )

View File

@ -2,13 +2,12 @@
COMPILE (?br) H@ 2 ALLOT ( br cell allot ) COMPILE (?br) H@ 2 ALLOT ( br cell allot )
; IMMEDIATE ; IMMEDIATE
: THEN ( a -- | a: br cell addr ) : THEN ( a -- | a: br cell addr )
DUP H@ -^ SWAP ( a-H a ) ! DUP H@ -^ _bchk SWAP ( a-H a ) !
; IMMEDIATE ; IMMEDIATE
: ELSE ( a1 -- a2 | a1: IF cell a2: ELSE cell ) : ELSE ( a1 -- a2 | a1: IF cell a2: ELSE cell )
COMPILE (br) COMPILE (br)
2 ALLOT 2 ALLOT
DUP H@ -^ SWAP ( a-H a ) [COMPILE] THEN
!
H@ 2- ( push a. -2 for allot offset ) H@ 2- ( push a. -2 for allot offset )
; IMMEDIATE ; IMMEDIATE

View File

@ -1,6 +1,6 @@
: BEGIN H@ ; IMMEDIATE : BEGIN H@ ; IMMEDIATE
: AGAIN COMPILE (br) H@ - , ; IMMEDIATE : AGAIN COMPILE (br) H@ - _bchk , ; IMMEDIATE
: UNTIL COMPILE (?br) H@ - , ; IMMEDIATE : UNTIL COMPILE (?br) H@ - _bchk , ; IMMEDIATE
: [ INTERPRET ; IMMEDIATE : [ INTERPRET ; IMMEDIATE
: ] R> DROP ; : ] R> DROP ;
: LIT< WORD 34 , SCPY 0 C, ; IMMEDIATE : LIT< WORD 34 , SCPY 0 C, ; IMMEDIATE

Binary file not shown.