diff options
Diffstat (limited to 'tools/scramble.c')
-rw-r--r-- | tools/scramble.c | 88 |
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 */ |