]>
cvs.zerfleddert.de Git - rsbs2/blob - rsb-lz.c
c23dd5a02af56450920eb4f43f2e1e1c07155c8b
   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' */ 
 139 unsigned int crc_check(unsigned char *buf
, unsigned int len
, unsigned int magic
) 
 141         unsigned int file_crc
; 
 144         unsigned int my_magic
; 
 146         my_len 
= *((unsigned int*)(buf 
+ 0x20)); 
 147         my_magic 
= *((unsigned int*)(buf 
+ 0x24)); 
 149         if (my_magic 
!= magic
) { 
 150                 printf("\nmagic: 0x%08x <-> 0x%08x\n", my_magic
, magic
); 
 157         crc 
= ~rsb_crc(~0x00, buf
, len
); 
 158         file_crc 
= *((unsigned int*)(buf 
+ len
)); 
 160         if (file_crc 
!= crc
) { 
 161                 printf("\nChecksums: 0x%08x <-> 0x%08x!\n", crc
, file_crc
); 
 168 void extract_lz_file(unsigned char *inbuf
, unsigned char *name
, unsigned char check_crc
) 
 171         unsigned char *outbuf
; 
 172         struct data_in_s data_in
; 
 173         struct data_out_s data_out
; 
 175         if (*((unsigned int*)inbuf
) != LZ_MAGIC
) 
 178         len 
= *((unsigned int*)(inbuf 
+ 4)); 
 179         printf(", length: %d", len
); 
 181         if ((outbuf 
= malloc(len
)) == NULL
) { 
 188         data_in
.start 
= inbuf 
+ 8; 
 189         data_in
.stop 
= inbuf 
+ len
; 
 191         data_in
.bitpos 
= 0x80; 
 193         data_out
.pos 
= outbuf
; 
 194         data_out
.end 
= outbuf 
+ len
; 
 196         lz_expand(&data_in
, &data_out
); 
 202                 crclen 
= *((unsigned int*)(outbuf 
+ 0x20)); 
 204                 if ((ret 
= crc_check(outbuf
, crclen
, 0x46335053)) != 0) { 
 205                         printf("crc_check return: %d\n", ret
); 
 210         write_file((char*)name
, outbuf
, len
);