FreeCalypso > hg > freecalypso-tools
annotate miscutil/mokosrec2bin.c @ 1014:961efadd530a default tip
fc-shell TCH DL handler: add support for CSD modes
TCH DL capture mechanism in FC Tourmaline firmware has been extended
to support CSD modes in addition to speech - add the necessary support
on the host tools side.
It needs to be noted that this mechanism in its present state does NOT
provide the debug utility value that was sought: as we learned only
after the code was implemented, TI's DSP has a misfeature in that the
buffer we are reading (a_dd_0[]) is zeroed out when the IDS block
is enabled, i.e., we are reading all zeros and not the real DL bits
we were after. But since the code has already been written, we are
keeping it - perhaps we can do some tests with IDS disabled.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 26 Nov 2024 06:27:43 +0000 |
parents | d00ffedacab5 |
children |
rev | line source |
---|---|
412
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * GSM device firmwares that are built with TI's TMS470 toolchain in TI's |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * canonical way come out in TI's *.m0 format produced by TI's hex470 tool. |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * TI's *.m0 is a variant of the classic S-record format from Motorola, |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * but the specific variant depends on the -memwidth and -romwidth options |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * with which the hex470 tool is run. |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 * In TI's canonical architecture (as opposed to Mot/Compal's heavily modified |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * version) this hex470 tool is run with -memwidth 16 -romwidth 16 options, |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * and the *.m0 file comes out in the format variant which we have nicknamed |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * "moko-style" after its most famous user. This variant is a byte-reversed |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * S-record format in that each 16-bit word is byte-reversed relative to the |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 * native byte order of the ARM7 processor. (This strange byte order actually |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 * makes some sense if one views the image as a long array of 16-bit hex |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 * values; 16 bits is the width of the flash memory on Calypso GSM devices and |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 * thus the natural unit size for flash programming.) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 * |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 * The present mokosrec2bin utility converts these "moko-style" S-record files |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 * to straight binary, a conversion that includes flipping the order of bytes. |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 */ |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #include <sys/types.h> |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 #include <stdio.h> |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 #include <ctype.h> |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 #include <string.h> |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 #include <strings.h> |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 #include <stdlib.h> |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 char *infname; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 FILE *inf, *outf; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 u_char fillbyte; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 char srecbuf[80]; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 u_char srecbin[40]; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 int lineno, state; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 u_long lastaddr; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 u_char header[6] = {0x06, 0x00, 0x00, 'H', 'D', 'R'}; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 decode_hex_byte(s) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 char *s; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 register int u, l; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 if (!isxdigit(s[0]) || !isxdigit(s[1])) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 return(-1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 if (isdigit(s[0])) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 u = s[0] - '0'; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 else if (isupper(s[0])) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 u = s[0] - 'A' + 10; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 else |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 u = s[0] - 'a' + 10; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 if (isdigit(s[1])) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 l = s[1] - '0'; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 else if (isupper(s[1])) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 l = s[1] - 'A' + 10; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 else |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 l = s[1] - 'a' + 10; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 return((u << 4) | l); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 srec2bin() |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 register int i, l, b; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 l = decode_hex_byte(srecbuf + 2); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 if (l < 1) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 fprintf(stderr, "%s line %d: S-record length octet is bad\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 srecbin[0] = l; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 if (l > 35) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 fprintf(stderr, |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 "%s line %d: S-record is longer than expected\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 for (i = 1; i <= l; i++) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 b = decode_hex_byte(srecbuf + i*2 + 2); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 if (b < 0) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 fprintf(stderr, "%s line %d: hex decode error\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 srecbin[i] = b; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 return(0); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 srec_cksum() |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 u_char accum; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 register int i, len; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 len = srecbin[0] + 1; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 accum = 0; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 for (i = 0; i < len; i++) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 accum += srecbin[i]; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 if (accum != 0xFF) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 fprintf(stderr, "%s line %d: bad checksum\n", infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 return(0); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 main(argc, argv) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 char **argv; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 register int i; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 u_long curaddr; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 int datalen; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 if (argc < 3 || argc > 4) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 usage: fprintf(stderr, "usage: %s input.m0 output.bin [fill-byte]\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 argv[0]); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 infname = argv[1]; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 inf = fopen(infname, "r"); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 if (!inf) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 perror(infname); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 if (argc > 3) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 i = decode_hex_byte(argv[3]); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 if (i >= 0) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 fillbyte = i; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 else |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 goto usage; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 } else |
626
d00ffedacab5
mokosrec2bin: default fill byte changed to 0xFF
Mychaela Falconia <falcon@freecalypso.org>
parents:
412
diff
changeset
|
131 fillbyte = 0xFF; |
412
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 state = 0; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 for (lineno = 1; ; lineno++) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 if (!fgets(srecbuf, sizeof srecbuf, inf)) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 fprintf(stderr, "%s: premature EOF\n", infname); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 if (srecbuf[0] != 'S') { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 fprintf(stderr, "%s line %d: not an S-record\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 switch (srecbuf[1]) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 case '0': |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 if (state == 0) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 break; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 else |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 goto badtype; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 case '3': |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 if (state == 0) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 goto badtype; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 else |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 break; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 case '7': |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 if (state == 2) |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 break; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 else |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 goto badtype; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 default: |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 badtype: |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 fprintf(stderr, |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 "%s line %d: S-record type unexpected\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 srec2bin(); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 srec_cksum(); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 if (state == 0) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 if (bcmp(srecbin, header, 6)) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 fprintf(stderr, "%s: expected header missing\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 infname); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 state = 1; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 continue; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 switch (srecbuf[1]) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 case '3': |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 if (srecbin[0] < 6) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 fprintf(stderr, |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 "%s line %d: S3 record is too short\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 curaddr = (srecbin[1] << 24) | (srecbin[2] << 16) | |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 (srecbin[3] << 8) | srecbin[4]; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 if (curaddr & 1) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 fprintf(stderr, "%s line %d: odd address\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 datalen = srecbin[0] - 5; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 if (datalen & 1) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 fprintf(stderr, "%s line %d: odd data length\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 if (state < 2) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 outf = fopen(argv[2], "w"); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 if (!outf) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 perror(argv[2]); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 state = 2; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 lastaddr = 0; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 if (curaddr < lastaddr) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 fprintf(stderr, |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 "%s line %d: address going backwards\n", |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 infname, lineno); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 exit(1); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 while (lastaddr < curaddr) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 putc(fillbyte, outf); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 lastaddr++; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 for (i = 0; i < datalen; i += 2) { |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 putc(srecbin[i + 6], outf); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 putc(srecbin[i + 5], outf); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 lastaddr = curaddr + datalen; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 continue; |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 case '7': |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 fclose(outf); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 exit(0); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 default: |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 abort(); |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 } |
a5dab452be0d
mokosrec2bin utility imported from the old freecalypso-reveng tree,
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 } |