1*74a4d8c2SCharles.Forsyth 2*74a4d8c2SCharles.Forsyth /* 3*74a4d8c2SCharles.Forsyth * squeezed file format: 4*74a4d8c2SCharles.Forsyth * Sqhdr 5*74a4d8c2SCharles.Forsyth * original Exec header 6*74a4d8c2SCharles.Forsyth * two Squeeze tables 7*74a4d8c2SCharles.Forsyth * squeezed segment 8*74a4d8c2SCharles.Forsyth * unsqueezed segment, if any 9*74a4d8c2SCharles.Forsyth */ 10*74a4d8c2SCharles.Forsyth #define SQMAGIC (ulong)0xFEEF0F1E 11*74a4d8c2SCharles.Forsyth 12*74a4d8c2SCharles.Forsyth typedef struct Sqhdr Sqhdr; 13*74a4d8c2SCharles.Forsyth struct Sqhdr { 14*74a4d8c2SCharles.Forsyth uchar magic[4]; /* SQMAGIC */ 15*74a4d8c2SCharles.Forsyth uchar text[4]; /* squeezed length of text (excluding tables) */ 16*74a4d8c2SCharles.Forsyth uchar data[4]; /* squeezed length of data (excluding tables) */ 17*74a4d8c2SCharles.Forsyth uchar asis[4]; /* length of unsqueezed segment */ 18*74a4d8c2SCharles.Forsyth uchar toptxt[4]; /* value for 0 encoding in text */ 19*74a4d8c2SCharles.Forsyth uchar topdat[4]; /* value for 0 encoding in data */ 20*74a4d8c2SCharles.Forsyth uchar sum[4]; /* simple checksum of unsqueezed data */ 21*74a4d8c2SCharles.Forsyth uchar flags[4]; 22*74a4d8c2SCharles.Forsyth }; 23*74a4d8c2SCharles.Forsyth #define SQHDRLEN (8*4) 24*74a4d8c2SCharles.Forsyth 25*74a4d8c2SCharles.Forsyth /* 26*74a4d8c2SCharles.Forsyth * certain power instruction types are rearranged by sqz 27*74a4d8c2SCharles.Forsyth * so as to move the variable part of the instruction word to the 28*74a4d8c2SCharles.Forsyth * low order bits. note that the mapping is its own inverse. 29*74a4d8c2SCharles.Forsyth */ 30*74a4d8c2SCharles.Forsyth #define QREMAP(X)\ 31*74a4d8c2SCharles.Forsyth switch((X)>>26){\ 32*74a4d8c2SCharles.Forsyth case 19: case 31: case 59: case 63:\ 33*74a4d8c2SCharles.Forsyth (X) = (((X) & 0xFC00F801) | (((X)>>15)&0x7FE) | (((X)&0x7FE)<<15));\ 34*74a4d8c2SCharles.Forsyth } 35