本章では、セガサターンのデータ入力用デバイスの認識法と実際の動作を、セガサターンの代表的な入力用デバイスであるセガサターンPADを用いて解説します。
	セガサターンPADには4つの方向を表す方向キー、ABCXYZの各ボタン、コントローラ上部にあるLRボタン及びスタートボタンが入力装置として存在します。
	これらコントローラの各入力装置を用いて入力されるデータが、どの様にセガサターン内部で判断されているかを、サンプルプログラムと共に解説していきます。
セガサターンで主に使用されるデータ入力用デバイスは、セガサターンPADと呼ばれる、本体付属のコントロールPADです
		セガサターンPADは、4方向を指すように配置された方向キー、スタートボタン、ABCボタン、XYZボタン、LRボタンで構成される入力デバイスです。
図9-1 入力用デバイス例(セガサターンPAD)
	
| 属 性 | 名 称 | 入 力 構 成 | 備 考 | 
|---|---|---|---|
| デジタル | セガサターンPAD | 方向キー、スタート、8ボタン | セガサターン標準パット | 
| セガサターンマウス | XY移動量、スタート、3ボタン | マウス移動量は、絶対値としてデータ格納 | |
| メガドラ3ボタンパット | 方向キー、スタート、3ボタン | セガタップで接続可能 | |
| メガドラ6ボタンパット | 方向キー、スタート、6ボタン | セガタップで接続可能 | |
| アナログ | アナログジョイスティック (ミッションスティック) | 方向レバー、スタート、8ボタン | 移動量は、符号なしA/D出力の絶対値 | 
| 特殊 | セガサターンキーボード | IBMキーボードとの互換性あり | |
| 補助装置 | セガサターン6Pマルチタップ | コネクト数6 | |
| セガタップ | コネクト数4 | メガドラPADの接続に使用 | 
セガサターンPADは次のようなビットの集合として処理されます。
| bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | |
|---|---|---|---|---|---|---|---|---|
| ペリフェラルID | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 
| 1st DATA | → | ← | ↓ | ↑ | Start | A | C | B | 
| 2nd DATA | R | X | Y | Z | L | 1 | 1 | 1 | 
図9-2 セガサターンPADの入力状態ビット配列(16bit表示)
	
図9-3 入力状態ビット列の変化(セガサターンPAD)
● PerDigital構造体の定義内容 ●
typedef struct{		/* デジタルデバイス */
	Uint8	id;	/* ペリフェラルID */
	Uint16	data;	/* 現在のペリフェラルデータ */
	Uint16	push	/* 押されたスイッチのデータ */
	Uint16	pull	/* 離されたスイッチのデータ */
}PerDigital;
	data:16bit長のペリフェラルデータ(現在のビット状態を示す) push:16bit長のペリフェラルデータ(入力が実行された瞬間のみビットを変化させる) pull:16bit長のペリフェラルデータ(入力が解除された瞬間のみビットを変化させる) id :デバイスのペリフェラルIDを示す8bitのデータ列
注意
ペリフェラルに関する詳細は、“HARDWEAR MANUAL vol.1”及びシステム付属のヘッダファイル“sl_def.h”を参照してください。
● パットアサイン ● #define PER_DGT_KR (1<<15) /* 方向キー(→) */ #define PER_DGT_KL (1<<14) /* 方向キー(←) */ #define PER_DGT_KD (1<<13) /* 方向キー(↓) */ #define PER_DGT_KU (1<<12) /* 方向キー(↑) */ #define PER_DGT_ST (1<<11) /* スタートボタン */ #define PER_DGT_TA (1<<10) /* Aボタン */ #define PER_DGT_TC (1<<9) /* Cボタン */ #define PER_DGT_TB (1<<8) /* Bボタン */ #define PER_DGT_TR (1<<7) /* Rトリガー */ #define PER_DGT_TX (1<<6) /* Xボタン */ #define PER_DGT_TY (1<<5) /* Yボタン */ #define PER_DGT_TZ (1<<4) /* Zボタン */ #define PER_DGT_TL (1<<3) /* Lトリガー */
図9-6 パッドアサインの内容(PER_DGT_TAの場合)
	
	
図9-7 アサインデータを用いた入力状態の確認
	
