English
SGL User's ManualPROGRAMMER'S TUTORIAL
戻る進む

8-10. 特殊なスクロール機能

 セガサターンには、通常のスクロール機能に加え、幾つかの特殊なスクロールが用意されています。SGLライブラリ関数では、これらの内、ASCIIスクロール機能、透明カラービットの制御機能をサポートしています。

ASCIIスクロール

 ASCIIスクロール機能とは、通常のスクロール用キャラクタパターンデータの代わりに、ASCIIセルと呼ばれるデータをキャラクタパターンデータとして使用することをいいます。ASCIIセルとは、いわゆるASCIIデータ(ABCDEFG・・・・・・XYZ)を、 スクロールで使用可能なデータ形式(セルデータ)に変換したもので、これを図解したものが下図になります。

図8-25 ASCIIスクロールイメージ

●ASCIIスクロールは、スクロールデータとして、ASCIIデータを使用しています。
●半角英数字が連続して表示され、順番はASCIIコードに対応します。

 SGLでは、ASCIIセルを、システム初期化の段階でVRAM中に格納しています。
このデータを、通常のスクロール機能設定時に使用することで、ASCIIスクロールが使用可能になります。

 ASCIIスクロールはシステム初期化状態で、128セル・256色で構成され、ノーマルスクロール画面“NBG0”を使用するように設定されています。 また、ASCIIスクロールデータは、それぞれ次のRAM領域中に格納されています。

キャラクタデータ:0x25e60000番地から2000H
マップデータ  :0x25e76000番地から1000H
パレットデータ :0x25f00000番地から20H

何らかの事情により上記領域中に他のスクロールデータを書き込んでしまった場合は、ASCIIスクロールはそれらのデータに置き換えられるため、デフォルトとは異なった(正しくない)状態で描画されます。

 次のサンプルプログラム(リスト8-7)は、TV画面にASCIIスクロールを描画させたものです。

リスト8-7 sample_8_10_1:ASCIIスクロール

/*----------------------------------------------------------------------*/
/*	Ascii Scroll							*/
/*----------------------------------------------------------------------*/
#include	"sgl.h"
#include	"ss_scrol.h"

#define		NBG1_CEL_ADR		VDP2_VRAM_B1
#define		NBG1_MAP_ADR		( VDP2_VRAM_B1 + 0x18000 )
#define		NBG1_COL_ADR		VDP2_COLRAM
#define		BACK_COL_ADR		( VDP2_VRAM_A1 + 0x1fffe )

