マウス
セガマウスの読み取り方 (コード例)
※ここではマウスの具体的な読み取り例を解説します。
パッドとI/Oポートについて知りたい場合は別項を参照して下さい。
※このサンプルコードは日本版マウスのみ対応しています。
アメリカ版と日本版ではY軸が反転しているかどうかの違いがあります。
もしかしたらその他読み取りシーケンス自体が違うかもしれませんが、
動作確認出来ているのは日本版マウスだけです。
まず起動時にパッドが接続されている前提で対象I/Oポートを初期化し、
パッドである事
(D6ピンに0を出力した状態でポートを読むとD0とD1が両方1又は片方1、且つ、D2とD3が0)
をチェックします。
そうで無ければ、以下の様なコードでポートを再初期化し、
マウスかどうかチェックしてから値を読み取ります。
/* mouse.h */ extern void initMouse(); /* ポート2をマウスとして初期化 */ extern void readMouse(); /* ポート2からマウスの値を読み込む */
;mouse.s ;--------------------------------------------------------------------------- ;マウスの接続チェックと値読み込みの為にポート2を初期化する ;(予めパッドが接続されていない事をチェック出来てから呼ぶ事) .text .globl _initMouse _initMouse: movem.l a0, -(sp) move.l #$A1000B, a0 ;IOポート2のIO方向を move.b #$60, (a0) ;D6 D5ピンのみ出力に設定 iMosE: movem.l (sp)+, a0 rts ;--------------------------------------------------------------------------- ;ポート2にマウスが接続されているかどうかチェックし、そうなら値を読み込む ;(予め initMouse() を呼んで初期化しておく事) ;1. ポート2 にマウスを接続する。 ; (ポート1 に接続させたい時は $A10005 を $A10003 にする) ; ;2. 起動時にポート2にパッドが接続されて無い事をチェックしてから呼ぶ。 ; ;3. 戻り値は、int mouseStatus[5] に以下の値が入る。 ; $0BFF, フラグ, X移動量, Y移動量 .text .globl _readMouse _readMouse: movem.l d0-d2/a0, -(sp) rMos0: move.l #_mouseStatus, a0 ;認識ID moveq #0, d0 moveq #0, d1 move.b #$60, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;認識ID 0nibble目 = $0 and.b #$0F, d0 or.w d0, d1 lsl.w #4, d1 move.b #$20, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;認識ID 1nibble目 = $B and.b #$0F, d0 or.w d0, d1 lsl.w #4, d1 move.b #$00, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;認識ID 2nibble目 = $F and.b #$0F, d0 or.w d0, d1 lsl.w #4, d1 move.b #$20, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;認識ID 3nibble目 = $F and.b #$0F, d0 or.w d0, d1 move.w d1, (a0)+ ;mouseStatus[0] = 認識ID = $0BFF cmp.w #$0BFF, d1 bne rMosE ;認識出来ない = コネクタが抜けたか破壊された ;フラグ moveq #0, d0 moveq #0, d1 move.b #$00, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;各軸の方向フラグ と 移動量のオーバーフローフラグ and.b #$0F, d0 or.w d0, d1 lsl.w #4, d1 move.b #$20, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;ボタン (US版は3ボタンパッドと同じ ABC + START) and.b #$0F, d0 or.w d0, d1 move.w d1, (a0)+ ;mouseStatus[1] = フラグ ;X移動量 moveq #0, d1 move.b #$00, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;X軸の移動量 上位4bit and.b #$0F, d0 or.b d0, d1 lsl.w #4, d1 move.b #$20, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;X軸の移動量 下位4bit and.b #$0F, d0 or.b d0, d1 ext.w d1 move.w d1, (a0)+ ;mouseStatus[2] = X移動量 ;Y移動量 move.w #0, d1 move.b #$00, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;Y軸の移動量 上位4bit and.b #$0F, d0 or.b d0, d1 lsl.w #4, d1 move.b #$20, $A10005 ;読み取り要求 bsr.b rMosW ;応答待ち move.b $A10005, d0 ;Y軸の移動量 下位4bit and.b #$0F, d0 or.b d0, d1 ext.w d1 not.w d1 ;Euro版とJap版はY軸が反転してるので反転する addq.w #1, d1 move.w d1, (a0)+ ;mouseStatus[3] = Y移動量 move.l #_mouseStatus, a0 move.l (a0)+, _prmList+16 move.l (a0)+, _prmList+20 rMosE: movem.l (sp)+,d0-d2/a0 rts ;応答待ち rMosW: nop nop rMos2: btst #$04, $A10005 beq.b rMos2 rts ;---------------------------------------------------------------------------