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 | * ------------
|
---|
58 | P_EP .equ 8 * LONG - event pointer
|
---|
59 | P_SD .equ 12 * WORD - scroll direction
|
---|
60 | P_SL .equ 14 * LONG - slice control table pointer
|
---|
61 | P_CF .equ 18 * WORD - center slice flag
|
---|
62 | *
|
---|
63 | * for vputa:
|
---|
64 | * ----------
|
---|
65 | ROW .equ 4 * WORD - 'row' parameter offset
|
---|
66 | COL .equ 6 * WORD - 'col' parameter offset
|
---|
67 | ATR .equ 8 * WORD - 'atr' parameter offset
|
---|
68 | *
|
---|
69 | * Character field attributes for highlighting
|
---|
70 | * -------------------------------------------
|
---|
71 | AT01 .equ $0054
|
---|
72 | AT04 .equ $0053
|
---|
73 | AT05 .equ $0054
|
---|
74 | AT06 .equ $0053
|
---|
75 | AT07 .equ $0054
|
---|
76 | AT08 .equ $0053
|
---|
77 | AT09 .equ $0054
|
---|
78 | AT10 .equ $0053
|
---|
79 | AT11 .equ $0052
|
---|
80 | AT12 .equ $0052
|
---|
81 | *
|
---|
82 | * Special character equates
|
---|
83 | * -------------------------
|
---|
84 | SP_M1 .equ $A1 * -1
|
---|
85 | SP_P1 .equ $A0 * +1
|
---|
86 | *
|
---|
87 | .page
|
---|
88 | *
|
---|
89 | * event structure offsets
|
---|
90 | * -----------------------
|
---|
91 | * offset length
|
---|
92 | * ------ ------
|
---|
93 | E_TIME .equ 0 * LONG
|
---|
94 | E_SIZE .equ 4 * BYTE
|
---|
95 | E_TYPE .equ 5 * BYTE
|
---|
96 | E_DATA1 .equ 6 * BYTE
|
---|
97 | E_NOTE .equ 6 * BYTE
|
---|
98 | E_DATA2 .equ 7 * BYTE
|
---|
99 | E_GROUP .equ 7 * BYTE
|
---|
100 | E_BAK .equ 8 * LONG
|
---|
101 | E_FWD .equ 12 * LONG
|
---|
102 | E_DN .equ 16 * LONG
|
---|
103 | E_VEL .equ 16 * WORD
|
---|
104 | E_DATA4 .equ 18 * WORD
|
---|
105 | E_UP .equ 20 * LONG
|
---|
106 | E_LFT .equ 24 * LONG
|
---|
107 | E_RGT .equ 28 * LONG
|
---|
108 | *
|
---|
109 | N_ETYPES .equ 25 * number of event types
|
---|
110 | *
|
---|
111 | * gdsel structure definitions
|
---|
112 | * ---------------------------
|
---|
113 | G_NEXT .equ 0 * long - 'next' field (struct gdsel *)
|
---|
114 | G_NOTE .equ 4 * word - 'note' field (short)
|
---|
115 | G_CODE .equ 6 * word - 'code' field (short)
|
---|
116 | *
|
---|
117 | NATCH_B .equ 3 * uslice note code: 'begin natural'
|
---|
118 | NOTE_E .equ 6 * uslice note code: 'end note'
|
---|
119 | *
|
---|
120 | NGDSEL .equ 17 * number of event slots in gdstb
|
---|
121 | *
|
---|
122 | BARFLAG .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 | *
|
---|
141 | dsexit: unlk a6 * done -- unlink stack frames
|
---|
142 | rts * return to caller
|
---|
143 | *
|
---|
144 | seds1: 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 | * ----- -----------------------------------
|
---|
159 | dsnbx: tst.w P_SD(a7) * check direction
|
---|
160 | bne dsne * treat as end if going backward
|
---|
161 | *
|
---|
162 | * dsnb -- display note begin
|
---|
163 | * ---- ------------------
|
---|
164 | dsnb: 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 | *
|
---|
198 | dsnv0: move.b #'0',numstr * ...
|
---|
199 | *
|
---|
200 | dsnv1: 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 | *
|
---|
230 | dsnv2: bset d0,_vrbw12 * set group bit in MS byte
|
---|
231 | *
|
---|
232 | dsnv3: bset #4,_vrcw * set video reset type bit
|
---|
233 | move.w (a7)+,d2 * get new-note flag from stack
|
---|
234 | *
|
---|
235 | dsnvx: btst.l #7,d2 * check new-note flag
|
---|
236 | beq dsexit * done if not set
|
---|
237 | *
|
---|
238 | dsnb0: 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 | *
|
---|
265 | dsnb1: move.b #NATCH_B,d1 * setup for a natural note
|
---|
266 | *
|
---|
267 | dsnb2: 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 | * ----- ---------------------------------
|
---|
274 | dsnex: tst.w P_SD(a7) * check direction
|
---|
275 | bne dsnb * treat as begin if going backward
|
---|
276 | *
|
---|
277 | * dsne -- display note end
|
---|
278 | * ---- ----------------
|
---|
279 | dsne: 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 | *
|
---|
296 | dsne3: 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 | *
|
---|
310 | dsne0: movea.l d0,a1 * a1 = gdsp
|
---|
311 | *
|
---|
312 | dsne1: 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 | *
|
---|
317 | dsne2: 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 | * ------ ---------------------
|
---|
326 | dssbgn: 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 | *
|
---|
350 | dsbgn0: 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 | * ------ -------------------
|
---|
367 | dssend: 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 | *
|
---|
373 | dssend0: 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 | * ------ ------------
|
---|
388 | dsbeat: 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 | * ------ --------------
|
---|
408 | dstune: 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 | *
|
---|
425 | dstune0: 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 | * ------ ---------------------
|
---|
442 | dstrns: 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 | *
|
---|
459 | dstrns1: move.b #'+',numstr * note positive sign
|
---|
460 | *
|
---|
461 | dstrns2: 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 | *
|
---|
471 | dstrns4: move.b #SP_P1,numstr * set +1 in numstr
|
---|
472 | *
|
---|
473 | dstrns3: 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 | *
|
---|
509 | dstrns5: sub.w #8,d0 * adjust for byte
|
---|
510 | bset d0,_vrbw09 * set group bit in MS byte
|
---|
511 | *
|
---|
512 | dstrns6: bset #1,_vrcw * set video reset type bit
|
---|
513 | tst.w _ctrsw * update center for scupd ?
|
---|
514 | beq dsexit * done if not
|
---|
515 | *
|
---|
516 | dstrns0: 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 | * ----- ----------------
|
---|
533 | dsdyn: 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 | *
|
---|
572 | dsdyn1: sub.w #8,d0 * adjust for for byte
|
---|
573 | bset d0,_vrbw10 * set group bit in MS byte
|
---|
574 | *
|
---|
575 | dsdyn2: 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
|
---|
580 | dsdyn00: 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 | * ------ ----------------
|
---|
597 | dslocn: 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 | *
|
---|
636 | dslocn1: sub.w #8,d0 * adjust for for byte
|
---|
637 | bset d0,_vrbw11 * set group bit in MS byte
|
---|
638 | *
|
---|
639 | dslocn2: 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
|
---|
644 | dsloc00: 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 | * ------ -------------------------
|
---|
661 | dsanrs: 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
|
---|
704 | dsanrs0: 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 | * ------ --------------------
|
---|
721 | dsanvl: 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 | *
|
---|
756 | dsanvl1: move.b #'+',numstr * set sign = '+'
|
---|
757 | *
|
---|
758 | .page
|
---|
759 | dsanvl2: 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 | *
|
---|
788 | dsanvl0: 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 | * ------ ------------------
|
---|
805 | dsasgn: 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 | *
|
---|
831 | dsasgn0: 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 | * ------ -------------
|
---|
848 | dstmpo: 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 | *
|
---|
877 | dstmpo0: 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 | * ------ ------------
|
---|
894 | dsstop: 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 | *
|
---|
915 | dsstop0: 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 | * ------ ------------
|
---|
932 | dsnext: 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 | *
|
---|
952 | dsnext0: 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 | * ----- --------------------
|
---|
969 | dsgrp: 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 | *
|
---|
975 | dsgrp0: 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 | * ------ ------------------
|
---|
992 | dsinst: 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 | *
|
---|
1040 | dsinst1: sub.w #8,d0 * adjust for for byte
|
---|
1041 | bset d0,_vrbw08 * set group bit in MS byte
|
---|
1042 | *
|
---|
1043 | dsinst2: bset #0,_vrcw * set video reset type bit
|
---|
1044 | tst.w _ctrsw * update center for scupd ?
|
---|
1045 | beq dsexit * done if not
|
---|
1046 | *
|
---|
1047 | dsins00: 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 | * ------ ---------------------
|
---|
1064 | dsintp: 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 | *
|
---|
1097 | dsintp0: 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 | * ------ --------------------
|
---|
1114 | dspnch: 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 | *
|
---|
1131 | dspnch1: 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 | *
|
---|
1143 | dspnch2: jsr _dsgmodz * display updated modes
|
---|
1144 | tst.w _ctrsw * update center for scupd ?
|
---|
1145 | beq dsexit * done if not
|
---|
1146 | *
|
---|
1147 | dspnch0: 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 | *
|
---|
1162 | dspnchi: move.w #5,G_CODE(a1) * gdsp->code = 'in' PATTERN
|
---|
1163 | *
|
---|
1164 | dspnchx: 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 | * ----- --------------------
|
---|
1171 | dsbar: 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 | *
|
---|
1177 | dsbar0: 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 | * ------ ---------------------------- ------------------------------
|
---|
1189 | sddtab: 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 | * -------
|
---|
1225 | numstr: ds.b 65 * video display update work area
|
---|
1226 | *
|
---|
1227 | * ------------------------------------------------------------------------------
|
---|
1228 | *
|
---|
1229 | .end
|
---|