source: buchla-68k/ram/execkey.s @ 8325447

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

Removed _ prefix.

  • Property mode set to 100644
File size: 100.2 KB
Line 
1| ------------------------------------------------------------------------------
2| execkey.s -- execute key -- FPU function start subroutine
3| Version 15 -- 1988-08-29 -- D.N. Lynx Crowe
4| Hand optimized version of execkey() and fnstart() from C compiler output
5| ------------------------------------------------------------------------------
6                .text
7
8LOC_EOR         =       0
9LOC_SUB         =       1
10
11                .xdef   execkey
12
13                .xref   xgetran
14
15                .xref   rsntab
16                .xref   expbit
17                .xref   io_fpu
18                .xref   legato
19                .xref   prstab
20                .xref   ptoftab
21                .xref   timemlt
22                .xref   valents
23                .xref   vbufs
24                .xref   vce2grp
25                .xref   vce2trg
26                .xref   veltab
27                .xref   vpsms
28
29                .page
30
31| Offsets for execkey() parameters
32| --------------------------------
33TRG             =       8               | WORD -- trigger
34PCH             =       10              | WORD -- pitch
35VCE             =       12              | WORD -- voice  (0..11)
36TAG             =       14              | WORD -- I_TM_... inversion tag
37
38| Register variables
39| ------------------
40A_FP            =       A5              | LONG -- struct idfnhdr *
41A_FPU           =       A4              | LONG -- FPU base address
42A_SMP           =       A3              | LONG -- struct sment *
43
44R_FPMANT        =       D7              | WORD -- FPU time mantissa
45R_FPEXP         =       D6              | WORD -- FPU time exponent
46R_FPCTL         =       D5              | WORD -- FPU control word
47R_I             =       D4              | WORD -- loop index
48R_FPVAL         =       D3              | WORD -- FPU value
49
50| Local (stack) variables
51| -----------------------
52PT              =       -4              | LONG -- instpnt *
53VEP             =       -8              | LONG -- struct valent *
54OLDI            =       -10             | WORD -- old IPL  (sr)
55OCTYPE          =       -12             | WORD -- oscillator 1 mode / scratch
56VP              =       -14             | WORD -- voice # + function # index
57SRCNUM          =       -16             | WORD -- general source #
58SRCVAL          =       -18             | WORD -- general source value
59TSRCVAL         =       -20             | WORD -- temporary general source value
60MLTVAL          =       -22             | WORD -- general source multiplier
61TFPVAL          =       -24             | WORD -- temporary FPU value
62LTMP            =       -28             | LONG -- long temporary
63IP              =       -32             | LONG -- struct instdef *
64GROUP           =       -34             | WORD -- group number << 4
65
66| Symbolic constants
67| ------------------
68LASTLOCL        =       GROUP           | last local on the stack
69
70FPU_DI          =       0x2200          | sr value for disabling FPU interrupts
71PITCHMAX        =       21920           | maximum pitch value
72VALMAX          =       0x00007D00      | maximum FPU value
73VALMIN          =       0xFFFF8300      | minimum FPU value
74VBLEN           =       3938            | length of a voice buffer
75LSPCH           =       2               | left shift for pitch sources
76
77                .page
78
79| execkey(trg, pch, vce)
80| short trg, pch, vce;
81| {
82
83execkey:        link    A6,#LASTLOCL
84                movem.l D2-R_FPMANT/A_SMP-A_FP,-(sp)
85
86|       ip = &vbufs[vce];
87
88                move.w  VCE(A6),D0
89                asl.w   #2,D0
90                lea     vbtab,A0
91                move.l  0(A0,D0.W),IP(A6)
92
93|       vce2trg[vce] = trg;
94
95                lsr.w   #1,D0
96                lea     vce2trg,A0
97                move.w  TRG(A6),0(A0,D0.W)
98
99|       group = (vce2grp[vce] - 1) << 4;
100
101                move.w  VCE(A6),A0
102                add.l   A0,A0
103                move.l  #vce2grp,A1
104                clr.l   D0
105                move.w  0(A0,A1.l),D0
106                sub.w   #1,D0
107                asl.w   #4,D0
108                move.w  D0,GROUP(A6)
109
110                .page
111| ------------------------------------------------------------------------------
112| Start function 0 -- Frq 1
113| ------------------------------------------------------------------------------
114
115|    if (ip->idhfnc[0].idftmd & I_TM_KEY) {
116
117                move.l  IP(A6),A0
118                move.b  93(A0),D0
119                move.w  TAG(A6),D1
120                eor.w   D1,D0
121                btst    #0,D0
122                bne     FN00A
123
124                jmp     FN01
125
126|       vp = (vce << 4) + 1;
127
128FN00A:          move    VCE(A6),D0
129                asl     #4,D0
130                add.w   #1,D0
131                move    D0,VP(A6)
132
133|       fpu = io_fpu + FPU_OFNC + (vp << 4);
134
135                asl     #5,D0
136                ext.l   D0
137                move.l  D0,A_FPU
138                add.l   #io_fpu+0x4000,A_FPU
139
140|       fp = &ip->idhfnc[0];
141
142                move.l  IP(A6),A_FP
143                add.l   #86,A_FP
144
145|       pt = &ip->idhpnt[fp->idfpt1];
146
147                clr.l   D0
148                move.b  6(A_FP),D0
149                lsl.l   #2,D0
150                move.l  D0,D1
151                add.l   D0,D0
152                add.l   D1,D0
153                add.l   IP(A6),D0
154                add.l   #242,D0
155                move.l  D0,PT(A6)
156
157                .page
158
159|       srcnum = group | fp->idfsrc;
160
161                move.w  GROUP(A6),D0
162                ext.l   D0
163                clr.l   D1
164                move.b  4(A_FP),D1
165                or      D1,D0
166                move    D0,SRCNUM(A6)
167
168|       vep = &valents[srcnum];
169
170                add.l   D0,D0
171                move.l  D0,D1
172                lsl.l   #2,D0
173                add.l   D1,D0
174                add.l   #valents,D0
175                move.l  D0,VEP(A6)
176
177|       smp = vpsms[vp];
178
179                move    VP(A6),A0
180                add.l   A0,A0
181                add.l   A0,A0
182                add.l   #vpsms,A0
183                move.l  (A0),A_SMP
184
185|       if (srcnum NE smp->sm) {
186
187                clr     D0
188                move    10(A_SMP),D0
189                cmp     SRCNUM(A6),D0
190                beq     F00L113
191
192|               (smp->prv)->nxt = smp->nxt;
193
194                move.l  4(A_SMP),A0
195                move.l  (A_SMP),(A0)
196
197|               (smp->nxt)->prv = smp->prv;
198
199                move.l  (A_SMP),A0
200                move.l  4(A_SMP),4(A0)
201
202|               smp->prv = (struct sment *)vep;
203
204                move.l  VEP(A6),4(A_SMP)
205
206|               smp->nxt = vep->nxt;
207
208                move.l  VEP(A6),A0
209                move.l  (A0),(A_SMP)
210
211|               (vep->nxt)->prv = smp;
212
213                move.l  VEP(A6),A0
214                move.l  (A0),A0
215                move.l  A_SMP,4(A0)
216
217|               vep->nxt = smp;
218
219                move.l  VEP(A6),A0
220                move.l  A_SMP,(A0)
221
222|               smp->sm = srcnum;
223
224                move    SRCNUM(A6),10(A_SMP)
225
226|       }
227
228|       mltval = fp->idfmlt;
229
230F00L113:        move    2(A_FP),MLTVAL(A6)
231
232                .page
233
234|       switch (fp->idfsrc) {
235
236                move.b  4(A_FP),D0
237                ext.w   d0
238                cmp     #10,D0
239                bhi     F00L122
240
241                asl     #2,D0
242                lea     F00L123,A0
243                movea.l 0(A0,D0.W),A0
244                jmp     (A0)
245
246|       case SM_NONE:
247|               mltval = 0;
248
249F00L116:        clr     MLTVAL(A6)
250
251|               tsrcval = 0;
252
253                clr     TSRCVAL(A6)
254
255|               break;
256
257                bra     F00L114
258
259|       case SM_RAND:
260|               tsrcval = xgetran(mltval);
261
262F00L117:        move    MLTVAL(A6),(sp)
263                jsr     xgetran
264                move    D0,TSRCVAL(A6)
265
266|               break;
267
268                bra     F00L114
269
270|       case SM_PTCH:
271|               tsrcval = pch;
272
273F00L118:        move    PCH(A6),TSRCVAL(A6)
274
275|               break;
276
277                bra     F00L114
278
279                .page
280
281|       case SM_FREQ:
282|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
283
284F00L119:        move.w  PCH(A6),D0
285                asr.w   #7,D0
286                and.w   #0x00FF,D0
287                move.w  D0,A0
288                add.l   A0,A0
289                add.l   #ptoftab,A0
290                move.w  (A0),TSRCVAL(A6)
291
292|               break;
293
294                bra     F00L114
295
296|       case SM_KVEL:
297|               tsrcval = veltab[trg];
298
299F00L120:        move.w  TRG(A6),A0
300                add.l   A0,A0
301                add.l   #veltab,A0
302                move.w  (A0),TSRCVAL(A6)
303
304|               break;
305
306                bra     F00L114
307
308|       case SM_KPRS:
309|               tsrcval = prstab[trg];
310
311F00L121:        move.w  TRG(A6),A0
312                add.l   A0,A0
313                add.l   #prstab,A0
314                move.w  (A0),TSRCVAL(A6)
315
316|               break;
317
318                bra     F00L114
319
320|       default:
321|               tsrcval = vep->val;
322
323F00L122:        move.l  VEP(A6),A0
324                move.w  8(A0),TSRCVAL(A6)
325
326|       }
327
328                .page
329
330|               srcval = addpch(tsrcval, 0);
331
332F00L114:        move.w  TSRCVAL(A6),D0
333                ext.l   D0
334                asr.l   #5,D0
335|               sub.l   #500,D0
336                asl.l   #LSPCH,D0
337                cmp.l   #PITCHMAX,D0
338                ble     F00L129A
339
340                move.l  #PITCHMAX,D0
341
342F00L129A:       move    D0,SRCVAL(A6)
343
344                .page
345
346|       if (pt->ipvsrc) {
347
348F00L124:        move.l  PT(A6),A0
349                tst.b   6(A0)
350                beq     F00L136
351
352|               switch (pt->ipvsrc) {
353
354                move.l  PT(A6),A0
355                move.b  6(A0),D0
356                ext.w   D0
357                sub     #1,D0
358                cmp     #9,D0
359                bhi     F00L144
360
361                asl     #2,D0
362                lea     F00L145,A0
363                move.l  0(A0,D0.W),A0
364                jmp     (A0)
365
366|               case SM_RAND:
367|                       ltmp = xgetran(pt_>ipvmlt);
368
369F00L139:        move.l  PT(A6),A0
370                move    4(A0),(sp)
371                jsr     xgetran
372                ext.l   D0
373                move.l  D0,LTMP(A6)
374
375|                       break;
376
377                bra     F00L137
378
379|               case SM_PTCH:
380|                       ltmp = pch;
381
382F00L140:        move    PCH(A6),A0
383                move.l  A0,LTMP(A6)
384
385|                       break;
386
387                bra     F00L137
388
389                .page
390
391|               case SM_FREQ:
392|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
393
394F00L141:        move    PCH(A6),D0
395                asr     #7,D0
396                and     #255,D0
397                move    D0,A0
398                add.l   A0,A0
399                move.l  #ptoftab,A1
400                move    0(A0,A1.l),D0
401                ext.l   D0
402                move.l  D0,LTMP(A6)
403
404|                       break;
405
406                bra     F00L137
407
408|               case SM_KVEL:
409|                       ltmp = veltab[trg];
410
411F00L142:        move    TRG(A6),A0
412                add.l   A0,A0
413                move.l  #veltab,A1
414                move    0(A0,A1.l),D0
415                ext.l   D0
416                move.l  D0,LTMP(A6)
417
418|                       break;
419
420                bra     F00L137
421
422                .page
423
424|               case SM_KPRS:
425|                       ltmp = prstab[trg];
426
427F00L143:        move    TRG(A6),A0
428                add.l   A0,A0
429                move.l  #prstab,A1
430                move    0(A0,A1.l),D0
431                ext.l   D0
432                move.l  D0,LTMP(A6)
433
434|                       break;
435
436                bra     F00L137
437
438                .page
439
440|               default:
441|                       ltmp = valents[group | pt->ipvsrc].val;
442
443F00L144:        move.l  PT(A6),A0
444                clr.l   D0
445                move.b  6(A0),D0
446                or.w    GROUP(A6),D0
447                add.l   D0,D0
448                move.l  D0,D1
449                lsl.l   #2,D0
450                add.l   D1,D0
451                move.l  D0,A0
452                move.l  #valents,A1
453                clr.l   D0
454                move    8(A0,A1.l),D0
455                move.l  D0,LTMP(A6)
456
457|               }
458
459
460                .page
461
462|               ltmp = (ltmp * pt->ipvmlt) >> 15;
463
464F00L137:        move.l  PT(A6),A0
465                move.w  4(A0),D0
466                move.w  LTMP+2(A6),D1
467                muls    D1,D0
468                move.l  #15,D1
469                asr.l   D1,D0
470                move.l  D0,LTMP(A6)
471
472|               ltmp += (long)pt->ipval;
473
474                move.l  PT(A6),A0
475                move    2(A0),D0
476                ext.l   D0
477                add.l   D0,LTMP(A6)
478
479|               if (ltmp GT (long)VALMAX)
480|                       ltmp = (long)VALMAX;
481
482                cmp.l   #VALMAX,LTMP(A6)
483                ble     F00L146
484
485                move.l  #VALMAX,LTMP(A6)
486                bra     F00L147
487
488|               else if (ltmp LT (long)VALMIN)
489|                       ltmp = (long)VALMIN;
490
491F00L146:        cmp.l   #VALMIN,LTMP(A6)
492                bge     F00L147
493
494                move.l  #VALMIN,LTMP(A6)
495
496|               tfpval = (short)ltmp;
497
498F00L147:        move.w  LTMP+2(A6),TFPVAL(A6)
499                bra     F00L149
500
501|       } else {
502
503|               tfpval = pt->ipval;
504
505F00L136:        move.l  PT(A6),A0
506                move    2(A0),TFPVAL(A6)
507
508|       }
509
510                .page
511
512|       fpmant = (((long)pt->iptim & 0x0000FFF0L)
513|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
514
515F00L149:        move.l  PT(A6),A0
516                move.w  (A0),D0
517                move.w  D0,D2
518                andi.w  #0xFFF0,D0
519                move.w  timemlt,D1
520                muls    D1,D0
521                move.l  #15,D1
522                asr.l   D1,D0
523                move    D0,R_FPMANT
524
525|       fpexp = expbit[pt->iptim & 0x000F];
526
527                and     #0x000F,D2
528                move    D2,A0
529                add.l   A0,A0
530                add.l   #expbit,A0
531                move    (A0),R_FPEXP
532
533                .page
534
535|               octype = ip->idhos1c & OC_MOD;
536
537F00L152:        move.l  IP(A6),A0
538                move.b  74(A0),D0
539                and     #3,D0
540
541|               if ((octype EQ OC_FRQ) OR (octype EQ OC_PCH))
542
543                cmp     #2,D0
544                beq     F00L1001
545
546                cmp     #3,D0
547                bne     F00L153
548
549|                       fp->idfpch = ip->idhos1v;
550
551F00L1001:       move.l  IP(A6),A0
552                move    78(A0),(A_FP)
553                bra     F00L154
554
555|               else
556|                       fp->idfpch = pch + ip->idhos1v;
557
558F00L153:        move.w  PCH(A6),D0
559                ext.l   D0
560                move.w  78(A0),D1
561                ext.l   D1
562                add.l   d1,d0
563
564|               if (fp->idfpch > PITCHMAX)
565|                       fp->idfpch = PITCHMAX;
566
567                cmp.l   #PITCHMAX,d0
568                ble     F00153A
569
570                move.l  #PITCHMAX,d0
571
572F00153A:        move.w  d0,(A_FP)
573
574|               fpval = addpch(tfpval, fp->idfpch);
575
576F00L154:        move.w  TFPVAL(A6),D1
577                ext.l   D1
578                asr.l   #5,D1
579                sub.l   #500,D1
580                asl.l   #LSPCH,D1
581                move.w  (A_FP),D0
582                ext.l   D0
583                add.l   D1,D0
584                cmp.l   #PITCHMAX,D0
585                ble     F00L154A
586
587                move.l  #PITCHMAX,D0
588
589F00L154A:       move    D0,R_FPVAL
590
591                .page
592
593                move.b  5(A_FP),D0
594                ext.w   D0
595                sub.w   #1,D0
596                movea.l PT(A6),A0
597
598|       oldi = setipl(FPU_DI);
599
600                move    sr,OLDI(A6)
601                move    #FPU_DI,sr
602
603F00L168:        clr.b   10(A0)
604                add.l   #12,A0
605                dbra    D0,F00L168
606
607                .page
608
609|       fp->idftmd ^= I_NVBITS;
610
611F00L165:        eor.b   #24,7(A_FP)
612
613|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
614
615                move.b  7(A_FP),R_FPCTL
616                and     #28,R_FPCTL
617                or      #3,R_FPCTL
618
619|       fp->idfcpt = fp->idfpt1;
620
621                move.b  6(A_FP),8(A_FP)
622
623|       fp->idftmd |= I_ACTIVE;
624
625                or.b    #2,7(A_FP)
626
627|       fp->idftrf = trg;
628
629                move    TRG(A6),10(A_FP)
630
631|       |(fpu + (long)FPU_TCV1) = srcval;
632
633                move    SRCVAL(A6),0x8(A_FPU)
634
635|       ++octype;
636
637                add     #1,OCTYPE(A6)
638
639|       |(fpu + (long)FPU_TSF1) = mltval;
640
641                move    MLTVAL(A6),0xA(A_FPU)
642
643|       ++octype;
644
645                add     #1,OCTYPE(A6)
646
647|       |(fpu + (long)FPU_TMNT) = fpmant;
648
649                move    R_FPMANT,0x14(A_FPU)
650
651|       ++octype;
652
653                add     #1,OCTYPE(A6)
654
655|       |(fpu + (long)FPU_TEXP) = fpexp;
656
657                move    R_FPEXP,0x16(A_FPU)
658
659|       ++octype;
660
661                add     #1,OCTYPE(A6)
662
663                .page
664
665|       if (fp->idftmd & I_VNSUBN)
666
667                btst    #3,7(A_FP)
668                beq     F00L169
669
670|               |(fpu + (long)FPU_TNV1) = fpval;
671
672                move    R_FPVAL,0x1C(A_FPU)
673                bra     F00L170
674
675|       else
676|               |(fpu + (long)FPU_TNV0) = fpval;
677
678F00L169:        move    R_FPVAL,2(A_FPU)
679
680|       ++octype;
681
682F00L170:        add     #1,OCTYPE(A6)
683
684|       |(fpu + (long)FPU_TCTL) = fpctl;
685
686                move    R_FPCTL,(A_FPU)
687
688|       setipl(oldi);
689
690                move    OLDI(A6),sr
691|    }
692
693                .page
694| ------------------------------------------------------------------------------
695| Start function 1 -- Frq 2
696| ------------------------------------------------------------------------------
697|    if (legato) {
698
699|       legato = 0;
700|       return;
701|    }
702FN01:           tst.w   legato
703                beq     FN01AA
704
705                clr.w   legato
706                bra     FNEXIT
707
708|    if (ip->idhfnc[1].idftmd & I_TM_KEY) {
709
710FN01AA:         move.l  IP(A6),A0
711                move.b  105(A0),D0
712                move.w  TAG(A6),D1
713                eor.w   D1,D0
714                btst    #0,D0
715                bne     FN01A
716
717                jmp     FN02
718
719|       vp = (vce << 4) + 3;
720
721FN01A:          move    VCE(A6),D0
722                asl     #4,D0
723                add.w   #3,D0
724                move    D0,VP(A6)
725
726|       fpu = io_fpu + FPU_OFNC + (vp << 4);
727
728                asl     #5,D0
729                ext.l   D0
730                move.l  D0,A_FPU
731                add.l   #io_fpu+0x4000,A_FPU
732
733|       fp = &ip->idhfnc[1];
734
735                move.l  #12,A_FP
736                add.l   IP(A6),A_FP
737                add.l   #86,A_FP
738
739|       pt = &ip->idhpnt[fp->idfpt1];
740
741                clr.l   D0
742                move.b  6(A_FP),D0
743                lsl.l   #2,D0
744                move.l  D0,D1
745                add.l   D0,D0
746                add.l   D1,D0
747                add.l   IP(A6),D0
748                add.l   #242,D0
749                move.l  D0,PT(A6)
750
751                .page
752
753|       srcnum = group | fp->idfsrc;
754
755                move.w  GROUP(A6),D0
756                ext.l   D0
757                clr.l   D1
758                move.b  4(A_FP),D1
759                or      D1,D0
760                move    D0,SRCNUM(A6)
761
762|       vep = &valents[srcnum];
763
764                add.l   D0,D0
765                move.l  D0,D1
766                lsl.l   #2,D0
767                add.l   D1,D0
768                add.l   #valents,D0
769                move.l  D0,VEP(A6)
770
771|       smp = vpsms[vp];
772
773                move    VP(A6),A0
774                add.l   A0,A0
775                add.l   A0,A0
776                add.l   #vpsms,A0
777                move.l  (A0),A_SMP
778
779|       if (srcnum NE smp->sm) {
780
781                clr     D0
782                move    10(A_SMP),D0
783                cmp     SRCNUM(A6),D0
784                beq     F01L113
785
786|               (smp->prv)->nxt = smp->nxt;
787
788                move.l  4(A_SMP),A0
789                move.l  (A_SMP),(A0)
790
791|               (smp->nxt)->prv = smp->prv;
792
793                move.l  (A_SMP),A0
794                move.l  4(A_SMP),4(A0)
795
796|               smp->prv = (struct sment *)vep;
797
798                move.l  VEP(A6),4(A_SMP)
799
800|               smp->nxt = vep->nxt;
801
802                move.l  VEP(A6),A0
803                move.l  (A0),(A_SMP)
804
805|               (vep->nxt)->prv = smp;
806
807                move.l  VEP(A6),A0
808                move.l  (A0),A0
809                move.l  A_SMP,4(A0)
810
811|               vep->nxt = smp;
812
813                move.l  VEP(A6),A0
814                move.l  A_SMP,(A0)
815
816|               smp->sm = srcnum;
817
818                move    SRCNUM(A6),10(A_SMP)
819
820|       }
821
822|       mltval = fp->idfmlt;
823
824F01L113:        move    2(A_FP),MLTVAL(A6)
825
826                .page
827
828|       switch (fp->idfsrc) {
829
830                move.b  4(A_FP),D0
831                ext.w   d0
832                cmp     #10,D0
833                bhi     F01L122
834
835                asl     #2,D0
836                lea     F01L123,A0
837                movea.l 0(A0,D0.W),A0
838                jmp     (A0)
839
840|       case SM_NONE:
841|               mltval = 0;
842
843F01L116:        clr     MLTVAL(A6)
844
845|               tsrcval = 0;
846
847                clr     TSRCVAL(A6)
848
849|               break;
850
851                bra     F01L114
852
853|       case SM_RAND:
854|               tsrcval = xgetran(mltval);
855
856F01L117:        move    MLTVAL(A6),(sp)
857                jsr     xgetran
858                move    D0,TSRCVAL(A6)
859
860|               break;
861
862                bra     F01L114
863
864|       case SM_PTCH:
865|               tsrcval = pch;
866
867F01L118:        move    PCH(A6),TSRCVAL(A6)
868
869|               break;
870
871                bra     F01L114
872
873                .page
874
875|       case SM_FREQ:
876|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
877
878F01L119:        move    PCH(A6),D0
879                asr     #7,D0
880                and     #255,D0
881                move    D0,A0
882                add.l   A0,A0
883                add.l   #ptoftab,A0
884                move    (A0),TSRCVAL(A6)
885
886|               break;
887
888                bra     F01L114
889
890|       case SM_KVEL:
891|               tsrcval = veltab[trg];
892
893F01L120:        move    TRG(A6),A0
894                add.l   A0,A0
895                add.l   #veltab,A0
896                move    (A0),TSRCVAL(A6)
897
898|               break;
899
900                bra     F01L114
901
902|       case SM_KPRS:
903|               tsrcval = prstab[trg];
904
905F01L121:        move    TRG(A6),A0
906                add.l   A0,A0
907                add.l   #prstab,A0
908                move    (A0),TSRCVAL(A6)
909
910|               break;
911
912                bra     F01L114
913
914|       default:
915|               tsrcval = vep->val;
916
917F01L122:        move.l  VEP(A6),A0
918                move    8(A0),TSRCVAL(A6)
919
920|       }
921
922                .page
923
924|               srcval = addpch(tsrcval, 0);
925
926F01L114:        move.w  TSRCVAL(A6),D0
927                ext.l   D0
928                asr.l   #5,D0
929|               sub.l   #500,D0
930                asl.l   #LSPCH,D0
931                cmp.l   #PITCHMAX,D0
932                ble     F01L129A
933
934                move.l  #PITCHMAX,D0
935
936F01L129A:       move    D0,SRCVAL(A6)
937
938                .page
939
940|       if (pt->ipvsrc) {
941
942F01L124:        move.l  PT(A6),A0
943                tst.b   6(A0)
944                beq     F01L136
945
946|               switch (pt->ipvsrc) {
947
948                move.l  PT(A6),A0
949                move.b  6(A0),D0
950                ext.w   D0
951                sub     #1,D0
952                cmp     #9,D0
953                bhi     F01L144
954
955                asl     #2,D0
956                lea     F01L145,A0
957                move.l  0(A0,D0.W),A0
958                jmp     (A0)
959
960|               case SM_RAND:
961|                       ltmp = xgetran(pt_>ipvmlt);
962
963F01L139:        move.l  PT(A6),A0
964                move    4(A0),(sp)
965                jsr     xgetran
966                ext.l   D0
967                move.l  D0,LTMP(A6)
968
969|                       break;
970
971                bra     F01L137
972
973|               case SM_PTCH:
974|                       ltmp = pch;
975
976F01L140:        move    PCH(A6),A0
977                move.l  A0,LTMP(A6)
978
979|                       break;
980
981                bra     F01L137
982
983                .page
984
985|               case SM_FREQ:
986|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
987
988F01L141:        move    PCH(A6),D0
989                asr     #7,D0
990                and     #255,D0
991                move    D0,A0
992                add.l   A0,A0
993                move.l  #ptoftab,A1
994                move    0(A0,A1.l),D0
995                ext.l   D0
996                move.l  D0,LTMP(A6)
997
998|                       break;
999
1000                bra     F01L137
1001
1002|               case SM_KVEL:
1003|                       ltmp = veltab[trg];
1004
1005F01L142:        move    TRG(A6),A0
1006                add.l   A0,A0
1007                move.l  #veltab,A1
1008                move    0(A0,A1.l),D0
1009                ext.l   D0
1010                move.l  D0,LTMP(A6)
1011
1012|                       break;
1013
1014                bra     F01L137
1015
1016                .page
1017
1018|               case SM_KPRS:
1019|                       ltmp = prstab[trg];
1020
1021F01L143:        move    TRG(A6),A0
1022                add.l   A0,A0
1023                move.l  #prstab,A1
1024                move    0(A0,A1.l),D0
1025                ext.l   D0
1026                move.l  D0,LTMP(A6)
1027
1028|                       break;
1029
1030                bra     F01L137
1031
1032                .page
1033
1034|               default:
1035|                       ltmp = valents[group | pt->ipvsrc].val;
1036
1037F01L144:        move.l  PT(A6),A0
1038                clr.l   D0
1039                move.b  6(A0),D0
1040                or.w    GROUP(A6),D0
1041                add.l   D0,D0
1042                move.l  D0,D1
1043                lsl.l   #2,D0
1044                add.l   D1,D0
1045                move.l  D0,A0
1046                move.l  #valents,A1
1047                clr.l   D0
1048                move    8(A0,A1.l),D0
1049                move.l  D0,LTMP(A6)
1050
1051|               }
1052
1053
1054                .page
1055
1056|               ltmp = (ltmp * pt->ipvmlt) >> 15;
1057
1058F01L137:        move.l  PT(A6),A0
1059                move.w  4(A0),D0
1060                move.w  LTMP+2(A6),D1
1061                muls    D1,D0
1062                move.l  #15,D1
1063                asr.l   D1,D0
1064                move.l  D0,LTMP(A6)
1065
1066|               ltmp += (long)pt->ipval;
1067
1068                move.l  PT(A6),A0
1069                move    2(A0),D0
1070                ext.l   D0
1071                add.l   D0,LTMP(A6)
1072
1073|               if (ltmp GT (long)VALMAX)
1074|                       ltmp = (long)VALMAX;
1075
1076                cmp.l   #VALMAX,LTMP(A6)
1077                ble     F01L146
1078
1079                move.l  #VALMAX,LTMP(A6)
1080                bra     F01L147
1081
1082|               else if (ltmp LT (long)VALMIN)
1083|                       ltmp = (long)VALMIN;
1084
1085F01L146:        cmp.l   #VALMIN,LTMP(A6)
1086                bge     F01L147
1087
1088                move.l  #VALMIN,LTMP(A6)
1089
1090|               tfpval = (short)ltmp;
1091
1092F01L147:        move.w  LTMP+2(A6),TFPVAL(A6)
1093                bra     F01L149
1094
1095|       } else {
1096
1097|               tfpval = pt->ipval;
1098
1099F01L136:        move.l  PT(A6),A0
1100                move    2(A0),TFPVAL(A6)
1101
1102|       }
1103
1104                .page
1105
1106|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
1107|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
1108
1109F01L149:        move.l  PT(A6),A0
1110                move.w  (A0),D0
1111                move.w  D0,D2
1112                andi.w  #0xFFF0,D0
1113                move.w  timemlt,D1
1114                muls    D1,D0
1115                move.l  #15,D1
1116                asr.l   D1,D0
1117                move    D0,R_FPMANT
1118
1119|       fpexp = expbit[pt->iptim & 0x000F];
1120
1121                and     #0x000F,D2
1122                move    D2,A0
1123                add.l   A0,A0
1124                add.l   #expbit,A0
1125                move    (A0),R_FPEXP
1126
1127                .page
1128
1129|               fp->idfpch = ip->idhos2v;
1130
1131F01L155:        move.l  IP(A6),A0
1132                move.w  80(A0),(A_FP)
1133
1134|               fpval = addpch(tfpval, fp_>idfpch);
1135
1136                move.w  TFPVAL(A6),D1
1137                ext.l   D1
1138                asr.l   #5,D1
1139                sub.l   #500,D1
1140                asl.l   #LSPCH,D1
1141                move.w  (A_FP),D0
1142                ext.l   D0
1143                add.l   D1,D0
1144                cmp.l   #PITCHMAX,D0
1145                ble     F01L155A
1146
1147                move.l  #PITCHMAX,D0
1148
1149F01L155A:       move    D0,R_FPVAL
1150
1151                .page
1152
1153                move.b  5(A_FP),D0
1154                ext.w   D0
1155                sub.w   #1,D0
1156                movea.l PT(A6),A0
1157
1158|       oldi = setipl(FPU_DI);
1159
1160                move    sr,OLDI(A6)
1161                move    #FPU_DI,sr
1162
1163F01L168:        clr.b   10(A0)
1164                add.l   #12,a0
1165                dbra    D0,F01L168
1166
1167                .page
1168
1169|       fp->idftmd ^= I_NVBITS;
1170
1171F01L165:        eor.b   #24,7(A_FP)
1172
1173|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
1174
1175                move.b  7(A_FP),R_FPCTL
1176                and     #28,R_FPCTL
1177                or      #3,R_FPCTL
1178
1179|       fp->idfcpt = fp->idfpt1;
1180
1181                move.b  6(A_FP),8(A_FP)
1182
1183|       fp->idftmd |= I_ACTIVE;
1184
1185                or.b    #2,7(A_FP)
1186
1187|       fp->idftrf = trg;
1188
1189                move    TRG(A6),10(A_FP)
1190
1191|       |(fpu + (long)FPU_TCV1) = srcval;
1192
1193                move    SRCVAL(A6),0x8(A_FPU)
1194
1195|       ++octype;
1196
1197                add     #1,OCTYPE(A6)
1198
1199|       |(fpu + (long)FPU_TSF1) = mltval;
1200
1201                move    MLTVAL(A6),0xA(A_FPU)
1202
1203|       ++octype;
1204
1205                add     #1,OCTYPE(A6)
1206
1207|       |(fpu + (long)FPU_TMNT) = fpmant;
1208
1209                move    R_FPMANT,0x14(A_FPU)
1210
1211|       ++octype;
1212
1213                add     #1,OCTYPE(A6)
1214
1215|       |(fpu + (long)FPU_TEXP) = fpexp;
1216
1217                move    R_FPEXP,0x16(A_FPU)
1218
1219|       ++octype;
1220
1221                add     #1,OCTYPE(A6)
1222
1223                .page
1224
1225|       if (fp->idftmd & I_VNSUBN)
1226
1227                btst    #3,7(A_FP)
1228                beq     F01L169
1229
1230|               |(fpu + (long)FPU_TNV1) = fpval;
1231
1232                move    R_FPVAL,0x1C(A_FPU)
1233                bra     F01L170
1234
1235|       else
1236|               |(fpu + (long)FPU_TNV0) = fpval;
1237
1238F01L169:        move    R_FPVAL,2(A_FPU)
1239
1240|       ++octype;
1241
1242F01L170:        add     #1,OCTYPE(A6)
1243
1244|       |(fpu + (long)FPU_TCTL) = fpctl;
1245
1246                move    R_FPCTL,(A_FPU)
1247
1248|       setipl(oldi);
1249
1250                move    OLDI(A6),sr
1251
1252                .page
1253| ------------------------------------------------------------------------------
1254| Start function 2 -- Frq 3
1255| ------------------------------------------------------------------------------
1256
1257|    if (ip->idhfnc[2].idftmd & I_TM_KEY) {
1258
1259FN02:           move.l  IP(A6),A0
1260                move.b  117(A0),D0
1261                move.w  TAG(A6),D1
1262                eor.w   D1,D0
1263                btst    #0,D0
1264                bne     FN02A
1265
1266                jmp     FN03
1267
1268|       vp = (vce << 4) + 5;
1269
1270FN02A:          move    VCE(A6),D0
1271                asl     #4,D0
1272                add.w   #5,D0
1273                move    D0,VP(A6)
1274
1275|       fpu = io_fpu + FPU_OFNC + (vp << 4);
1276
1277                asl     #5,D0
1278                ext.l   D0
1279                move.l  D0,A_FPU
1280                add.l   #io_fpu+0x4000,A_FPU
1281
1282|       fp = &ip->idhfnc[2];
1283
1284                move.l  #24,A_FP
1285                add.l   IP(A6),A_FP
1286                add.l   #86,A_FP
1287
1288|       pt = &ip->idhpnt[fp->idfpt1];
1289
1290                clr.l   D0
1291                move.b  6(A_FP),D0
1292                lsl.l   #2,D0
1293                move.l  D0,D1
1294                add.l   D0,D0
1295                add.l   D1,D0
1296                add.l   IP(A6),D0
1297                add.l   #242,D0
1298                move.l  D0,PT(A6)
1299
1300                .page
1301
1302|       srcnum = group | fp->idfsrc;
1303
1304                move.w  GROUP(A6),D0
1305                ext.l   D0
1306                clr.l   D1
1307                move.b  4(A_FP),D1
1308                or      D1,D0
1309                move    D0,SRCNUM(A6)
1310
1311|       vep = &valents[srcnum];
1312
1313                add.l   D0,D0
1314                move.l  D0,D1
1315                lsl.l   #2,D0
1316                add.l   D1,D0
1317                add.l   #valents,D0
1318                move.l  D0,VEP(A6)
1319
1320|       smp = vpsms[vp];
1321
1322                move    VP(A6),A0
1323                add.l   A0,A0
1324                add.l   A0,A0
1325                add.l   #vpsms,A0
1326                move.l  (A0),A_SMP
1327
1328|       if (srcnum NE smp->sm) {
1329
1330                clr     D0
1331                move    10(A_SMP),D0
1332                cmp     SRCNUM(A6),D0
1333                beq     F02L113
1334
1335|               (smp->prv)->nxt = smp->nxt;
1336
1337                move.l  4(A_SMP),A0
1338                move.l  (A_SMP),(A0)
1339
1340|               (smp->nxt)->prv = smp->prv;
1341
1342                move.l  (A_SMP),A0
1343                move.l  4(A_SMP),4(A0)
1344
1345|               smp->prv = (struct sment *)vep;
1346
1347                move.l  VEP(A6),4(A_SMP)
1348
1349|               smp->nxt = vep->nxt;
1350
1351                move.l  VEP(A6),A0
1352                move.l  (A0),(A_SMP)
1353
1354|               (vep->nxt)->prv = smp;
1355
1356                move.l  VEP(A6),A0
1357                move.l  (A0),A0
1358                move.l  A_SMP,4(A0)
1359
1360|               vep->nxt = smp;
1361
1362                move.l  VEP(A6),A0
1363                move.l  A_SMP,(A0)
1364
1365|               smp->sm = srcnum;
1366
1367                move    SRCNUM(A6),10(A_SMP)
1368
1369|       }
1370
1371|       mltval = fp->idfmlt;
1372
1373F02L113:        move    2(A_FP),MLTVAL(A6)
1374
1375                .page
1376
1377|       switch (fp->idfsrc) {
1378
1379                move.b  4(A_FP),D0
1380                ext.w   d0
1381                cmp     #10,D0
1382                bhi     F02L122
1383
1384                asl     #2,D0
1385                lea     F02L123,A0
1386                movea.l 0(A0,D0.W),A0
1387                jmp     (A0)
1388
1389|       case SM_NONE:
1390|               mltval = 0;
1391
1392F02L116:        clr     MLTVAL(A6)
1393
1394|               tsrcval = 0;
1395
1396                clr     TSRCVAL(A6)
1397
1398|               break;
1399
1400                bra     F02L114
1401
1402|       case SM_RAND:
1403|               tsrcval = xgetran(mltval);
1404
1405F02L117:        move    MLTVAL(A6),(sp)
1406                jsr     xgetran
1407                move    D0,TSRCVAL(A6)
1408
1409|               break;
1410
1411                bra     F02L114
1412
1413|       case SM_PTCH:
1414|               tsrcval = pch;
1415
1416F02L118:        move    PCH(A6),TSRCVAL(A6)
1417
1418|               break;
1419
1420                bra     F02L114
1421
1422                .page
1423
1424|       case SM_FREQ:
1425|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
1426
1427F02L119:        move    PCH(A6),D0
1428                asr     #7,D0
1429                and     #255,D0
1430                move    D0,A0
1431                add.l   A0,A0
1432                add.l   #ptoftab,A0
1433                move    (A0),TSRCVAL(A6)
1434
1435|               break;
1436
1437                bra     F02L114
1438
1439|       case SM_KVEL:
1440|               tsrcval = veltab[trg];
1441
1442F02L120:        move    TRG(A6),A0
1443                add.l   A0,A0
1444                add.l   #veltab,A0
1445                move    (A0),TSRCVAL(A6)
1446
1447|               break;
1448
1449                bra     F02L114
1450
1451|       case SM_KPRS:
1452|               tsrcval = prstab[trg];
1453
1454F02L121:        move    TRG(A6),A0
1455                add.l   A0,A0
1456                add.l   #prstab,A0
1457                move    (A0),TSRCVAL(A6)
1458
1459|               break;
1460
1461                bra     F02L114
1462
1463|       default:
1464|               tsrcval = vep->val;
1465
1466F02L122:        move.l  VEP(A6),A0
1467                move    8(A0),TSRCVAL(A6)
1468
1469|       }
1470
1471                .page
1472
1473|               srcval = addpch(tsrcval, 0);
1474
1475F02L114:        move.w  TSRCVAL(A6),D0
1476                ext.l   D0
1477                asr.l   #5,D0
1478|               sub.l   #500,D0
1479                asl.l   #LSPCH,D0
1480                cmp.l   #PITCHMAX,D0
1481                ble     F02L129A
1482
1483                move.l  #PITCHMAX,D0
1484
1485F02L129A:       move    D0,SRCVAL(A6)
1486
1487                .page
1488
1489|       if (pt->ipvsrc) {
1490
1491F02L124:        move.l  PT(A6),A0
1492                tst.b   6(A0)
1493                beq     F02L136
1494
1495|               switch (pt->ipvsrc) {
1496
1497                move.l  PT(A6),A0
1498                move.b  6(A0),D0
1499                ext.w   D0
1500                sub     #1,D0
1501                cmp     #9,D0
1502                bhi     F02L144
1503
1504                asl     #2,D0
1505                lea     F02L145,A0
1506                move.l  0(A0,D0.W),A0
1507                jmp     (A0)
1508
1509|               case SM_RAND:
1510|                       ltmp = xgetran(pt_>ipvmlt);
1511
1512F02L139:        move.l  PT(A6),A0
1513                move    4(A0),(sp)
1514                jsr     xgetran
1515                ext.l   D0
1516                move.l  D0,LTMP(A6)
1517
1518|                       break;
1519
1520                bra     F02L137
1521
1522|               case SM_PTCH:
1523|                       ltmp = pch;
1524
1525F02L140:        move    PCH(A6),A0
1526                move.l  A0,LTMP(A6)
1527
1528|                       break;
1529
1530                bra     F02L137
1531
1532                .page
1533
1534|               case SM_FREQ:
1535|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
1536
1537F02L141:        move    PCH(A6),D0
1538                asr     #7,D0
1539                and     #255,D0
1540                move    D0,A0
1541                add.l   A0,A0
1542                move.l  #ptoftab,A1
1543                move    0(A0,A1.l),D0
1544                ext.l   D0
1545                move.l  D0,LTMP(A6)
1546
1547|                       break;
1548
1549                bra     F02L137
1550
1551|               case SM_KVEL:
1552|                       ltmp = veltab[trg];
1553
1554F02L142:        move    TRG(A6),A0
1555                add.l   A0,A0
1556                move.l  #veltab,A1
1557                move    0(A0,A1.l),D0
1558                ext.l   D0
1559                move.l  D0,LTMP(A6)
1560
1561|                       break;
1562
1563                bra     F02L137
1564
1565                .page
1566
1567|               case SM_KPRS:
1568|                       ltmp = prstab[trg];
1569
1570F02L143:        move    TRG(A6),A0
1571                add.l   A0,A0
1572                move.l  #prstab,A1
1573                move    0(A0,A1.l),D0
1574                ext.l   D0
1575                move.l  D0,LTMP(A6)
1576
1577|                       break;
1578
1579                bra     F02L137
1580
1581                .page
1582
1583|               default:
1584|                       ltmp = valents[group | pt->ipvsrc].val;
1585
1586F02L144:        move.l  PT(A6),A0
1587                clr.l   D0
1588                move.b  6(A0),D0
1589                or.w    GROUP(A6),D0
1590                add.l   D0,D0
1591                move.l  D0,D1
1592                lsl.l   #2,D0
1593                add.l   D1,D0
1594                move.l  D0,A0
1595                move.l  #valents,A1
1596                clr.l   D0
1597                move    8(A0,A1.l),D0
1598                move.l  D0,LTMP(A6)
1599
1600|               }
1601
1602
1603                .page
1604
1605|               ltmp = (ltmp * pt->ipvmlt) >> 15;
1606
1607F02L137:        move.l  PT(A6),A0
1608                move.w  4(A0),D0
1609                move.w  LTMP+2(A6),D1
1610                muls    D1,D0
1611                move.l  #15,D1
1612                asr.l   D1,D0
1613                move.l  D0,LTMP(A6)
1614
1615|               ltmp += (long)pt->ipval;
1616
1617                move.l  PT(A6),A0
1618                move    2(A0),D0
1619                ext.l   D0
1620                add.l   D0,LTMP(A6)
1621
1622|               if (ltmp GT (long)VALMAX)
1623|                       ltmp = (long)VALMAX;
1624
1625                cmp.l   #VALMAX,LTMP(A6)
1626                ble     F02L146
1627
1628                move.l  #VALMAX,LTMP(A6)
1629                bra     F02L147
1630
1631|               else if (ltmp LT (long)VALMIN)
1632|                       ltmp = (long)VALMIN;
1633
1634F02L146:        cmp.l   #VALMIN,LTMP(A6)
1635                bge     F02L147
1636
1637                move.l  #VALMIN,LTMP(A6)
1638
1639|               tfpval = (short)ltmp;
1640
1641F02L147:        move.w  LTMP+2(A6),TFPVAL(A6)
1642                bra     F02L149
1643
1644|       } else {
1645
1646|               tfpval = pt->ipval;
1647
1648F02L136:        move.l  PT(A6),A0
1649                move    2(A0),TFPVAL(A6)
1650
1651|       }
1652
1653                .page
1654
1655|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
1656|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
1657
1658F02L149:        move.l  PT(A6),A0
1659                move.w  (A0),D0
1660                move.w  D0,D2
1661                andi.w  #0xFFF0,D0
1662                move.w  timemlt,D1
1663                muls    D1,D0
1664                move.l  #15,D1
1665                asr.l   D1,D0
1666                move    D0,R_FPMANT
1667
1668|       fpexp = expbit[pt->iptim & 0x000F];
1669
1670                and     #0x000F,D2
1671                move    D2,A0
1672                add.l   A0,A0
1673                add.l   #expbit,A0
1674                move    (A0),R_FPEXP
1675
1676                .page
1677
1678|               fp->idfpch = ip->idhos3v;
1679
1680F02L156:        move.l  IP(A6),A0
1681                move.w  82(A0),(A_FP)
1682
1683|               fpval = addpch(tfpval, fp->idfpch);
1684
1685                move.w  TFPVAL(A6),D1
1686                ext.l   D1
1687                asr.l   #5,D1
1688                sub.l   #500,D1
1689                asl.l   #LSPCH,D1
1690                move.w  (A_FP),D0
1691                ext.l   D0
1692                add.l   D1,D0
1693                cmp.l   #PITCHMAX,D0
1694                ble     F02L156A
1695
1696                move.l  #PITCHMAX,D0
1697
1698F02L156A:       move    D0,R_FPVAL
1699
1700                .page
1701
1702                move.b  5(A_FP),D0
1703                ext.w   D0
1704                sub.w   #1,D0
1705                movea.l PT(A6),A0
1706
1707|       oldi = setipl(FPU_DI);
1708
1709                move    sr,OLDI(A6)
1710                move    #FPU_DI,sr
1711
1712F02L168:        clr.b   10(A0)
1713                add.l   #12,a0
1714                dbra    D0,F02L168
1715
1716                .page
1717
1718|       fp->idftmd ^= I_NVBITS;
1719
1720F02L165:        eor.b   #24,7(A_FP)
1721
1722|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
1723
1724                move.b  7(A_FP),R_FPCTL
1725                and     #28,R_FPCTL
1726                or      #3,R_FPCTL
1727
1728|       fp->idfcpt = fp->idfpt1;
1729
1730                move.b  6(A_FP),8(A_FP)
1731
1732|       fp->idftmd |= I_ACTIVE;
1733
1734                or.b    #2,7(A_FP)
1735
1736|       fp->idftrf = trg;
1737
1738                move    TRG(A6),10(A_FP)
1739
1740|       |(fpu + (long)FPU_TCV1) = srcval;
1741
1742                move    SRCVAL(A6),0x8(A_FPU)
1743
1744|       ++octype;
1745
1746                add     #1,OCTYPE(A6)
1747
1748|       |(fpu + (long)FPU_TSF1) = mltval;
1749
1750                move    MLTVAL(A6),0xA(A_FPU)
1751
1752|       ++octype;
1753
1754                add     #1,OCTYPE(A6)
1755
1756|       |(fpu + (long)FPU_TMNT) = fpmant;
1757
1758                move    R_FPMANT,0x14(A_FPU)
1759
1760|       ++octype;
1761
1762                add     #1,OCTYPE(A6)
1763
1764|       |(fpu + (long)FPU_TEXP) = fpexp;
1765
1766                move    R_FPEXP,0x16(A_FPU)
1767
1768|       ++octype;
1769
1770                add     #1,OCTYPE(A6)
1771
1772                .page
1773
1774|       if (fp->idftmd & I_VNSUBN)
1775
1776                btst    #3,7(A_FP)
1777                beq     F02L169
1778
1779|               |(fpu + (long)FPU_TNV1) = fpval;
1780
1781                move    R_FPVAL,0x1C(A_FPU)
1782                bra     F02L170
1783
1784|       else
1785|               |(fpu + (long)FPU_TNV0) = fpval;
1786
1787F02L169:        move    R_FPVAL,2(A_FPU)
1788
1789|       ++octype;
1790
1791F02L170:        add     #1,OCTYPE(A6)
1792
1793|       |(fpu + (long)FPU_TCTL) = fpctl;
1794
1795                move    R_FPCTL,(A_FPU)
1796
1797|       setipl(oldi);
1798
1799                move    OLDI(A6),sr
1800
1801                .page
1802| ------------------------------------------------------------------------------
1803| Start function 3 -- Frq 4
1804| ------------------------------------------------------------------------------
1805
1806|    if (ip->idhfnc[3].idftmd & I_TM_KEY) {
1807
1808FN03:           move.l  IP(A6),A0
1809                move.b  129(A0),D0
1810                move.w  TAG(A6),D1
1811                eor.w   D1,D0
1812                btst    #0,D0
1813                bne     FN03A
1814
1815                jmp     FN04
1816
1817|       vp = (vce << 4) + 7;
1818
1819FN03A:          move    VCE(A6),D0
1820                asl     #4,D0
1821                add.w   #7,D0
1822                move    D0,VP(A6)
1823
1824|       fpu = io_fpu + FPU_OFNC + (vp << 4);
1825
1826                asl     #5,D0
1827                ext.l   D0
1828                move.l  D0,A_FPU
1829                add.l   #io_fpu+0x4000,A_FPU
1830
1831|       fp = &ip->idhfnc[3];
1832
1833                move.l  #36,A_FP
1834                add.l   IP(A6),A_FP
1835                add.l   #86,A_FP
1836
1837|       pt = &ip->idhpnt[fp->idfpt1];
1838
1839                clr.l   D0
1840                move.b  6(A_FP),D0
1841                lsl.l   #2,D0
1842                move.l  D0,D1
1843                add.l   D0,D0
1844                add.l   D1,D0
1845                add.l   IP(A6),D0
1846                add.l   #242,D0
1847                move.l  D0,PT(A6)
1848
1849                .page
1850
1851|       srcnum = group | fp->idfsrc;
1852
1853                move.w  GROUP(A6),D0
1854                ext.l   D0
1855                clr.l   D1
1856                move.b  4(A_FP),D1
1857                or      D1,D0
1858                move    D0,SRCNUM(A6)
1859
1860|       vep = &valents[srcnum];
1861
1862                add.l   D0,D0
1863                move.l  D0,D1
1864                lsl.l   #2,D0
1865                add.l   D1,D0
1866                add.l   #valents,D0
1867                move.l  D0,VEP(A6)
1868
1869|       smp = vpsms[vp];
1870
1871                move    VP(A6),A0
1872                add.l   A0,A0
1873                add.l   A0,A0
1874                add.l   #vpsms,A0
1875                move.l  (A0),A_SMP
1876
1877|       if (srcnum NE smp->sm) {
1878
1879                clr     D0
1880                move    10(A_SMP),D0
1881                cmp     SRCNUM(A6),D0
1882                beq     F03L113
1883
1884|               (smp->prv)->nxt = smp->nxt;
1885
1886                move.l  4(A_SMP),A0
1887                move.l  (A_SMP),(A0)
1888
1889|               (smp->nxt)->prv = smp->prv;
1890
1891                move.l  (A_SMP),A0
1892                move.l  4(A_SMP),4(A0)
1893
1894|               smp->prv = (struct sment *)vep;
1895
1896                move.l  VEP(A6),4(A_SMP)
1897
1898|               smp->nxt = vep->nxt;
1899
1900                move.l  VEP(A6),A0
1901                move.l  (A0),(A_SMP)
1902
1903|               (vep->nxt)->prv = smp;
1904
1905                move.l  VEP(A6),A0
1906                move.l  (A0),A0
1907                move.l  A_SMP,4(A0)
1908
1909|               vep->nxt = smp;
1910
1911                move.l  VEP(A6),A0
1912                move.l  A_SMP,(A0)
1913
1914|               smp->sm = srcnum;
1915
1916                move    SRCNUM(A6),10(A_SMP)
1917
1918|       }
1919
1920|       mltval = fp->idfmlt;
1921
1922F03L113:        move    2(A_FP),MLTVAL(A6)
1923
1924                .page
1925
1926|       switch (fp->idfsrc) {
1927
1928                move.b  4(A_FP),D0
1929                ext.w   d0
1930                cmp     #10,D0
1931                bhi     F03L122
1932
1933                asl     #2,D0
1934                lea     F03L123,A0
1935                movea.l 0(A0,D0.W),A0
1936                jmp     (A0)
1937
1938|       case SM_NONE:
1939|               mltval = 0;
1940
1941F03L116:        clr     MLTVAL(A6)
1942
1943|               tsrcval = 0;
1944
1945                clr     TSRCVAL(A6)
1946
1947|               break;
1948
1949                bra     F03L114
1950
1951|       case SM_RAND:
1952|               tsrcval = xgetran(mltval);
1953
1954F03L117:        move    MLTVAL(A6),(sp)
1955                jsr     xgetran
1956                move    D0,TSRCVAL(A6)
1957
1958|               break;
1959
1960                bra     F03L114
1961
1962|       case SM_PTCH:
1963|               tsrcval = pch;
1964
1965F03L118:        move    PCH(A6),TSRCVAL(A6)
1966
1967|               break;
1968
1969                bra     F03L114
1970
1971                .page
1972
1973|       case SM_FREQ:
1974|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
1975
1976F03L119:        move    PCH(A6),D0
1977                asr     #7,D0
1978                and     #255,D0
1979                move    D0,A0
1980                add.l   A0,A0
1981                add.l   #ptoftab,A0
1982                move    (A0),TSRCVAL(A6)
1983
1984|               break;
1985
1986                bra     F03L114
1987
1988|       case SM_KVEL:
1989|               tsrcval = veltab[trg];
1990
1991F03L120:        move    TRG(A6),A0
1992                add.l   A0,A0
1993                add.l   #veltab,A0
1994                move    (A0),TSRCVAL(A6)
1995
1996|               break;
1997
1998                bra     F03L114
1999
2000|       case SM_KPRS:
2001|               tsrcval = prstab[trg];
2002
2003F03L121:        move    TRG(A6),A0
2004                add.l   A0,A0
2005                add.l   #prstab,A0
2006                move    (A0),TSRCVAL(A6)
2007
2008|               break;
2009
2010                bra     F03L114
2011
2012|       default:
2013|               tsrcval = vep->val;
2014
2015F03L122:        move.l  VEP(A6),A0
2016                move    8(A0),TSRCVAL(A6)
2017
2018|       }
2019
2020                .page
2021
2022|               srcval = addpch(tsrcval, 0);
2023
2024F03L114:        move.w  TSRCVAL(A6),D0
2025                ext.l   D0
2026                asr.l   #5,D0
2027|               sub.l   #500,D0
2028                asl.l   #LSPCH,D0
2029                cmp.l   #PITCHMAX,D0
2030                ble     F03L129A
2031
2032                move.l  #PITCHMAX,D0
2033
2034F03L129A:       move    D0,SRCVAL(A6)
2035
2036                .page
2037
2038|       if (pt->ipvsrc) {
2039
2040F03L124:        move.l  PT(A6),A0
2041                tst.b   6(A0)
2042                beq     F03L136
2043
2044|               switch (pt->ipvsrc) {
2045
2046                move.l  PT(A6),A0
2047                move.b  6(A0),D0
2048                ext.w   D0
2049                sub     #1,D0
2050                cmp     #9,D0
2051                bhi     F03L144
2052
2053                asl     #2,D0
2054                lea     F03L145,A0
2055                move.l  0(A0,D0.W),A0
2056                jmp     (A0)
2057
2058|               case SM_RAND:
2059|                       ltmp = xgetran(pt_>ipvmlt);
2060
2061F03L139:        move.l  PT(A6),A0
2062                move    4(A0),(sp)
2063                jsr     xgetran
2064                ext.l   D0
2065                move.l  D0,LTMP(A6)
2066
2067|                       break;
2068
2069                bra     F03L137
2070
2071|               case SM_PTCH:
2072|                       ltmp = pch;
2073
2074F03L140:        move    PCH(A6),A0
2075                move.l  A0,LTMP(A6)
2076
2077|                       break;
2078
2079                bra     F03L137
2080
2081                .page
2082
2083|               case SM_FREQ:
2084|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
2085
2086F03L141:        move    PCH(A6),D0
2087                asr     #7,D0
2088                and     #255,D0
2089                move    D0,A0
2090                add.l   A0,A0
2091                move.l  #ptoftab,A1
2092                move    0(A0,A1.l),D0
2093                ext.l   D0
2094                move.l  D0,LTMP(A6)
2095
2096|                       break;
2097
2098                bra     F03L137
2099
2100|               case SM_KVEL:
2101|                       ltmp = veltab[trg];
2102
2103F03L142:        move    TRG(A6),A0
2104                add.l   A0,A0
2105                move.l  #veltab,A1
2106                move    0(A0,A1.l),D0
2107                ext.l   D0
2108                move.l  D0,LTMP(A6)
2109
2110|                       break;
2111
2112                bra     F03L137
2113
2114                .page
2115
2116|               case SM_KPRS:
2117|                       ltmp = prstab[trg];
2118
2119F03L143:        move    TRG(A6),A0
2120                add.l   A0,A0
2121                move.l  #prstab,A1
2122                move    0(A0,A1.l),D0
2123                ext.l   D0
2124                move.l  D0,LTMP(A6)
2125
2126|                       break;
2127
2128                bra     F03L137
2129
2130                .page
2131
2132|               default:
2133|                       ltmp = valents[group | pt->ipvsrc].val;
2134
2135F03L144:        move.l  PT(A6),A0
2136                clr.l   D0
2137                move.b  6(A0),D0
2138                or.w    GROUP(A6),D0
2139                add.l   D0,D0
2140                move.l  D0,D1
2141                lsl.l   #2,D0
2142                add.l   D1,D0
2143                move.l  D0,A0
2144                move.l  #valents,A1
2145                clr.l   D0
2146                move    8(A0,A1.l),D0
2147                move.l  D0,LTMP(A6)
2148
2149|               }
2150
2151
2152                .page
2153
2154|               ltmp = (ltmp * pt->ipvmlt) >> 15;
2155
2156F03L137:        move.l  PT(A6),A0
2157                move.w  4(A0),D0
2158                move.w  LTMP+2(A6),D1
2159                muls    D1,D0
2160                move.l  #15,D1
2161                asr.l   D1,D0
2162                move.l  D0,LTMP(A6)
2163
2164|               ltmp += (long)pt->ipval;
2165
2166                move.l  PT(A6),A0
2167                move    2(A0),D0
2168                ext.l   D0
2169                add.l   D0,LTMP(A6)
2170
2171|               if (ltmp GT (long)VALMAX)
2172|                       ltmp = (long)VALMAX;
2173
2174                cmp.l   #VALMAX,LTMP(A6)
2175                ble     F03L146
2176
2177                move.l  #VALMAX,LTMP(A6)
2178                bra     F03L147
2179
2180|               else if (ltmp LT (long)VALMIN)
2181|                       ltmp = (long)VALMIN;
2182
2183F03L146:        cmp.l   #VALMIN,LTMP(A6)
2184                bge     F03L147
2185
2186                move.l  #VALMIN,LTMP(A6)
2187
2188|               tfpval = (short)ltmp;
2189
2190F03L147:        move.w  LTMP+2(A6),TFPVAL(A6)
2191                bra     F03L149
2192
2193|       } else {
2194
2195|               tfpval = pt->ipval;
2196
2197F03L136:        move.l  PT(A6),A0
2198                move    2(A0),TFPVAL(A6)
2199
2200|       }
2201
2202                .page
2203
2204|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
2205|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
2206
2207F03L149:        move.l  PT(A6),A0
2208                move.w  (A0),D0
2209                move.w  D0,D2
2210                andi.w  #0xFFF0,D0
2211                move.w  timemlt,D1
2212                muls    D1,D0
2213                move.l  #15,D1
2214                asr.l   D1,D0
2215                move    D0,R_FPMANT
2216
2217|       fpexp = expbit[pt->iptim & 0x000F];
2218
2219                and     #0x000F,D2
2220                move    D2,A0
2221                add.l   A0,A0
2222                add.l   #expbit,A0
2223                move    (A0),R_FPEXP
2224
2225                .page
2226
2227|               fp->idfpch = ip->idhos4v;
2228
2229F03L157:        move.l  IP(A6),A0
2230                move.w  84(A0),(A_FP)
2231
2232|               fpval = addpch(tfpval, fp->idfpch);
2233
2234                move.w  TFPVAL(A6),D1
2235                ext.l   D1
2236                asr.l   #5,D1
2237                sub.l   #500,D1
2238                asl.l   #LSPCH,D1
2239                move.w  (A_FP),D0
2240                ext.l   D0
2241                add.l   D1,D0
2242                cmp.l   #PITCHMAX,D0
2243                ble     F03L157A
2244
2245                move.l  #PITCHMAX,D0
2246
2247F03L157A:       move    D0,R_FPVAL
2248
2249                .page
2250
2251                move.b  5(A_FP),D0
2252                ext.w   D0
2253                sub.w   #1,D0
2254                movea.l PT(A6),A0
2255
2256|       oldi = setipl(FPU_DI);
2257
2258                move    sr,OLDI(A6)
2259                move    #FPU_DI,sr
2260
2261F03L168:        clr.b   10(A0)
2262                add.l   #12,a0
2263                dbra    D0,F03L168
2264
2265                .page
2266
2267|       fp->idftmd ^= I_NVBITS;
2268
2269F03L165:        eor.b   #24,7(A_FP)
2270
2271|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
2272
2273                move.b  7(A_FP),R_FPCTL
2274                and     #28,R_FPCTL
2275                or      #3,R_FPCTL
2276
2277|       fp->idfcpt = fp->idfpt1;
2278
2279                move.b  6(A_FP),8(A_FP)
2280
2281|       fp->idftmd |= I_ACTIVE;
2282
2283                or.b    #2,7(A_FP)
2284
2285|       fp->idftrf = trg;
2286
2287                move    TRG(A6),10(A_FP)
2288
2289|       |(fpu + (long)FPU_TCV1) = srcval;
2290
2291                move    SRCVAL(A6),0x8(A_FPU)
2292
2293|       ++octype;
2294
2295                add     #1,OCTYPE(A6)
2296
2297|       |(fpu + (long)FPU_TSF1) = mltval;
2298
2299                move    MLTVAL(A6),0xA(A_FPU)
2300
2301|       ++octype;
2302
2303                add     #1,OCTYPE(A6)
2304
2305|       |(fpu + (long)FPU_TMNT) = fpmant;
2306
2307                move    R_FPMANT,0x14(A_FPU)
2308
2309|       ++octype;
2310
2311                add     #1,OCTYPE(A6)
2312
2313|       |(fpu + (long)FPU_TEXP) = fpexp;
2314
2315                move    R_FPEXP,0x16(A_FPU)
2316
2317|       ++octype;
2318
2319                add     #1,OCTYPE(A6)
2320
2321                .page
2322
2323|       if (fp->idftmd & I_VNSUBN)
2324
2325                btst    #3,7(A_FP)
2326                beq     F03L169
2327
2328|               |(fpu + (long)FPU_TNV1) = fpval;
2329
2330                move    R_FPVAL,0x1C(A_FPU)
2331                bra     F03L170
2332
2333|       else
2334|               |(fpu + (long)FPU_TNV0) = fpval;
2335
2336F03L169:        move    R_FPVAL,2(A_FPU)
2337
2338|       ++octype;
2339
2340F03L170:        add     #1,OCTYPE(A6)
2341
2342|       |(fpu + (long)FPU_TCTL) = fpctl;
2343
2344                move    R_FPCTL,(A_FPU)
2345
2346|       setipl(oldi);
2347
2348                move    OLDI(A6),sr
2349
2350                .page
2351| ------------------------------------------------------------------------------
2352| Start function 4 -- Filtr
2353| ------------------------------------------------------------------------------
2354
2355|    if (ip->idhfnc[4].idftmd & I_TM_KEY) {
2356
2357FN04:           move.l  IP(A6),A0
2358                move.b  141(A0),D0
2359                move.w  TAG(A6),D1
2360                eor.w   D1,D0
2361                btst    #0,D0
2362                bne     FN04A
2363
2364                jmp     FN05
2365
2366|       vp = (vce << 4) + 10;
2367
2368FN04A:          move    VCE(A6),D0
2369                asl     #4,D0
2370                add.w   #10,D0
2371                move    D0,VP(A6)
2372
2373|       fpu = io_fpu + FPU_OFNC + (vp << 4);
2374
2375                asl     #5,D0
2376                ext.l   D0
2377                move.l  D0,A_FPU
2378                add.l   #io_fpu+0x4000,A_FPU
2379
2380|       fp = &ip->idhfnc[4];
2381
2382                move.l  #48,A_FP
2383                add.l   IP(A6),A_FP
2384                add.l   #86,A_FP
2385
2386                .page
2387
2388|       Added code:
2389
2390|               output resonance via table lookup with FPU interrupts off
2391
2392                lea     rsntab,A0
2393                clr.w   D0
2394                move.b  9(A_FP),D0
2395                add.w   D0,D0
2396                move.w  0(A0,D0.W),D1
2397                move.w  VCE(A6),D0
2398                asl.w   #4,d0
2399                add.w   #6,d0
2400                asl.w   #5,D0
2401                ext.l   D0
2402                move.l  D0,A0
2403                add.l   #io_fpu+0x4000,A0
2404                move.w  sr,OLDI(A6)
2405                move.w  #FPU_DI,sr
2406                move.w  d1,2(A0)
2407                add.w   #1,OCTYPE(A6)
2408                move.w  d1,0x1C(A0)
2409                add.w   #1,OCTYPE(A6)
2410                move.w  #0x0015,(A0)
2411                move.w  OLDI(A6),sr
2412
2413|       pt = &ip->idhpnt[fp->idfpt1];
2414
2415                clr.l   D0
2416                move.b  6(A_FP),D0
2417                lsl.l   #2,D0
2418                move.l  D0,D1
2419                add.l   D0,D0
2420                add.l   D1,D0
2421                add.l   IP(A6),D0
2422                add.l   #242,D0
2423                move.l  D0,PT(A6)
2424
2425                .page
2426
2427|       srcnum = group | fp->idfsrc;
2428
2429                move.w  GROUP(A6),D0
2430                ext.l   D0
2431                clr.l   D1
2432                move.b  4(A_FP),D1
2433                or      D1,D0
2434                move    D0,SRCNUM(A6)
2435
2436|       vep = &valents[srcnum];
2437
2438                add.l   D0,D0
2439                move.l  D0,D1
2440                lsl.l   #2,D0
2441                add.l   D1,D0
2442                add.l   #valents,D0
2443                move.l  D0,VEP(A6)
2444
2445|       smp = vpsms[vp];
2446
2447                move    VP(A6),A0
2448                add.l   A0,A0
2449                add.l   A0,A0
2450                add.l   #vpsms,A0
2451                move.l  (A0),A_SMP
2452
2453|       if (srcnum NE smp->sm) {
2454
2455                clr     D0
2456                move    10(A_SMP),D0
2457                cmp     SRCNUM(A6),D0
2458                beq     F04L113
2459
2460|               (smp->prv)->nxt = smp->nxt;
2461
2462                move.l  4(A_SMP),A0
2463                move.l  (A_SMP),(A0)
2464
2465|               (smp->nxt)->prv = smp->prv;
2466
2467                move.l  (A_SMP),A0
2468                move.l  4(A_SMP),4(A0)
2469
2470|               smp->prv = (struct sment *)vep;
2471
2472                move.l  VEP(A6),4(A_SMP)
2473
2474|               smp->nxt = vep->nxt;
2475
2476                move.l  VEP(A6),A0
2477                move.l  (A0),(A_SMP)
2478
2479|               (vep->nxt)->prv = smp;
2480
2481                move.l  VEP(A6),A0
2482                move.l  (A0),A0
2483                move.l  A_SMP,4(A0)
2484
2485|               vep->nxt = smp;
2486
2487                move.l  VEP(A6),A0
2488                move.l  A_SMP,(A0)
2489
2490|               smp->sm = srcnum;
2491
2492                move    SRCNUM(A6),10(A_SMP)
2493
2494|       }
2495
2496|       mltval = fp->idfmlt;
2497
2498F04L113:        move    2(A_FP),MLTVAL(A6)
2499
2500                .page
2501
2502|       switch (fp->idfsrc) {
2503
2504                move.b  4(A_FP),D0
2505                ext.w   d0
2506                cmp     #10,D0
2507                bhi     F04L122
2508
2509                asl     #2,D0
2510                lea     F04L123,A0
2511                movea.l 0(A0,D0.W),A0
2512                jmp     (A0)
2513
2514|       case SM_NONE:
2515|               mltval = 0;
2516
2517F04L116:        clr     MLTVAL(A6)
2518
2519|               tsrcval = 0;
2520
2521                clr     TSRCVAL(A6)
2522
2523|               break;
2524
2525                bra     F04L114
2526
2527|       case SM_RAND:
2528|               tsrcval = xgetran(mltval);
2529
2530F04L117:        move    MLTVAL(A6),(sp)
2531                jsr     xgetran
2532                move    D0,TSRCVAL(A6)
2533
2534|               break;
2535
2536                bra     F04L114
2537
2538|       case SM_PTCH:
2539|               tsrcval = pch;
2540
2541F04L118:        move    PCH(A6),TSRCVAL(A6)
2542
2543|               break;
2544
2545                bra     F04L114
2546
2547                .page
2548
2549|       case SM_FREQ:
2550|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
2551
2552F04L119:        move    PCH(A6),D0
2553                asr     #7,D0
2554                and     #255,D0
2555                move    D0,A0
2556                add.l   A0,A0
2557                add.l   #ptoftab,A0
2558                move    (A0),TSRCVAL(A6)
2559
2560|               break;
2561
2562                bra     F04L114
2563
2564|       case SM_KVEL:
2565|               tsrcval = veltab[trg];
2566
2567F04L120:        move    TRG(A6),A0
2568                add.l   A0,A0
2569                add.l   #veltab,A0
2570                move    (A0),TSRCVAL(A6)
2571
2572|               break;
2573
2574                bra     F04L114
2575
2576|       case SM_KPRS:
2577|               tsrcval = prstab[trg];
2578
2579F04L121:        move    TRG(A6),A0
2580                add.l   A0,A0
2581                add.l   #prstab,A0
2582                move    (A0),TSRCVAL(A6)
2583
2584|               break;
2585
2586                bra     F04L114
2587
2588|       default:
2589|               tsrcval = vep->val;
2590
2591F04L122:        move.l  VEP(A6),A0
2592                move    8(A0),TSRCVAL(A6)
2593
2594|       }
2595
2596                .page
2597
2598|               ltmp = ((long)tsrcval >> 1) + ((long)tsrcval >> 2);
2599
2600F04L114:        move    TSRCVAL(A6),D0
2601                ext.l   D0
2602                asr.l   #1,D0
2603                move    TSRCVAL(A6),D1
2604                ext.l   D1
2605                asr.l   #2,D1
2606                add.l   D1,D0
2607                move.l  D0,LTMP(A6)
2608
2609|               if (ltmp GT (long)VALMAX)
2610|                       ltmp = (long)VALMAX;
2611
2612                cmp.l   #VALMAX,LTMP(A6)
2613                ble     F04L131
2614
2615                move.l  #VALMAX,LTMP(A6)
2616                bra     F04L132
2617
2618|               else if (ltmp LT (long)VALMIN)
2619|                       ltmp = (long)VALMIN;
2620
2621F04L131:        cmp.l   #VALMIN,LTMP(A6)
2622                bge     F04L132
2623
2624                move.l  #VALMIN,LTMP(A6)
2625
2626|               srcval = (short)ltmp;
2627
2628F04L132:        move.l  LTMP(A6),D0
2629                move    D0,SRCVAL(A6)
2630
2631                .page
2632
2633|       if (pt->ipvsrc) {
2634
2635F04L124:        move.l  PT(A6),A0
2636                tst.b   6(A0)
2637                beq     F04L136
2638
2639|               switch (pt->ipvsrc) {
2640
2641                move.l  PT(A6),A0
2642                move.b  6(A0),D0
2643                ext.w   D0
2644                sub     #1,D0
2645                cmp     #9,D0
2646                bhi     F04L144
2647
2648                asl     #2,D0
2649                lea     F04L145,A0
2650                move.l  0(A0,D0.W),A0
2651                jmp     (A0)
2652
2653|               case SM_RAND:
2654|                       ltmp = xgetran(pt_>ipvmlt);
2655
2656F04L139:        move.l  PT(A6),A0
2657                move    4(A0),(sp)
2658                jsr     xgetran
2659                ext.l   D0
2660                move.l  D0,LTMP(A6)
2661
2662|                       break;
2663
2664                bra     F04L137
2665
2666|               case SM_PTCH:
2667|                       ltmp = pch;
2668
2669F04L140:        move    PCH(A6),A0
2670                move.l  A0,LTMP(A6)
2671
2672|                       break;
2673
2674                bra     F04L137
2675
2676                .page
2677
2678|               case SM_FREQ:
2679|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
2680
2681F04L141:        move    PCH(A6),D0
2682                asr     #7,D0
2683                and     #255,D0
2684                move    D0,A0
2685                add.l   A0,A0
2686                move.l  #ptoftab,A1
2687                move    0(A0,A1.l),D0
2688                ext.l   D0
2689                move.l  D0,LTMP(A6)
2690
2691|                       break;
2692
2693                bra     F04L137
2694
2695|               case SM_KVEL:
2696|                       ltmp = veltab[trg];
2697
2698F04L142:        move    TRG(A6),A0
2699                add.l   A0,A0
2700                move.l  #veltab,A1
2701                move    0(A0,A1.l),D0
2702                ext.l   D0
2703                move.l  D0,LTMP(A6)
2704
2705|                       break;
2706
2707                bra     F04L137
2708
2709                .page
2710
2711|               case SM_KPRS:
2712|                       ltmp = prstab[trg];
2713
2714F04L143:        move    TRG(A6),A0
2715                add.l   A0,A0
2716                move.l  #prstab,A1
2717                move    0(A0,A1.l),D0
2718                ext.l   D0
2719                move.l  D0,LTMP(A6)
2720
2721|                       break;
2722
2723                bra     F04L137
2724
2725                .page
2726
2727|               default:
2728|                       ltmp = valents[group | pt->ipvsrc].val;
2729
2730F04L144:        move.l  PT(A6),A0
2731                clr.l   D0
2732                move.b  6(A0),D0
2733                or.w    GROUP(A6),D0
2734                add.l   D0,D0
2735                move.l  D0,D1
2736                lsl.l   #2,D0
2737                add.l   D1,D0
2738                move.l  D0,A0
2739                move.l  #valents,A1
2740                clr.l   D0
2741                move    8(A0,A1.l),D0
2742                move.l  D0,LTMP(A6)
2743
2744|               }
2745
2746
2747                .page
2748
2749|               ltmp = (ltmp * pt->ipvmlt) >> 15;
2750
2751F04L137:        move.l  PT(A6),A0
2752                move.w  4(A0),D0
2753                move.w  LTMP+2(A6),D1
2754                muls    D1,D0
2755                move.l  #15,D1
2756                asr.l   D1,D0
2757                move.l  D0,LTMP(A6)
2758
2759|               ltmp += (long)pt->ipval;
2760
2761                move.l  PT(A6),A0
2762                move    2(A0),D0
2763                ext.l   D0
2764                add.l   D0,LTMP(A6)
2765
2766|               if (ltmp GT (long)VALMAX)
2767|                       ltmp = (long)VALMAX;
2768
2769                cmp.l   #VALMAX,LTMP(A6)
2770                ble     F04L146
2771
2772                move.l  #VALMAX,LTMP(A6)
2773                bra     F04L147
2774
2775|               else if (ltmp LT (long)VALMIN)
2776|                       ltmp = (long)VALMIN;
2777
2778F04L146:        cmp.l   #VALMIN,LTMP(A6)
2779                bge     F04L147
2780
2781                move.l  #VALMIN,LTMP(A6)
2782
2783|               tfpval = (short)ltmp;
2784
2785F04L147:        move.w  LTMP+2(A6),TFPVAL(A6)
2786                bra     F04L149
2787
2788|       } else {
2789
2790|               tfpval = pt->ipval;
2791
2792F04L136:        move.l  PT(A6),A0
2793                move    2(A0),TFPVAL(A6)
2794
2795|       }
2796
2797                .page
2798
2799|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
2800|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
2801
2802F04L149:        move.l  PT(A6),A0
2803                move.w  (A0),D0
2804                move.w  D0,D2
2805                andi.w  #0xFFF0,D0
2806                move.w  timemlt,D1
2807                muls    D1,D0
2808                move.l  #15,D1
2809                asr.l   D1,D0
2810                move    D0,R_FPMANT
2811
2812|       fpexp = expbit[pt->iptim & 0x000F];
2813
2814                and     #0x000F,D2
2815                move    D2,A0
2816                add.l   A0,A0
2817                add.l   #expbit,A0
2818                move    (A0),R_FPEXP
2819
2820                .page
2821
2822|               fp->idfpch = pch;
2823
2824F04L158:        move    PCH(A6),(A_FP)
2825
2826|               ltmp = ((long)tfpval >> 1) + ((longtfpval >>2)
2827|                       + (long)fp->idfpch;
2828
2829                move    TFPVAL(A6),D0
2830                ext.l   D0
2831                asr.l   #1,D0
2832                move    TFPVAL(A6),D1
2833                ext.l   D1
2834                asr.l   #2,D1
2835                add.l   D1,D0
2836                move    (A_FP),D1
2837                ext.l   D1
2838                add.l   D1,D0
2839                move.l  D0,LTMP(A6)
2840
2841|               if (ltmp GT (long)VALMAX)
2842|                       ltmp = (long)VALMAX;
2843
2844                cmp.l   #VALMAX,LTMP(A6)
2845                ble     F04L159
2846
2847                move.l  #VALMAX,LTMP(A6)
2848                bra     F04L160
2849
2850|               else if (ltmp LT (long)VALMIN)
2851|                       ltmp = (long)VALMIN;
2852
2853F04L159:        cmp.l   #VALMIN,LTMP(A6)
2854                bge     F04L160
2855
2856                move.l  #VALMIN,LTMP(A6)
2857
2858|               fpval = (short)ltmp;
2859
2860F04L160:        move.l  LTMP(A6),D0
2861                move    D0,R_FPVAL
2862
2863                .page
2864
2865                move.b  5(A_FP),D0
2866                ext.w   D0
2867                sub.w   #1,D0
2868                movea.l PT(A6),A0
2869
2870|       oldi = setipl(FPU_DI);
2871
2872                move    sr,OLDI(A6)
2873                move    #FPU_DI,sr
2874
2875F04L168:        clr.b   10(A0)
2876                add.l   #12,a0
2877                dbra    D0,F04L168
2878
2879                .page
2880
2881|       fp->idftmd ^= I_NVBITS;
2882
2883F04L165:        eor.b   #24,7(A_FP)
2884
2885|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
2886
2887                move.b  7(A_FP),R_FPCTL
2888                and     #28,R_FPCTL
2889                or      #3,R_FPCTL
2890
2891|       fp->idfcpt = fp->idfpt1;
2892
2893                move.b  6(A_FP),8(A_FP)
2894
2895|       fp->idftmd |= I_ACTIVE;
2896
2897                or.b    #2,7(A_FP)
2898
2899|       fp->idftrf = trg;
2900
2901                move    TRG(A6),10(A_FP)
2902
2903|       |(fpu + (long)FPU_TCV1) = srcval;
2904
2905                move    SRCVAL(A6),0x8(A_FPU)
2906
2907|       ++octype;
2908
2909                add     #1,OCTYPE(A6)
2910
2911|       |(fpu + (long)FPU_TSF1) = mltval;
2912
2913                move    MLTVAL(A6),0xA(A_FPU)
2914
2915|       ++octype;
2916
2917                add     #1,OCTYPE(A6)
2918
2919|       |(fpu + (long)FPU_TMNT) = fpmant;
2920
2921                move    R_FPMANT,0x14(A_FPU)
2922
2923|       ++octype;
2924
2925                add     #1,OCTYPE(A6)
2926
2927|       |(fpu + (long)FPU_TEXP) = fpexp;
2928
2929                move    R_FPEXP,0x16(A_FPU)
2930
2931|       ++octype;
2932
2933                add     #1,OCTYPE(A6)
2934
2935                .page
2936
2937|       if (fp->idftmd & I_VNSUBN)
2938
2939                btst    #3,7(A_FP)
2940                beq     F04L169
2941
2942|               |(fpu + (long)FPU_TNV1) = fpval;
2943
2944                move    R_FPVAL,0x1C(A_FPU)
2945                bra     F04L170
2946
2947|       else
2948|               |(fpu + (long)FPU_TNV0) = fpval;
2949
2950F04L169:        move    R_FPVAL,2(A_FPU)
2951
2952|       ++octype;
2953
2954F04L170:        add     #1,OCTYPE(A6)
2955
2956|       |(fpu + (long)FPU_TCTL) = fpctl;
2957
2958                move    R_FPCTL,(A_FPU)
2959
2960|       setipl(oldi);
2961
2962                move    OLDI(A6),sr
2963
2964                .page
2965| ------------------------------------------------------------------------------
2966| Start function 5 -- Loctn
2967| ------------------------------------------------------------------------------
2968
2969|    if (ip->idhfnc[5].idftmd & I_TM_KEY) {
2970
2971FN05:           move.l  IP(A6),A0
2972                move.b  153(A0),D0
2973                move.w  TAG(A6),D1
2974                eor.w   D1,D0
2975                btst    #0,D0
2976                bne     FN05A
2977
2978                jmp     FN06
2979
2980|       vp = (vce << 4) + 4;
2981
2982FN05A:          move    VCE(A6),D0
2983                asl     #4,D0
2984                add.w   #4,D0
2985                move    D0,VP(A6)
2986
2987|       fpu = io_fpu + FPU_OFNC + (vp << 4);
2988
2989                asl     #5,D0
2990                ext.l   D0
2991                move.l  D0,A_FPU
2992                add.l   #io_fpu+0x4000,A_FPU
2993
2994|       fp = &ip->idhfnc[5];
2995
2996                move.l  #60,A_FP
2997                add.l   IP(A6),A_FP
2998                add.l   #86,A_FP
2999
3000|       pt = &ip->idhpnt[fp->idfpt1];
3001
3002                clr.l   D0
3003                move.b  6(A_FP),D0
3004                lsl.l   #2,D0
3005                move.l  D0,D1
3006                add.l   D0,D0
3007                add.l   D1,D0
3008                add.l   IP(A6),D0
3009                add.l   #242,D0
3010                move.l  D0,PT(A6)
3011
3012                .page
3013
3014|       srcnum = group | fp->idfsrc;
3015
3016                move.w  GROUP(A6),D0
3017                ext.l   D0
3018                clr.l   D1
3019                move.b  4(A_FP),D1
3020                or      D1,D0
3021                move    D0,SRCNUM(A6)
3022
3023|       vep = &valents[srcnum];
3024
3025                add.l   D0,D0
3026                move.l  D0,D1
3027                lsl.l   #2,D0
3028                add.l   D1,D0
3029                add.l   #valents,D0
3030                move.l  D0,VEP(A6)
3031
3032|       smp = vpsms[vp];
3033
3034                move    VP(A6),A0
3035                add.l   A0,A0
3036                add.l   A0,A0
3037                add.l   #vpsms,A0
3038                move.l  (A0),A_SMP
3039
3040|       if (srcnum NE smp->sm) {
3041
3042                clr     D0
3043                move    10(A_SMP),D0
3044                cmp     SRCNUM(A6),D0
3045                beq     F05L113
3046
3047|               (smp->prv)->nxt = smp->nxt;
3048
3049                move.l  4(A_SMP),A0
3050                move.l  (A_SMP),(A0)
3051
3052|               (smp->nxt)->prv = smp->prv;
3053
3054                move.l  (A_SMP),A0
3055                move.l  4(A_SMP),4(A0)
3056
3057|               smp->prv = (struct sment *)vep;
3058
3059                move.l  VEP(A6),4(A_SMP)
3060
3061|               smp->nxt = vep->nxt;
3062
3063                move.l  VEP(A6),A0
3064                move.l  (A0),(A_SMP)
3065
3066|               (vep->nxt)->prv = smp;
3067
3068                move.l  VEP(A6),A0
3069                move.l  (A0),A0
3070                move.l  A_SMP,4(A0)
3071
3072|               vep->nxt = smp;
3073
3074                move.l  VEP(A6),A0
3075                move.l  A_SMP,(A0)
3076
3077|               smp->sm = srcnum;
3078
3079                move    SRCNUM(A6),10(A_SMP)
3080
3081|       }
3082
3083|       mltval = fp->idfmlt;
3084
3085F05L113:        move    2(A_FP),MLTVAL(A6)
3086
3087                .page
3088
3089|       switch (fp->idfsrc) {
3090
3091                move.b  4(A_FP),D0
3092                ext.w   d0
3093                cmp     #10,D0
3094                bhi     F05L122
3095
3096                asl     #2,D0
3097                lea     F05L123,A0
3098                movea.l 0(A0,D0.W),A0
3099                jmp     (A0)
3100
3101|       case SM_NONE:
3102|               mltval = 0;
3103
3104F05L116:        clr     MLTVAL(A6)
3105
3106|               tsrcval = 0;
3107
3108                clr     TSRCVAL(A6)
3109
3110|               break;
3111
3112                bra     F05L114
3113
3114|       case SM_RAND:
3115|               tsrcval = xgetran(mltval);
3116
3117F05L117:        move    MLTVAL(A6),(sp)
3118                jsr     xgetran
3119                move    D0,TSRCVAL(A6)
3120
3121|               break;
3122
3123                bra     F05L114
3124
3125|       case SM_PTCH:
3126|               tsrcval = pch;
3127
3128F05L118:        move    PCH(A6),TSRCVAL(A6)
3129
3130|               break;
3131
3132                bra     F05L114
3133
3134                .page
3135
3136|       case SM_FREQ:
3137|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
3138
3139F05L119:        move    PCH(A6),D0
3140                asr     #7,D0
3141                and     #255,D0
3142                move    D0,A0
3143                add.l   A0,A0
3144                add.l   #ptoftab,A0
3145                move    (A0),TSRCVAL(A6)
3146
3147|               break;
3148
3149                bra     F05L114
3150
3151|       case SM_KVEL:
3152|               tsrcval = veltab[trg];
3153
3154F05L120:        move    TRG(A6),A0
3155                add.l   A0,A0
3156                add.l   #veltab,A0
3157                move    (A0),TSRCVAL(A6)
3158
3159|               break;
3160
3161                bra     F05L114
3162
3163|       case SM_KPRS:
3164|               tsrcval = prstab[trg];
3165
3166F05L121:        move    TRG(A6),A0
3167                add.l   A0,A0
3168                add.l   #prstab,A0
3169                move    (A0),TSRCVAL(A6)
3170
3171|               break;
3172
3173                bra     F05L114
3174
3175|       default:
3176|               tsrcval = vep->val;
3177
3178F05L122:        move.l  VEP(A6),A0
3179                move    8(A0),TSRCVAL(A6)
3180
3181|       }
3182
3183                .page
3184
3185|               srcval = tsrcval;
3186
3187F05L114:        move    TSRCVAL(A6),SRCVAL(A6)
3188
3189                .page
3190
3191|       if (pt->ipvsrc) {
3192
3193F05L124:        move.l  PT(A6),A0
3194                tst.b   6(A0)
3195                beq     F05L136
3196
3197|               switch (pt->ipvsrc) {
3198
3199                move.l  PT(A6),A0
3200                move.b  6(A0),D0
3201                ext.w   D0
3202                sub     #1,D0
3203                cmp     #9,D0
3204                bhi     F05L144
3205
3206                asl     #2,D0
3207                lea     F05L145,A0
3208                move.l  0(A0,D0.W),A0
3209                jmp     (A0)
3210
3211|               case SM_RAND:
3212|                       ltmp = xgetran(pt_>ipvmlt);
3213
3214F05L139:        move.l  PT(A6),A0
3215                move    4(A0),(sp)
3216                jsr     xgetran
3217                ext.l   D0
3218                move.l  D0,LTMP(A6)
3219
3220|                       break;
3221
3222                bra     F05L137
3223
3224|               case SM_PTCH:
3225|                       ltmp = pch;
3226
3227F05L140:        move    PCH(A6),A0
3228                move.l  A0,LTMP(A6)
3229
3230|                       break;
3231
3232                bra     F05L137
3233
3234                .page
3235
3236|               case SM_FREQ:
3237|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
3238
3239F05L141:        move    PCH(A6),D0
3240                asr     #7,D0
3241                and     #255,D0
3242                move    D0,A0
3243                add.l   A0,A0
3244                move.l  #ptoftab,A1
3245                move    0(A0,A1.l),D0
3246                ext.l   D0
3247                move.l  D0,LTMP(A6)
3248
3249|                       break;
3250
3251                bra     F05L137
3252
3253|               case SM_KVEL:
3254|                       ltmp = veltab[trg];
3255
3256F05L142:        move    TRG(A6),A0
3257                add.l   A0,A0
3258                move.l  #veltab,A1
3259                move    0(A0,A1.l),D0
3260                ext.l   D0
3261                move.l  D0,LTMP(A6)
3262
3263|                       break;
3264
3265                bra     F05L137
3266
3267                .page
3268
3269|               case SM_KPRS:
3270|                       ltmp = prstab[trg];
3271
3272F05L143:        move    TRG(A6),A0
3273                add.l   A0,A0
3274                move.l  #prstab,A1
3275                move    0(A0,A1.l),D0
3276                ext.l   D0
3277                move.l  D0,LTMP(A6)
3278
3279|                       break;
3280
3281                bra     F05L137
3282
3283                .page
3284
3285|               default:
3286|                       ltmp = valents[group | pt->ipvsrc].val;
3287
3288F05L144:        move.l  PT(A6),A0
3289                clr.l   D0
3290                move.b  6(A0),D0
3291                or.w    GROUP(A6),D0
3292                add.l   D0,D0
3293                move.l  D0,D1
3294                lsl.l   #2,D0
3295                add.l   D1,D0
3296                move.l  D0,A0
3297                move.l  #valents,A1
3298                clr.l   D0
3299                move    8(A0,A1.l),D0
3300                move.l  D0,LTMP(A6)
3301
3302|               }
3303
3304
3305                .page
3306
3307|               ltmp = (ltmp * pt->ipvmlt) >> 15;
3308
3309F05L137:        move.l  PT(A6),A0
3310                move.w  4(A0),D0
3311                move.w  LTMP+2(A6),D1
3312                muls    D1,D0
3313                move.l  #15,D1
3314                asr.l   D1,D0
3315                move.l  D0,LTMP(A6)
3316
3317|               ltmp += (long)pt->ipval;
3318
3319                move.l  PT(A6),A0
3320                move    2(A0),D0
3321                ext.l   D0
3322                add.l   D0,LTMP(A6)
3323
3324|               if (ltmp GT (long)VALMAX)
3325|                       ltmp = (long)VALMAX;
3326
3327                cmp.l   #VALMAX,LTMP(A6)
3328                ble     F05L146
3329
3330                move.l  #VALMAX,LTMP(A6)
3331                bra     F05L147
3332
3333|               else if (ltmp LT (long)VALMIN)
3334|                       ltmp = (long)VALMIN;
3335
3336F05L146:        cmp.l   #VALMIN,LTMP(A6)
3337                bge     F05L147
3338
3339                move.l  #VALMIN,LTMP(A6)
3340
3341|               tfpval = (short)ltmp;
3342
3343F05L147:        move.w  LTMP+2(A6),TFPVAL(A6)
3344                bra     F05L149
3345
3346|       } else {
3347
3348|               tfpval = pt->ipval;
3349
3350F05L136:        move.l  PT(A6),A0
3351                move    2(A0),TFPVAL(A6)
3352
3353|       }
3354
3355                .page
3356
3357|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
3358|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
3359
3360F05L149:        move.l  PT(A6),A0
3361                move.w  (A0),D0
3362                move.w  D0,D2
3363                andi.w  #0xFFF0,D0
3364                move.w  timemlt,D1
3365                muls    D1,D0
3366                move.l  #15,D1
3367                asr.l   D1,D0
3368                move    D0,R_FPMANT
3369
3370|       fpexp = expbit[pt->iptim & 0x000F];
3371
3372                and     #0x000F,D2
3373                move    D2,A0
3374                add.l   A0,A0
3375                add.l   #expbit,A0
3376                move    (A0),R_FPEXP
3377
3378                .page
3379
3380|               fp->idfpch = pch;
3381
3382F05L163:        move    PCH(A6),(A_FP)
3383
3384|               if (tfpval > VALMAX)
3385|                       tfpval = VALMAX;
3386|               else if (tfpval < 0)
3387|                       tfpval = 0;
3388
3389                move.w  TFPVAL(A6),D0
3390                cmp.w   #0x7D00,D0
3391                ble     F05L163B
3392
3393                move.w  #0x7D00,D0
3394                bra     F05L163A
3395
3396F05L163B:       tst.w   D0
3397                bpl     F05L163A
3398
3399                clr.w   D0
3400
3401|#if    LOC_EOR
3402|               fpval = (tfpval << 1) ^ 0x8000;
3403|#endif
3404
3405                .ifne   LOC_EOR
3406F05L163A:       add.w   D0,D0
3407                eor.w   #0x8000,D0
3408                .endc
3409
3410|#if    LOC_SUB
3411|               fpval = ((tfpval >> 5) - 500) << 6;
3412|#endif
3413
3414                .ifne   LOC_SUB
3415F05L163A:       asr.w   #5,D0
3416                sub.w   #500,D0
3417                asl.w   #6,D0
3418                .endc
3419
3420                move.w  D0,R_FPVAL
3421
3422                .page
3423
3424                move.b  5(A_FP),D0
3425                ext.w   D0
3426                sub.w   #1,D0
3427                movea.l PT(A6),A0
3428
3429|       oldi = setipl(FPU_DI);
3430
3431                move    sr,OLDI(A6)
3432                move    #FPU_DI,sr
3433
3434F05L168:        clr.b   10(A0)
3435                add.l   #12,a0
3436                dbra    D0,F05L168
3437
3438                .page
3439
3440|       fp->idftmd ^= I_NVBITS;
3441
3442F05L165:        eor.b   #24,7(A_FP)
3443
3444|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
3445
3446                move.b  7(A_FP),R_FPCTL
3447                and     #28,R_FPCTL
3448                or      #3,R_FPCTL
3449
3450|       fp->idfcpt = fp->idfpt1;
3451
3452                move.b  6(A_FP),8(A_FP)
3453
3454|       fp->idftmd |= I_ACTIVE;
3455
3456                or.b    #2,7(A_FP)
3457
3458|       fp->idftrf = trg;
3459
3460                move    TRG(A6),10(A_FP)
3461
3462|       |(fpu + (long)FPU_TCV1) = srcval;
3463
3464                move    SRCVAL(A6),0x8(A_FPU)
3465
3466|       ++octype;
3467
3468                add     #1,OCTYPE(A6)
3469
3470|       |(fpu + (long)FPU_TSF1) = mltval;
3471
3472                move    MLTVAL(A6),0xA(A_FPU)
3473
3474|       ++octype;
3475
3476                add     #1,OCTYPE(A6)
3477
3478|       |(fpu + (long)FPU_TMNT) = fpmant;
3479
3480                move    R_FPMANT,0x14(A_FPU)
3481
3482|       ++octype;
3483
3484                add     #1,OCTYPE(A6)
3485
3486|       |(fpu + (long)FPU_TEXP) = fpexp;
3487
3488                move    R_FPEXP,0x16(A_FPU)
3489
3490|       ++octype;
3491
3492                add     #1,OCTYPE(A6)
3493
3494                .page
3495
3496|       if (fp->idftmd & I_VNSUBN)
3497
3498                btst    #3,7(A_FP)
3499                beq     F05L169
3500
3501|               |(fpu + (long)FPU_TNV1) = fpval;
3502
3503                move    R_FPVAL,0x1C(A_FPU)
3504                bra     F05L170
3505
3506|       else
3507|               |(fpu + (long)FPU_TNV0) = fpval;
3508
3509F05L169:        move    R_FPVAL,2(A_FPU)
3510
3511|       ++octype;
3512
3513F05L170:        add     #1,OCTYPE(A6)
3514
3515|       |(fpu + (long)FPU_TCTL) = fpctl;
3516
3517                move    R_FPCTL,(A_FPU)
3518
3519|       setipl(oldi);
3520
3521                move    OLDI(A6),sr
3522
3523                .page
3524| ------------------------------------------------------------------------------
3525| Start function 6 -- Ind 1
3526| ------------------------------------------------------------------------------
3527
3528|    if (ip->idhfnc[2].idftmd & I_TM_KEY) {
3529
3530FN06:           move.l  IP(A6),A0
3531                move.b  165(A0),D0
3532                move.w  TAG(A6),D1
3533                eor.w   D1,D0
3534                btst    #0,D0
3535                bne     FN06A
3536
3537                jmp     FN07
3538
3539|       vp = (vce << 4) + 9;
3540
3541FN06A:          move    VCE(A6),D0
3542                asl     #4,D0
3543                add.w   #9,D0
3544                move    D0,VP(A6)
3545
3546|       fpu = io_fpu + FPU_OFNC + (vp << 4);
3547
3548                asl     #5,D0
3549                ext.l   D0
3550                move.l  D0,A_FPU
3551                add.l   #io_fpu+0x4000,A_FPU
3552
3553|       fp = &ip->idhfnc[6];
3554
3555                move.l  #72,A_FP
3556                add.l   IP(A6),A_FP
3557                add.l   #86,A_FP
3558
3559|       pt = &ip->idhpnt[fp->idfpt1];
3560
3561                clr.l   D0
3562                move.b  6(A_FP),D0
3563                lsl.l   #2,D0
3564                move.l  D0,D1
3565                add.l   D0,D0
3566                add.l   D1,D0
3567                add.l   IP(A6),D0
3568                add.l   #242,D0
3569                move.l  D0,PT(A6)
3570
3571                .page
3572
3573|       srcnum = group | fp->idfsrc;
3574
3575                move.w  GROUP(A6),D0
3576                ext.l   D0
3577                clr.l   D1
3578                move.b  4(A_FP),D1
3579                or      D1,D0
3580                move    D0,SRCNUM(A6)
3581
3582|       vep = &valents[srcnum];
3583
3584                add.l   D0,D0
3585                move.l  D0,D1
3586                lsl.l   #2,D0
3587                add.l   D1,D0
3588                add.l   #valents,D0
3589                move.l  D0,VEP(A6)
3590
3591|       smp = vpsms[vp];
3592
3593                move    VP(A6),A0
3594                add.l   A0,A0
3595                add.l   A0,A0
3596                add.l   #vpsms,A0
3597                move.l  (A0),A_SMP
3598
3599|       if (srcnum NE smp->sm) {
3600
3601                clr     D0
3602                move    10(A_SMP),D0
3603                cmp     SRCNUM(A6),D0
3604                beq     F06L113
3605
3606|               (smp->prv)->nxt = smp->nxt;
3607
3608                move.l  4(A_SMP),A0
3609                move.l  (A_SMP),(A0)
3610
3611|               (smp->nxt)->prv = smp->prv;
3612
3613                move.l  (A_SMP),A0
3614                move.l  4(A_SMP),4(A0)
3615
3616|               smp->prv = (struct sment *)vep;
3617
3618                move.l  VEP(A6),4(A_SMP)
3619
3620|               smp->nxt = vep->nxt;
3621
3622                move.l  VEP(A6),A0
3623                move.l  (A0),(A_SMP)
3624
3625|               (vep->nxt)->prv = smp;
3626
3627                move.l  VEP(A6),A0
3628                move.l  (A0),A0
3629                move.l  A_SMP,4(A0)
3630
3631|               vep->nxt = smp;
3632
3633                move.l  VEP(A6),A0
3634                move.l  A_SMP,(A0)
3635
3636|               smp->sm = srcnum;
3637
3638                move    SRCNUM(A6),10(A_SMP)
3639
3640|       }
3641
3642|       mltval = fp->idfmlt;
3643
3644F06L113:        move    2(A_FP),MLTVAL(A6)
3645
3646                .page
3647
3648|       switch (fp->idfsrc) {
3649
3650                move.b  4(A_FP),D0
3651                ext.w   d0
3652                cmp     #10,D0
3653                bhi     F06L122
3654
3655                asl     #2,D0
3656                lea     F06L123,A0
3657                movea.l 0(A0,D0.W),A0
3658                jmp     (A0)
3659
3660|       case SM_NONE:
3661|               mltval = 0;
3662
3663F06L116:        clr     MLTVAL(A6)
3664
3665|               tsrcval = 0;
3666
3667                clr     TSRCVAL(A6)
3668
3669|               break;
3670
3671                bra     F06L114
3672
3673|       case SM_RAND:
3674|               tsrcval = xgetran(mltval);
3675
3676F06L117:        move    MLTVAL(A6),(sp)
3677                jsr     xgetran
3678                move    D0,TSRCVAL(A6)
3679
3680|               break;
3681
3682                bra     F06L114
3683
3684|       case SM_PTCH:
3685|               tsrcval = pch;
3686
3687F06L118:        move    PCH(A6),TSRCVAL(A6)
3688
3689|               break;
3690
3691                bra     F06L114
3692
3693                .page
3694
3695|       case SM_FREQ:
3696|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
3697
3698F06L119:        move    PCH(A6),D0
3699                asr     #7,D0
3700                and     #255,D0
3701                move    D0,A0
3702                add.l   A0,A0
3703                add.l   #ptoftab,A0
3704                move    (A0),TSRCVAL(A6)
3705
3706|               break;
3707
3708                bra     F06L114
3709
3710|       case SM_KVEL:
3711|               tsrcval = veltab[trg];
3712
3713F06L120:        move    TRG(A6),A0
3714                add.l   A0,A0
3715                add.l   #veltab,A0
3716                move    (A0),TSRCVAL(A6)
3717
3718|               break;
3719
3720                bra     F06L114
3721
3722|       case SM_KPRS:
3723|               tsrcval = prstab[trg];
3724
3725F06L121:        move    TRG(A6),A0
3726                add.l   A0,A0
3727                add.l   #prstab,A0
3728                move    (A0),TSRCVAL(A6)
3729
3730|               break;
3731
3732                bra     F06L114
3733
3734|       default:
3735|               tsrcval = vep->val;
3736
3737F06L122:        move.l  VEP(A6),A0
3738                move    8(A0),TSRCVAL(A6)
3739
3740|       }
3741
3742                .page
3743
3744|               srcval = tsrcval;
3745
3746F06L114:        move    TSRCVAL(A6),SRCVAL(A6)
3747
3748                .page
3749
3750|       if (pt->ipvsrc) {
3751
3752F06L124:        move.l  PT(A6),A0
3753                tst.b   6(A0)
3754                beq     F06L136
3755
3756|               switch (pt->ipvsrc) {
3757
3758                move.l  PT(A6),A0
3759                move.b  6(A0),D0
3760                ext.w   D0
3761                sub     #1,D0
3762                cmp     #9,D0
3763                bhi     F06L144
3764
3765                asl     #2,D0
3766                lea     F06L145,A0
3767                move.l  0(A0,D0.W),A0
3768                jmp     (A0)
3769
3770|               case SM_RAND:
3771|                       ltmp = xgetran(pt_>ipvmlt);
3772
3773F06L139:        move.l  PT(A6),A0
3774                move    4(A0),(sp)
3775                jsr     xgetran
3776                ext.l   D0
3777                move.l  D0,LTMP(A6)
3778
3779|                       break;
3780
3781                bra     F06L137
3782
3783|               case SM_PTCH:
3784|                       ltmp = pch;
3785
3786F06L140:        move    PCH(A6),A0
3787                move.l  A0,LTMP(A6)
3788
3789|                       break;
3790
3791                bra     F06L137
3792
3793                .page
3794
3795|               case SM_FREQ:
3796|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
3797
3798F06L141:        move    PCH(A6),D0
3799                asr     #7,D0
3800                and     #255,D0
3801                move    D0,A0
3802                add.l   A0,A0
3803                move.l  #ptoftab,A1
3804                move    0(A0,A1.l),D0
3805                ext.l   D0
3806                move.l  D0,LTMP(A6)
3807
3808|                       break;
3809
3810                bra     F06L137
3811
3812|               case SM_KVEL:
3813|                       ltmp = veltab[trg];
3814
3815F06L142:        move    TRG(A6),A0
3816                add.l   A0,A0
3817                move.l  #veltab,A1
3818                move    0(A0,A1.l),D0
3819                ext.l   D0
3820                move.l  D0,LTMP(A6)
3821
3822|                       break;
3823
3824                bra     F06L137
3825
3826                .page
3827
3828|               case SM_KPRS:
3829|                       ltmp = prstab[trg];
3830
3831F06L143:        move    TRG(A6),A0
3832                add.l   A0,A0
3833                move.l  #prstab,A1
3834                move    0(A0,A1.l),D0
3835                ext.l   D0
3836                move.l  D0,LTMP(A6)
3837
3838|                       break;
3839
3840                bra     F06L137
3841
3842                .page
3843
3844|               default:
3845|                       ltmp = valents[group | pt->ipvsrc].val;
3846
3847F06L144:        move.l  PT(A6),A0
3848                clr.l   D0
3849                move.b  6(A0),D0
3850                or.w    GROUP(A6),D0
3851                add.l   D0,D0
3852                move.l  D0,D1
3853                lsl.l   #2,D0
3854                add.l   D1,D0
3855                move.l  D0,A0
3856                move.l  #valents,A1
3857                clr.l   D0
3858                move    8(A0,A1.l),D0
3859                move.l  D0,LTMP(A6)
3860
3861|               }
3862
3863
3864                .page
3865
3866|               ltmp = (ltmp * pt->ipvmlt) >> 15;
3867
3868F06L137:        move.l  PT(A6),A0
3869                move.w  4(A0),D0
3870                move.w  LTMP+2(A6),D1
3871                muls    D1,D0
3872                move.l  #15,D1
3873                asr.l   D1,D0
3874                move.l  D0,LTMP(A6)
3875
3876|               ltmp += (long)pt->ipval;
3877
3878                move.l  PT(A6),A0
3879                move    2(A0),D0
3880                ext.l   D0
3881                add.l   D0,LTMP(A6)
3882
3883|               if (ltmp GT (long)VALMAX)
3884|                       ltmp = (long)VALMAX;
3885
3886                cmp.l   #VALMAX,LTMP(A6)
3887                ble     F06L146
3888
3889                move.l  #VALMAX,LTMP(A6)
3890                bra     F06L147
3891
3892|               else if (ltmp LT (long)VALMIN)
3893|                       ltmp = (long)VALMIN;
3894
3895F06L146:        cmp.l   #VALMIN,LTMP(A6)
3896                bge     F06L147
3897
3898                move.l  #VALMIN,LTMP(A6)
3899
3900|               tfpval = (short)ltmp;
3901
3902F06L147:        move.w  LTMP+2(A6),TFPVAL(A6)
3903                bra     F06L149
3904
3905|       } else {
3906
3907|               tfpval = pt->ipval;
3908
3909F06L136:        move.l  PT(A6),A0
3910                move    2(A0),TFPVAL(A6)
3911
3912|       }
3913
3914                .page
3915
3916|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
3917|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
3918
3919F06L149:        move.l  PT(A6),A0
3920                move.w  (A0),D0
3921                move.w  D0,D2
3922                andi.w  #0xFFF0,D0
3923                move.w  timemlt,D1
3924                muls    D1,D0
3925                move.l  #15,D1
3926                asr.l   D1,D0
3927                move    D0,R_FPMANT
3928
3929|       fpexp = expbit[pt->iptim & 0x000F];
3930
3931                and     #0x000F,D2
3932                move    D2,A0
3933                add.l   A0,A0
3934                add.l   #expbit,A0
3935                move    (A0),R_FPEXP
3936
3937                .page
3938
3939|               fp->idfpch = pch;
3940
3941F06L163:        move    PCH(A6),(A_FP)
3942
3943|               fpval = tfpval;
3944
3945                move    TFPVAL(A6),R_FPVAL
3946
3947                .page
3948
3949                move.b  5(A_FP),D0
3950                ext.w   D0
3951                sub.w   #1,D0
3952                movea.l PT(A6),A0
3953
3954|       oldi = setipl(FPU_DI);
3955
3956                move    sr,OLDI(A6)
3957                move    #FPU_DI,sr
3958
3959F06L168:        clr.b   10(A0)
3960                add.l   #12,a0
3961                dbra    D0,F06L168
3962
3963                .page
3964
3965|       fp->idftmd ^= I_NVBITS;
3966
3967F06L165:        eor.b   #24,7(A_FP)
3968
3969|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
3970
3971                move.b  7(A_FP),R_FPCTL
3972                and     #28,R_FPCTL
3973                or      #3,R_FPCTL
3974
3975|       fp->idfcpt = fp->idfpt1;
3976
3977                move.b  6(A_FP),8(A_FP)
3978
3979|       fp->idftmd |= I_ACTIVE;
3980
3981                or.b    #2,7(A_FP)
3982
3983|       fp->idftrf = trg;
3984
3985                move    TRG(A6),10(A_FP)
3986
3987|       |(fpu + (long)FPU_TCV1) = srcval;
3988
3989                move    SRCVAL(A6),0x8(A_FPU)
3990
3991|       ++octype;
3992
3993                add     #1,OCTYPE(A6)
3994
3995|       |(fpu + (long)FPU_TSF1) = mltval;
3996
3997                move    MLTVAL(A6),0xA(A_FPU)
3998
3999|       ++octype;
4000
4001                add     #1,OCTYPE(A6)
4002
4003|       |(fpu + (long)FPU_TMNT) = fpmant;
4004
4005                move    R_FPMANT,0x14(A_FPU)
4006
4007|       ++octype;
4008
4009                add     #1,OCTYPE(A6)
4010
4011|       |(fpu + (long)FPU_TEXP) = fpexp;
4012
4013                move    R_FPEXP,0x16(A_FPU)
4014
4015|       ++octype;
4016
4017                add     #1,OCTYPE(A6)
4018
4019                .page
4020
4021|       if (fp->idftmd & I_VNSUBN)
4022
4023                btst    #3,7(A_FP)
4024                beq     F06L169
4025
4026|               |(fpu + (long)FPU_TNV1) = fpval;
4027
4028                move    R_FPVAL,0x1C(A_FPU)
4029                bra     F06L170
4030
4031|       else
4032|               |(fpu + (long)FPU_TNV0) = fpval;
4033
4034F06L169:        move    R_FPVAL,2(A_FPU)
4035
4036|       ++octype;
4037
4038F06L170:        add     #1,OCTYPE(A6)
4039
4040|       |(fpu + (long)FPU_TCTL) = fpctl;
4041
4042                move    R_FPCTL,(A_FPU)
4043
4044|       setipl(oldi);
4045
4046                move    OLDI(A6),sr
4047
4048                .page
4049| ------------------------------------------------------------------------------
4050| Start function 7 -- Ind 2
4051| ------------------------------------------------------------------------------
4052
4053|    if (ip->idhfnc[7].idftmd & I_TM_KEY) {
4054
4055FN07:           move.l  IP(A6),A0
4056                move.b  177(A0),D0
4057                move.w  TAG(A6),D1
4058                eor.w   D1,D0
4059                btst    #0,D0
4060                bne     FN07A
4061
4062                jmp     FN08
4063
4064|       vp = (vce << 4) + 11;
4065
4066FN07A:          move    VCE(A6),D0
4067                asl     #4,D0
4068                add.w   #11,D0
4069                move    D0,VP(A6)
4070
4071|       fpu = io_fpu + FPU_OFNC + (vp << 4);
4072
4073                asl     #5,D0
4074                ext.l   D0
4075                move.l  D0,A_FPU
4076                add.l   #io_fpu+0x4000,A_FPU
4077
4078|       fp = &ip->idhfnc[7];
4079
4080                move.l  #84,A_FP
4081                add.l   IP(A6),A_FP
4082                add.l   #86,A_FP
4083
4084|       pt = &ip->idhpnt[fp->idfpt1];
4085
4086                clr.l   D0
4087                move.b  6(A_FP),D0
4088                lsl.l   #2,D0
4089                move.l  D0,D1
4090                add.l   D0,D0
4091                add.l   D1,D0
4092                add.l   IP(A6),D0
4093                add.l   #242,D0
4094                move.l  D0,PT(A6)
4095
4096                .page
4097
4098|       srcnum = group | fp->idfsrc;
4099
4100                move.w  GROUP(A6),D0
4101                ext.l   D0
4102                clr.l   D1
4103                move.b  4(A_FP),D1
4104                or      D1,D0
4105                move    D0,SRCNUM(A6)
4106
4107|       vep = &valents[srcnum];
4108
4109                add.l   D0,D0
4110                move.l  D0,D1
4111                lsl.l   #2,D0
4112                add.l   D1,D0
4113                add.l   #valents,D0
4114                move.l  D0,VEP(A6)
4115
4116|       smp = vpsms[vp];
4117
4118                move    VP(A6),A0
4119                add.l   A0,A0
4120                add.l   A0,A0
4121                add.l   #vpsms,A0
4122                move.l  (A0),A_SMP
4123
4124|       if (srcnum NE smp->sm) {
4125
4126                clr     D0
4127                move    10(A_SMP),D0
4128                cmp     SRCNUM(A6),D0
4129                beq     F07L113
4130
4131|               (smp->prv)->nxt = smp->nxt;
4132
4133                move.l  4(A_SMP),A0
4134                move.l  (A_SMP),(A0)
4135
4136|               (smp->nxt)->prv = smp->prv;
4137
4138                move.l  (A_SMP),A0
4139                move.l  4(A_SMP),4(A0)
4140
4141|               smp->prv = (struct sment *)vep;
4142
4143                move.l  VEP(A6),4(A_SMP)
4144
4145|               smp->nxt = vep->nxt;
4146
4147                move.l  VEP(A6),A0
4148                move.l  (A0),(A_SMP)
4149
4150|               (vep->nxt)->prv = smp;
4151
4152                move.l  VEP(A6),A0
4153                move.l  (A0),A0
4154                move.l  A_SMP,4(A0)
4155
4156|               vep->nxt = smp;
4157
4158                move.l  VEP(A6),A0
4159                move.l  A_SMP,(A0)
4160
4161|               smp->sm = srcnum;
4162
4163                move    SRCNUM(A6),10(A_SMP)
4164
4165|       }
4166
4167|       mltval = fp->idfmlt;
4168
4169F07L113:        move    2(A_FP),MLTVAL(A6)
4170
4171                .page
4172
4173|       switch (fp->idfsrc) {
4174
4175                move.b  4(A_FP),D0
4176                ext.w   d0
4177                cmp     #10,D0
4178                bhi     F07L122
4179
4180                asl     #2,D0
4181                lea     F07L123,A0
4182                movea.l 0(A0,D0.W),A0
4183                jmp     (A0)
4184
4185|       case SM_NONE:
4186|               mltval = 0;
4187
4188F07L116:        clr     MLTVAL(A6)
4189
4190|               tsrcval = 0;
4191
4192                clr     TSRCVAL(A6)
4193
4194|               break;
4195
4196                bra     F07L114
4197
4198|       case SM_RAND:
4199|               tsrcval = xgetran(mltval);
4200
4201F07L117:        move    MLTVAL(A6),(sp)
4202                jsr     xgetran
4203                move    D0,TSRCVAL(A6)
4204
4205|               break;
4206
4207                bra     F07L114
4208
4209|       case SM_PTCH:
4210|               tsrcval = pch;
4211
4212F07L118:        move    PCH(A6),TSRCVAL(A6)
4213
4214|               break;
4215
4216                bra     F07L114
4217
4218                .page
4219
4220|       case SM_FREQ:
4221|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
4222
4223F07L119:        move    PCH(A6),D0
4224                asr     #7,D0
4225                and     #255,D0
4226                move    D0,A0
4227                add.l   A0,A0
4228                add.l   #ptoftab,A0
4229                move    (A0),TSRCVAL(A6)
4230
4231|               break;
4232
4233                bra     F07L114
4234
4235|       case SM_KVEL:
4236|               tsrcval = veltab[trg];
4237
4238F07L120:        move    TRG(A6),A0
4239                add.l   A0,A0
4240                add.l   #veltab,A0
4241                move    (A0),TSRCVAL(A6)
4242
4243|               break;
4244
4245                bra     F07L114
4246
4247|       case SM_KPRS:
4248|               tsrcval = prstab[trg];
4249
4250F07L121:        move    TRG(A6),A0
4251                add.l   A0,A0
4252                add.l   #prstab,A0
4253                move    (A0),TSRCVAL(A6)
4254
4255|               break;
4256
4257                bra     F07L114
4258
4259|       default:
4260|               tsrcval = vep->val;
4261
4262F07L122:        move.l  VEP(A6),A0
4263                move    8(A0),TSRCVAL(A6)
4264
4265|       }
4266
4267                .page
4268
4269|               srcval = tsrcval;
4270
4271F07L114:        move    TSRCVAL(A6),SRCVAL(A6)
4272
4273                .page
4274
4275|       if (pt->ipvsrc) {
4276
4277F07L124:        move.l  PT(A6),A0
4278                tst.b   6(A0)
4279                beq     F07L136
4280
4281|               switch (pt->ipvsrc) {
4282
4283                move.l  PT(A6),A0
4284                move.b  6(A0),D0
4285                ext.w   D0
4286                sub     #1,D0
4287                cmp     #9,D0
4288                bhi     F07L144
4289
4290                asl     #2,D0
4291                lea     F07L145,A0
4292                move.l  0(A0,D0.W),A0
4293                jmp     (A0)
4294
4295|               case SM_RAND:
4296|                       ltmp = xgetran(pt_>ipvmlt);
4297
4298F07L139:        move.l  PT(A6),A0
4299                move    4(A0),(sp)
4300                jsr     xgetran
4301                ext.l   D0
4302                move.l  D0,LTMP(A6)
4303
4304|                       break;
4305
4306                bra     F07L137
4307
4308|               case SM_PTCH:
4309|                       ltmp = pch;
4310
4311F07L140:        move    PCH(A6),A0
4312                move.l  A0,LTMP(A6)
4313
4314|                       break;
4315
4316                bra     F07L137
4317
4318                .page
4319
4320|               case SM_FREQ:
4321|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
4322
4323F07L141:        move    PCH(A6),D0
4324                asr     #7,D0
4325                and     #255,D0
4326                move    D0,A0
4327                add.l   A0,A0
4328                move.l  #ptoftab,A1
4329                move    0(A0,A1.l),D0
4330                ext.l   D0
4331                move.l  D0,LTMP(A6)
4332
4333|                       break;
4334
4335                bra     F07L137
4336
4337|               case SM_KVEL:
4338|                       ltmp = veltab[trg];
4339
4340F07L142:        move    TRG(A6),A0
4341                add.l   A0,A0
4342                move.l  #veltab,A1
4343                move    0(A0,A1.l),D0
4344                ext.l   D0
4345                move.l  D0,LTMP(A6)
4346
4347|                       break;
4348
4349                bra     F07L137
4350
4351                .page
4352
4353|               case SM_KPRS:
4354|                       ltmp = prstab[trg];
4355
4356F07L143:        move    TRG(A6),A0
4357                add.l   A0,A0
4358                move.l  #prstab,A1
4359                move    0(A0,A1.l),D0
4360                ext.l   D0
4361                move.l  D0,LTMP(A6)
4362
4363|                       break;
4364
4365                bra     F07L137
4366
4367                .page
4368
4369|               default:
4370|                       ltmp = valents[group | pt->ipvsrc].val;
4371
4372F07L144:        move.l  PT(A6),A0
4373                clr.l   D0
4374                move.b  6(A0),D0
4375                or.w    GROUP(A6),D0
4376                add.l   D0,D0
4377                move.l  D0,D1
4378                lsl.l   #2,D0
4379                add.l   D1,D0
4380                move.l  D0,A0
4381                move.l  #valents,A1
4382                clr.l   D0
4383                move    8(A0,A1.l),D0
4384                move.l  D0,LTMP(A6)
4385
4386|               }
4387
4388
4389                .page
4390
4391|               ltmp = (ltmp * pt->ipvmlt) >> 15;
4392
4393F07L137:        move.l  PT(A6),A0
4394                move.w  4(A0),D0
4395                move.w  LTMP+2(A6),D1
4396                muls    D1,D0
4397                move.l  #15,D1
4398                asr.l   D1,D0
4399                move.l  D0,LTMP(A6)
4400
4401|               ltmp += (long)pt->ipval;
4402
4403                move.l  PT(A6),A0
4404                move    2(A0),D0
4405                ext.l   D0
4406                add.l   D0,LTMP(A6)
4407
4408|               if (ltmp GT (long)VALMAX)
4409|                       ltmp = (long)VALMAX;
4410
4411                cmp.l   #VALMAX,LTMP(A6)
4412                ble     F07L146
4413
4414                move.l  #VALMAX,LTMP(A6)
4415                bra     F07L147
4416
4417|               else if (ltmp LT (long)VALMIN)
4418|                       ltmp = (long)VALMIN;
4419
4420F07L146:        cmp.l   #VALMIN,LTMP(A6)
4421                bge     F07L147
4422
4423                move.l  #VALMIN,LTMP(A6)
4424
4425|               tfpval = (short)ltmp;
4426
4427F07L147:        move.w  LTMP+2(A6),TFPVAL(A6)
4428                bra     F07L149
4429
4430|       } else {
4431
4432|               tfpval = pt->ipval;
4433
4434F07L136:        move.l  PT(A6),A0
4435                move    2(A0),TFPVAL(A6)
4436
4437|       }
4438
4439                .page
4440
4441|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
4442|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
4443
4444F07L149:        move.l  PT(A6),A0
4445                move.w  (A0),D0
4446                move.w  D0,D2
4447                andi.w  #0xFFF0,D0
4448                move.w  timemlt,D1
4449                muls    D1,D0
4450                move.l  #15,D1
4451                asr.l   D1,D0
4452                move    D0,R_FPMANT
4453
4454|       fpexp = expbit[pt->iptim & 0x000F];
4455
4456                and     #0x000F,D2
4457                move    D2,A0
4458                add.l   A0,A0
4459                add.l   #expbit,A0
4460                move    (A0),R_FPEXP
4461
4462                .page
4463
4464|               fp->idfpch = pch;
4465
4466F07L163:        move    PCH(A6),(A_FP)
4467
4468|               fpval = tfpval;
4469
4470                move    TFPVAL(A6),R_FPVAL
4471
4472                .page
4473
4474                move.b  5(A_FP),D0
4475                ext.w   D0
4476                sub.w   #1,D0
4477                movea.l PT(A6),A0
4478
4479|       oldi = setipl(FPU_DI);
4480
4481                move    sr,OLDI(A6)
4482                move    #FPU_DI,sr
4483
4484F07L168:        clr.b   10(A0)
4485                add.l   #12,a0
4486                dbra    D0,F07L168
4487
4488                .page
4489
4490|       fp->idftmd ^= I_NVBITS;
4491
4492F07L165:        eor.b   #24,7(A_FP)
4493
4494|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
4495
4496                move.b  7(A_FP),R_FPCTL
4497                and     #28,R_FPCTL
4498                or      #3,R_FPCTL
4499
4500|       fp->idfcpt = fp->idfpt1;
4501
4502                move.b  6(A_FP),8(A_FP)
4503
4504|       fp->idftmd |= I_ACTIVE;
4505
4506                or.b    #2,7(A_FP)
4507
4508|       fp->idftrf = trg;
4509
4510                move    TRG(A6),10(A_FP)
4511
4512|       |(fpu + (long)FPU_TCV1) = srcval;
4513
4514                move    SRCVAL(A6),0x8(A_FPU)
4515
4516|       ++octype;
4517
4518                add     #1,OCTYPE(A6)
4519
4520|       |(fpu + (long)FPU_TSF1) = mltval;
4521
4522                move    MLTVAL(A6),0xA(A_FPU)
4523
4524|       ++octype;
4525
4526                add     #1,OCTYPE(A6)
4527
4528|       |(fpu + (long)FPU_TMNT) = fpmant;
4529
4530                move    R_FPMANT,0x14(A_FPU)
4531
4532|       ++octype;
4533
4534                add     #1,OCTYPE(A6)
4535
4536|       |(fpu + (long)FPU_TEXP) = fpexp;
4537
4538                move    R_FPEXP,0x16(A_FPU)
4539
4540|       ++octype;
4541
4542                add     #1,OCTYPE(A6)
4543
4544                .page
4545
4546|       if (fp->idftmd & I_VNSUBN)
4547
4548                btst    #3,7(A_FP)
4549                beq     F07L169
4550
4551|               |(fpu + (long)FPU_TNV1) = fpval;
4552
4553                move    R_FPVAL,0x1C(A_FPU)
4554                bra     F07L170
4555
4556|       else
4557|               |(fpu + (long)FPU_TNV0) = fpval;
4558
4559F07L169:        move    R_FPVAL,2(A_FPU)
4560
4561|       ++octype;
4562
4563F07L170:        add     #1,OCTYPE(A6)
4564
4565|       |(fpu + (long)FPU_TCTL) = fpctl;
4566
4567                move    R_FPCTL,(A_FPU)
4568
4569|       setipl(oldi);
4570
4571                move    OLDI(A6),sr
4572
4573                .page
4574| ------------------------------------------------------------------------------
4575| Start function 8 -- Ind 3
4576| ------------------------------------------------------------------------------
4577
4578|    if (ip->idhfnc[8].idftmd & I_TM_KEY) {
4579
4580FN08:           move.l  IP(A6),A0
4581                move.b  189(A0),D0
4582                move.w  TAG(A6),D1
4583                eor.w   D1,D0
4584                btst    #0,D0
4585                bne     FN08A
4586
4587                jmp     FN09
4588
4589|       vp = (vce << 4) + 12;
4590
4591FN08A:          move    VCE(A6),D0
4592                asl     #4,D0
4593                add.w   #12,D0
4594                move    D0,VP(A6)
4595
4596|       fpu = io_fpu + FPU_OFNC + (vp << 4);
4597
4598                asl     #5,D0
4599                ext.l   D0
4600                move.l  D0,A_FPU
4601                add.l   #io_fpu+0x4000,A_FPU
4602
4603|       fp = &ip->idhfnc[8];
4604
4605                move.l  #96,A_FP
4606                add.l   IP(A6),A_FP
4607                add.l   #86,A_FP
4608
4609|       pt = &ip->idhpnt[fp->idfpt1];
4610
4611                clr.l   D0
4612                move.b  6(A_FP),D0
4613                lsl.l   #2,D0
4614                move.l  D0,D1
4615                add.l   D0,D0
4616                add.l   D1,D0
4617                add.l   IP(A6),D0
4618                add.l   #242,D0
4619                move.l  D0,PT(A6)
4620
4621                .page
4622
4623|       srcnum = group | fp->idfsrc;
4624
4625                move.w  GROUP(A6),D0
4626                ext.l   D0
4627                clr.l   D1
4628                move.b  4(A_FP),D1
4629                or      D1,D0
4630                move    D0,SRCNUM(A6)
4631
4632|       vep = &valents[srcnum];
4633
4634                add.l   D0,D0
4635                move.l  D0,D1
4636                lsl.l   #2,D0
4637                add.l   D1,D0
4638                add.l   #valents,D0
4639                move.l  D0,VEP(A6)
4640
4641|       smp = vpsms[vp];
4642
4643                move    VP(A6),A0
4644                add.l   A0,A0
4645                add.l   A0,A0
4646                add.l   #vpsms,A0
4647                move.l  (A0),A_SMP
4648
4649|       if (srcnum NE smp->sm) {
4650
4651                clr     D0
4652                move    10(A_SMP),D0
4653                cmp     SRCNUM(A6),D0
4654                beq     F08L113
4655
4656|               (smp->prv)->nxt = smp->nxt;
4657
4658                move.l  4(A_SMP),A0
4659                move.l  (A_SMP),(A0)
4660
4661|               (smp->nxt)->prv = smp->prv;
4662
4663                move.l  (A_SMP),A0
4664                move.l  4(A_SMP),4(A0)
4665
4666|               smp->prv = (struct sment *)vep;
4667
4668                move.l  VEP(A6),4(A_SMP)
4669
4670|               smp->nxt = vep->nxt;
4671
4672                move.l  VEP(A6),A0
4673                move.l  (A0),(A_SMP)
4674
4675|               (vep->nxt)->prv = smp;
4676
4677                move.l  VEP(A6),A0
4678                move.l  (A0),A0
4679                move.l  A_SMP,4(A0)
4680
4681|               vep->nxt = smp;
4682
4683                move.l  VEP(A6),A0
4684                move.l  A_SMP,(A0)
4685
4686|               smp->sm = srcnum;
4687
4688                move    SRCNUM(A6),10(A_SMP)
4689
4690|       }
4691
4692|       mltval = fp->idfmlt;
4693
4694F08L113:        move    2(A_FP),MLTVAL(A6)
4695
4696                .page
4697
4698|       switch (fp->idfsrc) {
4699
4700                move.b  4(A_FP),D0
4701                ext.w   d0
4702                cmp     #10,D0
4703                bhi     F08L122
4704
4705                asl     #2,D0
4706                lea     F08L123,A0
4707                movea.l 0(A0,D0.W),A0
4708                jmp     (A0)
4709
4710|       case SM_NONE:
4711|               mltval = 0;
4712
4713F08L116:        clr     MLTVAL(A6)
4714
4715|               tsrcval = 0;
4716
4717                clr     TSRCVAL(A6)
4718
4719|               break;
4720
4721                bra     F08L114
4722
4723|       case SM_RAND:
4724|               tsrcval = xgetran(mltval);
4725
4726F08L117:        move    MLTVAL(A6),(sp)
4727                jsr     xgetran
4728                move    D0,TSRCVAL(A6)
4729
4730|               break;
4731
4732                bra     F08L114
4733
4734|       case SM_PTCH:
4735|               tsrcval = pch;
4736
4737F08L118:        move    PCH(A6),TSRCVAL(A6)
4738
4739|               break;
4740
4741                bra     F08L114
4742
4743                .page
4744
4745|       case SM_FREQ:
4746|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
4747
4748F08L119:        move    PCH(A6),D0
4749                asr     #7,D0
4750                and     #255,D0
4751                move    D0,A0
4752                add.l   A0,A0
4753                add.l   #ptoftab,A0
4754                move    (A0),TSRCVAL(A6)
4755
4756|               break;
4757
4758                bra     F08L114
4759
4760|       case SM_KVEL:
4761|               tsrcval = veltab[trg];
4762
4763F08L120:        move    TRG(A6),A0
4764                add.l   A0,A0
4765                add.l   #veltab,A0
4766                move    (A0),TSRCVAL(A6)
4767
4768|               break;
4769
4770                bra     F08L114
4771
4772|       case SM_KPRS:
4773|               tsrcval = prstab[trg];
4774
4775F08L121:        move    TRG(A6),A0
4776                add.l   A0,A0
4777                add.l   #prstab,A0
4778                move    (A0),TSRCVAL(A6)
4779
4780|               break;
4781
4782                bra     F08L114
4783
4784|       default:
4785|               tsrcval = vep->val;
4786
4787F08L122:        move.l  VEP(A6),A0
4788                move    8(A0),TSRCVAL(A6)
4789
4790|       }
4791
4792                .page
4793
4794|               srcval = tsrcval;
4795
4796F08L114:        move    TSRCVAL(A6),SRCVAL(A6)
4797
4798                .page
4799
4800|       if (pt->ipvsrc) {
4801
4802F08L124:        move.l  PT(A6),A0
4803                tst.b   6(A0)
4804                beq     F08L136
4805
4806|               switch (pt->ipvsrc) {
4807
4808                move.l  PT(A6),A0
4809                move.b  6(A0),D0
4810                ext.w   D0
4811                sub     #1,D0
4812                cmp     #9,D0
4813                bhi     F08L144
4814
4815                asl     #2,D0
4816                lea     F08L145,A0
4817                move.l  0(A0,D0.W),A0
4818                jmp     (A0)
4819
4820|               case SM_RAND:
4821|                       ltmp = xgetran(pt_>ipvmlt);
4822
4823F08L139:        move.l  PT(A6),A0
4824                move    4(A0),(sp)
4825                jsr     xgetran
4826                ext.l   D0
4827                move.l  D0,LTMP(A6)
4828
4829|                       break;
4830
4831                bra     F08L137
4832
4833|               case SM_PTCH:
4834|                       ltmp = pch;
4835
4836F08L140:        move    PCH(A6),A0
4837                move.l  A0,LTMP(A6)
4838
4839|                       break;
4840
4841                bra     F08L137
4842
4843                .page
4844
4845|               case SM_FREQ:
4846|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
4847
4848F08L141:        move    PCH(A6),D0
4849                asr     #7,D0
4850                and     #255,D0
4851                move    D0,A0
4852                add.l   A0,A0
4853                move.l  #ptoftab,A1
4854                move    0(A0,A1.l),D0
4855                ext.l   D0
4856                move.l  D0,LTMP(A6)
4857
4858|                       break;
4859
4860                bra     F08L137
4861
4862|               case SM_KVEL:
4863|                       ltmp = veltab[trg];
4864
4865F08L142:        move    TRG(A6),A0
4866                add.l   A0,A0
4867                move.l  #veltab,A1
4868                move    0(A0,A1.l),D0
4869                ext.l   D0
4870                move.l  D0,LTMP(A6)
4871
4872|                       break;
4873
4874                bra     F08L137
4875
4876                .page
4877
4878|               case SM_KPRS:
4879|                       ltmp = prstab[trg];
4880
4881F08L143:        move    TRG(A6),A0
4882                add.l   A0,A0
4883                move.l  #prstab,A1
4884                move    0(A0,A1.l),D0
4885                ext.l   D0
4886                move.l  D0,LTMP(A6)
4887
4888|                       break;
4889
4890                bra     F08L137
4891
4892                .page
4893
4894|               default:
4895|                       ltmp = valents[group | pt->ipvsrc].val;
4896
4897F08L144:        move.l  PT(A6),A0
4898                clr.l   D0
4899                move.b  6(A0),D0
4900                or.w    GROUP(A6),D0
4901                add.l   D0,D0
4902                move.l  D0,D1
4903                lsl.l   #2,D0
4904                add.l   D1,D0
4905                move.l  D0,A0
4906                move.l  #valents,A1
4907                clr.l   D0
4908                move    8(A0,A1.l),D0
4909                move.l  D0,LTMP(A6)
4910
4911|               }
4912
4913
4914                .page
4915
4916|               ltmp = (ltmp * pt->ipvmlt) >> 15;
4917
4918F08L137:        move.l  PT(A6),A0
4919                move.w  4(A0),D0
4920                move.w  LTMP+2(A6),D1
4921                muls    D1,D0
4922                move.l  #15,D1
4923                asr.l   D1,D0
4924                move.l  D0,LTMP(A6)
4925
4926|               ltmp += (long)pt->ipval;
4927
4928                move.l  PT(A6),A0
4929                move    2(A0),D0
4930                ext.l   D0
4931                add.l   D0,LTMP(A6)
4932
4933|               if (ltmp GT (long)VALMAX)
4934|                       ltmp = (long)VALMAX;
4935
4936                cmp.l   #VALMAX,LTMP(A6)
4937                ble     F08L146
4938
4939                move.l  #VALMAX,LTMP(A6)
4940                bra     F08L147
4941
4942|               else if (ltmp LT (long)VALMIN)
4943|                       ltmp = (long)VALMIN;
4944
4945F08L146:        cmp.l   #VALMIN,LTMP(A6)
4946                bge     F08L147
4947
4948                move.l  #VALMIN,LTMP(A6)
4949
4950|               tfpval = (short)ltmp;
4951
4952F08L147:        move.w  LTMP+2(A6),TFPVAL(A6)
4953                bra     F08L149
4954
4955|       } else {
4956
4957|               tfpval = pt->ipval;
4958
4959F08L136:        move.l  PT(A6),A0
4960                move    2(A0),TFPVAL(A6)
4961
4962|       }
4963
4964                .page
4965
4966|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
4967|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
4968
4969F08L149:        move.l  PT(A6),A0
4970                move.w  (A0),D0
4971                move.w  D0,D2
4972                andi.w  #0xFFF0,D0
4973                move.w  timemlt,D1
4974                muls    D1,D0
4975                move.l  #15,D1
4976                asr.l   D1,D0
4977                move    D0,R_FPMANT
4978
4979|       fpexp = expbit[pt->iptim & 0x000F];
4980
4981                and     #0x000F,D2
4982                move    D2,A0
4983                add.l   A0,A0
4984                add.l   #expbit,A0
4985                move    (A0),R_FPEXP
4986
4987                .page
4988
4989|               fp->idfpch = pch;
4990
4991F08L163:        move    PCH(A6),(A_FP)
4992
4993|               fpval = tfpval;
4994
4995                move    TFPVAL(A6),R_FPVAL
4996
4997                .page
4998
4999                move.b  5(A_FP),D0
5000                ext.w   D0
5001                sub.w   #1,D0
5002                movea.l PT(A6),A0
5003
5004|       oldi = setipl(FPU_DI);
5005
5006                move    sr,OLDI(A6)
5007                move    #FPU_DI,sr
5008
5009F08L168:        clr.b   10(A0)
5010                add.l   #12,a0
5011                dbra    D0,F08L168
5012
5013                .page
5014
5015|       fp->idftmd ^= I_NVBITS;
5016
5017F08L165:        eor.b   #24,7(A_FP)
5018
5019|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
5020
5021                move.b  7(A_FP),R_FPCTL
5022                and     #28,R_FPCTL
5023                or      #3,R_FPCTL
5024
5025|       fp->idfcpt = fp->idfpt1;
5026
5027                move.b  6(A_FP),8(A_FP)
5028
5029|       fp->idftmd |= I_ACTIVE;
5030
5031                or.b    #2,7(A_FP)
5032
5033|       fp->idftrf = trg;
5034
5035                move    TRG(A6),10(A_FP)
5036
5037|       |(fpu + (long)FPU_TCV1) = srcval;
5038
5039                move    SRCVAL(A6),0x8(A_FPU)
5040
5041|       ++octype;
5042
5043                add     #1,OCTYPE(A6)
5044
5045|       |(fpu + (long)FPU_TSF1) = mltval;
5046
5047                move    MLTVAL(A6),0xA(A_FPU)
5048
5049|       ++octype;
5050
5051                add     #1,OCTYPE(A6)
5052
5053|       |(fpu + (long)FPU_TMNT) = fpmant;
5054
5055                move    R_FPMANT,0x14(A_FPU)
5056
5057|       ++octype;
5058
5059                add     #1,OCTYPE(A6)
5060
5061|       |(fpu + (long)FPU_TEXP) = fpexp;
5062
5063                move    R_FPEXP,0x16(A_FPU)
5064
5065|       ++octype;
5066
5067                add     #1,OCTYPE(A6)
5068
5069                .page
5070
5071|       if (fp->idftmd & I_VNSUBN)
5072
5073                btst    #3,7(A_FP)
5074                beq     F08L169
5075
5076|               |(fpu + (long)FPU_TNV1) = fpval;
5077
5078                move    R_FPVAL,0x1C(A_FPU)
5079                bra     F08L170
5080
5081|       else
5082|               |(fpu + (long)FPU_TNV0) = fpval;
5083
5084F08L169:        move    R_FPVAL,2(A_FPU)
5085
5086|       ++octype;
5087
5088F08L170:        add     #1,OCTYPE(A6)
5089
5090|       |(fpu + (long)FPU_TCTL) = fpctl;
5091
5092                move    R_FPCTL,(A_FPU)
5093
5094|       setipl(oldi);
5095
5096                move    OLDI(A6),sr
5097
5098                .page
5099| ------------------------------------------------------------------------------
5100| Start function 9 -- Ind 4
5101| ------------------------------------------------------------------------------
5102
5103|    if (ip->idhfnc[9].idftmd & I_TM_KEY) {
5104
5105FN09:           move.l  IP(A6),A0
5106                move.b  201(A0),D0
5107                move.w  TAG(A6),D1
5108                eor.w   D1,D0
5109                btst    #0,D0
5110                bne     FN09A
5111
5112                jmp     FN10
5113
5114|       vp = (vce << 4) + 13;
5115
5116FN09A:          move    VCE(A6),D0
5117                asl     #4,D0
5118                add.w   #13,D0
5119                move    D0,VP(A6)
5120
5121|       fpu = io_fpu + FPU_OFNC + (vp << 4);
5122
5123                asl     #5,D0
5124                ext.l   D0
5125                move.l  D0,A_FPU
5126                add.l   #io_fpu+0x4000,A_FPU
5127
5128|       fp = &ip->idhfnc[9];
5129
5130                move.l  #108,A_FP
5131                add.l   IP(A6),A_FP
5132                add.l   #86,A_FP
5133
5134|       pt = &ip->idhpnt[fp->idfpt1];
5135
5136                clr.l   D0
5137                move.b  6(A_FP),D0
5138                lsl.l   #2,D0
5139                move.l  D0,D1
5140                add.l   D0,D0
5141                add.l   D1,D0
5142                add.l   IP(A6),D0
5143                add.l   #242,D0
5144                move.l  D0,PT(A6)
5145
5146                .page
5147
5148|       srcnum = group | fp->idfsrc;
5149
5150                move.w  GROUP(A6),D0
5151                ext.l   D0
5152                clr.l   D1
5153                move.b  4(A_FP),D1
5154                or      D1,D0
5155                move    D0,SRCNUM(A6)
5156
5157|       vep = &valents[srcnum];
5158
5159                add.l   D0,D0
5160                move.l  D0,D1
5161                lsl.l   #2,D0
5162                add.l   D1,D0
5163                add.l   #valents,D0
5164                move.l  D0,VEP(A6)
5165
5166|       smp = vpsms[vp];
5167
5168                move    VP(A6),A0
5169                add.l   A0,A0
5170                add.l   A0,A0
5171                add.l   #vpsms,A0
5172                move.l  (A0),A_SMP
5173
5174|       if (srcnum NE smp->sm) {
5175
5176                clr     D0
5177                move    10(A_SMP),D0
5178                cmp     SRCNUM(A6),D0
5179                beq     F09L113
5180
5181|               (smp->prv)->nxt = smp->nxt;
5182
5183                move.l  4(A_SMP),A0
5184                move.l  (A_SMP),(A0)
5185
5186|               (smp->nxt)->prv = smp->prv;
5187
5188                move.l  (A_SMP),A0
5189                move.l  4(A_SMP),4(A0)
5190
5191|               smp->prv = (struct sment *)vep;
5192
5193                move.l  VEP(A6),4(A_SMP)
5194
5195|               smp->nxt = vep->nxt;
5196
5197                move.l  VEP(A6),A0
5198                move.l  (A0),(A_SMP)
5199
5200|               (vep->nxt)->prv = smp;
5201
5202                move.l  VEP(A6),A0
5203                move.l  (A0),A0
5204                move.l  A_SMP,4(A0)
5205
5206|               vep->nxt = smp;
5207
5208                move.l  VEP(A6),A0
5209                move.l  A_SMP,(A0)
5210
5211|               smp->sm = srcnum;
5212
5213                move    SRCNUM(A6),10(A_SMP)
5214
5215|       }
5216
5217|       mltval = fp->idfmlt;
5218
5219F09L113:        move    2(A_FP),MLTVAL(A6)
5220
5221                .page
5222
5223|       switch (fp->idfsrc) {
5224
5225                move.b  4(A_FP),D0
5226                ext.w   d0
5227                cmp     #10,D0
5228                bhi     F09L122
5229
5230                asl     #2,D0
5231                lea     F09L123,A0
5232                movea.l 0(A0,D0.W),A0
5233                jmp     (A0)
5234
5235|       case SM_NONE:
5236|               mltval = 0;
5237
5238F09L116:        clr     MLTVAL(A6)
5239
5240|               tsrcval = 0;
5241
5242                clr     TSRCVAL(A6)
5243
5244|               break;
5245
5246                bra     F09L114
5247
5248|       case SM_RAND:
5249|               tsrcval = xgetran(mltval);
5250
5251F09L117:        move    MLTVAL(A6),(sp)
5252                jsr     xgetran
5253                move    D0,TSRCVAL(A6)
5254
5255|               break;
5256
5257                bra     F09L114
5258
5259|       case SM_PTCH:
5260|               tsrcval = pch;
5261
5262F09L118:        move    PCH(A6),TSRCVAL(A6)
5263
5264|               break;
5265
5266                bra     F09L114
5267
5268                .page
5269
5270|       case SM_FREQ:
5271|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
5272
5273F09L119:        move    PCH(A6),D0
5274                asr     #7,D0
5275                and     #255,D0
5276                move    D0,A0
5277                add.l   A0,A0
5278                add.l   #ptoftab,A0
5279                move    (A0),TSRCVAL(A6)
5280
5281|               break;
5282
5283                bra     F09L114
5284
5285|       case SM_KVEL:
5286|               tsrcval = veltab[trg];
5287
5288F09L120:        move    TRG(A6),A0
5289                add.l   A0,A0
5290                add.l   #veltab,A0
5291                move    (A0),TSRCVAL(A6)
5292
5293|               break;
5294
5295                bra     F09L114
5296
5297|       case SM_KPRS:
5298|               tsrcval = prstab[trg];
5299
5300F09L121:        move    TRG(A6),A0
5301                add.l   A0,A0
5302                add.l   #prstab,A0
5303                move    (A0),TSRCVAL(A6)
5304
5305|               break;
5306
5307                bra     F09L114
5308
5309|       default:
5310|               tsrcval = vep->val;
5311
5312F09L122:        move.l  VEP(A6),A0
5313                move    8(A0),TSRCVAL(A6)
5314
5315|       }
5316
5317                .page
5318
5319|               srcval = tsrcval;
5320
5321F09L114:        move    TSRCVAL(A6),SRCVAL(A6)
5322
5323                .page
5324
5325|       if (pt->ipvsrc) {
5326
5327F09L124:        move.l  PT(A6),A0
5328                tst.b   6(A0)
5329                beq     F09L136
5330
5331|               switch (pt->ipvsrc) {
5332
5333                move.l  PT(A6),A0
5334                move.b  6(A0),D0
5335                ext.w   D0
5336                sub     #1,D0
5337                cmp     #9,D0
5338                bhi     F09L144
5339
5340                asl     #2,D0
5341                lea     F09L145,A0
5342                move.l  0(A0,D0.W),A0
5343                jmp     (A0)
5344
5345|               case SM_RAND:
5346|                       ltmp = xgetran(pt_>ipvmlt);
5347
5348F09L139:        move.l  PT(A6),A0
5349                move    4(A0),(sp)
5350                jsr     xgetran
5351                ext.l   D0
5352                move.l  D0,LTMP(A6)
5353
5354|                       break;
5355
5356                bra     F09L137
5357
5358|               case SM_PTCH:
5359|                       ltmp = pch;
5360
5361F09L140:        move    PCH(A6),A0
5362                move.l  A0,LTMP(A6)
5363
5364|                       break;
5365
5366                bra     F09L137
5367
5368                .page
5369
5370|               case SM_FREQ:
5371|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
5372
5373F09L141:        move    PCH(A6),D0
5374                asr     #7,D0
5375                and     #255,D0
5376                move    D0,A0
5377                add.l   A0,A0
5378                move.l  #ptoftab,A1
5379                move    0(A0,A1.l),D0
5380                ext.l   D0
5381                move.l  D0,LTMP(A6)
5382
5383|                       break;
5384
5385                bra     F09L137
5386
5387|               case SM_KVEL:
5388|                       ltmp = veltab[trg];
5389
5390F09L142:        move    TRG(A6),A0
5391                add.l   A0,A0
5392                move.l  #veltab,A1
5393                move    0(A0,A1.l),D0
5394                ext.l   D0
5395                move.l  D0,LTMP(A6)
5396
5397|                       break;
5398
5399                bra     F09L137
5400
5401                .page
5402
5403|               case SM_KPRS:
5404|                       ltmp = prstab[trg];
5405
5406F09L143:        move    TRG(A6),A0
5407                add.l   A0,A0
5408                move.l  #prstab,A1
5409                move    0(A0,A1.l),D0
5410                ext.l   D0
5411                move.l  D0,LTMP(A6)
5412
5413|                       break;
5414
5415                bra     F09L137
5416
5417                .page
5418
5419|               default:
5420|                       ltmp = valents[group | pt->ipvsrc].val;
5421
5422F09L144:        move.l  PT(A6),A0
5423                clr.l   D0
5424                move.b  6(A0),D0
5425                or.w    GROUP(A6),D0
5426                add.l   D0,D0
5427                move.l  D0,D1
5428                lsl.l   #2,D0
5429                add.l   D1,D0
5430                move.l  D0,A0
5431                move.l  #valents,A1
5432                clr.l   D0
5433                move    8(A0,A1.l),D0
5434                move.l  D0,LTMP(A6)
5435
5436|               }
5437
5438
5439                .page
5440
5441|               ltmp = (ltmp * pt->ipvmlt) >> 15;
5442
5443F09L137:        move.l  PT(A6),A0
5444                move.w  4(A0),D0
5445                move.w  LTMP+2(A6),D1
5446                muls    D1,D0
5447                move.l  #15,D1
5448                asr.l   D1,D0
5449                move.l  D0,LTMP(A6)
5450
5451|               ltmp += (long)pt->ipval;
5452
5453                move.l  PT(A6),A0
5454                move    2(A0),D0
5455                ext.l   D0
5456                add.l   D0,LTMP(A6)
5457
5458|               if (ltmp GT (long)VALMAX)
5459|                       ltmp = (long)VALMAX;
5460
5461                cmp.l   #VALMAX,LTMP(A6)
5462                ble     F09L146
5463
5464                move.l  #VALMAX,LTMP(A6)
5465                bra     F09L147
5466
5467|               else if (ltmp LT (long)VALMIN)
5468|                       ltmp = (long)VALMIN;
5469
5470F09L146:        cmp.l   #VALMIN,LTMP(A6)
5471                bge     F09L147
5472
5473                move.l  #VALMIN,LTMP(A6)
5474
5475|               tfpval = (short)ltmp;
5476
5477F09L147:        move.w  LTMP+2(A6),TFPVAL(A6)
5478                bra     F09L149
5479
5480|       } else {
5481
5482|               tfpval = pt->ipval;
5483
5484F09L136:        move.l  PT(A6),A0
5485                move    2(A0),TFPVAL(A6)
5486
5487|       }
5488
5489                .page
5490
5491|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
5492|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
5493
5494F09L149:        move.l  PT(A6),A0
5495                move.w  (A0),D0
5496                move.w  D0,D2
5497                andi.w  #0xFFF0,D0
5498                move.w  timemlt,D1
5499                muls    D1,D0
5500                move.l  #15,D1
5501                asr.l   D1,D0
5502                move    D0,R_FPMANT
5503
5504|       fpexp = expbit[pt->iptim & 0x000F];
5505
5506                and     #0x000F,D2
5507                move    D2,A0
5508                add.l   A0,A0
5509                add.l   #expbit,A0
5510                move    (A0),R_FPEXP
5511
5512                .page
5513
5514|               fp->idfpch = pch;
5515
5516F09L163:        move    PCH(A6),(A_FP)
5517
5518|               fpval = tfpval;
5519
5520                move    TFPVAL(A6),R_FPVAL
5521
5522                .page
5523
5524                move.b  5(A_FP),D0
5525                ext.w   D0
5526                sub.w   #1,D0
5527                movea.l PT(A6),A0
5528
5529|       oldi = setipl(FPU_DI);
5530
5531                move    sr,OLDI(A6)
5532                move    #FPU_DI,sr
5533
5534F09L168:        clr.b   10(A0)
5535                add.l   #12,a0
5536                dbra    D0,F09L168
5537
5538                .page
5539
5540|       fp->idftmd ^= I_NVBITS;
5541
5542F09L165:        eor.b   #24,7(A_FP)
5543
5544|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
5545
5546                move.b  7(A_FP),R_FPCTL
5547                and     #28,R_FPCTL
5548                or      #3,R_FPCTL
5549
5550|       fp->idfcpt = fp->idfpt1;
5551
5552                move.b  6(A_FP),8(A_FP)
5553
5554|       fp->idftmd |= I_ACTIVE;
5555
5556                or.b    #2,7(A_FP)
5557
5558|       fp->idftrf = trg;
5559
5560                move    TRG(A6),10(A_FP)
5561
5562|       |(fpu + (long)FPU_TCV1) = srcval;
5563
5564                move    SRCVAL(A6),0x8(A_FPU)
5565
5566|       ++octype;
5567
5568                add     #1,OCTYPE(A6)
5569
5570|       |(fpu + (long)FPU_TSF1) = mltval;
5571
5572                move    MLTVAL(A6),0xA(A_FPU)
5573
5574|       ++octype;
5575
5576                add     #1,OCTYPE(A6)
5577
5578|       |(fpu + (long)FPU_TMNT) = fpmant;
5579
5580                move    R_FPMANT,0x14(A_FPU)
5581
5582|       ++octype;
5583
5584                add     #1,OCTYPE(A6)
5585
5586|       |(fpu + (long)FPU_TEXP) = fpexp;
5587
5588                move    R_FPEXP,0x16(A_FPU)
5589
5590|       ++octype;
5591
5592                add     #1,OCTYPE(A6)
5593
5594                .page
5595
5596|       if (fp->idftmd & I_VNSUBN)
5597
5598                btst    #3,7(A_FP)
5599                beq     F09L169
5600
5601|               |(fpu + (long)FPU_TNV1) = fpval;
5602
5603                move    R_FPVAL,0x1C(A_FPU)
5604                bra     F09L170
5605
5606|       else
5607|               |(fpu + (long)FPU_TNV0) = fpval;
5608
5609F09L169:        move    R_FPVAL,2(A_FPU)
5610
5611|       ++octype;
5612
5613F09L170:        add     #1,OCTYPE(A6)
5614
5615|       |(fpu + (long)FPU_TCTL) = fpctl;
5616
5617                move    R_FPCTL,(A_FPU)
5618
5619|       setipl(oldi);
5620
5621                move    OLDI(A6),sr
5622
5623                .page
5624| ------------------------------------------------------------------------------
5625| Start function 10 -- Ind 5
5626| ------------------------------------------------------------------------------
5627
5628|    if (ip->idhfnc[10].idftmd & I_TM_KEY) {
5629
5630FN10:           move.l  IP(A6),A0
5631                move.b  213(A0),D0
5632                move.w  TAG(A6),D1
5633                eor.w   D1,D0
5634                btst    #0,D0
5635                bne     FN10A
5636
5637                jmp     FN11
5638
5639|       vp = (vce << 4) + 14;
5640
5641FN10A:          move    VCE(A6),D0
5642                asl     #4,D0
5643                add.w   #14,D0
5644                move    D0,VP(A6)
5645
5646|       fpu = io_fpu + FPU_OFNC + (vp << 4);
5647
5648                asl     #5,D0
5649                ext.l   D0
5650                move.l  D0,A_FPU
5651                add.l   #io_fpu+0x4000,A_FPU
5652
5653|       fp = &ip->idhfnc[10];
5654
5655                move.l  #120,A_FP
5656                add.l   IP(A6),A_FP
5657                add.l   #86,A_FP
5658
5659|       pt = &ip->idhpnt[fp->idfpt1];
5660
5661                clr.l   D0
5662                move.b  6(A_FP),D0
5663                lsl.l   #2,D0
5664                move.l  D0,D1
5665                add.l   D0,D0
5666                add.l   D1,D0
5667                add.l   IP(A6),D0
5668                add.l   #242,D0
5669                move.l  D0,PT(A6)
5670
5671                .page
5672
5673|       srcnum = group | fp->idfsrc;
5674
5675                move.w  GROUP(A6),D0
5676                ext.l   D0
5677                clr.l   D1
5678                move.b  4(A_FP),D1
5679                or      D1,D0
5680                move    D0,SRCNUM(A6)
5681
5682|       vep = &valents[srcnum];
5683
5684                add.l   D0,D0
5685                move.l  D0,D1
5686                lsl.l   #2,D0
5687                add.l   D1,D0
5688                add.l   #valents,D0
5689                move.l  D0,VEP(A6)
5690
5691|       smp = vpsms[vp];
5692
5693                move    VP(A6),A0
5694                add.l   A0,A0
5695                add.l   A0,A0
5696                add.l   #vpsms,A0
5697                move.l  (A0),A_SMP
5698
5699|       if (srcnum NE smp->sm) {
5700
5701                clr     D0
5702                move    10(A_SMP),D0
5703                cmp     SRCNUM(A6),D0
5704                beq     F10L113
5705
5706|               (smp->prv)->nxt = smp->nxt;
5707
5708                move.l  4(A_SMP),A0
5709                move.l  (A_SMP),(A0)
5710
5711|               (smp->nxt)->prv = smp->prv;
5712
5713                move.l  (A_SMP),A0
5714                move.l  4(A_SMP),4(A0)
5715
5716|               smp->prv = (struct sment *)vep;
5717
5718                move.l  VEP(A6),4(A_SMP)
5719
5720|               smp->nxt = vep->nxt;
5721
5722                move.l  VEP(A6),A0
5723                move.l  (A0),(A_SMP)
5724
5725|               (vep->nxt)->prv = smp;
5726
5727                move.l  VEP(A6),A0
5728                move.l  (A0),A0
5729                move.l  A_SMP,4(A0)
5730
5731|               vep->nxt = smp;
5732
5733                move.l  VEP(A6),A0
5734                move.l  A_SMP,(A0)
5735
5736|               smp->sm = srcnum;
5737
5738                move    SRCNUM(A6),10(A_SMP)
5739
5740|       }
5741
5742|       mltval = fp->idfmlt;
5743
5744F10L113:        move    2(A_FP),MLTVAL(A6)
5745
5746                .page
5747
5748|       switch (fp->idfsrc) {
5749
5750                move.b  4(A_FP),D0
5751                ext.w   d0
5752                cmp     #10,D0
5753                bhi     F10L122
5754
5755                asl     #2,D0
5756                lea     F10L123,A0
5757                movea.l 0(A0,D0.W),A0
5758                jmp     (A0)
5759
5760|       case SM_NONE:
5761|               mltval = 0;
5762
5763F10L116:        clr     MLTVAL(A6)
5764
5765|               tsrcval = 0;
5766
5767                clr     TSRCVAL(A6)
5768
5769|               break;
5770
5771                bra     F10L114
5772
5773|       case SM_RAND:
5774|               tsrcval = xgetran(mltval);
5775
5776F10L117:        move    MLTVAL(A6),(sp)
5777                jsr     xgetran
5778                move    D0,TSRCVAL(A6)
5779
5780|               break;
5781
5782                bra     F10L114
5783
5784|       case SM_PTCH:
5785|               tsrcval = pch;
5786
5787F10L118:        move    PCH(A6),TSRCVAL(A6)
5788
5789|               break;
5790
5791                bra     F10L114
5792
5793                .page
5794
5795|       case SM_FREQ:
5796|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
5797
5798F10L119:        move    PCH(A6),D0
5799                asr     #7,D0
5800                and     #255,D0
5801                move    D0,A0
5802                add.l   A0,A0
5803                add.l   #ptoftab,A0
5804                move    (A0),TSRCVAL(A6)
5805
5806|               break;
5807
5808                bra     F10L114
5809
5810|       case SM_KVEL:
5811|               tsrcval = veltab[trg];
5812
5813F10L120:        move    TRG(A6),A0
5814                add.l   A0,A0
5815                add.l   #veltab,A0
5816                move    (A0),TSRCVAL(A6)
5817
5818|               break;
5819
5820                bra     F10L114
5821
5822|       case SM_KPRS:
5823|               tsrcval = prstab[trg];
5824
5825F10L121:        move    TRG(A6),A0
5826                add.l   A0,A0
5827                add.l   #prstab,A0
5828                move    (A0),TSRCVAL(A6)
5829
5830|               break;
5831
5832                bra     F10L114
5833
5834|       default:
5835|               tsrcval = vep->val;
5836
5837F10L122:        move.l  VEP(A6),A0
5838                move    8(A0),TSRCVAL(A6)
5839
5840|       }
5841
5842                .page
5843
5844|               srcval = tsrcval;
5845
5846F10L114:        move    TSRCVAL(A6),SRCVAL(A6)
5847
5848                .page
5849
5850|       if (pt->ipvsrc) {
5851
5852F10L124:        move.l  PT(A6),A0
5853                tst.b   6(A0)
5854                beq     F10L136
5855
5856|               switch (pt->ipvsrc) {
5857
5858                move.l  PT(A6),A0
5859                move.b  6(A0),D0
5860                ext.w   D0
5861                sub     #1,D0
5862                cmp     #9,D0
5863                bhi     F10L144
5864
5865                asl     #2,D0
5866                lea     F10L145,A0
5867                move.l  0(A0,D0.W),A0
5868                jmp     (A0)
5869
5870|               case SM_RAND:
5871|                       ltmp = xgetran(pt_>ipvmlt);
5872
5873F10L139:        move.l  PT(A6),A0
5874                move    4(A0),(sp)
5875                jsr     xgetran
5876                ext.l   D0
5877                move.l  D0,LTMP(A6)
5878
5879|                       break;
5880
5881                bra     F10L137
5882
5883|               case SM_PTCH:
5884|                       ltmp = pch;
5885
5886F10L140:        move    PCH(A6),A0
5887                move.l  A0,LTMP(A6)
5888
5889|                       break;
5890
5891                bra     F10L137
5892
5893                .page
5894
5895|               case SM_FREQ:
5896|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
5897
5898F10L141:        move    PCH(A6),D0
5899                asr     #7,D0
5900                and     #255,D0
5901                move    D0,A0
5902                add.l   A0,A0
5903                move.l  #ptoftab,A1
5904                move    0(A0,A1.l),D0
5905                ext.l   D0
5906                move.l  D0,LTMP(A6)
5907
5908|                       break;
5909
5910                bra     F10L137
5911
5912|               case SM_KVEL:
5913|                       ltmp = veltab[trg];
5914
5915F10L142:        move    TRG(A6),A0
5916                add.l   A0,A0
5917                move.l  #veltab,A1
5918                move    0(A0,A1.l),D0
5919                ext.l   D0
5920                move.l  D0,LTMP(A6)
5921
5922|                       break;
5923
5924                bra     F10L137
5925
5926                .page
5927
5928|               case SM_KPRS:
5929|                       ltmp = prstab[trg];
5930
5931F10L143:        move    TRG(A6),A0
5932                add.l   A0,A0
5933                move.l  #prstab,A1
5934                move    0(A0,A1.l),D0
5935                ext.l   D0
5936                move.l  D0,LTMP(A6)
5937
5938|                       break;
5939
5940                bra     F10L137
5941
5942                .page
5943
5944|               default:
5945|                       ltmp = valents[group | pt->ipvsrc].val;
5946
5947F10L144:        move.l  PT(A6),A0
5948                clr.l   D0
5949                move.b  6(A0),D0
5950                or.w    GROUP(A6),D0
5951                add.l   D0,D0
5952                move.l  D0,D1
5953                lsl.l   #2,D0
5954                add.l   D1,D0
5955                move.l  D0,A0
5956                move.l  #valents,A1
5957                clr.l   D0
5958                move    8(A0,A1.l),D0
5959                move.l  D0,LTMP(A6)
5960
5961|               }
5962
5963
5964                .page
5965
5966|               ltmp = (ltmp * pt->ipvmlt) >> 15;
5967
5968F10L137:        move.l  PT(A6),A0
5969                move.w  4(A0),D0
5970                move.w  LTMP+2(A6),D1
5971                muls    D1,D0
5972                move.l  #15,D1
5973                asr.l   D1,D0
5974                move.l  D0,LTMP(A6)
5975
5976|               ltmp += (long)pt->ipval;
5977
5978                move.l  PT(A6),A0
5979                move    2(A0),D0
5980                ext.l   D0
5981                add.l   D0,LTMP(A6)
5982
5983|               if (ltmp GT (long)VALMAX)
5984|                       ltmp = (long)VALMAX;
5985
5986                cmp.l   #VALMAX,LTMP(A6)
5987                ble     F10L146
5988
5989                move.l  #VALMAX,LTMP(A6)
5990                bra     F10L147
5991
5992|               else if (ltmp LT (long)VALMIN)
5993|                       ltmp = (long)VALMIN;
5994
5995F10L146:        cmp.l   #VALMIN,LTMP(A6)
5996                bge     F10L147
5997
5998                move.l  #VALMIN,LTMP(A6)
5999
6000|               tfpval = (short)ltmp;
6001
6002F10L147:        move.w  LTMP+2(A6),TFPVAL(A6)
6003                bra     F10L149
6004
6005|       } else {
6006
6007|               tfpval = pt->ipval;
6008
6009F10L136:        move.l  PT(A6),A0
6010                move    2(A0),TFPVAL(A6)
6011
6012|       }
6013
6014                .page
6015
6016|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
6017|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
6018
6019F10L149:        move.l  PT(A6),A0
6020                move.w  (A0),D0
6021                move.w  D0,D2
6022                andi.w  #0xFFF0,D0
6023                move.w  timemlt,D1
6024                muls    D1,D0
6025                move.l  #15,D1
6026                asr.l   D1,D0
6027                move    D0,R_FPMANT
6028
6029|       fpexp = expbit[pt->iptim & 0x000F];
6030
6031                and     #0x000F,D2
6032                move    D2,A0
6033                add.l   A0,A0
6034                add.l   #expbit,A0
6035                move    (A0),R_FPEXP
6036
6037                .page
6038
6039|               fp->idfpch = pch;
6040
6041F10L163:        move    PCH(A6),(A_FP)
6042
6043|               fpval = tfpval;
6044
6045                move    TFPVAL(A6),R_FPVAL
6046
6047                .page
6048
6049                move.b  5(A_FP),D0
6050                ext.w   D0
6051                sub.w   #1,D0
6052                movea.l PT(A6),A0
6053
6054|       oldi = setipl(FPU_DI);
6055
6056                move    sr,OLDI(A6)
6057                move    #FPU_DI,sr
6058
6059F10L168:        clr.b   10(A0)
6060                add.l   #12,a0
6061                dbra    D0,F10L168
6062
6063                .page
6064
6065|       fp->idftmd ^= I_NVBITS;
6066
6067F10L165:        eor.b   #24,7(A_FP)
6068
6069|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
6070
6071                move.b  7(A_FP),R_FPCTL
6072                and     #28,R_FPCTL
6073                or      #3,R_FPCTL
6074
6075|       fp->idfcpt = fp->idfpt1;
6076
6077                move.b  6(A_FP),8(A_FP)
6078
6079|       fp->idftmd |= I_ACTIVE;
6080
6081                or.b    #2,7(A_FP)
6082
6083|       fp->idftrf = trg;
6084
6085                move    TRG(A6),10(A_FP)
6086
6087|       |(fpu + (long)FPU_TCV1) = srcval;
6088
6089                move    SRCVAL(A6),0x8(A_FPU)
6090
6091|       ++octype;
6092
6093                add     #1,OCTYPE(A6)
6094
6095|       |(fpu + (long)FPU_TSF1) = mltval;
6096
6097                move    MLTVAL(A6),0xA(A_FPU)
6098
6099|       ++octype;
6100
6101                add     #1,OCTYPE(A6)
6102
6103|       |(fpu + (long)FPU_TMNT) = fpmant;
6104
6105                move    R_FPMANT,0x14(A_FPU)
6106
6107|       ++octype;
6108
6109                add     #1,OCTYPE(A6)
6110
6111|       |(fpu + (long)FPU_TEXP) = fpexp;
6112
6113                move    R_FPEXP,0x16(A_FPU)
6114
6115|       ++octype;
6116
6117                add     #1,OCTYPE(A6)
6118
6119                .page
6120
6121|       if (fp->idftmd & I_VNSUBN)
6122
6123                btst    #3,7(A_FP)
6124                beq     F10L169
6125
6126|               |(fpu + (long)FPU_TNV1) = fpval;
6127
6128                move    R_FPVAL,0x1C(A_FPU)
6129                bra     F10L170
6130
6131|       else
6132|               |(fpu + (long)FPU_TNV0) = fpval;
6133
6134F10L169:        move    R_FPVAL,2(A_FPU)
6135
6136|       ++octype;
6137
6138F10L170:        add     #1,OCTYPE(A6)
6139
6140|       |(fpu + (long)FPU_TCTL) = fpctl;
6141
6142                move    R_FPCTL,(A_FPU)
6143
6144|       setipl(oldi);
6145
6146                move    OLDI(A6),sr
6147
6148                .page
6149| ------------------------------------------------------------------------------
6150| Start function 11 -- Ind 6
6151| ------------------------------------------------------------------------------
6152
6153|    if (ip->idhfnc[11].idftmd & I_TM_KEY) {
6154
6155FN11:           move.l  IP(A6),A0
6156                move.b  225(A0),D0
6157                move.w  TAG(A6),D1
6158                eor.w   D1,D0
6159                btst    #0,D0
6160                bne     FN11A
6161
6162                jmp     FN12
6163
6164|       vp = (vce << 4) + 15;
6165
6166FN11A:          move    VCE(A6),D0
6167                asl     #4,D0
6168                add.w   #15,D0
6169                move    D0,VP(A6)
6170
6171|       fpu = io_fpu + FPU_OFNC + (vp << 4);
6172
6173                asl     #5,D0
6174                ext.l   D0
6175                move.l  D0,A_FPU
6176                add.l   #io_fpu+0x4000,A_FPU
6177
6178|       fp = &ip->idhfnc[11];
6179
6180                move.l  #132,A_FP
6181                add.l   IP(A6),A_FP
6182                add.l   #86,A_FP
6183
6184|       pt = &ip->idhpnt[fp->idfpt1];
6185
6186                clr.l   D0
6187                move.b  6(A_FP),D0
6188                lsl.l   #2,D0
6189                move.l  D0,D1
6190                add.l   D0,D0
6191                add.l   D1,D0
6192                add.l   IP(A6),D0
6193                add.l   #242,D0
6194                move.l  D0,PT(A6)
6195
6196                .page
6197
6198|       srcnum = group | fp->idfsrc;
6199
6200                move.w  GROUP(A6),D0
6201                ext.l   D0
6202                clr.l   D1
6203                move.b  4(A_FP),D1
6204                or      D1,D0
6205                move    D0,SRCNUM(A6)
6206
6207|       vep = &valents[srcnum];
6208
6209                add.l   D0,D0
6210                move.l  D0,D1
6211                lsl.l   #2,D0
6212                add.l   D1,D0
6213                add.l   #valents,D0
6214                move.l  D0,VEP(A6)
6215
6216|       smp = vpsms[vp];
6217
6218                move    VP(A6),A0
6219                add.l   A0,A0
6220                add.l   A0,A0
6221                add.l   #vpsms,A0
6222                move.l  (A0),A_SMP
6223
6224|       if (srcnum NE smp->sm) {
6225
6226                clr     D0
6227                move    10(A_SMP),D0
6228                cmp     SRCNUM(A6),D0
6229                beq     F11L113
6230
6231|               (smp->prv)->nxt = smp->nxt;
6232
6233                move.l  4(A_SMP),A0
6234                move.l  (A_SMP),(A0)
6235
6236|               (smp->nxt)->prv = smp->prv;
6237
6238                move.l  (A_SMP),A0
6239                move.l  4(A_SMP),4(A0)
6240
6241|               smp->prv = (struct sment *)vep;
6242
6243                move.l  VEP(A6),4(A_SMP)
6244
6245|               smp->nxt = vep->nxt;
6246
6247                move.l  VEP(A6),A0
6248                move.l  (A0),(A_SMP)
6249
6250|               (vep->nxt)->prv = smp;
6251
6252                move.l  VEP(A6),A0
6253                move.l  (A0),A0
6254                move.l  A_SMP,4(A0)
6255
6256|               vep->nxt = smp;
6257
6258                move.l  VEP(A6),A0
6259                move.l  A_SMP,(A0)
6260
6261|               smp->sm = srcnum;
6262
6263                move    SRCNUM(A6),10(A_SMP)
6264
6265|       }
6266
6267|       mltval = fp->idfmlt;
6268
6269F11L113:        move    2(A_FP),MLTVAL(A6)
6270
6271                .page
6272
6273|       switch (fp->idfsrc) {
6274
6275                move.b  4(A_FP),D0
6276                ext.w   d0
6277                cmp     #10,D0
6278                bhi     F11L122
6279
6280                asl     #2,D0
6281                lea     F11L123,A0
6282                movea.l 0(A0,D0.W),A0
6283                jmp     (A0)
6284
6285|       case SM_NONE:
6286|               mltval = 0;
6287
6288F11L116:        clr     MLTVAL(A6)
6289
6290|               tsrcval = 0;
6291
6292                clr     TSRCVAL(A6)
6293
6294|               break;
6295
6296                bra     F11L114
6297
6298|       case SM_RAND:
6299|               tsrcval = xgetran(mltval);
6300
6301F11L117:        move    MLTVAL(A6),(sp)
6302                jsr     xgetran
6303                move    D0,TSRCVAL(A6)
6304
6305|               break;
6306
6307                bra     F11L114
6308
6309|       case SM_PTCH:
6310|               tsrcval = pch;
6311
6312F11L118:        move    PCH(A6),TSRCVAL(A6)
6313
6314|               break;
6315
6316                bra     F11L114
6317
6318                .page
6319
6320|       case SM_FREQ:
6321|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
6322
6323F11L119:        move    PCH(A6),D0
6324                asr     #7,D0
6325                and     #255,D0
6326                move    D0,A0
6327                add.l   A0,A0
6328                add.l   #ptoftab,A0
6329                move    (A0),TSRCVAL(A6)
6330
6331|               break;
6332
6333                bra     F11L114
6334
6335|       case SM_KVEL:
6336|               tsrcval = veltab[trg];
6337
6338F11L120:        move    TRG(A6),A0
6339                add.l   A0,A0
6340                add.l   #veltab,A0
6341                move    (A0),TSRCVAL(A6)
6342
6343|               break;
6344
6345                bra     F11L114
6346
6347|       case SM_KPRS:
6348|               tsrcval = prstab[trg];
6349
6350F11L121:        move    TRG(A6),A0
6351                add.l   A0,A0
6352                add.l   #prstab,A0
6353                move    (A0),TSRCVAL(A6)
6354
6355|               break;
6356
6357                bra     F11L114
6358
6359|       default:
6360|               tsrcval = vep->val;
6361
6362F11L122:        move.l  VEP(A6),A0
6363                move    8(A0),TSRCVAL(A6)
6364
6365|       }
6366
6367                .page
6368
6369|               srcval = tsrcval;
6370
6371F11L114:        move    TSRCVAL(A6),SRCVAL(A6)
6372
6373                .page
6374
6375|       if (pt->ipvsrc) {
6376
6377F11L124:        move.l  PT(A6),A0
6378                tst.b   6(A0)
6379                beq     F11L136
6380
6381|               switch (pt->ipvsrc) {
6382
6383                move.l  PT(A6),A0
6384                move.b  6(A0),D0
6385                ext.w   D0
6386                sub     #1,D0
6387                cmp     #9,D0
6388                bhi     F11L144
6389
6390                asl     #2,D0
6391                lea     F11L145,A0
6392                move.l  0(A0,D0.W),A0
6393                jmp     (A0)
6394
6395|               case SM_RAND:
6396|                       ltmp = xgetran(pt_>ipvmlt);
6397
6398F11L139:        move.l  PT(A6),A0
6399                move    4(A0),(sp)
6400                jsr     xgetran
6401                ext.l   D0
6402                move.l  D0,LTMP(A6)
6403
6404|                       break;
6405
6406                bra     F11L137
6407
6408|               case SM_PTCH:
6409|                       ltmp = pch;
6410
6411F11L140:        move    PCH(A6),A0
6412                move.l  A0,LTMP(A6)
6413
6414|                       break;
6415
6416                bra     F11L137
6417
6418                .page
6419
6420|               case SM_FREQ:
6421|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
6422
6423F11L141:        move    PCH(A6),D0
6424                asr     #7,D0
6425                and     #255,D0
6426                move    D0,A0
6427                add.l   A0,A0
6428                move.l  #ptoftab,A1
6429                move    0(A0,A1.l),D0
6430                ext.l   D0
6431                move.l  D0,LTMP(A6)
6432
6433|                       break;
6434
6435                bra     F11L137
6436
6437|               case SM_KVEL:
6438|                       ltmp = veltab[trg];
6439
6440F11L142:        move    TRG(A6),A0
6441                add.l   A0,A0
6442                move.l  #veltab,A1
6443                move    0(A0,A1.l),D0
6444                ext.l   D0
6445                move.l  D0,LTMP(A6)
6446
6447|                       break;
6448
6449                bra     F11L137
6450
6451                .page
6452
6453|               case SM_KPRS:
6454|                       ltmp = prstab[trg];
6455
6456F11L143:        move    TRG(A6),A0
6457                add.l   A0,A0
6458                move.l  #prstab,A1
6459                move    0(A0,A1.l),D0
6460                ext.l   D0
6461                move.l  D0,LTMP(A6)
6462
6463|                       break;
6464
6465                bra     F11L137
6466
6467                .page
6468
6469|               default:
6470|                       ltmp = valents[group | pt->ipvsrc].val;
6471
6472F11L144:        move.l  PT(A6),A0
6473                clr.l   D0
6474                move.b  6(A0),D0
6475                or.w    GROUP(A6),D0
6476                add.l   D0,D0
6477                move.l  D0,D1
6478                lsl.l   #2,D0
6479                add.l   D1,D0
6480                move.l  D0,A0
6481                move.l  #valents,A1
6482                clr.l   D0
6483                move    8(A0,A1.l),D0
6484                move.l  D0,LTMP(A6)
6485
6486|               }
6487
6488
6489                .page
6490
6491|               ltmp = (ltmp * pt->ipvmlt) >> 15;
6492
6493F11L137:        move.l  PT(A6),A0
6494                move.w  4(A0),D0
6495                move.w  LTMP+2(A6),D1
6496                muls    D1,D0
6497                move.l  #15,D1
6498                asr.l   D1,D0
6499                move.l  D0,LTMP(A6)
6500
6501|               ltmp += (long)pt->ipval;
6502
6503                move.l  PT(A6),A0
6504                move    2(A0),D0
6505                ext.l   D0
6506                add.l   D0,LTMP(A6)
6507
6508|               if (ltmp GT (long)VALMAX)
6509|                       ltmp = (long)VALMAX;
6510
6511                cmp.l   #VALMAX,LTMP(A6)
6512                ble     F11L146
6513
6514                move.l  #VALMAX,LTMP(A6)
6515                bra     F11L147
6516
6517|               else if (ltmp LT (long)VALMIN)
6518|                       ltmp = (long)VALMIN;
6519
6520F11L146:        cmp.l   #VALMIN,LTMP(A6)
6521                bge     F11L147
6522
6523                move.l  #VALMIN,LTMP(A6)
6524
6525|               tfpval = (short)ltmp;
6526
6527F11L147:        move.w  LTMP+2(A6),TFPVAL(A6)
6528                bra     F11L149
6529
6530|       } else {
6531
6532|               tfpval = pt->ipval;
6533
6534F11L136:        move.l  PT(A6),A0
6535                move    2(A0),TFPVAL(A6)
6536
6537|       }
6538
6539                .page
6540
6541|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
6542|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
6543
6544F11L149:        move.l  PT(A6),A0
6545                move.w  (A0),D0
6546                move.w  D0,D2
6547                andi.w  #0xFFF0,D0
6548                move.w  timemlt,D1
6549                muls    D1,D0
6550                move.l  #15,D1
6551                asr.l   D1,D0
6552                move    D0,R_FPMANT
6553
6554|       fpexp = expbit[pt->iptim & 0x000F];
6555
6556                and     #0x000F,D2
6557                move    D2,A0
6558                add.l   A0,A0
6559                add.l   #expbit,A0
6560                move    (A0),R_FPEXP
6561
6562                .page
6563
6564|               fp->idfpch = pch;
6565
6566F11L163:        move    PCH(A6),(A_FP)
6567
6568|               fpval = tfpval;
6569
6570                move    TFPVAL(A6),R_FPVAL
6571
6572                .page
6573
6574                move.b  5(A_FP),D0
6575                ext.w   D0
6576                sub.w   #1,D0
6577                movea.l PT(A6),A0
6578
6579|       oldi = setipl(FPU_DI);
6580
6581                move    sr,OLDI(A6)
6582                move    #FPU_DI,sr
6583
6584F11L168:        clr.b   10(A0)
6585                add.l   #12,a0
6586                dbra    D0,F11L168
6587
6588                .page
6589
6590|       fp->idftmd ^= I_NVBITS;
6591
6592F11L165:        eor.b   #24,7(A_FP)
6593
6594|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
6595
6596                move.b  7(A_FP),R_FPCTL
6597                and     #28,R_FPCTL
6598                or      #3,R_FPCTL
6599
6600|       fp->idfcpt = fp->idfpt1;
6601
6602                move.b  6(A_FP),8(A_FP)
6603
6604|       fp->idftmd |= I_ACTIVE;
6605
6606                or.b    #2,7(A_FP)
6607
6608|       fp->idftrf = trg;
6609
6610                move    TRG(A6),10(A_FP)
6611
6612|       |(fpu + (long)FPU_TCV1) = srcval;
6613
6614                move    SRCVAL(A6),0x8(A_FPU)
6615
6616|       ++octype;
6617
6618                add     #1,OCTYPE(A6)
6619
6620|       |(fpu + (long)FPU_TSF1) = mltval;
6621
6622                move    MLTVAL(A6),0xA(A_FPU)
6623
6624|       ++octype;
6625
6626                add     #1,OCTYPE(A6)
6627
6628|       |(fpu + (long)FPU_TMNT) = fpmant;
6629
6630                move    R_FPMANT,0x14(A_FPU)
6631
6632|       ++octype;
6633
6634                add     #1,OCTYPE(A6)
6635
6636|       |(fpu + (long)FPU_TEXP) = fpexp;
6637
6638                move    R_FPEXP,0x16(A_FPU)
6639
6640|       ++octype;
6641
6642                add     #1,OCTYPE(A6)
6643
6644                .page
6645
6646|       if (fp->idftmd & I_VNSUBN)
6647
6648                btst    #3,7(A_FP)
6649                beq     F11L169
6650
6651|               |(fpu + (long)FPU_TNV1) = fpval;
6652
6653                move    R_FPVAL,0x1C(A_FPU)
6654                bra     F11L170
6655
6656|       else
6657|               |(fpu + (long)FPU_TNV0) = fpval;
6658
6659F11L169:        move    R_FPVAL,2(A_FPU)
6660
6661|       ++octype;
6662
6663F11L170:        add     #1,OCTYPE(A6)
6664
6665|       |(fpu + (long)FPU_TCTL) = fpctl;
6666
6667                move    R_FPCTL,(A_FPU)
6668
6669|       setipl(oldi);
6670
6671                move    OLDI(A6),sr
6672
6673                .page
6674| ------------------------------------------------------------------------------
6675| Start function 12 -- Level
6676| ------------------------------------------------------------------------------
6677
6678|    if (ip->idhfnc[12].idftmd & I_TM_KEY) {
6679
6680FN12:           move.l  IP(A6),A0
6681                move.b  237(A0),D0
6682                move.w  TAG(A6),D1
6683                eor.w   D1,D0
6684                btst    #0,D0
6685                bne     FN12A
6686
6687                jmp     FNEXIT
6688
6689|       vp = (vce << 4) + 2;
6690
6691FN12A:          move    VCE(A6),D0
6692                asl     #4,D0
6693                add.w   #2,D0
6694                move    D0,VP(A6)
6695
6696|       fpu = io_fpu + FPU_OFNC + (vp << 4);
6697
6698                asl     #5,D0
6699                ext.l   D0
6700                move.l  D0,A_FPU
6701                add.l   #io_fpu+0x4000,A_FPU
6702
6703|       fp = &ip->idhfnc[12];
6704
6705                move.l  #144,A_FP
6706                add.l   IP(A6),A_FP
6707                add.l   #86,A_FP
6708
6709|       pt = &ip->idhpnt[fp->idfpt1];
6710
6711                clr.l   D0
6712                move.b  6(A_FP),D0
6713                lsl.l   #2,D0
6714                move.l  D0,D1
6715                add.l   D0,D0
6716                add.l   D1,D0
6717                add.l   IP(A6),D0
6718                add.l   #242,D0
6719                move.l  D0,PT(A6)
6720
6721                .page
6722
6723|       srcnum = group | fp->idfsrc;
6724
6725                move.w  GROUP(A6),D0
6726                ext.l   D0
6727                clr.l   D1
6728                move.b  4(A_FP),D1
6729                or      D1,D0
6730                move    D0,SRCNUM(A6)
6731
6732|       vep = &valents[srcnum];
6733
6734                add.l   D0,D0
6735                move.l  D0,D1
6736                lsl.l   #2,D0
6737                add.l   D1,D0
6738                add.l   #valents,D0
6739                move.l  D0,VEP(A6)
6740
6741|       smp = vpsms[vp];
6742
6743                move    VP(A6),A0
6744                add.l   A0,A0
6745                add.l   A0,A0
6746                add.l   #vpsms,A0
6747                move.l  (A0),A_SMP
6748
6749|       if (srcnum NE smp->sm) {
6750
6751                clr     D0
6752                move    10(A_SMP),D0
6753                cmp     SRCNUM(A6),D0
6754                beq     F12L113
6755
6756|               (smp->prv)->nxt = smp->nxt;
6757
6758                move.l  4(A_SMP),A0
6759                move.l  (A_SMP),(A0)
6760
6761|               (smp->nxt)->prv = smp->prv;
6762
6763                move.l  (A_SMP),A0
6764                move.l  4(A_SMP),4(A0)
6765
6766|               smp->prv = (struct sment *)vep;
6767
6768                move.l  VEP(A6),4(A_SMP)
6769
6770|               smp->nxt = vep->nxt;
6771
6772                move.l  VEP(A6),A0
6773                move.l  (A0),(A_SMP)
6774
6775|               (vep->nxt)->prv = smp;
6776
6777                move.l  VEP(A6),A0
6778                move.l  (A0),A0
6779                move.l  A_SMP,4(A0)
6780
6781|               vep->nxt = smp;
6782
6783                move.l  VEP(A6),A0
6784                move.l  A_SMP,(A0)
6785
6786|               smp->sm = srcnum;
6787
6788                move    SRCNUM(A6),10(A_SMP)
6789
6790|       }
6791
6792|       mltval = fp->idfmlt;
6793
6794F12L113:        move    2(A_FP),MLTVAL(A6)
6795
6796                .page
6797
6798|       switch (fp->idfsrc) {
6799
6800                move.b  4(A_FP),D0
6801                ext.w   d0
6802                cmp     #10,D0
6803                bhi     F12L122
6804
6805                asl     #2,D0
6806                lea     F12L123,A0
6807                movea.l 0(A0,D0.W),A0
6808                jmp     (A0)
6809
6810|       case SM_NONE:
6811|               mltval = 0;
6812
6813F12L116:        clr     MLTVAL(A6)
6814
6815|               tsrcval = 0;
6816
6817                clr     TSRCVAL(A6)
6818
6819|               break;
6820
6821                bra     F12L114
6822
6823|       case SM_RAND:
6824|               tsrcval = xgetran(mltval);
6825
6826F12L117:        move    MLTVAL(A6),(sp)
6827                jsr     xgetran
6828                move    D0,TSRCVAL(A6)
6829
6830|               break;
6831
6832                bra     F12L114
6833
6834|       case SM_PTCH:
6835|               tsrcval = pch;
6836
6837F12L118:        move    PCH(A6),TSRCVAL(A6)
6838
6839|               break;
6840
6841                bra     F12L114
6842
6843                .page
6844
6845|       case SM_FREQ:
6846|               tsrcval = ptoftab[(pch >> 7) & 0x00FF];
6847
6848F12L119:        move    PCH(A6),D0
6849                asr     #7,D0
6850                and     #255,D0
6851                move    D0,A0
6852                add.l   A0,A0
6853                add.l   #ptoftab,A0
6854                move    (A0),TSRCVAL(A6)
6855
6856|               break;
6857
6858                bra     F12L114
6859
6860|       case SM_KVEL:
6861|               tsrcval = veltab[trg];
6862
6863F12L120:        move    TRG(A6),A0
6864                add.l   A0,A0
6865                add.l   #veltab,A0
6866                move    (A0),TSRCVAL(A6)
6867
6868|               break;
6869
6870                bra     F12L114
6871
6872|       case SM_KPRS:
6873|               tsrcval = prstab[trg];
6874
6875F12L121:        move    TRG(A6),A0
6876                add.l   A0,A0
6877                add.l   #prstab,A0
6878                move    (A0),TSRCVAL(A6)
6879
6880|               break;
6881
6882                bra     F12L114
6883
6884|       default:
6885|               tsrcval = vep->val;
6886
6887F12L122:        move.l  VEP(A6),A0
6888                move    8(A0),TSRCVAL(A6)
6889
6890|       }
6891
6892                .page
6893
6894|               srcval = tsrcval;
6895
6896F12L114:        move    TSRCVAL(A6),SRCVAL(A6)
6897
6898                .page
6899
6900|       if (pt->ipvsrc) {
6901
6902F12L124:        move.l  PT(A6),A0
6903                tst.b   6(A0)
6904                beq     F12L136
6905
6906|               switch (pt->ipvsrc) {
6907
6908                move.l  PT(A6),A0
6909                move.b  6(A0),D0
6910                ext.w   D0
6911                sub     #1,D0
6912                cmp     #9,D0
6913                bhi     F12L144
6914
6915                asl     #2,D0
6916                lea     F12L145,A0
6917                move.l  0(A0,D0.W),A0
6918                jmp     (A0)
6919
6920|               case SM_RAND:
6921|                       ltmp = xgetran(pt_>ipvmlt);
6922
6923F12L139:        move.l  PT(A6),A0
6924                move    4(A0),(sp)
6925                jsr     xgetran
6926                ext.l   D0
6927                move.l  D0,LTMP(A6)
6928
6929|                       break;
6930
6931                bra     F12L137
6932
6933|               case SM_PTCH:
6934|                       ltmp = pch;
6935
6936F12L140:        move    PCH(A6),A0
6937                move.l  A0,LTMP(A6)
6938
6939|                       break;
6940
6941                bra     F12L137
6942
6943                .page
6944
6945|               case SM_FREQ:
6946|                       ltmp = ptoftab[(pch >> 7) & 0x00FF];
6947
6948F12L141:        move    PCH(A6),D0
6949                asr     #7,D0
6950                and     #255,D0
6951                move    D0,A0
6952                add.l   A0,A0
6953                move.l  #ptoftab,A1
6954                move    0(A0,A1.l),D0
6955                ext.l   D0
6956                move.l  D0,LTMP(A6)
6957
6958|                       break;
6959
6960                bra     F12L137
6961
6962|               case SM_KVEL:
6963|                       ltmp = veltab[trg];
6964
6965F12L142:        move    TRG(A6),A0
6966                add.l   A0,A0
6967                move.l  #veltab,A1
6968                move    0(A0,A1.l),D0
6969                ext.l   D0
6970                move.l  D0,LTMP(A6)
6971
6972|                       break;
6973
6974                bra     F12L137
6975
6976                .page
6977
6978|               case SM_KPRS:
6979|                       ltmp = prstab[trg];
6980
6981F12L143:        move    TRG(A6),A0
6982                add.l   A0,A0
6983                move.l  #prstab,A1
6984                move    0(A0,A1.l),D0
6985                ext.l   D0
6986                move.l  D0,LTMP(A6)
6987
6988|                       break;
6989
6990                bra     F12L137
6991
6992                .page
6993
6994|               default:
6995|                       ltmp = valents[group | pt->ipvsrc].val;
6996
6997F12L144:        move.l  PT(A6),A0
6998                clr.l   D0
6999                move.b  6(A0),D0
7000                or.w    GROUP(A6),D0
7001                add.l   D0,D0
7002                move.l  D0,D1
7003                lsl.l   #2,D0
7004                add.l   D1,D0
7005                move.l  D0,A0
7006                move.l  #valents,A1
7007                clr.l   D0
7008                move    8(A0,A1.l),D0
7009                move.l  D0,LTMP(A6)
7010
7011|               }
7012
7013
7014                .page
7015
7016|               ltmp = (ltmp * pt->ipvmlt) >> 15;
7017
7018F12L137:        move.l  PT(A6),A0
7019                move.w  4(A0),D0
7020                move.w  LTMP+2(A6),D1
7021                muls    D1,D0
7022                move.l  #15,D1
7023                asr.l   D1,D0
7024                move.l  D0,LTMP(A6)
7025
7026|               ltmp += (long)pt->ipval;
7027
7028                move.l  PT(A6),A0
7029                move    2(A0),D0
7030                ext.l   D0
7031                add.l   D0,LTMP(A6)
7032
7033|               if (ltmp GT (long)VALMAX)
7034|                       ltmp = (long)VALMAX;
7035
7036                cmp.l   #VALMAX,LTMP(A6)
7037                ble     F12L146
7038
7039                move.l  #VALMAX,LTMP(A6)
7040                bra     F12L147
7041
7042|               else if (ltmp LT (long)VALMIN)
7043|                       ltmp = (long)VALMIN;
7044
7045F12L146:        cmp.l   #VALMIN,LTMP(A6)
7046                bge     F12L147
7047
7048                move.l  #VALMIN,LTMP(A6)
7049
7050|               tfpval = (short)ltmp;
7051
7052F12L147:        move.w  LTMP+2(A6),TFPVAL(A6)
7053                bra     F12L149
7054
7055|       } else {
7056
7057|               tfpval = pt->ipval;
7058
7059F12L136:        move.l  PT(A6),A0
7060                move    2(A0),TFPVAL(A6)
7061
7062|       }
7063
7064                .page
7065
7066|       fpmant = (((long)pt->iptom & 0x0000FFF0L)
7067|               | ((long)timemlt & 0x0000FFFFL)) >> 15;
7068
7069F12L149:        move.l  PT(A6),A0
7070                move.w  (A0),D0
7071                move.w  D0,D2
7072                andi.w  #0xFFF0,D0
7073                move.w  timemlt,D1
7074                muls    D1,D0
7075                move.l  #15,D1
7076                asr.l   D1,D0
7077                move    D0,R_FPMANT
7078
7079|       fpexp = expbit[pt->iptim & 0x000F];
7080
7081                and     #0x000F,D2
7082                move    D2,A0
7083                add.l   A0,A0
7084                add.l   #expbit,A0
7085                move    (A0),R_FPEXP
7086
7087                .page
7088
7089|               fp->idfpch = pch;
7090
7091F12L162:        move    PCH(A6),(A_FP)
7092
7093|               fpval = ((tfpval >> 5) - 500) << 6;
7094
7095                move    TFPVAL(A6),R_FPVAL
7096                asr     #5,R_FPVAL
7097                add     #-500,R_FPVAL
7098                asl     #6,R_FPVAL
7099
7100                .page
7101
7102                move.b  5(A_FP),D0
7103                ext.w   D0
7104                sub.w   #1,D0
7105                movea.l PT(A6),A0
7106
7107|       oldi = setipl(FPU_DI);
7108
7109                move    sr,OLDI(A6)
7110                move    #FPU_DI,sr
7111
7112F12L168:        clr.b   10(A0)
7113                add.l   #12,a0
7114                dbra    D0,F12L168
7115
7116                .page
7117
7118|       fp->idftmd ^= I_NVBITS;
7119
7120F12L165:        eor.b   #24,7(A_FP)
7121
7122|       fpctl = (fp->idftmd & (I_NRATIO | I_NVBITS)) | 0x0003;
7123
7124                move.b  7(A_FP),R_FPCTL
7125                and     #28,R_FPCTL
7126                or      #3,R_FPCTL
7127
7128|       fp->idfcpt = fp->idfpt1;
7129
7130                move.b  6(A_FP),8(A_FP)
7131
7132|       fp->idftmd |= I_ACTIVE;
7133
7134                or.b    #2,7(A_FP)
7135
7136|       fp->idftrf = trg;
7137
7138                move    TRG(A6),10(A_FP)
7139
7140|       |(fpu + (long)FPU_TCV1) = srcval;
7141
7142                move    SRCVAL(A6),0x8(A_FPU)
7143
7144|       ++octype;
7145
7146                add     #1,OCTYPE(A6)
7147
7148|       |(fpu + (long)FPU_TSF1) = mltval;
7149
7150                move    MLTVAL(A6),0xA(A_FPU)
7151
7152|       ++octype;
7153
7154                add     #1,OCTYPE(A6)
7155
7156|       |(fpu + (long)FPU_TMNT) = fpmant;
7157
7158                move    R_FPMANT,0x14(A_FPU)
7159
7160|       ++octype;
7161
7162                add     #1,OCTYPE(A6)
7163
7164|       |(fpu + (long)FPU_TEXP) = fpexp;
7165
7166                move    R_FPEXP,0x16(A_FPU)
7167
7168|       ++octype;
7169
7170                add     #1,OCTYPE(A6)
7171
7172                .page
7173
7174|       if (fp->idftmd & I_VNSUBN)
7175
7176                btst    #3,7(A_FP)
7177                beq     F12L169
7178
7179|               |(fpu + (long)FPU_TNV1) = fpval;
7180
7181                move    R_FPVAL,0x1C(A_FPU)
7182                bra     F12L170
7183
7184|       else
7185|               |(fpu + (long)FPU_TNV0) = fpval;
7186
7187F12L169:        move    R_FPVAL,2(A_FPU)
7188
7189|       ++octype;
7190
7191F12L170:        add     #1,OCTYPE(A6)
7192
7193|       |(fpu + (long)FPU_TCTL) = fpctl;
7194
7195                move    R_FPCTL,(A_FPU)
7196
7197|       setipl(oldi);
7198
7199                move    OLDI(A6),sr
7200
7201|    }
7202
7203                .page
7204
7205FNEXIT:         tst.l   (sp)+
7206                movem.l (sp)+,R_FPVAL-R_FPMANT/A_SMP-A_FP
7207                unlk    A6
7208                rts
7209
7210| }
7211
7212                .page
7213
7214                .data
7215
7216| Jump tables for switch statements
7217| ---------------------------------
7218
7219F00L123:        .dc.l   F00L116
7220                .dc.l   F00L117
7221                .dc.l   F00L122
7222                .dc.l   F00L122
7223                .dc.l   F00L122
7224                .dc.l   F00L118
7225                .dc.l   F00L121
7226                .dc.l   F00L120
7227                .dc.l   F00L122
7228                .dc.l   F00L122
7229                .dc.l   F00L119
7230
7231F00L145:        .dc.l   F00L139
7232                .dc.l   F00L144
7233                .dc.l   F00L144
7234                .dc.l   F00L144
7235                .dc.l   F00L140
7236                .dc.l   F00L143
7237                .dc.l   F00L142
7238                .dc.l   F00L144
7239                .dc.l   F00L144
7240                .dc.l   F00L141
7241
7242F01L123:        .dc.l   F01L116
7243                .dc.l   F01L117
7244                .dc.l   F01L122
7245                .dc.l   F01L122
7246                .dc.l   F01L122
7247                .dc.l   F01L118
7248                .dc.l   F01L121
7249                .dc.l   F01L120
7250                .dc.l   F01L122
7251                .dc.l   F01L122
7252                .dc.l   F01L119
7253
7254F01L145:        .dc.l   F01L139
7255                .dc.l   F01L144
7256                .dc.l   F01L144
7257                .dc.l   F01L144
7258                .dc.l   F01L140
7259                .dc.l   F01L143
7260                .dc.l   F01L142
7261                .dc.l   F01L144
7262                .dc.l   F01L144
7263                .dc.l   F01L141
7264
7265F02L123:        .dc.l   F02L116
7266                .dc.l   F02L117
7267                .dc.l   F02L122
7268                .dc.l   F02L122
7269                .dc.l   F02L122
7270                .dc.l   F02L118
7271                .dc.l   F02L121
7272                .dc.l   F02L120
7273                .dc.l   F02L122
7274                .dc.l   F02L122
7275                .dc.l   F02L119
7276
7277F02L145:        .dc.l   F02L139
7278                .dc.l   F02L144
7279                .dc.l   F02L144
7280                .dc.l   F02L144
7281                .dc.l   F02L140
7282                .dc.l   F02L143
7283                .dc.l   F02L142
7284                .dc.l   F02L144
7285                .dc.l   F02L144
7286                .dc.l   F02L141
7287
7288F03L123:        .dc.l   F03L116
7289                .dc.l   F03L117
7290                .dc.l   F03L122
7291                .dc.l   F03L122
7292                .dc.l   F03L122
7293                .dc.l   F03L118
7294                .dc.l   F03L121
7295                .dc.l   F03L120
7296                .dc.l   F03L122
7297                .dc.l   F03L122
7298                .dc.l   F03L119
7299
7300F03L145:        .dc.l   F03L139
7301                .dc.l   F03L144
7302                .dc.l   F03L144
7303                .dc.l   F03L144
7304                .dc.l   F03L140
7305                .dc.l   F03L143
7306                .dc.l   F03L142
7307                .dc.l   F03L144
7308                .dc.l   F03L144
7309                .dc.l   F03L141
7310
7311F04L123:        .dc.l   F04L116
7312                .dc.l   F04L117
7313                .dc.l   F04L122
7314                .dc.l   F04L122
7315                .dc.l   F04L122
7316                .dc.l   F04L118
7317                .dc.l   F04L121
7318                .dc.l   F04L120
7319                .dc.l   F04L122
7320                .dc.l   F04L122
7321                .dc.l   F04L119
7322
7323F04L145:        .dc.l   F04L139
7324                .dc.l   F04L144
7325                .dc.l   F04L144
7326                .dc.l   F04L144
7327                .dc.l   F04L140
7328                .dc.l   F04L143
7329                .dc.l   F04L142
7330                .dc.l   F04L144
7331                .dc.l   F04L144
7332                .dc.l   F04L141
7333
7334F05L123:        .dc.l   F05L116
7335                .dc.l   F05L117
7336                .dc.l   F05L122
7337                .dc.l   F05L122
7338                .dc.l   F05L122
7339                .dc.l   F05L118
7340                .dc.l   F05L121
7341                .dc.l   F05L120
7342                .dc.l   F05L122
7343                .dc.l   F05L122
7344                .dc.l   F05L119
7345
7346F05L145:        .dc.l   F05L139
7347                .dc.l   F05L144
7348                .dc.l   F05L144
7349                .dc.l   F05L144
7350                .dc.l   F05L140
7351                .dc.l   F05L143
7352                .dc.l   F05L142
7353                .dc.l   F05L144
7354                .dc.l   F05L144
7355                .dc.l   F05L141
7356
7357F06L123:        .dc.l   F06L116
7358                .dc.l   F06L117
7359                .dc.l   F06L122
7360                .dc.l   F06L122
7361                .dc.l   F06L122
7362                .dc.l   F06L118
7363                .dc.l   F06L121
7364                .dc.l   F06L120
7365                .dc.l   F06L122
7366                .dc.l   F06L122
7367                .dc.l   F06L119
7368
7369F06L145:        .dc.l   F06L139
7370                .dc.l   F06L144
7371                .dc.l   F06L144
7372                .dc.l   F06L144
7373                .dc.l   F06L140
7374                .dc.l   F06L143
7375                .dc.l   F06L142
7376                .dc.l   F06L144
7377                .dc.l   F06L144
7378                .dc.l   F06L141
7379
7380F07L123:        .dc.l   F07L116
7381                .dc.l   F07L117
7382                .dc.l   F07L122
7383                .dc.l   F07L122
7384                .dc.l   F07L122
7385                .dc.l   F07L118
7386                .dc.l   F07L121
7387                .dc.l   F07L120
7388                .dc.l   F07L122
7389                .dc.l   F07L122
7390                .dc.l   F07L119
7391
7392F07L145:        .dc.l   F07L139
7393                .dc.l   F07L144
7394                .dc.l   F07L144
7395                .dc.l   F07L144
7396                .dc.l   F07L140
7397                .dc.l   F07L143
7398                .dc.l   F07L142
7399                .dc.l   F07L144
7400                .dc.l   F07L144
7401                .dc.l   F07L141
7402
7403F08L123:        .dc.l   F08L116
7404                .dc.l   F08L117
7405                .dc.l   F08L122
7406                .dc.l   F08L122
7407                .dc.l   F08L122
7408                .dc.l   F08L118
7409                .dc.l   F08L121
7410                .dc.l   F08L120
7411                .dc.l   F08L122
7412                .dc.l   F08L122
7413                .dc.l   F08L119
7414
7415F08L145:        .dc.l   F08L139
7416                .dc.l   F08L144
7417                .dc.l   F08L144
7418                .dc.l   F08L144
7419                .dc.l   F08L140
7420                .dc.l   F08L143
7421                .dc.l   F08L142
7422                .dc.l   F08L144
7423                .dc.l   F08L144
7424                .dc.l   F08L141
7425
7426F09L123:        .dc.l   F09L116
7427                .dc.l   F09L117
7428                .dc.l   F09L122
7429                .dc.l   F09L122
7430                .dc.l   F09L122
7431                .dc.l   F09L118
7432                .dc.l   F09L121
7433                .dc.l   F09L120
7434                .dc.l   F09L122
7435                .dc.l   F09L122
7436                .dc.l   F09L119
7437
7438F09L145:        .dc.l   F09L139
7439                .dc.l   F09L144
7440                .dc.l   F09L144
7441                .dc.l   F09L144
7442                .dc.l   F09L140
7443                .dc.l   F09L143
7444                .dc.l   F09L142
7445                .dc.l   F09L144
7446                .dc.l   F09L144
7447                .dc.l   F09L141
7448
7449F10L123:        .dc.l   F10L116
7450                .dc.l   F10L117
7451                .dc.l   F10L122
7452                .dc.l   F10L122
7453                .dc.l   F10L122
7454                .dc.l   F10L118
7455                .dc.l   F10L121
7456                .dc.l   F10L120
7457                .dc.l   F10L122
7458                .dc.l   F10L122
7459                .dc.l   F10L119
7460
7461F10L145:        .dc.l   F10L139
7462                .dc.l   F10L144
7463                .dc.l   F10L144
7464                .dc.l   F10L144
7465                .dc.l   F10L140
7466                .dc.l   F10L143
7467                .dc.l   F10L142
7468                .dc.l   F10L144
7469                .dc.l   F10L144
7470                .dc.l   F10L141
7471
7472F11L123:        .dc.l   F11L116
7473                .dc.l   F11L117
7474                .dc.l   F11L122
7475                .dc.l   F11L122
7476                .dc.l   F11L122
7477                .dc.l   F11L118
7478                .dc.l   F11L121
7479                .dc.l   F11L120
7480                .dc.l   F11L122
7481                .dc.l   F11L122
7482                .dc.l   F11L119
7483
7484F11L145:        .dc.l   F11L139
7485                .dc.l   F11L144
7486                .dc.l   F11L144
7487                .dc.l   F11L144
7488                .dc.l   F11L140
7489                .dc.l   F11L143
7490                .dc.l   F11L142
7491                .dc.l   F11L144
7492                .dc.l   F11L144
7493                .dc.l   F11L141
7494
7495F12L123:        .dc.l   F12L116
7496                .dc.l   F12L117
7497                .dc.l   F12L122
7498                .dc.l   F12L122
7499                .dc.l   F12L122
7500                .dc.l   F12L118
7501                .dc.l   F12L121
7502                .dc.l   F12L120
7503                .dc.l   F12L122
7504                .dc.l   F12L122
7505                .dc.l   F12L119
7506
7507F12L145:        .dc.l   F12L139
7508                .dc.l   F12L144
7509                .dc.l   F12L144
7510                .dc.l   F12L144
7511                .dc.l   F12L140
7512                .dc.l   F12L143
7513                .dc.l   F12L142
7514                .dc.l   F12L144
7515                .dc.l   F12L144
7516                .dc.l   F12L141
7517
7518| vbtab -- vbuf pointer table -- indexed by voice number
7519| -----    ---------------------------------------------
7520vbtab:          .dc.l   vbufs
7521                .dc.l   vbufs+VBLEN
7522                .dc.l   vbufs+(2*VBLEN)
7523                .dc.l   vbufs+(3*VBLEN)
7524                .dc.l   vbufs+(4*VBLEN)
7525                .dc.l   vbufs+(5*VBLEN)
7526                .dc.l   vbufs+(6*VBLEN)
7527                .dc.l   vbufs+(7*VBLEN)
7528                .dc.l   vbufs+(8*VBLEN)
7529                .dc.l   vbufs+(9*VBLEN)
7530                .dc.l   vbufs+(10*VBLEN)
7531                .dc.l   vbufs+(11*VBLEN)
7532
7533                .end
Note: See TracBrowser for help on using the repository browser.