PIC

KM-Z80 mini version 0.182

2013年2月10日

最新のPIC32MX150F128Bの仕様では、Max Speed MHz が 50 になっている。以前は40 MHzであったので、KM-Z80 miniも40 MHzで動かしていた。

この1.25倍の速度の違いが、KM-Z80 miniの開発に於いては非常に大きい。と言うのはPIC32MXの実行速度が、MZ-80Kをエミュレートするのにぎりぎりであったからである。CPUのリソースのうち、4割ほどがビデオシグナルの作成に取られていたため、残りの6割しかZ80-CPUのエミュレーションに使えなかった。この状態で、速度調整のためのウェイトルーチンをいっさい入れなかった場合に、かろうじておおよそ2 MHzでZ80が動いていた。

PIC32MXが、今までの1.25倍の速度で動くと、Z80のエミュレーションは1.25倍どころか、もっと速くなる。と言うのは、ビデオシグナル作成も速くなるため、より多くの時間をZ80のエミュレーションに費やすことができるようになるからだ。50 MHzまで速度が上げられるということは、別の意味でも改善の機会を与えてくれる。ビデオシグナルの作成には、割り込みを使ったsyncシグナルの作成と、SPIを使ったvideoシグナルの作成の、2つが使われている。syncシグナルの作成には40 MHzのクロックを、videoシグナルの作成には8 MHzのクロックを用いていたため、これらのタイミングがうまく合わず、モニターに表示されるキャラクターが、波打つようにぶらついていた。syncシグナルの作成に48 MHzのクロックを用いることで、この辺りを改善できそうである。

そこで、PIC32MXの動作クロックを、40 MHzから48 MHzに上げることにした。このためというわけではないが、回路図に若干変更を加えているので、先に紹介しておきたい。

2013-02-10-v0182.png

前回とほとんど同じだが、10番ピンと水晶の間に100Ωの抵抗を入れたことと、テープレコーダとの接続を16番ピンに変えたところが変更点である。水晶周りは私自身もよく分かっていないので、皆さんの環境に合わせてよりよい方法を用いて頂きたい。今のところ、手元の環境ではこれで安定して動いている。

さて、40→48 MHzの速度変更で、Z80 CPUはおよそ3.4 MHzまでの速度が出せることが分かった。そこで、waitルーチンを挿入して、正確に2 MHzで動くようにコードを変更してある。

また、上述の通りNTSCビデオシグナル作成部分も改良が施され、表示のぶらつきが全くなくなった。これで、NTSC周りは完成と考えているので、技術的なところを説明しておきたい。

NTSCビデオシグナルの作成には、毎回ChaNさんの「RS-170A NTSCビデオ信号タイミング規格の概要」というページを参考にさせて頂いている。

第一のポイントは、水平同期周波数を何Hzに設定するかということ。カラーの規格では15734 Hzであるが、白黒の時代には15750 Hzが使われていたそうで、水平同期周波数は16 Hzぐらいの誤差は許容するようである。少なくとも、15734 Hzから15750 Hzの間に収まっていれば、すべてのTVは認識するはずだ。PIC32MXのクロックを48 MHzとしたので、クロック数で言えば、3047.62クロックから3050.72クロックの間に納めればよい。KM-Z80 miniでは、3048クロックとした。これは6で割り切れる数字であり、PIC32MXのクロック48 MHzと、ビデオシグナル用のクロック(後述)8 MHzを考えた場合に、整合性が取れる(8 MHzでは508クロックとなる)。さまざまな試行錯誤の結果、ここでクロック数の整合性が取れいてるかどうかが綺麗なビデオ表示に重要であることが分かった。ちなみに48 MHzで3048クロックとした場合、水平同期周波数は15748 Hzとなる。

同期信号の作成にはTimer2による割り込みを用い、割り込みがかかった時にRB13(24番ピン)への出力をトグルすることで行っている。同期信号の詳細についてはChaNさんのページが詳しいので、どの様な信号が必要かを知りたい方は、そちらを参照して頂きたい。KM-Z80 miniでは、配列に格納された割り込みのタイミングでトグル動作を行うことで、同期信号を作成している。

ビデオシグナルの作成には、SPIを用いた。52.7μ秒弱の間に、8ドットで40文字の合計320ドットを表示することになる。1ドット当たりおよそ0.165μ秒であり、これは6.1 MHzに相当する。左右にマージンが必要な事から、7-8 MHzぐらいの速度がちょうど良い。今回は、8 MHzの速度とした。PIC32MXに8 MHzの水晶を取り付けたので、同じ8 MHzとすることで綺麗な表示ができるはずである。

ビデオシグナル送出のタイミングは、同期シグナルの場合と同様、割り込みを用いた。Timer 4を用い、SPI2にシグナルを送出するタイミングを決めている。一回の割り込みで32ビットの信号を2回送っている。SPIの送出バッファは32ビットが2個なので、この方法だとバッファがいっぱいの時にシグナルを送ってしまいそうな気もするが、2回目の32ビット値を計算している間に前のシグナルの送出が一つ終わっているようなタイミングになるように割り込みを掛けることで、対処している。

前回作成したKM-Z80の場合、ビデオシグナルの作成にはプロセスをフリーランさせ、その他の処理(VRAMへの書き込み)に割り込みを用いていた。今回のものはその逆で、ビデオシグナルの作成に割り込みを用い、その他の処理(Z80のエミュレーション)にはプロセスをフリーランさせている。この方式を用いることで、できるだけ多くのリソースを、Z80のエミュレーションなどに割り当てられるようになった。また、最高レベルの優先度を持った割り込みを用いてビデオ信号を作成しているため、Z80 CPUがVRAMを読み書き書きする際に画面が乱れることもない。この点でも、前回のKM-Z80より良くなっている。

MZ-80Kの機能のうち、KM-Z80 miniにまだ実装されていないものは、カセットテープインターフェースに依るプログラムのLOADとSAVEである。今回の改良で、Z80が正確に2 MHzで動くことになったので、カセットテープインターフェース部分の実装は比較的すんなりいくかも知れない。

ver 0.182は、ここからダウンロードできます。ライセンスは、まだ、転載不可とします。
バージョン0.3は、こちら

コメント

コメントはありません

コメント送信