FreeCalypso > hg > freecalypso-tools
comparison ringtools/fc-e1gen.c @ 175:b002c7cf5d03
fc-e1gen: support parenthesized options for bit0 and dummy time byte
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 25 Mar 2017 18:36:37 +0000 |
parents | c138906889f7 |
children | 2133c475f5bd |
comparison
equal
deleted
inserted
replaced
174:17523db6d1dc | 175:b002c7cf5d03 |
---|---|
80 exit(1); | 80 exit(1); |
81 } | 81 } |
82 return val; | 82 return val; |
83 } | 83 } |
84 | 84 |
85 input_paren_number(str, min, max) | |
86 char *str; | |
87 { | |
88 char *cp; | |
89 | |
90 if (str[0] != '(') { | |
91 badparen: fprintf(stderr, | |
92 "%s line %d: bad parenthesized argument \"%s\"\n", | |
93 infname, lineno, str); | |
94 exit(1); | |
95 } | |
96 cp = index(str, ')'); | |
97 if (!cp || cp[1]) | |
98 goto badparen; | |
99 *cp = '\0'; | |
100 return input_number(str + 1, min, max); | |
101 } | |
102 | |
85 handle_time_line() | 103 handle_time_line() |
86 { | 104 { |
87 if (nfields != 2) { | 105 if (nfields != 2) { |
88 fprintf(stderr, "%s line %d: time header takes 1 argument\n", | 106 fprintf(stderr, "%s line %d: time header takes 1 argument\n", |
89 infname, lineno); | 107 infname, lineno); |
107 int oscn, osc_bit; | 125 int oscn, osc_bit; |
108 u_short word0, word1, word2, word3; | 126 u_short word0, word1, word2, word3; |
109 int amp, freq, length; | 127 int amp, freq, length; |
110 int tremT0, tremFreq; | 128 int tremT0, tremFreq; |
111 int sustain, t1, t2, t3, t5; | 129 int sustain, t1, t2, t3, t5; |
130 int bit0; | |
112 | 131 |
113 check_req_field(p); | 132 check_req_field(p); |
114 oscn = input_number(fields[p], 0, 7); | 133 oscn = input_number(fields[p], 0, 7); |
115 p++; | 134 p++; |
116 osc_bit = 1 << oscn; | 135 osc_bit = 1 << oscn; |
121 } | 140 } |
122 osc_mask |= osc_bit; | 141 osc_mask |= osc_bit; |
123 | 142 |
124 /* basic part */ | 143 /* basic part */ |
125 check_req_field(p); | 144 check_req_field(p); |
145 if (fields[p][0] == '(') { | |
146 bit0 = input_paren_number(fields[p], 0, 1); | |
147 p++; | |
148 check_req_field(p); | |
149 } else | |
150 bit0 = 0; | |
126 if (!strcmp(fields[p], "df")) { | 151 if (!strcmp(fields[p], "df")) { |
127 p++; | 152 p++; |
128 check_req_field(p); | 153 check_req_field(p); |
129 freq = input_number(fields[p], -8192, 8191) & 0x3FFF; | 154 freq = input_number(fields[p], -8192, 8191) & 0x3FFF; |
130 p++; | 155 p++; |
131 check_req_field(p); | 156 check_req_field(p); |
132 amp = input_number(fields[p], 0, 1023); | 157 amp = input_number(fields[p], 0, 1023); |
133 p++; | 158 p++; |
134 word0 = freq << 2 | 2; | 159 word0 = freq << 2 | 2 | bit0; |
135 word1 = amp << 6; | 160 word1 = amp << 6; |
136 } else { | 161 } else { |
137 word0 = 0; | 162 word0 = bit0; |
138 if (!strcmp(fields[p], "sq1")) { | 163 if (!strcmp(fields[p], "sq1")) { |
139 p++; | 164 p++; |
140 word0 |= 4; | 165 word0 |= 4; |
141 check_req_field(p); | 166 check_req_field(p); |
142 } | 167 } |
248 | 273 |
249 handle_global_osc_set() | 274 handle_global_osc_set() |
250 { | 275 { |
251 int p; | 276 int p; |
252 int oscn, osc_bit; | 277 int oscn, osc_bit; |
278 int dummy_time_byte; | |
253 | 279 |
254 do | 280 do |
255 get_input_line(); | 281 get_input_line(); |
256 while (!nfields); | 282 while (!nfields); |
257 if (strcmp(fields[0], "osc-set")) { | 283 if (strcmp(fields[0], "osc-set")) { |
258 fprintf(stderr, "%s line %d: osc-set line expected\n", | 284 fprintf(stderr, "%s line %d: osc-set line expected\n", |
259 infname, lineno); | 285 infname, lineno); |
260 exit(1); | 286 exit(1); |
261 } | 287 } |
262 if (nfields < 2) { | 288 if (nfields < 2) { |
263 fprintf(stderr, "%s line %d: osc-set must be non-empty\n", | 289 emptyerr: fprintf(stderr, "%s line %d: osc-set must be non-empty\n", |
264 infname, lineno); | 290 infname, lineno); |
265 exit(1); | 291 exit(1); |
266 } | 292 } |
267 for (p = 1; p < nfields; p++) { | 293 p = 1; |
294 if (fields[p][0] == '(') { | |
295 dummy_time_byte = input_paren_number(fields[p], 0, 255); | |
296 p++; | |
297 if (nfields < 3) | |
298 goto emptyerr; | |
299 } else | |
300 dummy_time_byte = 0; | |
301 for (; p < nfields; p++) { | |
268 oscn = input_number(fields[p], 0, 7); | 302 oscn = input_number(fields[p], 0, 7); |
269 osc_bit = 1 << oscn; | 303 osc_bit = 1 << oscn; |
270 global_osc_set |= osc_bit; | 304 global_osc_set |= osc_bit; |
271 } | 305 } |
272 putc(0, outf); | 306 putc(dummy_time_byte, outf); |
273 putc(global_osc_set, outf); | 307 putc(global_osc_set, outf); |
274 } | 308 } |
275 | 309 |
276 main(argc, argv) | 310 main(argc, argv) |
277 char **argv; | 311 char **argv; |