home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / datafiles / text / howtocode / source / protracker_replay.s < prev    next >
Text File  |  1995-02-27  |  23KB  |  1,175 lines

  1. * ProTracker2.2a replay routine by Crayon/Noxious. Improved and modified
  2. * by Teeme of Fist! Unlimited in 1992. Share and enjoy! :)
  3. * Rewritten for Devpac (slightly..) by CJ. Devpac does not like bsr.L
  4. * cmpi is compare immediate, it requires immediate data! And some
  5. * labels had upper/lower case wrong...
  6. *
  7. * Now improved to make it work better if CIA timed - thanks Marco!
  8.  
  9. * Call Mt_data with A0 pointing to your module data...
  10.  
  11.  
  12. ExecBase = 4    ; Teeme, you *really* should use includes!
  13. Disable = -120    ; :-)
  14. Enable = -126    
  15.  
  16. N_Note = 0  ; W
  17. N_Cmd = 2  ; W
  18. N_Cmdlo = 3  ; B
  19. N_Start = 4  ; L
  20. N_Length = 8  ; W
  21. N_LoopStart = 10 ; L
  22. N_Replen = 14 ; W
  23. N_Period = 16 ; W
  24. N_FineTune = 18 ; B
  25. N_Volume = 19 ; B
  26. N_DMABit = 20 ; W
  27. N_TonePortDirec = 22 ; B
  28. N_TonePortSpeed = 23 ; B
  29. N_WantedPeriod = 24 ; W
  30. N_VibratoCmd = 26 ; B
  31. N_VibratoPos = 27 ; B
  32. N_TremoloCmd = 28 ; B
  33. N_TremoloPos = 29 ; B
  34. N_WaveControl = 30 ; B
  35. N_GlissFunk = 31 ; B
  36. N_SampleOffset = 32 ; B
  37. N_PattPos = 33 ; B
  38. N_LoopCount = 34 ; B
  39. N_FunkOffset = 35 ; B
  40. N_WaveStart = 36 ; L
  41. N_RealLength = 40 ; W
  42. MT_SongDataPtr = -18
  43. MT_Speed = -14
  44. MT_Counter = -13
  45. MT_SongPos = -12
  46. MT_PBreakPos = -11
  47. MT_PosJumpFlag = -10
  48. MT_PBreakFlag = -9
  49. MT_LowMask = -8
  50. MT_PattDelTime = -7
  51. MT_PattDelTime2 = -6
  52. MT_PatternPos = -4
  53. MT_DMACONTemp = -2
  54.  
  55.  
  56. ;    A little (not very good!) example code to
  57. ;      play a module
  58. ;
  59. ;    movem.l    d0-d7/a0-a6,-(a7)
  60. ;    move.l    ExecBase,a6
  61. ;    jsr    Disable(a6)
  62. ;    lea    Variables,a5
  63. ;    lea    $dff000,a6
  64. ;    bsr.s    MT_Init
  65. ;VBlankLoop:
  66. ;    cmpi.b    #$40,$dff006    ;should use WaitTOF()
  67. ;    bne.s    VBlankLoop    ;from graphics.library
  68. ;    bsr.L    mt_music
  69. ;    btst     #6,$bfe001
  70. ;    bne.s     VBlankLoop
  71. ;Exit:
  72. ;    bsr    MT_End
  73. ;    move.l    ExecBase,a6
  74. ;    jsr    Enable(a6)
  75. ;    movem.l    (a7)+,d0-d7/a0-a6
  76. ;    rts
  77.  
  78.  
  79.  
  80.  
  81. MT_Init:
  82.     move.l    a0,MT_SongDataPtr(a5)
  83.     lea    952(a0),a1
  84.     moveq    #127,D0
  85.     moveq    #0,D1
  86. MTLoop:
  87.     move.l    d1,d2
  88.     subq.w    #1,d0
  89. MTLoop2:
  90.     move.b    (a1)+,d1
  91.     cmp.b    d2,d1
  92.     bgt.s    MTLoop
  93.     dbf    d0,MTLoop2
  94.     addq.b    #1,d2
  95.             
  96.     move.l    a5,a1
  97.     suba.w    #142,a1
  98.     asl.l    #8,d2
  99.     asl.l    #2,d2
  100.     addi.l    #1084,d2
  101.     add.l    a0,d2
  102.     move.l    d2,a2
  103.     moveq    #30,d0
  104. MTLoop3:
  105.     clr.l    (a2)
  106.     move.l    a2,(a1)+
  107.     moveq    #0,d1
  108.     move.w    42(a0),d1
  109.     add.l    d1,d1
  110.     add.l    d1,a2
  111.     adda.w    #30,a0
  112.     dbf    d0,MTLoop3
  113.  
  114.     ori.b    #2,$bfe001
  115.     move.b    #6,MT_Speed(a5)
  116.     clr.b    MT_Counter(a5)
  117.     clr.b    MT_SongPos(a5)
  118.     clr.w    MT_PatternPos(a5)
  119. MT_End:
  120.     clr.w    $0A8(a6)
  121.     clr.w    $0B8(a6)
  122.     clr.w    $0C8(a6)
  123.     clr.w    $0D8(a6)
  124.     move.w    #$f,$096(a6)
  125.     rts
  126.  
  127. MT_Music:
  128.     movem.l    d0-d4/a0-a6,-(a7)
  129.     addq.b    #1,MT_Counter(a5)
  130.     move.b    MT_Counter(a5),d0
  131.     cmp.b    MT_Speed(a5),d0
  132.     blo.s    MT_NoNewNote
  133.     clr.b    MT_Counter(a5)
  134.     tst.b    MT_PattDelTime2(a5)
  135.     beq.s    MT_GetNewNote
  136.     bsr.s    MT_NoNewAllChannels
  137.     bra    MT_Dskip
  138.  
  139. MT_NoNewNote:
  140.     bsr.s    MT_NoNewAllChannels
  141.     bra    MT_NoNewPosYet
  142. MT_NoNewAllChannels:
  143.     move.w    #$a0,d5
  144.     move.l    a5,a4
  145.     suba.w    #318,a4
  146.     bsr    MT_CheckEfx
  147.     move.w    #$b0,d5
  148.     adda.w    #44,a4
  149.     bsr    MT_CheckEfx
  150.     move.w    #$c0,d5
  151.     adda.w    #44,a4
  152.     bsr    MT_CheckEfx
  153.     move.w    #$d0,d5
  154.     adda.w    #44,a4
  155.     bra    MT_CheckEfx
  156. MT_GetNewNote:
  157.     move.l    MT_SongDataPtr(a5),a0
  158.     lea    12(a0),a3
  159.     lea    952(a0),a2    ;pattpo
  160.     lea    1084(a0),a0    ;patterndata
  161.     moveq    #0,d0
  162.     moveq    #0,d1
  163.     move.b    MT_SongPos(a5),d0
  164.     move.b    (a2,d0.w),d1
  165.     asl.l    #8,d1
  166.     asl.l    #2,d1
  167.     add.w    MT_PatternPos(a5),d1
  168.     clr.w    MT_DMACONTemp(a5)
  169.  
  170.     move.w    #$a0,d5
  171.     move.l    a5,a4
  172.     suba.w    #318,a4
  173.     bsr.s    MT_PlayVoice
  174.     move.w    #$b0,d5
  175.     adda.w    #44,a4
  176.     bsr.s    MT_PlayVoice
  177.     move.w    #$c0,d5
  178.     adda.w    #44,a4
  179.     bsr.s    MT_PlayVoice
  180.     move.w    #$d0,d5
  181.     adda.w    #44,a4
  182.     bsr.s    MT_PlayVoice
  183.     bra    MT_SetDMA
  184.  
  185. MT_PlayVoice:
  186.     tst.l    (a4)
  187.     bne.s    MT_PlvSkip
  188.     bsr    MT_PerNop
  189. MT_PlvSkip:
  190.     move.l    (a0,d1.l),(a4)
  191.     addq.l    #4,d1
  192.     moveq    #0,d2
  193.     move.b    N_Cmd(a4),d2
  194.     andi.b    #$f0,d2
  195.     lsr.b    #4,d2
  196.     move.b    (a4),d0
  197.     andi.b    #$f0,d0
  198.     or.b    d0,d2
  199.     beq    MT_SetRegs
  200.     moveq    #0,d3
  201.     move.l    a5,a1
  202.     suba.w    #142,a1
  203.     move    d2,d4
  204.     subq.l    #1,d2
  205.     asl.l    #2,d2
  206.     mulu    #30,d4
  207.     move.l    (a1,d2.l),N_Start(a4)
  208.     move.w    (a3,d4.l),N_Length(a4)
  209.     move.w    (a3,d4.l),N_RealLength(a4)
  210.     move.b    2(a3,d4.l),N_FineTune(a4)
  211.     move.b    3(a3,d4.l),N_Volume(a4)
  212.     move.w    4(a3,d4.l),d3 ; Get repeat
  213.     beq.s    MT_NoLoop
  214.     move.l    N_Start(a4),d2 ; Get start
  215.     add.w    d3,d3
  216.     add.l    d3,d2        ; Add repeat
  217.     move.l    d2,N_LoopStart(a4)
  218.     move.l    d2,N_WaveStart(a4)
  219.     move.w    4(a3,d4.l),d0    ; Get repeat
  220.     add.w    6(a3,d4.l),d0    ; Add replen
  221.     move.w    d0,N_Length(a4)
  222.     move.w    6(a3,d4.l),N_Replen(a4)    ; Save replen
  223.     moveq    #0,d0
  224.     move.b    N_Volume(a4),d0
  225.     move.w    d0,8(a6,d5.w)    ; Set volume
  226.     bra.s    MT_SetRegs
  227.  
  228. MT_NoLoop:
  229.     move.l    N_Start(a4),d2
  230.     add.l    d3,d2
  231.     move.l    d2,N_LoopStart(a4)
  232.     move.l    d2,N_WaveStart(a4)
  233.     move.w    6(a3,d4.l),N_Replen(a4)    ; Save replen
  234.     moveq    #0,d0
  235.     move.b    N_Volume(a4),d0
  236.     move.w    d0,8(a6,d5.w)    ; Set volume
  237. MT_SetRegs:
  238.     move.w    (a4),d0
  239.     andi.w    #$0fff,d0
  240.     beq    MT_CheckMoreEfx    ; If no note
  241.     move.w    2(a4),d0
  242.     andi.w    #$0ff0,d0
  243.     cmpi.w    #$0e50,d0
  244.     beq.s    MT_DoSetFineTune
  245.     move.b    2(a4),d0
  246.     andi.b    #$0f,d0
  247.     cmpi.b    #3,d0    ; TonePortamento
  248.     beq.s    MT_ChkTonePorta
  249.     cmpi.b    #5,d0
  250.     beq.s    MT_ChkTonePorta
  251.     cmpi.b    #9,d0    ; Sample Offset
  252.     bne.s    MT_SetPeriod
  253.     bsr    MT_CheckMoreEfx
  254.     bra.s    MT_SetPeriod
  255.  
  256. MT_DoSetFineTune:
  257.     bsr    MT_SetFineTune
  258.     bra.s    MT_SetPeriod
  259.  
  260. MT_ChkTonePorta:
  261.     bsr    MT_SetTonePorta
  262.     bra    MT_CheckMoreEfx
  263.  
  264. MT_SetPeriod:
  265.     movem.l    d0-d1/a0-a1,-(a7)
  266.     move.w    (a4),d1
  267.     andi.w    #$0fff,d1
  268.     lea    MT_PeriodTable(pc),a1
  269.     moveq    #0,d0
  270.     moveq    #36,d7
  271. MT_FtuLoop:
  272.     cmp.w    (a1,d0.w),d1
  273.     bhs.s    MT_FtuFound
  274.     addq.l    #2,d0
  275.     dbf    d7,MT_FtuLoop
  276. MT_FtuFound:
  277.     moveq    #0,d1
  278.     move.b    N_FineTune(a4),d1
  279.     mulu    #72,d1
  280.     add.l    d1,a1
  281.     move.w    (a1,d0.w),N_Period(a4)
  282.     movem.l    (a7)+,d0-d1/a0-a1
  283.  
  284.     move.w    2(a4),d0
  285.     andi.w    #$0ff0,d0
  286.     cmpi.w    #$0ed0,d0 ; Notedelay
  287.     beq    MT_CheckMoreEfx
  288.  
  289.     move.w    N_DMABit(a4),$096(a6)
  290.     btst    #2,N_WaveControl(a4)
  291.     bne.s    MT_Vibnoc
  292.     clr.b    N_VibratoPos(a4)
  293. MT_Vibnoc:
  294.     btst    #6,N_WaveControl(a4)
  295.     bne.s    MT_Trenoc
  296.     clr.b    N_TremoloPos(a4)
  297. MT_Trenoc:
  298.     move.l    N_Start(a4),(a6,d5.w)    ; Set start
  299.     move.w    N_Length(a4),4(a6,d5.w)    ; Set length
  300.     move.w    N_Period(a4),d0
  301.     move.w    d0,6(a6,d5.w)        ; Set period
  302.     move.w    N_DMABit(a4),d0
  303.     or.w    d0,MT_DMACONTemp(a5)
  304.     bra    MT_CheckMoreEfx
  305.  
  306. MT_SetDMA:
  307.     bsr    MT_DMAWaitLoop
  308.     move.w    MT_DMACONTemp(a5),d0
  309.     ori.w    #$8000,d0
  310.     move.w    d0,$096(a6)
  311.     bsr    MT_DMAWaitLoop
  312.     move.l    a5,a4
  313.     suba.w    #186,a4
  314.     move.l    N_LoopStart(a4),$d0(a6)
  315.     move.w    N_Replen(a4),$d4(a6)
  316.     suba.w    #44,a4
  317.     move.l    N_LoopStart(a4),$c0(a6)
  318.     move.w    N_Replen(a4),$c4(a6)
  319.     suba.w    #44,a4
  320.     move.l    N_LoopStart(a4),$b0(a6)
  321.     move.w    N_Replen(a4),$b4(a6)
  322.     suba.w    #44,a4
  323.     move.l    N_LoopStart(a4),$a0(a6)
  324.     move.w    N_Replen(a4),$a4(a6)
  325.  
  326. MT_Dskip:
  327.     addi.w    #16,MT_PatternPos(a5)
  328.     move.b    MT_PattDelTime(a5),d0
  329.     beq.s    MT_Dskc
  330.     move.b    d0,MT_PattDelTime2(a5)
  331.     clr.b    MT_PattDelTime(a5)
  332. MT_Dskc:
  333.     tst.b    MT_PattDelTime2(a5)
  334.     beq.s    MT_Dska
  335.     subq.b    #1,MT_PattDelTime2(a5)
  336.     beq.s    MT_Dska
  337.     sub.w    #16,MT_PatternPos(a5)
  338. MT_Dska:
  339.     tst.b    MT_PBreakFlag(a5)
  340.     beq.s    MT_Nnpysk
  341.     clr.b    MT_PBreakFlag(a5)
  342.     moveq    #0,d0
  343.     move.b    MT_PBreakPos(a5),d0
  344.     clr.b    MT_PBreakPos(a5)
  345.     lsl.w    #4,d0
  346.     move.w    d0,MT_PatternPos(a5)
  347. MT_Nnpysk:
  348.     cmpi.w    #1024,MT_PatternPos(a5)
  349.     blo.s    MT_NoNewPosYet
  350. MT_NextPosition:    
  351.     moveq    #0,d0
  352.     move.b    MT_PBreakPos(a5),d0
  353.     lsl.w    #4,d0
  354.     move.w    d0,MT_PatternPos(a5)
  355.     clr.b    MT_PBreakPos(a5)
  356.     clr.b    MT_PosJumpFlag(a5)
  357.     addq.b    #1,MT_SongPos(a5)
  358.     andi.b    #$7F,MT_SongPos(a5)
  359.     move.b    MT_SongPos(a5),d1
  360.     move.l    MT_SongDataPtr(a5),a0
  361.     cmp.b    950(a0),d1
  362.     blo.s    MT_NoNewPosYet
  363.     clr.b    MT_SongPos(a5)
  364. MT_NoNewPosYet:    
  365.     tst.b    MT_PosJumpFlag(a5)
  366.     bne.s    MT_NextPosition
  367.     movem.l    (a7)+,d0-d4/a0-a6
  368.     rts
  369.  
  370. MT_CheckEfx:
  371.     bsr    MT_UpdateFunk
  372.     move.w    N_Cmd(a4),d0
  373.     andi.w    #$0fff,d0
  374.     beq.s    MT_PerNop
  375.     move.b    N_Cmd(a4),d0
  376.     andi.b    #$0f,d0
  377.     beq.s    MT_Arpeggio
  378.     cmpi.b    #1,d0
  379.     beq    MT_PortaUp
  380.     cmpi.b    #2,d0
  381.     beq    MT_PortaDown
  382.     cmpi.b    #3,d0
  383.     beq    MT_TonePortamento
  384.     cmpi.b    #4,d0
  385.     beq    MT_Vibrato
  386.     cmpi.b    #5,d0
  387.     beq    MT_TonePlusVolSlide
  388.     cmpi.b    #6,d0
  389.     beq    MT_VibratoPlusVolSlide
  390.     cmpi.b    #$E,d0
  391.     beq    MT_E_Commands
  392. SetBack:
  393.     move.w    N_Period(a4),6(a6,d5.w)
  394.     cmpi.b    #7,d0
  395.     beq    MT_Tremolo
  396.     cmpi.b    #$a,d0
  397.     beq    MT_VolumeSlide
  398. MT_Return2:
  399.     rts
  400.  
  401. MT_PerNop:
  402.     move.w    N_Period(a4),6(a6,d5.w)
  403.     rts
  404.  
  405. MT_Arpeggio:
  406.     moveq    #0,d0
  407.     move.b    MT_Counter(a5),d0
  408.     divs    #3,d0
  409.     swap    d0
  410.     tst.w    D0
  411.     beq.s    MT_Arpeggio2
  412.     cmpi.w    #2,d0
  413.     beq.s    MT_Arpeggio1
  414.     moveq    #0,d0
  415.     move.b    N_Cmdlo(a4),d0
  416.     lsr.b    #4,d0
  417.     bra.s    MT_Arpeggio3
  418.  
  419. MT_Arpeggio1:
  420.     moveq    #0,d0
  421.     move.b    N_Cmdlo(a4),d0
  422.     andi.b    #15,d0
  423.     bra.s    MT_Arpeggio3
  424.  
  425. MT_Arpeggio2:
  426.     move.w    N_Period(a4),d2
  427.     bra.s    MT_Arpeggio4
  428.  
  429. MT_Arpeggio3:
  430.     add.w    d0,d0
  431.     moveq    #0,d1
  432.     move.b    N_FineTune(a4),d1
  433.     mulu    #72,d1
  434.     lea    MT_PeriodTable(pc),a0
  435.     add.w    d1,a0
  436.     moveq    #0,d1
  437.     move.w    N_Period(a4),d1
  438.     moveq    #36,d7
  439. MT_ArpLoop:
  440.     move.w    (a0,d0.w),d2
  441.     cmp.w    (a0),d1
  442.     bhs.s    MT_Arpeggio4
  443.     addq.w    #2,a0
  444.     dbf    d7,MT_ArpLoop
  445.     rts
  446.  
  447. MT_Arpeggio4:
  448.     move.w    d2,6(a6,d5.w)
  449.     rts
  450.  
  451. MT_FinePortaUp:
  452.     tst.b    MT_Counter(a5)
  453.     bne.s    MT_Return2
  454.     move.b    #$0f,MT_LowMask(a5)
  455. MT_PortaUp:
  456.     moveq    #0,d0
  457.     move.b    N_Cmdlo(a4),d0
  458.     and.b    MT_LowMask(a5),d0
  459.     st    MT_LowMask(a5)
  460.     sub.w    d0,N_Period(a4)
  461.     move.w    N_Period(a4),d0
  462.     andi.w    #$0fff,d0
  463.     cmpi.w    #113,d0
  464.     bpl.s    MT_PortaUskip
  465.     andi.w    #$f000,N_Period(a4)
  466.     ori.w    #113,N_Period(a4)
  467. MT_PortaUskip:
  468.     move.w    N_Period(a4),d0
  469.     andi.w    #$0fff,d0
  470.     move.w    d0,6(a6,d5.w)
  471.     rts
  472.  
  473. MT_FinePortaDown:
  474.     tst.b    MT_Counter(a5)
  475.     bne    MT_Return2
  476.     move.b    #$0f,MT_LowMask(a5)
  477. MT_PortaDown:
  478.     clr.w    d0
  479.     move.b    N_Cmdlo(a4),d0
  480.     and.b    MT_LowMask(a5),d0
  481.     st    MT_LowMask(a5)
  482.     add.w    d0,N_Period(a4)
  483.     move.w    N_Period(a4),d0
  484.     andi.w    #$0fff,d0
  485.     cmpi.w    #856,d0
  486.     bmi.s    MT_PortaDskip
  487.     andi.w    #$f000,N_Period(a4)
  488.     ori.w    #856,N_Period(a4)
  489. MT_PortaDskip:
  490.     move.w    N_Period(a4),d0
  491.     andi.w    #$0fff,d0
  492.     move.w    d0,6(a6,d5.w)
  493.     rts
  494.  
  495. MT_SetTonePorta:
  496.     move.l    a0,-(a7)
  497.     move.w    (a4),d2
  498.     andi.w    #$0fff,d2
  499.     moveq    #0,d0
  500.     move.b    N_FineTune(a4),d0
  501.     mulu    #74,d0
  502.     lea    MT_PeriodTable(pc),a0
  503.     add.w    d0,a0
  504.     moveq    #0,d0
  505. MT_StpLoop:
  506.     cmp.w    (a0,d0.w),d2
  507.     bhs.s    MT_StpFound
  508.     addq.w    #2,d0
  509.     cmpi.w    #74,d0
  510.     blo.s    MT_StpLoop
  511.     moveq    #70,d0
  512. MT_StpFound:
  513.     move.b    N_FineTune(a4),d2
  514.     andi.b    #8,d2
  515.     beq.s    MT_StpGoss
  516.     tst.w    d0
  517.     beq.s    MT_StpGoss
  518.     subq.w    #2,d0
  519. MT_StpGoss:
  520.     move.w    (a0,d0.w),d2
  521.     move.l    (a7)+,a0
  522.     move.w    d2,N_WantedPeriod(a4)
  523.     move.w    N_Period(a4),d0
  524.     clr.b    N_TonePortDirec(a4)
  525.     cmp.w    d0,d2
  526.     beq.s    MT_ClearTonePorta
  527.     bge    MT_Return2
  528.     move.b    #1,N_TonePortDirec(a4)
  529.     rts
  530.  
  531. MT_ClearTonePorta:
  532.     clr.w    N_WantedPeriod(a4)
  533.     rts
  534.  
  535. MT_TonePortamento:
  536.     move.b    N_Cmdlo(a4),d0
  537.     beq.s    MT_TonePortNoChange
  538.     move.b    d0,N_TonePortSpeed(a4)
  539.     clr.b    N_Cmdlo(a4)
  540. MT_TonePortNoChange:
  541.     tst.w    N_WantedPeriod(a4)
  542.     beq    MT_Return2
  543.     moveq    #0,d0
  544.     move.b    N_TonePortSpeed(a4),d0
  545.     tst.b    N_TonePortDirec(a4)
  546.     bne.s    MT_TonePortaUp
  547. MT_TonePortaDown:
  548.     add.w    d0,N_Period(a4)
  549.     move.w    N_WantedPeriod(a4),d0
  550.     cmp.w    N_Period(a4),d0
  551.     bgt.s    MT_TonePortaSetPer
  552.     move.w    N_WantedPeriod(a4),N_Period(a4)
  553.     clr.w    N_WantedPeriod(a4)
  554.     bra.s    MT_TonePortaSetPer
  555.  
  556. MT_TonePortaUp:
  557.     sub.w    d0,N_Period(a4)
  558.     move.w    N_WantedPeriod(a4),d0
  559.     cmp.w    N_Period(a4),d0         ; was cmpi!!!!
  560.     blt.s    MT_TonePortaSetPer
  561.     move.w    N_WantedPeriod(a4),N_Period(a4)
  562.     clr.w    N_WantedPeriod(a4)
  563.  
  564. MT_TonePortaSetPer:
  565.     move.w    N_Period(a4),d2
  566.     move.b    N_GlissFunk(a4),d0
  567.     andi.b    #$0f,d0
  568.     beq.s    MT_GlissSkip
  569.     moveq    #0,d0
  570.     move.b    N_FineTune(a4),d0
  571.     mulu    #72,d0
  572.     lea    MT_PeriodTable(pc),a0
  573.     add.w    d0,a0
  574.     moveq    #0,d0
  575. MT_GlissLoop:
  576.     cmp.w    (a0,d0.w),d2
  577.     bhs.s    MT_GlissFound
  578.     addq.w    #2,d0
  579.     cmpi.w    #72,d0
  580.     blo.s    MT_GlissLoop
  581.     moveq    #70,d0
  582. MT_GlissFound:
  583.     move.w    (a0,d0.w),d2
  584. MT_GlissSkip:
  585.     move.w    d2,6(a6,d5.w) ; Set period
  586.     rts
  587.  
  588. MT_Vibrato:
  589.     move.b    N_Cmdlo(a4),d0
  590.     beq.s    MT_Vibrato2
  591.     move.b    N_VibratoCmd(a4),d2
  592.     andi.b    #$0f,d0
  593.     beq.s    MT_VibSkip
  594.     andi.b    #$f0,d2
  595.     or.b    d0,d2
  596. MT_VibSkip:
  597.     move.b    N_Cmdlo(a4),d0
  598.     andi.b    #$f0,d0
  599.     beq.s    MT_VibSkip2
  600.     andi.b    #$0f,d2
  601.     or.b    d0,d2
  602. MT_VibSkip2:
  603.     move.b    d2,N_VibratoCmd(a4)
  604. MT_Vibrato2:
  605.     move.b    N_VibratoPos(a4),d0
  606.     lea    MT_VibratoTable(pc),a0
  607.     lsr.w    #2,d0
  608.     andi.w    #$001f,d0
  609.     moveq    #0,d2
  610.     move.b    N_WaveControl(a4),d2
  611.     andi.b    #$03,d2
  612.     beq.s    MT_Vib_Sine
  613.     lsl.b    #3,d0
  614.     cmpi.b    #1,d2
  615.     beq.s    MT_Vib_RampDown
  616.     st    d2
  617.     bra.s    MT_Vib_Set
  618. MT_Vib_RampDown:
  619.     tst.b    N_VibratoPos(a4)
  620.     bpl.s    MT_Vib_RampDown2
  621.     st    d2
  622.     sub.b    d0,d2
  623.     bra.s    MT_Vib_Set
  624. MT_Vib_RampDown2:
  625.     move.b    d0,d2
  626.     bra.s    MT_Vib_Set
  627. MT_Vib_Sine:
  628.     move.b    (a0,d0.w),d2
  629. MT_Vib_Set:
  630.     move.b    N_VibratoCmd(a4),d0
  631.     andi.w    #15,d0
  632.     mulu    d0,d2
  633.     lsr.w    #7,d2
  634.     move.w    N_Period(a4),d0
  635.     tst.b    N_VibratoPos(a4)
  636.     bmi.s    MT_VibratoNeg
  637.     add.w    d2,d0
  638.     bra.s    MT_Vibrato3
  639. MT_VibratoNeg:
  640.     sub.w    d2,d0
  641. MT_Vibrato3:
  642.     move.w    d0,6(a6,d5.w)
  643.     move.b    N_VibratoCmd(a4),d0
  644.     lsr.w    #2,d0
  645.     andi.w    #$3C,d0
  646.     add.b    d0,N_VibratoPos(a4)
  647.     rts
  648.  
  649. MT_TonePlusVolSlide:
  650.     bsr    MT_TonePortNoChange
  651.     bra    MT_VolumeSlide
  652.  
  653. MT_VibratoPlusVolSlide:
  654.     bsr.s    MT_Vibrato2
  655.     bra    MT_VolumeSlide
  656.  
  657. MT_Tremolo:
  658.     move.b    N_Cmdlo(a4),d0
  659.     beq.s    MT_Tremolo2
  660.     move.b    N_TremoloCmd(a4),d2
  661.     andi.b    #$0f,d0
  662.     beq.s    MT_TreSkip
  663.     andi.b    #$f0,d2
  664.     or.b    d0,d2
  665. MT_TreSkip:
  666.     move.b    N_Cmdlo(a4),d0
  667.     and.b    #$f0,d0
  668.     beq.s    MT_TreSkip2
  669.     andi.b    #$0f,d2
  670.     or.b    d0,d2
  671. MT_TreSkip2:
  672.     move.b    d2,N_TremoloCmd(a4)
  673. MT_Tremolo2:
  674.     move.b    N_TremoloPos(a4),d0
  675.     lea    MT_VibratoTable(pc),a0
  676.     lsr.w    #2,d0
  677.     andi.w    #$1f,d0
  678.     moveq    #0,d2
  679.     move.b    N_WaveControl(a4),d2
  680.     lsr.b    #4,d2
  681.     andi.b    #3,d2
  682.     beq.s    MT_Tre_Sine
  683.     lsl.b    #3,d0
  684.     cmpi.b    #1,d2
  685.     beq.s    MT_Tre_RampDown
  686.     st    d2
  687.     bra.s    MT_Tre_Set
  688. MT_Tre_RampDown:
  689.     tst.b    N_VibratoPos(a4)
  690.     bpl.s    MT_Tre_RampDown2
  691.     st    d2
  692.     sub.b    d0,d2
  693.     bra.s    MT_Tre_Set
  694. MT_Tre_RampDown2:
  695.     move.b    d0,d2
  696.     bra.s    MT_Tre_Set
  697. MT_Tre_Sine:
  698.     move.b    (a0,d0.w),d2
  699. MT_Tre_Set:
  700.     move.b    N_TremoloCmd(a4),d0
  701.     andi.w    #15,d0
  702.     mulu    d0,d2
  703.     lsr.w    #6,d2
  704.     moveq    #0,d0
  705.     move.b    N_Volume(a4),d0
  706.     tst.b    N_TremoloPos(a4)
  707.     bmi.s    MT_TremoloNeg
  708.     add.w    d2,d0
  709.     bra.s    MT_Tremolo3
  710. MT_TremoloNeg:
  711.     sub.w    d2,d0
  712. MT_Tremolo3:
  713.     bpl.s    MT_TremoloSkip
  714.     clr.w    d0
  715. MT_TremoloSkip:
  716.     cmpi.w    #$40,d0
  717.     bls.s    MT_TremoloOk
  718.     move.w    #$40,d0
  719. MT_TremoloOk:
  720.     move.w    d0,8(a6,d5.w)
  721.     move.b    N_TremoloCmd(a4),d0
  722.     lsr.w    #2,d0
  723.     andi.w    #$3c,d0
  724.     add.b    d0,N_TremoloPos(a4)
  725.     rts
  726.  
  727. MT_SampleOffset:
  728.     moveq    #0,d0
  729.     move.b    N_Cmdlo(a4),d0
  730.     beq.s    MT_SoNoNew
  731.     move.b    d0,N_SampleOffset(a4)
  732. MT_SoNoNew:
  733.     move.b    N_SampleOffset(a4),d0
  734.     lsl.w    #7,d0
  735.     cmp.w    N_Length(a4),d0
  736.     bge.s    MT_SofSkip
  737.     sub.w    d0,N_Length(a4)
  738.     add.w    d0,d0
  739.     add.l    d0,N_Start(a4)
  740.     rts
  741. MT_SofSkip:
  742.     move.w    #1,N_Length(a4)
  743.     rts
  744.  
  745. MT_VolumeSlide:
  746.     moveq    #0,d0
  747.     move.b    N_Cmdlo(a4),d0
  748.     lsr.b    #4,d0
  749.     tst.b    d0
  750.     beq.s    MT_VolSlideDown
  751. MT_VolSlideUp:
  752.     add.b    d0,N_Volume(a4)
  753.     cmpi.b    #$40,N_Volume(a4)
  754.     bmi.s    MT_VsuSkip
  755.     move.b    #$40,N_Volume(a4)
  756. MT_VsuSkip:
  757.     move.b    N_Volume(a4),d0
  758.     move.w    d0,8(a6,d5.w)
  759.     rts
  760.  
  761. MT_VolSlideDown:
  762.     moveq    #0,d0
  763.     move.b    N_Cmdlo(a4),d0
  764.     andi.b    #$0f,d0
  765. MT_VolSlideDown2:
  766.     sub.b    d0,N_Volume(a4)
  767.     bpl.s    MT_VsdSkip
  768.     clr.b    N_Volume(a4)
  769. MT_VsdSkip:
  770.     move.b    N_Volume(a4),d0
  771.     move.w    d0,8(a6,d5.w)
  772.     rts
  773.  
  774. MT_PositionJump:
  775.     move.b    N_Cmdlo(a4),MT_SongPos(a5)
  776.     subq.b    #1,MT_SongPos(a5)
  777. MT_PJ2:
  778.     clr.b    MT_PBreakPos(a5)
  779.     st     MT_PosJumpFlag(a5)
  780.     rts
  781.  
  782. MT_VolumeChange:
  783.     moveq    #0,d0
  784.     move.b    N_Cmdlo(a4),d0
  785.     cmpi.b    #$40,d0
  786.     bls.s    MT_VolumeOk
  787.     moveq    #$40,d0
  788. MT_VolumeOk:
  789.     move.b    d0,N_Volume(a4)
  790.     move.w    d0,8(a6,d5.w)
  791.     rts
  792.  
  793. MT_PatternBreak:
  794.     moveq    #0,d0
  795.     move.b    N_Cmdlo(a4),d0
  796.     move.l    d0,d2
  797.     lsr.b    #4,d0
  798.     mulu    #10,d0
  799.     andi.b    #$0f,d2
  800.     add.b    d2,d0
  801.     cmpi.b    #63,d0
  802.     bhi.s    MT_PJ2
  803.     move.b    d0,MT_PBreakPos(a5)
  804.     st    MT_PosJumpFlag(a5)
  805.     rts
  806.  
  807. MT_SetSpeed:
  808.     move.b    3(a4),d0
  809.     beq    MT_Return2
  810.     clr.b    MT_Counter(a5)
  811.     move.b    d0,MT_Speed(a5)
  812.     rts
  813.  
  814. MT_CheckMoreEfx:
  815.     bsr    MT_UpdateFunk
  816.     move.b    2(a4),d0
  817.     andi.b    #$0f,d0
  818.     cmpi.b    #$9,d0
  819.     beq    MT_SampleOffset
  820.     cmpi.b    #$b,d0
  821.     beq    MT_PositionJump
  822.     cmpi.b    #$d,d0
  823.     beq.s    MT_PatternBreak
  824.     cmpi.b    #$e,d0
  825.     beq.s    MT_E_Commands
  826.     cmpi.b    #$f,d0
  827.     beq.s    MT_SetSpeed
  828.     cmpi.b    #$c,d0
  829.     beq    MT_VolumeChange
  830.     bra    MT_PerNop
  831.  
  832. MT_E_Commands:
  833.     move.b    N_Cmdlo(a4),d0
  834.     andi.b    #$f0,d0
  835.     lsr.b    #4,d0
  836.     beq.s    MT_FilterOnOff
  837.     cmpi.b    #1,d0
  838.     beq    MT_FinePortaUp
  839.     cmpi.b    #2,d0
  840.     beq    MT_FinePortaDown
  841.     cmpi.b    #3,d0
  842.     beq.s    MT_SetGlissControl
  843.     cmpi.b    #4,d0
  844.     beq    MT_SetVibratoControl
  845.     cmpi.b    #5,d0
  846.     beq    MT_SetFineTune
  847.     cmpi.b    #6,d0
  848.     beq    MT_JumpLoop
  849.     cmpi.b    #7,d0
  850.     beq    MT_SetTremoloControl
  851.     cmpi.b    #9,d0
  852.     beq    MT_RetrigNote
  853.     cmpi.b    #$a,d0
  854.     beq    MT_VolumeFineUp
  855.     cmpi.b    #$b,d0
  856.     beq    MT_VolumeFineDown
  857.     cmpi.b    #$c,d0
  858.     beq    MT_NoteCut
  859.     cmpi.b    #$d,d0
  860.     beq    MT_NoteDelay
  861.     cmpi.b    #$e,d0
  862.     beq    MT_PatternDelay
  863.     cmpi.b    #$f,d0
  864.     beq    MT_FunkIt
  865.     rts
  866.  
  867. MT_FilterOnOff:
  868.     move.b    N_Cmdlo(a4),d0
  869.     andi.b    #1,d0
  870.     add.b    d0,d0
  871.     andi.b    #$fd,$bfe001
  872.     or.b    d0,$bfe001
  873.     rts
  874.  
  875. MT_SetGlissControl:
  876.     move.b    N_Cmdlo(a4),d0
  877.     andi.b    #$0f,d0
  878.     andi.b    #$f0,N_GlissFunk(a4)
  879.     or.b    d0,N_GlissFunk(a4)
  880.     rts
  881.  
  882. MT_SetVibratoControl:
  883.     move.b    N_Cmdlo(a4),d0
  884.     andi.b    #$0f,d0
  885.     andi.b    #$f0,N_WaveControl(a4)
  886.     or.b    d0,N_WaveControl(a4)
  887.     rts
  888.  
  889. MT_SetFineTune:
  890.     move.b    N_Cmdlo(a4),d0
  891.     andi.b    #$0f,d0
  892.     move.b    d0,N_FineTune(a4)
  893.     rts
  894.  
  895. MT_JumpLoop:
  896.     tst.b    MT_Counter(a5)
  897.     bne    MT_Return2
  898.     move.b    N_Cmdlo(a4),d0
  899.     andi.b    #$0f,d0
  900.     beq.s    MT_SetLoop
  901.     tst.b    N_LoopCount(a4)
  902.     beq.s    MT_JumpCnt
  903.     subq.b    #1,N_LoopCount(a4)
  904.     beq    MT_Return2
  905. MT_JmpLoop:
  906.     move.b    N_PattPos(a4),MT_PBreakPos(a5)
  907.     st    MT_PBreakFlag(a5)
  908.     rts
  909.  
  910. MT_JumpCnt:
  911.     move.b    d0,N_LoopCount(a4)
  912.     bra.s    MT_JmpLoop
  913.  
  914. MT_SetLoop:
  915.     move.w    MT_PatternPos(a5),d0
  916.     lsr.w    #4,d0
  917.     move.b    d0,N_PattPos(a4)
  918.     rts
  919.  
  920. MT_SetTremoloControl:
  921.     move.b    N_Cmdlo(a4),d0
  922. *    andi.b    #$0f,d0
  923.     lsl.b    #4,d0
  924.     andi.b    #$0f,N_WaveControl(a4)
  925.     or.b    d0,N_WaveControl(a4)
  926.     rts
  927.  
  928. MT_RetrigNote:
  929.     move.l    d1,-(a7)
  930.     moveq    #0,d0
  931.     move.b    N_Cmdlo(a4),d0
  932.     andi.b    #$0f,d0
  933.     beq.s    MT_RtnEnd
  934.     moveq    #0,d1
  935.     move.b    MT_Counter(a5),d1
  936.     bne.s    MT_RtnSkp
  937.     move.w    (a4),d1
  938.     andi.w    #$0fff,d1
  939.     bne.s    MT_RtnEnd
  940.     moveq    #0,d1
  941.     move.b    MT_Counter(a5),d1
  942. MT_RtnSkp:
  943.     divu    d0,d1
  944.     swap    d1
  945.     tst.w    d1
  946.     bne.s    MT_RtnEnd
  947. MT_DoRetrig:
  948.     move.w    N_DMABit(a4),$096(a6)    ; Channel DMA off
  949.     move.l    N_Start(a4),(a6,d5.w)    ; Set sampledata pointer
  950.     move.w    N_Length(a4),4(a6,d5.w)    ; Set length
  951.     bsr    MT_DMAWaitLoop
  952.     move.w    N_DMABit(a4),d0
  953.     ori.w    #$8000,d0
  954. *    bset    #15,d0
  955.     move.w    d0,$096(a6)
  956.     bsr    MT_DMAWaitLoop
  957.     move.l    N_LoopStart(a4),(a6,d5.w)
  958.     move.l    N_Replen(a4),4(a6,d5.w)
  959. MT_RtnEnd:
  960.     move.l    (a7)+,d1
  961.     rts
  962.  
  963. MT_VolumeFineUp:
  964.     tst.b    MT_Counter(a5)
  965.     bne    MT_Return2
  966.     moveq    #0,d0
  967.     move.b    N_Cmdlo(a4),d0
  968.     andi.b    #$d,d0
  969.     bra    MT_VolSlideUp
  970.  
  971. MT_VolumeFineDown:
  972.     tst.b    MT_Counter(a5)
  973.     bne    MT_Return2
  974.     moveq    #0,d0
  975.     move.b    N_Cmdlo(a4),d0
  976.     andi.b    #$0f,d0
  977.     bra    MT_VolSlideDown2
  978.  
  979. MT_NoteCut:
  980.     moveq    #0,d0
  981.     move.b    N_Cmdlo(a4),d0
  982.     andi.b    #$0f,d0
  983.     cmp.b    MT_Counter(a5),d0   ; was cmpi!!!
  984.     bne    MT_Return2
  985.     clr.b    N_Volume(a4)
  986.     clr.w    8(a6,d5.w)
  987.     rts
  988.  
  989. MT_NoteDelay:
  990.     moveq    #0,d0
  991.     move.b    N_Cmdlo(a4),d0
  992.     andi.b    #$0f,d0
  993.     cmp.b    MT_Counter(a5),d0   ; was cmpi!!!
  994.     bne    MT_Return2
  995.     move.w    (a4),d0
  996.     beq    MT_Return2
  997.     move.l    d1,-(a7)
  998.     bra    MT_DoRetrig
  999.  
  1000. MT_PatternDelay:
  1001.     tst.b    MT_Counter(a5)
  1002.     bne    MT_Return2
  1003.     moveq    #0,d0
  1004.     move.b    N_Cmdlo(a4),d0
  1005.     andi.b    #$0f,d0
  1006.     tst.b    MT_PattDelTime2(a5)
  1007.     bne    MT_Return2
  1008.     addq.b    #1,d0
  1009.     move.b    d0,MT_PattDelTime(a5)
  1010.     rts
  1011.  
  1012. MT_FunkIt:
  1013.     tst.b    MT_Counter(a5)
  1014.     bne    MT_Return2
  1015.     move.b    N_Cmdlo(a4),d0
  1016. *    andi.b    #$0f,d0
  1017.     lsl.b    #4,d0
  1018.     andi.b    #$0f,N_GlissFunk(a4)
  1019.     or.b    d0,N_GlissFunk(a4)
  1020.     tst.b    d0
  1021.     beq    MT_Return2
  1022. MT_UpdateFunk:
  1023.     movem.l    a0/d1,-(a7)
  1024.     moveq    #0,d0
  1025.     move.b    N_GlissFunk(a4),d0
  1026.     lsr.b    #4,d0
  1027.     beq.s    MT_FunkEnd
  1028.     lea    MT_FunkTable(pc),a0
  1029.     move.b    (a0,d0.w),d0
  1030.     add.b    d0,N_FunkOffset(a4)
  1031.     btst    #7,N_FunkOffset(a4)
  1032.     beq.s    MT_FunkEnd
  1033.     clr.b    N_FunkOffset(a4)
  1034.  
  1035.     move.l    N_LoopStart(a4),d0
  1036.     moveq    #0,d1
  1037.     move.w    N_Replen(a4),d1
  1038.     add.l    d1,d0
  1039.     add.l    d1,d0
  1040.     move.l    N_WaveStart(a4),a0
  1041.     addq.w    #1,a0
  1042.     cmp.l    d0,a0
  1043.     blo.s    MT_FunkOk
  1044.     move.l    N_LoopStart(a4),a0
  1045. MT_FunkOk:
  1046.     move.l    a0,N_WaveStart(a4)
  1047.     moveq    #-1,d0
  1048.     sub.b    (a0),d0
  1049.     move.b    d0,(a0)
  1050. MT_FunkEnd:
  1051.     movem.l    (a7)+,a0/d1
  1052.     rts
  1053.  
  1054. MT_DMAWaitLoop:
  1055.     move.w    d1,-(sp)
  1056.     moveq    #5,d0        ; wait 5+1 lines
  1057. .loop    move.b    6(a6),d1        ; read current raster position
  1058. .wait    cmp.b    6(a6),d1
  1059.     beq.s    .wait        ; wait until it changes
  1060.     dbf    d0,.loop        ; do it again
  1061.     move.w    (sp)+,d1
  1062.     rts
  1063.  
  1064.  
  1065. MT_FunkTable: dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1066.  
  1067. MT_VibratoTable:
  1068.     dc.b 0, 24, 49, 74, 97,120,141,161
  1069.     dc.b 180,197,212,224,235,244,250,253
  1070.     dc.b 255,253,250,244,235,224,212,197
  1071.     dc.b 180,161,141,120, 97, 74, 49, 24
  1072.  
  1073. MT_PeriodTable:
  1074. ; Tuning 0, Normal
  1075.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1076.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1077.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1078. ; Tuning 1
  1079.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1080.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1081.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1082. ; Tuning 2
  1083.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1084.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1085.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1086. ; Tuning 3
  1087.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1088.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1089.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1090. ; Tuning 4
  1091.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1092.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1093.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1094. ; Tuning 5
  1095.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1096.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1097.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1098. ; Tuning 6
  1099.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1100.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1101.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1102. ; Tuning 7
  1103.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1104.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1105.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1106. ; Tuning -8
  1107.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1108.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1109.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1110. ; Tuning -7
  1111.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1112.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1113.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1114. ; Tuning -6
  1115.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1116.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1117.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1118. ; Tuning -5
  1119.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1120.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1121.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1122. ; Tuning -4
  1123.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1124.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1125.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1126. ; Tuning -3
  1127.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1128.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1129.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1130. ; Tuning -2
  1131.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1132.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1133.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1134. ; Tuning -1
  1135.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1136.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1137.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1138.  
  1139. MT_Chan1Temp:
  1140.     dc.l    0,0,0,0,0,$00010000,0,0,0,0,0
  1141. MT_Chan2Temp:
  1142.     dc.l    0,0,0,0,0,$00020000,0,0,0,0,0
  1143. MT_Chan3Temp:
  1144.     dc.l    0,0,0,0,0,$00040000,0,0,0,0,0
  1145. MT_Chan4Temp:
  1146.     dc.l    0,0,0,0,0,$00080000,0,0,0,0,0
  1147. MT_SampleStarts:
  1148.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1149.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1150. *MT_SongDataPtr:
  1151.     dc.l 0
  1152. *MT_Speed:
  1153.     dc.b 6
  1154. *MT_Counter:
  1155.     dc.b 0
  1156. *MT_SongPos:
  1157.     dc.b 0
  1158. *MT_PBreakPos:
  1159.     dc.b 0
  1160. *MT_PosJumpFlag:
  1161.     dc.b 0
  1162. *MT_PBreakFlag:
  1163.     dc.b 0
  1164. *MT_LowMask:
  1165.     dc.b 0
  1166. *MT_PattDelTime:
  1167.     dc.b 0
  1168. *MT_PattDelTime2:
  1169.     dc.b 0,0
  1170. *MT_PatternPos:
  1171.     dc.w 0
  1172. *MT_DMACONtemp:
  1173.     dc.w 0
  1174. Variables:
  1175.