how and when to invert sprite virtically ?

Discuss emulation of the Nintendo Entertainment System and Famicom.

Moderator: Moderators

Post Reply
mattmatteh
Posts: 345
Joined: Fri Jul 29, 2005 3:40 pm
Location: near chicago
Contact:

how and when to invert sprite virtically ?

Post by mattmatteh » Wed Jan 17, 2007 10:11 pm

how and when do i invert sprites vertically ? (sprite_attribute & 0x80)

matt

User avatar
Disch
Posts: 1849
Joined: Wed Nov 10, 2004 6:47 pm

Post by Disch » Wed Jan 17, 2007 10:30 pm

When the sprite is evaluated -- the attributes are fetched first to see if they're to be flipped vertically.

The 'normal' CHR is determined by the subtraction of the current scanline and the sprite Y coord (also used to determine whether or not the sprite is in-range). Ex:

Code: Select all

u16 is_in_range = current_scanline - sprite_Y;
if(is_in_range < 8)
{
  // sprite is in range
  //  fetch CHR according to is_in_range
  //  ie:  if is_in_range == 5, CHR comes from $xxx5 and $xxxD
}
To flip vertically -- simply XOR is_in_range with $7 (8x8 sprites) or $F (8x16 sprites) after the sprite is found to be in range.

User avatar
blargg
Posts: 3715
Joined: Mon Sep 27, 2004 8:33 am
Location: Central Texas, USA
Contact:

Post by blargg » Thu Jan 18, 2007 10:24 am

In case anyone misses it, Disch is using a trick of unsigned values in the comparison with 8. These are equivalent:

Code: Select all

unsigned n = current_scanline - sprite_y;
if ( n < 8 )
    ...

int n = current_scanline - sprite_y;
if ( n >= 0 && n < 8 )
    ...
This works because a negative value converted to unsigned becomes a large positive value. It's a good trick to learn.

User avatar
Zepper
Formerly Fx3
Posts: 3190
Joined: Fri Nov 12, 2004 4:59 pm
Location: Brazil
Contact:

Post by Zepper » Thu Jan 18, 2007 3:27 pm

There's a detail which I handle inside the own rendering core: the PPU clipping. So, instead of ">= 0" I use ">= ppu_clip_sprites", 0 or 8.

User avatar
Disch
Posts: 1849
Joined: Wed Nov 10, 2004 6:47 pm

Post by Disch » Fri Jan 19, 2007 9:29 pm

I think you're mixing up sprite clipping with in-range evaluations.

User avatar
Zepper
Formerly Fx3
Posts: 3190
Joined: Fri Nov 12, 2004 4:59 pm
Location: Brazil
Contact:

Post by Zepper » Sat Jan 20, 2007 5:49 am

I guess so... :lol:
Anyway, thanks for the unsigned tip.

Post Reply