標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第236回]

●「TK80モニタプログラム」の移植作業

前回は「TK80」のキー入力と、その結果がLEDに表示される様子を写真でお見せしました。
今回は、「TK80」のモニタプログラムを移植した過程についてのお話です。

まずは、モニタプログラムそのものを作らなければ、そもそもおはなしにもなりません。
「TK80」のモニタプログラムは、「TK80ユーザーズ・マニアル」に完全なリストが公開されて掲載されていました(「第1回」参照)。
このユーザーズ・マニアルは、当時NECのビット・インで購入したものを持っていたはずなのですが、余りに昔のことなので、どこかにいってしまって見当たりません。

ところが、うれしいことに、この連載を読まれた方が、「TK80ユーザーズ・マニアル」を送ってくださいました(「第125回」)。
じつは中日電工でもTK80をベースにして発展させた形のボード「ND80」を、もうかれこれ30年近く販売しています。
ですから、「TK80ユーザーズ・マニアル」に記載されているモニタプログラムリストを利用しなくても、当社の「ND80」用のプログラムをもとにして、モニタプログラムを作ることはできます(もっとも当社のモニタプログラムも、もとを正せばTK80モニタプログラムを元にして、それを改良発展しただけなのですけれど)。

しかし、せっかく8080CPUと同じ動作をする回路を作り、そのボード上に「TK80」の回路まで作ってしまったわけですから、そして今手元には往時の「TK80モニタプログラムリスト」があるのですから、ここはやっぱり、TK80モニタプログラムをそっくりそのままメモリに書き込んで、実行させてみたい、ですよねぇ。
とはいっても、完全に同じハードではないので、100%同じというわけにはいきません。

そこで「TK80ユーザーズ・マニアル」記載のモニタプログラムリストをざっと眺めてみたところ、キーとLEDのアクセス部分と、ワークエリアのメモリアドレスを変更すれば、多分いけるのではないか、という感じになりました。

で、TK80のモニタプログラムリストを見ながら、8080アセンブラのソースプログラムを作成しました。
とりあえず動けばいいので、一部省略したところもありますが、それほど長いプログラムではありませんので、「昼飯前」くらいの感じでできてしまいました。まあ、ほとんど「そのまんま」ですから、リストを見ながらキーボードをたたいて、そのままソースを作っただけですけれどね。

このソースプログラムは「第180回」でご紹介しました、自作の8080アセンブラで、8080のマシン語プログラムに翻訳します。
マシン語に翻訳したプログラム(オブジェクトプログラム)は、USBを介して試作基板に送ります。
このUSB送信プログラム(じつはRS232C送信プログラム)も、BorlandのC++コンパイラで作ったものを使います([第189回])。

●「つくるCPU版」TK80モニタプログラムのリストです

こういうちょっとしたドキュメントになると、大抵はPDFファイルへのリンク、ということになるようですが、私は、あれは、好きになれません。
ま、好みの問題でしょうけれど、いちいちAcrobat Readerが起動して、パテントナンバーぎっしりのオープニングから、やっとのことで文書が開くってのは、なんなんでしょうかねぇ。
ホームページを見ているんですから、ブラウザの範囲でけりをつけていただきたい、と思ってしまいます。

かといって、textファイルをHTMLに張りつけると、これまたスペースやら字体やらが飛んでしまって、見にくくなってしまいます。
ということで、プログラムリストなのですけれど、画像ファイル(jpg)でお見せすることにいたします(見た目すっきり、ですけれど、ファイルの作成にはしっかり手間がかかってしまいました)。

(1)プログラムリストの先頭部分です。



