💾 Archived View for vigrey.com › gbdev › 2bpp-graphics-format.gmi captured on 2024-08-25 at 00:37:12. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-07-09)
-=-=-=-=-=-=-
The Game Boy palette consists of 4 slots for color data at memory address 0xFF47. The slots are as follows
7 bit 0 ---- ---- 3322 1100 |||| |||| |||| ||++- Slot Index 0 |||| ++--- Slot Index 1 ||++------ Slot Index 2 ++-------- Slot Index 3
The four possible colors that can fit in each slot are:
Any of the 4 colors can go into any of the 4 palette slots. As an example, a palette with the order slot index 0 = White, slot index 1 = Light Gray, slot index 2 = Dark Gray, and slot index 4 = Black would require writing the following byte to memory address 0xFF47:
0b11100100 = 0xE4
Inverting the previous example, so having the order be slot index 0 = Black, slot index 1 = Dark Gray, slot index 2 = Light Gray, and slot index 3 = White, would require the following byte to be written to memory address 0xFF47:
0b00011011 = 0x1B
A monochrome version, which converts anything that isn't black to white, of the first palette example, so having the order be slot index 0 = white, slot index 1 = white, slot index 2 = white, slot index 3 = black, would require the following byte to be written to memory address 0xFF47:
0b11000000 = 0xC0
Each Game Boy tile is an 8x8 pixel graphic with only 2 bits of palette slot index data per pixel. Because there are 2 bits per pixel, there are 8 rows each of 16 bits of palette slot index data per tile, totalling 128 bits (16 bytes) of palette slot index data per tile.
A Game Boy tile is represented below as palette slot index numbers in an 8 by 8 grid:
2 0 0 0 0 0 0 0 2 3 2 2 2 2 2 1 2 3 1 3 3 3 0 1 2 3 1 0 1 2 0 1 2 3 1 2 3 2 0 1 2 3 0 0 0 2 0 1 2 1 1 1 1 1 0 1 3 3 3 3 3 3 3 1
Each row of indexes is represented by first taking the 8 least significant bits of the row, then taking the 8 most significant bytes of the row, this is shown below for the previous tile example:
2 0 0 0 0 0 0 0 = 0b00000000 0b10000000 = 0x00 0x80 2 3 2 2 2 2 2 1 = 0b01000001 0b11111110 = 0x41 0xFE 2 3 1 3 3 3 0 1 = 0b01111101 0b11011100 = 0x7D 0xDC 2 3 1 0 1 2 0 1 = 0b01101001 0b11000100 = 0x69 0xC4 2 3 1 2 3 2 0 1 = 0b01101001 0b11011100 = 0x69 0xDC 2 3 0 0 0 2 0 1 = 0b01000001 0b11000100 = 0x41 0xC4 2 1 1 1 1 1 0 1 = 0b01111101 0b10000000 = 0x7D 0x80 3 3 3 3 3 3 3 1 = 0b11111111 0b11111110 = 0xFF 0xFE
The tile example would be represented in graphical memory on the Game Boy as the following:
00 80 41 FE 7D DC 69 C4 69 DC 41 C4 7D 80 FF FE