CPU実験室

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

内蔵RAM

久しぶりにuPD78C10ボードをいじっていたら妙なことに気付きました。uPD78C100xFF00-0xFFFFに256byteのRAMを内蔵していますが、このボードではさらに0x2000-0x3FFFへ8kbyteのSRAMを外付けしています。ワークエリア、スタックは内蔵RAM領域にアサインして外付けRAMはプログラム領域として丸々使えるようにしたつもりなのですが、外付けRAMの底:0x3F00-に内蔵RAM:0xFF00-と同じデータが読みだされているようです。

f:id:O3I:20211103094304j:plain

 

このボードのメモリマップは以下のようになっています。ハード的なメモリコンフィグレーションはMODE0=1.MODE1=0としていて外部メモリサイズ16kbyteとしていますがこれはアクセス領域を制限するものではなく、拡張アドレスバスに使用しなかった余りピンを汎用ポートにするための設定であるようで、実際にはメモリ領域全体に外付けROMとRAMのイメージが発生してしまっています。

f:id:O3I:20211103130932j:plain

すると0xE000-0xFFFFに現れる外付けRAMのイメージの後半と内蔵RAMのアドレスがオーバーラップしてしまっています。その場合どちらのメモリがアクセスされるか?は悩むところですがマニュアルを改めてみるとMM(Memory Mapping)レジスタで明示的に内蔵RAMの有効/禁止を設定するようです。

f:id:O3I:20211103100731j:plain

いままでこのレジスタをセットしていなかったのでデフォルトで00H:すなわち内蔵RAMが禁止されて外付けRAMのイメージが使われてた、ということのようです。PUSH/POPやCALL/RETのようなスタック操作も見た目の動きには全く問題がないので気付きませんでした。下位3ビットはROM有りデバイスで外部メモリのサイズを設定するようですが、ROM無しの78C10では"000"で良いとあります。

f:id:O3I:20211103100702j:plain

 

ROM上のモニタプログラム内でMMレジスタ08Hで初期化を追加。ダンプしてみると内蔵RAM」0xFF00-と外付けRAM:0x3F00-で違うデータが読みだされてきたのでこれで期待する動きになりました

f:id:O3I:20211103101352j:plain