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