瀏覽代碼

De-stabilize (br), (?br), (loop), (s)

When writing the xcomp documentation, I realized that with careful
threading and by accepting a bit of code duplication in the xcomp
toolset, I could de-stabilize a couple of words.

(n) and EXIT are a bit trickier, but I think it can be done. It
would be nice to get rid of stable wordrefs...
master
Virgil Dupras 3 年之前
父節點
當前提交
eefbf66e95
共有 20 個檔案被更改,包括 32 行新增68 行删除
  1. +1
    -1
      blk/262
  2. +10
    -10
      blk/263
  3. +3
    -14
      blk/264
  4. +4
    -0
      blk/270
  5. +2
    -4
      blk/283
  6. +0
    -2
      blk/297
  7. +0
    -1
      blk/298
  8. +0
    -1
      blk/307
  9. +1
    -1
      blk/326
  10. +2
    -2
      blk/397
  11. +2
    -2
      blk/398
  12. +3
    -3
      blk/399
  13. +0
    -6
      blk/805
  14. +0
    -2
      blk/806
  15. +0
    -1
      blk/807
  16. +0
    -1
      blk/812
  17. +0
    -1
      blk/813
  18. 二進制
      cvm/forth.bin
  19. +0
    -10
      cvm/xcomp.fs
  20. +4
    -6
      doc/impl.txt

+ 1
- 1
blk/262 查看文件

@@ -1 +1 @@
1 LOAD+ 3 LOAD+ 6 LOAD+
1 3 LOADR+

+ 10
- 10
blk/263 查看文件

