source: buchla-68k/ram/sedisp.s @ 84c0125

Last change on this file since 84c0125 was 84c0125, checked in by Thomas Lopatic <thomas@…>, 2 years ago

Fix * in comments.

  • Property mode set to 100644
File size: 37.2 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            =       8               | LONG - event pointer
59P_SD            =       12              | WORD - scroll direction
60P_SL            =       14              | LONG - slice control table pointer
61P_CF            =       18              | WORD - center slice flag
62
63| for vputa:
64| ----------
65ROW             =       4               | WORD - 'row' parameter offset
66COL             =       6               | WORD - 'col' parameter offset
67ATR             =       8               | WORD - 'atr' parameter offset
68
69| Character field attributes for highlighting
70| -------------------------------------------
71AT01            =       0x0054
72AT04            =       0x0053
73AT05            =       0x0054
74AT06            =       0x0053
75AT07            =       0x0054
76AT08            =       0x0053
77AT09            =       0x0054
78AT10            =       0x0053
79AT11            =       0x0052
80AT12            =       0x0052
81
82| Special character equates
83| -------------------------
84SP_M1           =       0xA1                    | -1
85SP_P1           =       0xA0                    | +1
86
87                .page
88
89| event structure offsets
90| -----------------------
91|                     offset             length
92|                     ------             ------
93E_TIME          =       0               | LONG
94E_SIZE          =       4               | BYTE
95E_TYPE          =       5               | BYTE
96E_DATA1         =       6               | BYTE
97E_NOTE          =       6               | BYTE
98E_DATA2         =       7               | BYTE
99E_GROUP         =       7               | BYTE
100E_BAK           =       8               | LONG
101E_FWD           =       12              | LONG
102E_DN            =       16              | LONG
103E_VEL           =       16              | WORD
104E_DATA4         =       18              | WORD
105E_UP            =       20              | LONG
106E_LFT           =       24              | LONG
107E_RGT           =       28              | LONG
108
109N_ETYPES        =       25              | number of event types
110
111| gdsel structure definitions
112| ---------------------------
113G_NEXT          =       0               | long - 'next' field   (struct gdsel *)
114G_NOTE          =       4               | word - 'note' field   (short)
115G_CODE          =       6               | word - 'code' field   (short)
116
117NATCH_B         =       3               | uslice note code:  'begin natural'
118NOTE_E          =       6               | uslice note code:  'end note'
119
120NGDSEL          =       17              | number of event slots in gdstb
121
122BARFLAG         =       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  #0x007F,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  #0x007F,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  #0x00300030,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  #0x007F,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   #0x00300030,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  #0x1111,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  #0x1111,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  #0x1111,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   #0x0030,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  #0xCCCC,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  #0x0030,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  #0x0030,d1              | ... to ASCII
481                move.b  d1,numstr+2             | ... in numstr
482                swap    d1                      | convert 3rd digit
483                addi.w  #0x0030,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  #0x9999,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   #0x0030,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  #0x9999,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   #0x0031,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  #0x9999,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  #0x000F,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  #0x000F,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  #0x000F,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  #0x0030,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  #0x9999,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  #0x000F,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  #0x000F,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  #0x000F,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   #0x0030,d0              | ...
762                move.b  d0,numstr+1             | ...
763                swap    d0                      | convert middle digit
764                ext.l   d0                      | ...
765                divu    #100,d0                 | ...
766                add.w   #0x0030,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   #0x0030,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  #0x9999,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   #0x00300030,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  #0x3333,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   #0x0030,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   #0x00300030,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  #0x3333,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  #0x3333,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  #0x3333,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  #0x9999,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   #0x00300030,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  #0x9999,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  #0x0000FFFF,d0          | clear high bits
1071                divu    #10000,d0               | convert 1st digit
1072                addi.w  #0x0030,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  #0x0030,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  #0x0030,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  #0xCCCC,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  #0xCCCC,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.