Node:Using the Cross Compiler, Next:How the Cross Compiler Works, Previous:Cross Compiler, Up:Cross Compiler
The cross compiler uses a language that resembles Forth, but isn't. The main difference is that you can execute Forth code after definition, while you usually can't execute the code compiled by cross, because the code you are compiling is typically for a different computer than the one you are compiling on.
The Makefile is already set up to allow you to create kernels for new
architectures with a simple make command. The generic kernels using the
GCC compiled virtual machine are created in the normal build process
with make. To create a embedded Gforth executable for e.g. the
8086 processor (running on a DOS machine), type
make kernl-8086.fi
This will use the machine description from the arch/8086
directory to create a new kernel. A machine file may look like that:
\ Parameter for target systems 06oct92py
4 Constant cell \ cell size in bytes
2 Constant cell<< \ cell shift to bytes
5 Constant cell>bit \ cell shift to bits
8 Constant bits/char \ bits per character
8 Constant bits/byte \ bits per byte [default: 8]
8 Constant float \ bytes per float
8 Constant /maxalign \ maximum alignment in bytes
false Constant bigendian \ byte order
( true=big, false=little )
include machpc.fs \ feature list
This part is obligatory for the cross compiler itself, the feature list is used by the kernel to conditionally compile some features in and out, depending on whether the target supports these features.
There are some optional features, if you define your own primitives,
have an assembler, or need special, nonstandard preparation to make the
boot process work. asm-include includes an assembler,
prims-include includes primitives, and >boot prepares for
booting.
: asm-include ." Include assembler" cr s" arch/8086/asm.fs" included ; : prims-include ." Include primitives" cr s" arch/8086/prim.fs" included ; : >boot ." Prepare booting" cr s" ' boot >body into-forth 1+ !" evaluate ;
These words are used as sort of macro during the cross compilation in
the file kernel/main.fs. Instead of using these macros, it would
be possible -- but more complicated -- to write a new kernel project
file, too.
kernel/main.fs expects the machine description file name on the
stack; the cross compiler itself (cross.fs) assumes that either
mach-file leaves a counted string on the stack, or
machine-file leaves an address, count pair of the filename on the
stack.
The feature list is typically controlled using SetValue, generic
files that are used by several projects can use DefaultValue
instead. Both functions work like Value, when the value isn't
defined, but SetValue works like to if the value is
defined, and DefaultValue doesn't set anything, if the value is
defined.
\ generic mach file for pc gforth 03sep97jaw
true DefaultValue NIL \ relocating
>ENVIRON
true DefaultValue file \ controls the presence of the
\ file access wordset
true DefaultValue OS \ flag to indicate a operating system
true DefaultValue prims \ true: primitives are c-code
true DefaultValue floating \ floating point wordset is present
true DefaultValue glocals \ gforth locals are present
\ will be loaded
true DefaultValue dcomps \ double number comparisons
true DefaultValue hash \ hashing primitives are loaded/present
true DefaultValue xconds \ used together with glocals,
\ special conditionals supporting gforths'
\ local variables
true DefaultValue header \ save a header information
true DefaultValue backtrace \ enables backtrace code
false DefaultValue ec
false DefaultValue crlf
cell 2 = [IF] &32 [ELSE] &256 [THEN] KB DefaultValue kernel-size
&16 KB DefaultValue stack-size
&15 KB &512 + DefaultValue fstack-size
&15 KB DefaultValue rstack-size
&14 KB &512 + DefaultValue lstack-size