.. | ||
fcode | ||
fs | ||
build.sh | ||
config.inc | ||
mkromfs.rb | ||
platform-config.inc | ||
platform-lib.s | ||
platform-words.s | ||
README.md | ||
W65C816SXB.l | ||
W65C816SXB.s |
W65C816SXB
This is a port to WDC's W65C816SXB development board. To build it, change to the platform directory and run build.sh. This will output a binary named "forth" that is suitable for placing in one of the Flash ROM banks of the W65C816SXB at $8000. Andrew Jacob's w65c816sxb-hacker is suitable for this. Note that OF816 currently uses the USB port as the console device.
You may also create a completely custom ROM image that replaces the WDC monitor
with OF816, all that is required (assuming you are not going to use interrupts)
is to point the RESET vector to $8000. It may be desirable to point the NMI
vector at a routine that resets the system stack pointer and jumps to
_Forth_ui
.
While this platform provides the "reference" platform with regards to system implementation, configuring it and making it work are an advanced topic.
Note: None of WDC's tools are used to build OF816.
Port Features
Banked ROM Access
The platform words include $SXB-READROM
( rom_addr dest_addr size -- ).
This word allows copying size bytes from any bank in the ROM into dest_addr.
The rom_addr is an address of the form $bb00xxxx where bb is the bank number (0-3) and xxxx is the physical address of the memory in bank 0. I.e. the valid ranges are $00008000-$0000FFFF, $01008000-$0100FFFF, etc.
FCode/romfs ROM Loader
If FCode support is enabled, the word $SXB-ROMLDR
is included in the
platform words. This encapsulates fcode/romloader.fs
and executing it will
cause the ROM Loader and romfs words to be installed (romfs support may be
disabled, see the source).
The ROM Loader keeps a $100-byte cache of the last ROM page read in order to reduce the number of bank-switch/copy operations.
Once the ROM Loader and romfs are installed, the following words are available:
FCode Loader Words
$SXB-ROM-FCODE-AT?
( rom-addr -- f ) f is true if there is a FCode magic
("MGFC") at the given ROM address. rom-addr must be on a page boundary.
$SXB-ROM-BYTE-LOAD
( rom-addr -- ) evaluate FCode at rom-addr, satisified
by the conditions of $SXB-ROM-FCODE-AT?
.
$SXB-FC-BOOT
( -- ) search ROM at $1000-byte alignments for FCode identified
by $SXB-ROM-FCODE-AT?
and evaluate it.
romfs Words
romfs words generally follow the ANS Forth File Access word set guidelines, however they automatically throw non-zero IORs, therefore if the word returns normally the IOR is always 0. Consult the ANS standard for complete description of stack items.
INCLUDE
( <>"name" -- ... ) parse name and perform the function of INCLUDED.
INCLUDED
( c-addr u -- ... ) evaluate romfs file named by c-addr u.
OPEN-FILE
( c-addr u fam -- fileid 0 ) open romfs file, fam is discarded,
access is always read-only.
READ-LINE
( c-addr u fileid - u2 f 0 ) read a line up to u bytes from file.
READ-FILE
( c-addr u fileid - u2 0 ) read up to u bytes from file.
FILE-POSITION
( fid -- u ) return read position in file
CLOSE-FILE
( fileid -- 0 ) close romfs file
ROMFS-LIST
( -- ) list files in romfs.
$SXB-ROM-ROMFS-AT?
( rom-addr -- f ) f is true if there is a ROMFS magic
("MGFS") at the given ROM address. rom-addr must be on a page boundary.
$SXB-ROMFS
( -- u ) VALUE, zero if no romfs was found, otherwise contains
the ROM address of the romfs.