FreeCalypso > hg > freecalypso-tools
annotate ringtools/fc-e1gen.c @ 465:003e48f8ebe1
rvinterf/etmsync/fsnew.c: cast 0 to (char *) for execl sentinel
I generally don't use NULL and use plain 0 instead, based on a "NULL
considered harmful" discussion on the classiccmp mailing list many aeons
ago (I couldn't find it, and I reason that it must have been 2005 or
earlier), but a recent complaint by a packager sent me searching, and I
found this:
https://ewontfix.com/11/
While I don't give a @#$% about "modern" systems and code-nazi tools,
I realized that passing a plain 0 as a pointer sentinel in execl is wrong
because it will break on systems where pointers are longer than the plain
int type. Again, I don't give a @#$% about the abomination of x86_64 and
the like, but if anyone ever manages to port my code to something like a
PDP-11 (16-bit int, 32-bit long and pointers), then passing a plain 0
as a function argument where a pointer is expected most definitely won't
work: if the most natural stack slot and SP alignment unit is 16 bits,
fitting an int, with longs and pointers taking up two such slots, then
the call stack will be totally wrong with a plain 0 passed for a pointer.
Casting the 0 to (char *) ought to be the most kosher solution for the
most retro systems possible.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 11 Feb 2019 00:00:19 +0000 |
parents | 2133c475f5bd |
children |
rev | line source |
---|---|
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * This program is an experimental compiler for TI's Melody E1 format |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * based on the description given in the L1M_AS001_1.pdf document |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * found in the Peek/FGW drop. |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 */ |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <sys/types.h> |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdio.h> |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdlib.h> |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <ctype.h> |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <string.h> |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include <strings.h> |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 |
177
2133c475f5bd
fc-e1gen: MAX_FIELDS needed to be bumped for the optional bit0 field
Mychaela Falconia <falcon@freecalypso.org>
parents:
175
diff
changeset
|
14 #define MAX_FIELDS 17 |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 char *infname, *outfname; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 FILE *inf, *outf; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 char linebuf[512], *fields[MAX_FIELDS+1]; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 int lineno, nfields; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
172
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
21 int global_osc_set; |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 int start_time, osc_mask; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 u_short osc_words[8][4]; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 get_input_line() |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 char *cp; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 int n; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 if (!fgets(linebuf, sizeof linebuf, inf)) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 fprintf(stderr, "%s: unexpected EOF\n", infname); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 cp = index(linebuf, '\n'); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 if (!cp) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 fprintf(stderr, "%s line %d: too long or missing newline\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 infname, lineno); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 *cp = '\0'; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 /* parse it into fields */ |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 cp = linebuf; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 n = 0; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 for (;;) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 while (isspace(*cp)) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 cp++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 if (*cp == '\0' || *cp == '#') |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 break; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 if (n >= MAX_FIELDS) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 fprintf(stderr, "%s line %d: too many fields\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 infname, lineno); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 fields[n++] = cp; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 while (*cp && !isspace(*cp)) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 cp++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 if (*cp) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 *cp++ = '\0'; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 fields[n] = 0; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 nfields = n; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 input_number(str, min, max) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 char *str; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 char *endp; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 long val; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 val = strtol(str, &endp, 10); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 if (*endp) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 fprintf(stderr, |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 "%s line %d: \"%s\" is not a valid decimal number\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 infname, lineno, str); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 if (val < min || val > max) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 fprintf(stderr, "%s line %d: number %ld is out of range\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 infname, lineno, val); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 return val; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
85 input_paren_number(str, min, max) |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
86 char *str; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
87 { |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
88 char *cp; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
89 |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
90 if (str[0] != '(') { |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
91 badparen: fprintf(stderr, |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
92 "%s line %d: bad parenthesized argument \"%s\"\n", |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
93 infname, lineno, str); |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
94 exit(1); |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
95 } |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
96 cp = index(str, ')'); |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
97 if (!cp || cp[1]) |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
98 goto badparen; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
99 *cp = '\0'; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
100 return input_number(str + 1, min, max); |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
101 } |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
102 |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 handle_time_line() |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 if (nfields != 2) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 fprintf(stderr, "%s line %d: time header takes 1 argument\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 infname, lineno); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 start_time = input_number(fields[1], 1, 255); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 check_req_field(n) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 if (n >= nfields) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 fprintf(stderr, "%s line %d: too few fields\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 infname, lineno); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 process_osc_line() |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 int p = 1; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 int oscn, osc_bit; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 u_short word0, word1, word2, word3; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 int amp, freq, length; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 int tremT0, tremFreq; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 int sustain, t1, t2, t3, t5; |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
130 int bit0; |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 oscn = input_number(fields[p], 0, 7); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 osc_bit = 1 << oscn; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 if (osc_mask & osc_bit) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 fprintf(stderr, "%s line %d: osc %d defined more than once\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 infname, lineno, oscn); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 osc_mask |= osc_bit; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 /* basic part */ |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 check_req_field(p); |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
145 if (fields[p][0] == '(') { |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
146 bit0 = input_paren_number(fields[p], 0, 1); |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
147 p++; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
148 check_req_field(p); |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
149 } else |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
150 bit0 = 0; |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 if (!strcmp(fields[p], "df")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 freq = input_number(fields[p], -8192, 8191) & 0x3FFF; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 amp = input_number(fields[p], 0, 1023); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 p++; |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
159 word0 = freq << 2 | 2 | bit0; |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 word1 = amp << 6; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 } else { |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
162 word0 = bit0; |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 if (!strcmp(fields[p], "sq1")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 word0 |= 4; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 if (!strcmp(fields[p], "sq2")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 word0 |= 8; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 amp = input_number(fields[p], 0, 63); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 freq = input_number(fields[p], 0, 63); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 word0 |= (freq << 10) | (amp << 4); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 length = input_number(fields[p], 0, 1023); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 word1 = length << 6; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 /* optional 3rd word */ |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 if (p < nfields && !strcmp(fields[p], "trem")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 word1 |= 0x10; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 tremT0 = input_number(fields[p], 0, 7); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 tremFreq = input_number(fields[p], -16, 15) & 31; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 word2 = (tremFreq << 11) | (tremT0 << 8); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 /* optional 4th word */ |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 if (p < nfields && !strcmp(fields[p], "env")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 word1 |= 0x20; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 sustain = input_number(fields[p], 0, 15); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 t1 = input_number(fields[p], 0, 7); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 t2 = input_number(fields[p], 0, 7); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 t3 = input_number(fields[p], 0, 7); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 check_req_field(p); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 t5 = input_number(fields[p], 0, 7); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 p++; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 word3 = (t1 << 13) | (t2 << 10) | (t3 << 7) | (t5 << 4) | |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 sustain; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 if (p != nfields) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 fprintf(stderr, "%s line %d: unexpected extra fields\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 infname, lineno); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 osc_words[oscn][0] = word0; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 osc_words[oscn][1] = word1; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 osc_words[oscn][2] = word2; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 osc_words[oscn][3] = word3; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 read_osc_lines() |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 osc_mask = 0; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 for (;;) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 get_input_line(); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 if (!nfields) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 break; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 if (!strcmp(fields[0], "osc")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 process_osc_line(); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 continue; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 fprintf(stderr, "%s line %d: osc line expected\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 infname, lineno); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 emit_16bit_word(word) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 u_short word; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 putc(word & 0xFF, outf); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 putc(word >> 8, outf); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 emit_record() |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
257 int oscn, osc_bit; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
258 |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 putc(start_time, outf); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 putc(osc_mask, outf); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 for (oscn = 0; oscn < 8; oscn++) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 osc_bit = 1 << oscn; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 if (!(osc_mask & osc_bit)) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 continue; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 emit_16bit_word(osc_words[oscn][0]); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 emit_16bit_word(osc_words[oscn][1]); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 if (osc_words[oscn][1] & 0x10) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 emit_16bit_word(osc_words[oscn][2]); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 if (osc_words[oscn][1] & 0x20) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
270 emit_16bit_word(osc_words[oscn][3]); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
271 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
272 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
273 |
172
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
274 handle_global_osc_set() |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
275 { |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
276 int p; |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
277 int oscn, osc_bit; |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
278 int dummy_time_byte; |
172
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
279 |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
280 do |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
281 get_input_line(); |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
282 while (!nfields); |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
283 if (strcmp(fields[0], "osc-set")) { |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
284 fprintf(stderr, "%s line %d: osc-set line expected\n", |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
285 infname, lineno); |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
286 exit(1); |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
287 } |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
288 if (nfields < 2) { |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
289 emptyerr: fprintf(stderr, "%s line %d: osc-set must be non-empty\n", |
172
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
290 infname, lineno); |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
291 exit(1); |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
292 } |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
293 p = 1; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
294 if (fields[p][0] == '(') { |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
295 dummy_time_byte = input_paren_number(fields[p], 0, 255); |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
296 p++; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
297 if (nfields < 3) |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
298 goto emptyerr; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
299 } else |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
300 dummy_time_byte = 0; |
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
301 for (; p < nfields; p++) { |
172
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
302 oscn = input_number(fields[p], 0, 7); |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
303 osc_bit = 1 << oscn; |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
304 global_osc_set |= osc_bit; |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
305 } |
175
b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
Mychaela Falconia <falcon@freecalypso.org>
parents:
172
diff
changeset
|
306 putc(dummy_time_byte, outf); |
172
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
307 putc(global_osc_set, outf); |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
308 } |
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
309 |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
310 main(argc, argv) |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
311 char **argv; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
312 { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
313 if (argc != 3) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
314 fprintf(stderr, "usage: %s src-file e1-bin-file\n", argv[0]); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
315 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
316 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
317 if (strcmp(argv[1], "-")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
318 infname = argv[1]; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
319 inf = fopen(infname, "r"); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
320 if (!inf) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
321 perror(infname); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
322 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
323 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
324 } else { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
325 infname = "stdin"; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
326 inf = stdin; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
327 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
328 outfname = argv[2]; |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
329 outf = fopen(outfname, "w"); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
330 if (!outf) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
331 perror(outfname); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
332 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
333 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
334 |
172
c138906889f7
fc-e1gen & e1-experiments: added global oscillator set header word
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
335 handle_global_osc_set(); |
33
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
336 /* main loop */ |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
337 for (;;) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
338 do |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
339 get_input_line(); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
340 while (!nfields); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
341 if (!strcmp(fields[0], "time")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
342 handle_time_line(); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
343 read_osc_lines(); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
344 emit_record(); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
345 } else if (!strcmp(fields[0], "end")) { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
346 emit_16bit_word(0); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
347 exit(0); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
348 } else { |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
349 fprintf(stderr, "%s line %d: expected time or end\n", |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
350 infname, lineno); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
351 exit(1); |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
352 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
353 } |
cefdc6623322
fc-e1gen utility written, compiles
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
354 } |