Japanese
SGL User's ManualPROGRAMMER'S TUTORIAL
BackForward

8-10. Special scrolling function

In addition to the normal scrolling functions, the Sega Saturn has several special scrolling functions. Among these, the SGL library functions support the ASCII scrolling function and the transparent color bit control function.

ASCII scroll

The ASCII scrolling function refers to using data called ASCII cells as character pattern data instead of normal scrolling character pattern data. ASCII cells are so-called ASCII data (ABCDEFG...XYZ) converted into a data format (cell data) that can be used with scrolling, and the figure below illustrates this.

Figure 8-25 ASCII scroll image

●ASCII scroll uses ASCII data as scroll data.
● Half-width alphanumeric characters are displayed consecutively, and the order corresponds to the ASCII code.

In SGL, ASCII cells are stored in VRAM at the system initialization stage.
By using this data when setting the normal scroll function, ASCII scrolling becomes available.

In the system initialization state, the ASCII scroll is configured with 128 cells and 256 colors, and is set to use the normal scroll screen "NBG0". In addition, ASCII scroll data is stored in the following RAM areas.

Character data: 2000H from address 0x25e60000
Map data: 1000H from address 0x25e76000
Palette data: 20H from address 0x25f00000

If for some reason other scroll data is written in the above area, the ASCII scroll will be replaced with that data, so it will be drawn in a different (incorrect) state from the default.

The next sample program (Listing 8-7) draws an ASCII scroll on the TV screen.

Listing 8-7 sample_8_10_1: ASCII scroll

/*------------------------------------------------ ----------------------*/
/* Ascii Scroll */
/*------------------------------------------------ ----------------------*/
#include "sgl.h"
#include "ss_scroll.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();
	} 
}

Flow 8-9 sample_8_10_1: ASCII scroll

transparent color bit

On Sega Saturn, when palette format is selected for scroll color data, the 0th color data in one palette can be made transparent regardless of the originally registered color data.
Transparent color literally refers to a color specification in which the dots specified as transparent color are processed as if they were transparent, and the drawing of scrolls etc. behind the scroll specified as transparent color is given priority. . The figure below illustrates this.

Figure 8-26 Transparent setting image model

To use the transparent color function in SGL, please use the library function “slScrTransparent”.
Scrolling after using the function “slScrTransparent” will be drawn according to the function specification.

[void slScrTransparent ( Uint16 trns_flag );]
If palette format is selected for scroll color data, select whether or not to process the 0th color data in the palette data transparently.
Assign the values in the table below that correspond to the scroll surface on which transparency processing will be performed to the parameters.
Also, by connecting multiple parameters with the or operator "|", it is possible to specify transparent processing for multiple scroll surfaces.

Table 8-21 Parameter substitution value for “slScrTransparent” (trns_flag)
Scroll surface that performs transparency processing
NBG0 NBG1 NBG2 NBG3 RBG0
Assignment value NBG0ON NBG1ON NBG2ON NBG3ON RBG0ON
Note) The above values are defined in “sl_def.h” that comes with the system.

The following sample program (Listing 8-8) actually uses the SGL library function "slScrTransparent" to implement transparent color processing for scrolling.

Listing 8-8 sample_8_10_2: Transparent code control

#include "sgl.h"
#include "ss_scroll.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();
    } 
}

Flow 8-10 sample_8_10_2: Transparent code control

color calculation

With SGL, it is possible to calculate the color data of the top image and second image obtained by comparing the priorities of the sprite and each scroll screen at a specified ratio and display it on the screen.
By using this function, it is possible to draw other scroll surfaces and sprites that are hidden behind a certain scroll so that they gradually emerge.

To perform color calculation processing, you need to take the following steps.

1) Various settings for color calculation processing
Use the function "slColorCalc" to configure various settings for color calculation processing, and use the function "slColorCalcOn" to determine the scroll surface that will be affected by the color calculation.

[void slColorCalc ( Uint16 flag );]
Configure various settings for color calculation processing.

Assign the values shown below that correspond to the color calculation processing control to be used to the parameters.
For details on the parameters, refer to “HARDWARE MANUAL vol.2: VDP2 User's Manual Chapter 12 Color Calculation”.

Figure 8-27 Parameter substitution value (flag) for “slColorCalc”

● ColorCalc substitution value ●
Calculation method: [CC_RATE | CC_ADD] |
Calculation specification image: [CC_TOP | CC_2ND] |
Extended color operation: [CC_EXT] |
Registration surface: [NBG0ON | NBG1ON | NBG2ON | NBG3ON | RBG0ON | LNCLON | SPRON ] |

Note) The above values are defined in “sl_def.h” that comes with the system.

There are two main modes of color calculation.

Add by ratio: Color calculation by specifying the calculation ratio of TOP image and 2ND image (CC_RATE)
Direct addition: Color calculation using simple addition values of TOP image and 2ND image (CC_ADD)

[void slColorCalcOn( Uint16 flag );]
Determines the scroll surface that is affected by color calculation processing.
Assign the values in the table below that correspond to the scroll surface on which you want to perform color calculations to the parameters.
Also, by connecting multiple parameters with the or operator "|", you can specify color calculations for multiple scroll surfaces at the same time.

