English
FAQSGLプログラミング関連
戻る進む
FAQ/SGLプログラミング関連

システム



slInitSystemの中では一体どういうことを行なっているの?

Q)
slInitSystem関数は具体的にはどういう操作を行なっているのか教えてください。
設定される値やモードなども合わせて教えて頂けたら、尚 幸いです。

A)
slInitSystem関数では、 引数で指定する内容の他に関数内部で次のような 設定をしています。 この内容以外の設定を行う場合は、それぞれの設定関数で 定する必要があります。

また、slInitSystemは、他のSGL関数で使われる作業領域の確保やイニシャライズ を行なっています。
もし、SGLの関数を使う場合、必ず先にこの関数を実行してください。 slInitSystemを実行する前に、他のSGL関数を実行した場合、 動作は保証できません。

(0) システム変数の初期化
0以外の値が入る場合、以下のデータが入る

(1) スプライト、及び、ポリゴン用のウィンドウサイズ、消失点位置
Left      
: 0
Top       
: 0
Right     
: ScreenXSize - 1
Bottom    
: ScreenYSize - 1
Zlimit    
: 0x7fff
CenterX   
: ScreenXSize / 2
CenterY   
: ScreenYSize / 2
PersAngle 
: 90゜
ZdspLevel 
: 1
ScreenXSize,ScreenYSizeの内容は第一引数の設定によって変わります。

(2) スクロール関係の初期設定
表示されるスクロール面   : NBG0 , NBG1 , RBG0
スクロールのプライオリティ : NBG0 NBG1 NBG2 NBG3 RBG0
              :    7    3    2    1    4
スプライト0        : SPR0
(ポリゴン)のプライオリティ:   6
その他のスプライト     : SPR1〜SPR7
              :          5
スクロールの色数      : 各面とも256色モード
カラーRAMモード     : 1 (32768色中2048色)
VRAM分割        : バンクA、Bともに分割
キャラクタデータ      : NBG0、NBG1 25E60000から
              : RBG0       25E00000から
キャラクタサイズ      : 各面とも8x8ドット
パターンネームデータ    : NBG0    25E76000から
              : NBG1    257E7800から
              : RBG0 PA 25E40000から
              : RBG0 PB 25E50000から
パターンネームサイズ    : NBG0 1ワード
              : セルごとに反転付き10ビットパターンネーム
              : NBG1 及び、RBG0 1ワード
              : 反転無し、12ビットパターンネーム
プレーンサイズ       : 各面とも64x64セル
バック画面カラー      : 25E3FFFE に黒(R=0,G=0,B=0)
回転パラメータ       : 25E3FF00 から
スプライトデータ      : パレットとRGB形式との混在
特殊効果機能        : モザイク、カラーオフセット等使用しない
スプライトタイプ      : scnSPR3
アスキーキャラクタセット  : 0x25e00000(For RBG)、0x25e60000(For NBG)

処理フレーム数を動的に変えたい。

Q)
slDynamicFrameで処理フレーム数を動的に変える方法は?

A)
SGLでslDynamicFrameを使用する際に設定するシステム変数SynchConstは、 常に正の整数が入ります。
slInitSystemの第3引数でマイナスに相当する部分の 処理は、

slDynamicFrame

が受け持ちます。

また、1から-1のようにベースインターバル数が変化しないときは、SynchConstを 設定し直す必要はありません。

(例1)
固定インターバル→不定インターバル

/* 1 int固定から 2 intベース不定モードに切り替える */
extern Uint8 SynchConst; /* signed intではなくunsigned int */
                         /* ^^^^^^            ^^^^^^^^     */
slInitSystem( TV_320x224, NULL, 1 );
        :
        :
/* 不定インターバルモード-2を設定 */
slDynamicFrame( ON );
SynchConst = 2; /* -2ではない */
slSynch();

(例2)
不定インターバル→固定インターバル

/* 1 int不定インターバルから 1 int固定インターバルに変更 */
slInitSystem( TV_320x224, NULL, -1 );
         :
         :
/* 固定インターバルモード 1を設定 */
slDynamicFrame( OFF );
/* SynchConstを変更する必要はない */
slSynch();


slInitSynchとslSynchの違いについて教えてください。

Q)
slInitSynch() および slSynch() について、slInitSynch()とslSynch()では、 具体的には何処が違うのでしょうか?

A)
slInitSynchは次の描画を必ず待ちます。つまり処理落ちが起きている場合、その 処理が終了するまで待ちますが、slSynchでは、処理落ちが発生している場合 直ちに終了し次の処理に進みます。つまりslSynchはコマ落ちを起こすことが あります。


slSynchを使って処理落ちを知るにはどうすれば良いのですか?

Q)
slSynch() を利用している場合は、直前の処理が描画処理単位を越えた場合 コマが落ちてしまいます。
このチェックはどのように行えばよろしいのでしょうか。

A)
まず、slInitSystemの第3引数を負数にしてダイナミックフレームモードに します。

その後slSynchを実行する直前でシステム変数SynchCountを見ます。 SynchCountが負数になっていれば処理が落ちていると分かります。


