home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti7 / music.s < prev    next >
Text File  |  1995-10-23  |  22KB  |  1,156 lines

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