石原 博の覚書

電子工作に関する日々の覚書を記載します

FlashForthのアセンブル(3)

2021-10-13 15:39:55 | 日記

Arduino pro mini上でFlashForthを使ってマルチタスクの実験をしたが、hexファイルの書き込みでインストールしている。

しかしやはりソースからアセンブルしたい。 (FlashForthのアセンブル(2)よりの続き)

 

 なぜかビルドした結果のHexファイルと付属のHexが一致しない。

 なにが起きているのか確認するため、MAPLABの逆アセンブラを使ってみる。

  File > Import > Hex/ELFで該当のHexファイルを読み込み、Windows > Target memory views  > Program Memory

出来た結果はファイルに出せる

 

 

 ビルドしたHexファイルと、付属しているHexファイルを逆アセンブルしてdiffした。

   しかし逆アセンブルした結果が1行目から変。本来JMPは4バイト命令のはずだが。 MAPLABのバグか? 

 

 JMPは4バイトなので、後ろのADD R21, R5などはおかしい。


 無いよりましだけど、あまりあてにならない。(FlashForthを調べるどころではないなあ)


[5]それでもあれやこれや調べると、ff-xc8.asmの以下の「call FETCH」を「rcall FETCH」としてビルドすれば、付属のHexファイルと一致することがわかった。

===ff-xc8.asm 3014行より ここの call FETCHを rcall FETCHに変更========
F_LFA_FETCH:
        call    FETCH      ; c-addr nfa
        cbr     FLAGS2, (1<<fFIND)
findi2:
        sbiw    tosl, 0     ; c-addr nfa
        brne    findi1
        rjmp    findi3
============

これで安心して遊べる。

 


FlashForthのアセンブル(2)

2021-10-13 15:39:55 | 日記

Arduino pro mini上でFlashForthを使ってマルチタスクの実験をしたが、hexファイルの書き込みでインストールしている。

しかしやはりソースからアセンブルしたい。 (FlashForthのアセンブル(1)よりの続き)


[3]ビルドするとエラー
  /home/ishi/.mchp_packs/Microchip/ATmega_DFP/2.4.131/xc8/avr/lib/avr5/memx-const/crtatmega328p.o:../../../../../crt1/gcrt1.S:352: undefined reference to `main'
collect2: error: ld returned 1 exit status

  -->macro-xc8.incにコメントがあった。これをMPLABXに設定
   ;;; - Add linker option "-nostartfiles"

[4]やっとビルド成功。Hexファイルはここに出来る
  ~/MPLABXProjects/FlashForth.X/dist/default/production/FlashForth.X.production.hex

 ところが付属していた328-16MHz-38400.hexとdiffを取ってみるとちょっと違う。
 Cだと最適化で差が出るかもしれないが、アセンブラで差が出るのはおかしい。
 微妙にアドレスがずれているような感じ。

 

FlashForthのアセンブル(3)に続く

 


FlashForthのアセンブル(1)

2021-10-13 15:39:55 | 日記

Arduino pro mini上でFlashForthを使ってマルチタスクの実験をしたが、hexファイルの書き込みでインストールしている。

しかしやはりソースからアセンブルしたい。ソースは付属しているがff-xc8.asm ff-atmega.asm の2種類がある。(GPL3)

以下のような記載があるが、MPLABXは良くわからない。
---https://flashforth.com/atmega.html---
    Install MPLABX and XC8
    Add avr/src/ff-xc8.asm as only source file in a project.
    Select a chip
    Add linker option "-nostartfiles"
    Configure options according to your hardware and preferences in avr/src/config.inc
    Compile
    Get the hex file from dist/default/production/
    Program the chip with avrdude or some other tool using fuses: extended(0xff) high(0xdf) low(0xff) 

そこで手探りでアセンブルを試みた。

環境
 Debian10, MPLAB X IDE v5.45
  (最新と思われる MPLABX IDE v5.50は、なにかおかしい(注1)。インストールを試みたが途中でOSが落ちた)

[1]プロジェクトの作成

ダウンロードしたソースを読み込ませる

字が半分消えているが見えないことはない

[2]ビルドするとエラー。
  #include <config-xc8.inc>で見つからない。
  -->config-xc8.incを登録するところが悪いのか? しかたないので、#include "config-xc8.inc" とソースを変更。

 

FlashForthのアセンブル(2)に続く