プログラムをL-RAMに置くとslInitSystemの第3引数が負の時暴走する。

Q)
VDP1のフレームバッファへの書き込み完了を待ってのフレーム切り替えを行ない たいのですが、関数

 slInitSystem(Uint16 TVMode, TEXTURE *txtbl, Sint8 Count)

のパラメータ"Count"(フレーム切り替えカウント)を負の数に変更したところ、 暴走します。
この現象は、LowRamに実行ファイルを配置した場合に発生しています。

A)
実行プログラムはLowRAMには置かないでください。

SGLはLowRAMの転送スピードが遅いことや、SCUがLowRAMの制御外にあることなど からなどから、プログラムをLowRAMに置くことを考えておりません。


Zソート時の処理について。

Q)
SGLにおけるポリゴン・スプライト登録関連の関数群において、 SGLのZソート処理は、どのようなプロセスで行なわれているのでしょうか。

A)
SGLでは、ポリゴンやスプライトの表示の際、通常FIXED型のZ値を引数として 持ちますが、このうち実際のソーティングに使われるのは上位16ビット つまり整数部分だけです。

スプライトやポリゴンをバッファにエントリする際、Z limitと近値限界による クリッピングをZ値の上位16ビットで比較し、その後整数部分の上位8ビットを 用いて1次ソーティングを行います。
さらに同次のポリゴンやスプライトに 関しては、整数部分の下位8ビットを用いて2次ソーティングを行います。
従って小数部分に関しては用いられることはありません。


自由にフレームバッファの切替をしたいのですが?

Q)
SGLで、自前でのフレームバッファの切り替えの方法がありましたら ご教示ください。

A)
残念ながらSGLでは、ユーザ側で任意にフレームバッファを切り替えることは できません。


パレットの指定方法がわかりません。

Q)
スクロール関数slPageNbg0〜3(Rbg0)と、マクロSPR_ATTRIBUTEにおける使用する パレットの指定方法がわかりません。

A)
slPageNbg?に与えるオフセット値はカラーRAM (0x25f00000)からの オフセットアドレスを与えます。

また、SPR_ATTRIBUTEの引数には、カラーRAMの先頭から何色目かという情報 になるので24ビットカラーの時と15ビットカラーの時とでは一色当たりの バウンダリは異なります。したがってアドレスのオフセットとは違います。
例えば、24ビットモードの時256色目はオフセットで、400hですが、 15ビットモードでは、200hです。slPageNbgでは、与える値はそれぞれ、 0x400、0x200ですが、SPR_ATTRIBUTEの場合どちらも256(0x100)です。


描画を待つような処理をしたい。

Q)
SGLでは普通、描画処理が間に合わなかったスプライトは、描画の途中で処理 を中断させていると思いますが、描画終了を待ってフレームを切り替える、 などの制御はできないのでしょうか?

A)
SGLの関数にslInitSystemという関数がありますが、この関数の第三引数に フレーム数の指定があります。これは通常正の数値を入れますがこれに 負の数"-n"を入れたとすると、通常は"n"のフレームベースで動作し、 描画が追いつかないときのみ描画を待つようにすることができます。


CPUの処理を待つような処理はどうやるの?

Q)
SGLにおいて、CPU処理待ちの処理をしたい。

A)
SGLでCPU処理待ちの処理をする場合の方法の一例を挙げます。

  1. slInitSystemの第三引数に考えられる処理の最大数を設定する。
    但し、不定モードのみの対応なので負数で設定する必要がある。

  2. CPUの処理が終わった時点で(slSynch、slInitSynchを呼ぶ直前で) システム変数SynchCountを先にslInitSystemで設定したフレーム数 にする。
    この場合の注意点として、この値を変更する場合に以下の チェックが必要になる。

    1. 割り込みを禁止にする。

    2. VBlank期間中ではないことをチェックする。チェック方法は、 VDP2の画面ステータス(25F80004番地)のビット3のVカウンタ レジスタをチェックする。
      VBlank期間でなければ、上記の変更 処理を行う。VBlank期間中であった場合、c.)の処理を行なっ た後、再度a.)〜c.)の処理を行う。

    3. 割り込みを解除する。

SGLのslSynchやslInitSynchでは、システム変数SynchConstとSynchCount を見て一致する時、次のフレーム処理を行います。そしてSynchCountは 現在のINT数でSynchConstがユーザの指定したINT数です。
つまり この処理によってSGLのシステムをだますことになります。


テクスチャデータの転送をDMAでやるのとforループでやるのとどちらがいいの?

Q)
SGLでスプライトの転送をforループでやるのとDMAでやるのとではどちらが いいのでしょうか。

A)
基本的にはDMAで転送した方がメインプログラムの方に負荷が掛からないため いいと思われます。
但し、CPU DMAは起動時には数クロックのウエイトが入るため、 処理スピードを気にするような場合、データの量によっては、Forループによる メモリコピーの方が早い場合もあります。


戻る進む
FAQSGLプログラミング関連
Copyright SEGA ENTERPRISES, LTD,. 1997