まず、WAIT の生成。
回路から読み取った、WAIT の発生条件は次の通り。
・M1ステートの読み出しは、全て1WAIT。
・A15 = L の時(つまりROM領域にアクセス時)、メモリのリード、ライト時に1WAIT。
・AY-3-8910(I/Oポートアドレス 0xA0〜0xAF)に対するリード、ライト時に1WAIT。
少ないので簡単だと思ったんですが...
使っている T80 のパルスが、Z80 と違うー。
ほとんど問題はないんですが、ライト時のWAIT の入れ方が異常!
MREQ/IORQ と WR が L になる前に、WAIT 信号を要求する仕様になっています。
このために、I/O を含むライト時に WAIT は入れられませんでした。WAIT を入れる必要があるデバイスかどうかは、アドレスで区別するのですが、メモリか I/O かの区別をするためのIORQ の前に WAIT を入れる必要があるので、どうしようもありません。
ライト時の WAIT が問題になりそうなのは、
・ROM 領域に書き込みを行った時、CPU の動きがちょっとだけ速くなる。
→多分問題にならない(というかROM領域に書き込みしない)
・AY-3-8910 に書き込みを行った時、CPU の動きがちょっとだけ速くなる。
→あまり問題にならない(速度に多少影響をするかも、程度)
なので、WAIT 発生条件を以下のようにして実装することにしました。
・M1ステートの読み出しは、全て1WAIT。
・A15 = L の時(つまりROM領域にアクセス時)、メモリのリード時に1WAIT。
・AY-3-8910(I/Oポートアドレス 0xA0〜0xAF)に対するリード時に1WAIT。
・ライト時は、全てWAITなし。
ついでに、2ms タイマと割り込みの優先回路も実装しました。
ただ、8255 と 8049 を実装しないと、全然動かないんですけどね。