2014年11月15日

66SRのキーボードについて(1)

 最近話題の66SRのキーボードに関してです。
 MORIYAさんの所にも情報がありますが、再調査してまとめてみました。


1.データのやりとりの方法について

 66SRとキーボードは離れているため、キーボードの情報を赤外線通信、もしくは有線通信でデータを送信しています。キーボードから66SRへ、一方的にデータを送信しています。

 赤外線通信か、有線通信のどちらかしか行われていませんが、その選択方法は以下の通りです。

 ・66SR本体とキーボードが、付属のケーブルで接続されていたら、有線通信
 ・それ以外は、赤外線通信


 実際の回路での電気的な選択方法は次の通りです。
 (回路図を修正しました)

141115_01_66SR_keysch.PNG


 ケーブルで66SR本体とキーボードが接続された時、キーボード側の2ピン4ピンが"H"になり、その結果をサブCPU3が検知して、送信回路を赤外線通信から有線通信に切り替えます。
 また、66SR側の3ピン4ピンが"L"になり、その結果をサブCPU2が検知して、受信回路を有線通信の方に切り替えます。

 実際の送信データは、4ピンを使ってキーボードから66SRに送信されます。キーボードの2ピンから66SR本体の3ピンに向かって送信されます。


2.データのフォーマットについて

 赤外線通信も有線通信も、論理的に同じフォーマットを使って送信されています。
 ただし、実際の物理的なフォーマットは違います(後述します)。

 1回のデータ送信は、3ビットの制御データ(CT[2:0])+8ビットのキーデータ(DT[7:0])の11ビットのデータを送信します。

 論理フォーマットは以下の通りです。(LSB先送りに注意)

141115_01_66SR_keyformat.PNG


 キーを一度押すと、押したキーのコード(制御データ+キーデータ)が送信されます。押しっぱなしにすると、そのキーコードが連続して送信されます。キーボード側でオートリピートが実現されています。

 キーを離した時には、キーコードが送信されません。


 キーコード一覧です。

141115_01_66SR_keycode.jpg


 前の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つのデータが送信されます。

 また、通常はゲームキー用の送信が先のようですが、逆になることもあります。


 次に続きます。

posted by えすび at 14:06| Comment(10) | P6解析:サブCPUと8255 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
はじめまして。にがと申します。普段はMSXを弄っている人ですが、赤外線ネタが好きすぎて、PC-6601SRのキーボード無しジャンクを入手し、MSXをキーボード代用品にしてみました。

その動画がコチラです。
https://youtu.be/UO2k_8vTPTo

MSX用のプログラムを書くにあたり、貴殿の解析情報を大いに活用させていただきました。ありがとうございました。ところで、解析情報のGRAPH+左/下のデータですが、特殊コード010:20, 010:08 はゲーム用の出力データを観測されたものと思います。自作の変換プログラムではGRAPH+上/右同様に001:00としました。

これを機にP6も少し弄ってみようかなと思っています。
Posted by にが at 2020年03月08日 13:56
 報告ありがとうございます。

 ご指摘の通り、GRAPH+←、↓は、001:00 を出力するのが自然ですね。そのうち修正しておきます。
Posted by えすび at 2020年03月08日 14:39
先日の動画でご報告させていただいたMSXによるPC-6601SR用赤外線キーボードですが、せっかくなので専用のカートリッジ基板を作ってみました。同人ハードとしてリリースしたいと考えていますが、問題ございますでしょうか。

取扱説明書を書いてみました。
http://niga2.sytes.net/upfile/p6key.pdf
Posted by にが at 2020年08月04日 18:07
 作成も配布も特に問題ありません。

 MSXが、P6のスレーブ(奴隷)になるのが、世の中のP6erに受けるかも(^^;)

 キーマトリックスの関係から、カーソルキーの同時押しが検出できるので、MSXを使うのはベターな解ですね。
 普通のキーボードだと、どうしてもカーソルキーの同時押しの検出不能問題が出てくるんですよねぇ。

Posted by えすび at 2020年08月04日 20:08
ありがとうございます。近いうちに家電のケンちゃんさんを介してリリースしたいと思います。66SRユーザーの方がMSXを入手する機会になるかもしれませんし、お互いWinWinではないかと。

実はファミベーキーボード用の送信機も作りました。ゲームキー同時入力含めて全キー押下できますが、MSXと違って任意のキーの状態を任意のタイミングで取得できないため、ややレスポンスは遅いです。需要がニッチすぎるのとガワ加工も面倒なので製品化の予定はありません。

http://niga2.sytes.net/upfile/FB66SRKEY.jpg

有線接続アダプタならアリかなと思ったのですが、66SRのコネクタに普通のモジュラー4pが刺さらないため断念しました。あれって専用品なのでしょうか。
Posted by にが at 2020年08月04日 21:25
4Pモジュラは汎用品です。

電話機の、受話器と本体をつないでいるコードに使われています。

電話機の回線側のモジュラジャックより、ひとまわり小さいサイズです。

ファミベのキーボードを使う案はいいですね。私も作ってみようかな...

Posted by えすび at 2020年08月04日 23:26
電話のモジュラーは6p、2芯、66SRは4p、4芯ですよね。
ところが4pのモジュラーが刺さらないのです。手持ちのモジュラープラグが変なのかも知れませんが、普通にどこかのパーツ屋さんから買ったものだったような気がします。

本体を改造してジャックを取り替えれば接続できますが、それだと同人ハードとして成り立たなくなり、作る意味がないかなと思っています。
Posted by にが at 2020年08月04日 23:40
以下で入手できそうです。

モジュラジャック
→アマゾンで「モジュラージャック 4P4C」で検索。


接続用コード
→アマゾンで「受話器コード」で検索。

コードに関しては、ホームセンターなどでも入手可能だと思います(私はコーナンで買いました)。

Posted by えすび at 2020年08月05日 20:16
改めて電話の受話器ケーブルを外して挿し込んでみたところ、なんと普通に挿さりました。最初に試したのはモジュラープラグをカシメる前の状態で、どうやら電極が飛び出しているために挿さらないみたいです。お騒がせしました。

有線で繋がりそうなので、試作してみることにします。赤外線バージョンは概ねできているのでタイミングを少し弄るだけですね。

えすびさんお作りになるのでしたらプログラム提供いたしますが、PIC(16F1822)の書きこみ環境はお持ちでしょうか。
Posted by にが at 2020年08月08日 01:51
AVRの環境はありますが、PICは使っていません。

構造も簡単そうなので、自分で組もうかと思っています。
Posted by えすび at 2020年08月08日 15:51
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。