現在地

AVRA から AS へ


カテゴリー:

これまで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

    これはうまい方法が思いつかなかったのでやむを得ず書き直しました。

  • セグメント
    .csegsegment codeに書き換えます。データセグメントについても同様です。
  • メモリ確保
    RAM上のメモリ確保についてはlabel: .dc lengthlabel: 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に対応リクエストしたら動いてくれるかなぁ。


コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。