最初に使用する変数を定義します。
TK80では、ワークエリアはアドレス83XXに割り当てられていました。
しかし「つくるCPU」では、RAMのみで使う場合にはイメージのため、83XXは03XXと重なってしまって面白くありません。
今回のモニタプログラムは、終りのアドレスが0210なので、プログラムとデータがぶつかることは、なんとか避けられていますが、もう少しプログラムが大きくなると、データとプログラムがぶつかってしまいます。
そこで「つくるCPU版」のTK80モニタプログラムではワークエリアをFFXXに割り当てることにしました。
もともと、7SEGのLED表示回路はメモリアドレスのFFF8〜FFFFをDMAアクセスすることで、LED表示を行っています。
ですから、それに合わせて、そのほかのワークエリアもFFXXに置くことにしたのです。
RAMのみの構成の場合、メモリアドレスFFXXは、7FXXでも同じメモリエリアがアクセスされます([第130回]参照)。

プログラムの内容です。
0000からプログラムの実行が開始されます。
0000〜0038はRST0〜RST7のエントリアドレスです。
RSTについては、[第217回]で説明をしました。
RST2〜RST6はユーザーが利用できるように、ワークエリアにJMPするようになっています。
RST7はブレイク動作やステップ動作のためのルーチンにジャンプします。

以下のプログラムリストも含めて、プログラムそのものについては、簡単な説明にとどめます。
今、それを始めてしまいますと、基板の発注がいつになるかわからなくなってしまいます。
いずれ、必要な作業が片付いたら、あらためて説明をすることも検討したいと思います。

(2)リセット後の初期設定と、キー入力のスタンバイ部分です。



今、気がつきました。
とりあえずのテストのため、ソースプログラムはアドレスを考えないで、先頭からベタ打ちで作成してしまいました。
そのため、もともとのTK80オリジナルのモニタプログラムと、主要ルーチンのエントリプログラムが食い違ってしまいました。
これでは、TK80のために書かれたプログラムを実行させるために、モニタサブルーチンをコールしているアドレスを書き換えなくてはならなくなって、不便です。
最終的には、各エントリポイントをTK80オリジナルに合わせるように修正することにします。

プログラムの内容です。
キーからの入力を受けて、それが0〜Fの場合には、そのままLEDに表示します(DIGITルーチン)。
キー入力もLEDの表示もサブルーチンによって行っていますから、そのサブルーチンを見ないことにはなにをやっているかわかりません。サブルーチンは後ろの方にまとめて書いてあります。

RUNやADRS SETなどの機能キーの場合には、それぞれの処理ルーチンへジャンプします。
PCHL命令が使われています。
PCHL命令は[第93回]で説明をしています。

(3)各機能キーの処理ルーチンです。



ADRS SET、READ DECR、READ INCR、WRITE INCRの各ルーチンです。

(4)各機能キーの処理ルーチンの続きです。



ユーザープログラムへのジャンプ(RUN)やブレイク、ステップ動作(RET)、およびデータSAVE、LOADの各ルーチンです。
プログラムやデータのSAVE(SDATA)、LOAD(LDATA)は、あとで作ることにします。今はとりあえず省略です。

(5)サブルーチンプログラムです。



LED表示のためのサブルーチンです。

(6)サブルーチンの続きです。



これは、ブレイク、ステップ動作のためのルーチンです。

(7)これもサブルーチンの続きです。



キー入力のためのサブルーチンです。

(8)アセンブラの変数名テーブルです。



8080アセンブラがソースプログラムをマシン語に翻訳する過程で、変数やラベルをアドレスや数値への変換を行った対応表です。
マシン語プログラム(オブジェクトプログラム)ファイルには直接関係ありません。
あとでプログラムを見直したり、修正したりするときに便利なように、8080アセンブラがプログラムリストの最後に出力します。

いままで、命令の動作をチェックするために作ったテストプログラムは、みんな短いものでしたが、今回のプログラムは、ご覧のように、しっかり長い、「ホンモノ」のプログラムです。
これだけのプログラムが現実に動いてしまったのですから、自画自賛ですけれど、実際大したものじゃありませんか。

次回も、もうすこし、この続きを説明いたします。
2009.5.31upload

前へ
次へ
ホームページトップへ戻る