@@ -1,15 +1,15 @@
CREATE XCURRENT 0 ,
: XCON XCURRENT CURRENT* ! ;
: XCOFF 0x02 RAM+ CURRENT* ! ;
: (xentry) XCON (entry) XCOFF ;
: XCREATE (xentry) 2 C, ;
: XCODE XCON CODE XCOFF ;
: XIMM XCON IMMEDIATE XCOFF ;
: XCON XCURRENT CURRENT* ! ; : XCOFF 0x02 RAM+ CURRENT* ! ;
: (xentry) XCON (entry) XCOFF ; : XCREATE (xentry) 2 C, ;
: XCODE XCON CODE XCOFF ; : XIMM XCON IMMEDIATE XCOFF ;
: _xapply ( a -- a-off )
DUP ORG @ > IF ORG @ - BIN( @ + THEN ;
: X' XCON ' XCOFF ;
: X['] XCON ' _xapply LITN XCOFF ;
: XCOMPILE
XCON ' _xapply LITN
: XFIND XCURRENT @ SWAP _find DROP _xapply ;
: X' XCON ' XCOFF ; : X['] XCON ' _xapply LITN XCOFF ;
: XCOMPILE XCON ' _xapply LITN
LIT< , FIND DROP _xapply , XCOFF ;
: X[COMPILE] XCON ' _xapply , XCOFF ;
: XDO LIT< 2>R XFIND , H@ ;
: XLOOP LIT< (loop) XFIND , H@ - C, ;
: XIF LIT< (?br) XFIND , H@ 1 ALLOT ;
: XELSE LIT< (br) XFIND , 1 ALLOT [COMPILE] THEN H@ 1- ;

+ 3
- 14
blk/264 查看文件

@@ -1,14 +1,3 @@
The "X:" word

Because the ";" word goes back only one level in RSP and
this limits our ability to separate X: in sub words and this
means a rather cramped B265. This means no inline comments,
hence this block here.

0x0e is compiledWord. first _find is on xdict. If found, we
compile it with offsets. We abort on IMMED? because we're
never supposed to encounter an immediate at this point.

If not found, we try the same word on system dict (RAM+02).
If found and is immediate, execute. If found and not immediate,
error. If not found, try number.
: XAGAIN LIT< (br) XFIND , H@ - C, ;
: XUNTIL LIT< (?br) XFIND , H@ - C, ;
: XLIT< LIT< (s) XFIND , WORD DUP C@ 1+ MOVE, ;

+ 4
- 0
blk/270 查看文件

@@ -2,6 +2,10 @@
: ['] X['] ; IMMEDIATE
: COMPILE XCOMPILE ; IMMEDIATE
: [COMPILE] X[COMPILE] ; IMMEDIATE
: DO XDO ; IMMEDIATE : LOOP XLOOP ; IMMEDIATE
: IF XIF ; IMMEDIATE : ELSE XELSE ; IMMEDIATE
: AGAIN XAGAIN ; IMMEDIATE : UNTIL XUNTIL ; IMMEDIATE
: LIT< XLIT< ; IMMEDIATE
: IMMEDIATE XIMM ;
: (entry) (xentry) ;
: CREATE XCREATE ;


+ 2
- 4
blk/283 查看文件

@@ -6,8 +6,6 @@ NOP, NOP, ( 06, uflw ) NOP, NOP, ( 08, LATEST ) NOP, ( unused )
NOP, NOP, NOP, NOP, NOP, ( unused )
0 JP, ( 1a, next ) NOP, NOP, NOP, ( unused )
0 JP, ( RST 20 ) 0 A, 0 JP, ( 23, (n) ) NOP, ( unused )
0 JP, ( RST 28 ) 0 A, 0 JP, ( 2b, (s) ) NOP, ( unused )
0 JP, ( RST 30 ) 0 A, 0 JP, ( 33, 2>R ) NOP, ( unused )
0 JP, ( RST 28 ) 0 A, 0 A, 0 A, 0 A, 0 A, ( unused )
0 JP, ( RST 30 ) 0 A, 0 A, 0 A, 0 A, 0 A, ( unused )
0 JP, ( RST 38 )
0 A, 0 JP, ( 3b, (br) ) 0 A, 0 JP, ( 3f, (?br) )
0 A, 0 JP, ( 43, (loop) )

+ 0
- 2
blk/297 查看文件

@@ -1,12 +1,10 @@
CODE (br)
L1 BSET ( used in ?br and loop )
PC ORG @ 0x3d + ! ( stable ABI JP )
LDA(BC), H 0 LDri, L A LDrr,
RLA, IFC, H DECr, THEN,
BC ADDHLd, B H LDrr, C L LDrr,
;CODE
CODE (?br)
PC ORG @ 0x41 + ! ( stable ABI JP )
HL POP,
HLZ,
JRZ, L1 BWR ( br + 1. False, branch )


+ 0
- 1
blk/298 查看文件

@@ -1,5 +1,4 @@
CODE (loop)
PC ORG @ 0x45 + ! ( stable ABI JP )
0 IX+ INC(IXY+), IFZ, 1 IX+ INC(IXY+), THEN, ( I++ )
( Jump if I <> I' )
A 0 IX+ LDrIXY, 2 IX- CP(IXY+), JRNZ, L1 BWR ( branch )


+ 0
- 1
blk/307 查看文件

@@ -1,5 +1,4 @@
CODE (s) ( string literal )
PC ORG @ 0x2d + ! ( stable ABI JP )
( Like (n) but instead of being followed by a 2 bytes
number, it's followed by a string. When called, puts the
string's address on PS )


+ 1
- 1
blk/326 查看文件

@@ -1,7 +1,7 @@
CODE R>
L 0 IX+ LDrIXY, H 1 IX+ LDrIXY, IX DECd, IX DECd, HL PUSH,
;CODE
CODE 2>R PC ORG @ 0x35 + ! ( stable ABI JP )
CODE 2>R
DE POP, HL POP, chkPS,
IX INCd, IX INCd, 0 IX+ L LDIXYr, 1 IX+ H LDIXYr,
IX INCd, IX INCd, 0 IX+ E LDIXYr, 1 IX+ D LDIXYr,


+ 2
- 2
blk/397 查看文件

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


+ 2
- 2
blk/398 查看文件

@@ -1,11 +1,11 @@
: IF ( -- a | a: br cell addr )
0x3f ( ?br ) , H@ 1 ALLOT ( br cell allot )
COMPILE (?br) H@ 1 ALLOT ( br cell allot )
; IMMEDIATE
: THEN ( a -- | a: br cell addr )
DUP H@ -^ _bchk SWAP ( a-H a ) C!
; IMMEDIATE
: ELSE ( a1 -- a2 | a1: IF cell a2: ELSE cell )
0x3b ( br ) ,
COMPILE (br)
1 ALLOT
[COMPILE] THEN
H@ 1- ( push a. 1- for allot offset )


+ 3
- 3
blk/399 查看文件

@@ -1,7 +1,7 @@
: LIT< 0x2b ( s ) , WORD DUP C@ 1+ MOVE, ; IMMEDIATE
: LIT< COMPILE (s) WORD DUP C@ 1+ MOVE, ; IMMEDIATE
: BEGIN H@ ; IMMEDIATE
: AGAIN 0x3b ( br ) , H@ - _bchk C, ; IMMEDIATE
: UNTIL 0x3f ( ?br ) , H@ - _bchk C, ; IMMEDIATE
: AGAIN COMPILE (br) H@ - _bchk C, ; IMMEDIATE
: UNTIL COMPILE (?br) H@ - _bchk C, ; IMMEDIATE
: [ INTERPRET ; IMMEDIATE
: ] R> DROP ;
: COMPILE ' LITN ['] , , ; IMMEDIATE


+ 0
- 6
blk/805 查看文件

@@ -8,9 +8,3 @@ JMPn, 0 A,, ( 0b, EXIT )
0 A,, 0 A,, 0 A, ( unused )
JMPn, 0 A,, ( 1a, next ) 0 A,, 0 A,, 0 A,, ( unused )
0 A, JMPn, 0 A,, ( 23, (n) )
0 A,, 0 A,, ( unused )
0 A, JMPn, 0 A,, ( 2b, (s) ) 0 A, ( unused )
0 A, 0 A,, ( unused )
0 A, JMPn, 0 A,, ( 33, 2>R ) 0 A, 0 A, 0 A,, ( unused )
0 A, JMPn, 0 A,, ( 3b, (br) ) 0 A, JMPn, 0 A,, ( 3f, (?br) )
0 A, JMPn, 0 A,, ( 43, (loop) )

+ 0
- 2
blk/806 查看文件

@@ -1,12 +1,10 @@
( TODO: move these words with other native words. )
H@ 4 + XCURRENT ! ( make next CODE have 0 prev field )
CODE (br) L1 BSET ( used in ?br )
PC 0x3f - ORG @ 0x3d + ! ( stable abi )
DI DX MOVxx, AL [DI] MOVr[], AH AH XORrr, CBW,
DX AX ADDxx,
;CODE
CODE (?br)
PC 0x43 - ORG @ 0x41 + ! ( stable abi )
AX POPx, AX AX ORxx, JZ, L1 @ RPCs, ( False, branch )
( True, skip next byte and don't branch )
DX INCx,


+ 0
- 1
blk/807 查看文件

@@ -1,5 +1,4 @@
CODE (loop)
PC 0x47 - ORG @ 0x45 + ! ( stable abi )
[BP] 0 INC[w]+, ( I++ )
( Jump if I <> I' )
AX [BP] 0 MOVx[]+, AX [BP] -2 CMPx[]+,


+ 0
- 1
blk/812 查看文件

@@ -4,7 +4,6 @@ PC 0x27 - ORG @ 0x25 + ! ( stable abi )
DX INCx, DX INCx,
;CODE
CODE (s) ( string literal, see B287 )
PC 0x2f - ORG @ 0x2d + ! ( stable abi )
DI DX MOVxx, ( IP )
AH AH XORrr, AL [DI] MOVr[], ( slen )
DX PUSHx, DX INCx, DX AX ADDxx,


+ 0
- 1
blk/813 查看文件

@@ -5,7 +5,6 @@ CODE R>
[BP] 0 PUSH[w]+, BP DECx, BP DECx,
;CODE
CODE 2>R
PC 0x37 - ORG @ 0x35 + ! ( stable abi )
[BP] 4 POP[w]+, [BP] 2 POP[w]+, BP 4 ADDxi,
;CODE
CODE 2R> 2 chkPS,


二進制
cvm/forth.bin 查看文件


+ 0
- 10
cvm/xcomp.fs 查看文件

@@ -15,16 +15,6 @@ H@ ORG !
0 C, 0 C, ( EXIT )
0x16 ALLOT0
0 C, 0x05 C, ( (n) )
0x6 ALLOT0
0 C, 0x06 C, ( (s) )
0x6 ALLOT0
0 C, 0x04 C, ( 2>R )
0x6 ALLOT0
0 C, 0x01 C, ( (br) )
0x2 ALLOT0
0 C, 0x02 C, ( (?br) )
0x2 ALLOT0
0 C, 0x03 C, ( (loop) )
( END OF STABLE ABI )
H@ 4 + XCURRENT ! ( make next CODE have 0 prev field )
0x00 CODE EXIT


+ 4
- 6
doc/impl.txt 查看文件

@@ -195,9 +195,7 @@ otherwise be difficult to access. Here's the complete list of
these references:

04 BOOT addr 06 (uflw) addr 08 LATEST
13 (oflw) addr 2b (s) wordref 33 2>R wordref
42 EXIT wordref 53 (br) wordref 67 (?br) wordref
80 (loop) wordref bf (n) wordref
0b EXIT wordref 13 (oflw) addr 23 (n) wordref

BOOT, (uflw) and (oflw) exist because they are referred to
before those words are defined (in core words). LATEST is a
@@ -205,9 +203,9 @@ critical part of the initialization sequence.

Stable wordrefs are there for more complicated reasons. When
cross-compiling Collapse OS, we use immediate words from the
host and some of them compile wordrefs (IF compiles (?br),
LOOP compiles (loop), etc.). These compiled wordref need to
be stable across binaries, so they're part of the stable ABI.
host and some of them compile wordrefs (LITN compiles (n),
";" compiles EXIT). These compiled wordref need to be stable
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


Loading…
取消
儲存