メモリまわり下調べ

f:id:marlesan:20161002023911j:plain:w250
Z80写真再掲。
これは純粋にCPUというだけのICで、メモリもありません。メモリがなければプログラムもありません(ストアドプログラム方式ってヤツだ!)。というわけで、まずはメモリについて学ばなければいけません。

「メモリ」というだけだと相当に意味の広い言葉ですが、ここでは「コンピュータ基板に直接乗せるICとしてのメモリ≒CPUがアドレス指定で直接アクセスできるメモリ」という文脈で使います。すると、メモリはROMとRAMの2種類に大別でき、以下のように使い分けるようです。

  • ROM (Read Only Memory)
    • 電源を切っても内容が保存される(不揮発性)
    • 内容の書き換えに制限あり(回数・方法など)
  • RAM (Random Access Memory)
    • 電源を切ると内容が消える(揮発性)
    • 読み書きが自由自在
    • ROMもランダム(任意位置)アクセス可能なので、慣習的な呼称

典型的にはプログラムをROMに置いて、プログラムが利用する一時的なデータをRAMで読み書きします。ここで唐突にスーパーファミコンのカートリッジを開けてみると、ROMとRAMが載った基板が出てきます。ROMには今言ったようにゲームのプログラムが書き込まれていますが、RAMは一時データの読み書き用ではなく(そのためのRAMは本体側にある)セーブデータの保存用です。RAMにバックアップ用電池を繋げることで不揮発性と自由な読み書きをなんとか両立させているのですね。

f:id:marlesan:20161003020555j:plain:w300
ドラクエ5の中身)

さて、このRAM、スーファミカセットの部品としてはセーブデータのバックアップ用ですが、RAMはRAMなのでひっぺがせばZ80のメインメモリとしても普通に使えるはず。何事も手を動かすのが大切ということで、早速弄ってみましょう。

f:id:marlesan:20161003223721j:plain:w300

特殊ドライバーでガワを開け、半田こてと半田吸い取り線で外し、HY6264A という8kBytesのSRAMを入手。新単語ですね。SRAMDRAMの違いについてまとめておきます。

  • DRAM(Dynamic RAM)
    • メモリセル(1bitの記憶回路)が1個ずつのFETとコンデンサで構成される
    • メモリセルの構造が単純なので面積あたりの容量を稼げる
    • コンデンサに貯まった電荷で0/1を区別するが、そのままだと放電してデータが消えるため絶えず「リフレッシュ」という動作が必要(Z80にはこのための回路が内蔵されている)
  • SRAM(Static RAM)
    • メモリセルがフリップフロップで構成される
    • DRAMに比べメモリセルの構造が複雑で、集積度が低い
    • その代わりリフレッシュのような面倒な手間がかからない

勉強のために是非めんどくさそうなDRAMを使ってみたいのですが、今回の用途に丁度いいもの(DIPで~64kB)は入手困難なよう。SRAMは普通に買えます。そして実は、ハードオフでジャンクカートリッジを買ってきて分解するより普通に買った方が安いです(例えばこれは32kBで@294)。

閑話休題
ひっぺがしたRAMに対してデータの読み書きをしてみます。基本は以下の2点。

  • 書き込み
    • アドレスバスに書き込み先アドレスを、データバスに書き込むデータを乗せてWE(Write Enable)信号をアクティブにする
  • 読み込み
    • アドレスバスに読み込み元アドレスを乗せ、データバスを読み込んだデータの出力先に接続してOE(Output Enable)信号をアクティブにする

実際にコンピュータシステムの一部として使う場合は上記操作のタイミングが超!重要になるようですが、手でぽちぽち実験するなら次のような適当な回路で動作しました。

f:id:marlesan:20161004002757j:plain:w400

データバスの取り扱いだけ要注意。データ入力の信号をバスに直結させると、読み込み時にRAMから出てきたデータとスイッチからの入力データが衝突してしまうため、間に74HC540を入れてます。このICはバッファ(ある出力信号が駆動できるIC数=ファンアウト数を増やすために通す)ですが、入力ピンのG1かG2をアクティブにすると出力がハイインピーダンス(Hi-Z)になる機能もついてます。Hi-Zは「すごく抵抗高い」状態なので回路的には開放しているのと同じです。スマートとはいい難いですが、G1の入力をスイッチで切り替えられるようにし、WEを押すときは信号を通し、OEを押すときはHi-Zにして入力信号をバスから切り離し衝突を回避しています。ちなみにこの74HC540はTD4の部品のひとつで、製作当時は間違ってHi-Zにしてしまう配線ミスをして「ていうか3ステート(出力がH/L/Hi-Zの3状態ある)って何に使うの…」とか思ってました。こういうときに使うんです。

写真では入力をデータバスまで通しているので、この状態で青ボタンを押すと現在設定中のアドレス(上位5bitはGNDに落としているので 0b0000011111111)にデータ 0b10010101 を書き込みます。逆にRAM内のデータを読み込むには、540をHi-Z状態にし、読み込みたいアドレスを設定して赤ボタンを押します。このRAMはWEもOEも非アクティブだとデータピンはHi-Zになるため、赤ボタンを押している間だけ指定アドレスのデータ信号でLEDが光ります。ぱちぱち。

もうSRAMは極めたね。

いや、実はチップセレクト信号という超重要な項目が残ってました。が、今回はもう長く書きすぎたのでまたの機会に……。