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