Forth Assembler

Amforth is written in assembly language. Writing assembly words usually requires a rebuild of the hex files and flashing them to the controller. Lubos Pekny developed an assembler that runs within amforth and does not require a change of the amforth sources. Its syntax is a mixture of the standard Atmel assembly and forth. The mnemonics are close to Atmel’s. The forth influence leads to a postfix notation and that the words that do the actual code generation end with a comma.

Start

To use it, load the file lib/assembler.frt and its dependencies into a running amforth. The assembler uses word lists to organize itself. The assembler supports all common mnemonics regardless of the controller type.

The assembler words are in a seperate word list. To activate it, the following sequence is typically used:

forth only also assembler

This resets the word list order and adds the assembler word list. After successfully compiling the assembler word, the word list can be removed with previous.

Simple Example

The example uses the assembler for words that could easily be written in plain forth. Nevertheless an implementation in assembler is done. The code itself it taken from a posting on Roboforum.RU

$2F constant tccr1a
$2E constant tccr1b

\ stop timer1
\ : t1> 0 TCCR1 c! ;
 code t1>
       tccr1b R2 out,
 end-code

 \ start timer1 @ normal mode, prescaler=8 ( 1us counter @8MHz )
 \ : <t1 2 TCCR1 ! ;
 code <t1
       R17    2   ldi,
       tccr1a R2  out,
       tccr1b R17 out,
 end-code

The new words can be used just like a ordinary forth words.

\  stop timer1 & zero counter
: <t1>  t1> 0 dup TCNT1H c! TCNT1L c!   ;

\  show t1 counter
: .t1
        TCNT1L c@ TCNT1H c@ 8 lshift + dup
        ." (0x" .x ." )" bl emit u. ." us"

        TIFR dup c@ $4 and dup      \ test  TOV1 flag
        if bl emit ." overrun"
           over c@ or swap c!      \ clear TOV1 by writing'1'
        else drop drop then cr
        ;

 \ timing test using timer1, xt - executable address
  : ?us   <t1> <t1 execute t1> .t1 ;   ( *x xt -- *y )