Compare commits
2 Commits
446ce574cd
...
7a0e63746f
Author | SHA1 | Date | |
---|---|---|---|
|
7a0e63746f | ||
|
372524fd19 |
2
blk/001
2
blk/001
@ -2,7 +2,7 @@ MASTER INDEX
|
||||
|
||||
3 Usage 30 Dictionary
|
||||
70 Implementation notes 100 Block editor
|
||||
200 Z80 assembler
|
||||
200 Z80 assembler 260 Cross compilation
|
||||
|
||||
|
||||
|
||||
|
2
blk/058
2
blk/058
@ -7,7 +7,7 @@ LIT< x -- Read following word and write to HERE as a
|
||||
LITS a -- Write word at addr a as a atring literal.
|
||||
S= a1 a2 -- f Returns whether string a1 == a2.
|
||||
SCPY a -- Copy string at addr a into HERE.
|
||||
SLEN a -- n Push length of str at a.
|
||||
|
||||
|
||||
|
||||
|
||||
|
16
blk/260
Normal file
16
blk/260
Normal file
@ -0,0 +1,16 @@
|
||||
Cross compilation program
|
||||
|
||||
This programs allows cross compilation of boot binary and
|
||||
icore. Run "262 LOAD" right before your cross compilation and
|
||||
then set XCURRENT to CURRENT and XCOFF to H@.
|
||||
|
||||
This redefines defining words to achieve cross compilation.
|
||||
The goal is two-fold:
|
||||
|
||||
1. Add an offset to all word references in definitions.
|
||||
2. Don't shadow important words we need right now.
|
||||
|
||||
Words overrides like ":", "IMMEDIATE" and "CODE" are not
|
||||
automatically shadowed to allow the harmless inclusion of
|
||||
this unit. This shadowing has to take place in your xcomp
|
||||
configuration. (cont.)
|
6
blk/261
Normal file
6
blk/261
Normal file
@ -0,0 +1,6 @@
|
||||
(cont.)
|
||||
See example in /emul/forth/xcomp.fs
|
||||
|
||||
Why limit ourselves to icore? Oh, I've tried cross-compiling
|
||||
the whole shebang. I tried. And failed. Too dynamic.
|
||||
|
11
blk/263
Normal file
11
blk/263
Normal file
@ -0,0 +1,11 @@
|
||||
VARIABLE XCURRENT
|
||||
VARIABLE XOFF
|
||||
|
||||
: XCON XCURRENT CURRENT* ! ;
|
||||
: XCOFF 0x02 RAM+ CURRENT* ! ;
|
||||
|
||||
: (xentry) XCON (entry) XCOFF ;
|
||||
|
||||
: XCODE XCON CODE XCOFF ;
|
||||
|
||||
: XIMM XCON IMMEDIATE XCOFF ;
|
14
blk/264
Normal file
14
blk/264
Normal file
@ -0,0 +1,14 @@
|
||||
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 founf and not immediate,
|
||||
error. If not found, try number.
|
14
blk/265
Normal file
14
blk/265
Normal file
@ -0,0 +1,14 @@
|
||||
: X:
|
||||
(xentry) [ 0x0e LITN ] C,
|
||||
BEGIN WORD
|
||||
XCURRENT @ SWAP ( xcur w ) _find ( a f )
|
||||
IF ( a )
|
||||
DUP IMMED? IF ABORT THEN
|
||||
DUP XOFF @ > IF XOFF @ - THEN ,
|
||||
ELSE ( w )
|
||||
0x02 RAM+ @ SWAP ( cur w ) _find ( a f )
|
||||
IF DUP IMMED? NOT IF ABORT THEN EXECUTE
|
||||
ELSE (parse*) @ EXECUTE LITN THEN
|
||||
THEN
|
||||
AGAIN
|
||||
;
|
@ -1,13 +1,12 @@
|
||||
TARGETS = forth/forth
|
||||
# Those Forth source files are in a particular order
|
||||
BOOTSRCS = ./forth/conf.fs \
|
||||
../forth/xcomp.fs \
|
||||
./forth/xcomp.fs \
|
||||
../forth/boot.z80 \
|
||||
../forth/icore.fs \
|
||||
./forth/xstop.fs
|
||||
|
||||
FORTHSRCS = core.fs cmp.fs print.fs str.fs parse.fs readln.fs fmt.fs blk.fs
|
||||
FORTHSRCS = core.fs cmp.fs print.fs parse.fs readln.fs fmt.fs blk.fs
|
||||
FORTHSRC_PATHS = ${FORTHSRCS:%=../forth/%} forth/run.fs
|
||||
OBJS = emul.o libz80/libz80.o
|
||||
SLATEST = ../tools/slatest
|
||||
|
@ -1,3 +1,4 @@
|
||||
262 LOAD
|
||||
: CODE XCODE ;
|
||||
: IMMEDIATE XIMM ;
|
||||
: : [ ' X: , ] ;
|
||||
|
@ -25,7 +25,7 @@
|
||||
expected to have been loaded prior to icore and redefines
|
||||
":" and other defining words. So, in other words, when
|
||||
compiling icore, ":" doesn't means what you think it means,
|
||||
go look in xcomp.
|
||||
go look in B260.
|
||||
)
|
||||
|
||||
: RAM+
|
||||
|
@ -29,10 +29,6 @@
|
||||
DUP @ 30768 = NOT IF 0 EXIT THEN ( a 0 )
|
||||
( We have "0x" prefix )
|
||||
2+
|
||||
( validate slen )
|
||||
DUP SLEN ( a l )
|
||||
DUP NOT IF DROP 0 EXIT THEN ( a 0 )
|
||||
4 > IF DROP 0 EXIT THEN ( a 0 )
|
||||
0 ( a r )
|
||||
BEGIN
|
||||
SWAP C@+ ( r a+1 c )
|
||||
@ -58,10 +54,6 @@
|
||||
DUP @ 25136 = NOT IF 0 EXIT THEN ( a 0 )
|
||||
( We have "0b" prefix )
|
||||
2+
|
||||
( validate slen )
|
||||
DUP SLEN ( a l )
|
||||
DUP 0 = IF DROP 0 EXIT THEN ( a 0 )
|
||||
16 > IF DROP 0 EXIT THEN ( a 0 )
|
||||
0 ( a r )
|
||||
BEGIN
|
||||
SWAP C@+ ( r a+1 c )
|
||||
|
@ -1,5 +0,0 @@
|
||||
: SLEN ( a -- n )
|
||||
DUP ( astart aend )
|
||||
BEGIN C@+ NOT UNTIL
|
||||
1- -^
|
||||
;
|
@ -1,67 +0,0 @@
|
||||
( Allow cross-compilation of z80c and icore.
|
||||
Include this file right before your cross compilation, then
|
||||
set XCURRENT to CURRENT and XOFF to H@.
|
||||
|
||||
This redefines defining words to achieve cross compilation.
|
||||
The goal is two-fold:
|
||||
|
||||
1. Add an offset to all word references in definitions.
|
||||
2. Don't shadow important words we need right now.
|
||||
|
||||
Words overrides like ":", "IMMEDIATE" and "CODE" are not
|
||||
automatically shadowed to allow the harmless inclusion of
|
||||
this unit. This shadowing has to take place in your xcomp
|
||||
configuration.
|
||||
|
||||
See example in /emul/forth/xcomp.fs
|
||||
|
||||
Why limit ourselves to icore? Oh, I've tried cross-compiling
|
||||
the whole shebang. I tried. And failed. Too dynamic.
|
||||
)
|
||||
|
||||
VARIABLE XCURRENT
|
||||
VARIABLE XOFF
|
||||
|
||||
: XCON XCURRENT CURRENT* ! ;
|
||||
: XCOFF 0x02 RAM+ CURRENT* ! ;
|
||||
|
||||
: (xentry) XCON (entry) XCOFF ;
|
||||
|
||||
: XCODE XCON CODE XCOFF ;
|
||||
|
||||
: XIMM XCON IMMEDIATE XCOFF ;
|
||||
|
||||
: X:
|
||||
(xentry)
|
||||
( 0e == compiledWord )
|
||||
[ 0x0e LITN ] C,
|
||||
BEGIN
|
||||
WORD
|
||||
( cross compile CURRENT )
|
||||
XCURRENT @ SWAP ( w xcur w )
|
||||
_find ( w a f )
|
||||
IF
|
||||
( is word )
|
||||
( never supposed to encounter an IMMEDIATE in xdict )
|
||||
DUP IMMED? IF ABORT THEN
|
||||
( not an immed. drop backup w and write, with
|
||||
offset. )
|
||||
DUP XOFF @ > IF XOFF @ - THEN
|
||||
,
|
||||
ELSE ( w )
|
||||
( not found? it might be an immediate that isn't yet defined in our
|
||||
cross-compiled dict. It's alright, we can find-and-execute it. )
|
||||
( system CURRENT )
|
||||
0x02 RAM+ @ SWAP ( cur w )
|
||||
_find ( a f )
|
||||
IF
|
||||
( found. It *must* be an IMMED )
|
||||
DUP IMMED? NOT IF ABORT THEN
|
||||
EXECUTE
|
||||
ELSE
|
||||
( not found. maybe number )
|
||||
(parse*) @ EXECUTE LITN
|
||||
THEN
|
||||
THEN
|
||||
AGAIN
|
||||
;
|
@ -5,7 +5,6 @@ EDIR = $(BASEDIR)/emul/forth
|
||||
STAGE2 = $(EDIR)/stage2
|
||||
EMUL = $(BASEDIR)/emul/hw/rc2014/classic
|
||||
BOOTSRCS = conf.fs \
|
||||
$(FDIR)/xcomp.fs \
|
||||
$(EDIR)/xcomp.fs \
|
||||
$(FDIR)/boot.z80 \
|
||||
$(BASEDIR)/drv/acia.z80 \
|
||||
@ -16,7 +15,6 @@ BOOTSRCS = conf.fs \
|
||||
PATHS = \
|
||||
$(FDIR)/core.fs \
|
||||
$(FDIR)/cmp.fs \
|
||||
$(FDIR)/str.fs \
|
||||
$(FDIR)/parse.fs \
|
||||
$(BASEDIR)/drv/acia.fs \
|
||||
$(FDIR)/print.fs \
|
||||
|
Loading…
Reference in New Issue
Block a user