void ss_main(void)
{
	FIXED ascii_posx = SIPOSX , ascii_posy = SIPOSY;

	slInitSystem(TV_320x224,NULL,1);
        slTVOff();
	slPrint("Sample program 8.10.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_10BIT);
	slPlaneNbg1(PL_SIZE_1x1);
	slMapNbg1((void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR);
	Map2VRAM(ascii_map ,(void *)NBG1_MAP_ADR , 32 , 4 , 0 , 0);

	slScrAutoDisp(NBG0ON | NBG1ON);
	slTVOn();

	while(1) {
		slScrPosNbg1(ascii_posx , ascii_posy);
		ascii_posx += POSX_UP;
		slSynch();
	} 
}

フロー8-9 sample_8_10_1:ASCIIスクロール

透明カラービット

 セガサターンでは、スクロール・カラーデータにパレット形式を選択している場合、1パレット中の0番目のカラーデータを、本来登録されているカラーデータに関係なく、透明色にすることができます。
透明色というのは、文字通り、透明色指定されたドット部分が透明であるかのような処理を行い、透明色指定されたスクロールの背後にあるスクロールなどの描画を優先して行う色指定のことをいいます。これを図解したものが下図になります。

<図8-26 透明設定イメージモデル>

 SGLで透明カラー機能を使用するには、ライブラリ関数“slScrTransparent”を使用してください。
関数“slScrTransparent”使用以後のスクロールは、関数指定に従い描画されます。

【void slScrTransparent ( Uint16 trns_flag ) ;】
 スクロール・カラーデータにパレット形式を選択している場合、パレットデータ中の0番目のカラーデータを透明処理するか、しないかの選択を行います。
パラメータには透明処理を実行するスクロール面に対応した下表の値を代入します。
また、複数のパラメータをor演算子“|”で連結することで、複数のスクロール面の透明処理指定が可能になります。

表8-21 “slScrTransparent”のパラメータ代入値(trns_flag)
透明処理を実行するスクロール面
NBG0NBG1NBG2NBG3RBG0
代 入 値NBG0ONNBG1ONNBG2ONNBG3ONRBG0ON
注)上記の値は、システム付属の“sl_def.h”で定義されています。

 次のサンプルプログラム(リスト8-8)は、SGLライブラリ関数“slScrTransparent”を実際に使用してスクロールの透明カラー処理を実現したものです。

リスト8-8 sample_8_10_2:透明コードの制御

#include        "sgl.h"
#include        "ss_scrol.h"

#define	        NBG1_CEL_ADR              VDP2_VRAM_B0
#define	        NBG1_MAP_ADR            ( VDP2_VRAM_B0 + 0x10000 )
#define         NBG1_COL_ADR            ( VDP2_COLRAM  + 0x00200 )
#define	        NBG2_CEL_ADR            ( VDP2_VRAM_B1 + 0x02000 )
#define	        NBG2_MAP_ADR            ( VDP2_VRAM_B1 + 0x12000 )
#define         NBG2_COL_ADR            ( VDP2_COLRAM  + 0x00400 )
#define         BACK_COL_ADR            ( VDP2_VRAM_A1 + 0x1fffe )

void ss_main(void)
{
    Uint16  trns_flg = NBG1ON ;
    FIXED   yama_posx = SIPOSX , yama_posy = SIPOSY ;
    FIXED   am2_posx  = SIPOSX , am2_posy  = SIPOSY ;
    
    slInitSystem(TV_320x224,NULL,1);
    slTVOff();
    slPrint("Sample program 8.10.2" , 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_10BIT);
    slPlaneNbg1(PL_SIZE_1x1);
    slMapNbg1((void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR , (void *)NBG1_MAP_ADR);
    Cel2VRAM(am2_cel , (void *)NBG1_CEL_ADR , 16000) ;
    Map2VRAM(am2_map , (void *)NBG1_MAP_ADR , 32 , 32 , 1 , 0) ;
    Pal2CRAM(am2_pal , (void *)NBG1_COL_ADR , 256) ;

    slCharNbg2(COL_TYPE_256 , CHAR_SIZE_1x1) ;
    slPageNbg2((void *)NBG2_CEL_ADR , 0 , PNB_1WORD|CN_12BIT);
    slPlaneNbg2(PL_SIZE_1x1);
    slMapNbg2((void *)NBG2_MAP_ADR , (void *)NBG2_MAP_ADR , (void *)NBG2_MAP_ADR , (void *)NBG2_MAP_ADR);
    Cel2VRAM(yama_cel , (void *)NBG2_CEL_ADR , 31808) ;
    Map2VRAM(yama_map , (void *)NBG2_MAP_ADR , 32 , 16 , 2 , 256) ;
    Pal2CRAM(yama_pal , (void *)NBG2_COL_ADR , 256) ;

    slScrPosNbg2(yama_posx , yama_posy) ;
    slScrPosNbg1(am2_posx  , am2_posy) ;
    slScrTransparent(trns_flg) ;

    slScrAutoDisp(NBG0ON | NBG1ON | NBG2ON) ;
    slTVOn();

    while(1)
    {
        if(yama_posx >= (SX + SIPOSX))
        {
            if(trns_flg == NBG1ON)
                trns_flg = 0 ;
            else
                trns_flg = NBG1ON ;
            yama_posx = SIPOSX ;
            slScrTransparent(trns_flg) ;
        }

	slScrPosNbg2(yama_posx , yama_posy) ;
	yama_posx += POSX_UP ;

	slScrPosNbg1(am2_posx , am2_posy) ;
	am2_posy += POSY_UP ;

	slSynch();
    } 
}

フロー8-10 sample_8_10_2:透明コードの制御

カラー演算

 SGLでは、スプライトと各スクロール画面のプライオリティを比較して得た、トップ画像とセカンド画像のカラーデータを指定された割合で演算し画面に表示することが可能です。
この機能を使用することにより、あるスクロールの背面に隠れて配置されている他のスクロール面やスプライトを徐々に浮き上がらせるようにして描画させたりすることが可能になります。

 カラー演算処理を行うには次の手順を踏む必要があります。

1)カラー演算処理の諸設定
 関数“slColorCalc”を使用してカラー演算処理の諸設定を行い、関数“slColorCalcOn”を使用して、カラー演算の影響を受けるスクロール面を決定します。

【void slColorCalc ( Uint16 flag ) ;】
 カラー演算処理の諸設定を行います。

 パラメータには、使用するカラー演算処理制御に対応した下図の値を代入します。
パラメータの詳細は、“HARDWARE MANUAL vol.2 : VDP2 ユーザーズマニュアル第12章カラー演算”を参照してください。

図8-27 “slColorCalc”のパラメータ代入値(flag)

● ColorCalc代入値 ●
演算方法    :[CC_RATE | CC_ADD] |
演算指定画像  :[CC_TOP  | CC_2ND] |
拡張カラー演算 :[CC_EXT  ] |
登録面     :[NBG0ON | NBG1ON | NBG2ON | NBG3ON | RBG0ON  | LNCLON | SPRON ] |

注)上記の値は、システム付属の“sl_def.h”で定義されています。

 カラー演算には大きく分けて2つのモードが存在します。

