2012年11月21日

マウスを動かす(1)

  P6でも、マウスが一応使えます。

  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系では結構大変です。


posted by えすび at 21:29| Comment(1) | P6解析:ジョイスティックポート | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
 誤記があったので修正しました。

 STROBE 信号を動かした時に返って来る値は、

X方向の移動量(上位)
X方向の移動量(下位)
Y方向の移動量(上位)
Y方向の移動量(下位)

 です。

Posted by えすび at 2012年11月23日 21:51
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。