CPU実験室

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

I/Oアクセス

プログラムが動いているのを外から見えるようにするにはパラレル接続したLEDをチカチカさせれば簡単です。

I/Oは根本的な設計ミスからプログラムメモリ空間の下位8ビットに接続されていて、データ空間からは厳密なハーバードアーキテクチャではアクセスできないはずですが、このデバイスではPM()=dreg, dreg=PM()というように読み書き出来ることはわかりました。

 

マニュアルでここらへんのデータ受け渡し方法を見ていたのですが

f:id:O3I:20210617095450j:plain

「プログラムメモリデータ(PMD)バスは24ビット幅であるのに対し、データメモリデータ(DMD)バスは16ビット幅であるため、PMDの上位16ビットのみを直接転送できる。」・・・

ここまで読んで息が止まりました。たしかにプログラムの更新はブートローダからで良いし、固定テーブル参照する場合も左詰めで埋め込めば良いわけで何もプログラム空間の下位8ビットが読み書きできる必要はありません。

 

このプロジェクト死亡フラグ=ON確定か・・と諦めかけましたがちょっと続きを読んでみると、なんとPXなる内部レジスタがあって、余剰ビットはここに入るとあります。

f:id:O3I:20210617095509j:plain

 

つまりプログラムメモリからデータメモリに読む場合には上位16ビットは転送先のデータメモリに入り、下位8ビットはPXレジスタに入る、データメモリからプログラムメモリに書く場合には、あらかじめPXレジスタに下位8ビットを入れておけば転送元のデータメモリ16ビットと合成されてプログラムメモリに書かれるようです。

f:id:O3I:20210617095524j:plain

これであればPXレジスタを介してI/Oアクセスは行けそうです。その時のデータメモリの内容はダミーでよいことになります。