palettes

Each sprite has a 4-bit palette field. This field controls how sprite image data is turned into a final color. There are four hardware 256-color palettes, two 16-color palettes, and two 4-color palettes. This program displays the same sprite image using different values of the palette field.

For 16-color mode the palette field selects which four bits are used for palette lookup.

For 4-color mode the palette field selects which two bits are used for palette lookup.

#include <SPI.h>
#include <GD.h>

void spr(int x, int y, byte pal)
{
  static int sprnum = 0;
  GD.sprite(sprnum++, x, y, 0, pal, 0);
}

static unsigned int random_color()
{
  return RGB(64 + random(192), 64 + random(192), 64 + random(192));
}

void setup()
{
  int i;

  GD.begin();
  GD.ascii();
  GD.putstr(0, 0,"Sprite palettes");

  for (i = 0; i < 256; i++)
    GD.wr(RAM_SPRIMG + i, i);

  // Fill all the palettes with random colors
  for (i = 0; i < (4 * 256); i++)
    GD.wr16(RAM_SPRPAL + (i << 1), random_color());
  for (i = 0; i < 16; i++) {
    GD.wr16(PALETTE16A + (i << 1), random_color());
    GD.wr16(PALETTE16B + (i << 1), random_color());
  }
  for (i = 0; i < 4; i++) {
    GD.wr16(PALETTE4A + (i << 1), random_color());
    GD.wr16(PALETTE4B + (i << 1), random_color());
  }
  
  GD.putstr(0, 8, "Four 256-color palettes");
  for (i = 0; i < 4; i++)
    spr(200 + 20 * i, (8 * 8), i);

  GD.putstr(0, 12, "Two 16-color palettes");
  for (i = 0; i < 2; i++) {
    spr(200 + 20 * i, (8 * 12),      0x4 | i);
    spr(200 + 20 * i, (8 * 12) + 20, 0x6 | i);
  }

  GD.putstr(0, 18, "Two 4-color palettes");
  for (i = 0; i < 2; i++) {
    spr(200 + 20 * i, (8 * 18),      0x8 | i);
    spr(200 + 20 * i, (8 * 18) + 20, 0xa | i);
    spr(200 + 20 * i, (8 * 18) + 40, 0xc | i);
    spr(200 + 20 * i, (8 * 18) + 60, 0xe | i);
  }
}

void loop()
{
}