ps/2プロトコルのところを下記を参考に書き直した。
http://ioio.at.infoseek.co.jp/PS2/PS2.HTML
ここの記事には、タイミングについて詳しく書いてあったので、これを参考にした。
ついでに、ADB-PS/2変換を2CHIPから1CHIPに変更した。
さらに、なんちゃってオープンコレクター(こんな言葉あるのか?)で、無抵抗、無トランジスタ化。
さらに、もっと小さくしようと思って、PIC12F683対応にした。これは、PIC16F648Aと内部が似ているらしく、少しのプログラム修正だけで済んだ。
完成品は、こんな感じ↓。おそらく史上最小のADB-PS/2変換器だと思う。

こちら↓はその拡大写真。抵抗なし。トランジスタなし。PIC直結でシンプル。でも、あまりいけてない空中配線。。。
原価(ハンダ、線材除く)は、
12F683 .... 180円
ICソケット ... 25円
PS/2ケーブル ... 300円/2=150円
Sケーブル(ADB) ... 100円/2=50円
合計... 405円
まずまずですな。

http://ioio.at.infoseek.co.jp/PS2/PS2.HTML
ここの記事には、タイミングについて詳しく書いてあったので、これを参考にした。
ついでに、ADB-PS/2変換を2CHIPから1CHIPに変更した。
さらに、なんちゃってオープンコレクター(こんな言葉あるのか?)で、無抵抗、無トランジスタ化。
さらに、もっと小さくしようと思って、PIC12F683対応にした。これは、PIC16F648Aと内部が似ているらしく、少しのプログラム修正だけで済んだ。
完成品は、こんな感じ↓。おそらく史上最小のADB-PS/2変換器だと思う。
こちら↓はその拡大写真。抵抗なし。トランジスタなし。PIC直結でシンプル。でも、あまりいけてない空中配線。。。
原価(ハンダ、線材除く)は、
12F683 .... 180円
ICソケット ... 25円
PS/2ケーブル ... 300円/2=150円
Sケーブル(ADB) ... 100円/2=50円
合計... 405円
まずまずですな。
PR
ふぅ。。。
こちらがコネクター。へんな形。

1,2.......... GND
3.............. TX
7,8........... 5V
調歩同期シリアル9600bpsスタート/ストップビット1
偶数パリティみたいだが受信側で無視して良し。
こちらがキーボード&キーコード

