本章では、セガサターンのデータ入力用デバイスの認識法と実際の動作を、セガサターンの代表的な入力用デバイスであるセガサターン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転送(同一バス転送可能) |