|
長年、MSXと「通信」に特に興味を持って過ごしてまいりました。ず〜っと以前には、Arduinoとの間で「PDL通信」てなものも考えましたっけ。MSXのPDL関数は、入力されたパルスの長さを0〜255の256段階に認識するのであります。
タイトーのゲーム「アルカノイド」シリーズは自前のルーチンを用意しBIOSに頼らなかったので、PDL関数が削除されたturboRでも遊べました。しかし、PDL関数を使って「スカッシュ」などのゲームを作っていたアマチュアは、turboRの仕打ちによって自作ハードウエアとともに奈落の底に落ちたのであります。
もちろん、Arduinoとの「PDL通信」もおじゃんとなりました。Arduino側でのPWMの調整も微妙過ぎたという反省もあって、実は自分でもあまり使う気にならなかったのでありました(爆)
捲土重来、起死回生。
いつものようにJポート(「ジョイスティックポート」あるいは「汎用入出力ポート」を慣用的にぼくは「Jポート」と呼んでいます)を眺めていて、ふと思いつきました。
「これってArduino→MSXの通信に使えるんじゃないの?」
何を今さらとお思いでしょうが、お聞きください。
ついついピン1〜4の4ビットで信号入力と思いがちでしたが、そのためにはマシン語の助けを借りないといけません。BASICのSTICK関数を使えば「0〜8」をMSXは受け取ることができるのです。同じ機能のBIOSも用意されています。
↓STICK関数で受け取れる数字。
これを通信に応用するとすれば、Arduinoのデジタル出力を4ピンを使って、アイドリング時は「1111」を出力します。MSXにとっては「0」です。「1110」を出力するとMSXにとっては「1(Up)」です。というわけで、「0〜8」の9通りの信号をMSXに渡すとすれば、別途CLKも要りません。一例として次のような手順が考えられるでしょう。
(1) 「0」が続く間、MSXは受信データ待ち。
(2) 「0」以外が来たとき、MSXはデータとして受け取る。(受信スタート)
(3) データとデータの間には「0」を挟む。
(4) 例えば30秒間「0」が続いたら通信終了とみなす。
通信終了の方法はケース・バイ・ケースで考える必要があります。
1000 DEFINT A-Z:DIM A(200):N=0
1010 ON INTERVAL>1800 GOSUB 2000
1020 INTERVAL ON
1030 D=STICK(2):IF D=0 THEN 1030 'JPort-B
1040 INTERVAL OFF
1050 A(N)=D-1:N=N+1:IF N=200 GOSUB 2000
1060 TIME=0:GOTO 1020
1070 '
2000 INTERVAL OFF:RETURN 2010
2010 END
Arduinoが今ちょっとアレなので、まだ実際には動かしていませんが、こんな感じで配列Aに200個のデータが格納できるのではないでしょうか?200個未満で通信終了したときは、Nに受信数+1が入っているで正しいかな?(・∀・)?
【追記】このままではオクタルなので使いにくいですね。16進数が使えるように、もう一工夫要るようです。
Arduino側で、まず8で割った整数除算の商を、次に剰余を送信して、MSX側でふたつのデータから16進数に組み立て直すとか?
何とかしてくださいw
|
過去の投稿日別表示
-
詳細
2015年02月11日
全1ページ
[1]
コメント(2)
全1ページ
[1]




