Future Driver

マウス

セガマウスの読み取り方 (コード例)

※ここではマウスの具体的な読み取り例を解説します。 パッドと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
;---------------------------------------------------------------------------


inserted by FC2 system