en:pfw:assemblers_rp2040-assembler
**This is an old revision of the document!**
Table of Contents
Assembler for RP2040
The idea
A compact Forth-style macro assembler with an efficient literal pool mechanism for the RP2040.
A Forth-style assembler uses all the capabilities of the Forth interpreter and assembles opcodes in between.
An example:
code SQUARED ( +n -- +n^2 )
tos tos muls, next,
end-code
Implementation
The example code asumes a 32-bit machine that has 16-bit & 32-bit compile actions.
It is also asumed that the code runs in RAM as noForth T on the RP2040 does.
Because the Thumb-2 opcodes of the ARMv6-M use a RISC like architecture, macros
are added to make assembly a bit more easy.
An implementation example for CODE and END-CODE is showed too. Missing words in Generic Forth are:
(* ( "ccc" -- ) - Skip all text until *) is found +TO ( n "name" -- ) - Add n to the contents of the value "name" VOCABULARY ( "name" -- ) - Define a named wordlist
All Thumb2 instructions
✦ Two low register opcodes
ands, eors, adcs, sbcs, rors, tst,
neg, cmn, orrs, muls, bics, mvns,
sxth, sxtb, uxth, uxtb, rev, rev16,
revsh, lsls, lsrs, asrs, movs, cmp,
✦ Two all register opcodes
add, mov, cmp,
✦ Three low register opcodes
adds, subs, str, strb, strh, ldrb,
ldrh, ldr, ldrsb, ldrsh,
✦ Two low register & 3-bits immediate
adds, subs, rsbs,
✦ Two low register & 5-bits immediate
lsls, lsrs, asrs, str, strb, strh,
ldr, ldrb, ldrh,
✦ One low register & 7-bits immediate (RP-specific)
add, subs, sub,
✦ One low register & 8-bits immediate
movs, cmp, str, (rp) ldr, (rp) ldr, add, (rp)
push, pop, bkpt, udf, svc, adr,
stm, ldm, adds, subs,
✦ Various 16-bit opcodes
noop, nop, yield, wfe, wfi, sev,
cpsie, cpsid, bx, blx,
✦ Fourteen jump instructions
=? cs? neg? vs? u>? <?
>? no
✦ Control structures
if, else, then, ahead,
begin, while, repeat, again, until,
✦ Literal pool additions
ALIGN, CODE> POOL, APOOL, ##
✦ Assembler macros
ALIGN, ## POOL, APOOL, )+
-) NEXT,
Two usage examples
code LSHIFT ( x1 +n -- x2 )
day tos movs, \ 1 - +n to DAY
tos sp )+ ldr, \ 2 - pop X1 to TOS
tos day lsls, \ 1 - Shift TOS DAY positions left
next, \ 6
end-code
code KEY?) ( -- f )
40034018 , \ UART0 UARTFR
code>
sun w ) ldr, \ Read UARTFR to SUN
tos sp -) str, \ Push stack
tos sun ) ldr, \ Read flags
tos tos 1B # lsls, \ Build flag out of bit-4
tos tos 1F # asrs, \ Extend sign
tos tos mvns, \ Invert flag
next,
end-code
| File name | Purpose | in Dropbox (external link) | |
| Thumb assembler doc v2.pdf | Documentation | Assembler documentation | |
| RP2040-asm uni.f | RP2040 assembler | noForth RP2040 assembler | |
| RP2040-asm-extensions uni.f | RP2040 ass. extensions | [https://www.dropbox.com/scl/fi/65wbh85v95rvh4uoo5rtd/T-asm-ext.f?rlkey=v8cpj3mr45oz9ou4v3apyi5w2&dl=0 | noForth assembler ext.f]] |
Contributions
en/pfw/assemblers_rp2040-assembler.1693898528.txt.gz · Last modified: 2023-09-05 09:22 by willem
