8080マイコンをつくろう!(TK−80完全復活!)
なんと8080です!
もちろん、BASICからCP/Mまで、できます!
36年の時を経ていまよみがえる
8080CPUマイコン組立キット!
なんたってはるか昔の生産中止品を集めて作る組立キットです。
生産前から堂々予告です。
入手できなくなったら
即生産終了!売り切れ御免!




2016.6.20

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

[第41回]

●ゲームプログラムの乱数について(4)

相変わらず多忙な毎日です。
今もちょっと特注品のプログラムでクリアできないところがあって悩んでいるのですが、このところずっと更新していませんので、本日は覚悟を決めて、前回からの続きを書くことにいたします。

前回は応用プログラムで使うお手軽乱数としてモニタROMの中身を順に読み出す、という方法を説明しました。
実際にテストとしてその乱数サブルーチンを利用してみた結果もお見せしました。
ゲームプログラムに利用する程度の乱数としては、まずまずというところだと思います。

ところでこの乱数プログラムに限りませんが、一般に乱数プログラムには困った弱点があります。
それは…。

というところで前回は終ってしまいました。
それは、コンピュータプログラムの実行結果はいつも同じになる、ということです。
これはコンピュータプログラムがきわめて信頼が高いことの証拠でもあって、最大の長所なのですが、しかし、とりわけゲーム用の乱数プログラムとしては利点どころか、最大の短所になってしまいます。

前回説明した乱数プログラムは実行するたびに異なる値を得ることができます。
しかし中身が決っているROMの内容を順に読んでいくのですから、たとえばROMの先頭から読んでいくとしたら、発生する乱数の並びはいつも同じになってしまいます。
たとえばジャンケンでいえば、いつも最初はチョキを出してその次はパーが出て…というようなことです。
これではゲームにはなりません。

いつもROMの違うところから読み始めるようにプログラムしなければ、使い物にはなりませんでしょう。
ところがこれがむつかしいのです。
それこそどこから読み始めるかを乱数で決めなければならないというジレンマに陥ってしまいます。

実は、Z80の場合、こういうときに利用できるありがたい機能があります。
それがRレジスタです。
これは乱数のための機能などではありません。
ダイナミックRAMの制御のために用意されている機能です。

Z80はダイナミックRAMのためのリフレッシュ機能をサポートしています。
ND80Z3.5やMYCPU80、ND8080に搭載しているRAM(62256)はスタティックRAMです。
RAMですからデータを自由に書き換えることができます。
スタティックRAMでは書き込んだデータは電源を切らない限りそのままの値を保持します。
ダイナミックRAMもデータを自由に書き換えることができるという点は同じですが、スタティックRAMと異なってデータを保持していることができません。
簡単な構造のため、非常に短い時間で値が消えてしまいます。
そこで消えてしまわないうちにもう一度その値を書き直すという操作が必要になります。
それがリフレッシュです。

ダイナミックRAMのメモリセルが縦横に配置されている、そのロウアドレスを順に読み出すことでリフレッシュが行なわれます。
要求されるその間隔は非常に短いのでとてもプログラムなどで実行することはできません。
Z80では、そのリフレッシュのためのメモリアクセスを各命令の実行時間中に行ないます。
命令は最初にまずメモリから読み込まれますが、そのあとコードを解読して実行するときに、内部処理の時間が必要です。
その内部処理の期間中は外部メモリバスは使われません。
Z80はその期間を利用して、ダイナミックRAMのためのリフレッシュアドレスを出力します。
このアドレスは下位7ビットのみで、命令実行ごとに00〜7Fを順に出力します。
そのアドレスを保持しているのがRレジスタで、その中身はいつでもプログラムで読み出すことができます。

Rレジスタは命令が実行されるごとにカウントアップされますから、あるていどの命令の実行間隔をあけて読み出せばそれ自体を乱数として利用することもできそうです。
しかしND80Z3.5(ND80ZV)の、応用プログラムの乱数プログラムでは、読み出したRレジスタの値をモニタROMのメモリアドレスの一部に組み込むという形で使っています。

ここまで説明してきましたように、ND80Z3.5(ND80ZV)ではRレジスタを利用することで、乱数プログラムがいつも決った値から始まったりしないようにしています。

さて。
困ったのは、ND8080の応用プログラムです。
ND8080の応用プログラムはND80Z3.5(ND80ZV)の応用プログラムがZ80の命令で書かれていたところを8080の命令で書き直すということで作成するつもりで作業を開始したのでしたが、乱数プログラムではたと困ってしまいました。

8080にはRレジスタがありません。
さて、どうしましょう。

8080マイコンをつくろう![第41回]
2016.6.20upload

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