home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 4: Demo 1 / almathera_demo1.bin / protracker / pt-ciaplay.s < prev    next >
Text File  |  1995-03-17  |  25KB  |  1,306 lines

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