/***************************************************************************** padcon.c パッドコントローラー周りの関数群 1996.12.23 仕様変更あり *****************************************************************************/ #include #include #include #include #include "padcon.h" extern void EnterCriticalSection( void ); extern void ExitCriticalSection( void ); extern void GetPadBuf( volatile u_char**, volatile u_char** ); /***************************************************************************** *****************************************************************************/ #define PAD_CONNECT_MAX 4 /* 一応、マルチタップをにらんで */ /* でも、未対応みたいだ */ static volatile u_char *bb[PAD_CONNECT_MAX]; /* パッドデータ(内部変数) */ /***************************************************************************** PAD の初期化 引 数:mode 現在、使わない 戻り値:なし *****************************************************************************/ void PadInit( long mode ) { GetPadBuf( &bb[0], &bb[1] ); ExitCriticalSection(); } /***************************************************************************** PAD のボタン等の押下げを調べる 引 数:ch コントローラチャンネル 戻り値:コントローラーのボタン押下げ状態 すべてのコントローラーにおけるデジタルボタンはすべてこれで調べる *****************************************************************************/ long PadRead( int ch ) { long pad; pad = (~( (*(bb[ch]+3) | *(bb[ch]+2) << 8 ) ) )&0xffff; return( pad ); } /***************************************************************************** マウスの移動量を調べる 引 数:ch コントローラチャンネル dx, dy, dz 調べた移動量の格納先 戻り値:なし *****************************************************************************/ void PadReadMouse( int ch, int *dx, int *dy, int *dz ) { *dx = (int)( (signed char)*(bb[ch]+4) ); *dy = (int)( (signed char)*(bb[ch]+5) ); *dz = (int)( (signed char)*(bb[ch]+6) ); } /***************************************************************************** ネジコンのアナログチャネル値を調べる 引 数:ch コントローラチャンネル ac1, ac2, ac3, ac4 調べたアナログチャネル値の格納先 ac1:ねじり部分 ac2:1ボタン ac3:2ボタン ac4:Lボタン なんと、ネジコンはLがアナログで、Rがデジタルだったのだ! 戻り値:なし *****************************************************************************/ void PadReadNegcon( int ch, int *ac1, int *ac2, int *ac3, int *ac4 ) { *ac1 = (int)( *(bb[ch]+4) ); *ac2 = (int)( *(bb[ch]+5) ); *ac3 = (int)( *(bb[ch]+6) ); *ac4 = (int)( *(bb[ch]+7) ); } /***************************************************************************** PAD が存在するかを調べる関数 引 数:ch コントローラチャンネル 戻り値:1 存在する 0 存在しない *****************************************************************************/ int PadExist( int ch ) { return( ~(*bb[ch]) & 0x01 ); } /***************************************************************************** PAD の種類を調べる関数 引 数:ch コントローラチャンネル 戻り値:0 なにこれ?知らない 1 マウス 2 ネジコンなどのアナログコントローラ 4 ノーマルPAD 5 ジョイスティック(らしい。未確認) *****************************************************************************/ int PadClass( int ch ) { // return( ( (*(bb[ch]+1)) & 0xf0 ) >> 4 ); return( (*(bb[ch]+1)) >> 4 ); } /***************************************************************************** PAD の受信データバイト数を調べる関数 引 数:ch コントローラチャンネル 戻り値:受信データバイト数/2 *****************************************************************************/ int PadReceiveDataBytes( int ch ) { // return( ( (*(bb[ch]+1)) & 0xf0 ) >> 4 ); return( (*(bb[ch]+1)) & 0x0f ); } /***************************************************************************** PAD の終了処理 引 数:なし 戻り値:なし *****************************************************************************/ void PadStop( void ) { }