need help

vbt

Staff member
Thanks to the answers about the tile modes I tried to write a simple program using this mode and it worked perfectly :). Now I'm trying to use this mode in SMS plus but I encounter some problems, the tiles are incorrectly displayed. Here is what I did :
Code:
map    = (Uint8 *)SCL_VDP2_VRAM_B0; // map location

cache   = (Uint8 *)SCL_VDP2_VRAM_B1; // tile location (SMS plus converts SMS 

tiles and put them in cache)

... // NBG0 init

SCL_InitConfigTb(&scfg);

scfg.dispenbl   = ON;

scfg.charsize   = SCL_CHAR_SIZE_2X2;

scfg.pnamesize   = SCL_PN1WORD; 

scfg.flip     = SCL_PN_10BIT; 

scfg.platesize   = SCL_PL_SIZE_1X1;

scfg.coltype    = SCL_COL_TYPE_256;

scfg.datatype   = SCL_CELL;

scfg.patnamecontrl = 0x000c;// VRAM B1 

for(i=0;i<4;i++)  scfg.plate_addr[i] = SCL_VDP2_VRAM_B0;

The modifed bg display function :

Code:
void render_bg_sms(int line)

{

  int locked  = 0;

  int v_line  = (line + vdp.reg[9]) % 224;

  int v_row   = (v_line & 7) << 3;

  int hscroll  = ((vdp.reg[0] & 0x40) && (line < 0x10)) ? 0 : (0x100 - vdp.reg[8]);

  int column  = 0;

  word attr;

  word *nt   = (word *)&vdp.vram[vdp.ntab + ((v_line >> 3) << 6)];

  int nt_scroll = (hscroll >> 3);

  int shift   = (hscroll & 7);

  dword atex_mask;

  dword *cache_ptr;

  dword *linebuf_ptr = (dword *)&linebuf[0 - shift];

  

  /* Draw a line of the background */

  if(line%32==0) // VBT : get map only every 32 lines

  for(; column < 32; column ++)

  {

    /* Stop vertical scrolling for leftmost eight columns */

    if((vdp.reg[0] & 0x80) && (!locked) && (column >= 24))

    {

      locked = 1;

      v_row = (line & 7) << 3;

      nt = (word *)&vdp.vram[((vdp.reg[2] << 10) & 0x3800) + ((line >> 3) << 6)];

    }

    /* Get name table attribute word */

    attr = nt[(column + nt_scroll) & 0x1F];

#ifndef LSB_FIRST

    attr = (((attr & 0xFF) << 8) | ((attr & 0xFF00) >> 8));

#endif

// VBT : fill the tile of 32x32

  map[line+column] = ((attr & 0x7FF) << 6) | (v_row);

  }

}

I think there is something wrong in the display fonction and maybe in the init of the NBG0. Maybe it's because of the tile cache of SMS plus ? Anybody has got an idea ?
 
Yeah, it's hard to figure out what's wrong without at least a description of what it looks like... but from a quick proofread I can see:

Code:
if(line%32==0) // VBT : get map only every 32 lines

  for(; column < 32; column ++)

This will mess up raster effects at the very least, since you're not updating scroll/blanking state on each line. For most games this shouldn't be a big deal though...

Code:
/* Stop vertical scrolling for leftmost eight columns */

if((vdp.reg[0] & 0x80) && (!locked) && (column >= 24))

Just a nitpick, but that's the rightmost eight columns (I think it's the comment that's wrong rather than the code ;))
 
Here is a pic of my current problem :

bug.jpg


Don't pay attention on the correct sprite, I've modified SMS plus to use 2 plans (NBG0 : BG in tile mode, NBG1 : sprites in Bitmap mode). Also I've change map assignment and it seems to be a little better : map[line+column] = attr;

to display a simple tile of 32x24 I used this but I didn't manage to reproduce the same way of working :

Code:
for(i=0;i<24;i++) {

	memcpy(map_addr, &map_wb[i*32],32);

	map_addre+= 64;

}
 
I found the solution :D :D :D the charsize was wrong and also my loop :)

The worlking loop looks like this :