Table 8-22 Parameter substitution value (flag) for “slColorCalcOn”
Scroll surface that performs color operations
NBG0 NBG1 NBG2 NBG3 RGB0 LNCL SPRITE
Assignment value NBG0ON NBG1ON NBG2ON NBG3ON RBG0ON LNCLON SPRITEON
Note) The values in the table above are defined in “sl_def.h” that comes with the system.

2) Setting color calculation value
For the scroll surfaces for which color calculation settings and registration have been completed, color calculation processing is actually performed by using the functions "slColRateNbg0 to 3", "slColRateRbg0", "slColRateLNCL", and "slColRateBACK" corresponding to each scroll surface. (specified as a ratio).

However, if the addition method is used for color calculation, the ratio specification has no meaning.

[void slColRateNbg0~3( Uint16 rate );]
[void slColRateRbg0( Uint16 rate );]
[void slColRateLNCL( Uint16 rate );]
[void slColRateBACK( Uint16 rate );]
Set the color calculation ratio for each scroll surface specified by the function.
Assign the color calculation ratio (range 0 to 31) used in color calculation to the parameter.
The functions "slColRateNbg0 to 3" are used to set the color calculation ratio for each normal scroll screen, the function "slColRateRbg0" is used for the rotation scroll screen, the function "slColRateLNCL" is used for the line color screen, and the function "slColRateBACK" is used to set the color calculation ratio for the back screen.

A rough summary of the flow of color calculation processing is as follows.

Flow 8-11 Flow of color calculation processing

line color screen

A line color screen is a special scroll screen that is forcibly inserted as the second image of the top image of the specified scroll screen (the image actually drawn on the monitor) and prepared only for color calculations.
On the line color screen, you can set the color for the entire screen or for each line.
Additionally, a set of color RAM address data for the colors used for each line must be stored in the VRAM area as a line color table.

reference
For details on the line color screen, refer to “HARDWARE MANUAL vol.2: Line screen in the VDP2 user's manual”.

To use a line color screen, you need to take the following steps:

1) Line color screen settings
When using the line color screen, you must first specify the line color table in which line color data is stored.
Also, do not forget to store the color data specified in the line color table in the color RAM area.

[void slLineColTable( void *adr );]
Specify the line color table address.
The parameter specifies the address in the VRAM area where the line color table is stored.

If you want to use a single color line color screen, use the function “slLine1ColSet”.

[void slLine1ColSet( void *adr , Uint16 col ) ;]
Line color The screen will be a single color, and the color will also be determined at the same time.

2) Registration of scroll surface
Next, register the scroll surface that will be affected by the line color screen.
Please use the function “slLineColDisp” to register the scroll surface.

[void slLineColDisp( Uint16 flag );]
Determines which scroll plane is affected by the line color screen.
Assign the values in the table below that correspond to the scroll surface you want to register to the parameters.
Also, by connecting multiple parameters with the or operator "|", you can register multiple scroll surfaces at the same time.

Table 8-23 Parameter substitution value (flag) for “slLineColDisp”
Scroll surface to register
NBG0 NBG1 NBG2 NBG3 RBG0
Assignment value NBG0ON NBG1ON NBG2ON NBG3ON RBG0ON
Note) The values in the table above are defined in “sl_def.h” that comes with the system.

3) Color calculation using line color screen
The scroll surface that has been registered using the function "slLineColDisp" can be used in conjunction with the color calculation processing settings described above to perform color calculation processing using line color images.
For color calculation processing, please refer to the previous section "Color calculation".

Flow 8-12 Line color screen processing flow

color offset

In SGL, you can change the color displayed on the screen by adding or subtracting an offset value to the color RAM data of the sprite and each scroll screen (this value itself does not change).
If you want to use the color offset function, you need to follow the steps below.

1) Color offset settings
There are two types of color offset: color offset A and color offset B.
If you want to use the color offset function, you need to register the scroll surface to one of the two color offsets.
Use the functions “slColOffsetOn” and “slColOffsetBUse” to register scrolling.

[void slColOffsetOn( Uint16 flag );]
Register the scroll surface on which you want to use the color offset function.
Assign the values in the table below that correspond to the scroll surface to be registered to the parameters.

[void slColOffsetBUse( Uint16 flag );]
Register the scroll surface on which you want to use color offset B.
Scroll surfaces registered only with the function “slColOffsetOn” use offset A.
Assign the values in the table below that correspond to the scroll surface to be registered to the parameters.

Table 8-24 Parameter substitution values (flag) for “slColOffsetOn” and “slColOffsetBUse”

Scroll surface to register
NBG0 NBG1 NBG2 NBG3 RBG0 BACK SPRITE
Assignment value NBG0ON NBG1ON NBG2ON NBG3ON RBG0ON BACKON SPRON
Note) The values in the table above are defined in “sl_def.h” that comes with the system.

2) Setting the offset value
Each scroll surface that has been registered will be displayed on the screen under the influence of the offset value set in each color offset.
Use the function “slColOffSetA,B” to set the offset value for each color offset.

[void slColOffsetA( Sint16 r , Sint16 g , Sint16 b ) ;]
[void slColOffsetB( Sint16 r , Sint16 g , Sint16 b ) ;]
Set the color offset value for each color offset.
Assign the offset value (signed 9 bits) of each RGB color element to the parameter.
The function "slColOffSetA" is used to set the offset value of color offset A, and the function "slColOffSetB" is used to set the offset value of color offset B.


BackForward
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997