2019-04-04 23:40 — asano
カテゴリー:
これまでAVRのソフトウェア開発はAVRAを使ってきました。文法が純正アセンブラとほぼ一緒で、NetBSD上で使えるのがその理由でした。
最近 8080, Z8, MC6800, MC6809 などで共通に使えるという理由で The Macroassembler AS を使うことが増えてきました。Z80 も容易に移行できたので、AVR もこの際統一しようとやってみたので引っかかった点などを書いてみようと思います。
題材は、ROMエミュレータのメモリ編集ルーチンの製作中のボードへの移植です。製作中のボードについてはある程度形になったところで取り上げようと思います。
- レジスタ定義などのヘッダファイル
AVRAでは純正のヘッダファイルを使用します。ASでは独自のものが付属しています。
今回はATmega1284Pなので以下のように include しています。save listing off include "regavr.inc" include "avr/regm1284.inc" restore
1,2,5行目のようにしておかないとリスティングファイルが大変なことになります。
- XH,XL,YH,YL,ZH,ZLレジスタ
そのままでは使えなかったので次のように定義してしまいました。XL reg r26 XH reg r27 YL reg r28 YH reg r29 ZL reg r30 ZH reg r31
- high(),low()関数
AVRAではアドレスなどの16ビット定数式の上位・下位を取り出す関数がありましたがASには無いのでこれも定義してしまいました。low function x,(x & 0xff) high function x,(x >> 8)
- adiw,sbiw命令
AVRAでは次のように上位と下位のレジスタを記述します。adiw XH:XL,1
一方ASでは次のように下位のレジスタのみを記述します。上位と下位の組み合わせは決まっているのでこれで十分なのです。
adiw XL,1
これはうまい方法が思いつかなかったのでやむを得ず書き直しました。
- セグメント
.cseg
をsegment code
に書き換えます。データセグメントについても同様です。 - メモリ確保
RAM上のメモリ確保についてはlabel: .dc length
をlabel: res length
に書き換えます。 - 定数テーブル
実はこれが一番ハマったところでした。
定数テーブルといっても文字列です。AVRAでは次のように記述していました。.db "Error",$0d,$0a,0
最初これを単純に次のように書き換えたのですが...
data "Error",0x0d,0x0a,0
改行がされませんでした。
定数は当然ROMに配置するのですがAVRのROMはワード(16ビット)です。「Error」の部分は1ワードに2文字ずつパックされたのですが、0x0dは0x000dと解釈されてしまいました。表示ルーチンでは8ビットずつ取り出して表示しますが、0x000dの上位の0x00を終端と捉えてしまったのでした。
とりあえずは以下のようにして回避しています。data "Error\r\n\0"
新規はASで書くにしても、既存のものを書き換えるのは面倒ですね。結局はAVRAも使い続けなくてはいけないのか。
ASに対応リクエストしたら動いてくれるかなぁ。
コメントを追加