source: buchla-68k/orig/RAM/SEDISP.S@ ca867c1

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

Imported original source code.

  • Property mode set to 100755
File size: 38.6 KB
Line 
1* ------------------------------------------------------------------------------
2* sedisp.s -- score event display driver
3* Version 43 -- 1988-09-26 -- D.N. Lynx Crowe
4*
5* se_disp(ep, sd, gdstb, cf)
6* struct s_entry *ep;
7* short sd;
8* struct gdsel *gdstb[];
9* short cf;
10*
11* Displays the event at 'ep', scrolling in direction 'sd', by
12* updating 'gdstb'. Uses the accidental code in 'ac_code', and
13* the note type table 'nsvtab'. Checks 'cf' to determine if
14* we're displaying in the center of the screen.
15* Allocates gdsel events as needed for new events.
16* ------------------------------------------------------------------------------
17 .text
18*
19 .xdef _se_disp
20*
21 .xdef _ac_code
22 .xdef numstr
23*
24 .xref _dclkmd
25 .xref _dsgmodz
26 .xref _fromfpu
27 .xref _mpcupd
28 .xref _vputa
29 .xref _vputc
30 .xref _vputs
31*
32 .xref _angroup
33 .xref _ctrsw
34 .xref _grpstat
35 .xref _ins2grp
36 .xref _ndisp
37 .xref _obj8
38 .xref _gdfsep
39 .xref _lastvel
40 .xref _nsvtab
41 .xref _velflag
42 .xref _vrbw08
43 .xref _vrbw09
44 .xref _vrbw10
45 .xref _vrbw11
46 .xref _vrbw12
47 .xref _vrbw13
48 .xref _vrbw14
49 .xref _vrbw15
50 .xref _vrcw
51*
52 .page
53*
54* parameter offsets
55* -----------------
56* for se_disp:
57* ------------
58P_EP .equ 8 * LONG - event pointer
59P_SD .equ 12 * WORD - scroll direction
60P_SL .equ 14 * LONG - slice control table pointer
61P_CF .equ 18 * WORD - center slice flag
62*
63* for vputa:
64* ----------
65ROW .equ 4 * WORD - 'row' parameter offset
66COL .equ 6 * WORD - 'col' parameter offset
67ATR .equ 8 * WORD - 'atr' parameter offset
68*
69* Character field attributes for highlighting
70* -------------------------------------------
71AT01 .equ $0054
72AT04 .equ $0053
73AT05 .equ $0054
74AT06 .equ $0053
75AT07 .equ $0054
76AT08 .equ $0053
77AT09 .equ $0054
78AT10 .equ $0053
79AT11 .equ $0052
80AT12 .equ $0052
81*
82* Special character equates
83* -------------------------
84SP_M1 .equ $A1 * -1
85SP_P1 .equ $A0 * +1
86*
87 .page
88*
89* event structure offsets
90* -----------------------
91* offset length
92* ------ ------
93E_TIME .equ 0 * LONG
94E_SIZE .equ 4 * BYTE
95E_TYPE .equ 5 * BYTE
96E_DATA1 .equ 6 * BYTE
97E_NOTE .equ 6 * BYTE
98E_DATA2 .equ 7 * BYTE
99E_GROUP .equ 7 * BYTE
100E_BAK .equ 8 * LONG
101E_FWD .equ 12 * LONG
102E_DN .equ 16 * LONG
103E_VEL .equ 16 * WORD
104E_DATA4 .equ 18 * WORD
105E_UP .equ 20 * LONG
106E_LFT .equ 24 * LONG
107E_RGT .equ 28 * LONG
108*
109N_ETYPES .equ 25 * number of event types
110*
111* gdsel structure definitions
112* ---------------------------
113G_NEXT .equ 0 * long - 'next' field (struct gdsel *)
114G_NOTE .equ 4 * word - 'note' field (short)
115G_CODE .equ 6 * word - 'code' field (short)
116*
117NATCH_B .equ 3 * uslice note code: 'begin natural'
118NOTE_E .equ 6 * uslice note code: 'end note'
119*
120NGDSEL .equ 17 * number of event slots in gdstb
121*
122BARFLAG .equ 4*(NGDSEL-1) * offset to the bar marker flag
123*
124 .page
125*
126* A few words about se_disp:
127* --------------------------
128* se_disp has to be very fast, so it's written in assembly language,
129* rather than C, which is usually pretty good, but not quite good enough
130* for this application. The faster this routine runs, the higher the
131* tempo we can keep up with. If this code is fast enough, we end up
132* hardware limited by the maximum rate of the timer, and the VSDD update rate.
133*
134_se_disp: link a6,#0 * allocate and link stack frame
135 movea.l P_EP(a6),a0 * get event pointer 'ep' into a0
136 move.b E_TYPE(a0),d1 * get event type into d1.W
137 andi.w #$007F,d1 * mask off new-note flag
138 cmp.b #N_ETYPES,d1 * see if it's valid
139 blt seds1 * jump if it is
140*
141dsexit: unlk a6 * done -- unlink stack frames
142 rts * return to caller
143*
144seds1: lea sddtab,a1 * get base of dispatch table
145 lsl.w #2,d1 * multiplty event by 4 for index
146 movea.l 0(a1,d1.W),a2 * get address of event routine
147 jmp (a2) * jump to event display routine
148*
149* On entry, the individual display routines only depend on a0 pointing at the
150* event they were dispatched for. Registers a6 and a7 have their usual meaning,
151* a6 = frame pointer, a7 = stack pointer.
152*
153* d0..d2 are used for scratch, as are a0..a2, and are not saved by this code.
154*
155 .page
156*
157* dsnbx -- dispatch to begin / end based on sd
158* ----- -----------------------------------
159dsnbx: tst.w P_SD(a7) * check direction
160 bne dsne * treat as end if going backward
161*
162* dsnb -- display note begin
163* ---- ------------------
164dsnb: move.b E_TYPE(a0),d1 * get event type
165 move.w d1,d2 * save in d2
166 andi.w #$007F,d1 * clear new-note flag
167 move.b d1,E_TYPE(a0) * store type back in event
168 clr.w d0 * get group number
169 move.b E_GROUP(a0),d0 * ... in d0
170 move.w d0,d1 * save group in d1
171 add.w d0,d0 * make d0 a word offset
172 lea _grpstat,a1 * check grpstat[grp]
173 tst.w 0(a1,d0.W) * ...
174 beq dsexit * done if not enabled
175*
176 tst.w P_CF(a6) * check center slice flag
177 beq dsnb0 * jump if not center slice
178*
179 tst.w _velflag * see if we display velocity
180 beq dsnvx * jump if not
181*
182 move.w d2,-(a7) * save new-note flag on stack
183 move.w d1,-(a7) * save group number on stack
184 move.w E_VEL(a0),d0 * get velocity
185 move.w d1,d2 * point into lastvel[]
186 add.w d2,d2 * ...
187 lea _lastvel,a1 * ...
188 move.w d0,0(a1,d2.W) * update lastvel[group]
189 ext.l d0 * scale
190 divu #252,d0 * ...
191 cmpi.w #100,d0 * convert MS digit
192 bcs dsnv0 * ...
193*
194 move.b #'1',numstr * ...
195 subi.w #100,d0 * ...
196 bra dsnv1 * ...
197*
198dsnv0: move.b #'0',numstr * ...
199*
200dsnv1: ext.l d0 * convert middle & LS digits
201 divu #10,d0 * ...
202 addi.l #$00300030,d0 * ...
203 move.b d0,numstr+1 * ...
204 swap d0 * ...
205 move.b d0,numstr+2 * ...
206 clr.b numstr+3 * terminate string
207 move.w d1,d0 * col = group
208 asl.w #2,d0 * ... * 5
209 add.w d1,d0 * ...
210 add.w #6,d0 * ... + 6
211 move.l a0,-(a7) * save event pointer on stack
212 move.w #AT11,-(a7) * put attribute on stack
213 move.l #numstr,-(a7) * put string address on stack
214 move.w d0,-(a7) * put column on stack
215 move.w #5,-(a7) * put row on stack
216 move.l _obj8,-(a7) * put VSDD address on stack
217 jsr _vputs * update the screen
218 add.l #14,a7 * clean up stack
219 movea.l (a7)+,a0 * restore event pointer
220*
221 .page
222*
223 move.w (a7)+,d0 * get group from stack
224 cmpi.w #12,d0 * see which byte it's in
225 bcc dsnv2 * jump if in MS byte
226*
227 bset d0,_vrbw12+1 * set group bit in LS byte
228 bra dsnv3 * ...
229*
230dsnv2: bset d0,_vrbw12 * set group bit in MS byte
231*
232dsnv3: bset #4,_vrcw * set video reset type bit
233 move.w (a7)+,d2 * get new-note flag from stack
234*
235dsnvx: btst.l #7,d2 * check new-note flag
236 beq dsexit * done if not set
237*
238dsnb0: clr.w d1 * get note number nn (0..127)
239 move.b E_NOTE(a0),d1 * ... in d1
240 sub.w #21,d1 * subtract base of piano scale
241 bmi dsexit * done if not displayable
242*
243 cmp.w #87,d1 * see if it's too high
244 bgt dsexit * done if not displayable
245*
246 move.l _gdfsep,d0 * quit if no elements left
247 beq dsexit * ...
248*
249 movea.l d0,a1 * a1 = gdsp
250 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
251 clr.w d2 * d2 = ep->group
252 move.b E_GROUP(a0),d2 * ...
253 lsl.w #2,d2 * ... * 4
254 movea.l P_SL(a6),a2 * a2 points at gdstb
255 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[ep->group]
256 move.l a1,0(a2,d2.W) * gdstb[ep->group] = gdsp
257 move.w d1,G_NOTE(a1) * gdsp->note = nn
258 lea _nsvtab,a2 * a2 points at nsvtab
259 tst.b 0(a2,d1.W) * check nsvtab[nn]
260 beq dsnb1 * jump if natural note
261*
262 move.b _ac_code,d1 * setup for an accidental note
263 bra dsnb2 * ...
264*
265dsnb1: move.b #NATCH_B,d1 * setup for a natural note
266*
267dsnb2: move.w d1,G_CODE(a1) * gdsp->code = note type
268 bra dsexit * done
269*
270 .page
271*
272* dsnex -- dispatch to end/begin based on sd
273* ----- ---------------------------------
274dsnex: tst.w P_SD(a7) * check direction
275 bne dsnb * treat as begin if going backward
276*
277* dsne -- display note end
278* ---- ----------------
279dsne: move.b E_TYPE(a0),d1 * get event type
280 move.w d1,d2 * save in d2
281 andi.w #$007F,d1 * clear new-note flag
282 move.b d1,E_TYPE(a0) * store type back in event
283 clr.w d0 * get group number
284 move.b E_GROUP(a0),d0 * ... in d0
285 add.w d0,d0 * ... as a word offset
286 lea _grpstat,a1 * check grpstat[grp]
287 tst.w 0(a1,d0.W) * ...
288 beq dsexit * done if not enabled
289*
290 tst.w P_CF(a6) * check center slice flag
291 beq dsne3 * jump if not center slice
292*
293 btst.l #7,d2 * check new-note flag
294 beq dsexit * done if not set
295*
296dsne3: move.b E_NOTE(a0),d1 * d1 = note number nn (0..127)
297 sub.w #21,d1 * subtract base of piano scale
298 bmi dsexit * done if not displayable
299*
300 cmp.w #87,d1 * see if it's too high
301 bgt dsexit * done if not displayable
302*
303 movea.l P_SL(a6),a2 * a2 points at gdstb
304 clr.w d2 * get group in d2
305 move.b E_GROUP(a0),d2 * ...
306 lsl.w #2,d2 * ... * 4
307 move.l 0(a2,d2.W),d0 * check gdstb[ep->group]
308 beq dsexit
309*
310dsne0: movea.l d0,a1 * a1 = gdsp
311*
312dsne1: cmp.w G_NOTE(a1),d1 * compare nn to gdsp->note
313 bne dsne2 * jump if not the one we want
314*
315 move.w #NOTE_E,G_CODE(a1) * gdsp->code = NOTE_E (end note)
316*
317dsne2: move.l G_NEXT(a1),d0 * get gdsp->next
318 beq dsexit * done if next = NULL
319*
320 bra dsne0 * loop for next one
321*
322 .page
323*
324* dssbgn -- display section begin
325* ------ ---------------------
326dssbgn: tst.w P_CF(a6) * center update ?
327 beq dsbgn0 * jump if not
328*
329 clr.w d1 * get section number
330 move.b E_DATA1(a0),d1 * ... from the event
331 addq.w #1,d1 * ... adjusted for display
332 ext.l d1 * ... as a long in d1
333 divu #10,d1 * divide by 10 for conversion
334 add.l #$00300030,d1 * add '0' for ASCII conversion
335 move.b d1,numstr * put MS byte in work area
336 swap d1 * swap register halves
337 move.b d1,numstr+1 * put LS byte in work area
338 clr.b numstr+2 * terminate string
339 move.w #AT01,-(a7) * put attribute on stack
340 move.l #numstr,-(a7) * put buffer address on stack
341 move.w #6,-(a7) * put column on stack
342 move.w #0,-(a7) * put row on stack
343 move.l _obj8,-(a7) * put sbase on stack
344 jsr _vputs * update the screen
345 add.l #14,a7 * clean up stack
346 bset #4,_vrcw+1 * set video reset type bit
347 tst.w _ctrsw * update center for scupd ?
348 beq dsexit * done if not
349*
350dsbgn0: move.l _gdfsep,d0 * quit if no elements left
351 beq dsexit * ...
352*
353 movea.l d0,a1 * a1 = gdsp
354 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
355 move.w #48,d2 * d2 = event PRIORITY * 4
356 movea.l P_SL(a6),a2 * a2 points at gdstb
357 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
358 move.w #$1111,G_NOTE(a1) * gdsp->note = COLOR
359 move.w #0,G_CODE(a1) * gdsp->code = PATTERN
360 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
361 bra dsexit * done
362*
363 .page
364*
365* dssend -- display section end
366* ------ -------------------
367dssend: tst.w P_CF(a6) * center update ?
368 beq dssend0 * jump if not
369*
370 tst.w _ctrsw * update center for scupd ?
371 beq dsexit * done if not
372*
373dssend0: move.l _gdfsep,d0 * quit if no elements left
374 beq dsexit * ...
375*
376 movea.l d0,a1 * a1 = gdsp
377 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
378 move.w #48,d2 * d2 = event PRIORITY * 4
379 movea.l P_SL(a6),a2 * a2 points at gdstb
380 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
381 move.w #$1111,G_NOTE(a1) * gdsp->note = COLOR
382 move.w #2,G_CODE(a1) * gdsp->code = PATTERN
383 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
384 bra dsexit * done
385*
386* dsbeat -- display beat
387* ------ ------------
388dsbeat: tst.w P_CF(a6) * center update ?
389 bne dsexit * done if so
390*
391 move.l _gdfsep,d0 * quit if no elements left
392 beq dsexit * ...
393*
394 movea.l d0,a1 * a1 = gdsp
395 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
396 move.w #48,d2 * d2 = event PRIORITY * 4
397 movea.l P_SL(a6),a2 * a2 points at gdstb
398 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
399 move.w #$1111,G_NOTE(a1) * gdsp->note = COLOR
400 move.w #1,G_CODE(a1) * gdsp->code = PATTERN
401 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
402 bra dsexit * done
403*
404 .page
405*
406* dstune -- display tuning
407* ------ --------------
408dstune: tst.w P_CF(a6) * center update ?
409 beq dstune0 * jump if not
410*
411 clr.w d1 * get current tuning
412 move.b E_DATA1(a0),d1 * ...
413 add.w #$0030,d1 * add '0' for ASCII conversion
414 move.w #AT05,-(a7) * put attribute on stack
415 move.w d1,-(a7) * put character on stack
416 move.w #19,-(a7) * put column on stack
417 move.w #1,-(a7) * put row on stack
418 move.l _obj8,-(a7) * put sbase on stack
419 jsr _vputc * display character
420 add.l #12,a7 * clean up stack
421 bset #1,_vrcw+1 * set video reset type bit
422 tst.w _ctrsw * update center for scupd ?
423 beq dsexit * done if not
424*
425dstune0: move.l _gdfsep,d0 * quit if no elements left
426 beq dsexit * ...
427*
428 movea.l d0,a1 * a1 = gdsp
429 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
430 move.w #52,d2 * d2 = event PRIORITY * 4
431 movea.l P_SL(a6),a2 * a2 points at gdstb
432 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
433 move.w #$CCCC,G_NOTE(a1) * gdsp->note = COLOR
434 move.w #3,G_CODE(a1) * gdsp->code = PATTERN
435 move.l a1,0(a2,d2.W) * gdstb[priority] = gdsp
436 bra dsexit * done
437*
438 .page
439*
440* dstrns -- display transposition
441* ------ ---------------------
442dstrns: clr.w d0 * get group number
443 move.b E_DATA1(a0),d0 * ... in d0
444 add.w d0,d0 * ... as a word offset
445 lea _grpstat,a1 * check grpstat[grp]
446 tst.w 0(a1,d0.W) * ...
447 beq dsexit * done if not enabled
448*
449 tst.w P_CF(a6) * center update
450 beq dstrns0 * jump if not
451*
452 move.w E_LFT(a0),d1 * get transposition value
453 bpl dstrns1 * jump if positive
454*
455 move.b #'-',numstr * note negative sign
456 neg.w d1 * make number positive
457 bra dstrns2 * ...
458*
459dstrns1: move.b #'+',numstr * note positive sign
460*
461dstrns2: cmpi.w #1000,d1 * is number GE 1000 ?
462 bcs dstrns3 * jump if not
463*
464 subi.w #1000,d1 * adjust number
465 cmpi.b #'-',numstr * was number negative
466 bne dstrns4 * jump if not
467*
468 move.b #SP_M1,numstr * set -1 in numstr
469 bra dstrns3 * ...
470*
471dstrns4: move.b #SP_P1,numstr * set +1 in numstr
472*
473dstrns3: ext.l d1 * make d1 a long
474 divu #100,d1 * convert 1st digit
475 addi.w #$0030,d1 * ... to ASCII
476 move.b d1,numstr+1 * ... in numstr
477 swap d1 * convert 2nd digit
478 ext.l d1 * ...
479 divu #10,d1 * ...
480 addi.w #$0030,d1 * ... to ASCII
481 move.b d1,numstr+2 * ... in numstr
482 swap d1 * convert 3rd digit
483 addi.w #$0030,d1 * ... to ASCII
484 move.b d1,numstr+3 * ... in numstr
485 clr.b numstr+4 * terminate numstr
486*
487 .page
488*
489 move.w d0,d1 * get group number
490 asr.w #1,d1 * ... in d1
491 move.w d1,-(a7) * save group number on stack
492 add.w d0,d0 * calculate column
493 add.w d0,d1 * ... = 5 * group
494 addi.w #5,d1 * ... + 5
495 move.w #AT11,-(a7) * vputs(obj8, 3, col, numstr, atr11)
496 move.l #numstr,-(a7) * ...
497 move.w d1,-(a7) * ...
498 move.w #3,-(a7) * ...
499 move.l _obj8,-(a7) * ...
500 jsr _vputs * ...
501 add.l #14,a7 * ...
502 move.w (a7)+,d0 * get group number
503 cmpi.w #8,d0 * see which byte it's in
504 bcc dstrns5 * jump if in MS byte
505*
506 bset d0,_vrbw09+1 * set group bit in LS byte
507 bra dstrns6 * ...
508*
509dstrns5: sub.w #8,d0 * adjust for byte
510 bset d0,_vrbw09 * set group bit in MS byte
511*
512dstrns6: bset #1,_vrcw * set video reset type bit
513 tst.w _ctrsw * update center for scupd ?
514 beq dsexit * done if not
515*
516dstrns0: move.l _gdfsep,d0 * quit if no elements left
517 beq dsexit * ...
518*
519 movea.l d0,a1 * a1 = gdsp
520 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
521 move.w #52,d2 * d2 = event PRIORITY * 4
522 movea.l P_SL(a6),a2 * a2 points at gdstb
523 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
524 move.w #$9999,G_NOTE(a1) * gdsp->note = COLOR
525 move.w #4,G_CODE(a1) * gdsp->code = PATTERN
526 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
527 bra dsexit * done
528*
529 .page
530*
531* dsdyn -- display dynamics
532* ----- ----------------
533dsdyn: clr.w d0 * get group number
534 move.b E_DATA1(a0),d0 * ... in d0
535 add.w d0,d0 * ... as a word offset
536 lea _grpstat,a1 * check grpstat[grp]
537 tst.w 0(a1,d0.W) * ...
538 beq dsexit * done if not enabled
539*
540 tst.w P_CF(a6) * center update ?
541 beq dsdyn00 * jump if not
542*
543 clr.w d0 * get dynamics
544 move.b E_DATA2(a0),d0 * ... in d0
545 move.w d0,-(a7) * save dyanmics
546 clr.w d1 * get group number
547 move.b E_DATA1(a0),d1 * ... in d1
548 move.w d1,-(a7) * save group number
549 move.w (a7),d0 * col = group number
550 add.w d0,d0 * ... * 5
551 add.w d0,d0 * ...
552 move.w (a7)+,d2 * ... (d2 = group number)
553 add.w d2,d0 * ...
554 add.w #6,d0 * ... + 6
555 move.w (a7)+,d1 * get dynamics
556 add.w #$0030,d1 * add '0' for ASCII conversion
557 move.w d2,-(a7) * save group number
558 move.w #AT11,-(a7) * put attribute on stack
559 move.w d1,-(a7) * put digit on stack
560 move.w d0,-(a7) * put column on stack
561 move.w #4,-(a7) * put row on stack
562 move.l _obj8,-(a7) * put object address on stack
563 jsr _vputc * update the screen
564 add.l #12,a7 * clean up stack
565 move.w (a7)+,d0 * get group number
566 cmp.w #8,d0 * see which word it's in
567 bcc dsdyn1 * jump if in MS word
568*
569 bset d0,_vrbw10+1 * set group bit in LS byte
570 bra dsdyn2 * ...
571*
572dsdyn1: sub.w #8,d0 * adjust for for byte
573 bset d0,_vrbw10 * set group bit in MS byte
574*
575dsdyn2: bset #2,_vrcw * set video reset type bit
576 tst.w _ctrsw * update center for scupd ?
577 beq dsexit * done if not
578*
579 .page
580dsdyn00: move.l _gdfsep,d0 * quit if no elements left
581 beq dsexit * ...
582*
583 movea.l d0,a1 * a1 = gdsp
584 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
585 move.w #52,d2 * d2 = event PRIORITY * 4
586 movea.l P_SL(a6),a2 * a2 points at gdstb
587 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
588 move.w #$9999,G_NOTE(a1) * gdsp->note = COLOR
589 move.w #5,G_CODE(a1) * gdsp->code = PATTERN
590 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
591 bra dsexit * done
592*
593 .page
594*
595* dslocn -- display location
596* ------ ----------------
597dslocn: clr.w d0 * get group number
598 move.b E_DATA1(a0),d0 * ... in d0
599 add.w d0,d0 * ... as a word offset
600 lea _grpstat,a1 * check grpstat[grp]
601 tst.w 0(a1,d0.W) * ...
602 beq dsexit * done if not enabled
603*
604 tst.w P_CF(a6) * center update ?
605 beq dsloc00 * jump if not
606*
607 clr.w d0 * get location
608 move.b E_DATA2(a0),d0 * ... in d0
609 move.w d0,-(a7) * save location
610 clr.w d1 * get group number
611 move.b E_DATA1(a0),d1 * ... in d1
612 move.w d1,-(a7) * save group number
613 move.w (a7),d0 * col = group number
614 add.w d0,d0 * ... * 5
615 add.w d0,d0 * ...
616 move.w (a7)+,d2 * ... (d2 = group number)
617 add.w d2,d0 * ...
618 add.w #8,d0 * ... + 8
619 move.w (a7)+,d1 * get location
620 add.w #$0031,d1 * add '0' for ASCII conversion
621 move.w d2,-(a7) * save group number
622 move.w #AT11,-(a7) * put attribute on stack
623 move.w d1,-(a7) * put character on stack
624 move.w d0,-(a7) * put column on stack
625 move.w #4,-(a7) * put row on stack
626 move.l _obj8,-(a7) * put object address on stack
627 jsr _vputc * update the screen
628 add.l #12,a7 * clean up stack
629 move.w (a7)+,d0 * get group number
630 cmp.w #8,d0 * see which word it's in
631 bcc dslocn1 * jump if in MS word
632*
633 bset d0,_vrbw11+1 * set group bit in LS byte
634 bra dslocn2 * ...
635*
636dslocn1: sub.w #8,d0 * adjust for for byte
637 bset d0,_vrbw11 * set group bit in MS byte
638*
639dslocn2: bset #3,_vrcw * set video reset type bit
640 tst.w _ctrsw * update center for scupd ?
641 beq dsexit * done if not
642*
643 .page
644dsloc00: move.l _gdfsep,d0 * quit if no elements left
645 beq dsexit * ...
646*
647 movea.l d0,a1 * a1 = gdsp
648 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
649 move.w #52,d2 * d2 = event PRIORITY * 4
650 movea.l P_SL(a6),a2 * a2 points at gdstb
651 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
652 move.w #$9999,G_NOTE(a1) * gdsp->note = COLOR
653 move.w #5,G_CODE(a1) * gdsp->code = PATTERN
654 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
655 bra dsexit * done
656*
657 .page
658*
659* dsanrs -- display analog resolution
660* ------ -------------------------
661dsanrs: move.b E_DATA1(a0),d1 * get var / group
662 move.w d1,d0 * extract group number
663 andi.w #$000F,d0 * ... in d0
664 add.w d0,d0 * ... as a word offset
665 lea _grpstat,a1 * check grpstat[grp]
666 tst.w 0(a1,d0.W) * ...
667 beq dsexit * done if not enabled
668*
669 tst.w P_CF(a6) * center update ?
670 beq dsanrs0 * jump if not
671*
672 move.w _angroup,d2 * see if we display
673 bmi dsexit * jump if not
674*
675 subq.w #1,d2 * adust selected group number
676 move.w d1,d0 * extract group from event
677 andi.w #$000F,d0 * ...
678 cmp.w d0,d2 * see if we display
679 bne dsexit * jump if not
680*
681 lsr.w #4,d1 * extract variable number
682 andi.w #$000F,d1 * ...
683 move.w d1,-(a7) * save variable number
684 move.w d1,d0 * calculate display offset
685 lsl.w #3,d0 * ... (var * 9) + 6
686 add.w d0,d1 * ... in d1
687 addq.w #6,d1 * ...
688 move.b E_DATA2(a0),d0 * get resolution
689 addi.w #$0030,d0 * convert for display
690 move.w #AT12,-(a7) * put attribute on stack
691 move.w d0,-(a7) * put character on stack
692 move.w d1,-(a7) * put column on stack
693 move.w #7,-(a7) * put row on stack
694 move.l _obj8,-(a7) * put sbase on stack
695 jsr _vputc * update the screen
696 add.l #12,a7 * clean up stack
697 move.w (a7)+,d0 * get variable number
698 bset d0,_vrbw13+1 * set variable bit
699 bset #5,_vrcw * set video reset type bit
700 tst.w _ctrsw * update center for scupd ?
701 beq dsexit * done if not
702*
703 .page
704dsanrs0: move.l _gdfsep,d0 * quit if no elements left
705 beq dsexit * ...
706*
707 movea.l d0,a1 * a1 = gdsp
708 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
709 move.w #52,d2 * d2 = event PRIORITY * 4
710 movea.l P_SL(a6),a2 * a2 points at gdstb
711 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
712 move.w #$9999,G_NOTE(a1) * gdsp->note = COLOR
713 move.w #6,G_CODE(a1) * gdsp->code = PATTERN
714 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
715 bra dsexit * done
716*
717 .page
718*
719* dsanvl -- display analog value
720* ------ --------------------
721dsanvl: move.w _angroup,d2 * see if we display
722 bmi dsexit * jump if not
723*
724 move.b E_DATA1(a0),d1 * get var / group
725 move.w d1,d0 * extract group number
726 andi.w #$000F,d0 * ... in d0
727 add.w d0,d0 * ... as a word offset
728 lea _grpstat,a1 * check grpstat[grp]
729 tst.w 0(a1,d0.W) * ...
730 beq dsexit * done if not enabled
731*
732 tst.w P_CF(a6) * center update ?
733 beq dsanvl0 * jump if not
734*
735 subq.w #1,d2 * adust group number
736 move.w d1,d0 * extract group
737 andi.w #$000F,d0 * ...
738 cmp.w d0,d2 * see if we display
739 bne dsexit * jump if not
740*
741 lsr.w #4,d1 * extract variable number
742 andi.w #$000F,d1 * ...
743 move.w d1,-(a7) * save variable number
744 move.w d1,d0 * calculate display offset
745 lsl.w #3,d0 * ... (var * 9) + 8
746 add.w d0,d1 * ... in d1
747 addi.w #8,d1 * ...
748 move.w E_DN(a0),d0 * get value
749 asr.w #5,d0 * adjust to low 11 bits
750 bpl dsanvl1 * jump if positive
751*
752 move.b #'-',numstr * set sign = '-'
753 neg.w d0 * make value positive
754 bra dsanvl2
755*
756dsanvl1: move.b #'+',numstr * set sign = '+'
757*
758 .page
759dsanvl2: ext.l d0 * convert MS digit
760 divu #1000,d0 * ...
761 add.w #$0030,d0 * ...
762 move.b d0,numstr+1 * ...
763 swap d0 * convert middle digit
764 ext.l d0 * ...
765 divu #100,d0 * ...
766 add.w #$0030,d0 * ...
767 move.b d0,numstr+2 * ...
768 move.b #'.',numstr+3 * insert decimal point
769 swap d0 * convert LS digit
770 ext.l d0 * ...
771 divu #10,d0 * ...
772 add.w #$0030,d0 * ...
773 move.b d0,numstr+4 * ...
774 clr.b numstr+5 * terminate string
775 move.w #AT12,-(a7) * put attribute on stack
776 move.l #numstr,-(a7) * put buffer address on stack
777 move.w d1,-(a7) * put column on stack
778 move.w #7,-(a7) * put row on stack
779 move.l _obj8,-(a7) * put sbase on stack
780 jsr _vputs * update the screen
781 add.l #14,a7 * clean up stack
782 move.w (a7)+,d0 * get variable number
783 bset d0,_vrbw14+1 * set variable bit
784 bset #6,_vrcw * set video reset type bit
785 tst.w _ctrsw * update center for scupd ?
786 beq dsexit * done if not
787*
788dsanvl0: move.l _gdfsep,d0 * quit if no elements left
789 beq dsexit * ...
790*
791 movea.l d0,a1 * a1 = gdsp
792 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
793 move.w #52,d2 * d2 = event PRIORITY * 4
794 movea.l P_SL(a6),a2 * a2 points at gdstb
795 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
796 move.w #$9999,G_NOTE(a1) * gdsp->note = COLOR
797 move.w #6,G_CODE(a1) * gdsp->code = PATTERN
798 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
799 bra dsexit * done
800*
801 .page
802*
803* dsasgn -- display assignment
804* ------ ------------------
805dsasgn: tst.w P_CF(a6) * center update ?
806 beq dsasgn0 * jump if not
807*
808 move.l a0,-(a7) * stash a0
809 jsr _mpcupd * update changed stuff
810 movea.l (a7)+,a0 * restore a0
811 clr.w d1 * get assignment
812 move.b E_DATA1(a0),d1 * ... from the event
813 ext.l d1 * ... as a long in d1
814 divu #10,d1 * divide by 10 for conversion
815 add.l #$00300030,d1 * add '0' for ASCII conversion
816 move.b d1,numstr * put MS byte in work area
817 swap d1 * swap register halves
818 move.b d1,numstr+1 * put LS byte in work area
819 clr.b numstr+2 * terminate string
820 move.w #AT04,-(a7) * put attribute on stack
821 move.l #numstr,-(a7) * put buffer address on stack
822 move.w #11,-(a7) * put column on stack
823 move.w #1,-(a7) * put row on stack
824 move.l _obj8,-(a7) * put sbase on stack
825 jsr _vputs * update the screen
826 add.l #14,a7 * clean up stack
827 bset #0,_vrcw+1 * set video reset type bit
828 tst.w _ctrsw * update center for scupd ?
829 beq dsexit * done if not
830*
831dsasgn0: move.l _gdfsep,d0 * quit if no elements left
832 beq dsexit * ...
833*
834 movea.l d0,a1 * a1 = gdsp
835 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
836 move.w #56,d2 * d2 = event PRIORITY * 4
837 movea.l P_SL(a6),a2 * a2 points at gdstb
838 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
839 move.w #$3333,G_NOTE(a1) * gdsp->note = COLOR
840 move.w #3,G_CODE(a1) * gdsp->code = PATTERN
841 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
842 bra dsexit * done
843*
844 .page
845*
846* dstmpo -- display tempo
847* ------ -------------
848dstmpo: tst.w P_CF(a6) * center update ?
849 beq dstmpo0 * jump if not
850*
851 clr.w d1 * get tempo
852 move.b E_DATA1(a0),d1 * ... from event
853 ext.l d1 * ... as a long in d1
854 divu #10,d1 * divide by 10 for conversion
855 swap d1 * swap register halves
856 add.w #$0030,d1 * add '0' for ASCII conversion
857 move.b d1,numstr+2 * put LS byte in work area
858 swap d1 * swap register halves
859 ext.l d1 * divide again
860 divu #10,d1 * ...
861 add.l #$00300030,d1 * add '0' for ASCII conversion
862 move.b d1,numstr * put MS byte in work area
863 swap d1 * swap register halves
864 move.b d1,numstr+1 * put middle byte in work area
865 clr.b numstr+3 * terminate string
866 move.w #AT06,-(a7) * put attribute on stack
867 move.l #numstr,-(a7) * put buffer address on stack
868 move.w #27,-(a7) * put column on stack
869 move.w #1,-(a7) * put row on stack
870 move.l _obj8,-(a7) * put sbase on stack
871 jsr _vputs * display tempo
872 add.l #14,a7 * clean up stack
873 bset #2,_vrcw+1 * set video reset type bit
874 tst.w _ctrsw * update center for scupd ?
875 beq dsexit * done if not
876*
877dstmpo0: move.l _gdfsep,d0 * quit if no elements left
878 beq dsexit * ...
879*
880 movea.l d0,a1 * a1 = gdsp
881 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
882 move.w #56,d2 * d2 = event PRIORITY * 4
883 movea.l P_SL(a6),a2 * a2 points at gdstb
884 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
885 move.w #$3333,G_NOTE(a1) * gdsp->note = COLOR
886 move.w #4,G_CODE(a1) * gdsp->code = PATTERN
887 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
888 bra dsexit * done
889*
890 .page
891*
892* dsstop -- display stop
893* ------ ------------
894dsstop: tst.w P_CF(a6) * center update ?
895 beq dsstop0 * jump if not
896*
897 jsr _dclkmd * show that clock is stopped
898 move.w #AT08,-(a7) * put attribute on stack
899 move.w #40,-(a7) * put 1st column on stack
900 move.w #1,-(a7) * put row on stack
901 move.l _obj8,-(a7) * put sbase on stack
902 jsr _vputa * hilite first column
903 move.w #41,COL(a7) * put 2nd column on stack
904 jsr _vputa * hilite second column
905 move.w #42,COL(a7) * put 3rd column on stack
906 jsr _vputa * hilite third column
907 move.w #43,COL(a7) * put 4th column on stack
908 jsr _vputa * hilite fourth column
909 add.l #10,a7 * clean up stack
910 bset #7,_vrcw * set video reset type bits
911 bset #0,_vrbw15 * ...
912 tst.w _ctrsw * update center for scupd ?
913 beq dsexit * done if not
914*
915dsstop0: move.l _gdfsep,d0 * quit if no elements left
916 beq dsexit * ...
917*
918 movea.l d0,a1 * a1 = gdsp
919 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
920 move.w #56,d2 * d2 = event PRIORITY * 4
921 movea.l P_SL(a6),a2 * a2 points at gdstb
922 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
923 move.w #$3333,G_NOTE(a1) * gdsp->note = COLOR
924 move.w #5,G_CODE(a1) * gdsp->code = PATTERN
925 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
926 bra dsexit * done
927*
928 .page
929*
930* dsnext -- display next
931* ------ ------------
932dsnext: tst.w P_CF(a6) * center update ?
933 beq dsnext0 * jump if not
934*
935 move.w #AT08,-(a7) * put attribute on stack
936 move.w #45,-(a7) * put 1st column on stack
937 move.w #1,-(a7) * put row on stack
938 move.l _obj8,-(a7) * put sbase on stack
939 jsr _vputa * hilite first column
940 move.w #46,COL(a7) * put 2nd column on stack
941 jsr _vputa * hilite second column
942 move.w #47,COL(a7) * put 3rd column on stack
943 jsr _vputa * hilite third column
944 move.w #48,COL(a7) * put 4th column on stack
945 jsr _vputa * hilite fourth column
946 add.l #10,a7 * clean up stack
947 bset #7,_vrcw * set video reset type bits
948 bset #1,_vrbw15 * ...
949 tst.w _ctrsw * update center for scupd ?
950 beq dsexit * done if not
951*
952dsnext0: move.l _gdfsep,d0 * quit if no elements left
953 beq dsexit * ...
954*
955 movea.l d0,a1 * a1 = gdsp
956 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
957 move.w #56,d2 * d2 = event PRIORITY * 4
958 movea.l P_SL(a6),a2 * a2 points at gdstb
959 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
960 move.w #$3333,G_NOTE(a1) * gdsp->note = COLOR
961 move.w #5,G_CODE(a1) * gdsp->code = PATTERN
962 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
963 bra dsexit * done
964*
965 .page
966*
967* dsgrp -- display group status
968* ----- --------------------
969dsgrp: tst.w P_CF(a6) * center update ?
970 beq dsgrp0 * jump if not
971*
972 tst.w _ctrsw * update center for scupd ?
973 beq dsexit * done if not
974*
975dsgrp0: move.l _gdfsep,d0 * quit if no elements left
976 beq dsexit * ...
977*
978 movea.l d0,a1 * a1 = gdsp
979 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
980 move.w #60,d2 * d2 = event PRIORITY * 4
981 movea.l P_SL(a6),a2 * a2 points at gdstb
982 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
983 move.w #$9999,G_NOTE(a1) * gdsp->note = COLOR
984 move.w #3,G_CODE(a1) * gdsp->code = PATTERN
985 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
986 bra dsexit * done
987*
988 .page
989*
990* dsinst -- display instrument
991* ------ ------------------
992dsinst: clr.w d0 * get group number
993 move.b E_DATA1(a0),d0 * ... in d0
994 add.w d0,d0 * ... as a word offset
995 lea _grpstat,a1 * check grpstat[grp]
996 tst.w 0(a1,d0.W) * ...
997 beq dsexit * done if not enabled
998*
999 tst.w P_CF(a6) * center update ?
1000 beq dsins00 * jump if not
1001*
1002 lea _ins2grp,a1 * point at ins2grp[]
1003 clr.w d0 * get instrument number
1004 move.b E_DATA2(a0),d0 * ... in d0
1005 move.w d0,-(a7) * save instrument number
1006 clr.w d1 * get group number
1007 move.b E_DATA1(a0),d1 * ... in d1
1008 move.w d1,-(a7) * save group number
1009 move.w (a7),d0 * col = group number
1010 add.w d0,d0 * ... * 5
1011 add.w d0,d0 * ...
1012 move.w (a7)+,d2 * ... (d2 = group number)
1013 add.w d2,d0 * ...
1014 add.w #7,d0 * ... + 7
1015 clr.l d1 * get instrument number
1016 move.w (a7)+,d1 * ... as a long in d1
1017 divu #10,d1 * divide by 10 for conversion
1018 add.l #$00300030,d1 * add '0' for ASCII conversion
1019 move.b d1,numstr * put MS byte in work area
1020 swap d1 * swap register halves
1021 move.b d1,numstr+1 * put LS byte in work area
1022 clr.b numstr+2 * terminate string
1023 move.w d2,-(a7) * save group number
1024 move.w #AT11,-(a7) * put attribute on stack
1025 move.l #numstr,-(a7) * put buffer address on stack
1026 move.w d0,-(a7) * put column on stack
1027 move.w #2,-(a7) * put row on stack
1028 move.l _obj8,-(a7) * put object address on stack
1029 jsr _vputs * update the screen
1030 add.l #14,a7 * clean up stack
1031*
1032 .page
1033 move.w (a7)+,d0 * get group number
1034 cmp.w #8,d0 * see which word it's in
1035 bcc dsinst1 * jump if in MS word
1036*
1037 bset d0,_vrbw08+1 * set group bit in LS byte
1038 bra dsinst2 * ...
1039*
1040dsinst1: sub.w #8,d0 * adjust for for byte
1041 bset d0,_vrbw08 * set group bit in MS byte
1042*
1043dsinst2: bset #0,_vrcw * set video reset type bit
1044 tst.w _ctrsw * update center for scupd ?
1045 beq dsexit * done if not
1046*
1047dsins00: move.l _gdfsep,d0 * quit if no elements left
1048 beq dsexit * ...
1049*
1050 movea.l d0,a1 * a1 = gdsp
1051 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
1052 move.w #60,d2 * d2 = event PRIORITY * 4
1053 movea.l P_SL(a6),a2 * a2 points at gdstb
1054 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
1055 move.w #$9999,G_NOTE(a1) * gdsp->note = COLOR
1056 move.w #3,G_CODE(a1) * gdsp->code = PATTERN
1057 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
1058 bra dsexit * done
1059*
1060 .page
1061*
1062* dsintp -- display interpolation
1063* ------ ---------------------
1064dsintp: tst.w P_CF(a6) * center update ?
1065 beq dsintp0 * jump if not
1066*
1067 move.w E_DATA1(a0),-(a7) * get interpolate value
1068 jsr _fromfpu * convert to milliseconds
1069 tst.w (a7)+ * ...
1070 andi.l #$0000FFFF,d0 * clear high bits
1071 divu #10000,d0 * convert 1st digit
1072 addi.w #$0030,d0 * ... to ASCII
1073 move.b d0,numstr * ... in numstr
1074 swap d0 * convert 2nd digit
1075 ext.l d0 * ...
1076 divu #1000,d0 * ...
1077 addi.w #$0030,d0 * ... to ASCII
1078 move.b d0,numstr+1 * ... in numstr
1079 move.b #'.',numstr+2 * insert decimal point
1080 swap d0 * convert 3rd digit
1081 ext.l d0 * ...
1082 divu #100,d0 * ...
1083 addi.w #$0030,d0 * ... to ASCII
1084 move.b d0,numstr+3 * ... in numstr
1085 clr.b numstr+4 * terminate numstr
1086 move.w #AT07,-(a7) * vputs(obj8, 1, 35, numstr, AT07)
1087 move.l #numstr,-(a7) * ...
1088 move.w #35,-(a7) * ...
1089 move.w #1,-(a7) * ...
1090 move.l _obj8,-(a7) * ...
1091 jsr _vputs * ...
1092 add.l #14,a7 * ...
1093 bset #3,_vrcw+1 * set video reset bit
1094 tst.w _ctrsw * update center for scupd ?
1095 beq dsexit * done if not
1096*
1097dsintp0: move.l _gdfsep,d0 * quit if no elements left
1098 beq dsexit * ...
1099*
1100 movea.l d0,a1 * a1 = gdsp
1101 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
1102 move.w #60,d2 * d2 = event PRIORITY * 4
1103 movea.l P_SL(a6),a2 * a2 points at gdstb
1104 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
1105 move.w #$CCCC,G_NOTE(a1) * gdsp->note = COLOR
1106 move.w #4,G_CODE(a1) * gdsp->code = PATTERN
1107 move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
1108 bra dsexit * done
1109*
1110 .page
1111*
1112* dspnch -- display punch in/out
1113* ------ --------------------
1114dspnch: tst.w P_CF(a6) * center update ?
1115 beq dspnch0 * jump if not
1116*
1117 tst.w E_DATA1(a0) * punch in ?
1118 beq dspnch1 * jump if not
1119*
1120 move.w #AT09,-(a7) * put attribute on stack
1121 move.w #50,-(a7) * put 1st col on stack
1122 move.w #1,-(a7) * put row on stack
1123 move.l _obj8,-(a7) * put object address on stack
1124 jsr _vputa * highlight 1st column
1125 move.w #51,COL(a7) * put 2nd col on stack
1126 jsr _vputa * highlight 2nd col
1127 add.l #10,a7 * clean up stack
1128 bset #5,_vrcw+1 * set video reset bit
1129 bra dspnch2 * go do maker update
1130*
1131dspnch1: move.w #AT09,-(a7) * put attribute on stack
1132 move.w #53,-(a7) * put 1st col on stack
1133 move.w #1,-(a7) * put row on stack
1134 move.l _obj8,-(a7) * put object address on stack
1135 jsr _vputa * highlight 1st column
1136 move.w #54,COL(a7) * put 2nd col on stack
1137 jsr _vputa * highlight 2nd column
1138 move.w #55,COL(a7) * put 3rd col on stack
1139 jsr _vputa * highlight 3rd column
1140 add.l #10,a7 * clean up stack
1141 bset #6,_vrcw+1 * set video reset bit
1142*
1143dspnch2: jsr _dsgmodz * display updated modes
1144 tst.w _ctrsw * update center for scupd ?
1145 beq dsexit * done if not
1146*
1147dspnch0: move.l _gdfsep,d0 * quit if no elements left
1148 beq dsexit * ...
1149*
1150 movea.l d0,a1 * a1 = gdsp
1151 move.l G_NEXT(a1),_gdfsep * gdfsep = gdsp->next
1152 move.w #60,d2 * d2 = event PRIORITY * 4
1153 movea.l P_SL(a6),a2 * a2 points at gdstb
1154 move.l 0(a2,d2.W),G_NEXT(a1) * gdsp->next = gdstb[pri]
1155 move.w #$CCCC,G_NOTE(a1) * gdsp->note = COLOR
1156 tst.w E_DATA1(a0) * see which kind we have
1157 bne dspnchi * jump if 'punch in'
1158*
1159 move.w #6,G_CODE(a1) * gdsp->code = 'out' PATTERN
1160 bra dspnchx
1161*
1162dspnchi: move.w #5,G_CODE(a1) * gdsp->code = 'in' PATTERN
1163*
1164dspnchx: move.l a1,0(a2,d2.W) * gdstb[pri] = gdsp
1165 bra dsexit * done
1166*
1167 .page
1168*
1169* dsbar -- display a bar marker
1170* ----- --------------------
1171dsbar: tst.w P_CF(a6) * center update ?
1172 beq dsbar0 * jump if not
1173*
1174 tst.w _ctrsw * update center for scupd ?
1175 beq dsexit * done if not
1176*
1177dsbar0: movea.l P_SL(a6),a2 * a2 points at gdstb
1178 move.l #-1,BARFLAG(a2) * set the bar marker flag
1179 bra dsexit * done
1180*
1181 .page
1182*
1183* ==============================================================================
1184 .data
1185* ==============================================================================
1186*
1187* sddtab -- score display dispatch table -- MUST match score.h definitions
1188* ------ ---------------------------- ------------------------------
1189sddtab: dc.l dsexit * 0 null
1190 dc.l dsexit * 1 score begin
1191 dc.l dssbgn * 2 section begin
1192 dc.l dssend * 3 section end
1193 dc.l dsinst * 4 instrument change
1194 dc.l dsnbx * 5 note begin
1195 dc.l dsnex * 6 note end
1196 dc.l dsstop * 7 stop
1197 dc.l dsintp * 8 interpolate
1198 dc.l dstmpo * 9 tempo
1199 dc.l dstune * 10 tuning
1200 dc.l dsgrp * 11 group status
1201 dc.l dslocn * 12 location
1202 dc.l dsdyn * 13 dynamics
1203 dc.l dsanvl * 14 analog value
1204 dc.l dsanrs * 15 analog resolution
1205 dc.l dsasgn * 16 I/O assign
1206 dc.l dstrns * 17 transposition
1207 dc.l dsexit * 18 repeat
1208 dc.l dspnch * 19 punch in/out
1209 dc.l dsexit * 20 polyphonic pressure
1210 dc.l dsexit * 21 score end
1211 dc.l dsexit * 22 channel pressure
1212 dc.l dsbar * 23 bar marker
1213 dc.l dsnext * 24 next score
1214*
1215* ==============================================================================
1216 .bss
1217* ==============================================================================
1218*
1219* globals:
1220* --------
1221_ac_code: ds.b 1 * accidental code
1222*
1223* locals:
1224* -------
1225numstr: ds.b 65 * video display update work area
1226*
1227* ------------------------------------------------------------------------------
1228*
1229 .end
Note: See TracBrowser for help on using the repository browser.