home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 640a.lha / NotePlayer_v1.0 / ptplay.asm < prev   
Assembly Source File  |  1992-05-10  |  39KB  |  1,505 lines

  1. * Player code for Protracker modules, using the NotePlayer standard
  2. * For your own health, don't look too closely at this code.
  3. * It's definitely due for a rewrite.
  4. * This is straight out of MultiPlayer, so you'll have to clean up some loose
  5. * ends if you want to actually use it.  (You'll see what I mean...)
  6.  
  7.         include "exec/types.i"
  8.         include "exec/ables.i"
  9.         include "exec/execbase.i"
  10.         include "player.i"
  11.         include "bry/macros.i"
  12.  
  13.         xref    _intena
  14.         xref    modmem,modend,intsongpos,intrepeat,getfreqmodspeed,hookfunc
  15.         xref    ntgetsongname,ntgetsongauthor,intflashnote,intflashsample,intflashscroll,changetintcia
  16.         xref    scrollmod,scrolllines,notetab,modflags,filter,modtype
  17.  
  18.         xdef    ntstart,r_ptfilter
  19.  
  20.         code    text
  21.  
  22. ntstart:
  23.         plstartlock
  24.         ori.b   #MTF_PROTRACKER!MTF_FILTER,modtype(a4)
  25.         plstartret 9$
  26.  
  27.         dc.l    gmod_GetScroll+4
  28. 9$      gmodbra init                    ; InitMusic
  29.         gmodbra start                   ; StartMusic
  30.         gmodbra mt_stop                 ; StopMusic
  31.         gmodbra fin                     ; EndMusic
  32.         gmodbra noteplayersave          ; NotePlayer
  33.         gmodq   1                       ; ContinueMusic
  34.         gmodnop
  35.         gmodnop
  36.         gmodnop
  37.         gmodnop
  38.         gmodnop
  39.         gmodnop
  40.         gmodnop
  41.         gmodbra ntgetsongname           ; GetSongName
  42.         gmodbra ntgetsongauthor         ; GetSongAuthor
  43.         gmodbra getfreqmodspeed         ; GetFrequency
  44.         gmodbra mt_music                ; TimerTick
  45.         gmodbra \makername              ; GetMakerName
  46.         gmodbra \hook                   ; Hook
  47.         gmodbra \jump
  48.         gmodnop
  49.         ml      scroll(pc),d0
  50.         rts
  51.  
  52. \hook
  53.         move.l  #GMODHF_REPEAT!GMODHF_SEQUENCE,d0
  54.         rts
  55.  
  56. \makername
  57.         lea     name(pc),a0
  58.         move.l  a0,d0
  59.         rts
  60.  
  61. \jump
  62.         DISABLE a0
  63.         clr.w   mt_PatternPos
  64.         clr.b   mt_PBreakPos
  65.         clr.b   mt_PosJumpFlag
  66.         move.L  mt_SongDataPtr(PC),A0
  67.         suba.w  seqadj(pc),a0
  68.         moveq   #0,d0
  69.         move.b  $3b6(a0),d0
  70.         cmp.l   d0,d1
  71.         blo.s   \jumpok
  72.         cq      d1
  73. \jumpok
  74.         move.b  d1,mt_SongPos
  75.         exg     d1,d0
  76.         jsr     intsongpos
  77.         ENABLE  a0
  78.         mq      #1,d1
  79.         rts
  80.  
  81.  
  82. ; This is THE ONLY 100% FIXED VERSION of the PROTRACKER PLAYROUTINE!!!
  83. *                  ^^^^^^^^^^ (yeah right - BAF)
  84. ;
  85. ; Please spread this WORLDWIDE as we are are fed up with utilities
  86. ; using the bugged playroutine supplied with the original Protracker
  87. ; release archieve.
  88. ;
  89. ; Some utils I hope to see with the 100% FIXED playroutine SOON:
  90. ;
  91. ; PTPlayer  -command by TSM/Vision
  92. ; Chameleon Music Player (ChamPlay)
  93. ; Noiseplayer by TRSI
  94. ;
  95. ; ...and all other utils playing PROTRACKER MODULES!!!
  96. ;
  97. ; ///BUG/// -*- N E T W O R K -*-
  98. ;
  99. ; Cool musicians write to: Noiseless
  100. ;                          Box 5036
  101. ;                          6021 Alesund
  102. ;                          Norway
  103.  
  104.  
  105.  
  106.  
  107. ;********************************************  ; 100% FIXED VERSION
  108. ;* ----- Protracker V1.1B Playroutine ----- *
  109. ;* Lars "Zap" Hamre/Amiga Freelancers 1991  *
  110. ;* Bekkeliveien 10, N-2010 STRØMMEN, Norway *
  111. ;********************************************
  112.  
  113. ; VBlank Version 2.01:
  114.  
  115. ; Call mt_init to initialize the routine, then call mt_music on
  116. ; each vertical blank (50 Hz). To end the song and turn off all
  117. ; voices, call mt_end.
  118.  
  119. ; This playroutine is not very fast, optimized or well commented,
  120. ; but all the new commands in PT1.1A should work.
  121. ; If it's not good enough, you'll have to change it yourself.
  122. ; We'll try to write a faster routine soon...
  123.  
  124. ; Changes from V1.0C playroutine:
  125. ; - Vibrato depth changed to be compatible with Noisetracker 2.0.
  126. ;   You'll have to double all vib. depths on old PT modules.
  127. ; - Funk Repeat changed to Invert Loop.
  128. ; - Period set back earlier when stopping an effect.
  129.  
  130. n_note          EQU     0  ; W
  131. n_cmd           EQU     2  ; W
  132. n_cmdlo         EQU     3  ; B
  133. n_start         EQU     4  ; L
  134. n_length        EQU     8  ; W
  135. n_loopstart     EQU     10 ; L
  136. n_replen        EQU     14 ; W
  137. n_period        EQU     16 ; W
  138. n_finetune      EQU     18 ; B
  139. n_volume        EQU     19 ; B
  140. n_dmabit        EQU     20 ; W
  141. n_toneportdirec EQU     22 ; B
  142. n_toneportspeed EQU     23 ; B
  143. n_wantedperiod  EQU     24 ; W
  144. n_vibratocmd    EQU     26 ; B
  145. n_vibratopos    EQU     27 ; B
  146. n_tremolocmd    EQU     28 ; B
  147. n_tremolopos    EQU     29 ; B
  148. n_wavecontrol   EQU     30 ; B
  149. n_glissfunk     EQU     31 ; B
  150. n_sampleoffset  EQU     32 ; B
  151. n_pattpos       EQU     33 ; B
  152. n_loopcount     EQU     34 ; B
  153. n_funkoffset    EQU     35 ; B
  154. n_wavestart     EQU     36 ; L
  155. n_reallength    EQU     40 ; W
  156. n_channelno     EQU     42 ; W
  157.  
  158. noteplayersave
  159.         move.l  a0,noteplayer
  160.         moveq   #1,d0
  161.         rts
  162.  
  163. init    movem.l d2/a2-a3,-(sp)
  164.  
  165.         move.l  noteplayer(pc),a1       ; Initialize the NotePlayer
  166.         sub.l   a0,a0
  167.         moveq   #4,d0
  168.         jsr     NoteInit(a1)
  169.         tst.l   d0
  170.         bnz     initout
  171.  
  172.         clr.l   scroll
  173.  
  174.         move.l  modmem,a0               ;
  175.         MOVE.L  A0,mt_SongDataPtr
  176.         move.l  modend,a3
  177.         subq.l  #4,a3
  178.  
  179.         moveq   #0,d0                   ; Check for old modules
  180.         moveq   #0,d1
  181.         move.w  #31-1,-(sp)
  182.         tst.b   $1d6(a0)
  183.         beq.s   1$
  184.         cmp.b   #1,$1f3(a0)
  185.         beq.s   1$
  186.         cmp.l   #'M.K.',$438(a0)
  187.         beq.s   1$
  188.         move.w  #$1e0,d0
  189.         move.w  #$1e4,d1
  190.         move.w  #15-1,(sp)
  191. 1$      move.w  d0,seqadj
  192.         move.w  d1,blkadj
  193.  
  194.         MOVE.L  A0,A1
  195.         LEA     952(A1),A1
  196.         suba.w  d0,a1
  197.  
  198.         movem.l d0-d1/a0-a1,-(sp)       ; Set MultiPlayer's position display
  199.         moveq   #0,d0
  200.         moveq   #0,d1
  201.         move.b  -2(a1),d1
  202.         jsr     intsongpos
  203.         movem.l (sp)+,d0-d1/a0-a1
  204.  
  205.         MOVEQ   #127,D0
  206.         MOVEQ   #0,D1
  207. mtloop  MOVE.L  D1,D2
  208.         SUBQ.W  #1,D0
  209. mtloop2 MOVE.B  (A1)+,D1
  210.         CMP.B   D2,D1
  211.         BGT.S   mtloop
  212.         DBRA    D0,mtloop2
  213.         ADDQ.B  #1,D2
  214.  
  215.         LEA     mt_SampleStarts(PC),A1
  216.         ASL.L   #8,D2
  217.         ASL.L   #2,D2
  218.         ADD.L   #1084,D2
  219.         ADD.L   A0,D2
  220.         MOVE.L  D2,A2
  221.         suba.w  blkadj(pc),a2           ;
  222.         move.w  (sp)+,d0
  223. mtloop3 cmp.l   a2,a3                   ; < Fix - prevent trashing memory
  224.         blt.s   1$
  225.         clr.l   (a2)
  226. 1$      MOVE.L  A2,(A1)+
  227.         MOVEQ   #0,D1
  228.         MOVE.W  42(A0),D1
  229.         bz.b    \zz
  230.         ASL.L   #1,D1
  231.         ml      d1,d2
  232.         ADD.l   d1,a2
  233. \zz
  234.         ADD.L   #30,A0
  235.         DBRA    D0,mtloop3
  236.  
  237.         ml      d2,d0                   ; See if the last sample is a scrolltext
  238.         cq      d1
  239. \more
  240.         tst.b   -(a2)
  241.         bpl.b   \lower
  242.         addq.l  #1,d1
  243. \lower
  244.         subq.l  #1,d0
  245.         bhi.b   \more
  246.  
  247.         lsl.l   #2,d1                   ; If 3/4 or more of the bytes are <$80, assume it's ASCII
  248.         cmp.l   d1,d2
  249.         blo.b   \noscroll
  250.  
  251.         clr.b   -1(a2,d2.l)             ; Null-terminate the scroll text
  252.         addq    #4,a2                   ; Get past the four bytes we clobbered
  253.         ml      a2,scroll
  254. \noscroll
  255.  
  256.         moveq   #0,d0
  257. initout
  258.         movem.l (sp)+,d2/a2-a3
  259.         rts
  260.  
  261. start
  262.         clr.w   scrollmod               ; Note scroller information
  263.  
  264.         mq      #1,d0
  265.         bsr     initfilter
  266.  
  267.         MOVE.B  #6,mt_speed
  268.         CLR.B   mt_counter
  269.         CLR.B   mt_SongPos
  270.         CLR.W   mt_PatternPos
  271.  
  272.         cq      d0
  273.         cq      d1
  274.         bsr     findnotetab
  275.  
  276.         st.b    playing
  277.         rts
  278.  
  279. mt_stop
  280.         clr.b   playing
  281.         rts
  282.  
  283. fin
  284.         move.l  noteplayer(pc),a0
  285.         jmp     NoteFinish(a0)
  286.  
  287. usevol  macro
  288.         movem.l d1-d2/d4/a0-a1,-(sp)
  289.         move.w  n_channelno(a6),d2
  290.         MOVE.W  D0,d4
  291.         lsl.w   #2,d4
  292.         jsr     NoteVol(a5)
  293.         movem.l (sp)+,d1-d2/d4/a0-a1
  294.         endm
  295.  
  296. useper  macro
  297.         movem.l d0-d3/a0-a1,-(sp)
  298.         move.w  n_channelno(a6),d2
  299.         moveq   #0,d3
  300.         MOVE.W  n_period(A6),d3
  301.         swap    d3
  302.         jsr     NoteFreq(a5)
  303.         movem.l (sp)+,d0-d3/a0-a1
  304.         endm
  305.  
  306. mt_music
  307.         movem.l d0-d4/a0-a6,-(SP)            ;
  308.  
  309.         move.l  noteplayer(pc),a5
  310.  
  311.         ADDQ.B  #1,mt_counter
  312.         MOVE.B  mt_counter(PC),D0
  313.         CMP.B   mt_speed(PC),D0
  314.         BLO.S   mt_NoNewNote
  315.         CLR.B   mt_counter
  316.         TST.B   mt_PattDelTime2
  317.         BEQ.S   mt_GetNewNote
  318.         BSR.S   mt_NoNewAllChannels
  319.         BRA     mt_dskip
  320.  
  321. mt_NoNewNote
  322.         BSR.S   mt_NoNewAllChannels
  323.         BRA     mt_NoNewPosYet
  324.  
  325. mt_NoNewAllChannels
  326.         LEA     mt_chan1temp(PC),A6
  327.         BSR     mt_CheckEfx
  328.         LEA     mt_chan2temp(PC),A6
  329.         BSR     mt_CheckEfx
  330.         LEA     mt_chan3temp(PC),A6
  331.         BSR     mt_CheckEfx
  332.         LEA     mt_chan4temp(PC),A6
  333.         BRA     mt_CheckEfx
  334.  
  335. mt_GetNewNote
  336.         MOVE.L  mt_SongDataPtr(PC),A0
  337.         LEA     12(A0),A3
  338.         LEA     952(A0),A2      ;pattpo
  339.         suba.w  seqadj(pc),a2
  340.         LEA     1084(A0),A0     ;patterndata
  341.         suba.w  blkadj(pc),a0
  342.         MOVEQ   #0,D0
  343.         MOVEQ   #0,D1
  344.         MOVE.B  mt_SongPos(PC),D0
  345.         MOVE.B  0(A2,D0.W),D1
  346.         ASL.L   #8,D1
  347.         ASL.L   #2,D1
  348.         ADD.W   mt_PatternPos(PC),D1
  349.  
  350.         LEA     mt_chan1temp(PC),A6
  351.         BSR.S   mt_PlayVoice
  352.         LEA     mt_chan2temp(PC),A6
  353.         BSR.S   mt_PlayVoice
  354.         LEA     mt_chan3temp(PC),A6
  355.         BSR.S   mt_PlayVoice
  356.         LEA     mt_chan4temp(PC),A6
  357.         BSR.S   mt_PlayVoice
  358.         BRA     mt_SetDMA
  359.  
  360. mt_PlayVoice
  361.         TST.L   (A6)
  362.         BNE.S   mt_plvskip
  363.         BSR     mt_PerNop
  364. mt_plvskip
  365.         MOVE.L  0(A0,D1.L),(A6)
  366.         ADDQ.L  #4,D1
  367.         MOVEQ   #0,D2
  368.         MOVE.B  n_cmd(A6),D2
  369.         AND.B   #$F0,D2
  370.         LSR.B   #4,D2
  371.         MOVE.B  (A6),D0
  372.         AND.B   #$F0,D0
  373.         OR.B    D0,D2
  374.         BEQ     mt_SetRegs
  375.         MOVEQ   #0,D3
  376.         LEA     mt_SampleStarts(PC),A1
  377.         MOVE    D2,D4
  378.         SUBQ.L  #1,D2
  379.         ASL.L   #2,D2
  380.         MULU    #30,D4
  381.         MOVE.L  0(A1,D2.L),n_start(A6)
  382.         MOVE.W  0(A3,D4.L),n_length(A6)
  383.         MOVE.W  0(A3,D4.L),n_reallength(A6)
  384.         MOVE.B  2(A3,D4.L),n_finetune(A6)
  385.         MOVE.B  3(A3,D4.L),n_volume(A6)
  386.         MOVE.W  4(A3,D4.L),D3 ; Get repeat
  387.  
  388.         push    a0/d0-d3/a0        ; BAF - Flash the note on the display
  389.         mw      (a6),d0
  390.         andi.w  #$fff,d0
  391.         lea     mt_PeriodTable(pc),a0
  392.         mq      #-1,d1
  393. 1$      addq.w  #1,d1
  394.         cmp.w   (a0)+,d0
  395.         blo.b   1$
  396.         mb      mt_FlashNotes(pc,d1.w),d1
  397.         move.w  n_channelno(a6),d0
  398.         mb      n_volume(a6),d2
  399.         bsr     intflashnote
  400.  
  401.         ml      n_start(a6),a0
  402.         mw      (a6),d1
  403.         andi.w  #$fff,d1
  404.         mw      n_length(a6),d2
  405.         add.w   d2,d2
  406.         mw      6(a3,d4.l),d3
  407.         add.w   d3,d3
  408.         bsr     intflashsample
  409.         pop     a0/d0-d3/a0
  410.  
  411.         TST.W   D3
  412.         BEQ.S   mt_NoLoop
  413.         MOVE.L  n_start(A6),D2  ; Get start
  414.         ASL.W   #1,D3
  415.         ADD.L   D3,D2           ; Add repeat
  416.         MOVE.L  D2,n_loopstart(A6)
  417.         MOVE.L  D2,n_wavestart(A6)
  418.         MOVE.W  4(A3,D4.L),D0   ; Get repeat
  419.         ADD.W   6(A3,D4.L),D0   ; Add replen
  420.         MOVE.W  D0,n_length(A6)
  421.         MOVE.W  6(A3,D4.L),n_replen(A6) ; Save replen
  422.         BRA.S   mt_SetRegsVol
  423.  
  424. mt_FlashNotes   dc.b    0,7,14,21,28,35,42,49,56,64
  425.                 dc.b    71,78,85,92,99,106,113,120,128,135
  426.                 dc.b    142,149,156,163,170,177,184,192,199,206
  427.                 dc.b    213,220,227,234,241,248
  428.  
  429. mt_NoLoop
  430.         MOVE.L  n_start(A6),D2
  431.         ADD.L   D3,D2
  432.         MOVE.L  D2,n_loopstart(A6)
  433.         MOVE.L  D2,n_wavestart(A6)
  434.         MOVE.W  6(A3,D4.L),n_replen(A6) ; Save replen
  435. mt_SetRegsVol
  436.         MOVEQ   #0,D0
  437.         MOVE.B  n_volume(A6),D0
  438.         usevol
  439. mt_SetRegs
  440.         MOVE.W  (A6),D0
  441.         AND.W   #$0FFF,D0
  442.         BEQ     mt_CheckMoreEfx ; If no note
  443.         MOVE.W  2(A6),D0
  444.         AND.W   #$0FF0,D0
  445.         CMP.W   #$0E50,D0
  446.         BEQ.S   mt_DoSetFineTune
  447.         MOVE.B  2(A6),D0
  448.         AND.B   #$0F,D0
  449.         CMP.B   #3,D0   ; TonePortamento
  450.         BEQ.S   mt_ChkTonePorta
  451.         CMP.B   #5,D0
  452.         BEQ.S   mt_ChkTonePorta
  453.         CMP.B   #9,D0   ; Sample Offset
  454.         BNE.S   mt_SetPeriod
  455.         BSR     mt_CheckMoreEfx
  456.         BRA.S   mt_SetPeriod
  457.  
  458. mt_DoSetFineTune
  459.         BSR     mt_SetFineTune
  460.         BRA.S   mt_SetPeriod
  461.  
  462. mt_ChkTonePorta
  463.         BSR     mt_SetTonePorta
  464.         BRA     mt_CheckMoreEfx
  465.  
  466. mt_SetPeriod
  467.         MOVEM.L D0-D1/A0-A1,-(SP)
  468.         MOVE.W  (A6),D1
  469.         AND.W   #$0FFF,D1
  470.         tst.b   n_finetune(a6)
  471.         bz      mt_noft
  472.         LEA     mt_PeriodTable(PC),A1
  473.         MOVEQ   #0,D0
  474.         MOVEQ   #36,D2
  475. mt_ftuloop
  476.         CMP.W   0(A1,D0.W),D1
  477.         BHS.S   mt_ftufound
  478.         ADDQ.L  #2,D0
  479.         DBRA    D2,mt_ftuloop
  480. mt_ftufound
  481.         MOVEQ   #0,D1
  482.         MOVE.B  n_finetune(A6),D1
  483.         MULU    #36*2,D1
  484.         ADD.L   D1,A1
  485.         MOVE.W  0(A1,D0.W),d1
  486. mt_noft
  487.         move.w  d1,n_period(A6)
  488.         MOVEM.L (SP)+,D0-D1/A0-A1
  489.  
  490.         MOVE.W  2(A6),D0
  491.         AND.W   #$0FF0,D0
  492.         CMP.W   #$0ED0,D0 ; Notedelay
  493.         BEQ     mt_CheckMoreEfx
  494.  
  495.         BTST    #2,n_wavecontrol(A6)
  496.         BNE.S   mt_vibnoc
  497.         CLR.B   n_vibratopos(A6)
  498. mt_vibnoc
  499.         BTST    #6,n_wavecontrol(A6)
  500.         BNE.S   mt_trenoc
  501.         CLR.B   n_tremolopos(A6)
  502. mt_trenoc
  503.         movem.l d1-d4/a0-a1,-(sp)
  504.         move.l  n_start(a6),a0
  505.         moveq   #0,d0
  506.         move.w  n_length(a6),d0
  507.         add.l   d0,d0
  508.         move.l  n_loopstart(a6),a1
  509.         moveq   #0,d1
  510.         move.w  n_replen(a6),d1
  511.         cmp.w   #1,d1
  512.         bne.b   \notone
  513.         moveq   #0,d1
  514. \notone
  515.         add.l   d1,d1
  516.         move.w  n_channelno(a6),d2
  517.         moveq   #0,d3
  518.         move.w  n_period(a6),d3
  519.         swap    d3
  520.         moveq   #0,d4
  521.         move.b  n_volume(a6),d4
  522.         lsl.w   #2,d4
  523.         jsr     NoteStart(a5)
  524.         movem.l (sp)+,d1-d4/a0-a1
  525.         BRA     mt_CheckMoreEfx
  526.  
  527. mt_SetDMA
  528.  
  529. mt_dskip
  530.         ADD.W   #16,mt_PatternPos
  531.         MOVE.B  mt_PattDelTime,D0
  532.         BEQ.S   mt_dskc
  533.         MOVE.B  D0,mt_PattDelTime2
  534.         CLR.B   mt_PattDelTime
  535. mt_dskc TST.B   mt_PattDelTime2
  536.         BEQ.S   mt_dska
  537.         SUBQ.B  #1,mt_PattDelTime2
  538.         BEQ.S   mt_dska
  539.         SUB.W   #16,mt_PatternPos
  540. mt_dska TST.B   mt_PBreakFlag
  541.         BEQ.S   mt_nnpysk
  542.         SF      mt_PBreakFlag
  543.         MOVEQ   #0,D0
  544.         MOVE.B  mt_PBreakPos(PC),D0
  545.         CLR.B   mt_PBreakPos
  546.         LSL.W   #4,D0
  547.         MOVE.W  D0,mt_PatternPos
  548. mt_nnpysk
  549.         CMP.W   #1024,mt_PatternPos
  550.         BLO.S   mt_NoNewBlock
  551. mt_NextPosition
  552.         MOVEQ   #0,D0
  553.         MOVE.B  mt_PBreakPos(PC),D0
  554.         LSL.W   #4,D0
  555.         MOVE.W  D0,mt_PatternPos
  556.         CLR.B   mt_PBreakPos
  557.         CLR.B   mt_PosJumpFlag
  558.         move.b  mt_SongPos(pc),d1       ; Fixes and opts
  559.         addq.B  #1,d1
  560.         and.B   #$7F,d1
  561.         move.L  mt_SongDataPtr(PC),A0
  562.         suba.w  seqadj(pc),a0
  563.         move.b  $3b6(a0),d2
  564.         cmp.b   d2,d1
  565.         blo.s   1$
  566.  
  567.         bsr     intrepeat               ; Signal when repeating
  568.  
  569.         move.b  $3b7(a0),d1
  570.         cmp.b   d2,d1                   ; < Fix - range check for song repeat
  571.         blo.s   1$
  572.         moveq   #0,d1
  573. 1$      move.b  d1,mt_SongPos
  574.  
  575.         moveq   #0,d0                   ; Update MultiPlayer's position display
  576.         move.b  d1,d0
  577.         moveq   #0,d1
  578.         move.b  d2,d1
  579.         jsr     intsongpos
  580.  
  581.         bsr.b   findnotetab
  582.  
  583. mt_NoNewBlock
  584.         mw      mt_PatternPos(pc),d0    ; Update the scrolling note display
  585.         lsr.w   #4,d0
  586.         mq      #64,d1
  587.         jsr     intflashscroll
  588.  
  589. mt_NoNewPosYet
  590.         TST.B   mt_PosJumpFlag
  591.         BNE     mt_NextPosition
  592.  
  593. mt_exit movem.l (sp)+,d0-d4/a0-a6
  594.         RTS
  595.  
  596. findnotetab
  597.         MOVE.L  mt_SongDataPtr(PC),A0   ; Find the new note table
  598.         LEA     952(A0),A2
  599.         suba.w  seqadj(pc),a2
  600.         LEA     1084(A0),A0
  601.         suba.w  blkadj(pc),a0
  602.         MOVE.B  0(A2,D0.W),D1
  603.         ASL.L   #8,D1
  604.         ASL.L   #2,D1
  605.         add.l   d1,a0
  606.         ml      a0,notetab
  607.         rts
  608.  
  609. mt_CheckEfx
  610.         BSR     mt_UpdateFunk
  611.         MOVE.W  n_cmd(A6),D0
  612.         AND.W   #$0FFF,D0
  613.         BEQ.S   mt_PerNop
  614.         MOVE.B  n_cmd(A6),D0
  615.         AND.B   #$0F,D0
  616.         BEQ.S   mt_Arpeggio
  617.         CMP.B   #1,D0
  618.         BEQ     mt_PortaUp
  619.         CMP.B   #2,D0
  620.         BEQ     mt_PortaDown
  621.         CMP.B   #3,D0
  622.         BEQ     mt_TonePortamento
  623.         CMP.B   #4,D0
  624.         BEQ     mt_Vibrato
  625.         CMP.B   #5,D0
  626.         BEQ     mt_TonePlusVolSlide
  627.         CMP.B   #6,D0
  628.         BEQ     mt_VibratoPlusVolSlide
  629.         CMP.B   #$E,D0
  630.         BEQ     mt_E_Commands
  631. SetBack useper
  632.         CMP.B   #7,D0
  633.         BEQ     mt_Tremolo
  634.         CMP.B   #$A,D0
  635.         BEQ     mt_VolumeSlide
  636. mt_Return2
  637.         RTS
  638.  
  639. mt_PerNop
  640.         useper
  641.         RTS
  642.  
  643. mt_Arpeggio
  644.         MOVEQ   #0,D0
  645.         MOVE.B  mt_counter(PC),D0
  646.         DIVS    #3,D0
  647.         SWAP    D0
  648.         CMP.W   #0,D0
  649.         BEQ.S   mt_Arpeggio2
  650.         CMP.W   #2,D0
  651.         BEQ.S   mt_Arpeggio1
  652.         MOVEQ   #0,D0
  653.         MOVE.B  n_cmdlo(A6),D0
  654.         LSR.B   #4,D0
  655.         BRA.S   mt_Arpeggio3
  656.  
  657. mt_Arpeggio1
  658.         MOVEQ   #0,D0
  659.         MOVE.B  n_cmdlo(A6),D0
  660.         AND.B   #15,D0
  661.         BRA.S   mt_Arpeggio3
  662.  
  663. mt_Arpeggio2
  664.         MOVE.W  n_period(A6),D2
  665.         BRA.S   mt_Arpeggio4
  666.  
  667. mt_Arpeggio3
  668.         ASL.W   #1,D0
  669.         MOVEQ   #0,D1
  670.         MOVE.B  n_finetune(A6),D1
  671.         MULU    #36*2,D1
  672.         LEA     mt_PeriodTable(PC),A0
  673.         ADD.L   D1,A0
  674.         MOVEQ   #0,D1
  675.         MOVE.W  n_period(A6),D1
  676.         MOVEQ   #36,D3
  677. mt_arploop
  678.         MOVE.W  0(A0,D0.W),D2
  679.         CMP.W   (A0),D1
  680.         BHS.S   mt_Arpeggio4
  681.         ADDQ.L  #2,A0
  682.         DBRA    D3,mt_arploop
  683.         RTS
  684.  
  685. mt_Arpeggio4
  686.         movem.l d0-d3/a0-a1,-(sp)
  687.         moveq   #0,d3
  688.         MOVE.W  d2,d3
  689.         swap    d3
  690.         move.w  n_channelno(a6),d2
  691.         jsr     NoteFreq(a5)
  692.         movem.l (sp)+,d0-d3/a0-a1
  693.         RTS
  694.  
  695. mt_FinePortaUp
  696.         TST.B   mt_counter
  697.         BNE     mt_Return2
  698.         MOVE.B  #$0F,mt_LowMask
  699. mt_PortaUp
  700.         MOVEQ   #0,D0
  701.         MOVE.B  n_cmdlo(A6),D0
  702.         AND.B   mt_LowMask(PC),D0
  703.         MOVE.B  #$FF,mt_LowMask
  704.         SUB.W   D0,n_period(A6)
  705.         MOVE.W  n_period(A6),D0
  706.         AND.W   #$0FFF,D0
  707.         CMP.W   #113,D0
  708.         BPL.S   mt_PortaUskip
  709.         AND.W   #$F000,n_period(A6)
  710.         OR.W    #113,n_period(A6)
  711. mt_PortaUskip
  712.         MOVE.W  n_period(A6),D0
  713.         AND.W   #$0FFF,D0
  714.         movem.l d0-d3/a0-a1,-(sp)
  715.         move.w  n_channelno(a6),d2
  716.         moveq   #0,d3
  717.         MOVE.W  d0,d3
  718.         swap    d3
  719.         jsr     NoteFreq(a5)
  720.         movem.l (sp)+,d0-d3/a0-a1
  721.         RTS
  722.  
  723. mt_FinePortaDown
  724.         TST.B   mt_counter
  725.         BNE     mt_Return2
  726.         MOVE.B  #$0F,mt_LowMask
  727. mt_PortaDown
  728.         CLR.W   D0
  729.         MOVE.B  n_cmdlo(A6),D0
  730.         AND.B   mt_LowMask(PC),D0
  731.         MOVE.B  #$FF,mt_LowMask
  732.         ADD.W   D0,n_period(A6)
  733.         MOVE.W  n_period(A6),D0
  734.         AND.W   #$0FFF,D0
  735.         CMP.W   #856,D0
  736.         BMI.S   mt_PortaDskip
  737.         AND.W   #$F000,n_period(A6)
  738.         OR.W    #856,n_period(A6)
  739. mt_PortaDskip
  740.         MOVE.W  n_period(A6),D0
  741.         AND.W   #$0FFF,D0
  742.         movem.l d0-d3/a0-a1,-(sp)
  743.         move.w  n_channelno(a6),d2
  744.         moveq   #0,d3
  745.         MOVE.W  d0,d3
  746.         swap    d3
  747.         jsr     NoteFreq(a5)
  748.         movem.l (sp)+,d0-d3/a0-a1
  749.         RTS
  750.  
  751. mt_SetTonePorta
  752.         MOVE.L  A0,-(SP)
  753.         MOVE.W  (A6),D2
  754.         AND.W   #$0FFF,D2
  755.         MOVEQ   #0,D0
  756.         MOVE.B  n_finetune(A6),D0
  757.         MULU    #36*2,D0
  758.         LEA     mt_PeriodTable(PC),A0
  759.         ADD.L   D0,A0
  760.         MOVEQ   #0,D0
  761. mt_StpLoop
  762.         CMP.W   0(A0,D0.W),D2
  763.         BHS.S   mt_StpFound
  764.         ADDQ.W  #2,D0
  765.         CMP.W   #36*2,D0
  766.         BLO.S   mt_StpLoop
  767.         MOVEQ   #35*2,D0
  768. mt_StpFound
  769.         MOVE.B  n_finetune(A6),D2
  770.         AND.B   #8,D2
  771.         BEQ.S   mt_StpGoss
  772.         TST.W   D0
  773.         BEQ.S   mt_StpGoss
  774.         SUBQ.W  #2,D0
  775. mt_StpGoss
  776.         MOVE.W  0(A0,D0.W),D2
  777.         MOVE.L  (SP)+,A0
  778.         MOVE.W  D2,n_wantedperiod(A6)
  779.         MOVE.W  n_period(A6),D0
  780.         CLR.B   n_toneportdirec(A6)
  781.         CMP.W   D0,D2
  782.         BEQ.S   mt_ClearTonePorta
  783.         BGE     mt_Return2
  784.         MOVE.B  #1,n_toneportdirec(A6)
  785.         RTS
  786.  
  787. mt_ClearTonePorta
  788.         CLR.W   n_wantedperiod(A6)
  789.         RTS
  790.  
  791. mt_TonePortamento
  792.         MOVE.B  n_cmdlo(A6),D0
  793.         BEQ.S   mt_TonePortNoChange
  794.         MOVE.B  D0,n_toneportspeed(A6)
  795.         CLR.B   n_cmdlo(A6)
  796. mt_TonePortNoChange
  797.         TST.W   n_wantedperiod(A6)
  798.         BEQ     mt_Return2
  799.         MOVEQ   #0,D0
  800.         MOVE.B  n_toneportspeed(A6),D0
  801.         TST.B   n_toneportdirec(A6)
  802.         BNE.S   mt_TonePortaUp
  803. mt_TonePortaDown
  804.         ADD.W   D0,n_period(A6)
  805.         MOVE.W  n_wantedperiod(A6),D0
  806.         CMP.W   n_period(A6),D0
  807.         BGT.S   mt_TonePortaSetPer
  808.         MOVE.W  n_wantedperiod(A6),n_period(A6)
  809.         CLR.W   n_wantedperiod(A6)
  810.         BRA.S   mt_TonePortaSetPer
  811.  
  812. mt_TonePortaUp
  813.         SUB.W   D0,n_period(A6)
  814.         MOVE.W  n_wantedperiod(A6),D0
  815.         CMP.W   n_period(A6),D0
  816.         BLT.S   mt_TonePortaSetPer
  817.         MOVE.W  n_wantedperiod(A6),n_period(A6)
  818.         CLR.W   n_wantedperiod(A6)
  819.  
  820. mt_TonePortaSetPer
  821.         MOVE.W  n_period(A6),D2
  822.         MOVE.B  n_glissfunk(A6),D0
  823.         AND.B   #$0F,D0
  824.         BEQ.S   mt_GlissSkip
  825.         MOVEQ   #0,D0
  826.         MOVE.B  n_finetune(A6),D0
  827.         MULU    #36*2,D0
  828.         LEA     mt_PeriodTable(PC),A0
  829.         ADD.L   D0,A0
  830.         MOVEQ   #0,D0
  831. mt_GlissLoop
  832.         CMP.W   0(A0,D0.W),D2
  833.         BHS.S   mt_GlissFound
  834.         ADDQ.W  #2,D0
  835.         CMP.W   #36*2,D0
  836.         BLO.S   mt_GlissLoop
  837.         MOVEQ   #35*2,D0
  838. mt_GlissFound
  839.         MOVE.W  0(A0,D0.W),D2
  840. mt_GlissSkip
  841.         movem.l d0-d3/a0-a1,-(sp)
  842.         moveq   #0,d3
  843.         MOVE.W  d2,d3
  844.         swap    d3
  845.         move.w  n_channelno(a6),d2
  846.         jsr     NoteFreq(a5)
  847.         movem.l (sp)+,d0-d3/a0-a1
  848.         RTS
  849.  
  850. mt_Vibrato
  851.         MOVE.B  n_cmdlo(A6),D0
  852.         BEQ.S   mt_Vibrato2
  853.         MOVE.B  n_vibratocmd(A6),D2
  854.         AND.B   #$0F,D0
  855.         BEQ.S   mt_vibskip
  856.         AND.B   #$F0,D2
  857.         OR.B    D0,D2
  858. mt_vibskip
  859.         MOVE.B  n_cmdlo(A6),D0
  860.         AND.B   #$F0,D0
  861.         BEQ.S   mt_vibskip2
  862.         AND.B   #$0F,D2
  863.         OR.B    D0,D2
  864. mt_vibskip2
  865.         MOVE.B  D2,n_vibratocmd(A6)
  866. mt_Vibrato2
  867.         MOVE.B  n_vibratopos(A6),D0
  868.         LEA     mt_VibratoTable(PC),A4
  869.         LSR.W   #2,D0
  870.         AND.W   #$001F,D0
  871.         MOVEQ   #0,D2
  872.         MOVE.B  n_wavecontrol(A6),D2
  873.         AND.B   #$03,D2
  874.         BEQ.S   mt_vib_sine
  875.         LSL.B   #3,D0
  876.         CMP.B   #1,D2
  877.         BEQ.S   mt_vib_rampdown
  878.         MOVE.B  #255,D2
  879.         BRA.S   mt_vib_set
  880. mt_vib_rampdown
  881.         TST.B   n_vibratopos(A6)
  882.         BPL.S   mt_vib_rampdown2
  883.         MOVE.B  #255,D2
  884.         SUB.B   D0,D2
  885.         BRA.S   mt_vib_set
  886. mt_vib_rampdown2
  887.         MOVE.B  D0,D2
  888.         BRA.S   mt_vib_set
  889. mt_vib_sine
  890.         MOVE.B  0(A4,D0.W),D2
  891. mt_vib_set
  892.         MOVE.B  n_vibratocmd(A6),D0
  893.         AND.W   #15,D0
  894.         MULU    D0,D2
  895.         LSR.W   #7,D2
  896.         MOVE.W  n_period(A6),D0
  897.         TST.B   n_vibratopos(A6)
  898.         BMI.S   mt_VibratoNeg
  899.         ADD.W   D2,D0
  900.         BRA.S   mt_Vibrato3
  901. mt_VibratoNeg
  902.         SUB.W   D2,D0
  903. mt_Vibrato3
  904.         movem.l d0-d3/a0-a1,-(sp)
  905.         move.w  n_channelno(a6),d2
  906.         moveq   #0,d3
  907.         MOVE.W  d0,d3
  908.         swap    d3
  909.         jsr     NoteFreq(a5)
  910.         movem.l (sp)+,d0-d3/a0-a1
  911.         MOVE.B  n_vibratocmd(A6),D0
  912.         LSR.W   #2,D0
  913.         AND.W   #$003C,D0
  914.         ADD.B   D0,n_vibratopos(A6)
  915.         RTS
  916.  
  917. mt_TonePlusVolSlide
  918.         BSR     mt_TonePortNoChange
  919.         BRA     mt_VolumeSlide
  920.  
  921. mt_VibratoPlusVolSlide
  922.         BSR     mt_Vibrato2
  923.         BRA     mt_VolumeSlide
  924.  
  925. mt_Tremolo
  926.         MOVE.B  n_cmdlo(A6),D0
  927.         BEQ.S   mt_Tremolo2
  928.         MOVE.B  n_tremolocmd(A6),D2
  929.         AND.B   #$0F,D0
  930.         BEQ.S   mt_treskip
  931.         AND.B   #$F0,D2
  932.         OR.B    D0,D2
  933. mt_treskip
  934.         MOVE.B  n_cmdlo(A6),D0
  935.         AND.B   #$F0,D0
  936.         BEQ.S   mt_treskip2
  937.         AND.B   #$0F,D2
  938.         OR.B    D0,D2
  939. mt_treskip2
  940.         MOVE.B  D2,n_tremolocmd(A6)
  941. mt_Tremolo2
  942.         MOVE.B  n_tremolopos(A6),D0
  943.         LEA     mt_VibratoTable(PC),A4
  944.         LSR.W   #2,D0
  945.         AND.W   #$001F,D0
  946.         MOVEQ   #0,D2
  947.         MOVE.B  n_wavecontrol(A6),D2
  948.         LSR.B   #4,D2
  949.         AND.B   #$03,D2
  950.         BEQ.S   mt_tre_sine
  951.         LSL.B   #3,D0
  952.         CMP.B   #1,D2
  953.         BEQ.S   mt_tre_rampdown
  954.         MOVE.B  #255,D2
  955.         BRA.S   mt_tre_set
  956. mt_tre_rampdown
  957.         TST.B   n_vibratopos(A6)
  958.         BPL.S   mt_tre_rampdown2
  959.         MOVE.B  #255,D2
  960.         SUB.B   D0,D2
  961.         BRA.S   mt_tre_set
  962. mt_tre_rampdown2
  963.         MOVE.B  D0,D2
  964.         BRA.S   mt_tre_set
  965. mt_tre_sine
  966.         MOVE.B  0(A4,D0.W),D2
  967. mt_tre_set
  968.         MOVE.B  n_tremolocmd(A6),D0
  969.         AND.W   #15,D0
  970.         MULU    D0,D2
  971.         LSR.W   #6,D2
  972.         MOVEQ   #0,D0
  973.         MOVE.B  n_volume(A6),D0
  974.         TST.B   n_tremolopos(A6)
  975.         BMI.S   mt_TremoloNeg
  976.         ADD.W   D2,D0
  977.         BRA.S   mt_Tremolo3
  978. mt_TremoloNeg
  979.         SUB.W   D2,D0
  980. mt_Tremolo3
  981.         BPL.S   mt_TremoloSkip
  982.         CLR.W   D0
  983. mt_TremoloSkip
  984.         CMP.W   #$40,D0
  985.         BLS.S   mt_TremoloOk
  986.         MOVE.W  #$40,D0
  987. mt_TremoloOk
  988.         movem.l d0-d2/d4/a0-a1,-(sp)
  989.         move.w  n_channelno(a6),d2
  990.         MOVE.W  D0,d4
  991.         lsl.w   #2,d4
  992.         jsr     NoteVol(a5)
  993.         movem.l (sp)+,d0-d2/d4/a0-a1
  994.         MOVE.B  n_tremolocmd(A6),D0
  995.         LSR.W   #2,D0
  996.         AND.W   #$003C,D0
  997.         ADD.B   D0,n_tremolopos(A6)
  998.         RTS
  999.  
  1000. mt_SampleOffset
  1001.         MOVEQ   #0,D0
  1002.         MOVE.B  n_cmdlo(A6),D0
  1003.         BEQ.S   mt_sononew
  1004.         MOVE.B  D0,n_sampleoffset(A6)
  1005. mt_sononew
  1006.         MOVE.B  n_sampleoffset(A6),D0
  1007.         LSL.W   #7,D0
  1008.         CMP.W   n_length(A6),D0
  1009.         BGE.S   mt_sofskip
  1010.         SUB.W   D0,n_length(A6)
  1011.         LSL.W   #1,D0
  1012.         ADD.L   D0,n_start(A6)
  1013.         RTS
  1014. mt_sofskip
  1015.         MOVE.W  #$0001,n_length(A6)
  1016.         RTS
  1017.  
  1018. mt_VolumeSlide
  1019.         MOVEQ   #0,D0
  1020.         MOVE.B  n_cmdlo(A6),D0
  1021.         LSR.B   #4,D0
  1022.         TST.B   D0
  1023.         BEQ.S   mt_VolSlideDown
  1024. mt_VolSlideUp
  1025.         ADD.B   D0,n_volume(A6)
  1026.         CMP.B   #$40,n_volume(A6)
  1027.         BMI.S   mt_vsuskip
  1028.         MOVE.B  #$40,n_volume(A6)
  1029. mt_vsuskip
  1030.         MOVE.B  n_volume(A6),D0
  1031.         usevol
  1032.         RTS
  1033.  
  1034. mt_VolSlideDown
  1035.         MOVEQ   #0,D0
  1036.         MOVE.B  n_cmdlo(A6),D0
  1037.         AND.B   #$0F,D0
  1038. mt_VolSlideDown2
  1039.         SUB.B   D0,n_volume(A6)
  1040.         BPL.S   mt_vsdskip
  1041.         CLR.B   n_volume(A6)
  1042. mt_vsdskip
  1043.         MOVE.B  n_volume(A6),D0
  1044.         usevol
  1045.         RTS
  1046.  
  1047. mt_PositionJump
  1048.         MOVE.B  n_cmdlo(A6),D0
  1049.  
  1050.         cmp.b   mt_SongPos(pc),d0       ; Check for repeat
  1051.         bhi.s   1$
  1052.         jsr     intrepeat
  1053. 1$
  1054.         SUBQ.B  #1,D0
  1055.         MOVE.B  D0,mt_SongPos
  1056. mt_pj2  CLR.B   mt_PBreakPos
  1057.         ST      mt_PosJumpFlag
  1058.         RTS
  1059.  
  1060. mt_VolumeChange
  1061.         MOVEQ   #0,D0
  1062.         MOVE.B  n_cmdlo(A6),D0
  1063.         CMP.B   #$40,D0
  1064.         BLS.S   mt_VolumeOk
  1065.         MOVEQ   #$40,D0
  1066. mt_VolumeOk
  1067.         MOVE.B  D0,n_volume(A6)
  1068.         usevol
  1069.         RTS
  1070.  
  1071. mt_PatternBreak
  1072.         MOVEQ   #0,D0
  1073.         MOVE.B  n_cmdlo(A6),D0
  1074.         MOVE.L  D0,D2
  1075.         LSR.B   #4,D0
  1076.         MULU    #10,D0
  1077.         AND.B   #$0F,D2
  1078.         ADD.B   D2,D0
  1079.         CMP.B   #63,D0
  1080.         BHI.S   mt_pj2
  1081.         MOVE.B  D0,mt_PBreakPos
  1082.         ST      mt_PosJumpFlag
  1083.         RTS
  1084.  
  1085. mt_SetSpeed
  1086.         MOVEQ   #0,D0
  1087.         MOVE.B  3(A6),D0
  1088.         BEQ     \out
  1089.         CMP.B   #$20,D0
  1090.         blo.b   \normal
  1091.         btst.b  #MNB_PTTEMPO,modflags
  1092.         bnz     SetTempo
  1093. \normal
  1094.         CLR.B   mt_counter
  1095.         MOVE.B  D0,mt_speed
  1096. \out
  1097.         RTS
  1098.  
  1099.  
  1100. mt_CheckMoreEfx
  1101.         BSR     mt_UpdateFunk
  1102.         MOVE.B  2(A6),D0
  1103.         AND.B   #$0F,D0
  1104.         CMP.B   #$9,D0
  1105.         BEQ     mt_SampleOffset
  1106.         CMP.B   #$B,D0
  1107.         BEQ     mt_PositionJump
  1108.         CMP.B   #$D,D0
  1109.         BEQ     mt_PatternBreak
  1110.         CMP.B   #$E,D0
  1111.         BEQ.S   mt_E_Commands
  1112.         CMP.B   #$F,D0
  1113.         BEQ.S   mt_SetSpeed
  1114.         CMP.B   #$C,D0
  1115.         BEQ     mt_VolumeChange
  1116.         BRA     mt_PerNop
  1117.  
  1118. mt_E_Commands
  1119.         MOVE.B  n_cmdlo(A6),D0
  1120.         AND.B   #$F0,D0
  1121.         LSR.B   #4,D0
  1122.         BEQ.S   mt_FilterOnOff
  1123.         CMP.B   #1,D0
  1124.         BEQ     mt_FinePortaUp
  1125.         CMP.B   #2,D0
  1126.         BEQ     mt_FinePortaDown
  1127.         CMP.B   #3,D0
  1128.         BEQ     mt_SetGlissControl
  1129.         CMP.B   #4,D0
  1130.         BEQ     mt_SetVibratoControl
  1131.         CMP.B   #5,D0
  1132.         BEQ     mt_SetFineTune
  1133.         CMP.B   #6,D0
  1134.         BEQ     mt_JumpLoop
  1135.         CMP.B   #7,D0
  1136.         BEQ     mt_SetTremoloControl
  1137.         CMP.B   #9,D0
  1138.         BEQ     mt_RetrigNote
  1139.         CMP.B   #$A,D0
  1140.         BEQ     mt_VolumeFineUp
  1141.         CMP.B   #$B,D0
  1142.         BEQ     mt_VolumeFineDown
  1143.         CMP.B   #$C,D0
  1144.         BEQ     mt_NoteCut
  1145.         CMP.B   #$D,D0
  1146.         BEQ     mt_NoteDelay
  1147.         CMP.B   #$E,D0
  1148.         BEQ     mt_PatternDelay
  1149.         CMP.B   #$F,D0
  1150.         BEQ     mt_FunkIt
  1151.         RTS
  1152.  
  1153. mt_FilterOnOff
  1154.         MOVE.B  n_cmdlo(A6),D0
  1155.         AND.B   #1,D0
  1156. initfilter
  1157.         move.b  d0,modfilter
  1158. setfilter
  1159.         tst.b   filter
  1160.         ble.b   \modcontrol
  1161.         moveq   #2,d0
  1162.         sub.b   filter,d0
  1163. \modcontrol
  1164.         add.b   d0,d0
  1165.         and.b   #2,d0
  1166.         AND.B   #$FD,$BFE001
  1167.         OR.B    D0,$BFE001
  1168.         RTS
  1169.  
  1170. r_ptfilter
  1171.         tst.b   playing
  1172.         bz      mt_Return2
  1173.         move.b  modfilter(pc),d0
  1174.         bra.b   setfilter
  1175.  
  1176. mt_SetGlissControl
  1177.         MOVE.B  n_cmdlo(A6),D0
  1178.         AND.B   #$0F,D0
  1179.         AND.B   #$F0,n_glissfunk(A6)
  1180.         OR.B    D0,n_glissfunk(A6)
  1181.         RTS
  1182.  
  1183. mt_SetVibratoControl
  1184.         MOVE.B  n_cmdlo(A6),D0
  1185.         AND.B   #$0F,D0
  1186.         AND.B   #$F0,n_wavecontrol(A6)
  1187.         OR.B    D0,n_wavecontrol(A6)
  1188.         RTS
  1189.  
  1190. mt_SetFineTune
  1191.         MOVE.B  n_cmdlo(A6),D0
  1192.         AND.B   #$0F,D0
  1193.         MOVE.B  D0,n_finetune(A6)
  1194.         RTS
  1195.  
  1196. mt_JumpLoop
  1197.         TST.B   mt_counter
  1198.         BNE     mt_Return2
  1199.         MOVE.B  n_cmdlo(A6),D0
  1200.         AND.B   #$0F,D0
  1201.         BEQ.S   mt_SetLoop
  1202.         TST.B   n_loopcount(A6)
  1203.         BEQ.S   mt_jumpcnt
  1204.         SUBQ.B  #1,n_loopcount(A6)
  1205.         BEQ     mt_Return2
  1206. mt_jmploop
  1207.         MOVE.B  n_pattpos(A6),mt_PBreakPos
  1208.         ST      mt_PBreakFlag
  1209.         RTS
  1210.  
  1211. mt_jumpcnt
  1212.         MOVE.B  D0,n_loopcount(A6)
  1213.         BRA.S   mt_jmploop
  1214.  
  1215. mt_SetLoop
  1216.         MOVE.W  mt_PatternPos(PC),D0
  1217.         LSR.W   #4,D0
  1218.         MOVE.B  D0,n_pattpos(A6)
  1219.         RTS
  1220.  
  1221. mt_SetTremoloControl
  1222.         MOVE.B  n_cmdlo(A6),D0
  1223.         AND.B   #$0F,D0
  1224.         LSL.B   #4,D0
  1225.         AND.B   #$0F,n_wavecontrol(A6)
  1226.         OR.B    D0,n_wavecontrol(A6)
  1227.         RTS
  1228.  
  1229. mt_RetrigNote
  1230.         MOVE.L  D1,-(SP)
  1231.         MOVEQ   #0,D0
  1232.         MOVE.B  n_cmdlo(A6),D0
  1233.         AND.B   #$0F,D0
  1234.         BEQ.S   mt_rtnend
  1235.         MOVEQ   #0,D1
  1236.         MOVE.B  mt_counter(PC),D1
  1237.         BNE.S   mt_rtnskp
  1238.         MOVE.W  (A6),D1
  1239.         AND.W   #$0FFF,D1
  1240.         BNE.S   mt_rtnend
  1241.         MOVEQ   #0,D1
  1242.         MOVE.B  mt_counter(PC),D1
  1243. mt_rtnskp
  1244.         DIVU    D0,D1
  1245.         SWAP    D1
  1246.         TST.W   D1
  1247.         BNE.S   mt_rtnend
  1248. mt_DoRetrig
  1249. *        MOVE.W  n_dmabit(A6),$DFF096    ; Channel DMA off
  1250. *        MOVE.L  n_start(A6),(A5)        ; Set sampledata pointer
  1251. *        MOVE.W  n_length(A6),4(A5)      ; Set length
  1252. *        bsr     dmawait
  1253. *        MOVE.W  n_dmabit(A6),D0
  1254. *        BSET    #15,D0
  1255. *        MOVE.W  D0,$DFF096
  1256. *        bsr     dmawait
  1257. *        MOVE.L  n_loopstart(A6),(A5)
  1258. *        MOVE.L  n_replen(A6),4(A5)
  1259.         movem.l d2-d4/a0-a1,-(sp)
  1260.         move.l  n_start(a6),a0
  1261.         moveq   #0,d0
  1262.         move.w  n_length(a6),d0
  1263.         add.l   d0,d0
  1264.         move.l  n_loopstart(a6),a1
  1265.         moveq   #0,d1
  1266.         move.w  n_replen(a6),d1
  1267.         cmp.w   #1,d1
  1268.         bne.b   \notone
  1269.         moveq   #0,d1
  1270. \notone
  1271.         add.l   d1,d1
  1272.         move.w  n_channelno(a6),d2
  1273.         moveq   #0,d3
  1274.         move.w  n_period(a6),d3
  1275.         swap    d3
  1276.         moveq   #0,d4
  1277.         move.b  n_volume(a6),d4
  1278.         lsl.w   #2,d4
  1279.         jsr     NoteStart(a5)
  1280.         movem.l (sp)+,d2-d4/a0-a1
  1281. mt_rtnend
  1282.         MOVE.L  (SP)+,D1
  1283.         RTS
  1284.  
  1285. mt_VolumeFineUp
  1286.         TST.B   mt_counter
  1287.         BNE     mt_Return2
  1288.         MOVEQ   #0,D0
  1289.         MOVE.B  n_cmdlo(A6),D0
  1290.         AND.B   #$F,D0
  1291.         BRA     mt_VolSlideUp
  1292.  
  1293. mt_VolumeFineDown
  1294.         TST.B   mt_counter
  1295.         BNE     mt_Return2
  1296.         MOVEQ   #0,D0
  1297.         MOVE.B  n_cmdlo(A6),D0
  1298.         AND.B   #$0F,D0
  1299.         BRA     mt_VolSlideDown2
  1300.  
  1301. mt_NoteCut
  1302.         MOVEQ   #0,D0
  1303.         MOVE.B  n_cmdlo(A6),D0
  1304.         AND.B   #$0F,D0
  1305.         CMP.B   mt_counter(PC),D0
  1306.         BNE     mt_Return2
  1307.         CLR.B   n_volume(A6)
  1308.         movem.l d1-d2/d4/a0-a1,-(sp)
  1309.         move.w  n_channelno(a6),d2
  1310.         moveq   #0,d4
  1311.         jsr     NoteVol(a5)
  1312.         movem.l (sp)+,d1-d2/d4/a0-a1
  1313.         RTS
  1314.  
  1315. mt_NoteDelay
  1316.         MOVEQ   #0,D0
  1317.         MOVE.B  n_cmdlo(A6),D0
  1318.         AND.B   #$0F,D0
  1319.         CMP.B   mt_counter,D0
  1320.         BNE     mt_Return2
  1321.         MOVE.W  (A6),D0
  1322.         BEQ     mt_Return2
  1323.         MOVE.L  D1,-(SP)
  1324.         BRA     mt_DoRetrig
  1325.  
  1326. mt_PatternDelay
  1327.         TST.B   mt_counter
  1328.         BNE     mt_Return2
  1329.         MOVEQ   #0,D0
  1330.         MOVE.B  n_cmdlo(A6),D0
  1331.         AND.B   #$0F,D0
  1332.         TST.B   mt_PattDelTime2
  1333.         BNE     mt_Return2
  1334.         ADDQ.B  #1,D0
  1335.         MOVE.B  D0,mt_PattDelTime
  1336.         RTS
  1337.  
  1338. mt_FunkIt
  1339.         TST.B   mt_counter
  1340.         BNE     mt_Return2
  1341.         MOVE.B  n_cmdlo(A6),D0
  1342.         AND.B   #$0F,D0
  1343.         LSL.B   #4,D0
  1344.         AND.B   #$0F,n_glissfunk(A6)
  1345.         OR.B    D0,n_glissfunk(A6)
  1346.         TST.B   D0
  1347.         BEQ     mt_Return2
  1348. mt_UpdateFunk
  1349.         MOVEM.L D1/A0,-(SP)
  1350.         MOVEQ   #0,D0
  1351.         MOVE.B  n_glissfunk(A6),D0
  1352.         LSR.B   #4,D0
  1353.         BEQ.S   mt_funkend
  1354.         LEA     mt_FunkTable(PC),A0
  1355.         MOVE.B  0(A0,D0.W),D0
  1356.         ADD.B   D0,n_funkoffset(A6)
  1357.         BTST    #7,n_funkoffset(A6)
  1358.         BEQ.S   mt_funkend
  1359.         CLR.B   n_funkoffset(A6)
  1360.  
  1361.         MOVE.L  n_loopstart(A6),D0
  1362.         MOVEQ   #0,D1
  1363.         MOVE.W  n_replen(A6),D1
  1364.         ADD.L   D1,D0
  1365.         ADD.L   D1,D0
  1366.         MOVE.L  n_wavestart(A6),A0
  1367.         ADDQ.L  #1,A0
  1368.         CMP.L   D0,A0
  1369.         BLO.S   mt_funkok
  1370.         MOVE.L  n_loopstart(A6),A0
  1371. mt_funkok
  1372.         MOVE.L  A0,n_wavestart(A6)
  1373.         MOVEQ   #-1,D0
  1374.         SUB.B   (A0),D0
  1375.         MOVE.B  D0,(A0)
  1376. mt_funkend
  1377.         MOVEM.L (SP)+,D1/A0
  1378.         RTS
  1379.  
  1380.  
  1381. SetTempo
  1382.         push    a0/d0/d1
  1383.         mw      d0,d1
  1384.         move.l  4,a0
  1385.         move.l  #1789773,d0
  1386.         cmp.b   #50,PowerSupplyFrequency(a0)
  1387.         bne.s   2$
  1388.         move.l  #1773447,d0
  1389. 2$      divu.w  d1,d0
  1390.         bsr     changetintcia
  1391.         pop     a0/d0/d1
  1392.         rts
  1393.  
  1394.  
  1395. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1396.  
  1397. mt_VibratoTable
  1398.         dc.b   0,24,49,74,97,120,141,161
  1399.         dc.b 180,197,212,224,235,244,250,253
  1400.         dc.b 255,253,250,244,235,224,212,197
  1401.         dc.b 180,161,141,120,97,74,49,24
  1402.  
  1403. mt_PeriodTable
  1404. ; Tuning 0, Normal
  1405.         dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1406.         dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1407.         dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1408. ; Tuning 1
  1409.         dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1410.         dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1411.         dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1412. ; Tuning 2
  1413.         dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1414.         dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1415.         dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1416. ; Tuning 3
  1417.         dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1418.         dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1419.         dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1420. ; Tuning 4
  1421.         dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1422.         dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1423.         dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1424. ; Tuning 5
  1425.         dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1426.         dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1427.         dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1428. ; Tuning 6
  1429.         dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1430.         dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1431.         dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1432. ; Tuning 7
  1433.         dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1434.         dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1435.         dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1436. ; Tuning -8
  1437.         dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1438.         dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1439.         dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1440. ; Tuning -7
  1441.         dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1442.         dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1443.         dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1444. ; Tuning -6
  1445.         dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1446.         dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1447.         dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1448. ; Tuning -5
  1449.         dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1450.         dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1451.         dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1452. ; Tuning -4
  1453.         dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1454.         dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1455.         dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1456. ; Tuning -3
  1457.         dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1458.         dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1459.         dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1460. ; Tuning -2
  1461.         dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1462.         dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1463.         dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1464. ; Tuning -1
  1465.         dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1466.         dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1467.         dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1468.  
  1469. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,0,0,0,0
  1470. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,0,0,0,1
  1471. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,0,0,0,2
  1472. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,0,0,0,3
  1473.  
  1474. mt_SampleStarts dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1475.                 dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1476.  
  1477. mt_SongDataPtr  dc.l 0
  1478.  
  1479. scroll          dc.l    0
  1480.  
  1481. noteplayer      dc.l    0
  1482.  
  1483. mt_PatternPos   dc.w 0
  1484. mt_DMACONtemp   dc.w 0
  1485.  
  1486. seqadj          dc.w    0               ; < Fix - for old modules
  1487. blkadj          dc.w    0
  1488.  
  1489. mt_speed        dc.b 0
  1490. mt_counter      dc.b 0
  1491. mt_SongPos      dc.b 0
  1492. mt_PBreakPos    dc.b 0
  1493. mt_PosJumpFlag  dc.b 0
  1494. mt_PBreakFlag   dc.b 0
  1495. mt_LowMask      dc.b 0
  1496. mt_PattDelTime  dc.b 0
  1497. mt_PattDelTime2 dc.b 0,0
  1498.  
  1499. modfilter       dc.b    0
  1500.  
  1501. playing         dc.b    0
  1502.  
  1503. name            dc.b    "Sound/Noise/ProTracker",0
  1504.  
  1505.         end