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