summaryrefslogtreecommitdiff
path: root/tools/scramble.c
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2004-01-08 21:34:52 +0000
committerBjörn Stenberg <bjorn@haxx.se>2004-01-08 21:34:52 +0000
commit123ae83b07b1a9b1fd8938400813117a26087f3a (patch)
tree17cf339369268434c46a554b4ef3c4a7e8c5c3ac /tools/scramble.c
parent8463a2bbd3f64ad47f5d30ca9a1957c170f48ec1 (diff)
downloadrockbox-123ae83b07b1a9b1fd8938400813117a26087f3a.tar.gz
rockbox-123ae83b07b1a9b1fd8938400813117a26087f3a.zip
Added multimedia support (but no compression)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4213 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'tools/scramble.c')
-rw-r--r--tools/scramble.c165
1 files changed, 115 insertions, 50 deletions
diff --git a/tools/scramble.c b/tools/scramble.c
index 0021bcacaa..8e3f7395a5 100644
--- a/tools/scramble.c
+++ b/tools/scramble.c
@@ -20,6 +20,22 @@
20#include <stdio.h> 20#include <stdio.h>
21#include <stdlib.h> 21#include <stdlib.h>
22 22
23void int2le(unsigned int val, unsigned char* addr)
24{
25 addr[0] = val & 0xFF;
26 addr[1] = (val >> 8) & 0xff;
27 addr[2] = (val >> 16) & 0xff;
28 addr[3] = (val >> 24) & 0xff;
29}
30
31void int2be(unsigned int val, unsigned char* addr)
32{
33 addr[0] = (val >> 24) & 0xff;
34 addr[1] = (val >> 16) & 0xff;
35 addr[2] = (val >> 8) & 0xff;
36 addr[3] = val & 0xFF;
37}
38
23int main (int argc, char** argv) 39int main (int argc, char** argv)
24{ 40{
25 unsigned long length,i,slen; 41 unsigned long length,i,slen;
@@ -28,13 +44,20 @@ int main (int argc, char** argv)
28 unsigned char header[24]; 44 unsigned char header[24];
29 unsigned char *iname = argv[1]; 45 unsigned char *iname = argv[1];
30 unsigned char *oname = argv[2]; 46 unsigned char *oname = argv[2];
47 unsigned char *xorstring;
31 int headerlen = 6; 48 int headerlen = 6;
32 FILE* file; 49 FILE* file;
33 int version; 50 int version;
34 int scramble=1; 51 enum { none, scramble, xor } method = scramble;
35 52
36 if (argc < 3) { 53 if (argc < 3) {
37 printf("usage: %s [-fm] [-v2] [-neo]<input file> <output file>\n",argv[0]); 54 printf("usage: %s [options] <input file> <output file> [xor string]\n",argv[0]);
55 printf("options:\n");
56 printf("\t-fm Archos FM recorder format\n");
57 printf("\t-v2 Archos V2 recorder format\n");
58 printf("\t-neo SSI Neo format\n");
59 printf("\t-mm=X Archos Multimedia format (X values: A=JBMM, B=AV1xx, C=AV3xx)\n");
60 printf("\nNo option results in Archos standard player/recorder format.\n");
38 return -1; 61 return -1;
39 } 62 }
40 63
@@ -56,10 +79,22 @@ int main (int argc, char** argv)
56 headerlen = 17; 79 headerlen = 17;
57 iname = argv[2]; 80 iname = argv[2];
58 oname = argv[3]; 81 oname = argv[3];
59 scramble = 0; 82 method = none;
83 }
84 else if(!strncmp(argv[1], "-mm=", 4)) {
85 headerlen = 16;
86 iname = argv[2];
87 oname = argv[3];
88 method = xor;
89 version = argv[1][4];
90 if (argc > 4)
91 xorstring = argv[4];
92 else {
93 printf("Multimedia needs an xor string\n");
94 return -1;
95 }
60 } 96 }
61 97
62
63 /* open file */ 98 /* open file */
64 file = fopen(iname,"rb"); 99 file = fopen(iname,"rb");
65 if (!file) { 100 if (!file) {
@@ -70,7 +105,7 @@ int main (int argc, char** argv)
70 length = ftell(file); 105 length = ftell(file);
71 length = (length + 3) & ~3; /* Round up to nearest 4 byte boundary */ 106 length = (length + 3) & ~3; /* Round up to nearest 4 byte boundary */
72 107
73 if ((length + headerlen) >= 0x32000) { 108 if ((method == scramble) && ((length + headerlen) >= 0x32000)) {
74 printf("error: max firmware size is 200KB!\n"); 109 printf("error: max firmware size is 200KB!\n");
75 fclose(file); 110 fclose(file);
76 return -1; 111 return -1;
@@ -78,7 +113,10 @@ int main (int argc, char** argv)
78 113
79 fseek(file,0,SEEK_SET); 114 fseek(file,0,SEEK_SET);
80 inbuf = malloc(length); 115 inbuf = malloc(length);
81 outbuf = malloc(length); 116 if (method == xor)
117 outbuf = malloc(length*2);
118 else
119 outbuf = malloc(length);
82 if ( !inbuf || !outbuf ) { 120 if ( !inbuf || !outbuf ) {
83 printf("out of memory!\n"); 121 printf("out of memory!\n");
84 return -1; 122 return -1;
@@ -92,15 +130,27 @@ int main (int argc, char** argv)
92 } 130 }
93 fclose(file); 131 fclose(file);
94 132
95 if(scramble) { 133 switch (method)
96 /* scramble */ 134 {
97 slen = length/4; 135 case scramble:
98 for (i = 0; i < length; i++) { 136 slen = length/4;
99 unsigned long addr = (i >> 2) + ((i % 4) * slen); 137 for (i = 0; i < length; i++) {
100 unsigned char data = inbuf[i]; 138 unsigned long addr = (i >> 2) + ((i % 4) * slen);
101 data = ~((data << 1) | ((data >> 7) & 1)); /* poor man's ROL */ 139 unsigned char data = inbuf[i];
102 outbuf[addr] = data; 140 data = ~((data << 1) | ((data >> 7) & 1)); /* poor man's ROL */
103 } 141 outbuf[addr] = data;
142 }
143 break;
144
145 case xor:
146 /* "compress" */
147 slen = 0;
148 for (i=0; i<length; i++) {
149 if (!(i&7))
150 outbuf[slen++] = 0xff; /* all data is uncompressed */
151 outbuf[slen++] = inbuf[i];
152 }
153 break;
104 } 154 }
105 155
106 /* calculate checksum */ 156 /* calculate checksum */
@@ -108,47 +158,62 @@ int main (int argc, char** argv)
108 crc += inbuf[i]; 158 crc += inbuf[i];
109 159
110 memset(header, 0, sizeof header); 160 memset(header, 0, sizeof header);
111 if(scramble) { 161 switch (method)
112 if (headerlen == 6) { 162 {
113 header[0] = (length >> 24) & 0xff; 163 case scramble:
114 header[1] = (length >> 16) & 0xff; 164 if (headerlen == 6) {
115 header[2] = (length >> 8) & 0xff; 165 int2be(length, header);
116 header[3] = length & 0xff; 166 header[4] = (crc >> 8) & 0xff;
117 header[4] = (crc >> 8) & 0xff; 167 header[5] = crc & 0xff;
118 header[5] = crc & 0xff; 168 }
119 } 169 else {
120 else { 170 header[0] =
121 header[0] = 171 header[1] =
122 header[1] = 172 header[2] =
123 header[2] = 173 header[3] = 0xff; /* ??? */
124 header[3] = 0xff; /* ??? */ 174
125 175 header[6] = (crc >> 8) & 0xff;
126 header[6] = (crc >> 8) & 0xff; 176 header[7] = crc & 0xff;
127 header[7] = crc & 0xff; 177
178 header[11] = version;
179
180 header[15] = headerlen; /* really? */
181
182 int2be(length, &header[20]);
183 }
184 break;
128 185
129 header[11] = version; 186 case xor:
187 {
188 int xorlen = strlen(xorstring);
130 189
131 header[15] = headerlen; /* really? */ 190 /* calculate checksum */
191 for (i=0; i<slen; i++)
192 crc += outbuf[i];
132 193
133 header[20] = (length >> 24) & 0xff; 194 /* xor data */
134 header[21] = (length >> 16) & 0xff; 195 for (i=0; i<slen; i++)
135 header[22] = (length >> 8) & 0xff; 196 outbuf[i] ^= xorstring[i & (xorlen-1)];
136 header[23] = length & 0xff; 197
198 header[0] = header[2] = 'Z';
199 header[1] = header[3] = version;
200 int2le(length, &header[4]);
201 int2le(slen, &header[8]);
202 int2le(crc, &header[12]);
203 length = slen;
204 break;
137 } 205 }
138 } 206
139 else {
140#define MY_FIRMWARE_TYPE "Rockbox" 207#define MY_FIRMWARE_TYPE "Rockbox"
141#define MY_HEADER_VERSION 1 208#define MY_HEADER_VERSION 1
142 209 default:
143 strncpy(header,MY_FIRMWARE_TYPE,9); 210 strncpy(header,MY_FIRMWARE_TYPE,9);
144 header[9]='\0'; /*shouldn't have to, but to be SURE */ 211 header[9]='\0'; /*shouldn't have to, but to be SURE */
145 header[10]=MY_HEADER_VERSION&0xFF; 212 header[10]=MY_HEADER_VERSION&0xFF;
146 header[11]=(crc>>8)&0xFF; 213 header[11]=(crc>>8)&0xFF;
147 header[12]=crc&0xFF; 214 header[12]=crc&0xFF;
148 header[13]=(sizeof(header)>>24)&0xFF; 215 int2be(sizeof(header), &header[12]);
149 header[14]=(sizeof(header)>>16)&0xFF; 216 break;
150 header[15]=(sizeof(header)>>8)&0xFF;
151 header[16]=sizeof(header)&0xFF;
152 } 217 }
153 218
154 /* write file */ 219 /* write file */