( 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 ] ,
    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
;
