瀏覽代碼

xcomp: add XCOMPILE and X[COMPILE]

This allows us to move words like ABORT" to xcomp-core, which is
I think the last roadblock before being able to unify all drivers
into a single xcomp layer.
pull/102/head
Virgil Dupras 4 年之前
父節點
當前提交
dfe474ca0e
共有 17 個檔案被更改,包括 71 行新增60 行删除
  1. +6
    -2
      blk/263
  2. +1
    -1
      blk/265
  3. +1
    -1
      blk/288
  4. +1
    -1
      blk/415
  5. +11
    -11
      blk/416
  6. +11
    -14
      blk/417
  7. +14
    -0
      blk/418
  8. +16
    -0
      blk/419
  9. +1
    -1
      blk/420
  10. +0
    -13
      blk/438
  11. +0
    -16
      blk/439
  12. +1
    -0
      blk/440
  13. 二進制
      emul/forth.bin
  14. +2
    -0
      emul/xcomp.fs
  15. +2
    -0
      recipes/rc2014/xcomp.fs
  16. +2
    -0
      recipes/ti84/xcomp.fs
  17. +2
    -0
      recipes/trs80/xcomp.fs

+ 6
- 2
blk/263 查看文件

@@ -5,7 +5,11 @@ VARIABLE XCURRENT

: (xentry) XCON (entry) XCOFF ;
: XCREATE (xentry) 11 C, ;

: XCODE XCON CODE XCOFF ;

