home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 2: Collection B / 17Bit_Collection_B.iso / files / 1750.dms / 1750.adf / PT-CIAPlay.s < prev    next >
Encoding:
Text File  |  2001-01-25  |  24.6 KB  |  1,301 lines

  1. ;********************************************
  2. ;* ----- Protracker V2.0A Playroutine ----- *
  3. ;* Lars "Zap" Hamre/Amiga Freelancers 1991  *
  4. ;* Bekkeliveien 10, N-2010 STRØMMEN, Norway *
  5. ;********************************************
  6.  
  7. DMAWait = 300 ; Set this as low as possible without losing low notes.
  8.  
  9. ; CIA Version 2:
  10. ; Call SetCIAInt to install the interrupt server. Then call mt_init
  11. ; to initialize the song. Playback starts when the mt_enable flag
  12. ; is set to a nonzero value. To end the song and turn off all voices,
  13. ; call mt_end. At last, call ResetCIAInt to remove the interrupt.
  14.  
  15. ; This playroutine is not very fast, optimized or well commented,
  16. ; but all the new commands in PT2.0 should work.
  17. ; If it's not good enough, you'll have to change it yourself.
  18. ; We'll try to write a faster routine soon...
  19.  
  20. ; Changes from V1.0C playroutine:
  21. ; - Vibrato depth changed to be compatible with Noisetracker 2.0.
  22. ;   You'll have to double all vib. depths on old PT modules.
  23. ; - Funk Repeat changed to Invert Loop (don't use it).
  24. ; - Period set back earlier when stopping an effect.
  25. ; - Fixed tremolo and toneportamento bugs.
  26.  
  27. ; You can use this routine to play a module. Just remove the semicolons.
  28. ; Exit by pressing both mousebuttons.
  29. ;
  30. ;main    BSR.S    SetCIAInt
  31. ;    BSR    mt_init
  32. ;    ST    mt_Enable
  33. ;    MOVE.L    4.W,A6
  34. ;    LEA    DOSname(PC),A1
  35. ;    MOVEQ    #0,D0
  36. ;    JSR    LVOOpenLibrary(A6)
  37. ;    TST.L    D0
  38. ;    BEQ.S    theend
  39. ;    MOVE.L    D0,A6
  40. ;wloop    MOVEQ    #10,D1
  41. ;    JSR    LVODelay(A6)
  42. ;    BTST    #6,$BFE001
  43. ;    BNE.S    wloop
  44. ;    BTST    #2,$DFF016
  45. ;    BNE.S    wloop
  46. ;    MOVE.L    A6,A1
  47. ;    MOVE.L    4.W,A6
  48. ;    JSR    LVOCloseLibrary(A6)
  49. ;theend    BSR    mt_end
  50. ;    BSR    ResetCIAInt
  51. ;    RTS
  52. ;
  53. ;DOSname    dc.b "dos.library",0
  54.  
  55. ;---- CIA Interrupt ----
  56.  
  57. AddICRVector    =   -6
  58. RemICRVector    =  -12
  59. LVOOpenResource    = -498
  60. LVOOpenLibrary     = -552
  61. LVOCloseLibrary    = -414
  62. LVODelay    = -198
  63.  
  64. ciatalo = $400
  65. ciatahi = $500
  66. ciatblo = $600
  67. ciatbhi = $700
  68. ciacra  = $E00
  69. ciacrb  = $F00
  70.  
  71. SetCIAInt
  72.     MOVEQ    #2,D6
  73.     LEA    $BFD000,A5
  74.     MOVE.B    #'b',CIAAname+3
  75. SetCIALoop
  76.     MOVEQ    #0,D0
  77.     LEA    CIAAname(PC),A1
  78.     MOVE.L    4.W,A6
  79.     JSR    LVOOpenResource(A6)
  80.     MOVE.L    D0,CIAAbase
  81.     BEQ    mt_Return
  82.  
  83.     LEA    GfxName(PC),A1
  84.     MOVEQ    #0,D0
  85.     JSR    LVOOpenLibrary(A6)
  86.     TST.L    D0
  87.     BEQ    ResetCIAInt
  88.     MOVE.L    D0,A1
  89.     MOVE.W    206(A1),D0    ; DisplayFlags
  90.     BTST    #2,D0        ; PAL?
  91.     BEQ.S    WasNTSC
  92.     MOVE.L    #1773447,D7 ; PAL
  93.     BRA.S    sciask
  94. WasNTSC    MOVE.L    #1789773,D7 ; NTSC
  95. sciask    MOVE.L    D7,TimerValue
  96.     DIVU    #125,D7 ; Default to normal 50 Hz timer
  97.     JSR    LVOCloseLibrary(A6)
  98.  
  99.     MOVE.L    CIAAbase(PC),A6
  100.     CMP.W    #2,D6
  101.     BEQ.S    TryTimerA
  102. TryTimerB
  103.     LEA    MusicIntServer(PC),A1
  104.     MOVEQ    #1,D0    ; Bit 1: Timer B
  105.     JSR    AddICRVector(A6)
  106.     MOVE.L    #1,TimerFlag
  107.     TST.L    D0
  108.     BNE.S    CIAError
  109.     MOVE.L    A5,CIAAaddr
  110.     MOVE.B    D7,ciatblo(A5)
  111.     LSR.W    #8,D7
  112.     MOVE.B    D7,ciatbhi(A5)
  113.     BSET    #0,ciacrb(A5)
  114.     RTS
  115.  
  116. TryTimerA
  117.     LEA    MusicIntServer(PC),A1
  118.     MOVEQ    #0,D0    ; Bit 0: Timer A
  119.     JSR    AddICRVector(A6)
  120.     CLR.L    TimerFlag
  121.     TST.L    D0
  122.     BNE.S    CIAError
  123.     MOVE.L    A5,CIAAaddr
  124.     MOVE.B    D7,ciatalo(A5)
  125.     LSR.W    #8,D7
  126.     MOVE.B    D7,ciatahi(A5)
  127.     BSET    #0,ciacra(A5)
  128.     RTS
  129.  
  130. CIAError
  131.     MOVE.B    #'a',CIAAname+3
  132.     LEA    $BFE001,A5
  133.     SUBQ.W    #1,D6
  134.     BNE    SetCIALoop
  135.     CLR.L    CIAAbase
  136.     RTS
  137.  
  138. ResetCIAInt
  139.     MOVE.L    CIAAbase(PC),D0
  140.     BEQ    mt_Return
  141.     CLR.L    CIAAbase
  142.     MOVE.L    D0,A6
  143.     MOVE.L    CIAAaddr(PC),A5
  144.     TST.L    TimerFlag
  145.     BEQ.S    ResTimerA
  146.  
  147.     BCLR    #0,ciacrb(A5)
  148.     MOVEQ    #1,D0
  149.     BRA.S    RemInt
  150.  
  151. ResTimerA
  152.     BCLR    #0,ciacra(A5)
  153.     MOVEQ    #0,D0
  154. RemInt    LEA    MusicIntServer(PC),A1
  155.     MOVEQ    #0,d0
  156.     JSR    RemICRVector(A6)
  157.     RTS
  158.  
  159. ;---- Tempo ----
  160.  
  161. SetTempo
  162.     MOVE.L    CIAAbase(PC),D2
  163.     BEQ    mt_Return
  164.     CMP.W    #32,D0
  165.     BHS.S    setemsk
  166.     MOVEQ    #32,D0
  167. setemsk    MOVE.W    D0,RealTempo
  168.     MOVE.L    TimerValue(PC),D2
  169.     DIVU    D0,D2
  170.     MOVE.L    CIAAaddr(PC),A4
  171.     MOVE.L    TimerFlag(PC),D0
  172.     BEQ.S    SetTemA
  173.     MOVE.B    D2,ciatblo(A4)
  174.     LSR.W    #8,D2
  175.     MOVE.B    D2,ciatbhi(A4)
  176.     RTS
  177.  
  178. SetTemA    MOVE.B    D2,ciatalo(A4)
  179.     LSR.W    #8,D2
  180.     MOVE.B    D2,ciatahi(A4)
  181.     RTS
  182.  
  183. RealTempo    dc.w 125
  184. CIAAaddr    dc.l 0
  185. CIAAname    dc.b "ciaa.resource",0
  186. CIAAbase    dc.l 0
  187. TimerFlag    dc.l 0
  188. TimerValue    dc.l 0
  189. GfxName        dc.b "graphics.library",0,0
  190.  
  191. MusicIntServer
  192.     dc.l 0,0
  193.     dc.b 2,5 ; type, priority
  194.     dc.l musintname
  195.     dc.l 0,mt_music
  196.  
  197. musintname    dc.b "Protracker MusicInt",0
  198.  
  199. ;---- Playroutine ----
  200.  
  201. n_note        EQU    0  ; W
  202. n_cmd        EQU    2  ; W
  203. n_cmdlo        EQU    3  ; B
  204. n_start        EQU    4  ; L
  205. n_length    EQU    8  ; W
  206. n_loopstart    EQU    10 ; L
  207. n_replen    EQU    14 ; W
  208. n_period    EQU    16 ; W
  209. n_finetune    EQU    18 ; B
  210. n_volume    EQU    19 ; B
  211. n_dmabit    EQU    20 ; W
  212. n_toneportdirec    EQU    22 ; B
  213. n_toneportspeed    EQU    23 ; B
  214. n_wantedperiod    EQU    24 ; W
  215. n_vibratocmd    EQU    26 ; B
  216. n_vibratopos    EQU    27 ; B
  217. n_tremolocmd    EQU    28 ; B
  218. n_tremolopos    EQU    29 ; B
  219. n_wavecontrol    EQU    30 ; B
  220. n_glissfunk    EQU    31 ; B
  221. n_sampleoffset    EQU    32 ; B
  222. n_pattpos    EQU    33 ; B
  223. n_loopcount    EQU    34 ; B
  224. n_funkoffset    EQU    35 ; B
  225. n_wavestart    EQU    36 ; L
  226. n_reallength    EQU    40 ; W
  227.  
  228. mt_init    LEA    mt_data,A0
  229.     MOVE.L    A0,mt_SongDataPtr
  230.     MOVE.L    A0,A1
  231.     LEA    952(A1),A1
  232.     MOVEQ    #127,D0
  233.     MOVEQ    #0,D1
  234. mtloop    MOVE.L    D1,D2
  235.     SUBQ.W    #1,D0
  236. mtloop2    MOVE.B    (A1)+,D1
  237.     CMP.B    D2,D1
  238.     BGT.S    mtloop
  239.     DBRA    D0,mtloop2
  240.     ADDQ.B    #1,D2
  241.             
  242.     LEA    mt_SampleStarts(PC),A1
  243.     ASL.L    #8,D2
  244.     ASL.L    #2,D2
  245.     ADD.L    #1084,D2
  246.     ADD.L    A0,D2
  247.     MOVE.L    D2,A2
  248.     MOVEQ    #30,D0
  249. mtloop3    CLR.L    (A2)
  250.     MOVE.L    A2,(A1)+
  251.     MOVEQ    #0,D1
  252.     MOVE.W    42(A0),D1
  253.     ASL.L    #1,D1
  254.     ADD.L    D1,A2
  255.     ADD.L    #30,A0
  256.     DBRA    D0,mtloop3
  257.  
  258.     OR.B    #2,$BFE001
  259.     MOVE.B    #6,mt_speed
  260.     CLR.B    mt_counter
  261.     CLR.B    mt_SongPos
  262.     CLR.W    mt_PatternPos
  263. mt_end    SF    mt_Enable
  264.     LEA    $DFF000,A0
  265.     CLR.W    $A8(A0)
  266.     CLR.W    $B8(A0)
  267.     CLR.W    $C8(A0)
  268.     CLR.W    $D8(A0)
  269.     MOVE.W    #$F,$DFF096
  270.     RTS
  271.  
  272. mt_music
  273.     MOVEM.L    D0-D4/A0-A6,-(SP)
  274.     TST.B    mt_Enable
  275.     BEQ    mt_exit
  276.     ADDQ.B    #1,mt_counter
  277.     MOVE.B    mt_counter(PC),D0
  278.     CMP.B    mt_speed(PC),D0
  279.     BLO.S    mt_NoNewNote
  280.     CLR.B    mt_counter
  281.     TST.B    mt_PattDelTime2
  282.     BEQ.S    mt_GetNewNote
  283.     BSR.S    mt_NoNewAllChannels
  284.     BRA    mt_dskip
  285.  
  286. mt_NoNewNote
  287.     BSR.S    mt_NoNewAllChannels
  288.     BRA    mt_NoNewPosYet
  289.  
  290. mt_NoNewAllChannels
  291.     LEA    $DFF0A0,A5
  292.     LEA    mt_chan1temp(PC),A6
  293.     BSR    mt_CheckEfx
  294.     LEA    $DFF0B0,A5
  295.     LEA    mt_chan2temp(PC),A6
  296.     BSR    mt_CheckEfx
  297.     LEA    $DFF0C0,A5
  298.     LEA    mt_chan3temp(PC),A6
  299.     BSR    mt_CheckEfx
  300.     LEA    $DFF0D0,A5
  301.     LEA    mt_chan4temp(PC),A6
  302.     BRA    mt_CheckEfx
  303.  
  304. mt_GetNewNote
  305.     MOVE.L    mt_SongDataPtr(PC),A0
  306.     LEA    12(A0),A3
  307.     LEA    952(A0),A2    ;pattpo
  308.     LEA    1084(A0),A0    ;patterndata
  309.     MOVEQ    #0,D0
  310.     MOVEQ    #0,D1
  311.     MOVE.B    mt_SongPos(PC),D0
  312.     MOVE.B    (A2,D0.W),D1
  313.     ASL.L    #8,D1
  314.     ASL.L    #2,D1
  315.     ADD.W    mt_PatternPos(PC),D1
  316.     CLR.W    mt_DMACONtemp
  317.  
  318.     LEA    $DFF0A0,A5
  319.     LEA    mt_chan1temp(PC),A6
  320.     BSR.S    mt_PlayVoice
  321.     LEA    $DFF0B0,A5
  322.     LEA    mt_chan2temp(PC),A6
  323.     BSR.S    mt_PlayVoice
  324.     LEA    $DFF0C0,A5
  325.     LEA    mt_chan3temp(PC),A6
  326.     BSR.S    mt_PlayVoice
  327.     LEA    $DFF0D0,A5
  328.     LEA    mt_chan4temp(PC),A6
  329.     BSR.S    mt_PlayVoice
  330.     BRA    mt_SetDMA
  331.  
  332. mt_PlayVoice
  333.     TST.L    (A6)
  334.     BNE.S    mt_plvskip
  335.     BSR    mt_PerNop
  336. mt_plvskip
  337.     MOVE.L    (A0,D1.L),(A6)
  338.     ADDQ.L    #4,D1
  339.     MOVEQ    #0,D2
  340.     MOVE.B    n_cmd(A6),D2
  341.     AND.B    #$F0,D2
  342.     LSR.B    #4,D2
  343.     MOVE.B    (A6),D0
  344.     AND.B    #$F0,D0
  345.     OR.B    D0,D2
  346.     TST.B    D2
  347.     BEQ    mt_SetRegs
  348.     MOVEQ    #0,D3
  349.     LEA    mt_SampleStarts(PC),A1
  350.     MOVE    D2,D4
  351.     SUBQ.L    #1,D2
  352.     ASL.L    #2,D2
  353.     MULU    #30,D4
  354.     MOVE.L    (A1,D2.L),n_start(A6)
  355.     MOVE.W    (A3,D4.L),n_length(A6)
  356.     MOVE.W    (A3,D4.L),n_reallength(A6)
  357.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  358.     MOVE.B    3(A3,D4.L),n_volume(A6)
  359.     MOVE.W    4(A3,D4.L),D3 ; Get repeat
  360.     TST.W    D3
  361.     BEQ.S    mt_NoLoop
  362.     MOVE.L    n_start(A6),D2    ; Get start
  363.     ASL.W    #1,D3
  364.     ADD.L    D3,D2        ; Add repeat
  365.     MOVE.L    D2,n_loopstart(A6)
  366.     MOVE.L    D2,n_wavestart(A6)
  367.     MOVE.W    4(A3,D4.L),D0    ; Get repeat
  368.     ADD.W    6(A3,D4.L),D0    ; Add replen
  369.     MOVE.W    D0,n_length(A6)
  370.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  371.     MOVEQ    #0,D0
  372.     MOVE.B    n_volume(A6),D0
  373.     MOVE.W    D0,8(A5)    ; Set volume
  374.     BRA.S    mt_SetRegs
  375.  
  376. mt_NoLoop
  377.     MOVE.L    n_start(A6),D2
  378.     ADD.L    D3,D2
  379.     MOVE.L    D2,n_loopstart(A6)
  380.     MOVE.L    D2,n_wavestart(A6)
  381.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  382.     MOVEQ    #0,D0
  383.     MOVE.B    n_volume(A6),D0
  384.     MOVE.W    D0,8(A5)    ; Set volume
  385. mt_SetRegs
  386.     MOVE.W    (A6),D0
  387.     AND.W    #$0FFF,D0
  388.     BEQ    mt_CheckMoreEfx    ; If no note
  389.     MOVE.W    2(A6),D0
  390.     AND.W    #$0FF0,D0
  391.     CMP.W    #$0E50,D0
  392.     BEQ.S    mt_DoSetFineTune
  393.     MOVE.B    2(A6),D0
  394.     AND.B    #$0F,D0
  395.     CMP.B    #3,D0    ; TonePortamento
  396.     BEQ.S    mt_ChkTonePorta
  397.     CMP.B    #5,D0
  398.     BEQ.S    mt_ChkTonePorta
  399.     CMP.B    #9,D0    ; Sample Offset
  400.     BNE.S    mt_SetPeriod
  401.     BSR    mt_CheckMoreEfx
  402.     BRA.S    mt_SetPeriod
  403.  
  404. mt_DoSetFineTune
  405.     BSR    mt_SetFineTune
  406.     BRA.S    mt_SetPeriod
  407.  
  408. mt_ChkTonePorta
  409.     BSR    mt_SetTonePorta
  410.     BRA    mt_CheckMoreEfx
  411.  
  412. mt_SetPeriod
  413.     MOVEM.L    D0-D1/A1,-(SP)
  414.     MOVE.W    (A6),D1
  415.     AND.W    #$0FFF,D1
  416.     LEA    mt_PeriodTable(PC),A1
  417.     MOVEQ    #0,D0
  418.     MOVEQ    #36,D4
  419. mt_ftuloop
  420.     CMP.W    (A1,D0.W),D1
  421.     BHS.S    mt_ftufound
  422.     ADDQ.L    #2,D0
  423.     DBRA    D4,mt_ftuloop
  424. mt_ftufound
  425.     MOVEQ    #0,D1
  426.     MOVE.B    n_finetune(A6),D1
  427.     MULU    #36*2,D1
  428.     ADD.L    D1,A1
  429.     MOVE.W    (A1,D0.W),n_period(A6)
  430.     MOVEM.L    (SP)+,D0-D1/A1
  431.  
  432.     MOVE.W    2(A6),D0
  433.     AND.W    #$0FF0,D0
  434.     CMP.W    #$0ED0,D0 ; Notedelay
  435.     BEQ    mt_CheckMoreEfx
  436.  
  437.     MOVE.W    n_dmabit(A6),$DFF096
  438.     BTST    #2,n_wavecontrol(A6)
  439.     BNE.S    mt_vibnoc
  440.     CLR.B    n_vibratopos(A6)
  441. mt_vibnoc
  442.     BTST    #6,n_wavecontrol(A6)
  443.     BNE.S    mt_trenoc
  444.     CLR.B    n_tremolopos(A6)
  445. mt_trenoc
  446.     MOVE.L    n_start(A6),(A5)    ; Set start
  447.     MOVE.W    n_length(A6),4(A5)    ; Set length
  448.     MOVE.W    n_period(A6),D0
  449.     MOVE.W    D0,6(A5)        ; Set period
  450.     MOVE.W    n_dmabit(A6),D0
  451.     OR.W    D0,mt_DMACONtemp
  452.     BRA    mt_CheckMoreEfx
  453.  
  454. mt_SetDMA
  455.     MOVE.W    #DMAWait,D0
  456. mt_WaitDMA
  457.     DBRA    D0,mt_WaitDMA
  458.     MOVE.W    mt_DMACONtemp(PC),D0
  459.     OR.W    #$8000,D0
  460.     MOVE.W    D0,$DFF096
  461.     MOVE.W    #DMAWait,D0
  462. mt_WaitDMA2
  463.     DBRA    D0,mt_WaitDMA2
  464.  
  465.     LEA    $DFF000,A5
  466.     LEA    mt_chan4temp(PC),A6
  467.     MOVE.L    n_loopstart(A6),$D0(A5)
  468.     MOVE.W    n_replen(A6),$D4(A5)
  469.     LEA    mt_chan3temp(PC),A6
  470.     MOVE.L    n_loopstart(A6),$C0(A5)
  471.     MOVE.W    n_replen(A6),$C4(A5)
  472.     LEA    mt_chan2temp(PC),A6
  473.     MOVE.L    n_loopstart(A6),$B0(A5)
  474.     MOVE.W    n_replen(A6),$B4(A5)
  475.     LEA    mt_chan1temp(PC),A6
  476.     MOVE.L    n_loopstart(A6),$A0(A5)
  477.     MOVE.W    n_replen(A6),$A4(A5)
  478.  
  479. mt_dskip
  480.     ADD.W    #16,mt_PatternPos
  481.     MOVE.B    mt_PattDelTime,D0
  482.     BEQ.S    mt_dskc
  483.     MOVE.B    D0,mt_PattDelTime2
  484.     CLR.B    mt_PattDelTime
  485. mt_dskc    TST.B    mt_PattDelTime2
  486.     BEQ.S    mt_dska
  487.     SUBQ.B    #1,mt_PattDelTime2
  488.     BEQ.S    mt_dska
  489.     SUB.W    #16,mt_PatternPos
  490. mt_dska    TST.B    mt_PBreakFlag
  491.     BEQ.S    mt_nnpysk
  492.     SF    mt_PBreakFlag
  493.     MOVEQ    #0,D0
  494.     MOVE.B    mt_PBreakPos(PC),D0
  495.     CLR.B    mt_PBreakPos
  496.     LSL.W    #4,D0
  497.     MOVE.W    D0,mt_PatternPos
  498. mt_nnpysk
  499.     CMP.W    #1024,mt_PatternPos
  500.     BLO.S    mt_NoNewPosYet
  501. mt_NextPosition    
  502.     MOVEQ    #0,D0
  503.     MOVE.B    mt_PBreakPos(PC),D0
  504.     LSL.W    #4,D0
  505.     MOVE.W    D0,mt_PatternPos
  506.     CLR.B    mt_PBreakPos
  507.     CLR.B    mt_PosJumpFlag
  508.     ADDQ.B    #1,mt_SongPos
  509.     AND.B    #$7F,mt_SongPos
  510.     MOVE.B    mt_SongPos(PC),D1
  511.     MOVE.L    mt_SongDataPtr(PC),A0
  512.     CMP.B    950(A0),D1
  513.     BLO.S    mt_NoNewPosYet
  514.     CLR.B    mt_SongPos
  515. mt_NoNewPosYet    
  516.     TST.B    mt_PosJumpFlag
  517.     BNE.S    mt_NextPosition
  518. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  519.     RTS
  520.  
  521. mt_CheckEfx
  522.     BSR    mt_UpdateFunk
  523.     MOVE.W    n_cmd(A6),D0
  524.     AND.W    #$0FFF,D0
  525.     BEQ.S    mt_PerNop
  526.     MOVE.B    n_cmd(A6),D0
  527.     AND.B    #$0F,D0
  528.     BEQ.S    mt_Arpeggio
  529.     CMP.B    #1,D0
  530.     BEQ    mt_PortaUp
  531.     CMP.B    #2,D0
  532.     BEQ    mt_PortaDown
  533.     CMP.B    #3,D0
  534.     BEQ    mt_TonePortamento
  535.     CMP.B    #4,D0
  536.     BEQ    mt_Vibrato
  537.     CMP.B    #5,D0
  538.     BEQ    mt_TonePlusVolSlide
  539.     CMP.B    #6,D0
  540.     BEQ    mt_VibratoPlusVolSlide
  541.     CMP.B    #$E,D0
  542.     BEQ    mt_E_Commands
  543. SetBack    MOVE.W    n_period(A6),6(A5)
  544.     CMP.B    #7,D0
  545.     BEQ    mt_Tremolo
  546.     CMP.B    #$A,D0
  547.     BEQ    mt_VolumeSlide
  548. mt_Return
  549.     RTS
  550.  
  551. mt_PerNop
  552.     MOVE.W    n_period(A6),6(A5)
  553.     RTS
  554.  
  555. mt_Arpeggio
  556.     MOVEQ    #0,D0
  557.     MOVE.B    mt_counter(PC),D0
  558.     DIVS    #3,D0
  559.     SWAP    D0
  560.     CMP.W    #0,D0
  561.     BEQ.S    mt_Arpeggio2
  562.     CMP.W    #2,D0
  563.     BEQ.S    mt_Arpeggio1
  564.     MOVEQ    #0,D0
  565.     MOVE.B    n_cmdlo(A6),D0
  566.     LSR.B    #4,D0
  567.     BRA.S    mt_Arpeggio3
  568.  
  569. mt_Arpeggio1
  570.     MOVEQ    #0,D0
  571.     MOVE.B    n_cmdlo(A6),D0
  572.     AND.B    #15,D0
  573.     BRA.S    mt_Arpeggio3
  574.  
  575. mt_Arpeggio2
  576.     MOVE.W    n_period(A6),D2
  577.     BRA.S    mt_Arpeggio4
  578.  
  579. mt_Arpeggio3
  580.     ASL.W    #1,D0
  581.     MOVEQ    #0,D1
  582.     MOVE.B    n_finetune(A6),D1
  583.     MULU    #36*2,D1
  584.     LEA    mt_PeriodTable(PC),A0
  585.     ADD.L    D1,A0
  586.     MOVEQ    #0,D1
  587.     MOVE.W    n_period(A6),D1
  588.     MOVEQ    #36,D3
  589. mt_arploop
  590.     MOVE.W    (A0,D0.W),D2
  591.     CMP.W    (A0),D1
  592.     BHS.S    mt_Arpeggio4
  593.     ADDQ.L    #2,A0
  594.     DBRA    D3,mt_arploop
  595.     RTS
  596.  
  597. mt_Arpeggio4
  598.     MOVE.W    D2,6(A5)
  599.     RTS
  600.  
  601. mt_FinePortaUp
  602.     TST.B    mt_counter
  603.     BNE.S    mt_Return
  604.     MOVE.B    #$0F,mt_LowMask
  605. mt_PortaUp
  606.     MOVEQ    #0,D0
  607.     MOVE.B    n_cmdlo(A6),D0
  608.     AND.B    mt_LowMask(PC),D0
  609.     MOVE.B    #$FF,mt_LowMask
  610.     SUB.W    D0,n_period(A6)
  611.     MOVE.W    n_period(A6),D0
  612.     AND.W    #$0FFF,D0
  613.     CMP.W    #113,D0
  614.     BPL.S    mt_PortaUskip
  615.     AND.W    #$F000,n_period(A6)
  616.     OR.W    #113,n_period(A6)
  617. mt_PortaUskip
  618.     MOVE.W    n_period(A6),D0
  619.     AND.W    #$0FFF,D0
  620.     MOVE.W    D0,6(A5)
  621.     RTS    
  622.  
  623. mt_FinePortaDown
  624.     TST.B    mt_counter
  625.     BNE    mt_Return
  626.     MOVE.B    #$0F,mt_LowMask
  627. mt_PortaDown
  628.     CLR.W    D0
  629.     MOVE.B    n_cmdlo(A6),D0
  630.     AND.B    mt_LowMask(PC),D0
  631.     MOVE.B    #$FF,mt_LowMask
  632.     ADD.W    D0,n_period(A6)
  633.     MOVE.W    n_period(A6),D0
  634.     AND.W    #$0FFF,D0
  635.     CMP.W    #856,D0
  636.     BMI.S    mt_PortaDskip
  637.     AND.W    #$F000,n_period(A6)
  638.     OR.W    #856,n_period(A6)
  639. mt_PortaDskip
  640.     MOVE.W    n_period(A6),D0
  641.     AND.W    #$0FFF,D0
  642.     MOVE.W    D0,6(A5)
  643.     RTS
  644.  
  645. mt_SetTonePorta
  646.     MOVE.L    A0,-(SP)
  647.     MOVE.W    (A6),D2
  648.     AND.W    #$0FFF,D2
  649.     LEA    mt_PeriodTable(PC),A0
  650.     ADD.L    D0,A0
  651.     MOVEQ    #0,D0
  652. mt_StpLoop
  653.     CMP.W    (A0,D0.W),D2
  654.     BHS.S    mt_StpFound
  655.     ADDQ.W    #2,D0
  656.     CMP.W    #36*2,D0
  657.     BLO.S    mt_StpLoop
  658.     MOVEQ    #35*2,D0
  659. mt_StpFound
  660.     MOVEQ    #0,D2
  661.     MOVE.B    n_finetune(A6),D2
  662.     MULU    #36*2,D2
  663.     ADD.L    D2,A0
  664.     MOVE.W    (A0,D0.W),D2
  665.     MOVE.L    (SP)+,A0
  666.     MOVE.W    D2,n_wantedperiod(A6)
  667.     MOVE.W    n_period(A6),D0
  668.     CLR.B    n_toneportdirec(A6)
  669.     CMP.W    D0,D2
  670.     BEQ.S    mt_ClearTonePorta
  671.     BGE    mt_Return
  672.     MOVE.B    #1,n_toneportdirec(A6)
  673.     RTS
  674.  
  675. mt_ClearTonePorta
  676.     CLR.W    n_wantedperiod(A6)
  677.     RTS
  678.  
  679. mt_TonePortamento
  680.     MOVE.B    n_cmdlo(A6),D0
  681.     BEQ.S    mt_TonePortNoChange
  682.     MOVE.B    D0,n_toneportspeed(A6)
  683.     CLR.B    n_cmdlo(A6)
  684. mt_TonePortNoChange
  685.     TST.W    n_wantedperiod(A6)
  686.     BEQ    mt_Return
  687.     MOVEQ    #0,D0
  688.     MOVE.B    n_toneportspeed(A6),D0
  689.     TST.B    n_toneportdirec(A6)
  690.     BNE.S    mt_TonePortaUp
  691. mt_TonePortaDown
  692.     ADD.W    D0,n_period(A6)
  693.     MOVE.W    n_wantedperiod(A6),D0
  694.     CMP.W    n_period(A6),D0
  695.     BGT.S    mt_TonePortaSetPer
  696.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  697.     CLR.W    n_wantedperiod(A6)
  698.     BRA.S    mt_TonePortaSetPer
  699.  
  700. mt_TonePortaUp
  701.     SUB.W    D0,n_period(A6)
  702.     MOVE.W    n_wantedperiod(A6),D0
  703.     CMP.W    n_period(A6),D0
  704.     BLT.S    mt_TonePortaSetPer
  705.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  706.     CLR.W    n_wantedperiod(A6)
  707.  
  708. mt_TonePortaSetPer
  709.     MOVE.W    n_period(A6),D2
  710.     MOVE.B    n_glissfunk(A6),D0
  711.     AND.B    #$0F,D0
  712.     BEQ.S    mt_GlissSkip
  713.     MOVEQ    #0,D0
  714.     MOVE.B    n_finetune(A6),D0
  715.     MULU    #36*2,D0
  716.     LEA    mt_PeriodTable(PC),A0
  717.     ADD.L    D0,A0
  718.     MOVEQ    #0,D0
  719. mt_GlissLoop
  720.     CMP.W    (A0,D0.W),D2
  721.     BHS.S    mt_GlissFound
  722.     ADDQ.W    #2,D0
  723.     CMP.W    #36*2,D0
  724.     BLO.S    mt_GlissLoop
  725.     MOVEQ    #35*2,D0
  726. mt_GlissFound
  727.     MOVE.W    (A0,D0.W),D2
  728. mt_GlissSkip
  729.     MOVE.W    D2,6(A5) ; Set period
  730.     RTS
  731.  
  732. mt_Vibrato
  733.     MOVE.B    n_cmdlo(A6),D0
  734.     BEQ.S    mt_Vibrato2
  735.     MOVE.B    n_vibratocmd(A6),D2
  736.     AND.B    #$0F,D0
  737.     BEQ.S    mt_vibskip
  738.     AND.B    #$F0,D2
  739.     OR.B    D0,D2
  740. mt_vibskip
  741.     MOVE.B    n_cmdlo(A6),D0
  742.     AND.B    #$F0,D0
  743.     BEQ.S    mt_vibskip2
  744.     AND.B    #$0F,D2
  745.     OR.B    D0,D2
  746. mt_vibskip2
  747.     MOVE.B    D2,n_vibratocmd(A6)
  748. mt_Vibrato2
  749.     MOVE.B    n_vibratopos(A6),D0
  750.     LEA    mt_VibratoTable(PC),A4
  751.     LSR.W    #2,D0
  752.     AND.W    #$001F,D0
  753.     MOVEQ    #0,D2
  754.     MOVE.B    n_wavecontrol(A6),D2
  755.     AND.B    #$03,D2
  756.     BEQ.S    mt_vib_sine
  757.     LSL.B    #3,D0
  758.     CMP.B    #1,D2
  759.     BEQ.S    mt_vib_rampdown
  760.     MOVE.B    #255,D2
  761.     BRA.S    mt_vib_set
  762. mt_vib_rampdown
  763.     TST.B    n_vibratopos(A6)
  764.     BPL.S    mt_vib_rampdown2
  765.     MOVE.B    #255,D2
  766.     SUB.B    D0,D2
  767.     BRA.S    mt_vib_set
  768. mt_vib_rampdown2
  769.     MOVE.B    D0,D2
  770.     BRA.S    mt_vib_set
  771. mt_vib_sine
  772.     MOVE.B    (A4,D0.W),D2
  773. mt_vib_set
  774.     MOVE.B    n_vibratocmd(A6),D0
  775.     AND.W    #15,D0
  776.     MULU    D0,D2
  777.     LSR.W    #7,D2
  778.     MOVE.W    n_period(A6),D0
  779.     TST.B    n_vibratopos(A6)
  780.     BMI.S    mt_VibratoNeg
  781.     ADD.W    D2,D0
  782.     BRA.S    mt_Vibrato3
  783. mt_VibratoNeg
  784.     SUB.W    D2,D0
  785. mt_Vibrato3
  786.     MOVE.W    D0,6(A5)
  787.     MOVE.B    n_vibratocmd(A6),D0
  788.     LSR.W    #2,D0
  789.     AND.W    #$003C,D0
  790.     ADD.B    D0,n_vibratopos(A6)
  791.     RTS
  792.  
  793. mt_TonePlusVolSlide
  794.     BSR    mt_TonePortNoChange
  795.     BRA    mt_VolumeSlide
  796.  
  797. mt_VibratoPlusVolSlide
  798.     BSR.S    mt_Vibrato2
  799.     BRA    mt_VolumeSlide
  800.  
  801. mt_Tremolo
  802.     MOVE.B    n_cmdlo(A6),D0
  803.     BEQ.S    mt_Tremolo2
  804.     MOVE.B    n_tremolocmd(A6),D2
  805.     AND.B    #$0F,D0
  806.     BEQ.S    mt_treskip
  807.     AND.B    #$F0,D2
  808.     OR.B    D0,D2
  809. mt_treskip
  810.     MOVE.B    n_cmdlo(A6),D0
  811.     AND.B    #$F0,D0
  812.     BEQ.S    mt_treskip2
  813.     AND.B    #$0F,D2
  814.     OR.B    D0,D2
  815. mt_treskip2
  816.     MOVE.B    D2,n_tremolocmd(A6)
  817. mt_Tremolo2
  818.     MOVE.B    n_tremolopos(A6),D0
  819.     LEA    mt_VibratoTable(PC),A4
  820.     LSR.W    #2,D0
  821.     AND.W    #$001F,D0
  822.     MOVEQ    #0,D2
  823.     MOVE.B    n_wavecontrol(A6),D2
  824.     LSR.B    #4,D2
  825.     AND.B    #$03,D2
  826.     BEQ.S    mt_tre_sine
  827.     LSL.B    #3,D0
  828.     CMP.B    #1,D2
  829.     BEQ.S    mt_tre_rampdown
  830.     MOVE.B    #255,D2
  831.     BRA.S    mt_tre_set
  832. mt_tre_rampdown
  833.     TST.B    n_tremolopos(A6)
  834.     BPL.S    mt_tre_rampdown2
  835.     MOVE.B    #255,D2
  836.     SUB.B    D0,D2
  837.     BRA.S    mt_tre_set
  838. mt_tre_rampdown2
  839.     MOVE.B    D0,D2
  840.     BRA.S    mt_tre_set
  841. mt_tre_sine
  842.     MOVE.B    (A4,D0.W),D2
  843. mt_tre_set
  844.     MOVE.B    n_tremolocmd(A6),D0
  845.     AND.W    #15,D0
  846.     MULU    D0,D2
  847.     LSR.W    #6,D2
  848.     MOVEQ    #0,D0
  849.     MOVE.B    n_volume(A6),D0
  850.     TST.B    n_tremolopos(A6)
  851.     BMI.S    mt_TremoloNeg
  852.     ADD.W    D2,D0
  853.     BRA.S    mt_Tremolo3
  854. mt_TremoloNeg
  855.     SUB.W    D2,D0
  856. mt_Tremolo3
  857.     BPL.S    mt_TremoloSkip
  858.     CLR.W    D0
  859. mt_TremoloSkip
  860.     CMP.W    #$40,D0
  861.     BLS.S    mt_TremoloOk
  862.     MOVE.W    #$40,D0
  863. mt_TremoloOk
  864.     MOVE.W    D0,8(A5)
  865.     MOVE.B    n_tremolocmd(A6),D0
  866.     LSR.W    #2,D0
  867.     AND.W    #$003C,D0
  868.     ADD.B    D0,n_tremolopos(A6)
  869.     RTS
  870.  
  871. mt_SampleOffset
  872.     MOVEQ    #0,D0
  873.     MOVE.B    n_cmdlo(A6),D0
  874.     BEQ.S    mt_sononew
  875.     MOVE.B    D0,n_sampleoffset(A6)
  876. mt_sononew
  877.     MOVE.B    n_sampleoffset(A6),D0
  878.     LSL.W    #7,D0
  879.     CMP.W    n_length(A6),D0
  880.     BGE.S    mt_sofskip
  881.     SUB.W    D0,n_length(A6)
  882.     LSL.W    #1,D0
  883.     ADD.L    D0,n_start(A6)
  884.     RTS
  885. mt_sofskip
  886.     MOVE.W    #$0001,n_length(A6)
  887.     RTS
  888.  
  889. mt_VolumeSlide
  890.     MOVEQ    #0,D0
  891.     MOVE.B    n_cmdlo(A6),D0
  892.     LSR.B    #4,D0
  893.     TST.B    D0
  894.     BEQ.S    mt_VolSlideDown
  895. mt_VolSlideUp
  896.     ADD.B    D0,n_volume(A6)
  897.     CMP.B    #$40,n_volume(A6)
  898.     BMI.S    mt_vsuskip
  899.     MOVE.B    #$40,n_volume(A6)
  900. mt_vsuskip
  901.     MOVE.B    n_volume(A6),D0
  902.     MOVE.W    D0,8(A5)
  903.     RTS
  904.  
  905. mt_VolSlideDown
  906.     MOVEQ    #0,D0
  907.     MOVE.B    n_cmdlo(A6),D0
  908.     AND.B    #$0F,D0
  909. mt_VolSlideDown2
  910.     SUB.B    D0,n_volume(A6)
  911.     BPL.S    mt_vsdskip
  912.     CLR.B    n_volume(A6)
  913. mt_vsdskip
  914.     MOVE.B    n_volume(A6),D0
  915.     MOVE.W    D0,8(A5)
  916.     RTS
  917.  
  918. mt_PositionJump
  919.     MOVE.B    n_cmdlo(A6),D0
  920.     SUBQ.B    #1,D0
  921.     MOVE.B    D0,mt_SongPos
  922. mt_pj2    CLR.B    mt_PBreakPos
  923.     ST     mt_PosJumpFlag
  924.     RTS
  925.  
  926. mt_VolumeChange
  927.     MOVEQ    #0,D0
  928.     MOVE.B    n_cmdlo(A6),D0
  929.     CMP.B    #$40,D0
  930.     BLS.S    mt_VolumeOk
  931.     MOVEQ    #$40,D0
  932. mt_VolumeOk
  933.     MOVE.B    D0,n_volume(A6)
  934.     MOVE.W    D0,8(A5)
  935.     RTS
  936.  
  937. mt_PatternBreak
  938.     MOVEQ    #0,D0
  939.     MOVE.B    n_cmdlo(A6),D0
  940.     MOVE.L    D0,D2
  941.     LSR.B    #4,D0
  942.     MULU    #10,D0
  943.     AND.B    #$0F,D2
  944.     ADD.B    D2,D0
  945.     CMP.B    #63,D0
  946.     BHI.S    mt_pj2
  947.     MOVE.B    D0,mt_PBreakPos
  948.     ST    mt_PosJumpFlag
  949.     RTS
  950.  
  951. mt_SetSpeed
  952.     MOVEQ    #0,D0
  953.     MOVE.B    3(A6),D0
  954.     BEQ    mt_end
  955.     CMP.B    #32,D0
  956.     BHS    SetTempo
  957.     CLR.B    mt_counter
  958.     MOVE.B    D0,mt_speed
  959.     RTS
  960.  
  961. mt_CheckMoreEfx
  962.     BSR    mt_UpdateFunk
  963.     MOVE.B    2(A6),D0
  964.     AND.B    #$0F,D0
  965.     CMP.B    #$9,D0
  966.     BEQ    mt_SampleOffset
  967.     CMP.B    #$B,D0
  968.     BEQ    mt_PositionJump
  969.     CMP.B    #$D,D0
  970.     BEQ.S    mt_PatternBreak
  971.     CMP.B    #$E,D0
  972.     BEQ.S    mt_E_Commands
  973.     CMP.B    #$F,D0
  974.     BEQ.S    mt_SetSpeed
  975.     CMP.B    #$C,D0
  976.     BEQ    mt_VolumeChange
  977.     BRA    mt_PerNop
  978.  
  979. mt_E_Commands
  980.     MOVE.B    n_cmdlo(A6),D0
  981.     AND.B    #$F0,D0
  982.     LSR.B    #4,D0
  983.     BEQ.S    mt_FilterOnOff
  984.     CMP.B    #1,D0
  985.     BEQ    mt_FinePortaUp
  986.     CMP.B    #2,D0
  987.     BEQ    mt_FinePortaDown
  988.     CMP.B    #3,D0
  989.     BEQ.S    mt_SetGlissControl
  990.     CMP.B    #4,D0
  991.     BEQ    mt_SetVibratoControl
  992.     CMP.B    #5,D0
  993.     BEQ    mt_SetFineTune
  994.     CMP.B    #6,D0
  995.     BEQ    mt_JumpLoop
  996.     CMP.B    #7,D0
  997.     BEQ    mt_SetTremoloControl
  998.     CMP.B    #9,D0
  999.     BEQ    mt_RetrigNote
  1000.     CMP.B    #$A,D0
  1001.     BEQ    mt_VolumeFineUp
  1002.     CMP.B    #$B,D0
  1003.     BEQ    mt_VolumeFineDown
  1004.     CMP.B    #$C,D0
  1005.     BEQ    mt_NoteCut
  1006.     CMP.B    #$D,D0
  1007.     BEQ    mt_NoteDelay
  1008.     CMP.B    #$E,D0
  1009.     BEQ    mt_PatternDelay
  1010.     CMP.B    #$F,D0
  1011.     BEQ    mt_FunkIt
  1012.     RTS
  1013.  
  1014. mt_FilterOnOff
  1015.     MOVE.B    n_cmdlo(A6),D0
  1016.     AND.B    #1,D0
  1017.     ASL.B    #1,D0
  1018.     AND.B    #$FD,$BFE001
  1019.     OR.B    D0,$BFE001
  1020.     RTS    
  1021.  
  1022. mt_SetGlissControl
  1023.     MOVE.B    n_cmdlo(A6),D0
  1024.     AND.B    #$0F,D0
  1025.     AND.B    #$F0,n_glissfunk(A6)
  1026.     OR.B    D0,n_glissfunk(A6)
  1027.     RTS
  1028.  
  1029. mt_SetVibratoControl
  1030.     MOVE.B    n_cmdlo(A6),D0
  1031.     AND.B    #$0F,D0
  1032.     AND.B    #$F0,n_wavecontrol(A6)
  1033.     OR.B    D0,n_wavecontrol(A6)
  1034.     RTS
  1035.  
  1036. mt_SetFineTune
  1037.     MOVE.B    n_cmdlo(A6),D0
  1038.     AND.B    #$0F,D0
  1039.     MOVE.B    D0,n_finetune(A6)
  1040.     RTS
  1041.  
  1042. mt_JumpLoop
  1043.     TST.B    mt_counter
  1044.     BNE    mt_Return
  1045.     MOVE.B    n_cmdlo(A6),D0
  1046.     AND.B    #$0F,D0
  1047.     BEQ.S    mt_SetLoop
  1048.     TST.B    n_loopcount(A6)
  1049.     BEQ.S    mt_jumpcnt
  1050.     SUBQ.B    #1,n_loopcount(A6)
  1051.     BEQ    mt_Return
  1052. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1053.     ST    mt_PBreakFlag
  1054.     RTS
  1055.  
  1056. mt_jumpcnt
  1057.     MOVE.B    D0,n_loopcount(A6)
  1058.     BRA.S    mt_jmploop
  1059.  
  1060. mt_SetLoop
  1061.     MOVE.W    mt_PatternPos(PC),D0
  1062.     LSR.W    #4,D0
  1063.     MOVE.B    D0,n_pattpos(A6)
  1064.     RTS
  1065.  
  1066. mt_SetTremoloControl
  1067.     MOVE.B    n_cmdlo(A6),D0
  1068.     AND.B    #$0F,D0
  1069.     LSL.B    #4,D0
  1070.     AND.B    #$0F,n_wavecontrol(A6)
  1071.     OR.B    D0,n_wavecontrol(A6)
  1072.     RTS
  1073.  
  1074. mt_RetrigNote
  1075.     MOVE.L    D1,-(SP)
  1076.     MOVEQ    #0,D0
  1077.     MOVE.B    n_cmdlo(A6),D0
  1078.     AND.B    #$0F,D0
  1079.     BEQ.S    mt_rtnend
  1080.     MOVEQ    #0,D1
  1081.     MOVE.B    mt_counter(PC),D1
  1082.     BNE.S    mt_rtnskp
  1083.     MOVE.W    (A6),D1
  1084.     AND.W    #$0FFF,D1
  1085.     BNE.S    mt_rtnend
  1086.     MOVEQ    #0,D1
  1087.     MOVE.B    mt_counter(PC),D1
  1088. mt_rtnskp
  1089.     DIVU    D0,D1
  1090.     SWAP    D1
  1091.     TST.W    D1
  1092.     BNE.S    mt_rtnend
  1093. mt_DoRetrig
  1094.     MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1095.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1096.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1097.     MOVE.W    #DMAwait,D0
  1098. mt_rtnloop1
  1099.     DBRA    D0,mt_rtnloop1
  1100.     MOVE.W    n_dmabit(A6),D0
  1101.     BSET    #15,D0
  1102.     MOVE.W    D0,$DFF096
  1103.     MOVE.W    #DMAwait,D0
  1104. mt_rtnloop2
  1105.     DBRA    D0,mt_rtnloop2
  1106.     MOVE.L    n_loopstart(A6),(A5)
  1107.     MOVE.L    n_replen(A6),4(A5)
  1108. mt_rtnend
  1109.     MOVE.L    (SP)+,D1
  1110.     RTS
  1111.  
  1112. mt_VolumeFineUp
  1113.     TST.B    mt_counter
  1114.     BNE    mt_Return
  1115.     MOVEQ    #0,D0
  1116.     MOVE.B    n_cmdlo(A6),D0
  1117.     AND.B    #$F,D0
  1118.     BRA    mt_VolSlideUp
  1119.  
  1120. mt_VolumeFineDown
  1121.     TST.B    mt_counter
  1122.     BNE    mt_Return
  1123.     MOVEQ    #0,D0
  1124.     MOVE.B    n_cmdlo(A6),D0
  1125.     AND.B    #$0F,D0
  1126.     BRA    mt_VolSlideDown2
  1127.  
  1128. mt_NoteCut
  1129.     MOVEQ    #0,D0
  1130.     MOVE.B    n_cmdlo(A6),D0
  1131.     AND.B    #$0F,D0
  1132.     CMP.B    mt_counter(PC),D0
  1133.     BNE    mt_Return
  1134.     CLR.B    n_volume(A6)
  1135.     MOVE.W    #0,8(A5)
  1136.     RTS
  1137.  
  1138. mt_NoteDelay
  1139.     MOVEQ    #0,D0
  1140.     MOVE.B    n_cmdlo(A6),D0
  1141.     AND.B    #$0F,D0
  1142.     CMP.B    mt_Counter,D0
  1143.     BNE    mt_Return
  1144.     MOVE.W    (A6),D0
  1145.     BEQ    mt_Return
  1146.     MOVE.L    D1,-(SP)
  1147.     BRA    mt_DoRetrig
  1148.  
  1149. mt_PatternDelay
  1150.     TST.B    mt_counter
  1151.     BNE    mt_Return
  1152.     MOVEQ    #0,D0
  1153.     MOVE.B    n_cmdlo(A6),D0
  1154.     AND.B    #$0F,D0
  1155.     TST.B    mt_PattDelTime2
  1156.     BNE    mt_Return
  1157.     ADDQ.B    #1,D0
  1158.     MOVE.B    D0,mt_PattDelTime
  1159.     RTS
  1160.  
  1161. mt_FunkIt
  1162.     TST.B    mt_counter
  1163.     BNE    mt_Return
  1164.     MOVE.B    n_cmdlo(A6),D0
  1165.     AND.B    #$0F,D0
  1166.     LSL.B    #4,D0
  1167.     AND.B    #$0F,n_glissfunk(A6)
  1168.     OR.B    D0,n_glissfunk(A6)
  1169.     TST.B    D0
  1170.     BEQ    mt_Return
  1171. mt_UpdateFunk
  1172.     MOVEM.L    A0/D1,-(SP)
  1173.     MOVEQ    #0,D0
  1174.     MOVE.B    n_glissfunk(A6),D0
  1175.     LSR.B    #4,D0
  1176.     BEQ.S    mt_funkend
  1177.     LEA    mt_FunkTable(PC),A0
  1178.     MOVE.B    (A0,D0.W),D0
  1179.     ADD.B    D0,n_funkoffset(A6)
  1180.     BTST    #7,n_funkoffset(A6)
  1181.     BEQ.S    mt_funkend
  1182.     CLR.B    n_funkoffset(A6)
  1183.  
  1184.     MOVE.L    n_loopstart(A6),D0
  1185.     MOVEQ    #0,D1
  1186.     MOVE.W    n_replen(A6),D1
  1187.     ADD.L    D1,D0
  1188.     ADD.L    D1,D0
  1189.     MOVE.L    n_wavestart(A6),A0
  1190.     ADDQ.L    #1,A0
  1191.     CMP.L    D0,A0
  1192.     BLO.S    mt_funkok
  1193.     MOVE.L    n_loopstart(A6),A0
  1194. mt_funkok
  1195.     MOVE.L    A0,n_wavestart(A6)
  1196.     MOVEQ    #-1,D0
  1197.     SUB.B    (A0),D0
  1198.     MOVE.B    D0,(A0)
  1199. mt_funkend
  1200.     MOVEM.L    (SP)+,A0/D1
  1201.     RTS
  1202.  
  1203.  
  1204. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1205.  
  1206. mt_VibratoTable    
  1207.     dc.b   0, 24, 49, 74, 97,120,141,161
  1208.     dc.b 180,197,212,224,235,244,250,253
  1209.     dc.b 255,253,250,244,235,224,212,197
  1210.     dc.b 180,161,141,120, 97, 74, 49, 24
  1211.  
  1212. mt_PeriodTable
  1213. ; Tuning 0, Normal
  1214.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1215.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1216.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1217. ; Tuning 1
  1218.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1219.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1220.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1221. ; Tuning 2
  1222.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1223.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1224.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1225. ; Tuning 3
  1226.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1227.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1228.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1229. ; Tuning 4
  1230.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1231.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1232.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1233. ; Tuning 5
  1234.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1235.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1236.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1237. ; Tuning 6
  1238.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1239.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1240.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1241. ; Tuning 7
  1242.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1243.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1244.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1245. ; Tuning -8
  1246.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1247.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1248.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1249. ; Tuning -7
  1250.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1251.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1252.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1253. ; Tuning -6
  1254.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1255.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1256.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1257. ; Tuning -5
  1258.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1259.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1260.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1261. ; Tuning -4
  1262.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1263.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1264.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1265. ; Tuning -3
  1266.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1267.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1268.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1269. ; Tuning -2
  1270.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1271.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1272.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1273. ; Tuning -1
  1274.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1275.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1276.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1277.  
  1278. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0
  1279. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1280. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1281. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1282.  
  1283. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1284.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1285.  
  1286. mt_SongDataPtr    dc.l 0
  1287. mt_speed    dc.b 6
  1288. mt_counter    dc.b 0
  1289. mt_SongPos    dc.b 0
  1290. mt_PBreakPos    dc.b 0
  1291. mt_PosJumpFlag    dc.b 0
  1292. mt_PBreakFlag    dc.b 0
  1293. mt_LowMask    dc.b 0
  1294. mt_PattDelTime    dc.b 0
  1295. mt_PattDelTime2    dc.b 0
  1296. mt_Enable    dc.b 0
  1297. mt_PatternPos    dc.w 0
  1298. mt_DMACONtemp    dc.w 0
  1299.  
  1300. ;/* End of File */
  1301.