De-stabilize EXIT
This marks the end of wordrefs in stable ABI. Nice.
This commit is contained in:
parent
3aa681ceca
commit
b1a95648f1
6
blk/265
6
blk/265
@ -1,7 +1,8 @@
|
|||||||
: X:
|
: X:
|
||||||
(xentry) 1 ( compiled ) C,
|
(xentry) 1 ( compiled ) C,
|
||||||
BEGIN
|
BEGIN
|
||||||
WORD DUP LIT" ;" S= IF DROP 0x0b , EXIT THEN
|
WORD DUP LIT" ;" S= IF
|
||||||
|
DROP LIT" EXIT" XFIND , EXIT THEN
|
||||||
XCURRENT @ SWAP ( xcur w ) _find ( a f )
|
XCURRENT @ SWAP ( xcur w ) _find ( a f )
|
||||||
IF ( a )
|
IF ( a )
|
||||||
DUP IMMED? IF ABORT THEN
|
DUP IMMED? IF ABORT THEN
|
||||||
@ -11,5 +12,4 @@
|
|||||||
IF DUP IMMED? NOT IF ABORT THEN EXECUTE
|
IF DUP IMMED? NOT IF ABORT THEN EXECUTE
|
||||||
ELSE (parse) XLITN THEN
|
ELSE (parse) XLITN THEN
|
||||||
THEN
|
THEN
|
||||||
AGAIN
|
AGAIN ;
|
||||||
;
|
|
||||||
|
9
blk/280
9
blk/280
@ -9,8 +9,7 @@ is IP. SP points to PSP TOS, but you can still use the stack
|
|||||||
in native code. you just have to make sure you've restored it
|
in native code. you just have to make sure you've restored it
|
||||||
before "next".
|
before "next".
|
||||||
|
|
||||||
STABLE ABI: The boot binary starts with a list of references.
|
The boot binary is loaded in 2 parts. The first part, "decla-
|
||||||
The address of these references have to stay to those addr-
|
rations", are loaded after xcomp, before xcomp overrides, with
|
||||||
esses. The rest of the Collapse OS code depend on it. In fact,
|
"282 LOAD". The rest, after xcomp overrides, with "283 335
|
||||||
up until 0x67, the (?br) wordref, pretty much everything has
|
LOADR".
|
||||||
to stay put. (cont.)
|
|
||||||
|
4
blk/281
4
blk/281
@ -1,4 +0,0 @@
|
|||||||
The boot binary is loaded in 2 parts. The first part, "decla-
|
|
||||||
rations", are loaded after xcomp, before xcomp overrides, with
|
|
||||||
"282 LOAD". The rest, after xcomp overrides, with "283 335
|
|
||||||
LOADR".
|
|
4
blk/283
4
blk/283
@ -1,7 +1,7 @@
|
|||||||
H@ ORG ! ( STABLE ABI )
|
H@ ORG ! ( STABLE ABI )
|
||||||
0 JP, ( 00, main ) NOP, ( unused ) NOP, NOP, ( 04, BOOT )
|
0 JP, ( 00, main ) NOP, ( unused ) NOP, NOP, ( 04, BOOT )
|
||||||
NOP, NOP, ( 06, uflw ) NOP, NOP, ( 08, LATEST ) NOP, ( unused )
|
NOP, NOP, ( 06, uflw ) NOP, NOP, ( 08, LATEST )
|
||||||
0 A, 0 JP, ( 0b, EXIT ) NOP, ( unused )
|
NOP, NOP, NOP, NOP, NOP, NOP, ( unused )
|
||||||
0 JP, ( RST 10 ) NOP, NOP, ( 13, oflw )
|
0 JP, ( RST 10 ) NOP, NOP, ( 13, oflw )
|
||||||
NOP, NOP, NOP, NOP, NOP, ( unused )
|
NOP, NOP, NOP, NOP, NOP, ( unused )
|
||||||
0 JP, ( 1a, next ) NOP, NOP, NOP, ( unused )
|
0 JP, ( 1a, next ) NOP, NOP, NOP, ( unused )
|
||||||
|
5
blk/287
5
blk/287
@ -1,10 +1,5 @@
|
|||||||
lblexec BSET L1 FSET ( B284 ) L2 FSET ( B286 )
|
lblexec BSET L1 FSET ( B284 ) L2 FSET ( B286 )
|
||||||
( DE -> wordref )
|
( DE -> wordref )
|
||||||
( When we have a BIN( offset, we need to adjust stable
|
|
||||||
ABI offsets. )
|
|
||||||
BIN( @ [IF]
|
|
||||||
A XORr, D ORr, IFZ, D BIN( @ 256 / LDri, THEN,
|
|
||||||
[THEN]
|
|
||||||
LDA(DE), DE INCd,
|
LDA(DE), DE INCd,
|
||||||
A ORr, IFZ, EXDEHL, JP(HL), THEN,
|
A ORr, IFZ, EXDEHL, JP(HL), THEN,
|
||||||
A DECr, JRZ, L1 FWR ( compiled B289 )
|
A DECr, JRZ, L1 FWR ( compiled B289 )
|
||||||
|
1
blk/305
1
blk/305
@ -4,7 +4,6 @@ CODE EXECUTE
|
|||||||
lblexec @ JP,
|
lblexec @ JP,
|
||||||
|
|
||||||
CODE EXIT
|
CODE EXIT
|
||||||
PC ORG @ 0x0d + ! ( stable ABI JP )
|
|
||||||
C 0 IX+ LDrIXY,
|
C 0 IX+ LDrIXY,
|
||||||
B 1 IX+ LDrIXY,
|
B 1 IX+ LDrIXY,
|
||||||
IX DECd, IX DECd,
|
IX DECd, IX DECd,
|
||||||
|
2
blk/397
2
blk/397
@ -9,7 +9,7 @@
|
|||||||
: _ ( : will get its name almost at the very end )
|
: _ ( : will get its name almost at the very end )
|
||||||
(entry) 1 ( compiled ) C,
|
(entry) 1 ( compiled ) C,
|
||||||
BEGIN
|
BEGIN
|
||||||
WORD DUP LIT" ;" S= IF DROP 0x0b , EXIT THEN
|
WORD DUP LIT" ;" S= IF DROP COMPILE EXIT EXIT THEN
|
||||||
FIND IF ( is word ) DUP IMMED? IF EXECUTE ELSE , THEN
|
FIND IF ( is word ) DUP IMMED? IF EXECUTE ELSE , THEN
|
||||||
ELSE ( maybe number ) (parse) LITN THEN
|
ELSE ( maybe number ) (parse) LITN THEN
|
||||||
AGAIN ;
|
AGAIN ;
|
||||||
|
2
blk/805
2
blk/805
@ -3,7 +3,7 @@ H@ ORG !
|
|||||||
JMPn, 0 A,, ( 00, main ) 0 A, ( 03, boot driveno )
|
JMPn, 0 A,, ( 00, main ) 0 A, ( 03, boot driveno )
|
||||||
0 A,, ( 04, BOOT )
|
0 A,, ( 04, BOOT )
|
||||||
0 A,, ( 06, uflw ) 0 A,, ( 08, LATEST ) 0 A,, ( unused )
|
0 A,, ( 06, uflw ) 0 A,, ( 08, LATEST ) 0 A,, ( unused )
|
||||||
JMPn, 0 A,, ( 0b, EXIT )
|
0 A, 0 A,, ( 0b, EXIT )
|
||||||
0 A,, 0 A,, ( unused ) 0 A,, ( 13, oflw )
|
0 A,, 0 A,, ( unused ) 0 A,, ( 13, oflw )
|
||||||
0 A,, 0 A,, 0 A, ( unused )
|
0 A,, 0 A,, 0 A, ( unused )
|
||||||
JMPn, 0 A,, ( 1a, next )
|
JMPn, 0 A,, ( 1a, next )
|
||||||
|
1
blk/811
1
blk/811
@ -2,7 +2,6 @@
|
|||||||
CODE EXECUTE 1 chkPS,
|
CODE EXECUTE 1 chkPS,
|
||||||
DI POPx, JMPn, lblexec @ RPCn,
|
DI POPx, JMPn, lblexec @ RPCn,
|
||||||
CODE EXIT
|
CODE EXIT
|
||||||
PC 0x0f - ORG @ 0x0d + ! ( stable abi )
|
|
||||||
DX [BP] 0 MOVx[]+, BP DECx, BP DECx, ( popRS )
|
DX [BP] 0 MOVx[]+, BP DECx, BP DECx, ( popRS )
|
||||||
;CODE
|
;CODE
|
||||||
|
|
||||||
|
BIN
cvm/forth.bin
BIN
cvm/forth.bin
Binary file not shown.
@ -11,9 +11,7 @@ CREATE BIN( 0 ,
|
|||||||
270 LOAD ( xcomp overrides )
|
270 LOAD ( xcomp overrides )
|
||||||
|
|
||||||
H@ ORG !
|
H@ ORG !
|
||||||
0x0b ALLOT0
|
0x15 ALLOT0
|
||||||
0 C, 0 C, ( EXIT )
|
|
||||||
0x08 ALLOT0
|
|
||||||
( END OF STABLE ABI )
|
( END OF STABLE ABI )
|
||||||
H@ 4 + XCURRENT ! ( make next CODE have 0 prev field )
|
H@ 4 + XCURRENT ! ( make next CODE have 0 prev field )
|
||||||
0x00 CODE EXIT
|
0x00 CODE EXIT
|
||||||
|
25
doc/impl.txt
25
doc/impl.txt
@ -195,28 +195,13 @@ otherwise be difficult to access. Here's the complete list of
|
|||||||
these references:
|
these references:
|
||||||
|
|
||||||
04 BOOT addr 06 (uflw) addr 08 LATEST
|
04 BOOT addr 06 (uflw) addr 08 LATEST
|
||||||
0b EXIT wordref 13 (oflw) addr 1a next addr
|
13 (oflw) addr 1a next addr
|
||||||
|
|
||||||
BOOT, (uflw) and (oflw) exist because they are referred to
|
BOOT, (uflw) and (oflw) exist because they are referred to
|
||||||
before those words are defined (in core words). LATEST is a
|
before those words are defined (in core words). LATEST is a
|
||||||
critical part of the initialization sequence.
|
critical part of the initialization sequence.
|
||||||
|
|
||||||
Stable wordrefs are there for more complicated reasons. When
|
All Collapse OS binaries, regardless of architecture, have
|
||||||
cross-compiling Collapse OS, we use immediate words from the
|
those values at those offsets of them. Some binaries are built
|
||||||
host and some of them compile wordrefs (LITN compiles (n),
|
to run at offset different than zero. This stable ABI lives at
|
||||||
";" compiles EXIT). These compiled wordref need to be stable
|
that offset, not 0.
|
||||||
across binaries, so they're part of the stable ABI.
|
|
||||||
|
|
||||||
Another layer of complexity is the fact that some binaries
|
|
||||||
don't begin at offset 0. In that case, the stable ABI doesn't
|
|
||||||
begin at 0 either. The EXECUTE word has a special handling of
|
|
||||||
those case where any wordref < 0x100 has the binary offset
|
|
||||||
applied to it.
|
|
||||||
|
|
||||||
But that's not the end of our problems. If an offsetted binary
|
|
||||||
cross compiles a binary with a different offset, stable ABI
|
|
||||||
references will be > 0x100 and be broken.
|
|
||||||
|
|
||||||
For this reason, any stable wordref compiled in the "hot zone"
|
|
||||||
(B397-B400) has to be compiled by direct offset reference to
|
|
||||||
avoid having any binary offset applied to it.
|
|
||||||
|
Loading…
Reference in New Issue
Block a user