source: buchla-68k/ram/sqdisp.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: 13.5 KB
Line 
1/*
2 =============================================================================
3 sqdisp.c -- MIDAS-VII sequence editor display functions
4 Version 24 -- 1989-11-16 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#define DEBUGSQ 0
9
10#include "stddefs.h"
11#include "hwdefs.h"
12#include "graphdef.h"
13#include "vsdd.h"
14#include "patch.h"
15
16#include "midas.h"
17#include "ptdisp.h"
18
19#if DEBUGSQ
20extern short debugsw;
21
22short debugsq = 1;
23#endif
24
25extern short nokey(void);
26
27extern char *(*BakLine)(), *(*FwdLine)();
28
29extern unsigned short *obj8, *obj9, *obj10, *obj11;
30extern unsigned short *LineBuf, *ScObAdr, *OldLine;
31extern unsigned short LineAtr;
32
33extern short CurLine, CurScan;
34extern short ScrlObj, SmScNsl;
35extern short PdScDnF, PdScUpF;
36extern short ctcsw, submenu;
37extern short stccol, stcrow;
38extern short cxval;
39
40extern unsigned short cg3[];
41
42extern char TheBuf[]; /* display build buffer */
43
44short curslin; /* current sequence line */
45
46/*
47
48*/
49
50char sqhead[] =
51
52 "\260 Lin Time Action 1 Action 2 Action 3 \260 No Seq Rg T \260";
53
54char *sqmcon[] = {
55
56 "\260 Key transient Trigger on Stop Set reg Value \260",
57 "\260 Key closure Trigger off Jump to lin Inc Reg Register \260",
58 "\260 Key release Trig toggle If reg = Voltage \260",
59 "\260 If key active If trig act If stim act If reg < Random \260",
60 "\260 If reg > \260"
61};
62
63short seqpal[16][3] = { /* sequence display palette */
64
65 {0, 0, 0}, /* 0 - black */
66 {2, 3, 3}, /* 1 - white */
67 {0, 0, 1}, /* 2 - dark blue #1 */
68 {2, 0, 2}, /* 3 - dark violet */
69 {0, 0, 3}, /* 4 - dark blue #2 */
70 {3, 0, 0}, /* 5 - red */
71 {3, 3, 0}, /* 6 - yellow */
72 {1, 2, 0}, /* 7 - dark green */
73 {0, 3, 3}, /* 8 - light blue */
74 {2, 2, 2}, /* 9 - gray */
75 {0, 3, 0}, /* 10 - light green */
76 {3, 1, 2}, /* 11 - light violet */
77 {0, 2, 3}, /* 12 - medium blue */
78 {2, 0, 0}, /* 13 - dark red */
79 {1, 1, 2}, /* 14 - electric purple */
80 {3, 3, 3} /* 15 - bright white */
81};
82
83/*
84
85*/
86
87short sqatype[] = { /* sequence action types by box number */
88
89 SQ_NULL, /* " " 0 */
90 SQ_TKEY, /* "Kt 001 1 01" 1 */
91 SQ_CKEY, /* "Kc 001 1 01" 2 */
92 SQ_RKEY, /* "Kr 001 1 01" 3 */
93 SQ_IKEY, /* "If 001 1 01" 4 */
94 SQ_STRG, /* "Trig on 01" 5 */
95 SQ_CTRG, /* "Trig off 01" 6 */
96 SQ_TTRG, /* "Trig tgl 01" 7 */
97 SQ_ITRG, /* "If trig act" 8 */
98 SQ_STOP, /* "Stop " 9 */
99 SQ_JUMP, /* "Jump to 000" 10 */
100 SQ_NULL, /* "???????????" 11 */
101 SQ_ISTM, /* "If stim act" 12 */
102 SQ_SREG, /* "Set R01=00 " 13 */
103 SQ_AREG, /* "Inc R01+00 " 14 */
104 SQ_IREQ, /* "If R01=00 " 15 */
105 SQ_IRLT, /* "If R01<00 " 16 */
106 SQ_IRGT /* "If R01>00 " 17 */
107};
108
109/*
110
111*/
112
113char *sqdsptb[] = { /* sequence action display strings by action */
114
115 " ", /* SQ_NULL 0x0000 null action */
116 "Kc 001 1 01", /* SQ_CKEY 0x0001 Key closure */
117 "Kr 001 1 01", /* SQ_RKEY 0x0002 Key release */
118 "Kt 001 1 01", /* SQ_TKEY 0x0003 Key transient */
119 "If 001 1 01", /* SQ_IKEY 0x0004 If key active */
120 "Trig on 01", /* SQ_STRG 0x0005 Trigger on */
121 "Trig off 01", /* SQ_CTRG 0x0006 Trigger off */
122 "Trig tgl 01", /* SQ_TTRG 0x0007 Trigger toggle */
123 "If trig 01", /* SQ_ITRG 0x0008 If trigger active */
124 "Set R01=00 ", /* SQ_SREG 0x0009 Set register */
125 "If R01=00 ", /* SQ_IREQ 0x000A If register = */
126 "If R01<00 ", /* SQ_IRLT 0x000B If register < */
127 "If R01>00 ", /* SQ_IRGT 0x000C If register > */
128 "If stim act", /* SQ_ISTM 0x000D If stimulus active */
129 "Jump to 000", /* SQ_JUMP 0x000E Jump to sequence line */
130 "Stop ", /* SQ_STOP 0x000F Stop sequence */
131 "Inc R01+00 " /* SQ_AREG 0x0010 Increment register */
132};
133
134/*
135
136*/
137
138/*
139 =============================================================================
140 initsq() -- initialize the sequence data structures
141 =============================================================================
142*/
143
144void initsq(void)
145{
146 register short i;
147
148 for (i = 0; i < 16; i++) {
149
150 seqflag[i] = 0;
151 seqline[i] = 0;
152 sregval[i] = 0;
153 trstate[i] = 0;
154 seqstim[i] = 0;
155 seqtime[i] = 0;
156 }
157
158 memsetw(&seqtab, 0, (NSEQW * NSLINES));
159}
160
161/*
162
163*/
164
165/*
166 =============================================================================
167 dsact() -- convert sequence action code and data to display format
168 =============================================================================
169*/
170
171void dsact(char *buf, unsigned short act, unsigned short dat)
172{
173 unsigned short sqa, sqd, sqf, sqr, sqt, t1, t2, val;
174 unsigned short chan, i, key, port;
175
176 sqa = SQ_MACT & act;
177
178 strcpy(buf, sqdsptb[sqa]);
179
180 switch (sqa) {
181
182 case SQ_CKEY: /* Key closure */
183 case SQ_RKEY: /* Key release */
184 case SQ_TKEY: /* Key transient */
185 case SQ_IKEY: /* If key active */
186
187 port = 0x0003 & (dat >> 11);
188 chan = 0x000F & (dat >> 7);
189 key = 0x007F & dat;
190
191 if (port EQ 2)
192 sprintf(&buf[3], "%03u L ", 1 + key);
193 else
194 sprintf(&buf[3], "%03u %u %02u", 1 + key, 1 + port, 1 + chan);
195
196 break;
197
198 case SQ_STRG: /* Trigger on */
199 case SQ_CTRG: /* Trigger off */
200 case SQ_TTRG: /* Trigger toggle */
201 case SQ_ITRG: /* If trigger active */
202
203 sprintf(&buf[9], "%02u", 1 + dat);
204 break;
205/*
206
207*/
208 case SQ_AREG: /* Increment register */
209
210 sqf = (dat & SQ_MFLG) ? '-' : '+';
211 goto doval;
212
213 case SQ_SREG: /* Set register */
214 case SQ_IREQ: /* If register = */
215
216 sqf = '=';
217 goto doval;
218
219 case SQ_IRLT: /* If register < */
220
221 sqf = '<';
222 goto doval;
223
224 case SQ_IRGT: /* If register > */
225
226 sqf = '>';
227
228doval:
229
230 sqr = 1 + ((SQ_MOBJ & act) >> 8);
231 sqd = SQ_MVAL & dat;
232 sqt = SQ_MTYP & dat;
233
234 switch (sqt) {
235
236 case SQ_REG: /* register */
237
238 sprintf(&buf[4], "R%02u%cR%02u", sqr, sqf, 1 + sqd);
239 break;
240
241 case SQ_VAL: /* value */
242
243 sprintf(&buf[4], "R%02u%c%02u ", sqr, sqf, sqd);
244 break;
245
246 case SQ_VLT: /* voltage */
247
248 sprintf(&buf[4], "R%02u%cV%u ", sqr, sqf, 1 + sqd);
249 break;
250
251 case SQ_RND: /* random */
252
253 sprintf(&buf[4], "R%02u%c?%u ", sqr, sqf, sqd);
254 break;
255 }
256
257 break;
258/*
259
260*/
261 case SQ_JUMP: /* Jump to sequence line */
262
263 sprintf(&buf[8], "%03u", dat);
264 break;
265
266 case SQ_NULL: /* null action */
267 case SQ_ISTM: /* If stimulus active */
268 case SQ_STOP: /* Stop sequence */
269
270 break;
271 }
272
273 for (i = 0; i < 12; i++)
274 if (buf[i] EQ '\0')
275 buf[i] = ' ';
276}
277
278/*
279
280*/
281
282/*
283 =============================================================================
284 dsqlin() -- convert a sequence line to display format
285 =============================================================================
286*/
287
288void dsqlin(char *buf, short slin)
289{
290 register struct seqent *sp;
291 register short i, t1, t2;
292
293 sp = &seqtab[slin];
294
295 t1 = sp->seqtime / 100;
296 t2 = sp->seqtime - (t1 * 100);
297
298 sprintf(buf, " %03u %02u.%02u", slin, t1, t2);
299
300 dsact(&buf[12], sp->seqact1, sp->seqdat1);
301 dsact(&buf[24], sp->seqact2, sp->seqdat2);
302 dsact(&buf[36], sp->seqact3, sp->seqdat3);
303
304 buf[0] = '\260';
305
306 for (i = 0; i < 48; i++)
307 if (buf[i] EQ '\0')
308 buf[i] = ' ';
309
310 buf[48] = '\0';
311}
312
313/*
314
315*/
316
317/*
318 =============================================================================
319 dcursq() -- display current sequence line
320 =============================================================================
321*/
322
323void dcursq(void)
324{
325 dsqlin(TheBuf, curslin);
326 UpdVid(7, 0, TheBuf, PTEATR);
327 ctcon();
328}
329
330/*
331 =============================================================================
332 dstw() -- display sequence table window around current sequence line
333 =============================================================================
334*/
335
336void dstw(void)
337{
338 register short slin, srow;
339
340 slin = curslin - 7;
341
342 if (slin < 0)
343 slin += NSLINES;
344
345 for (srow = 0; srow < 16; srow++) {
346
347 dsqlin(TheBuf, slin);
348 UpdVid(srow, 0, TheBuf, (srow EQ 7) ? PTEATR : PTPATR);
349
350 if (++slin GE NSLINES)
351 slin -= NSLINES;
352 }
353
354 seq2buf();
355 ctcon();
356}
357
358/*
359
360*/
361
362/*
363 =============================================================================
364 sqwin() -- fill in a sequence display window
365 =============================================================================
366*/
367
368void sqwin(short n)
369{
370 register short i, j;
371 short atrbuf[64];
372 char linbuf[66];
373
374 if (v_regs[5] & 0x0180)
375 vbank(0);
376
377 switch (n) {
378
379 case 0: /* headings and box outline */
380
381 /* row 0 */
382
383 memset(linbuf, '\261', 63);
384 linbuf[0] = '\272';
385 linbuf[48] = '\267';
386 linbuf[62] = '\273';
387 linbuf[63] = '\0';
388
389 memsetw(atrbuf, PTBATR, 63);
390 atrbuf[63] = 0x0000;
391
392 vputsa(obj8, 0, 0, linbuf, atrbuf);
393
394 /* row 1 */
395
396 memsetw(atrbuf, PTHATR+0x0100, 64);
397 atrbuf[ 0] = PTBATR;
398 atrbuf[ 1] = PTHATR;
399 atrbuf[ 5] = PTHATR;
400 atrbuf[11] = PTHATR;
401 atrbuf[23] = PTHATR;
402 atrbuf[35] = PTHATR;
403 atrbuf[47] = PTHATR;
404 atrbuf[48] = PTBATR;
405 atrbuf[49] = PTHATR;
406 atrbuf[52] = PTHATR;
407 atrbuf[56] = PTHATR;
408 atrbuf[59] = PTHATR;
409 atrbuf[61] = PTHATR;
410 atrbuf[62] = PTBATR;
411 atrbuf[63] = 0x0000;
412
413 vputsa(obj8, 1, 0, sqhead, atrbuf);
414/*
415
416*/
417 /* row 18 */
418
419 memset(linbuf, '\261', 63);
420 linbuf[ 0] = '\266';
421 linbuf[48] = '\265';
422 linbuf[62] = '\264';
423 linbuf[63] = '\0';
424
425 memsetw(atrbuf, PTBATR, 63);
426 atrbuf[63] = 0x0000;
427
428 vputsa(obj11, 0, 0, linbuf, atrbuf);
429
430 /* row 24 */
431
432 memset(linbuf, '\261', 63);
433 linbuf[ 0] = '\271';
434 linbuf[62] = '\270';
435 linbuf[63] = '\0';
436
437 memsetw(atrbuf, PTBATR, 63);
438 atrbuf[63] = 0x0000;
439
440 vputsa(obj11, 6, 0, linbuf, atrbuf);
441
442 break;
443/*
444
445*/
446 case 1: /* sequences */
447
448 SetDTop(0, 13);
449 dstw();
450 break;
451
452 case 2: /* sequence status */
453
454 for (i = 0; i < 16; i++) {
455
456 sprintf(linbuf, " %03d %02d %d ",
457 seqline[i], sregval[i], trstate[i]);
458
459 vvputsv(obj10, 16, PDBORFG, PDSEQBG,
460 i, 0, "\260", 14, 14, cg3);
461
462 vvputsv(obj10, 16, PDSEQFG, PDSEQBG,
463 i, 1, linbuf, 14, 14, cg3);
464
465 vvputsv(obj10, 16, PDBORFG, PDSEQBG,
466 i, 14, "\260", 14, 14, cg3);
467
468 if (i EQ 7) {
469
470 if (48 EQ XTOC(cxval)) {
471
472 vsplot4(obj10, 16, PDPTRFG,
473 i, 0, "\277", 14, 14, cg3);
474
475 } else {
476
477 vsplot4(obj10, 16, PDPTRFG,
478 i, 0, "\274", 14, 14, cg3);
479 }
480 }
481
482 sprintf(linbuf, "%02d", i + 1);
483
484 vvputsv(obj10, 16,
485 (seqflag[i] & SQF_RUN) ? PDSEQRN : PDSEQFG, PDSEQBG,
486 i, 2, linbuf, 14, 14, cg3);
487 }
488
489 break;
490
491 case 3: /* menu */
492
493 memsetw(atrbuf, PTMATR, 64);
494 atrbuf[0] = PTBATR;
495 atrbuf[62] = PTBATR;
496 atrbuf[63] = 0x0000;
497
498 for (i = 0; i < 5; i++)
499 vputsa(obj11, (i + 1), 0, sqmcon[i], atrbuf);
500
501 break;
502 }
503}
504
505/*
506
507*/
508
509/*
510 =============================================================================
511 SqBakLn() -- return the next sequence line in the backward direction
512 =============================================================================
513*/
514
515char *SqBakLn(void)
516{
517 register short slin;
518
519 if (--curslin < 0)
520 curslin += NSLINES;
521
522 slin = curslin - 7;
523
524 if (slin < 0)
525 slin += NSLINES;
526
527 dsqlin(TheBuf, slin);
528 return(TheBuf);
529}
530
531/*
532
533*/
534
535/*
536 =============================================================================
537 SqFwdLn() -- return the next sequence line in the forward direction
538 =============================================================================
539*/
540
541char *SqFwdLn(void)
542{
543 register short slin;
544
545 if (++curslin GE NSLINES)
546 curslin -= NSLINES;
547
548 slin = curslin + 8;
549
550 if (slin GE NSLINES)
551 slin -= NSLINES;
552
553 dsqlin(TheBuf, slin);
554 return(TheBuf);
555}
556
557/*
558 =============================================================================
559 sqwins() -- draw the sequence display
560 =============================================================================
561*/
562
563void sqwins(void)
564{
565 register short i;
566
567 for (i = 0; i < 4; i++)
568 sqwin(i);
569}
570
571/*
572
573*/
574
575/*
576 =============================================================================
577 sqdisp() -- setup the sequence display
578 =============================================================================
579*/
580
581void sqdisp(void)
582{
583#if DEBUGSQ
584 if (debugsw AND debugsq)
585 printf("sqdisp(): ENTRY\n");
586#endif
587
588 dswap(); /* clear the video display */
589
590 BakLine = SqBakLn;
591 FwdLine = SqFwdLn;
592
593 /* setup object pointers */
594
595 obj8 = &v_score[OB08LOC]; /* 8 - headings */
596 obj9 = &v_score[OB09LOC]; /* 9 - sequences */
597 obj10 = &v_score[OB10LOC]; /* 10 - status */
598 obj11 = &v_score[OB11LOC]; /* 11 - menu */
599
600 ScrlObj = 9;
601 ScObAdr = obj9;
602 LineBuf = obj9;
603 OldLine = (unsigned short *)NULL;
604 LineAtr = PTPATR;
605
606 CurLine = 0;
607 CurScan = 13;
608
609 PdScDnF = FALSE;
610 PdScUpF = FALSE;
611
612 /* ---------------- initialize object table -------------------- */
613 /* obj, typ, bnk, base, xpix, ypix, x0, y0, flags, pri */
614
615 SetObj( 8, 1, 0, obj8, 512, 28, 0, 0, PDFL_08, -1);
616 SetObj( 9, 1, 0, obj9, 384, 224, 0, 28, PDFL_09, -1);
617 SetObj( 10, 0, 0, obj10, 128, 224, 384, 28, PDFL_10, -1);
618 SetObj( 11, 1, 0, obj11, 512, 98, 0, 252, PDFL_11, -1);
619
620 if (v_regs[5] & 0x0180)
621 vbank(0);
622
623 memsetw(v_score, 0, 32767); /* clear display objects */
624 memsetw(v_score+32767L, 0, 24577);
625
626 sqwins(); /* fill up the windows */
627
628/*
629
630*/
631 /* display some objects */
632
633 SetPri( 8, 8); /* headings */
634 SetPri( 9, 9); /* sequences */
635 SetPri(10, 10); /* sequence status */
636 SetPri(11, 11); /* menu */
637
638 if (v_regs[5] & 0x0180) /* select bank 0 */
639 vbank(0);
640
641 memcpyw(v_cgtab, cg3, 3584); /* setup character generator */
642 v_regs[1] = (v_regs[1] & 0x0FFF) | 0xE000;
643
644 /* fix the initial scan line specs in the object descriptor table */
645
646 v_odtab[ 8][0] = (v_odtab[ 8][0] & 0x0FFF) | 0xD000;
647 v_odtab[ 9][0] = (v_odtab[ 9][0] & 0x0FFF) | 0xD000;
648
649 v_odtab[11][0] = (v_odtab[11][0] & 0x0FFF) | 0xD000;
650
651 submenu = FALSE;
652
653 ctcsw = TRUE; /* enable cursor */
654 ctcpos(DATAROW, 2); /* set initial cursor */
655 postcm(); /* set initial submenu */
656
657 vsndpal(seqpal); /* set the palette */
658
659#if DEBUGSQ
660 if (debugsw AND debugsq)
661 printf("sqdisp(): EXIT\n");
662#endif
663
664}
Note: See TracBrowser for help on using the repository browser.