Spectrum 512
- Company: Trio Inc. / Antic Software
- Extensions: .spu, .spc, sps
Spectrum 512 was an image drawing program for the Atari ST.
16-bit words are stored in big-endian order.
Spectrum 512 Uncompressed
- Extension: .spu
typedef spectrum512_file { uint16_t data[16000]; /* first 80 words (first scanline) is unused and should be zeroes */ uint16_t palettes[199 * 3 * 16]; /* 199 scanlines, 3 palettes per scanline, 16 entries per palette */ } spectrum512_file;
Spectrum 512 Compressed
- Extension: .spc
typedef spectrum512_compressed_file { uint16_t magic; /* "SP" */ uint16_t reserved; /* always 0 */ uint32_t data_length; /* length of compressed image data */ uint32_t palette_length; /* length of compressed palettes */ uint8_t data[]; uint8_t palettes[]; } spectrum512_compressed_file;
Image data is compressed by RLE.
0 <= x <= 127 x+1 literals -128 <= x <= -1 -x+2 times next byte
Each plane is stored separately, i.e. 199 scanlines of plane 0, 199 scanlines of plane 1, et cetera.
Just like uncompressed .spu files, there are 199 * 3 palettes of 16 entries. Each palette is compressed separately. A compressed palette:
typedef compressed_palette { uint16_t map; /* bit = 1, color is present; bit = 0, color is black (0x0000) */ uint16_t colors[]; } compressed palette;
Bit 0 of map refers to palette entry 0 and so on. Bit 0 and bit 15 should always be zero. The background is always black and palette entry 15 is unused. This results in 15 * 3 + 1 = 46 colors per scanline.
Spectrum 512 Smooshed
- Extension: .sps
typedef spectrum512_smooshed_file { uint16_t magic; /* "SP" */ uint16_t reserved; /* always 0 */ uint32_t data_length; uint32_t palette_length; uint8_t data[]; uint8_t palettes[]; } spectrum512_smooshed_file;
The image data is compressed similar to .spc files.
There's a second variant where the data is not encoded plane by plane and line by line, but in byte wide vertical stripes (for each plane (for each column (scanline 1-199))).
It is unknown how (or impossible) to distinguish the two variants.
The palettes are compressed similar to .spc files, but rather than uint16_t values, variable length codes are stored. Each palette consists of a 14-bit map which marks which entries will follow (entries 0 and 15 are skipped and set to black). After the map, zero or more codes of 9-bits follow.
Palettes
Spectrum 512 files use three palettes per scanline. Because of the Atari ST's limitted graphics capabilities, a trick was used to change the hardware color palette twice per scanline. Given an x-coordinate and a color index, the following algorithm returns the corresponding spectrum palette index (0-47).
int find_index(unsigned int x, unsigned int c) { unsigned int t = 10 * c; if (c&1) t -= 5; else t++; if (x < t) return c; if (x >= t+160) return c + 32; return c + 16; }
Image Data
Uncompressed image data (.spu files) is stored in a planar format.