ペリフェラルはもう説明することがないので、続いてはアセンブリをやってみたいと思います。
使用ツール
先に sdcc
を入れましたね。それを使います。厳密には、付属しているアセンブラ sdas8051
でオブジェクトファイル(もどき) を生成して、それを sdcc
にかませることによりバイナリを生成します。
参考サイト
ユーザマニュアルはもちろん見ました。それ以外に参考にしたサイトたちです。主にアセンブラの使い方を見ました。
- こびにぃのあそび:as-z80 を使ってアセンブルする前に
sdcc
付属アセンブラのクセ/書き方について。
- svn.code.sf.net/p/sdcc/code/trunk/sdcc/sdas/doc/asmlnk.txt
.area
ディレクティブについて。これ見てもよくわかってないけど。
コードの書き方
アセンブリコード自体は命令セット表を見ながら書けると思いますので、それ以外のお作法についてまとめておきます。
.module
ファイルのまとまりの名前(?)を示すもの。モジュール名を指定する。例えば .module main
とかですかね。
.globl
global の意。他のファイル(アセンブル単位)から関数等を見えるようにします。これがないと、C言語における static
な状態となります。
また、sdcc
ではC言語で生成したシンボルの先頭にアンダーバー(_
)がつくので、アセンブリとC言語を組み合わせる時は注意しましょう。
.area
メモリ空間上の領域に名前をつける。名前に続いて括弧で囲ったパラメータを指定することによって、格納するデータについて明示をする。割り込みベクタ等は relocatable ではいけないので、絶対指定をする。また、sdcc
では HOME
, XDATA
, PSEG
, RSEG
という領域の定義が必要なよう。
僕はよく分からなかったので、こんな感じで空の定義としています。
.area HOME (CODE)
.area XSEG (XDATA)
.area PSEG (PAG,XDATA)
.area RSEG (ABS,DATA)
.org
指定番地にデータを置くという意味。ベクタテーブル記述には必須。
マクロ定義
イコールを使って定義する。至極単純な記法。
P1 = 0x90 ; P1というワードが出てきたら、それを0x90に置換する
というわけで
説明も面倒くさくなってきた所で(すみません)、コードを出してしまいましょう。このプログラムは、P1.0 を1秒ごとにチカチカさせています。
タイマーを使用して時間稼ぎをしています。接続したクリスタルは 12MHz です。
アセンブル・リンクコマンドはこちら。
$ sdas8051 -o -l a.s # a.rel(オブジェクトファイル)とa.lst(リンクに必要なファイル)を生成
$ sdcc a.rel # リンク完了。a.ihx(Intel HEXファイル)が生成