Files
nyuller/docs/c64/sprites/sprites_overview.md
T

104 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sprites (MOBs — Movable Object Blocks)
Source: https://www.c64-wiki.com/wiki/Sprite
A sprite is a piece of graphics that can move and be assigned attributes independently of other graphics or text. The VIC-II supports up to 8 sprites, but with raster interrupt programming you can display more than eight simultaneously.
## Sprite data
- A sprite pattern is 24×21 pixels (12×21 in multicolor).
- 63 bytes of data + 1 unused "pad" byte = 64 bytes per sprite (must be 64-byte aligned in the current VIC bank).
- In theory a VIC bank holds 256 patterns; with a text screen and charset, practically ~208.
## Hi-res sprite
- Bit = 0 → transparent
- Bit = 1 → sprite's individual color
## Multicolor sprite
Each 2 bits = 1 pixel (2× wider):
- %00 → transparent
- %01 → color from $D025 (multicolor 0, common)
- %10 → color from $D027-$D02E (this sprite's color)
- %11 → color from $D026 (multicolor 1, common)
## Sprite pointers (in screen RAM area)
If text screen starts at address S, sprite pointers are at S+1016 through S+1023. With the default screen at $0400, that's $07F8-$07FF. Pointers contain the pattern address / 64.
| Sprite | Pointer |
|--------|---------|
| #0 | $07F8 (2040) |
| #1 | $07F9 (2041) |
| #2 | $07FA (2042) |
| #3 | $07FB (2043) |
| #4 | $07FC (2044) |
| #5 | $07FD (2045) |
| #6 | $07FE (2046) |
| #7 | $07FF (2047) |
## Sprite position registers
| Sprite | X reg | Y reg |
|--------|-------|-------|
| #0 | $D000 (53248) | $D001 (53249) |
| #1 | $D002 (53250) | $D003 (53251) |
| #2 | $D004 (53252) | $D005 (53253) |
| #3 | $D006 (53254) | $D007 (53255) |
| #4 | $D008 (53256) | $D009 (53257) |
| #5 | $D00A (53258) | $D00B (53259) |
| #6 | $D00C (53260) | $D00D (53261) |
| #7 | $D00E (53262) | $D00F (53263) |
X coordinates need 9 bits; the MSBs are in $D010 (one bit per sprite).
## Sprite color registers
| Sprite | Color |
|--------|-------|
| #0 | $D027 |
| #1 | $D028 |
| #2 | $D029 |
| #3 | $D02A |
| #4 | $D02B |
| #5 | $D02C |
| #6 | $D02D |
| #7 | $D02E |
Multicolor shared colors: $D025, $D026.
## Sprite enable ($D015)
Each bit is a switch for that sprite. 1 = enabled, 0 = hidden.
Bit 0 = sprite #0, bit 7 = sprite #7.
## Sprite multicolor mode ($D01C)
Each bit selects multicolor (1) or hires (0) for that sprite.
## X expansion ($D01D), Y expansion ($D017)
Each bit doubles that sprite's size in the corresponding direction.
## Sprite priority ($D01B)
Each bit, when set, puts the sprite *behind* the background graphics (text/bitmap). When 0, sprite is in front. Sprite-sprite priority is hardwired: lower-numbered sprites always appear in front of higher-numbered ones.
## Collision detection
$D01E: sprite-sprite collision (1 bit per sprite). Read clears.
$D01F: sprite-data (background) collision. Read clears.
$D019 bit 2 = sprite-sprite IRQ flag, bit 1 = sprite-data IRQ flag.
$D01A bits enable these IRQs.
## Example: enable sprite #0 with white color
```basic
POKE 2040,13: REM pattern at 13*64=832
POKE 53248,255: REM X=255
POKE 53249,100: REM Y=100
POKE 53287,1: REM color=1 (white)
POKE 53269,1: REM enable sprite #0
```