PC-6001(もうエミュレータは開発してないけど)日記 |
■ [2013/01/16] - 6601SRのキーボード調査 その5 |
試しにarduinoから信号をPC-6601SR本体に信号を送ってみたのですが、うまくいきませんでした。PC-6601SR本体側のキーボード 端子から送られてくる信号の並びが違うのか、電圧が違うのか、そもそも送り方がよくないのかわかりません。一応、キーボード上の配線に 乗っかる形で信号を送ってみたところ、PC-6601SR側で受信して文字が表示されたので、これまでに調べたプロトコル自体はあっているようです。
もう少し、電気信号周りを調べてみないとダメですね。
■ [2012/03/30] - 6601SRのキーボード調査 その4 |
スペースキー周りの調査です。まずは、SPACEキーを一回押す(押して離す)のデータです。
ほぼ連続して2つのデータが送られてきています。1つ目のデータの終わりから2つ目のデータの変化までは4.56msでした。
押した瞬間1: | 1 010 00000001 0 101 11111110 1 |
押した瞬間2: | 1 000 00000100 1 111 11111011 0 |
2つ目のデータは謎3bitが全て0なので一般キーと同じ扱いになります。ということは、続く8bitがキーコードになるので ビット列を反転すると00100000で16進数では20hとなります。キーコード表によると20hはSPACEです。スペースキーの場合、 スペースキーが押下状態であるという情報に続けてスペースキーが押された(≒スペースの文字が入力された)という情報も 送っていることがわかります。
少し離れたところにある信号線の変化が、スペースキーを離した時のデータです。
上げた瞬間: | 1 010 00000000 1 101 11111111 0 |
今までのデータから推測すると、これはスペースキーのUP情報とみてよさそうですね。
ところで、謎3bitの2bit目はスペースキーとSHIFTキーの変化情報ということになりますが、スペースキーがUPになった時は全てのBitが0に なっています。これだとSHIFTキーもUPになったと判断されてしまいますね。ということは、SHIFTキーがDOWNのままスペースキーを UPにしたらSHIFTキーの状態情報は1として送られてくると考えてよさそうです。この辺は再度データを取り直したいところです。
続きてSPACEキーを押しっぱなしにしてみました。
押した瞬間1: | 1 010 00000001 0 101 11111110 1 |
押した瞬間2: | 1 000 00000100 1 111 11111011 0 |
最初の2つ並んだデータは先に調べたスペースキーを一度押した時と同じで2つのデータが並びます。スペースキーの押下情報と、スペースキーのキーコードです。 1つ目のデータの終わりから2つ目のデータの変化までは4.57msでした。先の場合とは1/100msほどの差がありますが誤差レベルですね。
スペースキーを押しっぱなしにしてしばらくすると、連続的にデータが送られてきています。データの並びは
1 000 00000100 1 111 11111011 0 |
スペースキーのキーコードです。つまり、スペースキーのキーリピートが発生していると考えられます。 押しっぱなしのリピート間隔は66.17ms秒でした。前回のSHIFTキー連打よりも速いというか、秒間15回くらいの連射になっちゃいますね。 実機ではそんなに速くキーリピートがかからないと思うのですけど、キーボードが送るデータ速度よりも、データを受け取った本体内の SUB CPUからZ80へのキー割り込み間隔が遅いということでしょうか。謎です。
リピートが始まるまでの間隔、つまり、最初にスペースキーを押してから次のリピートがかかるまでの間隔ですが、 どこの数値を読み取ればいいのか難しいところですけど、最初のスペースキーのキーコードからリピート開始までの値(下図のAからBの間隔)は、959.03msでした。
さて、ここまで調べると改めてデータを取り直したいキーがいくつかあります。 CTRLキーとの組み合わせ、SHIFT+SPACE、キーボードの同時押し時の反応、カーソルキーなどです。 ただ、ここまでくるとデータを取るよりも、PICなどを使って66SRのキーボードをシミュレートしてみた方が楽しそうなので調査自体は区切りを つけたいと思います。
■ [2012/03/29] - 6601SRのキーボード調査 その3 |
シフトキー周りの調査です。
SHIFTキーを一回押す(押して上げる)
押した瞬間: | 1 010 10000000 0 101 01111111 1 |
上げた瞬間: | 1 010 00000000 1 101 11111111 0 |
謎3bitの2つめのBitが変化しました。これで謎3bitの全てのBit変化を確認できました。
SHIFTキーを押しっぱなし
押した瞬間: | 1 010 10000000 0 101 01111111 1 |
押して上げた時のデータと同じですが、一度だけ信号が送られてきた後は、キーリピートはかかりません。
SHIFTキーを連打してみました。
拡大して値を読み取ってみたところ、SHIFTキーのDOWNとUPが交互に流れてきました。ついでなので連打の間隔を読み取ってみました。
DOWN→UPはキーを押してから上げた...厳密にいえばキーにはバネが入っていますので、手を離すだけでキーは勝手に 元の位置に戻るので、そのビョンと跳ね上がるまでの時間です。DOWN→DOWNは押して離して再び押すまでの間隔です。 一般的にゲームで連打測定をする場合の間隔がこれです。平均すると約109msということは 1秒間に9回くらいです。最速値は84.48msなので、これを繰り返せれば秒間11連射くらいですね。 これ以上のキーボードの反応速度を調べるには、・・・いますぐ高橋名人を呼んできてくれ!
■ [2012/03/28] - 6601SRのキーボード調査 その2 |
前回はAとBのキーを押した時のデータを読み取りましたが、それ以外のキーについても調べてみました。
キー | コード | 謎3bit |
---|---|---|
ESC | 1Bh | 000 |
DEL | 7Fh | 000 |
INS | 12h | 000 |
TAB | 09h | 000 |
RETURN | 0Dh | 000 |
PAGE | FEH | 000 |
HOMECLR | 0Ch | 000 |
キーボードから送られてくる文字(コード)のビット列は下位ビットからなので、並びを変えて16進数で表記してあります。謎3bitについてはキーボードから 送られてくる順の通りです。
こうしてみると、キーに対応するコードは、PC-6001(SR系?)のキーコード表と一致しているようです。キーコード表というのは PC-6001のキーボードを押した際にキーボードを関しているSUB CPUがZ80にキー割り込みと共に送ってくる8bit値の一覧で、PC-6001mkII解析マニュアルに 記載されています。(BASICやPC-Techknowのキャラコード表とは異なります)
キーコード表では、RETURNキーはCTRL+M、TABはCTRL+I、CLRはCTRL+L、INSはCTRL+Rと同じキーコードになっているのですが、この辺の処理が 6601SRのキーボードではどうなっているか、CTRLキーだけを押してみたところ、キーボードからは信号が送られてきませんでした。修飾キーについては以下の動作が確認できました。
SHIFTキーはカーソルやスペースとあわせてゲーム用にも使われるのでUPかDOWNかの状態を記録しておく必要があるので、このような挙動をするのだと思われます。
さて、話の流れとしては、修飾キーと一般キーとの組み合わせになるのですが、その前に謎3bitが変化するキーの例を挙げてみます。
キー | コード | 謎3bit |
---|---|---|
KANA | FEh | 100 |
MODE | FDh | 100 |
F1 | F0h | 100 |
F2 | F1h | 100 |
POWER | 08h | 001 |
KANA/MODE/F1/F2キーを押した時、謎3bitの最初のBitが変化しました。これらのキーはPC-6001mkII解析マニュアルに記載されている キーコード表で「グラフィックフラグ=1」となっているキーです。おそらく謎3bitの最初のBitはグラフィックフラグの状態を表しているようです。キーコード表によると、 STOP,CAPSキー、それからGRAPHキーとの組み合わせで画面に表示されるグラフィックキャラクターもグラフィックフラグ=1として送られてきます。
POWERキーは軽く一度押しただけでは信号に変化は現れないのですが、長く押していると一度だけ上記のデータが送られてきました。謎3bitの最後のBitが変化しています。
■ [2011/06/19] - 6601SRのキーボード調査 その1 |
PC-6601SRのキーボードはPC-6001シリーズで唯一、本体と分離しています。本体との接続は有線ケーブルか 赤外線機能を用います。キーボードのキーを押すと、キーボードから何らかのデータを本体へと送っている事に なるのですが、どのようなデータなのか分かれば夢が広がるよね[※1]、ということで調べてみました。
※1:例えばWindowsとUSB接続してWindowsからキー入力できてコピペで半自動でプログラムを入力して ディスクに保存するとか。初代PC-6001のジョイスティック端子から6601SRにつなげてキー入力するとか。
ちなみに今回は赤外線通信方式については触れません。
まず、キーボードと本体とをつなぐケーブルは4極4芯のケーブルです。一般的な電話機やモデムで使われるのは6極ケーブルで 端子の幅が異なります。4極4芯のケーブルは扱っている店はあまりないようですが、大型の家電量販店の電話/FAX売り場に行くと 300〜500円程度で手に入ります。4つの信号線のうちの1つがキーボード内部のLSIにほぼ直結しているので、長いケーブルだと データを取りこぼしたりノイズが乗りやすくなるかもしれません。
キーボード内の配線を調べてみたところ、4つの信号線の内訳は、GNDが2つ、本体からキーボードへの電源供給+5Vが1つ、キーボードから本体への信号線が1つでした。 キーボードから本体への信号線が1つなのでキーボードから本体への単方向通信だと思いますが、 もしかしたら単線で双方向通信を行っている可能性も完全には否定できません。ただ、この信号線は キーボード内の制御用LSI 8049のI/O端子へとほぼ直結していて、信号線の入出力状態を事前に切り替えたり判別したりするような仕組みが見あたらなかったので、 一方向通信と見なしてよさそうです。単方向でLSIの信号線なので0Vか+5V、LSIの信号線を外部のケーブルでやり取りするのなら 通信速度は低速だと思われます。
※追記:どうやらPC-6601SR本体側から出ている線を調べてみたところ、この端子位置とは違うようです。これってリバースケーブル???
こうなると話は簡単ですので、信号線の信号変化をロジアナで観察してみました。まず、キーボードのaを押してからすぐに上げた時の信号変化をみてみます。
これと同じような0Vと+5Vの電圧変化による信号をPC-6601SR本体に送れば、[a]を押したと本体に認識されるはずです。 あとは電圧変化の(時間)幅を測って、他のキーでも同様の測定をして、何らかの機器から同様の信号を6601SR本体に送れば、話はこれで終わりです。
・・・という感じで終わってしまうと少々物足りないので、この信号の内容を調べてみることにします。比較用に[b]を押した時の信号がこちらです。
これらを比較してみると、長い幅のHigh信号と短い幅のHigh信号で0か1を表しているようです。幅の違いはあっても、出っ張りの個数はどちらも25個です。 その他にわかったことは...
幅の広いHighを1、幅の狭いHighを0とみなして、[a]を押した時の信号をビット列にすると、先頭から
1000100001101111011110010
となります。[b]の場合は
1000010001101111101110010
ですね。ちなみに、AのASCIIコードは0x61でビット列にすると01100001です。とまあ、こんな感じでビットを比べてみると ビット列の境目がみえてきます。
こういう内容だということがわかりました。文字コードがASCIIコードなのかどうかはわかりません。というのも、aのキーを押したのに 送られてきたのは大文字Aのコードだった、ということに解析途中で気が付きました。もしかすると実験中にCAPSキーを押してしまって キーボードが大文字状態になっていたのかもしれません。ただ、ここまできたら、PICやAVRやUSB機器を使って 本体に色々な文字コードを送ってみて、画面に表示される文字との対比表を作った方が早そうです。
さて、まだ謎の3bitの扱いが不明です。それとキーリピートが不明です。ここでは触れていませんが、25bit長のデータを2度送るキー( キーを上げた際にデータを送るキー?)もあるのです。そのあたりは次回、ということで。