source: buchla-68k/ram/msl.c@ 0580615

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

Point of no return.

  • Property mode set to 100644
File size: 15.6 KB
Line 
1/*
2 =============================================================================
3 msl.c -- midas main scan loop
4 Version 102 -- 1989-11-14 -- D.N. Lynx Crowe
5
6 List with pr -e4 option to expand tabs to 4 spaces instead of 8.
7 =============================================================================
8*/
9
10#define DEBUGIT 0 /* enable debug code */
11
12#define OLDTIME 0 /* use old tempo time calculations */
13
14#include "stddefs.h"
15#include "biosdefs.h"
16#include "graphdef.h"
17#include "glcfns.h"
18#include "glcdefs.h"
19#include "vsdd.h"
20#include "vsddsw.h"
21#include "vsddvars.h"
22#include "hwdefs.h"
23#include "memory.h"
24#include "cmeta.h"
25#include "fields.h"
26#include "fpu.h"
27#include "macros.h"
28#include "patch.h"
29#include "smdefs.h"
30#include "sclock.h"
31#include "scwheel.h"
32#include "slice.h"
33#include "timers.h"
34#include "wordq.h"
35
36#include "midas.h"
37#include "instdsp.h"
38#include "score.h"
39#include "scdsp.h"
40#include "scfns.h"
41#include "wsdsp.h"
42#include "asgdsp.h"
43
44#define LCL_PRT 3 /* 1-origin local keyboard port number */
45
46#if DEBUGIT
47extern short debugsw;
48
49short debugms = 1;
50#endif
51
52/*
53
54*/
55
56/* variables defined elsewhere */
57
58extern short (*cx_key)();
59extern short (*cy_key)();
60extern short (*d_key)();
61extern short (*e_key)();
62extern short (*m_key)();
63extern short (*x_key)();
64
65extern PFS (*swpt)[];
66
67extern short aflag;
68extern short amplval;
69extern short ancmsw;
70extern short angroup;
71extern short asig;
72extern short astat;
73extern short aval;
74extern short clkctl;
75extern short clkrun;
76extern short ctrsw;
77extern short cxrate;
78extern short cxval;
79extern short cyrate;
80extern short cyval;
81extern short dsp_ok;
82extern short editss;
83extern short editsw;
84extern short lampsw;
85extern short ndisp;
86extern short nxtflag;
87extern short pchsw;
88extern short recsw;
89extern short runit;
90extern short swback;
91extern short swctrl;
92extern short swdelta;
93extern short swdir;
94extern short swfiin;
95extern short swflag;
96extern short swlast;
97extern short swndx;
98extern short swstop;
99extern short swthr;
100extern short swtime;
101extern short swwait;
102extern short sd;
103extern short se;
104extern short stcrow;
105extern short stccol;
106extern short tglclk;
107extern short tglpch;
108extern short timemlt;
109extern short tmpomlt;
110extern short tmpoval;
111extern short tuneval;
112extern short vtpcol;
113extern short vtprow;
114
115/*
116
117*/
118
119extern unsigned short *obj8;
120
121extern long afi;
122extern long lcdtime;
123extern long swcount;
124extern long swrate;
125extern long swrmin;
126extern long swtemp;
127
128extern short grpmode[];
129extern short grpstat[];
130extern short prstab[];
131extern short simled[];
132extern short swfifo[NSWFIFO];
133extern short tmultab[];
134extern short vce2trg[];
135extern short veltab[];
136
137extern char trgtab[];
138
139extern short grp2prt[][2];
140extern short sigtab[][2];
141extern short varmode[][16];
142
143extern struct gdsel *gdstbc[];
144
145extern struct wordq ptefifo;
146
147unsigned short fifoval;
148
149/*
150
151*/
152
153/*
154 =============================================================================
155 clk_ped() -- process clock on/off toggle pedal
156 =============================================================================
157*/
158
159void clk_ped(short stat)
160{
161 if (stat)
162 tglclk = TRUE;
163}
164
165/*
166 =============================================================================
167 pch_ped() -- process punch in/out toggle pedal
168 =============================================================================
169*/
170
171void pch_ped(short stat)
172{
173 if (stat AND pchsw)
174 tglpch = TRUE;
175}
176
177/*
178
179*/
180
181/*
182 =============================================================================
183 msl() -- MIDAS main scan loop
184 =============================================================================
185*/
186
187void msl(void)
188{
189 register char *ioadr;
190 register unsigned *fpu;
191 register struct s_entry *ep;
192 register short i, ti, val;
193 register long rt;
194 unsigned short chan, crel, oldsr, port, trg, trig, vel;
195 short cxprev, cyprev, esi, newsig, oldclk, oldrec;
196 long fctemp;
197
198#if DEBUGIT
199 if (debugsw AND debugms)
200 printf("msl(): ENTRY ndisp=%d\n", ndisp);
201#endif
202
203 runit = TRUE; /* set run state */
204
205 while (runit) {
206
207 dsp_ok = TRUE; /* set display-OK flag for this pass */
208
209 ioadr = &io_ser + 2L; /* get edit switch status */
210 esi = *ioadr & 0x0008;
211
212 if (editss NE esi) { /* check for edit switch change */
213
214 editss = esi;
215
216 if (editss) /* toggle edit state if it went hi */
217 editsw = NOT editsw;
218 }
219
220 if (editsw) /* update edit LED */
221 io_leds = 0x9E;
222 else
223 io_leds = 0x1E;
224
225 if ((NOT lampsw) AND lcdtime) {
226
227 if (0 EQ --lcdtime)
228 io_leds = 0x1F; /* turn off the LCD backlight */
229 }
230
231 msm(); /* scan the MIDI ports */
232/*
233
234*/
235
236 if (tglclk) { /* check for clock on/off toggle */
237
238 oldsr = setsr(0x2700); /* disable interrupts */
239 tglclk = FALSE; /* cancel toggle flag */
240 setsr(oldsr); /* enable interrupts */
241
242 clkset(NOT clkrun); /* toggle clock mode */
243 dclkmd(); /* update display */
244 }
245
246 if (tglpch) { /* check for punch in/out toggle */
247
248 oldsr = setsr(0x2700); /* disable interrupts */
249 tglpch = FALSE; /* cancel toggle flag */
250 setsr(oldsr); /* enable interrupts */
251
252 if ((ndisp EQ 2) AND (v_regs[5] & 0x0180))
253 vbank(0);
254
255 for (i = 0; i < 12; i++) { /* scan the groups */
256
257 if (grpmode[i] EQ 1) { /* stdby -> rec */
258
259 grpmode[i] = 2;
260
261 if (ndisp EQ 2)
262 vputc(obj8, 2, 6 + (i * 5),
263 '*', simled[grpmode[i]]);
264
265 } else if (grpmode[i] EQ 2) { /* rec -> play */
266
267 grpmode[i] = 0;
268
269 if (ndisp EQ 2)
270 vputc(obj8, 2, 6 + (i * 5),
271 '*', simled[grpmode[i]]);
272 }
273 }
274 }
275
276/*
277
278*/
279 /* process stimulli from the patch stimulus fifo */
280
281 if (getwq(&ptefifo, &fifoval) GE 0) {
282
283 crel = 0x8000 & fifoval;
284
285 trg = TRG_MASK & fifoval;
286 port = 0x0003 & (fifoval >> 11);
287 chan = 0x000F & (fifoval >> 7);
288 trig = 0x007F & fifoval;
289
290 veltab[trg] = vel = SM_SCALE(64);
291 prstab[trg] = 0;
292
293 if (crel) { /* release */
294
295 trgtab[trg] &= ~M_KSTATE;
296
297 for (i = 0; i < 12; i++) {
298
299 if (vce2trg[i] EQ trg) {
300
301 vce2trg[i] = -1;
302 procpfl(trg);
303
304 }
305 }
306
307 stmproc(fifoval); /* do it as a patch stimulus */
308
309 } else { /* closure */
310
311 trgtab[trg] |= M_KSTATE;
312
313 stmproc(fifoval); /* do it as a patch stimulus */
314
315 for (i = 0; i < 12; i++)
316 if ((grp2prt[i][0] EQ 1 + port) AND
317 (grp2prt[i][1] EQ 1 + chan))
318 asgvce(i, port, chan, trig, vel);
319 }
320 }
321/*
322
323*/
324 if (-1L NE (afi = XBIOS(X_ANALOG))) { /* check panel inputs */
325
326 asig = (afi >> 8) & 0x007F; /* signal number */
327 astat = (afi >> 7) & 0x0001; /* status */
328 aval = afi & 0x007F; /* value */
329
330 if (asig) { /* active signal */
331
332 aflag = TRUE;
333 newsig = astat AND (NOT sigtab[asig][1]);
334
335 sigtab[asig][0] = aval;
336 sigtab[asig][1] = astat;
337
338 } else { /* all keys up */
339
340 aflag = FALSE;
341 newsig = FALSE;
342
343 for (i = 0; i < 128; i++)
344 sigtab[i][1] = 0;
345 }
346
347/*
348
349*/
350 if (aflag) { /* anything changed ? */
351
352 if ((asig GE 1) AND (asig LE 24)) {
353
354 /* local keyboard performance key */
355
356 localkb(asig);
357
358 } else if ((asig GE 25) AND (asig LE 38)) {
359
360 if (astat)
361 lcd_on();
362
363 if (NOT newsig)
364 doslide();
365
366 } else if ((asig GE 39) AND (asig LE 52)) {
367
368 if (astat)
369 lcd_on();
370
371 (*(*swpt)[asig - 39])(astat, (asig - 39));
372
373 } else if ((asig GE 60) AND (asig LE 69)) {
374
375 (*d_key)(asig - 60);
376
377/*
378
379*/
380 } else switch (asig) {
381
382 case 53: /* tablet x */
383
384 val = SM_SCALE(aval);
385
386 for (i = 0; i < 12; i++) {
387
388 if (grp2prt[i][0] EQ LCL_PRT) {
389
390 if (newsv(i, SM_HTPW, val)) {
391
392 if (recsw AND grpstat[i] AND
393 (2 EQ (ancmsw ? varmode[0][i] : grpmode[i]))) {
394
395 if (E_NULL NE (ep = e_alc(E_SIZE2))) {
396
397 ep->e_time = t_cur;
398 ep->e_type = EV_ANVL;
399 ep->e_data1 = i;
400 ep->e_dn = (struct s_entry *)((long)val << 16);
401 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
402 ctrsw = TRUE;
403 se_disp(ep, D_FWD, gdstbc, 1);
404 ctrsw = FALSE;
405 }
406
407 } else if ((angroup - 1) EQ i) {
408
409 dsanval(0);
410 }
411 }
412 }
413 }
414
415 break;
416/*
417
418*/
419 case 54: /* tablet y */
420
421 val = SM_SCALE(aval);
422
423 for (i = 0; i < 12; i++) {
424
425 if (grp2prt[i][0] EQ LCL_PRT) {
426
427 if (newsv(i, SM_VTMW, val)) {
428
429 if (recsw AND grpstat[i] AND
430 (2 EQ (ancmsw ? varmode[1][i] : grpmode[i]))) {
431
432 if (E_NULL NE (ep = e_alc(E_SIZE2))) {
433
434 ep->e_time = t_cur;
435 ep->e_type = EV_ANVL;
436 ep->e_data1 = 0x0010 | i;
437 ep->e_dn = (struct s_entry *)((long)val << 16);
438 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
439 ctrsw = TRUE;
440 se_disp(ep, D_FWD, gdstbc, 1);
441 ctrsw = FALSE;
442 }
443
444 } else if ((angroup - 1) EQ i) {
445
446 dsanval(1);
447 }
448 }
449 }
450 }
451
452 break;
453
454 case 55: /* cursor x */
455
456 (*cx_key)(); break;
457
458 case 56: /* cursor y */
459
460 (*cy_key)(); break;
461/*
462
463*/
464 case 58: /* longpot r */
465
466 val = SM_SCALE(aval);
467
468 for (i = 0; i < 12; i++) {
469
470 if (grp2prt[i][0] EQ LCL_PRT) {
471
472 if (newsv(i, SM_LPBR, val)) {
473
474 if (recsw AND grpstat[i] AND
475 (2 EQ (ancmsw ? varmode[2][i] : grpmode[i]))) {
476
477 if (E_NULL NE (ep = e_alc(E_SIZE2))) {
478
479 ep->e_time = t_cur;
480 ep->e_type = EV_ANVL;
481 ep->e_data1 = 0x0020 | i;
482 ep->e_dn = (struct s_entry *)((long)val << 16);
483 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
484 ctrsw = TRUE;
485 se_disp(ep, D_FWD, gdstbc, 1);
486 ctrsw = FALSE;
487 }
488
489 } else if ((angroup - 1) EQ i) {
490
491 dsanval(2);
492 }
493 }
494 }
495 }
496
497 break;
498
499/*
500
501*/
502 case 59: /* scroll wheel */
503
504 wheel(); break;
505
506 case 70: /* X key */
507
508 (*x_key)(); break;
509
510 case 71: /* E key */
511
512#if DEBUGIT
513 if (debugsw AND debugms)
514 printf("msl(): -> e_key ($%lX) astat=%d ndisp=%d\n",
515 e_key, astat, ndisp);
516#endif
517 (*e_key)();
518
519#if DEBUGIT
520 if (debugsw AND debugms)
521 printf("msl(): <- e_key ($%lX) astat=%d ndisp=%d runit=%d\n",
522 e_key, astat, ndisp, runit);
523#endif
524
525 break;
526
527 case 72: /* M key */
528
529 (*m_key)(); break;
530
531 case 73: /* Tempo */
532
533 if (aval > 50) /* dead band */
534 if (aval < 53)
535 aval = 50;
536 else
537 aval -= 2;
538
539 tmpomlt = aval > 100 ? 100 : aval;
540#if OLDTIME
541 ti = ( (tmpomlt + 50) * tmpoval) / 100;
542 ti = (short)( (192000L / ti) - 1);
543#else
544 ti = (tmpomlt + 50) * tmpoval;
545 ti = (short)( (19200000L / ti) - 1);
546#endif
547 TIME_T2H = ti >> 8;
548 TIME_T2L = ti & 0x00FF;
549
550 if (tmpomlt EQ 50) { /* 0 */
551
552 io_leds = 0x18; /* green off */
553 io_leds = 0x19; /* red off */
554
555 } else if (tmpomlt GT 50) { /* hi */
556
557 io_leds = 0x98; /* green on */
558 io_leds = 0x19; /* red off */
559
560 } else { /* lo */
561
562 io_leds = 0x18; /* green off */
563 io_leds = 0x99; /* red on */
564 }
565
566 break;
567/*
568
569*/
570 case 74: /* Time */
571
572 if (aval > 50) /* dead band */
573 if (aval < 53)
574 aval = 50;
575 else
576 aval -= 2;
577
578 ti = aval > 100 ? 100 : aval;
579 timemlt = tmultab[ti];
580
581 if (ti EQ 50) { /* 0 */
582
583 io_leds = 0x1A; /* green off */
584 io_leds = 0x1B; /* red off */
585
586 } else if (ti GT 50) { /* hi */
587
588 io_leds = 0x9A; /* green on */
589 io_leds = 0x1B; /* red off */
590
591 } else { /* lo */
592
593 io_leds = 0x1A; /* green off */
594 io_leds = 0x9B; /* red on */
595 }
596
597 break;
598
599/*
600
601*/
602 case 75: /* Tuning */
603
604 if (aval > 50) /* dead band */
605 if (aval < 53)
606 aval = 50;
607 else
608 aval -= 2;
609
610 i = (aval > 100) ? 100 : aval;
611 tuneval = (i - 50) << 2;
612 settune();
613
614 if (i EQ 50) {
615
616 io_leds = 0x1C; /* green off */
617 io_leds = 0x1D; /* red off */
618
619 } else if (i GT 50) {
620
621 io_leds = 0x9C; /* green on */
622 io_leds = 0x1D; /* red off */
623
624 } else {
625
626 io_leds = 0x1C; /* green off */
627 io_leds = 0x9D; /* red on */
628 }
629
630 break;
631/*
632
633*/
634 case 76: /* amplitude */
635
636 aval += aval >> 2;
637
638 if (aval > 127)
639 aval = 127;
640
641 amplval = (aval << 9) ^ 0x8000;
642 sendval(0, 0, amplval);
643 break;
644
645 case 77: /* pedal 1 */
646
647 val = SM_SCALE(aval);
648
649 for (i = 0; i < 12; i++) {
650
651 if (grp2prt[i][0] EQ LCL_PRT) {
652
653 if (newsv(i, SM_PED1, val)) {
654
655 if (recsw AND grpstat[i] AND
656 (2 EQ (ancmsw ? varmode[4][i] : grpmode[i]))) {
657
658 if (E_NULL NE (ep = e_alc(E_SIZE2))) {
659
660 ep->e_time = t_cur;
661 ep->e_type = EV_ANVL;
662 ep->e_data1 = 0x0040 | i;
663 ep->e_dn = (struct s_entry *)((long)val << 16);
664 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
665 ctrsw = TRUE;
666 se_disp(ep, D_FWD, gdstbc, 1);
667 ctrsw = FALSE;
668 }
669
670 } else if ((angroup - 1) EQ i) {
671
672 dsanval(4);
673 }
674 }
675 }
676 }
677
678 break;
679
680/*
681
682*/
683 case 79: /* cv 1 */
684
685 val = SM_SCALE(aval);
686
687 for (i = 0; i < 12; i++) {
688
689 if (grp2prt[i][0] EQ LCL_PRT) {
690
691 if (newsv(i, SM_CTL1, val)) {
692
693 if (recsw AND grpstat[i] AND
694 (2 EQ (ancmsw ? varmode[3][i] : grpmode[i]))) {
695
696 if (E_NULL NE (ep = e_alc(E_SIZE2))) {
697
698 ep->e_time = t_cur;
699 ep->e_type = EV_ANVL;
700 ep->e_data1 = 0x0030 | i;
701 ep->e_dn = (struct s_entry *)((long)val << 16);
702 p_cur = e_ins(ep, ep_adj(p_cur, 0, t_cur))->e_fwd;
703 ctrsw = TRUE;
704 se_disp(ep, D_FWD, gdstbc, 1);
705 ctrsw = FALSE;
706 }
707
708 } if ((angroup - 1)EQ i) {
709
710 dsanval(3);
711 }
712 }
713 }
714 }
715
716 break;
717
718 }
719 }
720 }
721/*
722
723*/
724
725#if DEBUGIT
726 if (debugsw AND debugms AND (NOT runit))
727 printf("msl(): end of asig cases -- dsp_ok = %d\n", dsp_ok);
728#endif
729
730 /* memory allocation changed ? */
731
732 if ((ndisp EQ 2) AND se_chg AND dsp_ok) {
733
734 dsmem(); /* display memory remaining */
735 se_chg = FALSE;
736 }
737
738 nxtflag = FALSE; /* clear 'next score' flag */
739 fctemp = fc_val; /* sample the frame clock */
740
741 if (t_cur NE fctemp) { /* see if frame clock changed */
742
743 if (t_cur LT fctemp) { /* clock incremented */
744
745 if (se EQ D_BAK) /* change direction ? */
746 chgsef();
747
748 sc_trek(fctemp); /* track frame clock */
749
750 } else { /* clock decremented */
751
752 if (se EQ D_FWD) /* change direction ? */
753 chgseb();
754
755 sc_trek(fctemp); /* track frame clock */
756 }
757
758 /* handle display update if there's time for it */
759
760 } else if (dsp_ok AND (t_ctr NE t_cur)) {
761
762 if (t_ctr LT t_cur) { /* clock incremented */
763
764 if (sd EQ D_BAK) /* change direction ? */
765 chgsdf();
766
767 sc_trak(t_ctr + 1); /* track frame clock */
768
769 } else { /* clock decremented */
770
771 if (sd EQ D_FWD) /* change direction ? */
772 chgsdb();
773
774 sc_trak(t_ctr - 1); /* track frame clock */
775 }
776 }
777/*
778
779*/
780#if DEBUGIT
781 if (debugsw AND debugms AND (NOT runit))
782 printf("msl(): end of clock processing -- dsp_ok = %d\n",
783 dsp_ok);
784#endif
785
786 /* handle 'next score' flag */
787
788 if (nxtflag AND (sd EQ D_FWD)) { /* switch scores ? */
789
790 oldrec = recsw;
791 oldclk = clkrun;
792
793 ti = curscor + 1;
794
795 if (ti GE N_SCORES)
796 ti = 0;
797
798 for (i = 0; i < N_SCORES; i++) {
799
800 if (E_NULL NE scores[ti]) {
801
802 selscor(ti);
803 break;
804 }
805
806 if (++ti GE N_SCORES)
807 ti = 0;
808 }
809
810 clkset(oldclk); /* restore clock mode */
811 dsclk();
812 recsw = oldrec; /* restore record/play mode */
813 dsrpmod();
814 nxtflag = FALSE; /* clear 'next score' flag */
815 }
816
817#if DEBUGIT
818 if (debugsw AND debugms AND (NOT runit))
819 printf("msl(): curproc\n");
820#endif
821
822 curproc(); /* process wheel and ball */
823
824#if DEBUGIT
825 if (debugsw AND debugms AND (NOT runit))
826 printf("msl(): seqproc\n");
827#endif
828
829 seqproc(); /* process sequences */
830 }
831
832#if DEBUGIT
833 if (debugsw AND debugms)
834 printf("msl(): EXIT ndisp=%d\n", ndisp);
835#endif
836}
Note: See TracBrowser for help on using the repository browser.