MORIYAさんの所にも情報がありますが、再調査してまとめてみました。
1.データのやりとりの方法について
66SRとキーボードは離れているため、キーボードの情報を赤外線通信、もしくは有線通信でデータを送信しています。キーボードから66SRへ、一方的にデータを送信しています。
赤外線通信か、有線通信のどちらかしか行われていませんが、その選択方法は以下の通りです。
・66SR本体とキーボードが、付属のケーブルで接続されていたら、有線通信
・それ以外は、赤外線通信
実際の回路での電気的な選択方法は次の通りです。
(回路図を修正しました)
ケーブルで66SR本体とキーボードが接続された時、キーボード側の
また、66SR側の
実際の送信データは、
2.データのフォーマットについて
赤外線通信も有線通信も、論理的に同じフォーマットを使って送信されています。
ただし、実際の物理的なフォーマットは違います(後述します)。
1回のデータ送信は、3ビットの制御データ(CT[2:0])+8ビットのキーデータ(DT[7:0])の11ビットのデータを送信します。
論理フォーマットは以下の通りです。(LSB先送りに注意)
キーを一度押すと、押したキーのコード(制御データ+キーデータ)が送信されます。押しっぱなしにすると、そのキーコードが連続して送信されます。キーボード側でオートリピートが実現されています。
キーを離した時には、キーコードが送信されません。
キーコード一覧です。
前の3桁の数字は3ビットの制御コード(CT[2:0])、後ろの2桁の数字がキーデータ(DT[7:0]・HEX表記)です。その後ろにキーデータを文字に変換しています。
例えば、000:30(0) の場合は、制御コードが0b000で、キーデータが0x30、アスキーコードが"0"になります。
「なし」は、他のキーを押していない場合に送信されるデータです。
「SHIFT」は、SHIFTキーを押しながら、キーを押した時に送信されるデータです。「CTRL」「GRAPH」も同様です。
「TV」は、キーボード上部の「PC/テレビ」のボタンを押し込んでから、キーを押した時に送信されるデータです。空欄があるのは、それ以外のキーはデータが送信されないためです。
キーに「SHIFT」「CTRL」「GRAPH」がありませんが、このキーは単体ではデータを送信しないためです。
「CAPS」「かな」キーを押した状態でも、送信されるキーコードは変わりません。ひらがな/カタカナの変換は本体側のサブCPUが行っているようです。
また、キーコードとは別に、ゲームキー用のデータが送信されます。
ゲームキーとは、STOP、SPACE、SHIFT、カーソル上下左右の7つのキーの事です。
これらのキーは、他のキーとは違い、押している状態か、離している状態かが分かります。他のキーは、押された事しか分かりません。
ゲームキー用の送信データは次の通りです。
制御コード(CT[2:0]) = 0b010
キーデータ(DT[7:0]) = 押されているキーの情報
キーデータのそれぞれのビットは以下の通りです。
DT[7]:SPACE
DT[6]:"0"固定
DT[5]:←
DT[4]:→
DT[3]:↓
DT[2]:↑
DT[1]:STOP
DT[0]:SHIFT
押されているキー"1"、押されていないキー"0"に出力され、複数のゲームキーが押された時は、その分のビットが"1"になります。全部のゲームキーが押された場合、0xBFになります。
内部処理は、ゲームキー用の監視をポーリングで監視しているようです。一定間隔でゲームキーが押されている/押されていないの状態を調べているようです。
その際に、以前の状態と違う場合に、ゲームキー用の送信データとして送信します。通常は、ゲームキーが押された時、もしくは離された時に送信されます。
ゲームキー用の送信は、上記の通常のキーコードとは独立して行われます。そのため、STOP、SPACE、カーソルキーが押された時は、ゲームキー用の送信、キーコードの送信の両方が送信されます。
例えば、何も押されていない時に、SPACEキーを押した場合は、
0b010:0x80 (ゲームキー用の送信)
0b000:0x20 (キーコードの送信)
の2つのデータが送信されます。
また、通常はゲームキー用の送信が先のようですが、逆になることもあります。
次に続きます。
その動画がコチラです。
https://youtu.be/UO2k_8vTPTo
MSX用のプログラムを書くにあたり、貴殿の解析情報を大いに活用させていただきました。ありがとうございました。ところで、解析情報のGRAPH+左/下のデータですが、特殊コード010:20, 010:08 はゲーム用の出力データを観測されたものと思います。自作の変換プログラムではGRAPH+上/右同様に001:00としました。
これを機にP6も少し弄ってみようかなと思っています。
ご指摘の通り、GRAPH+←、↓は、001:00 を出力するのが自然ですね。そのうち修正しておきます。
取扱説明書を書いてみました。
http://niga2.sytes.net/upfile/p6key.pdf
MSXが、P6のスレーブ(奴隷)になるのが、世の中のP6erに受けるかも(^^;)
キーマトリックスの関係から、カーソルキーの同時押しが検出できるので、MSXを使うのはベターな解ですね。
普通のキーボードだと、どうしてもカーソルキーの同時押しの検出不能問題が出てくるんですよねぇ。
実はファミベーキーボード用の送信機も作りました。ゲームキー同時入力含めて全キー押下できますが、MSXと違って任意のキーの状態を任意のタイミングで取得できないため、ややレスポンスは遅いです。需要がニッチすぎるのとガワ加工も面倒なので製品化の予定はありません。
http://niga2.sytes.net/upfile/FB66SRKEY.jpg
有線接続アダプタならアリかなと思ったのですが、66SRのコネクタに普通のモジュラー4pが刺さらないため断念しました。あれって専用品なのでしょうか。
電話機の、受話器と本体をつないでいるコードに使われています。
電話機の回線側のモジュラジャックより、ひとまわり小さいサイズです。
ファミベのキーボードを使う案はいいですね。私も作ってみようかな...
ところが4pのモジュラーが刺さらないのです。手持ちのモジュラープラグが変なのかも知れませんが、普通にどこかのパーツ屋さんから買ったものだったような気がします。
本体を改造してジャックを取り替えれば接続できますが、それだと同人ハードとして成り立たなくなり、作る意味がないかなと思っています。
モジュラジャック
→アマゾンで「モジュラージャック 4P4C」で検索。
接続用コード
→アマゾンで「受話器コード」で検索。
コードに関しては、ホームセンターなどでも入手可能だと思います(私はコーナンで買いました)。
有線で繋がりそうなので、試作してみることにします。赤外線バージョンは概ねできているのでタイミングを少し弄るだけですね。
えすびさんお作りになるのでしたらプログラム提供いたしますが、PIC(16F1822)の書きこみ環境はお持ちでしょうか。
構造も簡単そうなので、自分で組もうかと思っています。