CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

メモリ制御(2)

どこに問題があるかというとメモリの読出し時の/OE(アウトプットイネーブル)信号の処理でしくっていました

まず最初、ROMソケットに中身が適当なEPROMを差し込んでアクセスの具合を見てみました。
クロックは発振していてALE(アドレスラッチイネーブル)も連続的に出力されるので、読み出されるバイナリコードが何であろうと暴走しようとROMからのフェッチはされると思ったのですがROMの/OEピンが全くアサートされません
 
今になってデータシートを読み返してみるとプログラムメモリの読み出し方法を完全に勘違いしてます
 
イメージ 2
プログラムメモリは/PSENのみで読み出され、そのとき/RDはアサートされないようです
(/RDがアサートされるのはデータメモリ読み出しの時のみ)
PSENの名称も「Program Space enable」じゃなくて「Program Strobe Enable」ってことでした。
つまりプログラムコードをROMから読み出すのに/PSEN、データをRAMから読み出すのに/RDと使い分けることでメモリへのアドレスデコードが不要になるってことです。

確かに考えてみれば8031のようなマイクロコントローラでは外付けの部品を少しでも減らしたいわけだし8051のようなROM内蔵品、RAMもオンチップで間に合えば外付けメモリすら本来は不要です。

ともかく今回はROMの/OEにCPUシステムバスの/RDを直結してしまったので、これはGALでもどうしようもなくハード的にパタンカット、ジャンパしなければなりません。

一方、RAMの方も同様に/OEに直接/RDをつなげています。
これはRAMをデータ空間としてのみ使うのならばいいのですが、RAM領域にプログラムを転送して実行したいときはRAM領域もプログラムコード空間から見えなければなりません。
ということで結局/PSENと/RDの論理和をとった/MEMRDという信号をGALの空き端子に出力し、これをROMとRAMの/OEに与えることにします
 
イメージ 3

せっかくプログラムとデータ空間が分離してたのに一体化しちゃった感じです。
 
さらにI/O空間という概念は元々なく外付けI/Oはメモリマップドになりますが
32kBのROMと32kBのRAMをそのまま割付けてしまうともう空きがありません。とりあえず動作を見るだけなのでRAMの領域を半分を潰してそこに8255PPIをアサインしておきました
 
現時点でのメモリマップはこうなります
 
 
イメージ 1