GAL内に用意したモード切替レジスタとSRAMへのアクセス方法を整理すると以下のようになります。
MODE(/DLL)信号を0(赤LEDが点灯)状態ではプログラム空間に置かれたRAM0へCPUの/WR信号が入力されるのでシリアルラインからプログラムのダウンロードができます。その後MODE(/DLL)信号を1(赤LEDが消灯)にするとRAM0はプログラムROM相当になりRAM1がR/W可能なデータメモリになります。
そのためMODE=0にするのはモニタ内のプログラムダウンロード処理の間だけでいいのでルーチンの前後にMODEレジスタを叩くルーチンを挿入しモニタROMを焼き直しました。
こうすることで内部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を切り替えればアセンブラレベルでは可能です。
PPI8255も問題なく動作しました。ただし電源ONリセット時から十分時間が経ってからユーザプログラムを起動しているのでリセットIC:TL7705の効果はわかりません。