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

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

Added include files for global functions and variables.

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