割合で加算 :TOP画像と2ND画像の演算比率を指定してカラー演算(CC_RATE)
そのまま加算:TOP画像と2ND画像の単純な加算値でカラー演算(CC_ADD)

【void slColorCalcOn( Uint16 flag ) ;】
 カラー演算処理の影響を受けるスクロール面を決定します。
パラメータには、カラー演算を実行したいスクロール面に対応した下表の値を代入してください。
また、複数のパラメータをor演算子“|”で連結することで、同時に複数のスクロール面に対するカラー演算指定を行うことができます。

表8-22 “slColorCalcOn”のパラメータ代入値(flag)
カラー演算を実行するスクロール面
NBG0NBG1NBG2NBG3RGB0LNCLSPRITE
代 入 値NBG0ONNBG1ONNBG2ONNBG3ONRBG0ONLNCLONSPRITEON
注)上表の値は、システム付属の“sl_def.h”で定義されています。

2)カラー演算値の設定
 カラー演算の諸設定と登録を済んだスクロール面は、各スクロール面に対応した関数“slColRateNbg0〜3”、“slColRateRbg0”、“slColRateLNCL”、“slColRateBACK”を使用することにより実際にカラー演算処理を実行することができます(比率で指定)。

 ただし、カラー演算に加算方式を採択している場合は、比率指定は意味を持ちません。

【void slColRateNbg0〜3( Uint16 rate ) ;】
【void slColRateRbg0( Uint16 rate ) ;】
【void slColRateLNCL( Uint16 rate ) ;】
【void slColRateBACK( Uint16 rate ) ;】
 関数の指定する各スクロール面に対して、カラー演算比率を設定します。
パラメータにはカラー演算で使用するカラー演算比率(0〜31の範囲)を代入します。
関数“slColRateNbg0〜3”は各ノーマルスクロール画面、関数“slColRateRbg0”は回転スクロール画面、関数“slColRateLNCL”はラインカラー画面、関数“slColRateBACK”はバック画面のカラー演算比率の設定に使用します。

 カラー演算処理の流れを大まかにまとめると次のようになります。

フロー8-11 カラー演算処理の流れ

ラインカラー画面

 ラインカラー画面とは、指定されたスクロール面のトップ画像(実際にモニターに描画される画像)のセカンド画像として強制的に挿入し、カラー演算を行うためだけに用意された特別なスクロール面です。
ラインカラー画面は、画面全体または各ライン毎に色の設定が行えます。
また、各ライン単位で使用されるカラーのカラーRAMアドレスデータの集合を、ラインカラーテーブルとしてVRAM領域中に格納する必要があります。

参照
ラインカラー画面の詳細は、“HARDWARE MANUAL vol.2:VDP2 ユーザーズマニュアルのライン画面”を参照してください。

 ラインカラー画面の使用には、次の手順を踏む必要があります。

