Crack Art
Jump to navigation
Jump to search
- Company: Detlef Röttger & Jan Borchers
- Extensions: .ca1, .ca2, .ca3
Crack Art was an image drawing program for the Atari ST. Here are the m68k assembly compression and decompression routines, provided by the original program.
16-bit words are stored in big-endian order.
File format
typedef crackart_file {
uint16_t magic; /* "CA" */
uint8_t compressed; /* 0 = no compression, 1 = compressed */
uint8_t resolution; /* 0 = low (320x200x16), 1 = medium (640x200x4), 2 = high (640x400x2) */
uint16_t palette[palsize]; /* palsize = 16 (low res), 4 (med res) or 0 (high res) */
uint8_t data[]
} crackart_file;
If the file is uncompressed, sizeof(data) == 32000 bytes of raw video memory.
Decompression algorithm
Yet another RLE variant:
data[0] == ESCape character
data[1] == initial value (fill screen memory with this value)
data[2]<<8 + data[3] == offset, this value is constantly added to the current byte position in order to
find the next byte position. If the position >= 32000, it jumps back to
the first unwritten byte position (initial write is not taken into account).
This is used to 'jump' through the data and accomplish plane-by-plane compression.
data[4 ....] == RLE compressed data
[pseudocode]
while (!eof et cetera) {
a = data[x++]
if (a != ESC) output a, continue
b = data[x++]
if (b == ESC) output ESC, continue
c = data[x++]
if (b == 2) {
if (!c) break /* end decompression */
c << 8
c += data[x++]
skip c+1 bytes, continue /* or output c+1 times initial_value */
}
if (b == 1) {
c <<= 8
c += data[x++]
}
if (b <= 1) { /* 0 and 1 */
d = data[x++]
output c+1 times d, continue
}
output b times c /* b>2 && b!= ESC */
}
Uncompressed data format
The image data is stored in a planar format.
