/*
	pad.c
	pad test
	writen by calo. 1994.02.03
	lsic 3.3 試食版で コンパイル
	TOWNS UX20 コマンドモードで 動作確認
	マウスも ボタンだけなら ok.
	参考文献
	ＦＭ　ＴＯＷＮＳテクニカルデータブック　アスキー出版
*/

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>

/* パッド1入力レジスタ 04d0 */
/* パッド2入力レジスタ 04d2 */
/* -.COM.TRG2.TRG1.RIGHT.LEFT.BACK.FWD */

/* パッド出力レジスタ 04d6 */
/* 0.0.JOY2COM.JOY1COM.JOY2TRIG2.JOY2TRIG1.JOY1TRIG2.JOY1TRIG1 */

#define ON 1
#define OFF 0
#define CLSTXT() putch('\f')

#define TRG2 32
#define TRG1 16
#define RIGHT 8
#define LEFT  4
#define BACK  2
#define FWD   1
#define PADINP1 0x04d0
#define PADINP2 0x04d2
#define PADCTRL 0x04d6

struct PAD {
	unsigned char sel  ;
	unsigned char run  ;
	unsigned char trg2 ;
	unsigned char trg1 ;
	unsigned char muki ;
} joy1,joy2;

void padinit( void );
void padstat( int n , struct PAD *p );
void wait( void );

void main( void ){
	char f = 1;
	CLSTXT();
	puts( "quit : ESC key." );
	while( f ){
		if( kbhit() ) f = (getch()==0x1b) ? 0 : 1;
		padstat( 1 , &joy1 );
		padstat( 2 , &joy2 );
		if( joy1.trg2 ) puts( "TRG2" );
		if( joy1.trg1 ) puts( "TRG1" );
		if( joy2.trg2 ) puts( "MAUSE BOTAN RIGHT" );
		if( joy2.trg1 ) puts( "MAUSE BOTAN LEFT" );
		if( joy1.sel )  puts( "SELLECT" );
		if( joy1.run )  puts( "RUN" );
		switch ( joy1.muki ) {
		case 1 :
			puts( "FWD" ); break;
		case 3 :
			puts( "RIGHT" ); break;
		case 5 :
			puts( "BACK" ); break;
		case 7 :
			puts( "LEFT" ); break;
		case 2 :
			puts( "FWD + RIGHT" ); break;
		case 4 :
			puts( "RIGHT + BACK" ); break;
		case 6 :
			puts( "BACK + LEFT" ); break;
		case 8 :
			puts( "LEFT + FWD" ); break;
		default:
			break;
		}

		wait();
	}
}

void padstat( int n , struct PAD *p ){
	char ps;
	ps = ~inp( ( n==1 ) ? PADINP1 : PADINP2 );
	p->trg2 = ( ps & TRG2 ) ? ON : OFF ;
	p->trg1 = ( ps & TRG1 ) ? ON : OFF ;
	switch ( ps & 0x0f ) {
	case FWD + BACK:
		p->sel  = ON ; break;
	case LEFT + RIGHT:
		p->run  = ON ; break;
	/* ４方向の処理 */
	case FWD:
		p->muki = 1  ; break;
	case RIGHT:
		p->muki = 3  ; break;
	case BACK:
		p->muki = 5  ; break;
	case LEFT:
		p->muki = 7  ; break;
	/* 斜め方向の処理 */
	case FWD + RIGHT:
		p->muki = 2  ; break;
	case RIGHT + BACK:
		p->muki = 4  ; break;
	case BACK + LEFT:
		p->muki = 6  ; break;
	case LEFT + FWD:
		p->muki = 8  ; break;
	default:
		p->sel = p->run = p->muki = OFF ;
		break;
	}
}

void padinit( void ){
	/* COM を off TRG を on に セットする */
	outp( PADCTRL, 0x0f );
}

void wait( void ){
	/* 時間待ち */
	int t;
	for( t = 0 ; t < 8000 ; t++ )
		t = t;
}
