レトロでハードな物語

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

MSXでLチカ

2021年12月04日 | 電子工作

ここしばらくMSX1についてのテクニカル情報を調べていて、色々なことが分かってきました。BIOSやBASICコマンドのフックなど、システムを自分で拡張するのに便利な仕組みが沢山あっていじり甲斐のあるマシンですね。自作のデバイスをつないだら、BASICコマンドを拡張してコントロールするなんてことも出来そうです。

そこで自作デバイスを作るために、MSXの外部入出力を試してみたくなりました。現時点で接続に利用できるのは、先日ゲームパッドをつないだ汎用入出力インターフェースだけなんですけど。

MSXに搭載されているPSG(AY-3-8910)は汎用入出力ポートを2つ持っていて、ジョイスティックやマウス等はここにつなげます。それぞれのポートに入力専用端子が4ピン、入出力端子が2ピン、出力専用端子が1ピンあります。拡張スロットと比べると貧弱ですが、Arduinoなどのワンボードマイコンとつないで何かするにはこれでも十分でしょう。
ただし、BASICではこのポートを活用することができないので、アセンブラを使ったコーディングは必須です。

そこでまずはこのポートの出力テストとして、電子工作では基本のLチカを試してみることにしました。MSXに接続するためのコネクタは前回同様RS232Cケーブルから取り外したD-Sub9ピンを使います。

汎用入出力ポートについての詳しい情報はこちらにあります。今回のLチカではLEDを汎用入出力インタフェース2の8ピンに接続してみることにしました。GNDは9ピンで、抵抗は330Ωを使いました。



マシン語のソースはこちらです。お好きなアセンブラでご利用ください。

led.asm

実行は、

defusr=&HD000
A=usr(0)

です。使い慣れているモニタプログラムがあれば、そちらから実行してもいいでしょう。


AY-3-8910はMSXのI/OポートA0H~A2Hでコントロールします。それぞれのポートの役割は、

A0H アドレスラッチ
A1H データライト
A2H データリード

となっていて、A0HでPSG内部のレジスタを選択してA1H、A2Hでデータの読み書きを行います。

汎用入出力ポートのレジスタは0EH(Aポート)と0FH(Bポート)の2つあり、MSXではAポートは入力用にBポートは出力用に設定されています。(上記サイト参照)
今回のLチカの場合、A0HでBポートを選択してA1HからBポートの設定を読みだし、5ビット目(汎用入出力インタフェース2の8ピン)のビットを一定間隔でオン・オフ切り替えながらA2Hに出力しています。

ソースのなかで呼び出しているbreakxはCTRL+STOPが押されているかを調べるBIOSコールで、押されていたらプログラムを終了するようにしてあります。

プログラムを実行するとLEDが結構明るく点滅しました。



出力は確認できたので、次は入力も試します。入力はBIOSコールで簡単に行えるのですが、今回は勉強のためにBIOSを使わずにI/O操作で入力してみます。

配線は、汎用入出力インタフェース2の1ピンにタクトスイッチをつけてGNDの9番ピンとつなぎます。入力ピンは内部にプルアップ抵抗がついているので、タクトスイッチをそのまま直結しました。上記のLEDの配線もそのまま残しておいて、タクトスイッチを押したときに点灯するようにしました。

アセンブラソースはこちらです。

switch.asm

プログラムでは、Bポートの6ビット目をオンにしてAポートに汎用入出力インタフェース2の入力ポートを割り当てています。その後1ピンのオン・オフ状態を読み取ってLEDの点灯を切り替えています。



これでちゃんと入力できることも確認できました。ちなみに6ピンや7ピンでも同じように出力できることを確認しました。ただし、8ピンと比べると明るさも暗くBASIC画面のときはピンの出力がHIに設定されています。電子工作のときにトラブらないように、この辺は頭に入れておいたほうがよさそうです。



ここまで出来たので次は、Arduinoとの接続テストをしてみたいですね。うまく連携できればMSXに接続できるデバイスの幅が一気に広がりそうです。



最新の画像もっと見る

コメントを投稿