ふぅ。。。
こちらがコネクター。へんな形。
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化も簡単なり。
もっともこのキーボード、お世辞にもキータッチがいいとはいえない。。。。
カシュカシュって感じで非常に軽い。
PR
さて、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へ書く。
これだけ。古いだけあって、簡単。
ちょこちょこっとロジックを書いて、RS-232C(PICの世界ではUSARTと呼ぶらしいので以降はUSARTと呼ぶ)とADBの変換はほぼ問題なくできることを確認した。
こんな感じで接続
[ ADB Keyboard ] -- [ 2SC1815 ] -- [ PIC 16F628A ] -- [ MAX232(互換) ] -- [ThinkpadのCOM4]
teratermではちょっと機能不足なので、SerialDebugTool(SerialDebug112.zip)を使用。
左右のShift,Ctrl,Altで違うコードを返してくるし、文字を送るとnum lock、caps lock、scroll lockのLEDを自由に制御できた。
あとは、
[PCのPS/2ポート] -- [ 2SC1815 ] -- [ PIC 16F628A ] -- [ MAX232(互換) ] -- [ThinkpadのCOM4]
てな感じでつなぐような、PS/2をUSARTに変換するものを作って、上のやつと直結すればADB-PS/2変換器の出来上がり。
で、こんなものを作らなくてもi-mateがあるじゃないか、といわれそうだが、まったくそのとおりとおもう。かくいうおれもi-mateを持っているのだが、caps lock のハードロックを微妙に処理しているところが気に食わない。caps lockのハードロックを外してcaps lockとctrlを入れ替えようと考えているおれにはあわない。
っということで、M0115対応は目処がついたので、開発中断。
実はM0116対応(たぶんGSキーボードも一緒)も考えていたけど、キーボードをもっていないのでやめた。M0116対応はM0115対応よりむずかしい。キーの数が101 or 84キーボードより少ないので、Happy HackingみたいにFnキーを作らないといけない。
明日からはM0110 ( Mac 128K/512K用テンキーなしキーボード)に挑戦。
こんな感じで接続
[ ADB Keyboard ] -- [ 2SC1815 ] -- [ PIC 16F628A ] -- [ MAX232(互換) ] -- [ThinkpadのCOM4]
teratermではちょっと機能不足なので、SerialDebugTool(SerialDebug112.zip)を使用。
左右のShift,Ctrl,Altで違うコードを返してくるし、文字を送るとnum lock、caps lock、scroll lockのLEDを自由に制御できた。
あとは、
[PCのPS/2ポート] -- [ 2SC1815 ] -- [ PIC 16F628A ] -- [ MAX232(互換) ] -- [ThinkpadのCOM4]
てな感じでつなぐような、PS/2をUSARTに変換するものを作って、上のやつと直結すればADB-PS/2変換器の出来上がり。
で、こんなものを作らなくてもi-mateがあるじゃないか、といわれそうだが、まったくそのとおりとおもう。かくいうおれもi-mateを持っているのだが、caps lock のハードロックを微妙に処理しているところが気に食わない。caps lockのハードロックを外してcaps lockとctrlを入れ替えようと考えているおれにはあわない。
っということで、M0115対応は目処がついたので、開発中断。
実はM0116対応(たぶんGSキーボードも一緒)も考えていたけど、キーボードをもっていないのでやめた。M0116対応はM0115対応よりむずかしい。キーの数が101 or 84キーボードより少ないので、Happy HackingみたいにFnキーを作らないといけない。
明日からはM0110 ( Mac 128K/512K用テンキーなしキーボード)に挑戦。