Sprite Attribute Upload
Number | $xx57 |
---|---|
Decimal | |
Short desc. | Uploads sprite positions, visibility, colour type and effect flags. |
Bit Mask | %---- ---- 0101 0111 |
Readable | No |
Writable | Yes |
Subsystem | Sprites |
Uploads attributes of the sprite slot selected by Sprite Status/Slot Select ($303B / 12347). Attributes are in 4-5 byte blocks sent in the following order; after sending 4 or 5 bytes the address auto-increments to the next sprite. This auto-increment is independent of other sprite ports. The 4-5 bytes are as follows:
Byte 1 is the low bits of the X position. The MSB is in byte 3.
Byte 2 is the low bits of the Y position. The MSB is in optional byte 5.
Byte 3 is bitmapped:
Bit | Description |
---|---|
4-7 | Palette offset, added to each palette index from pattern before drawing |
3 | Enable X mirror |
2 | Enable Y mirror |
1 | Enable rotation |
0 | MSB of X coordinate |
Byte 4 is bitmapped:
Bit | Description |
---|---|
7 | Enable visibility |
6 | If 1, the optional 5th attribute byte should follow fourth one.
If 0, only four attribute bytes are expected (accidental fifth byte send to port will be treated as first byte of next sprite attributes), and all extra sprite features (not covered by 4 byte block) will be reset to zero (as if 5th byte equal to value zero was explicitly sent). |
5-0 | Pattern index ("Name") |
Optional (when bit 6 is set in byte 4) byte 5 is bitmapped:
Bit | Description |
---|---|
7 | If 1, the pattern will be treated as 4-bit colour one (128 bytes), 0 is for 8-bit colour patterns (256 bytes) |
6 | Chooses top/bottom part of pattern slot (for 4-bit colour patterns)
0 will target bytes 0..127 of pattern "Name" (byte 4), 1 will target bytes 128..255 of pattern "Name". |
5 | Reserved, use always 0 |
4-3 | x-axis scale factor: %00 = 1x (16 pixels), %01 = 2x, %10 = 4x, %11 = 8x (128 pixels) |
2-1 | y-axis scale factor: %00 = 1x (16 pixels), %01 = 2x, %10 = 4x, %11 = 8x (128 pixels) |
0 | MSB of Y coordinate |
About [X,Y] coordinates: 9 bit values allow for 0..511 coordinate. The top-left ULA pixel ("paper" area) is at [32,32] and bottom-right ULA pixel is at [287,223] (256x192 pixel area).
When sprites are configured to be drawn "over border", there is fixed-size 32 pixels wide area around pixel area (so called "border" in BASIC terms), i.e. coordinates [0,0] to [319,255] are coordinates of visible over-border sprite area.
All coordinates beyond these act as wrap-around 0..511 coordinate system, with sprite getting outside of drawing area, i.e. [X,Y]=[511,510] will render sprite in top left corner over "border" area, with left-most column already not visible (511 works as "-1" X coordinate) and two top-most rows not visible (510 works as "-2" Y coordinate), only remaining 15x14 pixels of sprite pattern are visible in top-left corner. Similarly sprite at coordinates [310,250] will render only 10x6 pixels of pattern in bottom right corner, rest of pattern being already outside of rendering area and not visible (assuming the over-border is enabled and not clipped by sprite clip-window).