0-3: FSP1 or FSP2 FSP1: 0-3: FSP1 4-7,8-11: 0's .. etc ... Then data for each sprite: Sprite size info: 0xyyxxYYXX X = X size, pixels Y = Y size, pixels x = x centre, pixels y = y centre, pixels Row lookup table: - offsets from sprite start ... etc ... If two entries are the same then it implies an empty row - i.e. if r0 = r1 then r0 is empty (all mask) Has one more entry than the actual height of the sprite! Data chunks: 0x?PPPPPBB P = Pixel position: X + (Y*SCREENX) i.e. screen offset in bytes for a screen width of SCREENX! Implicit mask - Any gaps are taken to be masked out pixels No other data compression is apparent FSP2: 0-3: FSP2 4-7: Number of sprites in file? 8-11: Unknown? 12-15: 0xAAAAAAFF A = Address of sprite lookup table F = Number of animation frames-1 Sprite lookup table - sprite*num sprites { lookup*num lookups { preshift*4 } } 0xAAAAAFF A = Address in file F = Sprite format info: 0A = FSP1 format 02 = Preshift 2? 00 = Preshift 0? Sprite data: 0xXXXXYYYY - Size info 0xXXXXYYYY - Centre info Row lookup table: - Offsets from list start? .. etc ... (0x00120969)* - STR/STM block identifier? Data chunks: 0x?PPPPPBB Same as above, STRB block OR 0x?PPPPPLL L = Length in words of the data block which will follow. 2=STR,4/8=STM Blocks can overlap, in which case the overlapping area is ignored