PC用シリアルマウス
- 公開日: 2021/08/09
- 更新日: 2021/08/12
概要
IBM-PC及びその互換機はシリアルポート端子としてアタリ仕様ジョイスティックと同様のDE-9オスコネクタを採用している[1]。PCは1987年のPS/2登場まで専用のマウスポートが無く、Windowsや他のGUIシステムでマウスを使う場合は、シリアルポート又は専用の拡張カード経由で接続していた。
シリアルマウスのプロトコルについては、DOS用のフリーのマウスドライバであるCuteMouse付属のドキュメントに詳説されている。このドキュメントによれば、Mouse Systems社[2]のプロトコルと、Microsoftのプロトコルの2系統があるとのこと。また、スイスLogitech社(日本ではLogicoolブランド)が3ボタンを扱えるようMicrosoftのプロトコルを拡張している。また、Microsoft自身もホイール対応の為プロトコルを拡張している。
Note
(2021/8/10追記)X.orgのソースコードを見るとさらにいくつかのプロトコルがあることがわかった。例えば、古い(おそらくはMousemanブランドになる前の)Logitechの3ボタンマウスはMouse Systems、Microsoft双方と互換性がない。さらに、ホイール機能が追加された後のLogitechマウスはMicrosoftホイールマウスの上位互換となっている。
Wikipediaによれば、1990年に台湾KYE Systems(Geniusブランドでマウスなどの周辺機器を開発・販売している会社)に買収された
Unixでは伝統的に中ボタンをペーストボタンとして使うようになっているため、3ボタンマウスはPC-UnixやLinuxを使うユーザに好まれた。3ボタンマウスとしてはMouse Systemsプロトコル、2ボタンマウスとしてはMicrosoftプロトコルがデファクトスタンダードであり、当時広く利用されていたマウスコントローラICは双方のプロトコルに対応しており、マウスによっては通常はMicrosoftプロトコル、左ボタンを押しながら起動するとMouse Systemsプロトコルになる。[3]
XFree86のドキュメントを見ると、4ボタンのKensington ThinkingやALPS GlidePointタッチパッド[4]等、他にもシリアルマウスのプロトコルはあるようだ。
3ボタン+パッドタップを4つめのボタンとして検出する
電源
典型的なボールマウスは、ロータリーエンコーダの為のLEDを4つ点灯させる必要がある。また、検出結果をシリアル信号として出力するための回路も必要である。ePanorama.netの記事によれば、これらLEDや回路に含まれるICを駆動するための電源はシリアルポートのRTSやDTRから供給される(これらの信号は通信中は常にHighでありマウス程度であれば必要な電力は充分にまかなえる)。
プロトコル検出
シリアルポートのRTS(ピン7)とDTR(ピン4)を一旦クリアして再びセットするとマウスがリセットされる。その直後に送信される数データのバイト列の内容によってマウスのプロトコルを検出することができる。
- Mouse Systemsプロトコルであればプロトコル検出用のデータは送られない 
- Microsoft(2ボタン)プロトコルであればASCIIコード'M'が送信される 
- Logitech Mouseman(ホイールなし)プロトコルであればASCIIコード'M3'が送信される 
- Microsoft(ホイール)プロトコルであればASCIIコード'MZ@'に続き0が3バイト送信される 
- Windows95の登場前後に規定されたPlug and Play External COM Device Specificationに対応したマウスであれば、'M', $08又は$28, $00, $01に続く7文字(先頭3文字は英大文字でベンダID又は'PNP'、続く4文字は数字)でマウスの種類を判別可能 
マウス移動・ボタンデータ
マウスは、自身の移動やボタン状態の変化を検出すると3-5バイト(プロトコルによって異なる)のデータを送信する。送信されるデータを以下に説明する。(参考: Tomi Engdahl氏による”PC mouse information"![[archive]](/static/archive.png) 、Everythig2.comの"Mouse protocol"、上記CuteMouseの付属ドキュメント)
、Everythig2.comの"Mouse protocol"、上記CuteMouseの付属ドキュメント)
Mouse Systemsプロトコル
Mouse Systemsのプロトコルは「1200bps、8ビット、ストップビット2、パリティ無し」で5バイトのデータを送信する。送信内容は以下の通り。
| Data bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 
|---|---|---|---|---|---|---|---|---|
| 1st byte | 1 | 0 | 0 | 0 | 0 | LB | CB | RB | 
| 2nd byte | X7 | X6 | X5 | X4 | X3 | X2 | X1 | X0 | 
| 3rd byte | Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 | 
| 4th byte | X7' | X6' | X5' | X4' | X3' | X2' | X1' | X0' | 
| 5th byte | Y7' | Y6' | Y5' | Y4' | Y3' | Y2' | Y1' | Y0' | 
通信にあたってはまず1バイト目を検出する。すなわちD3〜D7が上記の1バイト目の仕様に一致した場合、そのバイトを1バイト目と判断し、そこから始まる5バイトをマウスのデータとして取得する。LB、CB、RBはそれぞれ左、中、右のボタンで押された時に0を出力する。X0-X7、Y0-Y7、X0'-X7'、Y0'-Y7'はそれぞれ符号付き8ビットの移動量を示す。Xn、Ynは前回計測時からの移動量であり、Xn'、Yn'はXn、Yn計測時からの移動量である。移動量は正が上又は右移動となる。XFree86やX.orgではXnとXn'、YnとYn'を加算した値を移動量として検出している。
旧Logitechプロトコル
Mousemanブランドを名乗る前のLogitechのマウスはMouse Systemsと似たプロトコルとなっているが3バイトであり互換性はない。シリアル通信の仕様は、Mouse Systemsと同じ「1200bps、8ビット、ストップビット2、パリティ無し」と、「1200bps、8ビット、ストップビット1、パリティ偶数」の2パターンがあるようだ。X.orgのソースでは後者をMM Seriesと定義している。Linux JF The 3 Button Serial Mouse mini-HOWTOによれば、Logitech CAシリーズがMM Seriesプロトコルを使用している。
| Data bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 
|---|---|---|---|---|---|---|---|---|
| 1st byte | ? | ? | ? | XD | YD | LB | CB | RB | 
| 2nd byte | X7 | X6 | X5 | X4 | X3 | X2 | X1 | X0 | 
| 3rd byte | Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 | 
LB、CB、RBはそれぞれ左、中、右のボタンで、Mouse Systemsとは逆に押された時に1を出力する。X0-X7、Y0-Y7はそれぞれ8ビットの移動量を示す。移動方向はXD、YDで判定する。XDが0の時は右移動、YDが0の時は下移動となり、1の時は逆方向の移動となる。
Microsoftプロトコル
2ボタンのMicrosoftプロトコルは「1200bps、7ビット、ストップビット1、パリティ無し」で以下の3バイトのデータを送信する。
| Data bit | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 
|---|---|---|---|---|---|---|---|
| 1st byte | 1 | LB | RB | Y7 | Y6 | X7 | X6 | 
| 2nd byte | 0 | X5 | X4 | X3 | X2 | X1 | X0 | 
| 3rd byte | 0 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 | 
LB、RBはそれぞれ左、右のボタンで押された時に1を出力する。X0-X7、Y0-Y7はそれぞれ符号付き8ビットの移動量を示す。移動量は正が下又は右移動となる。Linuxのmanpageによれば、このプロトコルで中ボタンを検知する実装もあるとのこと。つまり、左右ボタンの変化がなく、かつマウスの移動がない(1バイト目のD0-D3及び2、3バイト目のD0-D5が0)にもかかわらずマウスからデータが送出された場合に中ボタンの状態が変化したと判断する。
Logitech拡張(ホイール無しMousemanシリーズ)及びホイールマウスでは上記3バイトに続き4バイト目も出力する。
Logitech拡張
| Data bit | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 
|---|---|---|---|---|---|---|---|
| 4th byte | 0 | CB | 4B | 0 | 0 | ? | ? | 
CBは中ボタンで押された時に1を出力する。D0およびD1はマウスによって異なり、[D0, D1] = [0, 0], [1, 0], [0, 1]の3パターンがあるとのこと。ALPS GlidepointタッチパッドやKensington ThinkingMouseもこのプロトコルであり、4番目のボタン4B(押された時に1を出力)が追加されている。なお、この4バイト目は中ボタンや第4ボタンの状態が変化したときのみ出力される。
Microsoftホイールマウス拡張
いわゆるMicrosoft Intellimouse
| Data bit | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 
|---|---|---|---|---|---|---|---|---|
| 4th byte | 0 | 0 | 4B | CB | W3 | W2 | W1 | W0 | 
CBは中ボタンで押された時に1を出力する。W0-W3はホイールの移動量であり符号付き4ビット。移動量は正が下となる。ホイール付きのLogitechマウス(MouseMan+)もこのプロトコルで4番目のボタン4B(押された時に1を出力)が追加されている。Microsoftのマウスは常に4バイト目が出力されるが、LogitechのホイールマウスはネイティブモードとIntellimouse互換モードがあり、ネイティブモードでは中ボタンや第4ボタンの状態変化やホイールの操作があったときのみ4バイト目が出力される。