標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第226回]
●DAA命令のテストプログラムの説明です
プログラムリストは前回お見せしましたが、説明の途中で何度も前回に戻って見る、というのもやっかいなことですから、もう一度お見せした上で、説明をすることに致します。
プログラムはいつものように、0100から始めることにします。
ソースプログラムはメモ帳(notepad)で書いて、そのあと[第180回]で作った8080アセンブラでマシン語に翻訳します。
その昔、TK80の時代には、アセンブラなどという便利なものは、庶民には縁のないものでしたので、もっぱらノートにソースプログラムを書いて、それから命令をひとつひとつ8080命令表を見ながら、マシン語コードに翻訳していったものです。
その作業を、ハンドアセンブルなどと言いました。人力翻訳機ですな。
ちょいと長いプログラムともなると、それは大変な作業で、おまけにレジスタによってコードが異なるMOVやADDなどでは、たいていひとつやふたつは翻訳ミスをして、バグ取りに泣くはめになったりします。
いやあ、アセンブラって、ホントにありがたいものですねー。
8080アセンブラによってマシン語に翻訳して、作成されたバイナリファイルは、[第189回]で作った232C送信プログラムを使って、「つくるCPU」に送られ、試作基板の上のRAMへと書き込まれます。
RS232Cの送信は、当初は232Cケーブルを使うように設計したのですが、いまどきはRS232Cコネクタのないパソコンが主流ということで、232C−USB変換コネクタを使って送信してみました([第183回])。
で、ここの部分は、その後、「つくるCPU」基板にUSB−232C変換用ICをとりつけることとして、USBで直接送信するこことしました([第207回])。
なかなかに、けっこう立派な機能のボードになってしまいました。
シンプルなロジックICの寄せ集めに過ぎないボードなのに、それなりに高度な作業をこなしてくれる、というのは、自分で作っておいて、ちょいとおかしな言い方ですけれど、なんだか信じられないような気持ちです。
こうやってプログラムをロードしたり、トグルスイッチをパチパチさせてみたり、プログラムを実行させてみると、いやあ、なかなかに、面白いものですよ。
あ。プログラムの説明をしなくては。
前回、用意したADD命令用の数値データは、プログラムの終りにまとめて置いてあります。
アセンブラはこういうこともできるので、便利です。
DBというのは、8080の命令ではなくて、アセンブラそのものの命令です。こういう命令を「擬似命令」といいます。
DBはdefine byteです。DBに続けて書いた16進数のコードが、そのままそのアドレスに書かれます。
今回のテストでは、いくつかの計算を順に実行しますが、その結果はあとで確認できるように考えました。
DAA命令での補正結果だけではなくてフラグの状態も確認できるといいですねえ。
というわけで、PUSH命令でスタックに保存しておいて、実行後にトグルスイッチをパチパチやって、スタックに保存された結果を見てみることにしました。
スタックを使いますから、プログラムの先頭でスタックアドレスをセットします。
LXI SPです。スタックは8000にセットしました。
ということは7FFFから前にスタックが割り当てられることになります。
スタックについては、[第67回]で詳しく説明をしています。
その次のLXI Hで、ADD命令のための数値データを順番に取り出せるように、メモリアドレス(M)を示すHLレジスタに、DTOP(data topの意味でつけたラベル)のアドレスをセットしています。
直接アドレス値を指定しなくても、そのアドレスにつけたラベルを指定しておくと、アセンブラがアドレスに変換してくれます。便利です。
Bレジスタには繰り返し回数(7)を入れて、いよいよ計算スタートです。
データのトップにある数値をCレジスタに入れます。
HLレジスタを+1して(INX H)、次のアドレスの値をAレジスタに入れます。
その次の計算用に、HLレジスタはもう一回+1します(次のINX H)。
そしてADD Cで、CレジスタとAレジスタの値を加算します。
ADDの次が、DAA命令です。
DAAの実行結果はその次のPUSH PSWで、スタックに保存します。
PUSH命令は[第69回]で説明をしています。
そしてBレジスタを−1します(DCR B)。
結果が0になるまで、JNZ命令で、LOOPに戻って繰り返し実行します。
Bレジスタの値が0になったら、そこで停止します(HLT)。
2009.5.15upload
前へ
次へ
ホームページトップへ戻る