“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。最近はHSP3でのゲーム作り日記です

24.マシン語にチャレンジ

BASICで作ったプログラムの遅さに、ついにマシン語にも手を出した。
マシン語は、過去のエントリーでも書いた通り、直接コンピュータがわかる命令でプログラムすること。
でも命令はすべて16進数の数字で書くことになる。

日本語に方言があるように、マシン語もCPUの種類によって違う。
MSXのCPUは、Z80A。今のパソコンでいえば、intelのcore-i7とか表記されているもの。

数字の羅列ばかりでは、プログラムできないので、「ニーモニック」と呼ばれる人間にも(多少は)分かる英単語や記号の組み合わせで、プログラムしていく。
マシン語でプログラムために「アセンブラ」と呼ばれるソフトがあり、ニーモニックを書けば、自動的にマシン語の命令に変換してくれる。
当時MSXにもMSX-DOSならば、アセンブラソフトがあったはずなのだが、何せ持っていたのはディスクなし、無印のMSX
ニーモニックを手でノートに書いて、コード対応表とにらめっこしながら自身で変換する、ハンドアセンブルを行ったのだ。
今でも、3E xxとか、CD xx xxとか、何か覚えてたりするw

BASICと違って、命令は最低限の物ばかり。
行番号ではなく、アドレスと呼ばれる、メモリの番地を自分で管理しなくてはならない。
変数ではなく、レジスタと呼ばれる、数値を格納できる場所が数か所あるのみ。
レジスタや、メモリに一時的に格納(スタック)する命令を組み合わせながら、計算などを行う。
そう。計算。考えられないだろうけど、掛け算、割り算の命令はZ80にはない。
どうするか?自分で作らないといけないのだ…
簡単なのは足し算や引き算を繰り返すこと。ちょっと2進数を勉強していくと、ビット演算で高速に掛け算、割り算ができるようになる。
8ビットCPUなので、基本的に扱える数字の上限は8ビット。0~255までの数字でしかない。
それをメモリやレジスタに格納したものを組み合わせて大きな数字や、小数点の計算をやらねばならない。

例えば、足し算をするプログラムはこんな感じでニーモニックを書く。

LD A,10
ADD A,20

これでAレジスタに10を入れて、そのあと20を足す、になる。
このままでは当然動かないので、ニーモニックを対応表を見ながら、16進数のコードに変換すると…

LD A,10   3E 0A
ADD A,20  C6 14

LD A,xは、3E XX。ADD A,xは、C6 xxと変換してこれをアドレスを指定してメモリに書き込んで実行する。

こういった命令を延々とノートに書いては変換する作業を繰り返さないといけなかった…
結局、スプライトを表示して、カーソルキーで動かすぐらいまでしか作らなかった記憶がある。

今ならアセンブラが使えるので、ハンドアセンブルはしなくてもいいけど、プログラムをする気は起きないなぁww