]>
cvs.zerfleddert.de Git - rsbs2/blob - rsb-lz.c
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
);