レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

MSX3発売まだ?

2022年05月16日 | 電子工作

ずいぶん前からMSX3が開発中だという話はありましたが、ついに今年になって画像が公開され発売が近づいてきた感じです。
MSX3には3タイプあるようで、その中のMSX3 IOTというタイプはMSX1やMSX2のスロットに差し込んでMSX3にする物だそうです。これまでMSX1をベースに電子工作を楽しもうと思っていたのですが、MSX1をMSX3にできるならそちらで楽しみたいところです。

そこでMSX1はしばらく放置して、CDドライブが動かなくなって使わなくなったFM-TOWNSの修理など古いパソコンのメンテナンスを行いながらMSX3の発売を待っていましたが、現在までなんの発表もありません。ソフト面の開発でまだまだ時間がかかるのでしょうか?
いつまで待つことになるのか分からないので、MSX1の電子工作を再開することにしました。

とりあえず前回までにMSXの汎用入出力インターフェイス(ジョイスティック端子)にArduinoをつないでデータの送受信テストを行いましたので、今回はもう少し実用的な入出力ルーチンをつくってみようと思います。
方針として、汎用入出力インターフェイスが入力4ピン、出力1ピン、入出力2ピンとなっていますので、MSXからのデータ送信に2ピンを受信に4ピンを使ってみることにします。
MSXとの接続にはArduinoではなく3.3V、8MHz動作のATMega328Pを使うことにします。これは今後SDカード(3.3V動作)を読み書きできるようにしたいと思っているからです。

配線は以下のようにしました。



ATMega328Pのピンの( )内の数字はArduino IDEでのピン番号です。

ATMega328Pの16(10)〜19(13)ピンはSDカードの読み書きに必要なので空けておきました。さらに、デバッグのために27(18)と28(19)にはI2C接続のOLEDディスプレイをつなぎました。それと3.3Vで動作させるためにMSXからの5V出力を3端子レギュレータで3.3Vに落としています。



次はプログラムです。
まずはMSXの2ピンを使ったデータ出力プログラムを作ってみます。MSXは6〜8までのピンを出力に使えますが、8ピンは送信用のクロック出力にして6、7ピンをデータ出力に利用することにしました。

作成したMSXのプログラムはこちらになります。Z80のアセンブラソースですので、お好きなアセンブラでご利用ください。

data_out.asm

AVRのスケッチはこちらです。使用したArduino IDEのバージョンは1.8.19で"ボード:"は"Arduino Pro or Pro Mini"、"プロセッサ:"は"ATmega328P (3.3V,8MHz)"としました。

ATmega328MSXread.ino

デバッグ用につないだOLEDディスプレイはArduinoでおなじみのSSD1306です。表示にはSSD1306Asciiライブラリを使わせてもらいました。

MSXのプログラムを実行するとMSXからATMega328Pへ改行コード含め18文字のデータが送られます。
上記のMSXのアセンブラソースでは実行アドレスをD000としているので、MSXで実行するときはコマンドラインからDEFUSR=&HD000:A=USE(0)と入力します。それとCLEAR 200,&HCFFFでマシン語領域を確保しておいた方が安全でしょう。



続いてMSXが4ピンを使ってデータ受信するプログラムです。入力には6ピンを使うことができますが、8ビットデータを受信するには6ビット+2ビットで扱うよりは、4ビット+4ビットの方が感覚的に扱いやすいので1〜4の4つのピンを入力に使うことにしました。4ピンにするもう一つの理由として、クロックの受信にもう1ピン必要な点もあります。

理想はMSX側が8ピンでクロックを送り、それに合わせてAVRがデータを送信してくるという形にしたいのですが、MSXの汎用入出力インターフェイス(AY-3-8910)では、汎用入力をポートAに出力をポートBと分けて設定してあり、使用するときはこれらのポートをZ80のI/Oアドレスに割り当てる必要があります。したがってデータを入力するときはポートAを割り当て、出力したいときはポートB割り当てなおすという煩雑な処理が必要になるのです。

したがってMSXでデータ入力が必要なときは、クロックを送信するのではなく受信する方がポート割り当て(PSGのアドレスラッチ)の処理がなくなり、プログラムがシンプルになります。

具体的には、まずMSXで出力ポートBをラッチして8ピン経由でAVRにデータ送信要求の信号を送ったら、こんどは入力ポートAをラッチした状態のままにしておき、6ピンに送られてくる信号をクロックとしながら1〜4ピンでデータを受け取るという処理にします。

この処理のMSXプログラムはこちらです。

data_in.asm

AVRのスケッチはこちらです。コンパイルの条件は上記と同じです。

ATmega328MSXwrite.ino

実行するとATMega328PからMSXへ改行コード含め11文字のデータが送られます。



これで、MSXの汎用入出力インターフェイスのデータ送受信ルーチンが完成しました。今度はこれらを一つにまとめてSDカードの読み書きを行ってみたいところですが、それはまた後ほど試してみます。



最新の画像もっと見る

コメントを投稿