: XIMM XCON IMMEDIATE XCOFF ;
: _xapply ( a -- a-off )
DUP ORG @ > IF ORG @ - BIN( @ + THEN ;
: XCOMPILE
XCON ' _xapply LITA
LIT< , (find) DROP _xapply , XCOFF ;
: X[COMPILE] XCON ' _xapply , XCOFF ;

+ 1
- 1
blk/265 查看文件

@@ -4,7 +4,7 @@
XCURRENT @ SWAP ( xcur w ) _find ( a f )
IF ( a )
DUP IMMED? IF ABORT THEN
DUP ORG @ > IF ORG @ - BIN( @ + THEN ,
_xapply ,
ELSE ( w )
0x02 RAM+ @ SWAP ( cur w ) _find ( a f )
IF DUP IMMED? NOT IF ABORT THEN EXECUTE


+ 1
- 1
blk/288 查看文件

@@ -1,4 +1,4 @@
PC ORG @ 0x22 + ! ( litWord, 0xf7, very tight on the 0x100 limit )
PC ORG @ 0x22 + ! ( litWord, 0xf7, tight on the 0x100 limit )
( Like numberWord, but instead of being followed by a 2 bytes
number, it's followed by a null-terminated string. When
called, puts the string's address on PS )


+ 1
- 1
blk/415 查看文件

@@ -1 +1 @@
1 2 LOADR+
1 4 LOADR+

+ 11
- 11
blk/416 查看文件

@@ -1,14 +1,14 @@
( LITN has to be defined after the last immediate usage of
it to avoid bootstrapping issues )
: LITN 32 , , ( 32 == NUMBER ) ;
: EMIT
( 0x53==(emit) override )
0x53 RAM+ @ DUP IF EXECUTE ELSE DROP (emit) THEN ;

: IMMED? 1- C@ 0x80 AND ;
: (print)
BEGIN
C@+ ( a+1 c )
( exit if null or 0xd )
DUP 0xd = OVER NOT OR IF 2DROP EXIT THEN
EMIT ( a )
AGAIN
;

( ';' can't have its name right away because, when created, it
is not an IMMEDIATE yet and will not be treated properly by
xcomp. )
: _
['] EXIT ,
R> DROP ( exit : )
; IMMEDIATE


+ 11
- 14
blk/417 查看文件

@@ -1,16 +1,13 @@
XCURRENT @ ( to PSP )
: :
(entry)
( We cannot use LITN as IMMEDIATE because of bootstrapping
issues. Same thing for ",".
32 == NUMBER 14 == compiledWord )
[ 32 H@ ! 2 ALLOT 14 H@ ! 2 ALLOT ] C,
: ,"
BEGIN
WORD
(find)
( is word )
IF DUP IMMED? IF EXECUTE ELSE , THEN
( maybe number )
ELSE (parse) LITN THEN
C<
( 34 is ASCII for " )
DUP 34 = IF DROP EXIT THEN C,
AGAIN ;
( from PSP ) ';' SWAP 4 - C!

: ."
34 , ( 34 == litWord ) ," 0 C,
COMPILE (print)
; IMMEDIATE

: ABORT" [COMPILE] ." COMPILE ABORT ; IMMEDIATE

+ 14
- 0
blk/418 查看文件

@@ -0,0 +1,14 @@
( LITN has to be defined after the last immediate usage of
it to avoid bootstrapping issues )
: LITN 32 , , ( 32 == NUMBER ) ;

: IMMED? 1- C@ 0x80 AND ;

( ';' can't have its name right away because, when created, it
is not an IMMEDIATE yet and will not be treated properly by
xcomp. )
: _
['] EXIT ,
R> DROP ( exit : )
; IMMEDIATE


+ 16
- 0
blk/419 查看文件

@@ -0,0 +1,16 @@
XCURRENT @ ( to PSP )
: :
(entry)
( We cannot use LITN as IMMEDIATE because of bootstrapping
issues. Same thing for ",".
32 == NUMBER 14 == compiledWord )
[ 32 H@ ! 2 ALLOT 14 H@ ! 2 ALLOT ] C,
BEGIN
WORD
(find)
( is word )
IF DUP IMMED? IF EXECUTE ELSE , THEN
( maybe number )
ELSE (parse) LITN THEN
AGAIN ;
( from PSP ) ';' SWAP 4 - C!

+ 1
- 1
blk/420 查看文件

@@ -8,6 +8,6 @@ itself to a full intepreter, which can then be relinked with
the Relinker. There is no loader for these libraries because
you will typically XPACK (B267) them.

422 core 438 print
422 core 440 print
442 fmt 447 readln
453 blk

+ 0
- 13
blk/438 查看文件

@@ -1,13 +0,0 @@
: EMIT
( 0x53==(emit) override )
83 RAM+ @ DUP IF EXECUTE ELSE DROP (emit) THEN ;

: (print)
BEGIN
C@+ ( a+1 c )
( exit if null or 0xd )
DUP 13 = OVER NOT OR IF 2DROP EXIT THEN
EMIT ( a )
AGAIN
;


+ 0
- 16
blk/439 查看文件

@@ -1,16 +0,0 @@
: ,"
BEGIN
C<
( 34 is ASCII for " )
DUP 34 = IF DROP EXIT THEN C,
AGAIN ;

: ."
34 , ( 34 == litWord ) ," 0 C,
COMPILE (print)
; IMMEDIATE

: ABORT" [COMPILE] ." COMPILE ABORT ; IMMEDIATE

: (uflw) ABORT" stack underflow" ;


+ 1
- 0
blk/440 查看文件

@@ -1,3 +1,4 @@
: (uflw) ABORT" stack underflow" ;
: BS 8 EMIT ;
: LF 10 EMIT ;
: CR 13 EMIT ;


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


+ 2
- 0
emul/xcomp.fs 查看文件

@@ -4,6 +4,8 @@
212 LOAD ( z80 assembler )
262 LOAD ( xcomp )
: CODE XCODE ;
: COMPILE XCOMPILE ; IMMEDIATE
: [COMPILE] X[COMPILE] ; IMMEDIATE
: IMMEDIATE XIMM ;
: (entry) (xentry) ;
: : [ ' X: , ] ;


+ 2
- 0
recipes/rc2014/xcomp.fs 查看文件

@@ -10,6 +10,8 @@ RAMSTART 0x70 + CONSTANT ACIA_MEM
212 LOAD ( z80 assembler )
262 LOAD ( xcomp )
: CODE XCODE ;
: COMPILE XCOMPILE ; IMMEDIATE
: [COMPILE] X[COMPILE] ; IMMEDIATE
: IMMEDIATE XIMM ;
: (entry) (xentry) ;
: CREATE XCREATE ;


+ 2
- 0
recipes/ti84/xcomp.fs 查看文件

@@ -9,6 +9,8 @@ RAMSTART 0x72 + CONSTANT KBD_MEM
262 LOAD ( xcomp )
522 LOAD ( font compiler )
: CODE XCODE ;
: COMPILE XCOMPILE ; IMMEDIATE
: [COMPILE] X[COMPILE] ; IMMEDIATE
: IMMEDIATE XIMM ;
: (entry) (xentry) ;
: CREATE XCREATE ; ( for KBD tbls )


+ 2
- 0
recipes/trs80/xcomp.fs 查看文件

@@ -4,6 +4,8 @@ RS_ADDR 0x80 - CONSTANT RAMSTART
212 LOAD ( z80 assembler )
262 LOAD ( xcomp )
: CODE XCODE ;
: COMPILE XCOMPILE ; IMMEDIATE
: [COMPILE] X[COMPILE] ; IMMEDIATE
: IMMEDIATE XIMM ;
: (entry) (xentry) ;
: : [ ' X: , ] ;


Loading…
取消
儲存