カーソルキーを除き、1キー2バイト
たとえば1キーを押したときは 80 02 送信
離したときは 90 02 送信
押している間、ずーっとリピート送信するが、
ディレイはない。
全キーリリース時には、離したキーのキーコードにかかわらず、
90 7Fを送信する。
カーソルキー(メーク+リピート+ブレイク)については、図の上に書いたとおり。
これなら、ps/2化も簡単なり。
もっともこのキーボード、お世辞にもキータッチがいいとはいえない。。。。
カシュカシュって感じで非常に軽い。
こちらがコネクター。へんな形。
1,2.......... GND
3.............. TX
7,8........... 5V
調歩同期シリアル9600bpsスタート/ストップビット1
偶数パリティみたいだが受信側で無視して良し。
こちらがキーボード&キーコード
カーソルキーを除き、1キー2バイト
たとえば1キーを押したときは 80 02 送信
離したときは 90 02 送信
押している間、ずーっとリピート送信するが、
ディレイはない。
全キーリリース時には、離したキーのキーコードにかかわらず、
90 7Fを送信する。
カーソルキー(メーク+リピート+ブレイク)については、図の上に書いたとおり。
これなら、ps/2化も簡単なり。
もっともこのキーボード、お世辞にもキータッチがいいとはいえない。。。。
カシュカシュって感じで非常に軽い。
さて、M0110A(厳密にはM0110AJ)を入手。このキーボードは安い!
人気はないけど、キータッチはM0110とほぼ同じ。
さっそくキーコードを調べてみた。
①基本はM0110とまったく同じ
②Enterキー(Returnではない)の吐き出すコードはM0110のEnterとは違う
③M0110Aで追加されたキーは1バイトではなく2または3バイトのコードを返す
ということで、調べてみた。
キー Make Break
---------------------------
← 79 0d 79 8d
→ 79 05 79 85
↑ 79 1b 79 9b
↓ 79 11 79 91
ここから下はTenキー
0 79 25 79 a5
. 79 03 79 83
1 79 27 79 a7
2 79 29 79 29
3 79 2b 79 2b
4 79 2d 79 2d
5 79 2f 79 2f
6 79 31 79 31
7 79 33 79 33
8 79 37 79 37
9 79 39 79 39
Clear 79 0f 79 8f
= 71 79 11 f1 79 91
/ 71 79 1b f1 79 9b
* 71 79 05 f1 79 85
- 79 1d 79 9d
+ 71 79 0d f1 79 8d
Enter 79 19 79 99
おお、71(shiftキー)の処理が複雑になる!!
人気はないけど、キータッチはM0110とほぼ同じ。
さっそくキーコードを調べてみた。
①基本はM0110とまったく同じ
②Enterキー(Returnではない)の吐き出すコードはM0110のEnterとは違う
③M0110Aで追加されたキーは1バイトではなく2または3バイトのコードを返す
ということで、調べてみた。
キー Make Break
---------------------------
← 79 0d 79 8d
→ 79 05 79 85
↑ 79 1b 79 9b
↓ 79 11 79 91
ここから下はTenキー
0 79 25 79 a5
. 79 03 79 83
1 79 27 79 a7
2 79 29 79 29
3 79 2b 79 2b
4 79 2d 79 2d
5 79 2f 79 2f
6 79 31 79 31
7 79 33 79 33
8 79 37 79 37
9 79 39 79 39
Clear 79 0f 79 8f
= 71 79 11 f1 79 91
/ 71 79 1b f1 79 9b
* 71 79 05 f1 79 85
- 79 1d 79 9d
+ 71 79 0d f1 79 8d
Enter 79 19 79 99
おお、71(shiftキー)の処理が複雑になる!!
忘れないうちにメモしておく。
① CLKとDATAの2本の線でデータのやりとりをする。
② CLKはつねにキーボードからホスト(Mac)に向けて送信する。
③ RS-232CやPS/2と違って、MSB firstでデータを送受信する。(さすが68系)
④ホストはCLK立ち上がりのタイミングでDATAを読む
⑤キーボードはCLK立ち上がりから80μs秒後にDATAを読む
⑥ホストからなにもしなければ、キーを押してもキーボードからデータを送ってこない。(無理にキーから値を読もうとすると無限ループにはまってハングする)
⑦ホストから0x10 (Inquiry)をキーボードに送ると、キー入力がある、ないにかかわらず、キーボードからデータを送ってくる。キー入力がなければNULL(0x7B)を返す。あれば該当するキーコードを返す。
⑧M0110が返すキーボードは、ADBキーボードが返すキーコードをちょうど2倍した値(左に1ビットシフトした値)になぜかなっている。

この図の言わんとすることは、つまり
キーボードからデータを受け取るときは、CLKがHighになるまでループさせて、HighになったときにDATAを読む。
キーボードへデータを送るときは、とりあえずDATAをLowにしておき、しばらくするとキーボードからクロックを送って(Lowにして)くるので、HighからLowに切り替わるタイミングでDATAへ書く。
これだけ。古いだけあって、簡単。
① CLKとDATAの2本の線でデータのやりとりをする。
② CLKはつねにキーボードからホスト(Mac)に向けて送信する。
③ RS-232CやPS/2と違って、MSB firstでデータを送受信する。(さすが68系)
④ホストはCLK立ち上がりのタイミングでDATAを読む
⑤キーボードはCLK立ち上がりから80μs秒後にDATAを読む
⑥ホストからなにもしなければ、キーを押してもキーボードからデータを送ってこない。(無理にキーから値を読もうとすると無限ループにはまってハングする)
⑦ホストから0x10 (Inquiry)をキーボードに送ると、キー入力がある、ないにかかわらず、キーボードからデータを送ってくる。キー入力がなければNULL(0x7B)を返す。あれば該当するキーコードを返す。
⑧M0110が返すキーボードは、ADBキーボードが返すキーコードをちょうど2倍した値(左に1ビットシフトした値)になぜかなっている。
この図の言わんとすることは、つまり
キーボードからデータを受け取るときは、CLKがHighになるまでループさせて、HighになったときにDATAを読む。
キーボードへデータを送るときは、とりあえずDATAをLowにしておき、しばらくするとキーボードからクロックを送って(Lowにして)くるので、HighからLowに切り替わるタイミングでDATAへ書く。
これだけ。古いだけあって、簡単。