レトロでハードな物語

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

MSXとArduinoを接続する

2021年12月13日 | 電子工作

前回、MSXの汎用入出力インターフェースでLチカが行えたので、今度はArduinoをつないで通信できるかどうか試してみようと思います。使用するArduinoはPro Mini(互換機)です。

まずは、MSXからPro Miniへ信号が送れるかどうかテストしてみます。
MSXの汎用入出力インターフェース2の6ピンを出力側に、Pro Miniの2ピンを入力側にして接続し、MSXのピンがHIGHになったらPro MiniのLEDを点灯、MSXのピンがLOWになったらLEDを消灯してみます。

MSX側のプログラムは前回のLチカとほぼ一緒です。一定間隔で6ピンのオン・オフを切り替えます。

msxout.asm

Pro Miniのスケッチは2ピンのオン・オフを読み取ってLEDを点灯させるだけの簡単なものです。

ProMiniMSXin.ino

MSXの6ピンとPro Miniの2ピンを接続してから、MSXの汎用入出力インターフェース2の5ピン(+5V)と9ピン(GND)をPro MiniのVCCとGNDにつなぐと、Pro MiniのLEDが点滅し始めました。



次はPro MiniからMSXへ信号を送ります。Pro Miniの3ピンを出力に、MSXの汎用入出力インターフェース2の1ピンを入力にしてPro MiniのピンがLOWになったらMSXの「かな」入力のランプを点灯し、Pro MiniのピンがHIGHになったらMSXのランプを消灯します。MSXの汎用入力は内部でプルアップされていて、デフォルトでHIGHになっているのでこのような動作にしてみました。

MSXのプログラムは汎用入出力インターフェースのBポートの6ビット目をオンにしてAポートに汎用入出力インタフェース2の入力ポートを割り当ててから(詳しくはこちら)、入力ポートの1ピンがLOWなら「かな」ランプをオン(ポートBの7ビット)にHIGHならオフにします。

msxin.asm

Pro MiniのスケッチはおなじみのBlinkとまったく一緒です。

ProMiniMSXout.ino

MSXとPro Miniを配線すると、ちゃんと「かな」ランプが点滅しました。



このテストでMSXとArduinoの接続は問題ないことが分かったので、今度はちゃんとしたデータ送信を行ってみます。

Pro Miniの動作クロックは16MHzでMSXの動作クロックの3.579545MHzより十分速いので、MSXから送られてくるデータをPro Miniで受信するのは問題ないでしょう。そこで、Pro MiniからMSXへデータを送信すると、どのくらいのレスポンスになるのか見てみることにしました。

データを送信する線は2本とし、1本はクロックでもう1本をデータ送信に使います。MSXの入力ピンは1、2ピンでPro Miniの出力ピンは4、5ピンにしました。クロック用の線はMSXの2ピンとPro Miniの4ピンをつなぎ、データ送信には1ピンと5ピンをつなぎました。

Pro Miniからは1文字8ビットで10文字ほどの文字列を送り、文字列を送り終わったらウエイトを入れて再度同じ文字列を送るという動作を繰り返します。
MSXは8ビットのデータを受け取る度にその文字を画面に表示して、つぎの文字を受け取るという動作を繰り返します。文字列表示後にはキー入力チェックを行い、CTRL+STOPが押されていたらプログラムを中断するようにしました。

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

avrin.asm

Pro Miniのスケッチはこちらになります。

ProMiniMSXsend.ino

データ送信クロックのタイミング調整がちょっと面倒でしたが、最終的にはちゃんと動作しました。



スケッチではデータ送信クロックのウエイトが2msになっていますが、これは画面表示とキー入力チェックにMSXのBIOSをコールしたためのオーバヘッドによるところが大きいと思います。BIOSコールを除いた部分の処理だとクロック立下り(もしくは立ち上がり)後に必要なウエイトは条件分岐によって変動しますが最大27μSほどなので、文字列を画面に表示せずバッファに入力するような処理にすればレスポンスはかなり上がるはずです。

※処理時間はZ80の1命令ごとのステート数+1(MSXのWAIT)を全部足した総ステート数に0.279μs(3.579545MHz)を掛けて算出

また、今回のプログラムはPro Mini接続時に発生するノイズ等は考慮していないので、MSXが受信する最初の1ビットが正しく受け取れずデータ化けが発生していました。(MSX側のプログラムをいったん中断して再実行すると正しく受信しました)

とにかくこれでMSXとArduinoを接続してデータを送れることが分かりました。今後はMSXで色々楽しめそうです。
今のところMSXのプログラムは2400ボーのカセットインターフェースで読み込むしかないので、この辺りをArduinoで何とかできないかと思案しているところです。



最新の画像もっと見る

コメントを投稿