トップページ > 電子工作インデックス > シューティングゲーム > H8にRAMを増設する

H8にRAMを増設する

いざシューティングゲームを作るとなると、テトリス でやったように複数のレイヤーごとに画面を分けることになります。すると、そのレイヤーの 数だけメモリ容量が必要になるのですが、前に見たようにH8-3052のRAMは8KB…ディスプレイの 画面7枚分となっています。ここで、簡単にシューティングゲームで必要なレイヤーを 考えてみると、自機のレイヤー、弾のレイヤー、敵のレイヤー…という感じでしょうか? さらに、発射される弾の座標を扱う変数、敵の座標を扱う変数…などなどあるわけですが、これは 多ければ多いほどたくさんの弾や敵を画面上に表示して動かすことができます。 あまり画面データばかり増やすと敵が少なくて寂しいゲームになる…と。で、これは実際にゲーム を作り始めて知ったことなのですが、敵や弾のデータを変数として扱うと、それだけでH8の RAMがいっぱいになってしまいます。レイヤーを扱う余裕が全くないわけですね。…という ことで、外部に記憶領域を増設することになります。

※しかし、私はハードを先に作り始めたので、「敵の座標を 扱う変数でRAMがあふれるぞ」…なんてことは知りませんでした。 ただ、画面データが大きいことと、”RAM増設”をやってみたかった…というそれだけのことで、 ゲームソフトの部分を作り始める前にRAMが増設された状態のハードを完成させていました。 このページでは天下り的に「後から必要になるから作りましょう」と言っておきます。 要は結果オーライということで…。


   

Vdd電源です。普通は+5V。
GNDグランド。電源のマイナス極。
D0〜D7データピンです。
A0〜A16アドレスピンです。メモリ空間は128KBあります。
/CE1チップ・イネーブルピンです。”0”でアクティブ。
CE2チップ・イネーブルピンです。”1”でアクティブ。今回は使用していません。
OEアウト・イネーブルピンです。”0”の期間だけ読み出しサイクル。
R/Wリード・ライト選択ピンです。”1”で読み出し、”0”で書き込みです。

今回使用したRAMは128KBのStatic-RAM、"TC551001"です。本当は128KBなんて大容量は必要 ないのですが、ずっと前に千石さんで衝動買いしていたものが残っていたので使うことに しました。別に他のSRAMでも普通に使えます。

RAMの書き込み・読み出しサイクル

今回使うRAMには8本のデータバス、17本のアドレスバスがあります。これらには 書き込むデータと書き込み先の番地を入力するとして、残りの制御信号線の処理に ついて考えてみます。制御信号はRAMにデータを書き込むのか、読み出すのかを 決定したり、そのタイミングを決めたりする役割があります。CE2ピンは使わないもの として、以下のようなタイミングで読み出し・書き込みを行っています。
なお、CE2は常に電源のプラス極側に接続して"1"の状態にしておきます。

  

この信号線3本分を制御するために、H8から適当に3本信号線を もってきます。書き込みダウンパルスは、普通にIOを操作して"0"と"1"を 切り替えるならばウェイトをはさむ必要はありません。

他の型番のRAMではアドレスピンの数が違ったりしますが、この制御信号のタイミングは 基本的にどれも同じなので、一度関数を組んだりすれば使い回しができます。 さらに、ROMでも同じ書き込み・読み出しサイクルを採用しているものがほとんどです。

H8のDMACを使わないの?

H8には内部モジュールとして、最初からDMAC(Direct Memory Access Controller)が 内蔵されています。これは、H8の内部設定レジスタを設定した上でH8の指定ピンに 外部メモリを接続することで、プログラム上では全く意識せずに変数領域として 外部メモリを使用できるというものです。これを利用すれば非常にラクをすることができます。
が、製作時はコレに関する知識が全くありませんでした。よって、すべてIOポートから手動で データアクセスするプログラムを書いた…というわけです。時間もかかるし、 ソースコードはかさばるし…と、とても頭悪いです。まぁ、いろいろ勉強になるということで。
RAM制御に関する部分のソースコードはRAM制御BIOSのページを見てください。




前へ   次へ