/*----------------------------------------------------------------------*/
/*	Pad Control							*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"
#include	"sega_sys.h"
#define		NBG1_CEL_ADR		( VDP2_VRAM_B1 + 0x02000 )
#define		NBG1_MAP_ADR		( VDP2_VRAM_B1 + 0x12000 )
#define		NBG1_COL_ADR		( VDP2_COLRAM + 0x00200 )
#define		BACK_COL_ADR		( VDP2_VRAM_A1 + 0x1fffe )
#define		PAD_NUM			13
static Uint16 pad_asign[] = {
	PER_DGT_KU,
	PER_DGT_KD,
	PER_DGT_KR,
	PER_DGT_KL,
	PER_DGT_TA,
	PER_DGT_TB,
	PER_DGT_TC,
	PER_DGT_ST,
	PER_DGT_TX,
	PER_DGT_TY,
	PER_DGT_TZ,
	PER_DGT_TR,
	PER_DGT_TL,
};
extern pad_cel[];
extern pad_map[];
extern pad_pal[];
extern TEXTURE tex_spr[];
extern PICTURE pic_spr[];
extern FIXED stat[][XYZS];
extern SPR_ATTR attr[];
extern ANGLE angz[];
static void set_sprite(PICTURE *pcptr , Uint32 NbPicture)
{
	TEXTURE *txptr;
 
	for(; NbPicture-- > 0; pcptr++){
		txptr = tex_spr + pcptr->texno;
		slDMACopy((void *)pcptr->pcsrc,
			(void *)(SpriteVRAM + ((txptr->CGadr) << 3)),
			(Uint32)((txptr->Hsize * txptr->Vsize * 4) >> (pcptr->cmode)));
	}
}
static void disp_sprite()
{
	static Sint32 i;
	Uint16 data;
	if(!Per_Connect1) return;
	data = Smpc_Peripheral[0].data;
	for(i=0;i<PAD_NUM;i++){
		if((data & pad_asign[i])==0){
			slDispSprite((FIXED *)stat[i],
				(SPR_ATTR *)(&attr[i].texno),(ANGLE)angz[i]);
		}
	}
}
void ss_main(void)
{
	slInitSystem(TV_320x224,tex_spr,1);
	slTVOff();
	set_sprite(pic_spr,1);
	slPrint("Sample program 9.1" , slLocate(9,2));
	
	slColRAMMode(CRM16_1024);
	slBack1ColSet((void *)BACK_COL_ADR , 0);
	slCharNbg1(COL_TYPE_256 , CHAR_SIZE_1x1);
	slPageNbg1((void *)NBG1_CEL_ADR , 0 , PNB_1WORD|CN_12BIT);
	slPlaneNbg1(PL_SIZE_1x1);
	slMapNbg1((void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR);
	Cel2VRAM(pad_cel , (void *)NBG1_CEL_ADR , 483*64);
	Map2VRAM(pad_map , (void *)NBG1_MAP_ADR , 32 , 19 , 1 , 256);
	Pal2CRAM(pad_pal , (void *)NBG1_COL_ADR , 256);
	slScrPosNbg1(toFIXED(-32.0) , toFIXED(-36.0));
	slScrAutoDisp(NBG0ON | NBG1ON);
	slTVOn();
	
	while(1) {
		disp_sprite();
		slSynch();
	} 
}
	
| 転 送 先 | ||||
|---|---|---|---|---|
| インクリメント | デクリメント | 固定 | ||
| 転 送 元 | インクリメント | Sinc_Dinc_Byte | Sinc_Ddec_Byte | Sinc_Dfix_Byte | 
| デクリメント | Sdec_Dinc_Byte | 禁止 | Sdec_Dfix_Byte | |
| 固定 | Sfix_Dinc_Byte | Sfix_Ddec_Byte | 禁止 | |
| 関数型 | 関 数 名 | パ ラ メ ー タ | 機 能 | 
|---|---|---|---|
| void | slDispSprite | FIXED *pos,ATTR *atrb,ANGLE Zrot | 位置・スケール・表示角を指定してスプライト表示 | 
| void | slPutSprite | FIXED *pos,ATTR *atrb,ANGLE Zrot | 透視変換に合わせてスプライト表示 | 
| void | slSetSprite | SPRITE *parms,FIXED Zpos | スプライトデータをハードウェアに転送するためのバッファにセット | 
| void | slDMACopy | void *src,void *dst,Uint32 cnt | AからBにCだけDMA転送(同一バス転送可能) | 
| void | slDMAWait | void | DMA転送終了するまで待機 | 
| void | slDMAXCopy | void *src,void *dst,Uint32 cnt,Uint16 mode | AからBにCだけDの転送モードでDMA転送(同一バス転送可能) |