CPU実験室

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

モード切替

GAL内に用意したモード切替レジスタSRAMへのアクセス方法を整理すると以下のようになります。

f:id:O3I:20200307084434j:plain

MODE(/DLL)信号を0(赤LEDが点灯)状態ではプログラム空間に置かれたRAM0へCPUの/WR信号が入力されるのでシリアルラインからプログラムのダウンロードができます。その後MODE(/DLL)信号を1(赤LEDが消灯)にするとRAM0はプログラムROM相当になりRAM1がR/W可能なデータメモリになります。

そのためMODE=0にするのはモニタ内のプログラムダウンロード処理の間だけでいいのでルーチンの前後にMODEレジスタを叩くルーチンを挿入しモニタROMを焼き直しました。

 

f:id:O3I:20200307084506j:plain

こうすることで内部RAMを利用するスモールモデルも従来通り動作できますし、外部メモリをデータメモリとして使用するラージモデルでもプログラムもデータもそれぞれ32kbyteという広大?な空間を干渉を気にすることなく利用できます。8031のアーキテクチャを無駄にしていないということになります。

 

コンパイル時のコマンドラインではプログラムもデータも同じ0x8000番地から配置されるように指定します。

sdcc -V -mmcs51 --model-large --code-loc 0x8000 --xram-loc 0x8000 -I"C:\Program Files\SDCC\include" -L"C:\Program Files\SDCC\lib" temp.c

 

この方法のもう一つのメリットは万一プログラムが暴走してもコード領域はプロテクトされていて破壊されることがないということです。またどうしても自己書換えプログラムを動かしたいなら一時的にMODEを切り替えればアセンブラレベルでは可能です。

 

f:id:O3I:20200307084523j:plain

 

PPI8255も問題なく動作しました。ただし電源ONリセット時から十分時間が経ってからユーザプログラムを起動しているのでリセットIC:TL7705の効果はわかりません。