ペリフェラルの8255 とサブCPU の8049 に取り掛かりました。
8255 は単純かと思ったら、MODE2 を使っていたので、結構面倒です。
PC-6001では、グループA(PA7-0、PC7-3)は、MODE2 で使用。グループB(PB7-0、PC2-0)は、MODE0 で使用しています。
8255 は他にMODE1 というモードもあるのですが、使わない(というか周りのハードの状況で使えない)ため実装はせずに、PC-6001 に特化したモードにします。
よって、モード変更のコマンドは無視します。
MODE0 の実装は簡単なので、特に問題はありませんでした。
MODE2 の方は、8049 とのやり取りをするため、かなりややこしいです。
以下に動作をまとめます。
・Z80 => 8255 => 8049 にデータを出力する時
1)Z80 から、I/O アドレス 0x90 にデータを書き込む。8255 は書き込まれた値をラッチして、ポートAに出力する。
2)8255 のOBFN が H → L になる。この信号は、8049 のINTN(割り込み入力)につながっている。
3)8049 は割り込みを受けて、OBFN が L になった事を知る。
4)8049 は、8049 の RDN を H → L → H とする。同時に、8255 のポートAから出力されている信号を読み込む。
5)8049 の RDN は、8255 の ACKN とつながっている。ACKN が L になった事により、OBFN が L → H となる。
6)読み出し完了。
P60-BASIC の ROM ルーチンでは、この一連の処理の前に、以前の読み出しが完了しているかのチェックも行っています。
・8049 => 8255 => Z80 にデータを出力する時
1)8049 は、8049 の T0(8255 の IBF)が L になっていて、書き込みが出来ることを確認する。
2)8049 は、8049 の WRN(8255 のSTBN)を H → L → H とする。この時、ポートAに対して、書き込むデータを出力する。
3)8255 は、STBN が L の時の値をポートAにラッチする。また、IBF を H にして、データが書き込まれた事を示す。
4)Z80 は、IBF が H の時に、I/O アドレス 0x90 (ポートA)からデータを読み出す。
5)8255 は、IBF を L にして、データが読み込まれた事を示す。
6)読み出し完了。
P60-BASIC の ROM ルーチンでは、この一連の処理の前に、以前の書き込みが完了しているかのチェックも行っています。
ちなみに割り込みの後では、8255 の CSN、A(1:0) をすべてLにして、M1N = L、IORQN = L の時に、RDN = L となるようにして、データの読み出し(割り込みベクタの下位8ビット)を読み出しています。
2011年10月12日
この記事へのコメント
コメントを書く

