source: buchla-68k/ram/sctrak.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: 9.3 KB
Line 
1/*
2 =============================================================================
3 sctrak.c -- advance the score to a given frame
4 Version 28 -- 1988-09-23 -- D.N. Lynx Crowe
5 =============================================================================
6*/
7
8#undef DEBUGGER /* define to enable debug trace */
9
10#undef DEBUG_TR /* define for sc_trak() debug */
11
12#undef CHECKPTR /* define to check pointers */
13
14#include "all.h"
15
16extern void dslocn(void);
17extern void sc_adv(void);
18extern void se_disp(struct s_entry *ep, int16_t sd, struct gdsel *gdstb[], int16_t cf);
19extern void sreset(void);
20
21#ifdef DEBUG_TR
22extern short debugsw;
23#endif
24
25extern int16_t ancmsw;
26extern int16_t dubsw;
27extern int16_t ndisp;
28extern int16_t recsw;
29extern int16_t sbase;
30extern int16_t sd;
31extern int16_t se;
32extern int16_t soffset;
33
34extern int16_t grpmode[];
35extern int16_t grpstat[];
36
37extern int16_t varmode[][16];
38
39extern struct gdsel *gdfsep;
40
41extern struct gdsel *gdstbc[];
42extern struct gdsel *gdstbn[];
43extern struct gdsel *gdstbp[];
44
45/*
46
47*/
48
49/*
50 =============================================================================
51 sc_trak(tval) -- position score display such that t_ctr EQ 'tval'
52 Assumes that the pointers are correct.
53 =============================================================================
54*/
55
56int16_t sc_trak(int32_t tval)
57{
58 register struct s_entry *rpb, *rpc, *rpf;
59 register int32_t rtb, rtc, rtf;
60 register int16_t mod48 = 48;
61 struct gdsel *gdsp;
62
63 DB_ENTR("sc_trak");
64
65 if (ndisp NE 2) {
66
67 DB_EXIT("sc_trak - ndisp NE 2");
68 return(FAILURE);
69 }
70
71#ifdef CHECKPTR
72 Pcheck(p_fwd, "p_fwd - sc_trak - entry");
73 Pcheck(p_ctr, "p_ctr - sc_trak - entry");
74 Pcheck(p_bak, "p_bak - sc_trak - entry");
75#endif
76
77 if ((p_fwd EQ E_NULL) OR (p_ctr EQ E_NULL) OR (p_bak EQ E_NULL)) {
78
79 DB_EXIT("sc_trak - NULL ptr");
80 return(FAILURE);
81 }
82/*
83
84*/
85 if (v_regs[5] & 0x0180) /* setup for VSDD bank 0 */
86 vbank(0);
87
88 rpf = p_fwd; /* forward event pointer */
89 rtf = t_fwd; /* forward event time */
90
91 rpc = p_ctr; /* current event pointer */
92 rtc = t_ctr; /* current event time */
93
94 rpb = p_bak; /* backward event pointer */
95 rtb = t_bak; /* backward event time */
96
97#ifdef DEBUG_TR
98 if (debugsw) {
99
100 printf("\n## sc_trak(%10ld) ENTRY - fc_val=%10ld sd = %s sbase=%d soffset=%d\n",
101 tval, fc_val, sd ? "BAK" : "FWD", sbase, soffset);
102
103 printf(" p_bak: %08lX p_ctr: %08lX p_fwd: %08lX\n",
104 p_bak, p_ctr, p_fwd);
105
106 printf(" t_bak: %10ld t_ctr: %10ld t_fwd: %10ld\n",
107 t_bak, t_ctr, t_fwd);
108
109 printf(" T.bak: %10ld T.ctr: %10ld T.fwd: %10ld\n",
110 p_bak->e_time, p_ctr->e_time, p_fwd->e_time);
111 }
112#endif
113
114/*
115
116*/
117 DB_CMNT("sc_trak - update loop");
118
119 if (sd EQ D_FWD) { /* scroll forward */
120
121 DB_CMNT("sc_trak - forward");
122
123 while (rtc++ LT tval) { /* advance to tval */
124
125 sreset(); /* reset highlighting */
126
127 ++rtb; /* update target time at p_bak */
128 ++rtf; /* update target time at p_fwd */
129
130 if (rpb->e_type NE EV_FINI) { /* up to end of score */
131
132 while (rpb->e_time EQ rtb) { /* check event time */
133
134 se_disp(rpb, D_FWD, gdstbp, 0); /* display event */
135 rpb = rpb->e_fwd; /* point at next event */
136
137 if (rpb->e_type EQ EV_FINI) /* stop at end of score */
138 break;
139 }
140 }
141
142 if (0 EQ (rtb % mod48)) { /* handle beat markers */
143
144 if ((struct gdsel *)NULL NE (gdsp = gdfsep)) {
145
146 gdfsep = gdsp->next;
147
148 gdsp->next = gdstbp[12];
149 gdsp->note = 0x1111;
150 gdsp->code = 1;
151
152 gdstbp[12] = gdsp;
153 }
154 }
155/*
156
157*/
158 if (rpc->e_type NE EV_FINI) { /* up to end of score */
159
160 while (rpc->e_time EQ rtc) { /* check event time */
161
162 se_disp(rpc, D_FWD, gdstbc, 1); /* display event */
163 rpc = rpc->e_fwd; /* point at next event */
164
165 if (rpc->e_type EQ EV_FINI) /* stop at end of score */
166 break;
167 }
168 }
169
170 if (rpf->e_type NE EV_FINI) { /* up to end of score */
171
172 while (rpf->e_time EQ rtf) { /* check event time */
173
174 se_disp(rpf, D_FWD, gdstbn, 0); /* display event */
175 rpf = rpf->e_fwd; /* next event pointer */
176
177 if (rpf->e_type EQ EV_FINI) /* stop at end of score */
178 break;
179 }
180 }
181
182 if (0 EQ (rtf % mod48)) { /* handle beat markers */
183
184 if ((struct gdsel *)NULL NE (gdsp = gdfsep)) {
185
186 gdfsep = gdsp->next;
187
188 gdsp->next = gdstbn[12];
189 gdsp->note = 0x1111;
190 gdsp->code = 1;
191
192 gdstbn[12] = gdsp;
193 }
194 }
195
196 sc_adv(); /* scroll the display */
197 }
198
199/*
200
201*/
202 } else { /* scroll backward */
203
204 DB_CMNT("sc_trak - backward");
205
206 while (rtc-- GT tval) { /* advance to tval */
207
208 sreset(); /* reset highlighting */
209
210 --rtb; /* update target time at p_bak */
211 --rtf; /* update target time at p_fwd */
212
213 if (rpb->e_type NE EV_SCORE) { /* up to start of score */
214
215 while (rpb->e_time EQ rtb) { /* check event time */
216
217 se_disp(rpb, D_BAK, gdstbp, 0);
218 rpb = rpb->e_bak; /* point at next event */
219
220 if (rpb->e_type EQ EV_SCORE) /* stop at end of score */
221 break;
222 }
223 }
224
225 if (0 EQ (rtb % mod48)) { /* handle beat markers */
226
227 if ((struct gdsel *)NULL NE (gdsp = gdfsep)) {
228
229 gdfsep = gdsp->next;
230
231 gdsp->next = gdstbp[12];
232 gdsp->note = 0x1111;
233 gdsp->code = 1;
234
235 gdstbp[12] = gdsp;
236 }
237 }
238/*
239
240*/
241 if (rpc->e_type NE EV_SCORE) { /* up to start of score */
242
243 while (rpc->e_time EQ rtc) { /* check event time */
244
245 se_disp(rpc, D_BAK, gdstbc, 1); /* display event */
246 rpc = rpc->e_bak; /* point at next event */
247
248 if (rpc->e_type EQ EV_SCORE) /* stop at end of score */
249 break;
250 }
251 }
252
253 if (rpf->e_type NE EV_SCORE) { /* up to end of score */
254
255 while (rpf->e_time EQ rtf) { /* check event time */
256
257 se_disp(rpf, D_BAK, gdstbn, 0); /* display event */
258 rpf = rpf->e_bak; /* next event pointer */
259
260 if (rpf->e_type EQ EV_SCORE) /* stop at end of score */
261 break;
262 }
263 }
264
265 if (0 EQ (rtf % mod48)) { /* handle beat markers */
266
267 if ((struct gdsel *)NULL NE (gdsp = gdfsep)) {
268
269 gdfsep = gdsp->next;
270
271 gdsp->next = gdstbn[12];
272 gdsp->note = 0x1111;
273 gdsp->code = 1;
274
275 gdstbn[12] = gdsp;
276 }
277 }
278
279 sc_adv(); /* scroll the display */
280 }
281 }
282/*
283
284*/
285 p_fwd = rpf; /* update p_fwd */
286 t_fwd = tval + TO_FWD; /* update t_fwd */
287
288 p_ctr = rpc; /* update p_ctr */
289 t_ctr = tval; /* update t_ctr */
290
291 p_bak = rpb; /* update p_bak */
292 t_bak = tval - TO_BAK; /* update t_bak */
293
294 DB_CMNT("sc_trak - dslocn");
295 dslocn(); /* display current location */
296
297#ifdef DEBUG_TR
298 if (debugsw) {
299
300 printf("\n## sc_trak(%10ld) EXIT - fc_val=%10ld sbase=%d soffset=%d\n",
301 tval, fc_val, sbase, soffset);
302
303 printf(" p_bak: %08lX, p_ctr: %08lX, p_fwd: %08lX\n",
304 p_bak, p_ctr, p_fwd);
305
306 printf(" t_bak: %10ld, t_ctr: %10ld, t_fwd: %10ld\n",
307 t_bak, t_ctr, t_fwd);
308
309 printf(" T.bak: %10ld T.ctr: %10ld T.fwd: %10ld\n",
310 p_bak->e_time, p_ctr->e_time, p_fwd->e_time);
311 }
312#endif
313
314 DB_EXIT("sc_trak");
315 return(SUCCESS);
316}
317
318/*
319
320*/
321
322/*
323 =============================================================================
324 sc_trek(tval) -- follow score chain such that t_cur EQ 'tval'
325 =============================================================================
326*/
327
328int16_t sc_trek(int32_t tval)
329{
330 register struct s_entry *rp, *ep;
331 register int32_t tc, rt;
332 register int16_t et, grp;
333
334 DB_ENTR("sc_trek");
335
336#ifdef CHECKPTR
337 Pcheck(p_cur, "p_cur - sc_trek - entry");
338#endif
339
340 if (p_cur EQ E_NULL) {
341
342 DB_EXIT("sc_trek - NULL ptr");
343 return(FAILURE);
344 }
345
346 rp = p_cur; /* current event pointer */
347 rt = t_cur; /* current event time */
348
349 DB_CMNT("sc_trek - chasing p_cur");
350
351#ifdef DEBUGGER
352 if (se EQ D_FWD)
353 DB_CMNT("sc_trek - forward");
354 else
355 DB_CMNT("sc_trek - backward");
356#endif
357
358/*
359
360*/
361 while (rt NE tval) { /* track tval */
362
363 if (se EQ D_FWD)
364 ++rt;
365 else
366 --rt;
367
368 if (rp->e_type NE EV_FINI) {
369
370 while (rp->e_time EQ rt) { /* process events a rt */
371
372 /* "erase head" logic */
373
374 if (recsw AND (se EQ D_FWD)) {
375
376 et = 0x007F & rp->e_type;
377
378 if ((NOT dubsw) AND
379 ((et EQ EV_NBEG) OR (et EQ EV_NEND))) {
380
381 grp = rp->e_data2;
382
383 if (grpstat[grp] AND (2 EQ grpmode[grp])) {
384
385 DB_CMNT("sc_trek - erasing note");
386
387 /* erasing a note */
388
389 ep = rp->e_fwd;
390
391 if (rp EQ p_bak)
392 p_bak = ep;
393
394 if (rp EQ p_cur)
395 p_cur = ep;
396
397 if (rp EQ p_ctr)
398 p_ctr = ep;
399
400 if (rp EQ p_fwd)
401 p_fwd = ep;
402
403 e_del(e_rmv(rp));
404 rp = ep;
405 goto nextev;
406 }
407/*
408
409*/
410 } else if (et EQ EV_ANVL) {
411
412 grp = 0x000F & rp->e_data1;
413
414 if (grpstat[grp] AND (2 EQ (ancmsw ?
415 varmode[0x000F & (rp->e_data1 >> 4)][grp] :
416 grpmode[grp]))) {
417
418 DB_CMNT("sc_trek - erasing var");
419
420 /* erasing an analog variable */
421
422 ep = rp->e_fwd;
423
424 if (rp EQ p_bak)
425 p_bak = ep;
426
427 if (rp EQ p_cur)
428 p_cur = ep;
429
430 if (rp EQ p_ctr)
431 p_ctr = ep;
432
433 if (rp EQ p_fwd)
434 p_fwd = ep;
435
436 e_del(e_rmv(rp));
437 rp = ep;
438 goto nextev;
439 }
440 }
441 }
442
443 if (rp->e_time EQ rt) { /* check event time */
444
445 se_exec(rp, se); /* execute event */
446
447 if (se EQ D_FWD)
448 rp = rp->e_fwd; /* point at next event */
449 else
450 rp = rp->e_bak; /* point at next event */
451 }
452
453nextev:
454 if (((se EQ D_FWD) AND (rp->e_type EQ EV_FINI)) OR
455 ((se EQ D_BAK) AND (rp->e_type EQ EV_SCORE)))
456 break;
457 }
458 }
459 }
460/*
461
462*/
463 p_cur = rp; /* update p_cur */
464 t_cur = tval; /* update t_cur */
465
466 DB_EXIT("sc_trek");
467 return(SUCCESS);
468}
469
Note: See TracBrowser for help on using the repository browser.