source: buchla-68k/ram/sqexec.c@ 7258c6a

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

Use standard integer types.

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