source: buchla-68k/ram/msm.c@ b28a12e

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

Zero redundant declarations.

  • Property mode set to 100644
File size: 15.7 KB
Line 
1/*
2 =============================================================================
3 msm.c -- MIDAS-VII -- MIDI state machine
4 Version 75 -- 1988-11-02 -- D.N. Lynx Crowe
5
6 List with pr -e4 option to expand tabs to 4 spaces instead of 8.
7 =============================================================================
8*/
9
10#include "ram.h"
11
12/* initialized stuff */
13
14/* mpmap[] -- MIDI port to BIOS device table */
15
16int16_t mpmap[3] = {MC1_DEV, MC2_DEV, CON_DEV};
17
18/* msmnext[] -- MIDI state machine -- channel message next state table */
19
20int16_t msmnext[8] = {2, 2, 2, 2, 1, 1, 2, 0};
21
22/* msmcnxt[] -- MIDI state machine -- system message next state table */
23
24int16_t msmcnxt[8] = {0, 0, 2, 1, 0, 0, 0, 0};
25
26/* ctl2src -- controller to source table */
27
28int16_t ctl2src[] = {SM_VTMW, SM_LPBR, SM_CTL1, SM_PED1};
29
30/*
31
32*/
33
34/*
35 =============================================================================
36 msm() -- MIDI state machine
37 =============================================================================
38*/
39
40void msm(void)
41{
42 register int16_t miport;
43 register int16_t midiin;
44 register int16_t i;
45 register int16_t t1;
46 register int16_t t2;
47 register struct s_entry *ep;
48 int16_t j, nvel;
49 int32_t where;
50
51 for (miport = 0; miport < NMPORTS; miport++) { /* for each port ... */
52
53 while (BIOS(B_RDAV, mpmap[miport])) { /* anything there ? */
54
55 dsp_ok = FALSE; /* disallow display update */
56
57 midiin = 0x00FF & BIOS(B_GETC, mpmap[miport]); /* get input */
58
59 if (masens[miport]) /* update active sensing */
60 masens[miport] |= 0x0F;
61
62 switch (msmstv[miport]) { /* switch on state */
63/*
64
65*/
66 case 0: /* waiting for status */
67
68 if (0x0080 & midiin) { /* status */
69
70 michan = 0x000F & midiin;
71 mistat = 0x000F & (midiin >> 4);
72
73 if (midiin < 0x00F0) { /* channel */
74
75 msmstv[miport] = msmnext[mistat & 0x07];
76 mrstat[miport] = midiin;
77
78 } else if (midiin < 0x00F8) { /* common */
79
80 msmstv[miport] = msmcnxt[michan & 0x07];
81 mrstat[miport] = midiin;
82/*
83
84*/
85 } else { /* real-time */
86
87 switch (0x0007 & midiin) {
88
89 case 0: /* clock */
90
91 if (midiclk AND midigo)
92 if ((fc_val += 2) > 0x00FFFFFFL)
93 fc_val = 0x00FFFFFFL;
94
95 break;
96
97 case 2: /* start */
98
99 if ((clkctl EQ CK_MIDI) AND
100 (NOT midigo)) {
101
102 midigo = TRUE;
103
104 if (fc_val)
105 sc_goto(fc_val = 0L);
106
107 clkset(TRUE);
108 dsclk();
109 }
110
111 break;
112
113 case 3: /* continue */
114
115 if ((clkctl EQ CK_MIDI) AND
116 (NOT midigo)) {
117
118 midigo = TRUE;
119 clkset(TRUE);
120 dsclk();
121 }
122
123 break;
124/*
125
126*/
127 case 4: /* stop */
128
129 if ((clkctl EQ CK_MIDI) AND
130 midigo) {
131
132 midigo = FALSE;
133 clkset(FALSE);
134 dsclk();
135 }
136
137 break;
138
139 case 6: /* active sensing */
140
141 masens[miport] |= 0x00FF;
142 break;
143
144 case 7: /* reset */
145
146 for (i = 0; i < NMPORTS; i++) {
147
148 mrstat[i] = 0;
149 msmstv[i] = 0;
150 masens[i] = 0;
151 }
152
153 break;
154 }
155 }
156 }
157
158 continue;
159/*
160
161*/
162 case 1: /* waiting for 1 data byte */
163
164 if (0x80 & midiin) { /* status */
165
166 michan = 0x0F & midiin;
167 mistat = 0x0F & (midiin >> 4);
168
169 if (midiin < 0x00F0) { /* channel */
170
171 msmstv[miport] = msmnext[mistat & 0x07];
172 mrstat[miport] = midiin;
173
174 } else if (midiin < 0x00F8) { /* common */
175
176 msmstv[miport] = msmcnxt[michan & 0x07];
177 mrstat[miport] = midiin;
178/*
179
180*/
181 } else { /* real-time */
182
183 switch (0x0007 & midiin) {
184
185 case 0: /* clock */
186
187 if (midiclk AND midigo)
188 if ((fc_val += 2) > 0x00FFFFFFL)
189 fc_val = 0x00FFFFFFL;
190
191 break;
192
193 case 2: /* start */
194
195 if ((clkctl EQ CK_MIDI) AND
196 (NOT midigo)) {
197
198 midigo = TRUE;
199
200 if (fc_val)
201 sc_goto(fc_val = 0L);
202
203 clkset(TRUE);
204 dsclk();
205 }
206
207 break;
208
209 case 3: /* continue */
210
211 if ((clkctl EQ CK_MIDI) AND
212 (NOT midigo)) {
213
214 midigo = TRUE;
215 clkset(TRUE);
216 dsclk();
217 }
218
219 break;
220/*
221
222*/
223 case 4: /* stop */
224
225 if ((clkctl EQ CK_MIDI) AND
226 midigo) {
227
228 midigo = FALSE;
229 clkset(FALSE);
230 dsclk();
231 }
232
233 break;
234
235 case 6: /* active sensing */
236
237 masens[miport] |= 0x00FF;
238 break;
239
240 case 7: /* reset */
241
242 for (i = 0; i < NMPORTS; i++) {
243
244 mrstat[i] = 0;
245 msmstv[i] = 0;
246 masens[i] = 0;
247 }
248
249 break;
250 }
251 }
252/*
253
254*/
255 } else { /* data */
256
257 michan = 0x000F & mrstat[miport];
258 mistat = 0x000F & (mrstat[miport] >> 4);
259
260 if (mistat EQ 0x0C) {
261
262 /* program change */
263
264 if ((miport EQ 0) AND
265 ((michan + 1) EQ prgchan) AND
266 (midiin LT NASGS)) {
267
268 getasg(curasg = midiin);
269 mpcupd();
270 }
271/*
272
273*/
274 } else if (mistat EQ 0x0D) {
275
276 /* channel pressure */
277
278 mdb1 = SM_SCALE(midiin);
279 t1 = (miport << 11) | (michan << 7);
280 t2 = t1 + 128;
281
282 for (i = t1; i < t2; i++)
283 prstab[i] = mdb1;
284
285 for (i = 0; i < 12; i++) {
286
287 if ((grp2prt[i][0] EQ (miport + 1)) AND
288 (grp2prt[i][1] EQ (michan + 1))) {
289
290 if (newsv(i, SM_KPRS, mdb1)) {
291
292 if (recsw AND grpstat[i] AND
293 (2 EQ (ancmsw ? varmode[5][i] : grpmode[i]))) {
294
295 if (E_NULL NE (ep = e_alc(E_SIZE2))) {
296
297 ep->e_time = t_cur;
298 ep->e_type = EV_ANVL;
299 ep->e_data1 = 0x0050 | i;
300 ep->e_dn = (struct s_entry *)((int32_t)mdb1 << 16);
301 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
302 ctrsw = TRUE;
303 se_disp(ep, D_FWD, gdstbc, 1);
304 ctrsw = FALSE;
305 }
306
307 } else if ((angroup - 1) EQ i) {
308
309 dsanval(5);
310 }
311 }
312 }
313 }
314/*
315
316*/
317 } else if ((mistat EQ 0x0F) AND
318 (michan EQ 3) AND
319 (NOT midigo)) { /* song select */
320
321 if (midiin < N_SCORES) {
322
323 selscor(midiin);
324
325 if (ndisp EQ 2)
326 sdwins();
327 }
328
329 } else { /* error -- state mismatch */
330
331 msmstv[miport] = 0;
332 mrstat[miport] = 0;
333 }
334 }
335
336 continue;
337/*
338
339*/
340 case 2: /* waiting for 1st data byte */
341
342 if (0x80 & midiin) { /* status */
343
344 michan = 0x0F & midiin;
345 mistat = 0x0F & (midiin >> 4);
346
347 if (midiin < 0x00F0) { /* channel */
348
349 msmstv[miport] = msmnext[mistat & 0x07];
350 mrstat[miport] = midiin;
351
352 } else if (midiin < 0x00F8) { /* common */
353
354 msmstv[miport] = msmcnxt[michan & 0x07];
355 mrstat[miport] = midiin;
356/*
357
358*/
359 } else { /* real-time */
360
361 switch (0x0007 & midiin) {
362
363 case 0: /* clock */
364
365 if (midiclk AND midigo)
366 if ((fc_val += 2) > 0x00FFFFFFL)
367 fc_val = 0x00FFFFFFL;
368
369 break;
370
371 case 2: /* start */
372
373 if ((clkctl EQ CK_MIDI) AND
374 (NOT midigo)) {
375
376 midigo = TRUE;
377
378 if (fc_val)
379 sc_goto(fc_val = 0L);
380
381 clkset(TRUE);
382 dsclk();
383 }
384
385 break;
386
387 case 3: /* continue */
388
389 if ((clkctl EQ CK_MIDI) AND
390 (NOT midigo)) {
391
392 midigo = TRUE;
393 clkset(TRUE);
394 dsclk();
395 }
396
397 break;
398/*
399
400*/
401 case 4: /* stop */
402
403 if ((clkctl EQ CK_MIDI) AND
404 midigo) {
405
406 midigo = FALSE;
407 clkset(FALSE);
408 dsclk();
409 }
410
411 break;
412
413 case 6: /* active sensing */
414
415 masens[miport] |= 0x00FF;
416 break;
417
418 case 7: /* reset */
419
420 for (i = 0; i < NMPORTS; i++) {
421
422 mrstat[i] = 0;
423 msmstv[i] = 0;
424 masens[i] = 0;
425 }
426
427 break;
428 }
429 }
430
431 } else { /* data */
432
433 mdbyte[miport] = midiin;
434 msmstv[miport] = 3;
435 }
436
437 continue;
438/*
439
440*/
441 case 3: /* waiting for 2nd data byte */
442
443 if (0x80 & midiin) { /* status */
444
445 michan = 0x0F & midiin;
446 mistat = 0x0F & (midiin >> 4);
447
448 if (midiin < 0x00F0) { /* channel */
449
450 msmstv[miport] = msmnext[mistat & 0x07];
451 mrstat[miport] = midiin;
452
453 } else if (midiin < 0x00F8) { /* common */
454
455 msmstv[miport] = msmcnxt[michan & 0x07];
456 mrstat[miport] = midiin;
457/*
458
459*/
460 } else { /* real-time */
461
462 switch (0x0007 & midiin) {
463
464 case 0: /* clock */
465
466 if (midiclk AND midigo)
467 if ((fc_val += 2) > 0x00FFFFFFL)
468 fc_val = 0x00FFFFFFL;
469
470 break;
471
472 case 2: /* start */
473
474 if ((clkctl EQ CK_MIDI) AND
475 (NOT midigo)) {
476
477 midigo = TRUE;
478
479 if (fc_val)
480 sc_goto(fc_val = 0L);
481
482 clkset(TRUE);
483 dsclk();
484 }
485
486 break;
487
488 case 3: /* continue */
489
490 if ((clkctl EQ CK_MIDI) AND
491 (NOT midigo)) {
492
493 midigo = TRUE;
494 clkset(TRUE);
495 dsclk();
496 }
497
498 break;
499/*
500
501*/
502 case 4: /* stop */
503
504 if ((clkctl EQ CK_MIDI) AND
505 midigo) {
506
507 midigo = FALSE;
508 clkset(FALSE);
509 dsclk();
510 }
511
512 break;
513
514 case 6: /* active sensing */
515
516 masens[miport] |= 0x00FF;
517 break;
518
519 case 7: /* reset */
520
521 for (i = 0; i < NMPORTS; i++) {
522
523 mrstat[i] = 0;
524 msmstv[i] = 0;
525 masens[i] = 0;
526 }
527
528 break;
529 }
530 }
531/*
532
533*/
534 } else { /* data */
535
536 michan = 0x0F & mrstat[miport];
537 mistat = 0x0F & (mrstat[miport] >> 4);
538 mdb1 = mdbyte[miport];
539 mdb2 = midiin;
540 msmstv[miport] = 2;
541
542 switch (mistat) { /* switch on status */
543
544 case 9: /* note on */
545
546 if (mdb2) {
547
548 t1 = (miport << 11) + (michan << 7) + mdb1;
549 trgtab[t1] |= mpsust[(miport << 4) + michan] | M_KSTATE;
550 veltab[t1] = nvel = SM_SCALE(mdb2);
551 prstab[t1] = 0;
552
553 stmproc(t1); /* process as a patch stimulus */
554
555 if (editsw) { /* edit mode */
556
557 execkey(t1, tuntab[mdb1], curvce, 0);
558 break;
559 }
560
561 if (miport) { /* port 1 or 2 */
562
563 for (i = 0; i < 12; i++)
564 if ((grp2prt[i][0] EQ (miport + 1)) AND
565 (grp2prt[i][1] EQ (michan + 1))) {
566
567 asgvce(i, miport, michan, mdb1, nvel);
568 ne_bgn(i, mdb1, nvel);
569 }
570
571 } else { /* port 0 */
572
573 t2 = ((mdb1 < 21) OR (mdb1 > 108)) ?
574 0 : key2grp[mdb1 - 21];
575
576 for (i = 0; i < 12; i++)
577 if ((t2 & (0x0001 << i)) AND
578 (grp2prt[i][1] EQ (michan + 1))) {
579
580 asgvce(i, miport, michan, mdb1, nvel);
581 ne_bgn(i, mdb1, nvel);
582 }
583 }
584
585 break;
586 }
587/*
588
589*/
590 case 8: /* note off */
591
592 t1 = (miport << 11) + (michan << 7) + mdb1;
593 trgtab[t1] &= ~M_KSTATE;
594
595 if (0 EQ trgtab[t1]) {
596
597 for (i = 0; i < 12; i++) {
598
599 if (vce2trg[i] EQ t1) {
600
601 vce2trg[i] = -1;
602 procpfl(t1);
603 }
604
605 if ((grp2prt[i][0] EQ (miport + 1)) AND
606 (grp2prt[i][1] EQ (michan + 1)))
607 ne_end(t1, i);
608 }
609
610 stmproc(0x8000 | t1); /* process as a patch stimulus */
611 }
612
613 break;
614
615 case 10: /* poly pressure */
616
617 t1 = (miport << 11) + (michan << 7) + mdb1;
618 t2 = SM_SCALE(mdb2);
619 prstab[t1] = t2;
620
621 for (i = 0; i < 12; i++)
622 if ((grp2prt[i][0] EQ (miport + 1)) AND
623 (grp2prt[i][1] EQ (michan + 1)))
624 newpps(t1, i, SM_KPRS, t2);
625
626 break;
627/*
628
629*/
630 case 11: /* control change */
631
632 mctlval[(miport << 11) + (michan << 7) + mdb1] = mdb2;
633
634 if (mdb1 EQ MIDISUS) {
635
636 /* sustain changed */
637
638 t1 = (miport << 11) | (michan << 7);
639 t2 = t1 + 128;
640
641 if (mdb2 GT MSW_ON) { /* switch on */
642
643 mpsust[(miport << 4) + michan] = M_CHNSUS;
644
645 for (i = t1; i < t2; i++)
646 if (trgtab[i])
647 trgtab[i] |= M_CHNSUS;
648
649 } else if (mdb2 LT MSW_OFF) { /* switch off */
650
651 mpsust[(miport << 4) + michan] = 0;
652
653 for (i = t1; i < t2; i++) {
654
655 if (trgtab[i]) {
656
657 trgtab[i] &= ~M_CHNSUS;
658
659 if (0 EQ trgtab[i]) {
660
661 for (t1 = 0; t1 < 12; t1++) {
662
663 if (vce2trg[t1] EQ i) {
664
665 vce2trg[t1] = -1;
666 procpfl(i);
667 }
668
669 if ((grp2prt[t1][0] EQ (miport + 1)) AND
670 (grp2prt[t1][1] EQ (michan + 1)))
671 ne_end(i, t1);
672 }
673 }
674 }
675 }
676 }
677/*
678
679*/
680 } else if (mdb1 EQ MIDIHLD) {
681
682 /* hold changed */
683
684 t1 = (miport << 11) | (michan << 7);
685 t2 = t1 + 128;
686
687 if (mdb2 GT MSW_ON) { /* switch on */
688
689 for (i = t1; i < t2; i++)
690 if (trgtab[i] & M_KSTATE) {
691
692 for (t1 = 0; t1 < 12; t1++)
693 if ((vce2trg[t1] & ~(MKEYHELD << 8)) EQ i)
694 vce2trg[t1] |= (M_CHNHLD << 8);
695 }
696
697 } else if (mdb2 LT MSW_OFF) { /* switch off */
698
699 for (i = 0; i <12; i++) {
700
701 if (vce2trg[i] NE -1) {
702
703 vce2trg[i] &= ~(M_CHNHLD << 8);
704
705 if (0 EQ (vce2trg[i] & (MKEYHELD << 8))) {
706
707 t1 = vce2trg[i];
708
709 if (0 EQ trgtab[t1]) {
710
711 vce2trg[i] = -1;
712 procpfl(t1);
713 }
714 }
715 }
716 }
717 }
718/*
719
720*/
721 } else { /* other controllers */
722
723 t1 = (miport << 11) | (michan << 7) | mdb1;
724 t2 = SM_SCALE(mdb2);
725 mctlval[t1] = t2;
726
727 for (j = 0; j < 4; j++) {
728
729 if ((mctlnum[j] & 0x00FF) EQ mdb1) {
730
731 i = ctl2src[j];
732
733 for (t1 = 0; t1 < 12; t1++) {
734
735 if ((mctlnum[j] & CTAG1) OR
736 ((grp2prt[t1][0] EQ (miport + 1)) AND
737 (grp2prt[t1][1] EQ (michan + 1)))) {
738
739 if (newsv(t1, i, t2)) {
740
741 if (recsw AND grpstat[t1] AND
742 (2 EQ (ancmsw ? varmode[src2var[i]][t1] : grpmode[t1]))) {
743
744 if (E_NULL NE (ep = e_alc(E_SIZE2))) {
745
746 ep->e_time = t_cur;
747 ep->e_type = EV_ANVL;
748 ep->e_data1 = (src2var[i] << 4) | t1;
749 ep->e_dn = (struct s_entry *)((int32_t)t2 << 16);
750 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
751 ctrsw = TRUE;
752 se_disp(ep, D_FWD, gdstbc, 1);
753 ctrsw = FALSE;
754 }
755
756 } else if ((angroup - 1) EQ t1) {
757
758 dsanval(src2var[i]);
759 }
760 }
761 }
762 }
763 }
764 }
765 }
766
767 break;
768/*
769
770*/
771 case 14: /* pitch bend */
772
773 t1 = (miport << 4) | michan;
774 t2 = ((mdb2 << 9) | (mdb1 << 2)) ^ 0x8000;
775 mpbend[t1] = t2;
776
777 for (i = 0; i < 12; i++) {
778
779 if ((grp2prt[i][0] EQ (miport + 1)) AND
780 (grp2prt[i][1] EQ (michan + 1))) {
781
782 if (newsv(i, SM_HTPW, t2)) {
783
784 if (recsw AND grpstat[i] AND
785 (2 EQ (ancmsw ? varmode[0][i] : grpmode[i]))) {
786
787 if (E_NULL NE (ep = e_alc(E_SIZE2))) {
788
789 ep->e_time = t_cur;
790 ep->e_type = EV_ANVL;
791 ep->e_data1 = i;
792 ep->e_dn = (struct s_entry *)((int32_t)t2 << 16);
793 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
794 ctrsw = TRUE;
795 se_disp(ep, D_FWD, gdstbc, 1);
796 ctrsw = FALSE;
797 }
798
799 } else if ((angroup - 1) EQ i) {
800
801 dsanval(0);
802 }
803 }
804 }
805 }
806
807 break;
808/*
809
810*/
811 case 15: /* common */
812
813 if (michan EQ 2) { /* song position */
814
815 if ((clkctl EQ CK_MIDI) AND
816 (NOT midigo)) {
817
818 where = 12 * ((mdb1 << 7) | mdb2);
819
820 if (fc_val NE where)
821 sc_goto(fc_val = where);
822 }
823
824 break;
825
826 } else { /* bad running status */
827
828 msmstv[miport] = 0;
829 mrstat[miport] = 0;
830 break;
831 }
832
833 default: /* error -- bad status */
834
835 msmstv[miport] = 0;
836 mrstat[miport] = 0;
837 break;
838
839 } /* end switch (on status) */
840
841 } /* end if (status) */
842
843 continue;
844
845 default: /* error -- bad state */
846
847 msmstv[miport] = 0;
848 mrstat[miport] = 0;
849 break;
850
851 } /* end switch (on state) */
852 } /* end while (data available) */
853 } /* end for (each port) */
854}
855
Note: See TracBrowser for help on using the repository browser.