Просмотр исходного кода

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 лет назад
Родитель
Сommit
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


Загрузка…
Отмена
Сохранить