Переглянути джерело

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. BIN
      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,



+ 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


Завантаження…
Відмінити
Зберегти