source: buchla-68k/ram/sqexec.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: 7.6 KB
Line 
1/*
2 =============================================================================
3 sqexec.c -- MIDAS-VII sequence action execution code
4 Version 12 -- 1988-12-13 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#define DEBUGSX 0
9#define DEBUGSP 0
10
11#define UPD_LINE 1
12
13#include "stddefs.h"
14#include "hwdefs.h"
15#include "graphdef.h"
16#include "vsdd.h"
17#include "wordq.h"
18#include "patch.h"
19#include "timers.h"
20
21#include "midas.h"
22#include "ptdisp.h"
23
24#include "stdio.h"
25#include "vsddsw.h"
26
27#if (DEBUGSP|DEBUGSX)
28extern short debugsw;
29#endif
30
31#if DEBUGSP
32short debugsp = 1;
33#endif
34
35#if DEBUGSX
36short debugsx = 1;
37#endif
38
39extern uint16_t setsr(uint16_t sr);
40extern int32_t rand24(void);
41
42extern void vvputsv(uint16_t *obase, uint16_t nw, uint16_t fg, uint16_t bg, uint16_t row, uint16_t col, int8_t *str, uint16_t pitch, uint16_t ht, int16_t cgtab[][256]);
43
44extern int8_t trgtab[];
45
46extern int16_t curslin;
47extern int16_t dsp_ok;
48extern int16_t ndisp;
49
50extern uint16_t seqdupd;
51
52extern uint16_t *obj10;
53
54extern int16_t cg3[][256];
55
56extern struct wordq ptefifo;
57
58int16_t seqdspn;
59
60int16_t rtab[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F,
61 0x003F, 0x003F, 0x003F };
62
63/*
64
65*/
66
67/*
68 =============================================================================
69 evaltv() -- evaluate a typed value
70 =============================================================================
71*/
72
73uint16_t evaltv(uint16_t dat)
74{
75 switch (SQ_MTYP & dat) {
76
77 case SQ_REG: /* register contents */
78
79 return(sregval[SQ_MVAL & dat]);
80
81 case SQ_VAL: /* constant value */
82
83 return(SQ_MVAL & dat);
84
85 case SQ_VLT: /* voltage input */
86
87 return(0);
88
89 case SQ_RND: /* random number */
90
91 return((int16_t)rand24() & rtab[SQ_MVAL & dat]);
92
93 default: /* something weird got in here ... */
94
95 return(0);
96 }
97}
98
99/*
100
101*/
102
103/*
104 =============================================================================
105 dosqact() -- do a sequence action
106 =============================================================================
107*/
108
109int16_t dosqact(uint16_t seq, uint16_t act, uint16_t dat)
110{
111 register uint16_t obj, val;
112 register int16_t sv;
113
114 obj = (SQ_MOBJ & act) >> 8;
115 val = SQ_MVAL & dat;
116
117 switch (SQ_MACT & act) {
118
119 case SQ_NULL: /* null action */
120
121 return(0);
122
123 case SQ_CKEY: /* Key closure */
124
125 putwq(&ptefifo, dat & TRG_MASK);
126 return(0);
127
128 case SQ_RKEY: /* Key release */
129
130 putwq(&ptefifo, dat | 0x8000);
131 return(0);
132
133 case SQ_TKEY: /* Key transient */
134
135 putwq(&ptefifo, dat & TRG_MASK); /* closure */
136 putwq(&ptefifo, dat | 0x8000); /* release */
137 return(0);
138
139 case SQ_IKEY: /* If key active */
140
141 if (trgtab[TRG_MASK & dat])
142 return(0);
143 else
144 return(1);
145/*
146
147*/
148 case SQ_STRG: /* Trigger on */
149
150 trstate[val] = 1;
151 putwq(&ptefifo, (0x1100 | val));
152 seqdupd |= (1 << val);
153 return(0);
154
155 case SQ_CTRG: /* Trigger off */
156
157 trstate[val] = 0;
158 seqdupd |= (1 << val);
159 return(0);
160
161 case SQ_TTRG: /* Trigger toggle */
162
163 trstate[val] = trstate[val] ? 0 : 1;
164
165 if (trstate[val])
166 putwq(&ptefifo, (0x1100 | val));
167
168 seqdupd |= (1 << val);
169 return(0);
170
171 case SQ_ITRG: /* If trigger active */
172
173 return(trstate[val] ? 0 : 1);
174/*
175
176*/
177 case SQ_SREG: /* Set register */
178
179 sregval[obj] = evaltv(dat);
180 seqdupd |= (1 << obj);
181 return(0);
182
183 case SQ_AREG: /* Increment register */
184
185 if (dat & SQ_MFLG) {
186
187 sv = sregval[obj] - evaltv(dat);
188
189 if (sv < 0)
190 sv = 0;
191
192 sregval[obj] = sv;
193
194 } else {
195
196 sv = sregval[obj] + evaltv(dat);
197
198 if (sv > 99)
199 sv = 99;
200
201 sregval[obj] = sv;
202
203 }
204
205 seqdupd |= (1 << obj);
206 return(0);
207
208 case SQ_IREQ: /* If register = */
209
210 val = evaltv(dat);
211
212 if (sregval[obj] EQ val)
213 return(0);
214 else
215 return(1);
216
217 case SQ_IRLT: /* If register < */
218
219 val = evaltv(dat);
220
221 if (sregval[obj] < val)
222 return(0);
223 else
224 return(1);
225
226 case SQ_IRGT: /* If register > */
227
228 val = evaltv(dat);
229
230 if (sregval[obj] > val)
231 return(0);
232 else
233 return(1);
234/*
235
236*/
237 case SQ_ISTM: /* If stimulus active */
238
239 if (trgtab[TRG_MASK & seqstim[seq]])
240 return(0);
241 else
242 return(1);
243
244 case SQ_JUMP: /* Jump to sequence line */
245
246 seqline[seq] = dat;
247 seqtime[seq] = seqtab[dat].seqtime;
248 seqflag[seq] |= SQF_CLK;
249
250 seqdupd |= (1 << seq);
251 return(-1);
252
253
254 case SQ_STOP: /* Stop sequence */
255 default:
256
257 seqflag[seq] = 0;
258 seqtime[seq] = 0;
259
260 seqdupd |= (1 << seq);
261 return(-1);
262
263 }
264}
265
266/*
267
268*/
269
270/*
271 =============================================================================
272 sqexec() -- execute a line for a sequence
273 =============================================================================
274*/
275
276void sqexec(uint16_t seq)
277{
278 register uint16_t act, dat, line;
279 register struct seqent *sp;
280 register int16_t rc;
281
282 line = seqline[seq];
283 sp = &seqtab[line];
284
285 act = sp->seqact1; /* do Action 1 */
286 dat = sp->seqdat1;
287
288 rc = dosqact(seq, act, dat);
289
290#if DEBUGSX
291 if (debugsw AND debugsx)
292 printf("sqexec(%02u): Line %03u Act 1 $%04.4X $%04.4X $%04.4X %d\n",
293 seq, line, act, dat, seqflag[seq], rc);
294#endif
295
296 if (rc EQ 1) /* skip action 2 */
297 goto act3;
298 else if (rc EQ -1) /* jump or stop */
299 return;
300
301 act = sp->seqact2; /* do Action 2 */
302 dat = sp->seqdat2;
303
304 rc = dosqact(seq, act, dat);
305
306#if DEBUGSX
307 if (debugsw AND debugsx)
308 printf("sqexec(%02u): Line %03u Act 2 $%04.4X $%04.4X $%04.4X %d\n",
309 seq, line, act, dat, seqflag[seq], rc);
310#endif
311
312 if (rc EQ 1) /* skip action 3 */
313 goto nxtline;
314 else if (rc EQ -1) /* jump or stop */
315 return;
316
317act3:
318 act = sp->seqact3; /* do Action 3 */
319 dat = sp->seqdat3;
320
321 rc = dosqact(seq, act, dat);
322
323#if DEBUGSX
324 if (debugsw AND debugsx)
325 printf("sqexec(%02u): Line %03u Act 3 $%04.4X $%04.4X $%04.4X %d\n",
326 seq, line, act, dat, seqflag[seq], rc);
327#endif
328
329 if (rc EQ -1) /* jump or stop */
330 return;
331
332nxtline: /* increment line counter */
333
334 if (++seqline[seq] GE NSLINES)
335 seqline[seq] = 0;
336
337 seqtime[seq] = seqtab[seqline[seq]].seqtime;
338 seqflag[seq] |= SQF_CLK;
339
340#if DEBUGSX
341 if (debugsw AND debugsx)
342 printf("sqexec(%02u): Next %03u %5u $%04.4X\n",
343 seq, line, seqtime[seq], seqflag[seq]);
344#endif
345
346 seqdupd |= (1 << seq);
347}
348
349/*
350
351*/
352
353/*
354 =============================================================================
355 seqproc() -- process sequences
356 =============================================================================
357*/
358
359void seqproc(void)
360{
361 register uint16_t oldsr, seq;
362 register int16_t dspn;
363 register uint16_t *fp;
364 int8_t linbuf[66];
365
366 if (0 EQ timers[SQTIMER]) {
367
368 for (seq = 0; seq < 16; seq++) {
369
370 fp = &seqflag[seq];
371
372 if ( (SQF_RUN|SQF_CLK) EQ
373 ((SQF_RUN|SQF_CLK) & *fp) ) {
374
375 if (seqtime[seq]) {
376
377 if (0 EQ --seqtime[seq])
378 *fp &= ~SQF_CLK;
379
380 } else {
381
382 *fp &= ~SQF_CLK;
383 }
384 }
385 }
386
387 oldsr = setsr(0x2700);
388 timers[SQTIMER] = SEQTIME;
389 setsr(oldsr);
390 }
391
392 for (seq = 0; seq < 16; seq++)
393 if (SQF_RUN EQ ((SQF_RUN|SQF_CLK) & seqflag[seq]) )
394 sqexec(seq);
395/*
396
397*/
398 if (((ndisp EQ 1) OR (ndisp EQ 3)) AND dsp_ok AND seqdupd) {
399
400#if DEBUGSX
401 if (debugsw AND debugsx)
402 printf("seqproc(): ndisp = %d seqdupd = $%04.4X\n",
403 ndisp, seqdupd);
404#endif
405 if (seqdupd & (1 << seqdspn)) {
406
407 dspn = seqdspn;
408
409 if (v_regs[5] & 0x0180)
410 vbank(0);
411
412 sprintf(linbuf, " %03d %02d %c ",
413 seqline[dspn],
414 sregval[dspn],
415 '0' + trstate[dspn]);
416
417 vvputsv(obj10, 16, PDSEQFG, PDSEQBG,
418 dspn, 1, linbuf, 14, 14, cg3);
419
420#if UPD_LINE
421 sprintf(linbuf, "%02d", dspn + 1);
422
423 vvputsv(obj10, 16,
424 (seqflag[dspn] & SQF_RUN) ?
425 PDSEQRN : PDSEQFG, PDSEQBG,
426 dspn, 2, linbuf, 14, 14, cg3);
427#else
428 vsetcv(obj10, dspn, 2,
429 ( ( (seqflag[dspn] & SQF_RUN) ?
430 PDSEQRN : PDSEQFG) << 4) | PDSEQBG, 16);
431#endif
432 seqdupd &= ~(1 << dspn);
433 }
434
435 if (++seqdspn > 15)
436 seqdspn = 0;
437 }
438}
Note: See TracBrowser for help on using the repository browser.