1)ラインカラー画面の設定
 ラインカラー画面を使用する場合、最初に、ラインカラーデータの格納されるラインカラーテーブルを指定してやる必要があります。
また、ラインカラーテーブルで指定されるカラーデータをカラーRAM領域中に格納しておくのを忘れないでください。

【void slLineColTable( void *adr ) ;】
 ラインカラーテーブルアドレスを指定します。
パラメータには、ラインカラーテーブルが格納されるVRAM領域中のアドレスを指定します。

 ラインカラー画面を単色使用したい場合は、関数“slLine1ColSet”を使用してください。

【void slLine1ColSet( void *adr , Uint16 col ) ;】
 ラインカラー画面を単色とし、そのカラーも同時に決定します。

2)スクロール面の登録
 次に、ラインカラー画面の影響を受けるスクロール面を登録します。
スクロール面の登録には、関数“slLineColDisp”を使用してください。

【void slLineColDisp( Uint16 flag ) ;】
 ラインカラー画面の影響を受けるスクロール面を決定します。
パラメータには、登録したいスクロール面に対応した下表の値を代入してください。
また、複数のパラメータをor演算子“|”で連結することで、同時に複数のスクロール面の登録を行うことができます。

表8-23 “slLineColDisp”のパラメータ代入値(flag)
登録するスクロール面
NBG0NBG1NBG2NBG3RBG0
代 入 値NBG0ONNBG1ONNBG2ONNBG3ONRBG0ON
注)上表の値は、システム付属の“sl_def.h”で定義されています。

3)ラインカラー画面を用いたカラー演算
 関数“slLineColDisp”で登録を終了したスクロール面は、前述したカラー演算処理の各設定と共に使用することで、ラインカラー画を使用したカラー演算処理を実行できます。
カラー演算処理については、前項“カラー演算”を参照してください。

フロー8-12 ラインカラー画面処理の流れ

カラーオフセット

 SGLでは、スプライト及び各スクロール画面のカラーRAMデータ(この値自体は変わらない)にオフセット値を加算または減算することで、画面に表示するカラーを変化させることができます。
カラーオフセット機能を使用したい場合は以下の手順を踏む必要があります。

1)カラーオフセットの諸設定
 カラーオフセットには、カラーオフセットA・Bの2種類があります。
カラーオフセット機能を使用したいスクロール面は、2つのカラーオフセットの内のいずれか一方にスクロール面を登録してやる必要があります。
スクロールの登録には、関数“slColOffsetOn”“slColOffsetBUse”を使用します。

【void slColOffsetOn( Uint16 flag ) ;】
 カラーオフセット機能を使用したいスクロール面を登録します。
パラメータには登録するスクロール面に対応した下表の値を代入します。

【void slColOffsetBUse( Uint16 flag ) ;】
 カラーオフセットBを使用したいスクロール面を登録します。
関数“slColOffsetOn”のみで登録されたスクロール面はオフセットAを使用します。
パラメータには登録するスクロール面に対応した下表の値を代入します。

表8-24 “slColOffsetOn”,“slColOffsetBUse”のパラメータ代入値(flag)

 登録するスクロール面
 NBG0  NBG1  NBG2  NBG3  RBG0  BACK  SPRITE 
代 入 値NBG0ONNBG1ONNBG2ONNBG3ONRBG0ONBACKONSPRON
注)上表の値は、システム付属の“sl_def.h”で定義されています。

2)オフセット値の設定
 登録を終えた各スクロール面は、それぞれのカラーオフセットで設定されたオフセット値の影響を受けて画面に表示されます。
各カラーオフセットのオフセット値の設定には、関数“slColOffSetA,B”を使用します。

【void slColOffsetA( Sint16 r , Sint16 g , Sint16 b ) ;】
【void slColOffsetB( Sint16 r , Sint16 g , Sint16 b ) ;】
 各カラーオフセットの、カラーオフセット値を設定します。
パラメータには、RGB各色要素のオフセット値(符号付9ビット)を代入します。
関数“slColOffSetA”はカラーオフセットAのオフセット値の設定に、関数“slColOffSetB”はカラーオフセットBのオフセット値の設定に使用します。


戻る進む
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997