(maybe somthing can be improved ?)

Code:
  if(line==0) map=(Uint8 *)SCL_VDP2_VRAM_B0; // VBT : line moved out of this function

  if(line%8==0)

  {

    for(; column < 32; column ++)

    {  /* Get name table attribute word */

      attr = nt[(column + nt_scroll) & 0x1F];

      map[column] = (((attr & 0xFF) << 9) | ((attr & 0xFF00) >> 7));

    }

    map+=64;

  }
 
Here is the pic :) the background is displayed perfectly, I still have to move the sprite part to tile mode too but already on Girigiri the result seems to be interesting :)

PS : there is no more zoom but it's just a detail

bug_corrected.jpg
 
Holy cow! Looking very good. Are you using the Saturn's own tile layers to show the SMS tiles? Such concept fascinates me. It's like emulating an N64 using Glide or something.

Wasn't Stardust trying to do the same?
 
again a problem :blush:

I moved the sprite layer to tile mode, the sprites are displayed (with a bad color but it doesn't matter) but when a tile is displayed I don't manage to clear a tile no more usefull, can someonr help me ? Also I'd like to know what is the use of the lookup table ? I never use it in fact.

Code:
        if (line%8==0)

          map2[xp>>3]=n<<1;  // VBT : set the tile to display

        for(x = start; x < end; x ++)

        {

          /* Source pixel from cache */

          byte sp = cache_ptr[x];

  

          /* Only draw opaque sprite pixels */

          if(sp)

          {

            /* Background pixel from line buffer */

            byte bg = linebuf_ptr[x];

  

            /* Look up result */

//            linebuf_ptr[x] = lut[(bg << 8) | (sp)];

           

            /* Set sprite collision flag */

            if(bg & 0x40) vdp.status |= 0x20;

          }
 
I managed to corect the palette problems by using two palettes but I have a real pb with the two layers :(

Case 1 :

cache = (Uint8 *)SCL_VDP2_VRAM_A1;

cache2 = (Uint8 *)SCL_VDP2_VRAM_B1;

map = (Uint8 *)SCL_VDP2_VRAM_A0;

map2 = (Uint8 *)SCL_VDP2_VRAM_B0;

with config.patnamecontrl = 0x000c;// VRAM B1 ‚̃IƒtƒZƒbƒg for the two layers. In that case, the two layers diplays the same thing whereas the maps are differents !!!

Case 2 :

cache = (Uint8 *)SCL_VDP2_VRAM_A1;

cache2 = (Uint8 *)SCL_VDP2_VRAM_B1;

map = (Uint8 *)SCL_VDP2_VRAM_B0;

map2 = (Uint8 *)SCL_VDP2_VRAM_A0;

with config.patnamecontrl = 0x000c;// VRAM B1 ‚̃IƒtƒZƒbƒg for the two layers. In that case, the first and second layer displays something correctly but some frame later, the sprite layer start to display unwanted tiles (even if I remove all update of the map)

So I'd like to know what is the right way to set layer and also what seems to be correct in the two cases. Finally, I'd like to know how to set config.patnamecontrl I searched in the VDP doc and didn't find something that tell me 0x0c=VRAM_B1 0xXX=VRAM_A1
 
The VDP docs are pretty much 100% low-level stuff, for registers they define the individual bitfields/flags rather than values that you would write to the entire register. You might want to check the SGL Reference Manual.
 
I finally managed to display real Saturn sprites and tile :) but I have a lot of glitches and I have lost the transparency color.

For those who have a commcard you can test this binary :

SMS Plus with tile and sprites

Dega PC : 100 %

SMS Plus Saturn: 48 %

Master Gear Saturn :31 %

Previous SMS Plus Saturn: 25 %
 
Eh Eh, I have made small improvements :

- There are less glitches.Two sprites seem to be mandatory : one to define the system clipping, the second one to define the local coordinates

- Sprite positions are correct on emus and on Saturn

- supports now 8x8 and 8x16 sprites :)

This is a small sample with a game that uses 8x16 sprites

bobble.jpg


Binary for a PAR
 
Back
Top