MSX用、PC-8801用、FM-TOWNS用のマウスが使用可能で、ジョイスティック端子に挿して使う事が出来ます。
仕様的には、上記3つは殆ど同じようです。
データの受け渡し方法ですが、pin8 がSTROBE 信号で、特定のタイミングで変化させると、pin1-4 にマウスの座標が返ってきます。
また、マウスのボタンは、pin6、7 に返ってきます(これは、通常のトリガボタンと同じです)。
入出力タイミングは以下の通りです。
最初に STROBE 信号を L → H にすると、X方向の移動量(上位)が返ってきます。
次に STROBE 信号を H → L にすると、X方向の移動量(下位)が返ってきます。
次に STROBE 信号を L → H にすると、Y方向の移動量(上位)が返ってきます。
次に STROBE 信号を H → L にすると、Y方向の移動量(下位)が返ってきます。
一度に返って来るデータは4ビットで、4回掛けてX方向の移動量8ビットとY方向の移動量8ビットを受信する事になります。
返って来るのは移動量で、符号付き8ビットのデータになります。
タイミングチャート内の、TA はデータが確定するまでに 最大80μs掛かるという意味です。
同様に、TB はデータが確定するまでに 最大30μs掛かるという意味です。
TC は、180 μs 以内にしなさい、という意味です。
TD は、少なくとも 300 μs は空けてアクセスしなさい、という意味です(PC-8801用は80μsになっているようです)。
TD の最大値が記載していませんが、あまり遅いと移動量がオーバーフローするので、適当なタイミングで読みにいく必要があります。
上記の仕様の出典は、Panasonic のマウスの説明書、及びPC-8801マスターバイブルからです。
また、これは未確認ですが、STROBE 信号が反転している仕様もあるみたいです。
上記のような仕様なんですが、P6 で動かすには、TC の180μs以内にアクセスする必要があるのが、結構大変です。
画面を表示している最中は CPU が停止しているために、時間を正確に計測できません。
バスリクエストを OFF にすれば問題ないんですが、画面を表示させて使えない事を意味しますので、この案は却下です。
幸い、mk2以降では、垂直同期が検出できますので、それを使用します。
(初代 P6 でも検出が多分可能なんですが、まだ確立できていません)
垂直同期のタイミングと、CPU が停止するタイミングですが、以下の通りです。
画面行数:垂直同期:CPU の順です。
・MODE 1〜4
0〜 2:L:通常
3〜 36:H:通常
37〜228:H:停止
229〜261:H:通常
・MODE 5
0〜 2:L:通常
3〜 32:H:通常
33〜232:H:停止
233〜261:H:通常
CPU 停止期間は、実際はずっと停止するわけではないんですが、70%程度停止しています。
1/30 秒かけて、262行を描画します。ですので、1行は 大体 127μs に相当します。
垂直同期を検出してから30行程度、つまり 3ms 程度は、CPU が停止しない期間になります。
これを使えば、時間を正確に計測する事ができます。
実際のプログラムがこれになります。mk2、66 用で、MODE2、PAGE4 です。
mouse.zip
P6 では、垂直同期が検出できないため使用できません。
SR 以降では、CPUクロックの周波数が違うために、手直しが必要です。また、バスリクエストをOFF にして実行する方が簡単かと思います。
実行すると、画面右上に数字が出ます。
上から、ポート1のマウスのX増分/Y増分/ボタンの状態、ポート2のマウスのX増分/Y増分/ボタンの状態、になります。
アクセス時間が比較的短いため、増分が小さな数字になっています。
また符号付きの数値なので、マウスをちょっとだけ動かすと、00000000/11111111 の値でパラパラと表示が変わると思います。
もう一つ、サンプルプログラムです。MODE5、PAGE4 です。
mouse2.zip
起動すると画面にカーソルが出て、マウスで移動させる事ができます。
左右のトリガを両方押すと、終了します。
ただ、マウスのデータに従って動かすだけの事なんですが、P6系では結構大変です。


STROBE 信号を動かした時に返って来る値は、
X方向の移動量(上位)
X方向の移動量(下位)
Y方向の移動量(上位)
Y方向の移動量(下位)
です。