source: buchla-68k/ram/dopatch.c@ 7ecfb7b

Last change on this file since 7ecfb7b was 7ecfb7b, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Unused variables and parameters.

  • Property mode set to 100644
File size: 10.8 KB
Line 
1/*
2 =============================================================================
3 dopatch.c -- MIDAS-VII Patch facility -- execution functions
4 Version 15 -- 1988-11-15 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#define DEBUGPA 0
9
10#include "ram.h"
11
12#if DEBUGPA
13short debugpa = 1;
14#endif
15
16#define ST_NUL 0x0000 /* no subaddress breakdown */
17#define ST_VGT 0x0001 /* break subaddress into voice, group */
18#define ST_PCT 0x0002 /* break subaddress into port, chan, trig */
19
20uint16_t seqdupd; /* sequence display update flag */
21int8_t ledstat[24]; /* LED status */
22
23int16_t frq2par[] = {1, 3, 5, 7}; /* Frq to par */
24
25int16_t ind2par[] = {9, 11, 12, 13, 14, 15}; /* Ind to par */
26
27int16_t cv2vce[] = {11, 10, 6, 8}; /* CV to voice */
28
29int16_t lg2base[7] = { 0, 3, 7, 10, 14, 17, 21}; /* LED group bases */
30
31int8_t vgtype[] = {
32
33 ST_NUL, /* PA_NULL */
34
35 ST_PCT, /* PA_KEY */
36 ST_PCT, /* PA_TRG */
37
38 ST_NUL, /* PA_PLS */
39 ST_NUL, /* PA_LED */
40 ST_NUL, /* PA_SLIN */
41 ST_NUL, /* PA_SCTL */
42 ST_NUL, /* PA_TUNE */
43 ST_NUL, /* PA_RSET */
44 ST_NUL, /* PA_RADD */
45
46 ST_VGT, /* PA_INST */
47 ST_VGT, /* PA_OSC */
48 ST_VGT, /* PA_WAVA */
49 ST_VGT, /* PA_WAVB */
50 ST_VGT, /* PA_CNFG */
51 ST_VGT, /* PA_LEVL */
52 ST_VGT, /* PA_INDX */
53 ST_VGT, /* PA_FREQ */
54 ST_VGT, /* PA_FILT */
55 ST_VGT, /* PA_FILQ */
56 ST_VGT, /* PA_LOCN */
57 ST_VGT, /* PA_DYNM */
58
59 ST_NUL, /* PA_AUX */
60 ST_NUL, /* PA_RATE */
61 ST_NUL, /* PA_INTN */
62 ST_NUL, /* PA_DPTH */
63 ST_NUL, /* PA_VOUT */
64};
65
66/*
67 =============================================================================
68 pdows() -- get a waveshape for a voice
69 =============================================================================
70*/
71
72void pdows(int16_t slot, int16_t voice, int16_t wsn)
73{
74 uint16_t *fpuws;
75
76 if (slot) { /* waveshape slot B */
77
78 vbufs[voice].idhwsb = wsn;
79
80 memcpyw(vbufs[voice].idhwvbf, &wslib[wsn],
81 NUMHARM + (2 * NUMWPNT));
82
83 fpuws = io_fpu + FPU_OWST + (voice << 9) + 1;
84
85 memcpyw(fpuws, vbufs[voice].idhwvbf, NUMWPNT);
86
87 *(fpuws - 1) = vbufs[voice].idhwvbf[0];
88 *(fpuws + NUMWPNT) = vbufs[voice].idhwvbf[NUMWPNT - 1];
89
90 } else { /* waveshape slot A */
91
92 vbufs[voice].idhwsa = wsn;
93
94 memcpyw(vbufs[voice].idhwvaf, &wslib[wsn],
95 NUMHARM + (2 * NUMWPNT));
96
97 fpuws = io_fpu + FPU_OWST + (voice << 9) + 0x0100 + 1;
98
99 memcpyw(fpuws, vbufs[curvce].idhwvaf, NUMWPNT);
100
101 *(fpuws - 1) = vbufs[voice].idhwvaf[0];
102 *(fpuws + NUMWPNT) = vbufs[voice].idhwvaf[NUMWPNT - 1];
103
104 }
105}
106
107/*
108 =============================================================================
109 pfpufn() -- process an FPU function operation for a patch
110 =============================================================================
111*/
112
113void pfpufn(uint16_t voice, uint16_t par, uint16_t dat1, uint16_t dat2)
114{
115 register uint16_t *fpu;
116 int16_t delay;
117
118 fpu = io_fpu + FPU_OFNC + (voice << 8) + (par << 4);
119
120 switch (dat1) {
121
122 case PSA_SRC: /* source */
123 break;
124
125 case PSA_MLT: /* multiplier */
126
127 *(fpu + (int32_t)FPU_TSF1) = dat2;
128 break;
129
130 case PSA_TIM: /* time */
131
132 *(fpu + (int32_t)FPU_TMNT) = (((int32_t)dat2 & 0x0000FFF0L)
133 * ((int32_t)timemlt & 0x0000FFFFL)) >> 15;
134
135 ++delay;
136
137 *(fpu + (int32_t)FPU_TEXP) = expbit[dat2 & 0x000F];
138
139 break;
140
141 case PSA_VAL: /* value */
142
143 sendval(voice, par, dat2);
144 break;
145
146 case PSA_FNC: /* function */
147 break;
148
149 default: /* something weird got in here ... */
150 break;
151 }
152}
153
154/*
155 =============================================================================
156 pdoctl() -- do oscillator control for a patch entry
157 =============================================================================
158*/
159
160void pdoctl(int16_t voice, int16_t osc, int16_t dat1, int16_t dat2)
161{
162 register struct instdef *ip;
163
164 ip = &vbufs[voice];
165 bform = dat1;
166 setoval(ip, osc, dat2 >> 1);
167}
168
169/*
170 =============================================================================
171 dopatch() -- execute a patch entry
172 =============================================================================
173*/
174
175void dopatch(struct patch *pp)
176{
177 register uint16_t suba, dat1, dat2;
178 register int16_t i, temp;
179 register int8_t *ser, *iorec;
180 uint16_t chan, oldsr, osc, port, spec, sat,trig, vgr, vgn, vgt;
181 int16_t baseled, curled, ledctl;
182
183 spec = PE_SPEC & pp->paspec; /* destination */
184 suba = pp->pasuba; /* sub address */
185 dat1 = pp->padat1; /* data word 1 */
186 dat2 = pp->padat2; /* data word 2 */
187
188 sat = vgtype[spec]; /* sub-address type */
189
190 if (ST_VGT & sat) { /* vg, osc sub-address types */
191
192 vgr = 0x00FF & (suba >> 8); /* voice / group */
193 osc = 0x00FF & suba; /* oscillator */
194
195 if (vgr > 11) { /* sort out voices from groups */
196
197 vgt = 1; /* group */
198 vgn = vgr - 12;
199
200 } else {
201
202 vgt = 0; /* voice */
203 vgn = vgr;
204 }
205
206 } else if (ST_PCT & sat) { /* port, chan, trig sub-address types */
207
208 port = 0x0003 & (suba >> 11); /* port */
209 chan = 0x000F & (suba >> 7); /* channel */
210 trig = 0x007F & suba; /* trigger */
211
212 (void)port;
213 (void)chan;
214 }
215
216 switch (spec) { /* dispatch on destination */
217
218 case PA_KEY: /* key action */
219
220 if ((dat2 EQ 0) OR (dat2 EQ 2))
221 putwq(&ptefifo, suba & 0x1FFF); /* closure */
222
223 if ((dat2 EQ 0) OR (dat2 EQ 1))
224 putwq(&ptefifo, suba | 0x8000); /* release */
225
226 break;
227
228 case PA_TRG: /* trigger */
229
230 trig &= 0x000F;
231 trstate[trig] = dat2;
232
233 if (dat2)
234 putwq(&ptefifo, suba); /* closure */
235
236 seqdupd |= (1 << trig);
237 break;
238
239 case PA_PLS: /* pulse output */
240
241 if (suba) {
242
243 ser = &io_midi + 10L; /* pulse 2 */
244 iorec = M2IoRec;
245
246 } else {
247
248 ser = &io_midi + 2L; /* pulse 1 */
249 iorec = M1IoRec;
250 }
251
252 oldsr = setsr(0x2700); /* DISABLE INTERRUPTS */
253
254 temp = iorec[29]; /* get current CFR1 */
255
256 switch (dat2) { /* switch on operation */
257
258 case 0: /* transient */
259
260 *ser = temp | 0x0082; /* on */
261 *ser = (temp & 0x00FD) | 0x0080; /* off */
262 break;
263
264 case 1: /* off */
265
266 *ser = (temp & 0x00FD) | 0x0080; /* off */
267 break;
268
269 case 2: /* on */
270
271 *ser = temp | 0x0082; /* on */
272 break;
273 }
274
275 setsr(oldsr); /* RESTORE INTERRUPTS */
276
277 break;
278
279 case PA_LED: /* LED control */
280
281 baseled = lg2base[suba]; /* get base of LED group */
282
283 for (i = 0; i < (3 + (suba & 1)); i++) { /* scan LEDs */
284
285 curled = i + baseled;
286 ledctl = 0x0003 & (dat1 >> (14 - (i << 1)));
287
288 if (ledctl EQ 1) { /* on */
289
290 ledstat[curled] = TRUE;
291 io_leds = curled;
292
293 } else if (ledctl EQ 2) { /* off */
294
295 ledstat[curled] = FALSE;
296 io_leds = curled | 0x0080;
297
298 } else if (ledctl EQ 3) { /* toggle */
299
300 if (ledstat[curled]) { /* on -> off */
301
302 ledstat[curled] = FALSE;
303 io_leds = curled | 0x0080;
304
305 } else { /* off -> on */
306
307 ledstat[curled] = TRUE;
308 io_leds = curled;
309 }
310 }
311 }
312
313 break;
314
315 case PA_SLIN: /* sequence line */
316
317 seqline[suba] = dat1;
318 seqdupd |= (1 << suba);
319 break;
320
321 case PA_SCTL: /* sequence control */
322
323
324 if (dat2) { /* start */
325
326 seqflag[suba] |= (SQF_RUN|SQF_CLK);
327 seqtime[suba] = seqtab[seqline[suba]].seqtime;
328
329#if DEBUGPA
330 if (debugsw AND debugpa)
331 printf("dopatch($%08lX): SLIN %02u %03u %5u RUN\n",
332 pp, suba, seqline[suba], seqtime[suba]);
333#endif
334
335 } else { /* stop */
336
337 seqflag[suba] = 0;
338 seqtime[suba] = 0;
339
340#if DEBUGPA
341 if (debugsw AND debugpa)
342 printf("dopatch($%08lX): SLIN %02u %03u STOP\n",
343 pp, suba, seqline[suba]);
344#endif
345
346 }
347
348 seqdupd |= (1 << suba);
349 break;
350
351 case PA_TUNE: /* tuning table */
352
353 gettun(dat1);
354 break;
355
356 case PA_RSET: /* register set */
357
358 sregval[suba] = dat1 ? sregval[dat2] : dat2;
359 seqdupd |= (1 << suba);
360 break;
361
362 case PA_RADD: /* regsister add */
363
364 temp = sregval[suba] + (dat1 ? sregval[dat2] : dat2);
365
366 if (temp > 99)
367 temp = 99;
368 else if (temp < 0)
369 temp = 0;
370
371 sregval[suba] = temp;
372 seqdupd |= (1 << suba);
373 break;
374
375 case PA_INST: /* instrument select */
376
377 if (vgt) { /* group */
378
379 ins2grp[vgn] = (ins2grp[vgn] & 0xFF00) | dat1;
380 setv2gi(vgn);
381
382 } else { /* voice */
383
384 if (curvce EQ vgn)
385 curinst = dat1;
386
387 s_inst[vgn] = dat1;
388 execins(vgn, dat1, 1);
389 }
390
391 break;
392
393 case PA_OSC: /* oscillator control */
394
395 if (vgt) { /* group */
396
397 for (i = 0; i < 12; i++)
398 if (vce2grp[i] EQ (1 + vgn))
399 pdoctl(i, osc, dat1, dat2);
400
401 } else { /* voice */
402
403 pdoctl(vgn, osc, dat1, dat2);
404 }
405
406 break;
407
408 case PA_WAVA: /* waveshape A select */
409
410 if (vgt) { /* group */
411
412 for (i = 0; i < 12; i++)
413 if (vce2grp[i] EQ (1 + vgn))
414 pdows(0, i, dat1);
415
416 } else { /* voice */
417
418 pdows(0, vgn, dat1);
419 }
420
421 break;
422
423 case PA_WAVB: /* waveshape B select */
424
425 if (vgt) { /* group */
426
427 for (i = 0; i < 12; i++)
428 if (vce2grp[i] EQ (1 + vgn))
429 pdows(1, i, dat1);
430
431 } else { /* voice */
432
433 pdows(1, vgn, dat1);
434 }
435
436 break;
437
438 case PA_CNFG: /* configuration select */
439
440 if (vgt) {
441
442 for (i = 0; i < 12; i++)
443 if (vce2grp[i] EQ (1 + vgn)) {
444
445 vbufs[i].idhcfg = dat1;
446 dosync(i);
447 }
448 } else {
449
450 vbufs[vgn].idhcfg = dat1;
451 dosync(vgn);
452 }
453
454 break;
455
456 case PA_LEVL: /* level */
457
458 if (vgt) { /* group */
459
460 for (i = 0; i < 12; i++)
461 if (vce2grp[i] EQ (1 + vgn))
462 pfpufn(i, 2, dat1, dat2);
463
464 } else { /* voice */
465
466 pfpufn(vgn, 2, dat1, dat2);
467 }
468
469 break;
470
471 case PA_INDX: /* index */
472
473 if (vgt) { /* group */
474
475 for (i = 0; i < 12; i++)
476 if (vce2grp[i] EQ (1 + vgn))
477 pfpufn(i, ind2par[osc], dat1, dat2);
478
479 } else { /* voice */
480
481 pfpufn(vgn, ind2par[osc], dat1, dat2);
482 }
483
484 break;
485
486 case PA_FREQ: /* frequency */
487
488 if (vgt) { /* group */
489
490 for (i = 0; i < 12; i++)
491 if (vce2grp[i] EQ (1 + vgn))
492 pfpufn(i, frq2par[osc], dat1, dat2);
493
494 } else { /* voice */
495
496 pfpufn(vgn, frq2par[osc], dat1, dat2);
497 }
498
499 break;
500
501 case PA_FILT: /* filter frequency */
502
503 if (vgt) { /* group */
504
505 for (i = 0; i < 12; i++)
506 if (vce2grp[i] EQ (1 + vgn))
507 pfpufn(i, 10, dat1, dat2);
508
509 } else { /* voice */
510
511 pfpufn(vgn, 10, dat1, dat2);
512 }
513
514 break;
515
516 case PA_FILQ: /* filter resonance */
517
518 if (vgt) { /* group */
519
520 for (i = 0; i < 12; i++)
521 if (vce2grp[i] EQ (1 + vgn))
522 pfpufn(i, 6, dat1, dat2);
523
524 } else { /* voice */
525
526 pfpufn(vgn, 6, dat1, dat2);
527 }
528
529 break;
530
531 case PA_LOCN: /* location */
532
533 if (vgt) { /* group */
534
535 for (i = 0; i < 12; i++)
536 if (vce2grp[i] EQ (1 + vgn))
537 pfpufn(i, 4, dat1, dat2);
538
539 } else { /* voice */
540
541 pfpufn(vgn, 4, dat1, dat2);
542 }
543
544 break;
545
546 case PA_DYNM: /* dynamics */
547
548 if (vgt) { /* group */
549
550 for (i = 0; i < 12; i++)
551 if (vce2grp[i] EQ (1 + vgn))
552 pfpufn(i, 8, dat1, dat2);
553
554 } else { /* voice */
555
556 pfpufn(vgn, 8, dat1, dat2);
557 }
558
559 break;
560
561 case PA_AUX: /* auxiliary control */
562
563 pfpufn(9, 0, dat1, dat2);
564 break;
565
566 case PA_RATE: /* phase shifter rate */
567
568 pfpufn(2, 0, dat1, dat2);
569 break;
570
571 case PA_INTN: /* phase shifter intensity */
572
573 pfpufn(1, 0, dat1, dat2);
574 break;
575
576 case PA_DPTH: /* phase shifter depth */
577
578 pfpufn(3, 0, dat1, dat2);
579 break;
580
581 case PA_VOUT: /* control voltage output */
582
583 pfpufn(cv2vce[suba], 0, dat1, dat2);
584 break;
585
586 }
587}
588
Note: See TracBrowser for help on using the repository browser.