@@ -2,7 +2,7 @@ MASTER INDEX | |||||
3 Usage 30 Dictionary | 3 Usage 30 Dictionary | ||||
70 Implementation notes 100 Block editor | 70 Implementation notes 100 Block editor | ||||
200 Z80 assembler | |||||
200 Z80 assembler 260 Cross compilation | |||||
@@ -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.) |
@@ -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. | |||||
@@ -0,0 +1 @@ | |||||
263 LOAD 265 LOAD |
@@ -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 ; |
@@ -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. |
@@ -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,7 +1,6 @@ | |||||
TARGETS = forth/forth | TARGETS = forth/forth | ||||
# Those Forth source files are in a particular order | # Those Forth source files are in a particular order | ||||
BOOTSRCS = ./forth/conf.fs \ | BOOTSRCS = ./forth/conf.fs \ | ||||
../forth/xcomp.fs \ | |||||
./forth/xcomp.fs \ | ./forth/xcomp.fs \ | ||||
../forth/boot.z80 \ | ../forth/boot.z80 \ | ||||
../forth/icore.fs \ | ../forth/icore.fs \ | ||||
@@ -1,3 +1,4 @@ | |||||
262 LOAD | |||||
: CODE XCODE ; | : CODE XCODE ; | ||||
: IMMEDIATE XIMM ; | : IMMEDIATE XIMM ; | ||||
: : [ ' X: , ] ; | : : [ ' X: , ] ; | ||||
@@ -25,7 +25,7 @@ | |||||
expected to have been loaded prior to icore and redefines | expected to have been loaded prior to icore and redefines | ||||
":" and other defining words. So, in other words, when | ":" and other defining words. So, in other words, when | ||||
compiling icore, ":" doesn't means what you think it means, | compiling icore, ":" doesn't means what you think it means, | ||||
go look in xcomp. | |||||
go look in B260. | |||||
) | ) | ||||
: RAM+ | : RAM+ | ||||
@@ -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 | STAGE2 = $(EDIR)/stage2 | ||||
EMUL = $(BASEDIR)/emul/hw/rc2014/classic | EMUL = $(BASEDIR)/emul/hw/rc2014/classic | ||||
BOOTSRCS = conf.fs \ | BOOTSRCS = conf.fs \ | ||||
$(FDIR)/xcomp.fs \ | |||||
$(EDIR)/xcomp.fs \ | $(EDIR)/xcomp.fs \ | ||||
$(FDIR)/boot.z80 \ | $(FDIR)/boot.z80 \ | ||||
$(BASEDIR)/drv/acia.z80 \ | $(BASEDIR)/drv/acia.z80 \ | ||||