このページの本文へ

オヤジホビー-ワタシが好きな物はみんなも好き、かもしれない-第98回

ワンボードマイコンでプログラムを走らせてみました

2017年10月22日 17時00分更新

文● にゃかむら(@TK6506)、編集●アスキー

  • この記事をはてなブックマークに追加
  • 本文印刷

Z80のアセンブリ言語をハンドアセンブル

 プログラム中に足し算に使う数字を書いてしまうと、数字を変えたいときにいちいちプログラムを書き換えなくてはなりません。数字はデータとしてプログラムの外に置くようにします。例として16進数でA3と17を足してみましょう。

 まずはプログラム本体から。KENTAC 800Z mk2のメモリーエリアは8000h以降が使用可能なので、スタートの番地は8000hにします。数値を入れておくデータのエリアはどこでもいいんですが、メモリーの8050h番地と8051h番地にしてみました。そこの入っている数字を足して、結果を8052hに書き込みます。

 使う言語はZ80のアセンブリ言語。

 CPUが直接理解できるプログラムは0110110111100010のような1と0の連なりで、人間にはまったく理解不能なので、4ビット(4桁)ずつ区切って16進数に変換して表示します。この場合だと0110 1101 1110 0010=6 D E 2ですね。実際には6D E2のように2桁ずつくっ付けて8ビット(8桁)にして表示し、この8桁の2進数を1バイトと呼びます。そう、メガバイト(MB)やギガバイト(GB)などでおなじみのバイトです。

 でも、じゃあ6D E2って書かれていたら意味がわかるのかと言ったらこれまた普通の人には全然わかりません。こういうコンピューターにしか理解できない言葉を機械語と呼びます。

 で、それでは困るので考え出されたのがアセンブリ言語です。アセンブリ言語はニーモックと呼ばれる命令の羅列で、簡略化された英語みたいな感じ。CPUごとに異なるので、Z80のプログラムをつくるにはZ80のアセンブリ言語で書く必要があります。

 というわけで、そのアセンブリ言語で書いた足し算のプログラムがこちら。

 ■足し算するだけのプログラム

ORG 8000h ;プログラムの開始番地

LD A,(8050h) ;8050h番地に書かれている値をAレジスタにコピー
LD B,A ;Aレジスタの値をBレジスタにコピー
LD A,(8051h) ;8051h番地に書かれている値をAレジスタにコピー
ADD A,B ;AレジスタにAレジスタ+Bレジスタの結果を書き込む
LD (8052h),A ;8052h番地にAレジスタの値を書き込む
HLT ;CPUを停止させる

END

8050h A3h
8051h 17h

 レジスタは計算のために数字を格納しておく領域で、Z80には8ビットのものが8個用意されています。2つの数字をそれぞれAレジスタ、Bレジスタに入れればよさそうなものですが、いったんAレジスタに入れたあとBレジスタにコピーしています。これはLD B,(番地)という命令がないからなのです。Aレジスタだけ特別なんですね。

 アセンブリ言語は人間が理解できるかわりにコンピューターには理解できません。なので、機械語にしてあげます。このときアセンブラという変換プログラムを使うのですが、今回はハンドアセンブルをします。っていうとなんだかカッコよさげですが、自分の手で変換するっていうだけです。

 「LD A,(アドレス)」という命令は機械語で「3A」というように、順番に変換していきます。

8000h 3A5080 ;3AはLD命令 5080は8050hをひっくり返したもの
8003h 47 ;A→Bへ数値をコピー
8004h 3A5180 ;3AはLD命令
8008h 325280 ;32はADD命令
800Bh 76 ;HALT(停止)命令

8050h A3
8051h 17

 なんで8050hを5080とひっくり返しているかというと、そういう決まりだからです。これをポチポチと入力していきます。

 まずはリセットしてからプログラムを入力。

基板のリセットスイッチを押します
MONキーを押すと初期状態に
8000と押して
ADRS SETキーを押すとADDRESSが8000、DATAが00に
3Aと押してWRIT/ENTキーを押すと8000h番地に3Aが書き込まれる
自動的にアドレスが次の8001h番地に
同様に50と押してWRIT/ENTキーを押す。こうやって最後まで入力します

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

ASCII.jpメール アキバマガジン

ピックアップ