■機 能
- ●システムマネージメント系
- システムマネージメント系には以下の機能があります。
機 能イントバック非イントバック | | |
マスタSH2 ON | × | ○ |
スレーブSH2 ON | × | ○ |
スレーブSH2 OFF | × | ○ |
サウンドON | × | ○ |
サウンドOFF | × | ○ |
CD ON | × | ○ |
CD OFF | × | ○ |
システム全体リセット | × | ○ |
NMIリクエスト | × | ○ |
ホットリセットイネーブル | × | ○ |
ホットリセットディセーブル | × | ○ |
カートリッジコード取得 | ○ | × |
エリアコード取得 | ○ | × |
システムステータス取得 | ○ | × |
SMPCメモリ設定 | × | ○ |
SMPCメモリ取得 | ○ | × |
時刻設定 | × | ○ |
時刻取得 | ○ | × |
-
- ●ペリフェラルコントロール系
- ライブラリでは以下のペリフェラルをサポートしています。
ゲーム機ペリフェラル名称 | |
サターンペリフェラル | デジタルデバイス |
アナログデバイス |
ポインティングデバイス(マウス) |
キーボード |
マルチタップ(6P) |
メガドライブペリフェラル | 3ボタンPAD |
6ボタンPAD |
4Pアダプタ |
マウス |
- ●ライブラリ未対応ペリフェラル
- 以下のペリフェラルは、本ライブラリではサポートしません。
詳細はそれぞれに関するドキュメントを参照してください。
バーチャガン→参照:Developer's Information STN-41
音声認識→専用ライブラリを追加(リリース時期は未定)
■処理
- ●非イントバックコマンド発行
- 非イントバック系の処理です。
- ●イントバックコマンド発行
- システムデータ取得(時刻を除く)
- ペリフェラルデータ取得、時刻データ取得
毎フレーム必要な処理です。
- ●推奨例
- 次の3パターンについて推奨例を示します。
- パターン1
イントバック初期化(3)→ペリフェラルデータ取得+時刻データ取得
- パターン2
非イントバックコマンド発行→イントバック初期化(2)→ペリフェラルデータ取得
- パターン3
イントバック初期化(1)→システムデータ取得→イントバック初期化(3)
→ペリフェラルデータ取得+時刻データ取得
- ●図の説明
- メイン処理
- イントバック初期化(1):システムデータ取得を指定
- イントバック初期化(2):ペリフェラルデータ取得を指定
- イントバック初期化(3):ペリフェラルデータ取得+時刻データ取得を指定
- SMPC処理
- (1):システムデータ収集処理
- (2):ペリフェラルデータ収集処理
- (3):時刻データ収集処理
- (1)パターン1
- ※ゲームフレームが1フレームの場合
- ※ゲームフレームが2フレームの場合
- ペリフェラルデータ取得*はペリフェラルデータの取得は行いません。
- (2)パターン2
- (3)パターン3
- ●制限事項
- <<全コマンド共通>>
- V-BLANK IN後から300μsまではコマンドを発行しないでください。
- イントバックコマンド発行から次のV-BLANK INまではコマンド発行しないでください。
- 複数タスクでの実行の注意
複数のタスクでライブラリを使用するとき、割り込みタスクを切り替えた場合、ライブラリではSMPCの排他制御を行っていないため、SMPCがデッドロックを起こしたり、SMPCの動作が不正になる場合があります。
従って、複数タスクで実行する場合は、ライブラリの排他制御をユーザ側で別途行う必要があります。
- スレーブSH2からの制限はSMPCユーザーズマニュアルをご覧ください。
- 1秒に1回のSMPC内部処理によりコマンド処理時間が20μS〜100μs変化する場合があります。
- <<非イントバックコマンド発行関数>>
-
- <<イントバックコマンド発行関数>>
- システムデータ取得(時刻を除く)
- ペリフェラルデータ取得、時刻データ取得
- イントバックコマンド発行から次のV-BLANK INまではコマンド発行しないでください。
- 指示したV-BLANK INの14ms以前にイントバックコマンド発行してください。
- SMPC内のペリフェラルデータ収集処理は1回の垂直表示期間中に行います。
- イントバックコマンド発行から指示したV-BLANK INまでに取得することの出来なかった(タイムアウト)データをそれ以降取得することはできません。
- タイムアウトが頻繁に発生すると、ペリフェラルを未接続として扱います。
- SMPCではペリフェラルの取得終了を指定したV-BLANK INの手前1msになるようにペリフェラル取得を開始します。
- V-BLANK INスキップ数
V-BLANK INスキップ数は、イントバックコマンド発行後のSMPC内ペリフェラルデータ収集処理の実行タイミングを指示します。
2フレーム以上でフレームチェンジをするゲームのために用意しています。
イントバックコマンド発行後の(V-BLANK INスキップ数+1)回目のV-BLANK INの手前のV-DISP中にSMPC内ペリフェラルデータ収集処理を実行します。
イントバックコマンド発行直後のV-BLANK INに実行する場合は0を設定してください。
■ペリフェラルコントロール
- ペリフェラルコントロールは、ゲーム作成基準に沿うように作成する必要があります。
本ライブラリは、接続されたペリフェラルのデータ加工処理は行いません。
未対応ペリフェラル(バーチャガン)のチェックや、通常ペリフェラルの接続・未接続チェックといった作業は、全てアプリケーション側で行います。
- ●方針
- ペリフェラル取得処理はユーザへの柔軟な対応のため以下の方針で作成しています。
- 今後発売されるペリフェラルに出来る限り対応する。
- 障害対策を行う。
- ●方式
- ライブラリ初期化時の入力指定には次の項目を指定します。
- (1)取得するペリフェラル数 (2)取得するデータサイズ
- (例)
- <入力指定値>
- 取得するペリフェラル数 = 9
- 取得するデータサイズ = 3
- <接続状態>
- 本体コネクタ1= シャトルマウス
- 本体コネクタ2= マルチターミナル6
- マルチタップコネクタ1=サターン標準PAD
- マルチタップコネクタ2=未接続
- マルチタップコネクタ3=ミッションスティック
- マルチタップコネクタ4=未接続
- マルチタップコネクタ5=未接続
- マルチタップコネクタ6=サターンキーボード
- <出力1:ペリフェラルデータ出力>
- ライブラリは、ペリフェラルID→ペリフェラルタイプ+データサイズ に分割して出力します。
No. | ペリフェラルタイプ | データサイズ | ペリフェラルデータ(有効バイト数) |
0 | ポインティング | 3 | 取得データ(3) |
1 | デジタル | 2 | 取得データ(2) |
2 | 未接続 | 未接続 | 不定値 |
3 | アナログ | 5 | 取得データ(3) |
4 | 未接続 | 未接続 | 不定値 |
5 | 未接続 | 未接続 | 不定値 |
6 | キーボード | 3 | 取得データ(3) |
7 | 不定値 | 不定値 | 不定値 |
8 | 不定値 | 不定値 | 不定値 |
- <出力2:マルチタップ情報データ出力>
| マルチタップID | マルチタップコネクタ数 |
本体端子1 | 直接接続 | 1 |
本体端子2 | マルチタップ接続 | 6 |
■コーリングシーケンス
- 推奨例のパターン(3)のコーリングシーケンス
#difine GET_NUM (9) /* 取得したいペリフェラルデータの数 */
#difine GET_SIZE (4) /* 対応するペリフェラルの、データサイズの最大値 */
#define WORKSIZE (GET_NUM * (GET_SIZE + 2) * 2) + GET_SIZE) /* ワークサイズ */
Uint32 work[WORKSIZE / 4]; /* ペリフェラルデータ取得ワーク領域 */
/* 注意:必ずグローバル変数で定義する事 */
typedef struct {
Uint8 type;
Uint8 size;
Uint16 data;
Uint8 extend_data[(GET_SIZE - 2)];
}PeriData;
PerGetSys *sys_data; /* システムデータ */
PeriData *get_per; /* ペリフェラル出力データポインタ */
PerMulInfo *mul_info;
Uint8 *get_tim; /* 時刻出力データポインタ */
●イントバック初期化(1)(V-BLANK OUT処理直後)
PER_LInit(PER_KD_SYS, 0, 0, 0, NULL, 0); /* システムデータ取得を指定 */
...
●イントバック初期化(3)(V-BLANK OUT処理直後)
sys_data = PER_GET_SYS(); /* システムデータ取得 */
PER_LInit(PER_KD_PERTIM, GET_NUM, GET_SIZE, work, 0);
/* ペリフェラルデータ + 時刻データ取得を指定. V-BLANKスキップ数は0 */
set_imask(0xF); /* 割込み全禁止 */
INT_SetScuFunc(INT_MSK_VBLK_OUT, vblank_out ); /* V-BLANK_OUT割込み関数を登録 */
INT_ChgMsk(INT_MSK_VBLK_OUT, INT_MSK_NULL); /* V-BLANK_OUT割込みイネーブル */
set_imask(0); /* 割込み全有効 */
...
●通常時、MAIN-LOOP内処理(V-BLANK OUT処理直後)
...
get_tim = PER_GET_TIM(); /* 時刻取得 */
if((mul_info[0].con + mul_info[1]) >= 3 ){ /* 有効端子数のチェック */
if( (get_per[2].id != PER_ID_NCON_UNKNOWN) && /* 未接続チェック */
(get_per[2].id != PER_ID_PNT) ){ /* 非マウス チェック */
if(((get_per[2].data) & PER_DGT_U) == PER_DGT_U){
/* コネクタ3の現在ペリフェラルデータがUPか? */
...
●通常2回目以降の、V-BLANK OUT割込み処理
void vblank_out(void){
SCL_VblankEnd(); /* フレームバッファ切換を最優先に行う事 */
PER_LGetPer((PerGetPer **)&get_per, &mul_info); /* ペリフェラルデータ取得 */
}