10.1. Pygmy Forth for the ARM

10.1.1. MMC rozhraní

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