source: buchla-68k/ram/adselbx.c@ e225e77

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

Added missing includes and declarations.

  • Property mode set to 100644
File size: 10.7 KB
Line 
1/*
2 =============================================================================
3 adselbx.c -- assignment editor box selection functions
4 Version 30 -- 1988-12-08 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#define DEBUGIT 0
9
10#include "stddefs.h"
11#include "hwdefs.h"
12#include "fields.h"
13#include "vsdd.h"
14#include "graphdef.h"
15
16#include "midas.h"
17#include "asgdsp.h"
18
19#include "vsddsw.h"
20
21#if DEBUGIT
22extern short debugsw;
23#endif
24
25#define ATWROW 10 /* typewriter row */
26#define ATWCOL 1 /* typewriter column */
27#define ATDECOL 1 /* data entry base column */
28
29extern int16_t entbh(int16_t n);
30extern void adswin(int16_t n);
31extern void advacur(void);
32extern void bspacur(void);
33extern void nokey(void);
34extern void vtdisp(uint16_t *obj, uint16_t fg, uint16_t bg, int16_t row, int16_t col, int8_t *buf);
35extern void adpoint(int16_t x, int16_t y, int16_t pen);
36
37extern void (*itxput)(int16_t row, int16_t col, int8_t *txt, int16_t tag);
38extern void (*point)(int16_t x, int16_t y, int16_t pen);
39
40extern int16_t admctl;
41extern int16_t adnamsw;
42extern int16_t asgfks;
43extern int16_t asghit;
44extern int16_t asgmod;
45extern int16_t auxctl;
46extern int16_t curasg;
47extern int16_t cxval;
48extern int16_t cyval;
49extern int16_t hitbox;
50extern int16_t hitcx;
51extern int16_t hitcy;
52extern int16_t lastam;
53extern int16_t submenu;
54
55extern int16_t adbox[][8];
56
57extern int16_t grp2prt[12][2];
58extern int16_t ins2grp[12];
59extern int16_t asgkble[];
60extern int16_t key2grp[];
61extern int16_t mctlnum[];
62
63extern struct selbox *csbp, *curboxp;
64
65extern int8_t bfs[];
66extern int8_t caname[];
67extern int8_t vtlin1[], vtlin2[], vtlin3[];
68
69extern uint16_t *asgob;
70
71/* forward references */
72
73void admenu(int16_t n);
74int16_t bx_null(void);
75int16_t adfnbox(int16_t n);
76
77extern int16_t vtyper(void);
78extern uint16_t exp_c(uint16_t c);
79extern void awins(void);
80extern void drawk2g(int16_t grp);
81extern void getasg(int16_t n);
82extern void putasg(int16_t n);
83extern void setaux(int16_t aux);
84extern void settc(int16_t rv, int16_t cv);
85extern void showam(int16_t asg);
86extern void showim(void);
87extern void showtm(void);
88extern void vtsetup(uint16_t *obj, int16_t (*dsp)(), int16_t col, int8_t *ptr, int16_t tr, int16_t tc, int16_t (*adv)(), int16_t (*bsp)(), int16_t (*cup)(), int16_t (*cdn)(), int16_t (*stop)(), uint16_t fg, uint16_t bg);
89
90/*
91
92*/
93
94struct selbox adboxes[] = {
95
96 { 1, 0, 94, 27, 0, adfnbox}, /* 0: curasg, caname */
97 { 1, 28, 94, 40, 1, adfnbox}, /* 1: asgtab[curasg] */
98 { 1, 56, 94, 68, 2, entbh}, /* 2: curmop */
99 { 1, 42, 94, 54, 3, entbh}, /* 3: prgchan */
100 { 96, 1, 190, 138, 4, entbh}, /* 4: vce2grp[voice] */
101 {192, 1, 302, 138, 5, adfnbox}, /* 5: mctlnum[srcvar] */
102 {304, 1, 510, 138, 6, adfnbox}, /* 6: grp2prt[group][pt|ch] */
103 { 1, 140, 510, 348, 7, adfnbox}, /* 7: key2grp[key] */
104 { 1, 70, 38, 82, 8, adfnbox}, /* 8: auxctl */
105 { 40, 70, 94, 82, 9, adfnbox}, /* 9: curtun */
106 { 1, 84, 94, 138, 10, entbh}, /* 10: ps_intn, ps_rate, ps_dpth */
107
108 { 0, 0, 0, 0, 0, FN_NULL} /* end of table */
109};
110
111/*
112
113*/
114
115/*
116 =============================================================================
117 endatyp() -- end function for virtual typewriter
118 =============================================================================
119*/
120
121void endatyp(void)
122{
123 adnamsw = FALSE;
124 submenu = FALSE;
125
126 if (admctl EQ -1)
127 adswin(7); /* refresh key map window */
128 else
129 admenu(admctl); /* refresh menu window */
130}
131
132/*
133
134*/
135
136/*
137 =============================================================================
138 admtxt() -- output text to the submenu
139 =============================================================================
140*/
141
142void admtxt(int16_t row, int16_t col, int8_t *txt, int16_t tag)
143{
144 if (v_regs[5] & 0x0180)
145 vbank(0);
146
147 vcputsv(asgob, 64, ACFBX07, ACBBX07, row + 10, col, txt, 14);
148}
149
150/*
151
152*/
153
154/*
155 =============================================================================
156 admenu() -- put up or take down an assignment display submenu
157 =============================================================================
158*/
159
160void admenu(int16_t n)
161{
162 register int16_t i;
163
164 if (n GE 0) { /* put up a submenu */
165
166 itxput = admtxt; /* setup output function */
167
168 if (v_regs[5] & 0x0180)
169 vbank(0);
170
171 vbfill4(asgob, 128, adbox[7][0], adbox[7][1],
172 adbox[7][2], adbox[7][3], exp_c(adbox[7][5]));
173
174 switch (n) { /* fill the window */
175
176 case 0: /* instruments */
177
178 showim(); /* show the instruments */
179 break;
180
181 case 1: /* assignments */
182
183 showam(lastam); /* show the assignments */
184 settc(0, 9); /* position the cursor */
185 break;
186
187 case 2: /* tunings */
188
189 showtm(); /* show the tunings */
190 settc(5, 10); /* position the cursor */
191 break;
192
193 default: /* eh ? */
194
195 break;
196 }
197
198 } else { /* take down the submenu */
199
200 admctl = n; /* set new menu type */
201 adswin(7); /* refresh the window */
202 }
203
204 point = adpoint;
205
206 if (v_regs[5] & 0x0180)
207 vbank(0);
208
209 lseg( 0, 0, 0, 349, AK_BORD); /* fix left edge of screen */
210 lseg(511, 0, 511, 349, AK_BORD); /* fix right edge of screen */
211
212 admctl = n; /* set new menu type */
213}
214
215/*
216
217*/
218
219/*
220 =============================================================================
221 adfnbox() -- assignment display box hit processor
222 =============================================================================
223*/
224
225int16_t adfnbox(int16_t n)
226{
227 register int16_t i, grp, key, line;
228 int16_t row, col;
229
230 row = hitcy / 14;
231 col = hitcx >> 3;
232
233 switch (hitbox) {
234
235 case 0: /* asignment number or name */
236
237 if ((NOT adnamsw) AND (row EQ 0)) { /* menu or table */
238
239 if ((col GE 1) AND (col LE 7)) { /* menu */
240
241 if (admctl NE 1) {
242
243 lastam = 0;
244 admenu(1); /* put up menu */
245
246 } else {
247
248 if (lastam EQ 0) { /* show page 2 */
249
250 lastam = 60;
251 admenu(1);
252
253 } else { /* take down menu */
254
255 lastam = 0;
256 admenu(-1);
257 }
258 }
259
260 return(SUCCESS);
261
262 } else { /* table */
263
264 return(entbh(-1)); /* data entry */
265 }
266 }
267
268 if (adnamsw) { /* typewriter is up */
269
270 if (vtyper()) {
271
272 if (NOT asgmod) {
273
274 asgmod = TRUE;
275 adswin(0);
276 }
277 }
278/*
279
280*/
281 } else { /* setup the typewriter */
282
283 vbank(0);
284 vbfill4(asgob, 128, CTOX(ATWCOL), RTOY(ATWROW),
285 CTOX(ATWCOL+30) - 1, RTOY(ATWROW+3) - 1,
286 exp_c(ACBBX04));
287
288 tsplot4(asgob, 64, ACFBX04, ATWROW, ATWCOL, vtlin1, 14);
289 tsplot4(asgob, 64, ACFBX04, ATWROW+1, ATWCOL, vtlin2, 14);
290 tsplot4(asgob, 64, ACFBX04, ATWROW+2, ATWCOL, vtlin3, 14);
291
292 point = adpoint; /* draw a border ... */
293
294 lseg(CTOX(ATWCOL) - 1, RTOY(ATWROW) - 1, /* up, lt */
295 CTOX(ATWCOL+30), RTOY(ATWROW) - 1, /* up, rt */
296 AK_BORD);
297
298 lseg(CTOX(ATWCOL+30), RTOY(ATWROW) - 1, /* up, rt */
299 CTOX(ATWCOL+30), RTOY(ATWROW+3) - 1, /* dn, rt */
300 AK_BORD);
301
302 lseg(CTOX(ATWCOL+30), RTOY(ATWROW+3) - 1, /* dn, rt */
303 CTOX(1) - 1, RTOY(ATWROW+3) - 1, /* dn, lt */
304 AK_BORD);
305
306 lseg(CTOX(1) - 1, RTOY(ATWROW+3) - 1, /* dn, lt */
307 CTOX(1) - 1, RTOY(ATWROW) - 1, /* up, lt */
308 AK_BORD);
309
310 vtsetup(asgob, vtdisp, ATDECOL,
311 caname,
312 ATWROW, ATWCOL,
313 advacur, bspacur, nokey, nokey, endatyp,
314 adbox[n][4], adbox[n][5]);
315
316 adnamsw = TRUE;
317 submenu = TRUE;
318 }
319
320 return(SUCCESS);
321/*
322
323*/
324 case 1:
325
326 if ((col GE 1) AND (col LE 4)) { /* store */
327
328 if (curasg EQ 0)
329 return(FAILURE);
330
331 putasg(curasg);
332 adswin(0);
333 return(SUCCESS);
334
335 } else if ((col GE 6) AND (col LE 10)) { /* retrieve */
336
337 getasg(curasg);
338 awins();
339 return(SUCCESS);
340 }
341
342 case 5: /* toggle controller omni mode */
343
344 if (col EQ 25) {
345
346 if ((row LT 5) OR (row GT 8))
347 return(FAILURE);
348
349 mctlnum[row - 5] ^= GTAG1;
350
351 if (v_regs[5] &0x0180)
352 vbank(0);
353
354 bfs[0] = row - 5 + '2';
355 bfs[1] = '\0';
356
357 tsplot4(asgob, 64,
358 (mctlnum[row - 5] & GTAG1) ?
359 AK_MODC : adbox[n][4],
360 row, adbox[n][7], bfs, 14);
361
362 return(SUCCESS);
363
364 } else {
365
366 return(entbh(-1));
367 }
368/*
369
370*/
371 case 6: /* instruments, groups, ports, channels */
372
373 if (((col EQ 41) OR (col EQ 42) OR
374 (col EQ 54) OR (col EQ 55)) AND (row EQ 3)) {
375
376 /* instrument menu */
377
378 if (admctl NE 0)
379 admenu(0); /* put up menu */
380 else
381 admenu(-1); /* take down menu */
382
383 return(SUCCESS);
384
385 } else if (col EQ 39) { /* groups 1..6 */
386
387 if ((row LT 4) OR (row GT 9))
388 return(FAILURE);
389
390 /* toggle "legato" mode */
391
392 grp = row - 4;
393
394 ins2grp[grp] ^= GTAG1;
395
396 bfs[0] = '1' + grp;
397 bfs[1] = '\0';
398
399 if (v_regs[5] & 0x0180)
400 vbank(0);
401
402 tsplot4(asgob, 64,
403 ((ins2grp[grp] & GTAG1) ? AK_MODC : adbox[n][4]),
404 row, col, bfs, 14);
405
406 return(SUCCESS);
407/*
408
409*/
410 } else if (col EQ 52) { /* groups 7..12 */
411
412 if ((row LT 4) OR (row GT 9))
413 return(FAILURE);
414
415 /* toggle "legato" mode */
416
417 grp = row + 2;
418
419 ins2grp[grp] ^= GTAG1;
420
421 bfs[0] = grp + ((grp > 8) ? 163 : '1');
422 bfs[1] = '\0';
423
424 if (v_regs[5] & 0x0180)
425 vbank(0);
426
427 tsplot4(asgob, 64,
428 ((ins2grp[grp] & GTAG1) ? AK_MODC : adbox[n][4]),
429 row, col, bfs, 14);
430
431 return(SUCCESS);
432
433 } else {
434
435 return(entbh(-1)); /* data entry */
436 }
437/*
438
439*/
440 case 7: /* assignment map */
441
442 if (admctl NE -1)
443 return(FAILURE);
444
445 if (asghit) {
446
447 if (asghit EQ (hitcy / 14)) { /* previous hit ? */
448
449 /* toggle selected key status */
450
451 grp = asghit - 11;
452 line = (14 * grp) + AK_BASE;
453 key = 0;
454
455 for (i = 0; i < 88; i++)
456 if ((hitcx GE (asgkble[i] + 24)) AND
457 (hitcx LE (asgkble[i] + (i EQ 87 ? 31 : 28))))
458 key = i + 1;
459
460 if (key-- EQ 0)
461 return(FAILURE);
462
463 if (key LT asgfks) {
464
465 i = asgfks;
466 asgfks = key;
467 key = i;
468 }
469
470 for (i = asgfks; i LE key; i++)
471 key2grp[i] ^= (0x0001 << grp);
472
473 drawk2g(grp);
474 asghit = 0;
475
476 if (NOT asgmod) {
477
478 asgmod = TRUE;
479 adswin(0);
480 }
481
482 } else {
483
484 /* clear the selection */
485
486 drawk2g(asghit - 11);
487 asghit = 0;
488 }
489/*
490
491*/
492 } else {
493
494 /* make initial selection */
495
496 asghit = hitcy / 14;
497 grp = asghit - 11;
498
499 if (grp2prt[grp][0] NE 1) {
500
501 asghit = 0;
502 return(FAILURE);
503 }
504
505 line = (14 * grp) + AK_BASE;
506 key = 0;
507
508 for (i = 0; i < 88; i++)
509 if ((hitcx GE (asgkble[i] + 24)) AND
510 (hitcx LE (asgkble[i] + (i EQ 87 ? 31 : 28))))
511 key = i + 1;
512
513 if (key-- EQ 0) {
514
515 asghit = 0;
516 return(FAILURE);
517 }
518
519 asgfks = key;
520
521 vbfill4(asgob, 128, asgkble[key] + 24, line,
522 asgkble[key] + (key EQ 87 ? 31 : 28),
523 line + 3, exp_c(AK_SELC2));
524
525 }
526
527 return(SUCCESS);
528
529 case 8: /* aux ctl */
530
531 setaux(NOT auxctl);
532 adswin(8);
533 return(SUCCESS);
534
535 case 9: /* tuning menu */
536
537 if ((col GE 6) AND (col LE 8)) {
538
539 if (admctl NE 2)
540 admenu(2); /* put up menu */
541 else
542 admenu(-1); /* take down menu */
543
544 return(SUCCESS);
545
546 } else {
547
548 return(entbh(-1)); /* data entry */
549 }
550 }
551
552 return(FAILURE);
553}
Note: See TracBrowser for help on using the repository browser.