{{pfw:banner.png}} ====== 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 1B # lsls, \ Build flag out of bit-4 tos 1F # asrs, \ Extend sign tos tos mvns, \ Invert flag next, end-code | File name | Purpose | in Dropbox (external link) | | [[https://www.dropbox.com/s/glvdl0runl65u3t/Thumb%20assembler%20doc%20v2.pdf?dl=1|Thumb assembler doc v2.pdf]] | Documentation | [[https://www.dropbox.com/s/glvdl0runl65u3t/Thumb%20assembler%20doc%20v2.pdf?dl=0|Assembler documentation]] | | [[https://www.dropbox.com/s/jaw8dalna8sodut/RP2040-asm%20uni.f?dl=0|RP2040-asm uni.f]] | RP2040 assembler | [[https://www.dropbox.com/s/0ubyr344j7a1q7k/noForth-T-das.f?dl=0|noForth RP2040 assembler]] | | [[https://www.dropbox.com/s/2g4glx7gcnmuvyl/RP2040-asm-extensions%20uni.f?dl=0|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 ====

Alternative Implementations

[[en:pfw:welcome|Back to PFW page]]