Day 17 - The Sprite Attribute Byte

Published: 2005-07-22
Updated: 2010-12-19
Author: Mike Huber

The What?

The Sprite Attribute Byte (SAB) is the third (of 4bytes) byte that you write to OAM (SPR-RAM). This byte controls several (4) things including:

Bits 0-1
2 Bits of the sprites colors. Will be discussed at a later time.
Bits 2-4
UNUSED.
Bit #5
0 = Sprite in front or 1 = Sprite in back of BG.
Bit #6
1 = Flip horizontally.
Bit #7
1 = Flip vertically.

See's see how to do this!

Gettin' Goin'

When I demonstrate each bit (with code peices) I'll give 2 pieces, of code, one for the $2003/$2004 method and one for the Sprite#-BYTE (DMA) method.

To flip a sprite horizontally, you just need to set bit #6 of the special byte of OAM data (the third byte written). Assuming you have your special byte in A (you have to, to be able to do bit operations & math):

eor #%01000000 ; will toggle bit #6 in A. sta $2004 ; this assumes that you already entered 2 bytes to $2004

Now the DMA method:

lda Sprite1_S eor #%01000000 sta Sprite1_S ; need to store it back so next time the correct thing happens. sta $2004

As you see, it's not much different. To flip a sprite vertically, you need to toggle bit #7 of the special byte.

Gettin' Goin'

Putting sprites behind backgrounds is always cool if you do it right, like the Warp Whisle (Whistle?) in Super Mario Bros. 3 ((c)1988? Nintendo, wow I was 1 year old in 1988...) you have to get BEHIND the background and make to the end of the stage to get the whisle, remember that?

Well, Bit #5 of the special byte is probably how that was done. Just make Bit #5 a 1 to have your sprite be drawn under/behind the background. Example of toggling bit #5:

eor #%00100000

That will toggle bit #5, so you can use that instead of the eor in the previous code.

One Last Thing

Remember that you can always toggle more than one bit at a time.

This Day In Review

Hopefully I'll get around to talking about color attributes tomorrow. (Bits 0-1 of special byte and the BG Attribute Tables).

Hope you liked this!,
-Mike H a.k.a GbaGuy

P.S. Could someone email me to tell me if this works or not, please?