summaryrefslogtreecommitdiff
path: root/tools/scramble.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/scramble.c')
-rw-r--r--tools/scramble.c88
1 files changed, 57 insertions, 31 deletions
diff --git a/tools/scramble.c b/tools/scramble.c
index 95709c0618..0021bcacaa 100644
--- a/tools/scramble.c
+++ b/tools/scramble.c
@@ -31,9 +31,10 @@ int main (int argc, char** argv)
31 int headerlen = 6; 31 int headerlen = 6;
32 FILE* file; 32 FILE* file;
33 int version; 33 int version;
34 int scramble=1;
34 35
35 if (argc < 3) { 36 if (argc < 3) {
36 printf("usage: %s [-fm] [-v2] <input file> <output file>\n",argv[0]); 37 printf("usage: %s [-fm] [-v2] [-neo]<input file> <output file>\n",argv[0]);
37 return -1; 38 return -1;
38 } 39 }
39 40
@@ -44,12 +45,20 @@ int main (int argc, char** argv)
44 version = 4; 45 version = 4;
45 } 46 }
46 47
47 if(!strcmp(argv[1], "-v2")) { 48 else if(!strcmp(argv[1], "-v2")) {
48 headerlen = 24; 49 headerlen = 24;
49 iname = argv[2]; 50 iname = argv[2];
50 oname = argv[3]; 51 oname = argv[3];
51 version = 2; 52 version = 2;
52 } 53 }
54
55 else if(!strcmp(argv[1], "-neo")) {
56 headerlen = 17;
57 iname = argv[2];
58 oname = argv[3];
59 scramble = 0;
60 }
61
53 62
54 /* open file */ 63 /* open file */
55 file = fopen(iname,"rb"); 64 file = fopen(iname,"rb");
@@ -83,46 +92,63 @@ int main (int argc, char** argv)
83 } 92 }
84 fclose(file); 93 fclose(file);
85 94
86 /* scramble */ 95 if(scramble) {
87 slen = length/4; 96 /* scramble */
88 for (i = 0; i < length; i++) { 97 slen = length/4;
89 unsigned long addr = (i >> 2) + ((i % 4) * slen); 98 for (i = 0; i < length; i++) {
90 unsigned char data = inbuf[i]; 99 unsigned long addr = (i >> 2) + ((i % 4) * slen);
91 data = ~((data << 1) | ((data >> 7) & 1)); /* poor man's ROL */ 100 unsigned char data = inbuf[i];
92 outbuf[addr] = data; 101 data = ~((data << 1) | ((data >> 7) & 1)); /* poor man's ROL */
102 outbuf[addr] = data;
103 }
93 } 104 }
94 105
95 /* calculate checksum */ 106 /* calculate checksum */
96 for (i=0;i<length;i++) 107 for (i=0;i<length;i++)
97 crc += inbuf[i]; 108 crc += inbuf[i];
98 109
99 /* make header */
100 memset(header, 0, sizeof header); 110 memset(header, 0, sizeof header);
101 if (headerlen == 6) { 111 if(scramble) {
102 header[0] = (length >> 24) & 0xff; 112 if (headerlen == 6) {
103 header[1] = (length >> 16) & 0xff; 113 header[0] = (length >> 24) & 0xff;
104 header[2] = (length >> 8) & 0xff; 114 header[1] = (length >> 16) & 0xff;
105 header[3] = length & 0xff; 115 header[2] = (length >> 8) & 0xff;
106 header[4] = (crc >> 8) & 0xff; 116 header[3] = length & 0xff;
107 header[5] = crc & 0xff; 117 header[4] = (crc >> 8) & 0xff;
108 } 118 header[5] = crc & 0xff;
109 else { 119 }
110 header[0] = 120 else {
111 header[1] = 121 header[0] =
112 header[2] = 122 header[1] =
113 header[3] = 0xff; /* ??? */ 123 header[2] =
124 header[3] = 0xff; /* ??? */
114 125
115 header[6] = (crc >> 8) & 0xff; 126 header[6] = (crc >> 8) & 0xff;
116 header[7] = crc & 0xff; 127 header[7] = crc & 0xff;
128
129 header[11] = version;
117 130
118 header[11] = version; 131 header[15] = headerlen; /* really? */
119 132
120 header[15] = headerlen; /* really? */ 133 header[20] = (length >> 24) & 0xff;
134 header[21] = (length >> 16) & 0xff;
135 header[22] = (length >> 8) & 0xff;
136 header[23] = length & 0xff;
137 }
138 }
139 else {
140#define MY_FIRMWARE_TYPE "Rockbox"
141#define MY_HEADER_VERSION 1
121 142
122 header[20] = (length >> 24) & 0xff; 143 strncpy(header,MY_FIRMWARE_TYPE,9);
123 header[21] = (length >> 16) & 0xff; 144 header[9]='\0'; /*shouldn't have to, but to be SURE */
124 header[22] = (length >> 8) & 0xff; 145 header[10]=MY_HEADER_VERSION&0xFF;
125 header[23] = length & 0xff; 146 header[11]=(crc>>8)&0xFF;
147 header[12]=crc&0xFF;
148 header[13]=(sizeof(header)>>24)&0xFF;
149 header[14]=(sizeof(header)>>16)&0xFF;
150 header[15]=(sizeof(header)>>8)&0xFF;
151 header[16]=sizeof(header)&0xFF;
126 } 152 }
127 153
128 /* write file */ 154 /* write file */