Pygmy Forth pro ARM je 32 bitový (cell) forth pro processor ARM. Implementace požívá slova velikosti 32 bitů a HL slova jsou posloupnosti 16-ti bitových tokenů. Je kódován pro prostředí processoru LPC2106 který má 128kB flash (0x00000000 - 0x0001FFFF) a 64kB RAM (0x40000000 - 0x4000FFFF). Tokeny mají vnitřní strukturu jejíž součástí je 13-ti bitový ukazatel do tabulky adres.
FIXME:HL slova jsou posloupnosti 16-ti bitových čísel. Horních 15 bitů ukazuje na slova, spodní bit má význam JUMP/CALL. V horních 15-ti bitech je jaště „zakódována“ informace, zdali cílové (volané) slovo je HL či LL. Tato informace se získá porovnáním 15 bitové hodnoty s hranicí. Slova pod touto hranicí jsou LL a slova nad touto hranící pak HL. To nám dovolí skrátit definici slova o pole CFA. Protože všechna LL obsahují kód a všechna HL se vykonávají interpretem docol.
Implementace NEXT. High-Level slova jsou posloupnosti 16-ti bitových tokenů. Tokeny mají vnitřní strukturu:
Makra
; nxt -- move from one word to the next following IP .macro nxt ; select correct version of inner interpreter b nxtTab .endm
nxtTab:
ldrh W, [IP], #2 ; read unsigned half-word then bump IP by 2
nxtexec: ; convenient entry point for use by EXECUTE
; 16-bit token is now in W
; handle Exit flag
movs W, W, lsr #1 ; set C flag from original bit 0 (i.e. the jump flag)
ldrcs IP, [RSTK], #4 ; pop rstack into IP ("unnest") inly if jump=1
; handle RAM/flash table flag
movs W, W, lsr #1 ; set C flag from original bit1
; Then load the address of the correct token table into TEMPREG
ldrcc TEMPREG, ptokens ; Load temporary register with base
ldrcs TEMPREG, prtokens ; address of the chosen token table.
; If RAM flag was set, use the RAM
; table. Otherwise, use the flash table.
; Remember the Primitive flag (in C)
movs W, W, lsr #1 ; set C flag from original bit2
; we will test this flag after looking
; the token's address in the token table
; Lookup word's address in token table. The 13 bits of the token
; number were originally in bits 15..2 of W but are now in
; bits 12..0 because we shifted W right 3 bits. Now, shift W
; left 2 bits to convert to a byte offset then add offset to
; start of table, leaving address of entry table item in TEMPREG.
add TEMPREG, TEMPREG, W, lsl #2
; Handle Primitive
ldrcs pc, [TEMPREG] ; jump to the primitive if primitive flag
; was set
; Otherwise, handle nesting down to called high-level word
str IP, [RSTK, #-4]! push IP to return stack
ldr IP, [TEMPREG] load IP with address of new word
b nxtTab jump back to nxt to begin handling new word.
.ltorg ; force dumping of literal pool; ; semicolon exit: EXIT: /* unnest by popping return stack into IP */ ldr IP, [RSTK], #4 ; pop rstack into IP nxt
; NOP ( - ) This serves mainly the purpose of safely occupying
; 16-bits in a high-level word list, for aligning a
; label in a 4-byte boundary.
NOP:
nxt