RISC-V¶
Boot process¶
Upon boot, the CPU starts at address 0x20400000. There is a jump
instruction into the body of cold
. cold
sets up the Forth
VM inner interpreter and hands over to warm
. warm
initialzes
the remaining system including turnkey
and finally calls quit
which never returns and does the usual Forth command interpreter loop.
CPU – Forth VM Mapping¶
The Forth VM has a few registers that need to be mapped to the controller registers.
Register Mapping¶
Forth Register | RISC-V Register |
W: Working Register | x17 |
IP: Instruction Pointer | x16 |
RSP: Return Stack Pointer | x2 (sp) |
PSP: Parameter Stack Pointer | x4 |
UP: User Pointer | x18 |
TOS: Top Of Stack | x3 |
loopsys (index+limit) | x8 and x9 |
The registers x5 to r7 and x10 to x15 are currently used as scratch registers. The registers x20 and x21 are planned to be used as extended VM registers.
Memory¶
The memory model is unified. All addresses are available with
the usual @
/!
words.
Strings are addr/len pairs. Since len is a cell sized number, the length is not really limited. Compiled strings however are limited to be usable with COUNT, that means up to 255 bytes in length.
Dictionary¶
The dictionary consists of four wordlists. One, forth-wordlist
resides in flash memory and contains all standard words. Another one
called ram-wordlist
contains all user defined words. The third
wordlist riscv-wordlist
has definitions for controller specific words and
constants. Only the first two wordlists are part of the standard search order.
The ram-wordlist
is the current wordlist for new definitions too.
Upon reset all words from the ram-wordlist are erased.
> : foo ;
ok
> ram-wordlist show-wordlist
foo ok
> : bar ;
ok
> ram-wordlist show-wordlist
foo bar ok
> cold
amforth 6.8 RV32IM
> ram-wordlist show-wordlist
ok
>
Exceptions like -13 for not-found keep this wordlist intact however.