]>
cvs.zerfleddert.de Git - rsbs2/blob - rsb-lz.c
93e9d79f2acfd41001d31febb9b4412f97b55ed6
   9 #include "filesystem.h" 
  11 void err_exit(const char *fname
) 
  13         fprintf(stderr
,"%s: error extracting...\n", fname
); 
  29 unsigned char get_next_in_byte(struct data_in_s 
*data_in
) 
  33         if (data_in
->stop 
< data_in
->start
) 
  36         byte 
= *(data_in
->start
); 
  42 unsigned char get_next_bit(struct data_in_s 
*data_in
) 
  46         if (data_in
->bitpos 
== 0x80) { 
  47                 data_in
->byte 
= get_next_in_byte(data_in
); 
  50         bitval 
= data_in
->bitpos 
& data_in
->byte
; 
  52         data_in
->bitpos 
>>= 1; 
  53         if (data_in
->bitpos 
== 0) { 
  54                 data_in
->bitpos 
= 0x80; 
  63 unsigned int get_next_bits(struct data_in_s 
*data_in
, unsigned int bits
) 
  66         unsigned int next_bits
; 
  68         bit 
= 1 << (bits 
- 1); 
  72                 if (data_in
->bitpos 
== 0x80) { 
  73                         data_in
->byte 
= get_next_in_byte(data_in
); 
  76                 if ((data_in
->bitpos 
& data_in
->byte
) != 0) 
  77                         next_bits 
= next_bits 
| bit
; 
  81                 data_in
->bitpos 
>>= 1; 
  83                 if(data_in
->bitpos 
== 0) { 
  84                         data_in
->bitpos 
= 0x80; 
  91 void write_byte(unsigned char byte
, struct data_out_s 
*data_out
) 
  93         if (data_out
->pos 
> data_out
->end
) { 
  97         *(data_out
->pos
) = byte
; 
 101 void lz_expand(struct data_in_s 
*data_in
, struct data_out_s 
*data_out
) 
 108         unsigned char buf
[1024]; 
 114                         if (get_next_bit(data_in
) == 0) 
 117                         byte 
= get_next_bits(data_in
, 8); 
 119                         write_byte(byte
, data_out
); 
 121                         pos 
= (pos 
+ 1) & 0x3ff; 
 124                 offset 
= get_next_bits(data_in
, 0x0a); 
 128                 num 
= get_next_bits(data_in
, 0x04) + 1; 
 129                 for (i 
= 0; i 
<= num
; i
++) { 
 130                         byte 
= buf
[(offset 
+ i
) & 0x3ff]; 
 131                         write_byte(byte
, data_out
); 
 133                         pos 
= (pos 
+ 1) & 0x3ff; 
 138 /* Checksum is only used for the compressed firmware in 'firmware' */ 
 140 unsigned int crc_check_59684(unsigned char *arg1
, unsigned int arg2
, unsigned int magic
) 
 152         r4 
= *((unsigned int*)arg1 
+ 0x20); 
 153         r5 
= *((unsigned int*)arg1 
+ 0x24); 
 155         printf("magic: 0x%08x <-> 0x%08x\n", r5
, magic
); 
 164         r5 
= ~rsb_crc(~0x00, arg1
, r4
); 
 165         r3 
= *((unsigned int*)(arg1 
+ r4
)); 
 166         printf("Checksums: 0x%02x <-> 0x%02x\n", r5
, r3
); 
 175 void extract_lz_file(unsigned char *inbuf
, unsigned char *name
) 
 178         unsigned char *outbuf
; 
 179         struct data_in_s data_in
; 
 180         struct data_out_s data_out
; 
 182         if (*((unsigned int*)inbuf
) != LZ_MAGIC
) 
 185         len 
= *((unsigned int*)(inbuf 
+ 4)); 
 186         printf(", length: %d", len
); 
 188         if ((outbuf 
= malloc(len
)) == NULL
) { 
 195         data_in
.start 
= inbuf 
+ 8; 
 196         data_in
.stop 
= inbuf 
+ len
; 
 198         data_in
.bitpos 
= 0x80; 
 200         data_out
.pos 
= outbuf
; 
 201         data_out
.end 
= outbuf 
+ len
; 
 203         lz_expand(&data_in
, &data_out
); 
 206         /* Checksum is only used for the compressed firmware in 'firmware' */ 
 208         r5 
= *((unsigned int*)r3
); 
 210         if ((ret 
= crc_check_59684(r7
, r5
, 0x46335053)) != 0) { 
 211                 printf("crc_check return: %d\n", ret
); 
 216         write_file((char*)name
, outbuf
, len
);