1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2003 by Jörg Hohensohn
12 * Tool to extract the scrambled image out of an Archos flash ROM dump
14 * All files in this archive are subject to the GNU General Public License.
15 * See the file COPYING in the source tree root for full license agreement.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
26 #define UINT8 unsigned char
27 #define UINT16 unsigned short
28 #define UINT32 unsigned long
30 #define IMAGE_HEADER 0x6000 // a 32 byte header in front of the software image
31 #define IMAGE_START 0x6020 // software image position in Flash
34 // place a 32 bit value into memory, big endian
35 void Write32(UINT8
* pByte
, UINT32 value
)
37 pByte
[0] = (UINT8
)(value
>> 24);
38 pByte
[1] = (UINT8
)(value
>> 16);
39 pByte
[2] = (UINT8
)(value
>> 8);
40 pByte
[3] = (UINT8
)(value
);
44 // read a 32 bit value from memory, big endian
45 UINT32
Read32(UINT8
* pByte
)
49 value
|= (UINT32
)pByte
[0] << 24;
50 value
|= (UINT32
)pByte
[1] << 16;
51 value
|= (UINT32
)pByte
[2] << 8;
52 value
|= (UINT32
)pByte
[3];
59 int main(int argc
, char* argv
[])
64 UINT8 aImage
[256*1024];
66 UINT32 uiSize
, uiStart
;
67 UINT16 usChecksum
= 0;
71 printf("Extract the software image out of an original Archos Flash ROM dump.\n");
72 printf("Result is a scrambled file, use the descramble tool to get the binary,\n");
73 printf(" always without the -fm option, even if processing an FM software.\n\n");
74 printf("Usage: extract <flash dump file> <output file>\n");
75 printf("Example: extract internal_rom_2000000-203FFFF.bin archos.ajz\n");
79 pInFile
= fopen(argv
[1], "rb");
82 printf("Error opening input file %s\n", argv
[1]);
86 if (fread(aImage
, 1, sizeof(aImage
), pInFile
) != sizeof(aImage
))
88 printf("Error reading input file %s, must be 256kB in size.\n", argv
[1]);
94 // find out about the type
95 uiStart
= Read32(aImage
+ 8);
96 uiSize
= Read32(aImage
+ 12); // booted ROM image
97 if (uiStart
== 0x02000100 && uiSize
> 20000)
98 { // Player has no loader, starts directly with the image
102 { // Recorder / FM / V2 Recorder
103 uiStart
= IMAGE_START
;
104 uiSize
= Read32(aImage
+ IMAGE_HEADER
+ 4); // size record of header
108 if (uiSize
> sizeof(aImage
) - uiStart
|| uiSize
< 40000)
110 printf("Error: Impossible image size &d bytes.\n", uiSize
);
115 for (i
=0; i
<uiSize
; i
++)
118 byte
= aImage
[uiStart
+ i
];
119 byte
= ~((byte
>> 1) | ((byte
<< 7) & 0x80)); /* poor man's ROR */
124 Write32(aHeader
+ 2, usChecksum
); // checksum in 5th and 6th byte
125 Write32(aHeader
, uiSize
); // size in first 4 bytes
127 pOutFile
= fopen(argv
[2], "wb");
128 if (pOutFile
== NULL
)
130 printf("Error opening output file %s\n", argv
[2]);
134 if (fwrite(aHeader
, 1, sizeof(aHeader
), pOutFile
) != sizeof(aHeader
)
135 || fwrite(aImage
+ uiStart
, 1, uiSize
, pOutFile
) != uiSize
)
137 printf("Write error\n");