home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Sound / Tracker / PTSUP2.LHA / PT Support archive / Sources / ProTrackerRep.S < prev    next >
Encoding:
Text File  |  1995-11-01  |  31.3 KB  |  1,513 lines

  1.     section    a,CODE_C
  2.  
  3. PT__Channels    =    4
  4.  
  5. Go        lea.l    Module,a0
  6.         jsr    PT_Init            ; Initialize replay
  7.  
  8. .a        cmp.b    #$ff,$dff006        ; Simple beampos-wait
  9.         bne.s    .a
  10. .b        cmp.b    #$ff,$dff006
  11.         beq.s    .b
  12.  
  13.     move.w    #$fff,$dff180
  14.  
  15.         jsr    PT_Music        ; Make music
  16.  
  17.     move.w    #$000,$dff180
  18.  
  19.         btst    #6,$bfe001
  20.         bne.s    .a
  21.  
  22.         jmp    PT_End            ; Shut off audio
  23.  
  24. Module
  25.     incdir    m:
  26.     incbin    "nuke/mod.breath of air"
  27.  
  28.     section main,code
  29.  
  30. ;------------------------------------------------------------------------------
  31. ;
  32. ;    ProTracker playroutine, revision 3
  33. ;
  34. ;    Coded by Lars "ZAP" Hamre
  35. ;    Updated by HÃ¥vard "HOWARD/MENTAL DISEASES" Pedersen
  36. ;
  37. ;REVISION 2B:
  38. ;* Mastervolume. (Separate left and right for balance controls.)
  39. ;* Overstep for players using program mode.
  40. ;* Rewind/fast forward. (One pattern)
  41. ;* Easy CIA-utilising.
  42. ;* DMAWait solved. (Finally!)
  43. ;* No longer clears one word behind end of module if instrument 31 is unused.
  44. ;* F00 really halts module now. (Was ignored)
  45. ;* Slower than before. =(
  46. ;* Various small optimisations in attempt to compensate. (Bugs may appear!)
  47. ;* PT_End now stops module, even if music is still called.
  48. ;* Added (selectable) 68020+ optimisations. (Not powerful yet...) 8(
  49. ;
  50. ;REVISION 2C:
  51. ;* Overstep didn't trig on halting the module. Now does.
  52. ;* Made overstep selectable.
  53. ;* Added NoiseTracker compatibility. (Selectable through PT__NTComp) Both NTs
  54. ;  vibrato and loop-position is supported. PT modules are still played as
  55. ;  before.
  56. ;* Fixed some ucase/lcase confusion on some labels.
  57. ;* CIA-tempo wasn't reset upon PT_Init(). Now is.
  58. ;
  59. ;REVISION 3:
  60. ;* Made proper definitions of the chantemp-structure and ensured the entire
  61. ;  source used it.
  62. ;* Rearranged chantemp-structure to make longword accesses on longword
  63. ;  boundaries.
  64. ;* Optimized balance-handling. Now uses as much time as normal mastervolume
  65. ;  would have done.
  66. ;* Did some small optimizations. (Nothing to boast about...)
  67. ;* Renamed PT_MasterVol to PT__MasterVol.
  68. ;* Made maindata structure. (Faster access because of indirect addressing.)
  69. ;  Also makes longword access on longword boundaries.
  70. ;* DMAWait waited far longer than it was supposed to. Used a new scheme based
  71. ;  on the fact that all processors are slowed down to ~7MHz when accessing
  72. ;  CIA registers.
  73. ;* Added selectable amount of channels.
  74. ;* Source is now completely PC-relative.
  75. ;
  76. ;PLEASE NOTE!
  77. ;This replay assumes exclusive access to audio hardware and OCS/ECS/AGA or
  78. ;compatible audio chips. This behaviour is _NOT_ encouraged by Commodore!
  79. ;
  80. ;TODO:
  81. ;* Implement pause/continue functions.
  82. ;
  83. ;------------------------------------------------------------------------------
  84.  
  85.     IFND    PT__MasterVol            ; Mastervolume ON/OFF
  86. PT__MasterVol    =    0            ; Call PT_SetMasterVol with
  87.     ENDC                    ; Left in D0 and Right in D1
  88.                         ; ( 0 - 64 )
  89.  
  90.     IFND    PT__OverStep            ; Signal when module is
  91. PT__OverStep    =    0            ; finished. PT_OverStep
  92.     ENDC                    ; contains 1 if end has reached
  93.                         ; and -1 if rewound past
  94.                         ; beginning.
  95.  
  96.     IFND    PT__WindFuncs            ; Fast forward / Rewind
  97. PT__WindFuncs    =    0
  98.     ENDC
  99.  
  100.     IFND    PT__CIA                ; CIA Support
  101. PT__CIA        =    0            ; Supply PT_SetIntRate with
  102.     ENDC                    ; rate (32-255) in D0. Do not
  103.                         ; trash registers.
  104.  
  105.     IFND    PT__68020            ; 68020+ optimisations
  106. PT__68020    =    0
  107.     ENDC
  108.  
  109.     IFND    PT__NTComp            ; Noisetracker compatibility
  110. PT__NTComp    =    1
  111.     ENDC
  112.  
  113.     IFND    PT__Channels            ; Number of channels to play
  114. PT__Channels    =    4
  115.     ENDC
  116.  
  117.     rsreset    ; Chantemp structure. Data for individual channels.
  118. PTv_Step0    rs.w    1
  119. PTv_Step2    rs.b    1
  120. PTv_Step3    rs.b    1
  121. PTv_SmpStart    rs.l    1
  122. PTv_SmpRepStart    rs.l    1
  123. PTv_WaveStart    rs.l    1
  124. PTv_MasterVol    rs.w    1
  125. PTv_SmpLength    rs.w    1
  126. PTv_SmpRepLen    rs.w    1
  127. PTv_Period    rs.w    1
  128. PTv_DMAMask    rs.w    1
  129. PTv_TPDestPer    rs.w    1
  130. PTv_SmpRealLen    rs.w    1
  131. PTv_SmpFinetune    rs.b    1
  132. PTv_SmpVolume    rs.b    1
  133. PTv_TPDir    rs.b    1
  134. PTv_TPSpeed    rs.b    1
  135. PTv_VibPara    rs.b    1
  136. PTv_VibPos    rs.b    1
  137. PTv_TremPara    rs.b    1
  138. PTv_TremPos    rs.b    1
  139. PTv_WaveCtrl    rs.b    1
  140. PTv_GlissFunk    rs.b    1
  141. PTv_SampleOffs    rs.b    1
  142. PTv_PattPos    rs.b    1
  143. PTv_LoopCount    rs.b    1
  144. PTv_FunkOffs    rs.b    1
  145. PTv_sizeof    rs.b    0
  146.  
  147.     rsreset    ; Maindata structure. Global data.
  148. PTm_SamplePtrs    rs.l    31
  149. PTm_ModulePtr    rs.l    1
  150. PTm_VibShift    rs.l    1
  151. PTm_PattPos    rs.w    1
  152. PTm_DMAConTemp    rs.w    1
  153. PTm_OverStep    rs.w    1
  154. PTm_Speed    rs.b    1
  155. PTm_Counter    rs.b    1
  156. PTm_SongPos    rs.b    1
  157. PTm_PattBrkPos    rs.b    1
  158. PTm_PosJumpFlag    rs.b    1
  159. PTm_PattBrkFlag    rs.b    1
  160. PTm_LowMask    rs.b    1
  161. PTm_PtDelTime    rs.b    1
  162. PTm_PtDelTime2    rs.b    1
  163. PTm_LoopPos    rs.b    1
  164. PTm_sizeof    rs.b    0
  165.  
  166. ;------------------------------------------------------------------------------
  167. ;Macro:        PT_WaitDMA()
  168. ;Purpose:    Waits for the DMA-delay to expire before continuing.
  169. ;;------------------------------------------------------------------------------
  170.  
  171. PT_WaitDMA    macro
  172.  
  173.         bsr.w    PT_DMAWait
  174.  
  175.         endm
  176.  
  177. PT_DMAWait
  178.         lea.l    $bfe001,a0
  179.     rept (715909/(50*312))*2
  180.         tst.b    (a0)
  181.     endr
  182.         rts
  183.  
  184. ;------------------------------------------------------------------------------
  185. ;Function:    PT_Init(Module)(A0)
  186. ;Purpose:    Initializes the play-routine and restarts the module if it's
  187. ;        already playing. The module may have up to 256 patterns.
  188. ;------------------------------------------------------------------------------
  189. PT_Init        lea.l    PT_MainData(pc),a4
  190.  
  191.         move.b    #0,PTm_Speed(a4)
  192.         move.l    a0,PTm_ModulePtr(a4)
  193.  
  194.         ; Find highest pattern
  195.         move.l    a0,a1
  196.         lea.l    952(a1),a1
  197.         moveq.l    #128-1,d0
  198.         moveq.l    #0,d1
  199. PT_loop        move.l    d1,d2
  200.         subq.w    #1,d0
  201. PT_loop2    move.b    (a1)+,d1
  202.         cmp.b    d2,d1
  203.         bgt.s    PT_loop
  204.         dbra    d0,PT_loop2
  205.         addq.b    #1,d2
  206.  
  207.         ; Find samplepointers and clear first word
  208.         lea.l    PTm_SamplePtrs(a4),a1    ; !Pointers to samples
  209.         lsl.l    #8,d2
  210.         lsl.l    #2,d2
  211.         add.l    #1084,d2
  212.         add.l    a0,d2
  213.         move.l    d2,a2
  214.         moveq.l    #31-1,d0
  215. PT_loop3    cmp.l    a2,a3
  216.         blt.s    .range
  217.         clr.l    (a2)
  218. .range        move.l    a2,(a1)+
  219.         moveq.l    #0,d1
  220.         move.w    42(a0),d1        ; sample length
  221.         beq.b    .nosample
  222.         lsl.l    #1,d1
  223.         add.l    d1,a2
  224. .nosample    add.l    #30,a0
  225.         dbra    d0,PT_loop3
  226.  
  227.         ; Init vibrato and loop-position if NT-mod.
  228.     ifne PT__NTComp
  229.         move.b    951(a0),d1
  230.         cmp.b    #$7f,d1
  231.         beq.s    .NotNT        ; ProTracker module
  232.         cmp.b    #$78,d1
  233.         beq.w    .NotNT        ; Old 15-instrument converted
  234.  
  235. .WasNT        move.l    #6,PTm_VibShift(a4)
  236.         move.b    d1,PTm_LoopPos(a4)
  237.         bra.s    .GotFormat
  238.  
  239. .NotNT        move.l    #7,PTm_VibShift(a4)
  240.         clr.b    PTm_LoopPos(a4)
  241. .GotFormat
  242.     endc
  243.  
  244.         lea.l    PT_chan1temp(pc),a0
  245.         moveq.l    #1,d0
  246.         moveq.l    #4-1,d1
  247. .DMALoop    move.w    d0,PTv_DMAMask(a0)
  248.         move.w    #64,PTv_MasterVol(a0)
  249.         lea.l    PTv_sizeof(a0),a0
  250.         lsl.l    #1,d0
  251.         dbf    d1,.DMALoop
  252.  
  253.  
  254.     ifne PT__CIA
  255.         moveq.l    #125,d0
  256.         bsr.s    PT_SetIntRate
  257.     endc
  258.  
  259.         or.b    #2,$bfe001
  260.         clr.b    PTm_Counter(a4)
  261.         clr.b    PTm_SongPos(a4)
  262.         clr.w    PTm_PattPos(a4)
  263.         bsr.s    PT_KillSound
  264.         move.b    #6,PTm_Speed(a4)
  265.         rts
  266.  
  267. ;------------------------------------------------------------------------------
  268. ;Function:    PT_End()
  269. ;Purpose:    Stops the music.
  270. ;------------------------------------------------------------------------------
  271. PT_End        move.b    #0,PTm_Speed(a4)
  272.  
  273. PT_KillSound    lea.l    $dff000,a0
  274.  
  275.     ifge PT__Channels-1
  276.         clr.w    $a8(a0)
  277.     endc
  278.  
  279.     ifge PT__Channels-2
  280.         clr.w    $b8(a0)
  281.     endc
  282.  
  283.     ifge PT__Channels-3
  284.         clr.w    $c8(a0)
  285.     endc
  286.  
  287.     ifge PT__Channels-4
  288.         clr.w    $d8(a0)
  289.     endc
  290.  
  291.         rts
  292.  
  293. ;------------------------------------------------------------------------------
  294. ;Function:    PT_SetMasterVol(Left,Right)(D0,D1)
  295. ;Purpose:    Sets left and right mastervolume.
  296. ;------------------------------------------------------------------------------
  297.     ifne    PT__MasterVol
  298. PT_SetMasterVol
  299.         move.w    d0,PT_chan1temp+PTv_MasterVol
  300.         move.w    d0,PT_chan4temp+PTv_MasterVol
  301.         move.w    d1,PT_chan2temp+PTv_MasterVol
  302.         move.w    d1,PT_chan3temp+PTv_MasterVol
  303.         lea.l    $dff000,a5
  304.  
  305.     ifge PT__Channels-1
  306.         moveq.l    #0,d0
  307.         lea.l    PT_chan1temp(pc),a0
  308.         move.b    PTv_SmpVolume(a0),d0
  309.         mulu.w    PTv_MasterVol(a0),d0
  310.         lsr.w    #6,d0
  311.         move.b    d0,$a8(a5)
  312.     endc
  313.  
  314.     ifge PT__Channels-2
  315.         moveq.l    #0,d0
  316.         lea.l    PT_chan2temp(pc),a0
  317.         move.b    PTv_SmpVolume(a0),d0
  318.         mulu.w    PTv_MasterVol(a0),d0
  319.         lsr.w    #6,d0
  320.         move.b    d0,$b8(a5)
  321.     endc
  322.  
  323.     ifge PT__Channels-3
  324.         moveq.l    #0,d0
  325.         lea.l    PT_chan3temp(pc),a0
  326.         move.b    PTv_SmpVolume(a0),d0
  327.         mulu.w    PTv_MasterVol(a0),d0
  328.         lsr.w    #6,d0
  329.         move.b    d0,$c8(a5)
  330.     endc
  331.  
  332.     ifge PT__Channels-4
  333.         moveq.l    #0,d0
  334.         lea.l    PT_chan4temp(pc),a0
  335.         move.b    PTv_SmpVolume(a0),d0
  336.         mulu.w    PTv_MasterVol(a0),d0
  337.         lsr.w    #6,d0
  338.         move.b    d0,$d8(a5)
  339.     endc
  340.  
  341.         moveq.l    #0,d0
  342.         rts
  343.     endc
  344.  
  345. PT_calcvol    macro
  346.  
  347.     ifne    PT__MasterVol
  348.         mulu.w    PTv_MasterVol(a6),d0
  349.         lsr.w    #6,d0
  350.     endc
  351.  
  352.     endm
  353.  
  354. ;------------------------------------------------------------------------------
  355. ;Function:    PT_Rewind()
  356. ;Purpose:    Jumps one pattern backwards.
  357. ;------------------------------------------------------------------------------
  358.     ifne    PT__WindFuncs
  359. PT_Rewind    bsr.w    PT_KillSound
  360.  
  361.         lea.l    PT_MainData(pc),a4
  362.         move.b    PTm_SongPos(a4),d0
  363.         tst.b    d0
  364.         bne.s    .not0
  365.  
  366.         move.l    PTm_ModulePtr(a4),a0    ; get moduleptr.
  367.         move.b    950(a0),PTm_SongPos(a4)
  368.         sub.b    #2,PTm_SongPos(a4)
  369.     ifne PT__OverStep
  370.         move.w    #-1,PTm_OverStep(a4)
  371.     endc
  372.         bra.s    .ok
  373.  
  374. .not0        cmp.b    #1,d0
  375.         bne.s    .not1
  376.  
  377.         move.l    PTm_ModulePtr(a4),a0    ; get moduleptr.
  378.         move.b    950(a0),PTm_SongPos(a4)
  379.         sub.b    #1,PTm_SongPos(a4)
  380.         bra.s    .ok
  381.  
  382. .not1
  383.         sub.b    #2,PTm_SongPos(a4)
  384. .ok        move.w    #63*16,PTm_PattPos(a4)
  385.         move.b    PTm_Speed(a4),PTm_Counter(a4)
  386.  
  387.         moveq.l    #0,d0
  388.         rts
  389.  
  390. ;------------------------------------------------------------------------------
  391. ;Function:    PT_Forward()
  392. ;Purpose:    Jumps one pattern forwards.
  393. ;------------------------------------------------------------------------------
  394. PT_Forward    bsr.w    PT_KillSound
  395.         lea.l    PT_MainData(pc),a4
  396.         move.w    #63*16,PTm_PattPos(a4)
  397.         move.b    PTm_Speed(a4),PTm_Counter(a4)
  398.  
  399.         moveq.l    #0,d0
  400.         rts
  401.     endc
  402.  
  403. ;------------------------------------------------------------------------------
  404. ;Function:    PT_Music()
  405. ;Purpose:    Updates the music. Call with steady intervals, preferably 50
  406. ;        times a second.
  407. ;;------------------------------------------------------------------------------
  408. ;D0 -                A0 -
  409. ;D1 -                A1 -
  410. ;D2 -                A2 -
  411. ;D3 -                A3 -
  412. ;D4 -                A4 - MainData struct
  413. ;D5 -                A5 - Hardware registers
  414. ;D6 -                A6 - ChanTemp struct of current channel
  415. ;D7 -                A7 - [Stack pointer]
  416.  
  417. PT_Music    lea.l    PT_MainData(pc),a4
  418.         addq.b    #1,PTm_Counter(a4)
  419.         move.b    PTm_Counter(a4),d0
  420.         move.b    PTm_Speed(a4),d1
  421.         beq.w    PT_return
  422.         cmp.b    d1,d0
  423.         blo.s    PT_nonewnote
  424.         clr.b    PTm_Counter(a4)
  425.         tst.b    PTm_PtDelTime2(a4)
  426.         beq.w    PT_getnewnote
  427.         bsr.s    PT_nonewallchannels
  428.         bra.w    PT_dskip
  429.  
  430. PT_nonewnote    bsr.s    PT_nonewallchannels
  431.         bra.w    PT_nonewposyet
  432.  
  433. PT_nonewallchannels
  434.     ifge PT__Channels-1
  435.         lea.l    $dff0a0,a5
  436.         lea.l    PT_chan1temp(pc),a6
  437.         bsr.w    PT_checkefx
  438.     endc
  439.  
  440.     ifge PT__Channels-2
  441.         lea.l    $dff0b0,a5
  442.         lea.l    PT_chan2temp(pc),a6
  443.         bsr.w    PT_checkefx
  444.     endc
  445.  
  446.     ifge PT__Channels-3
  447.         lea.l    $dff0c0,a5
  448.         lea.l    PT_chan3temp(pc),a6
  449.         bsr.w    PT_checkefx
  450.     endc
  451.  
  452.     ifge PT__Channels-4
  453.         lea.l    $dff0d0,a5
  454.         lea.l    PT_chan4temp(pc),a6
  455.         bsr.w    PT_checkefx
  456.     endc
  457.         rts
  458.  
  459. PT_getnewnote    move.l    PTm_ModulePtr(a4),a0
  460.         lea.l    12(a0),a3
  461.         lea.l    952(a0),a2        ;pattpo
  462.         lea.l    1084(a0),a0        ;patterndata
  463.         moveq.l    #0,d0
  464.         moveq.l    #0,d1
  465.         move.b    PTm_SongPos(a4),d0
  466.         move.b    (a2,d0.w),d1
  467.         lsl.l    #8,d1
  468.         lsl.l    #2,d1
  469.         add.w    PTm_PattPos(a4),d1
  470.         clr.w    PTm_DMAConTemp(a4)
  471.  
  472.         ; !(a0,d1) points to the patterndata
  473.  
  474.     ifge PT__Channels-1
  475.         lea.l    $dff0a0,a5
  476.         lea.l    PT_chan1temp(pc),a6
  477.         bsr.s    PT_playvoice
  478.     endc
  479.  
  480.     ifge PT__Channels-2
  481.         lea.l    $dff0b0,a5
  482.         lea.l    PT_chan2temp(pc),a6
  483.         bsr.s    PT_playvoice
  484.     endc
  485.  
  486.     ifge PT__Channels-3
  487.         lea.l    $dff0c0,a5
  488.         lea.l    PT_chan3temp(pc),a6
  489.         bsr.s    PT_playvoice
  490.     endc
  491.  
  492.     ifge PT__Channels-4
  493.         lea.l    $dff0d0,a5
  494.         lea.l    PT_chan4temp(pc),a6
  495.         bsr.s    PT_playvoice
  496.     endc
  497.  
  498.         bra.w    PT_setdma
  499.  
  500. PT_playvoice    tst.w    PTv_Step0(a6)
  501.         bne.s    PT_plvskip
  502.         bsr.w    PT_pernop
  503.  
  504. PT_plvskip    move.l    (a0,d1.l),PTv_Step0(a6)
  505.         addq.l    #4,d1
  506.         moveq.l    #0,d2
  507.         move.b    PTv_Step2(a6),d2
  508.         and.b    #$f0,d2
  509.         lsr.b    #4,d2
  510.         move.b    PTv_Step0(a6),d0
  511.         and.b    #$f0,d0
  512.         or.b    d0,d2
  513.         tst.b    d2
  514.         beq.w    PT_setregs
  515.         moveq.l    #0,d3
  516.         lea.l    PTm_SamplePtrs(a4),a1
  517.         move.w    d2,d4
  518.         subq.l    #1,d2
  519.  
  520.         move.w    d4,d3            ; *30
  521.         lsl.w    #5,d4
  522.         add.w    d3,d3
  523.         sub.w    d3,d4
  524.  
  525.     ifeq    PT__68020
  526.         lsl.l    #2,d2
  527.         move.l    (a1,d2.l),PTv_SmpStart(a6)
  528.     else
  529.         move.l    (a1,d2.l*4),PTv_SmpStart(a6)
  530.     endc
  531.  
  532.         move.w    (a3,d4.l),PTv_SmpLength(a6)
  533.         move.w    (a3,d4.l),PTv_SmpRealLen(a6)
  534.         move.b    2(a3,d4.l),PTv_SmpFinetune(a6)
  535.         move.b    3(a3,d4.l),PTv_SmpVolume(a6)
  536.         move.w    4(a3,d4.l),d3        ; get repeat
  537.         tst.w    d3
  538.         beq.s    PT_noloop
  539.         move.l    PTv_SmpStart(a6),d2    ; get start
  540.         add.w    d3,d3
  541.         add.l    d3,d2            ; add repeat
  542.         move.l    d2,PTv_SmpRepStart(a6)
  543.         move.l    d2,PTv_WaveStart(a6)
  544.         move.w    4(a3,d4.l),d0        ; get repeat
  545.         add.w    6(a3,d4.l),d0        ; add replen
  546.         move.w    d0,PTv_SmpLength(a6)
  547.         move.w    6(a3,d4.l),PTv_SmpRepLen(a6); save replen
  548.         moveq.l    #0,d0
  549.         move.b    PTv_SmpVolume(a6),d0
  550.  
  551.         PT_calcvol
  552.  
  553.         move.w    d0,8(a5)        ; set volume
  554.         bra.s    PT_setregs
  555.  
  556. PT_noloop    move.l    PTv_SmpStart(a6),d2
  557.         add.l    d3,d2
  558.         move.l    d2,PTv_SmpRepStart(a6)
  559.         move.l    d2,PTv_WaveStart(a6)
  560.         move.w    6(a3,d4.l),PTv_SmpRepLen(a6)    ; save replen
  561.         moveq.l    #0,d0
  562.         move.b    PTv_SmpVolume(a6),d0
  563.  
  564.         PT_calcvol
  565.  
  566.         move.w    d0,8(a5)        ; set volume
  567.  
  568. PT_setregs    move.w    PTv_Step0(a6),d0
  569.         and.w    #$0fff,d0
  570.         beq.w    PT_checkmoreefx        ; if no note
  571.         move.w    PTv_Step2(a6),d0
  572.         and.w    #$0ff0,d0
  573.         cmp.w    #$0e50,d0
  574.         beq.s    PT_dosetfinetune
  575.         move.b    PTv_Step2(a6),d0
  576.         and.b    #$0f,d0
  577.         cmp.b    #3,d0            ; toneportamento
  578.         beq.s    PT_chktoneporta
  579.         cmp.b    #5,d0
  580.         beq.s    PT_chktoneporta
  581.         cmp.b    #9,d0            ; sample offset
  582.         bne.s    PT_setperiod
  583.         bsr.w    PT_checkmoreefx
  584.         bra.s    PT_setperiod
  585.  
  586. PT_dosetfinetune
  587.         bsr.w    PT_setfinetune
  588.         bra.s    PT_setperiod
  589.  
  590. PT_chktoneporta
  591.         bsr.w    PT_settoneporta
  592.         bra.w    PT_checkmoreefx
  593.  
  594. PT_setperiod    move.w    PTv_Step0(a6),d7
  595.         and.w    #$0fff,d7
  596.         lea.l    PT_periodtable(pc),a1
  597.         moveq.l    #0,d0
  598.         moveq.l    #36,d2
  599. PT_ftuloop    cmp.w    (a1,d0.w),d7
  600.         bhs.s    PT_ftufound
  601.         addq.l    #2,d0
  602.         dbra    d2,PT_ftuloop
  603. PT_ftufound    moveq.l    #0,d7
  604.         move.b    PTv_SmpFinetune(a6),d7
  605.         mulu.w    #36*2,d7
  606.         add.l    d7,a1
  607.         move.w    (a1,d0.w),PTv_Period(a6)
  608.  
  609.         move.w    PTv_Step2(a6),d0
  610.         and.w    #$0ff0,d0
  611.         cmp.w    #$0ed0,d0        ; notedelay
  612.         beq.w    PT_checkmoreefx
  613.  
  614.         move.w    PTv_DMAMask(a6),$dff096
  615.         btst    #2,PTv_WaveCtrl(a6)
  616.         bne.s    PT_vibnoc
  617.         clr.b    PTv_VibPos(a6)
  618.  
  619. PT_vibnoc    btst    #6,PTv_WaveCtrl(a6)
  620.         bne.s    PT_trenoc
  621.         clr.b    PTv_TremPos(a6)
  622.  
  623. PT_trenoc    move.l    PTv_SmpStart(a6),(a5)    ; set start
  624.         move.w    PTv_SmpLength(a6),4(a5)    ; set length
  625.         move.w    PTv_Period(a6),d0
  626.         move.w    d0,6(a5)        ; set period
  627.         move.w    PTv_DMAMask(a6),d0
  628.         or.w    d0,PTm_DMAConTemp(a4)
  629.         bra.w    PT_checkmoreefx
  630.  
  631. PT_setdma    lea.l    $bfe000,a5
  632.  
  633.         PT_WaitDMA
  634.  
  635. PT_dummy001    move.w    PTm_DMAConTemp(a4),d0
  636.         or.w    #$8000,d0
  637.         move.w    d0,$dff096
  638.  
  639.         PT_WaitDMA
  640.  
  641.         lea.l    $dff000,a5
  642.  
  643.     ifge PT__Channels-1
  644.         lea.l    PT_chan1temp(pc),a6
  645.         move.l    PTv_SmpRepStart(a6),$a0(a5)
  646.         move.w    PTv_SmpRepLen(a6),$a4(a5)
  647.     endc
  648.  
  649.     ifge PT__Channels-2
  650.         lea.l    PT_chan2temp(pc),a6
  651.         move.l    PTv_SmpRepStart(a6),$b0(a5)
  652.         move.w    PTv_SmpRepLen(a6),$b4(a5)
  653.     endc
  654.  
  655.     ifge PT__Channels-3
  656.         lea.l    PT_chan3temp(pc),a6
  657.         move.l    PTv_SmpRepStart(a6),$c0(a5)
  658.         move.w    PTv_SmpRepLen(a6),$c4(a5)
  659.     endc
  660.  
  661.     ifge PT__Channels-4
  662.         lea.l    PT_chan4temp(pc),a6
  663.         move.l    PTv_SmpRepStart(a6),$d0(a5)
  664.         move.w    PTv_SmpRepLen(a6),$d4(a5)
  665.     endc
  666.  
  667. PT_dskip    add.w    #16,PTm_PattPos(a4)
  668.         move.b    PTm_PtDelTime(a4),d0
  669.         beq.s    PT_dskc
  670.         move.b    d0,PTm_PtDelTime2(a4)
  671.         clr.b    PTm_PtDelTime(a4)
  672.  
  673. PT_dskc        tst.b    PTm_PtDelTime2(a4)
  674.         beq.s    PT_dska
  675.         subq.b    #1,PTm_PtDelTime2(a4)
  676.         beq.s    PT_dska
  677.         sub.w    #16,PTm_PattPos(a4)
  678.  
  679. PT_dska        tst.b    PTm_PattBrkFlag(a4)
  680.         beq.s    PT_nnpysk
  681.         sf    PTm_PattBrkFlag(a4)
  682.         moveq.l    #0,d0
  683.         move.b    PTm_PattBrkPos(a4),d0
  684.         clr.b    PTm_PattBrkPos(a4)
  685.  
  686.         lsl.w    #4,d0
  687.         move.w    d0,PTm_PattPos(a4)
  688.  
  689. PT_nnpysk    cmp.w    #1024,PTm_PattPos(a4)
  690.         blo.s    PT_nonewposyet
  691.  
  692. PT_nextposition
  693.         moveq.l    #0,d0
  694.         move.b    PTm_PattBrkPos(a4),d0
  695.         move.w    d0,PTm_PattPos(a4)
  696.         clr.b    PTm_PattBrkPos(a4)
  697.         clr.b    PTm_PosJumpFlag(a4)
  698.         addq.b    #1,PTm_SongPos(a4)
  699.         and.b    #$7f,PTm_SongPos(a4)
  700.         move.b    PTm_SongPos(a4),d1
  701.  
  702.         move.l    PTm_ModulePtr(a4),a0
  703.         cmp.b    950(a0),d1
  704.         blo.s    PT_nonewposyet
  705.     ifne PT__OverStep
  706.         move.w    #1,PTm_OverStep(a4)
  707.     endc
  708.     ifne PT__NTComp
  709.         move.b    PTm_LoopPos(a4),PTm_SongPos(a4)
  710.     else
  711.         clr.b    PTm_SongPos(a4)
  712.     endc
  713.  
  714. PT_nonewposyet
  715.         tst.b    PTm_PosJumpFlag(a4)
  716.         bne.s    PT_nextposition
  717. PT_return    rts
  718.  
  719. PT_checkefx    bsr.w    PT_updatefunk
  720.         move.w    PTv_Step2(a6),d0
  721.         and.w    #$0fff,d0
  722.         beq.s    PT_pernop
  723.         move.b    PTv_Step2(a6),d0
  724.         and.b    #$0f,d0
  725.         beq.s    PT_arpeggio
  726.         cmp.b    #1,d0
  727.         beq.w    PT_portaup
  728.         cmp.b    #2,d0
  729.         beq.w    PT_portadown
  730.         cmp.b    #3,d0
  731.         beq.w    PT_toneportamento
  732.         cmp.b    #4,d0
  733.         beq.w    PT_vibrato
  734.         cmp.b    #5,d0
  735.         beq.w    PT_toneplusvolslide
  736.         cmp.b    #6,d0
  737.         beq.w    PT_vibratoplusvolslide
  738.         cmp.b    #$e,d0
  739.         beq.w    PT_e_commands
  740. setback        move.w    PTv_Period(a6),6(a5)
  741.         cmp.b    #7,d0
  742.         beq.w    PT_tremolo
  743.         cmp.b    #$a,d0
  744.         beq.w    PT_volumeslide
  745.         rts
  746.  
  747. PT_pernop    move.w    PTv_Period(a6),6(a5)
  748.         rts
  749.  
  750. PT_arpeggio    moveq.l    #0,d0
  751.         move.b    PTm_Counter(a4),d0
  752.         divs.w    #3,d0
  753.         swap.w    d0
  754.         tst.w    d0
  755.         beq.s    PT_arpeggio2
  756.         cmp.w    #2,d0
  757.         beq.s    PT_arpeggio1
  758.         moveq.l    #0,d0
  759.         move.b    PTv_Step3(a6),d0
  760.         lsr.b    #4,d0
  761.         bra.s    PT_arpeggio3
  762.  
  763. PT_arpeggio1    moveq.l    #0,d0
  764.         move.b    PTv_Step3(a6),d0
  765.         and.b    #15,d0
  766.         bra.s    PT_arpeggio3
  767.  
  768. PT_arpeggio2    move.w    PTv_Period(a6),d2
  769.         bra.s    PT_arpeggio4
  770.  
  771. PT_arpeggio3    add.w    d0,d0
  772.         moveq.l    #0,d1
  773.         move.b    PTv_SmpFinetune(a6),d1
  774.         mulu.w    #36*2,d1
  775.         lea.l    PT_periodtable(pc),a0
  776.         add.l    d1,a0
  777.         moveq.l    #0,d1
  778.         move.w    PTv_Period(a6),d1
  779.         moveq.l    #36,d3
  780.  
  781. PT_arploop    move.w    (a0,d0.w),d2
  782.         cmp.w    (a0),d1
  783.         bhs.s    PT_arpeggio4
  784.         addq.l    #2,a0
  785.         dbra    d3,PT_arploop
  786.         rts
  787.  
  788. PT_arpeggio4    move.w    d2,6(a5)
  789.         rts
  790.  
  791. PT_fineportaup    tst.b    PTm_Counter(a4)
  792.         bne.w    PT_return
  793.         move.b    #$0f,PTm_LowMask(a4)
  794.  
  795. PT_portaup    moveq.l    #0,d0
  796.         move.b    PTv_Step3(a6),d0
  797.         and.b    PTm_LowMask(a4),d0
  798.         move.b    #$ff,PTm_LowMask(a4)
  799.         sub.w    d0,PTv_Period(a6)
  800.         move.w    PTv_Period(a6),d0
  801.         and.w    #$0fff,d0
  802.         cmp.w    #113,d0
  803.         bpl.s    PT_portauskip
  804.         and.w    #$f000,PTv_Period(a6)
  805.         or.w    #113,PTv_Period(a6)
  806.  
  807. PT_portauskip    move.w    PTv_Period(a6),d0
  808.         and.w    #$0fff,d0
  809.         move.w    d0,6(a5)
  810.         rts
  811.  
  812. PT_fineportadown
  813.         tst.b    PTm_Counter(a4)
  814.         bne.w    PT_return
  815.         move.b    #$0f,PTm_LowMask(a4)
  816.  
  817. PT_portadown    clr.w    d0
  818.         move.b    PTv_Step3(a6),d0
  819.         and.b    PTm_LowMask(a4),d0
  820.         move.b    #$ff,PTm_LowMask(a4)
  821.         add.w    d0,PTv_Period(a6)
  822.         move.w    PTv_Period(a6),d0
  823.         and.w    #$0fff,d0
  824.         cmp.w    #856,d0
  825.         bmi.s    PT_portadskip
  826.         and.w    #$f000,PTv_Period(a6)
  827.         or.w    #856,PTv_Period(a6)
  828.  
  829. PT_portadskip    move.w    PTv_Period(a6),d0
  830.         and.w    #$0fff,d0
  831.         move.w    d0,6(a5)
  832.         rts
  833.  
  834. PT_settoneporta
  835.         move.l    a0,-(sp)
  836.         move.w    PTv_Step0(a6),d2
  837.         and.w    #$0fff,d2
  838.         moveq.l    #0,d0
  839.         move.b    PTv_SmpFinetune(a6),d0
  840.         mulu.w    #37*2,d0
  841.         lea.l    PT_periodtable(pc),a0
  842.         add.l    d0,a0
  843.         moveq.l    #0,d0
  844.  
  845. PT_stploop    cmp.w    (a0,d0.w),d2
  846.         bhs.s    PT_stpfound
  847.         addq.w    #2,d0
  848.         cmp.w    #37*2,d0
  849.         blo.s    PT_stploop
  850.         moveq.l    #35*2,d0
  851.  
  852. PT_stpfound    move.b    PTv_SmpFinetune(a6),d2
  853.         and.b    #8,d2
  854.         beq.s    PT_stpgoss
  855.         tst.w    d0
  856.         beq.s    PT_stpgoss
  857.         subq.w    #2,d0
  858.  
  859. PT_stpgoss    move.w    (a0,d0.w),d2
  860.         move.l    (sp)+,a0
  861.         move.w    d2,PTv_TPDestPer(a6)
  862.         move.w    PTv_Period(a6),d0
  863.         clr.b    PTv_TPDir(a6)
  864.         cmp.w    d0,d2
  865.         beq.s    PT_cleartoneporta
  866.         bge.w    PT_return
  867.         move.b    #1,PTv_TPDir(a6)
  868.         rts
  869.  
  870. PT_cleartoneporta
  871.         clr.w    PTv_TPDestPer(a6)
  872.         rts
  873.  
  874. PT_toneportamento
  875.         move.b    PTv_Step3(a6),d0
  876.         beq.s    PT_toneportnochange
  877.         move.b    d0,PTv_TPSpeed(a6)
  878.         clr.b    PTv_Step3(a6)
  879.  
  880. PT_toneportnochange
  881.         tst.w    PTv_TPDestPer(a6)
  882.         beq.w    PT_return
  883.         moveq.l    #0,d0
  884.         move.b    PTv_TPSpeed(a6),d0
  885.         tst.b    PTv_TPDir(a6)
  886.         bne.s    PT_toneportaup
  887.  
  888. PT_toneportadown
  889.         add.w    d0,PTv_Period(a6)
  890.         move.w    PTv_TPDestPer(a6),d0
  891.         cmp.w    PTv_Period(a6),d0
  892.         bgt.s    PT_toneportasetper
  893.         move.w    PTv_TPDestPer(a6),PTv_Period(a6)
  894.         clr.w    PTv_TPDestPer(a6)
  895.         bra.s    PT_toneportasetper
  896.  
  897. PT_toneportaup
  898.         sub.w    d0,PTv_Period(a6)
  899.         move.w    PTv_TPDestPer(a6),d0
  900.         cmp.w    PTv_Period(a6),d0
  901.         blt.s    PT_toneportasetper
  902.         move.w    PTv_TPDestPer(a6),PTv_Period(a6)
  903.         clr.w    PTv_TPDestPer(a6)
  904.  
  905. PT_toneportasetper
  906.         move.w    PTv_Period(a6),d2
  907.         move.b    PTv_GlissFunk(a6),d0
  908.         and.b    #$0f,d0
  909.         beq.s    PT_glissskip
  910.         moveq.l    #0,d0
  911.         move.b    PTv_SmpFinetune(a6),d0
  912.         mulu.w    #36*2,d0
  913.         lea.l    PT_periodtable(pc),a0
  914.         add.l    d0,a0
  915.         moveq.l    #0,d0
  916.  
  917. PT_glissloop    cmp.w    (a0,d0.w),d2
  918.         bhs.s    PT_glissfound
  919.         addq.w    #2,d0
  920.         cmp.w    #36*2,d0
  921.         blo.s    PT_glissloop
  922.         moveq.l    #35*2,d0
  923.  
  924. PT_glissfound    move.w    (a0,d0.w),d2
  925.  
  926. PT_glissskip    move.w    d2,6(a5)        ; set period
  927.         rts
  928.  
  929. PT_vibrato    move.b    PTv_Step3(a6),d0
  930.         beq.s    PT_vibrato2
  931.         move.b    PTv_VibPara(a6),d2
  932.         and.b    #$0f,d0
  933.         beq.s    PT_vibskip
  934.         and.b    #$f0,d2
  935.         or.b    d0,d2
  936.  
  937. PT_vibskip    move.b    PTv_Step3(a6),d0
  938.         and.b    #$f0,d0
  939.         beq.s    PT_vibskip2
  940.         and.b    #$0f,d2
  941.         or.b    d0,d2
  942.  
  943. PT_vibskip2    move.b    d2,PTv_VibPara(a6)
  944.  
  945. PT_vibrato2    move.b    PTv_VibPos(a6),d0
  946.         lea.l    PT_vibratotable(pc),a1
  947.         lsr.w    #2,d0
  948.         and.w    #$001f,d0
  949.         moveq.l    #0,d2
  950.         move.b    PTv_WaveCtrl(a6),d2
  951.         and.b    #$03,d2
  952.         beq.s    PT_vib_sine
  953.         lsl.b    #3,d0
  954.         cmp.b    #1,d2
  955.         beq.s    PT_vib_rampdown
  956.         move.b    #255,d2
  957.         bra.s    PT_vib_set
  958.  
  959. PT_vib_rampdown
  960.         tst.b    PTv_VibPos(a6)
  961.         bpl.s    PT_vib_rampdown2
  962.         move.b    #255,d2
  963.         sub.b    d0,d2
  964.         bra.s    PT_vib_set
  965.  
  966. PT_vib_rampdown2
  967.         move.b    d0,d2
  968.         bra.s    PT_vib_set
  969.  
  970. PT_vib_sine    move.b    (a1,d0.w),d2
  971.  
  972. PT_vib_set    move.b    PTv_VibPara(a6),d0
  973.         and.w    #15,d0
  974.         mulu.w    d0,d2
  975.     ifne PT__NTComp
  976.         move.l    PTm_VibShift(a4),d0
  977.         lsr.w    d0,d2
  978.     else
  979.         lsr.w    #7,d2
  980.     endc
  981.         move.w    PTv_Period(a6),d0
  982.         tst.b    PTv_VibPos(a6)
  983.         bmi.s    PT_vibratoneg
  984.         add.w    d2,d0
  985.         bra.s    PT_vibrato3
  986.  
  987. PT_vibratoneg    sub.w    d2,d0
  988.  
  989. PT_vibrato3    move.w    d0,6(a5)
  990.         move.b    PTv_VibPara(a6),d0
  991.         lsr.w    #2,d0
  992.         and.w    #$003c,d0
  993.         add.b    d0,PTv_VibPos(a6)
  994.         rts
  995.  
  996. PT_toneplusvolslide
  997.         bsr.w    PT_toneportnochange
  998.         bra.w    PT_volumeslide
  999.  
  1000. PT_vibratoplusvolslide
  1001.         bsr.s    PT_vibrato2
  1002.         bra.w    PT_volumeslide
  1003.  
  1004. PT_tremolo    move.b    PTv_Step3(a6),d0
  1005.         beq.s    PT_tremolo2
  1006.         move.b    PTv_TremPara(a6),d2
  1007.         and.b    #$0f,d0
  1008.         beq.s    PT_treskip
  1009.         and.b    #$f0,d2
  1010.         or.b    d0,d2
  1011.  
  1012. PT_treskip    move.b    PTv_Step3(a6),d0
  1013.         and.b    #$f0,d0
  1014.         beq.s    PT_treskip2
  1015.         and.b    #$0f,d2
  1016.         or.b    d0,d2
  1017.  
  1018. PT_treskip2    move.b    d2,PTv_TremPara(a6)
  1019.  
  1020. PT_tremolo2    move.b    PTv_TremPos(a6),d0
  1021.         lea.l    PT_vibratotable(pc),a1
  1022.         lsr.w    #2,d0
  1023.         and.w    #$001f,d0
  1024.         moveq.l    #0,d2
  1025.         move.b    PTv_WaveCtrl(a6),d2
  1026.         lsr.b    #4,d2
  1027.         and.b    #$03,d2
  1028.         beq.s    PT_tre_sine
  1029.         lsl.b    #3,d0
  1030.         cmp.b    #1,d2
  1031.         beq.s    PT_tre_rampdown
  1032.         move.b    #255,d2
  1033.         bra.s    PT_tre_set
  1034.  
  1035. PT_tre_rampdown
  1036.         tst.b    PTv_VibPos(a6)
  1037.         bpl.s    PT_tre_rampdown2
  1038.         move.b    #255,d2
  1039.         sub.b    d0,d2
  1040.         bra.s    PT_tre_set
  1041.  
  1042. PT_tre_rampdown2
  1043.         move.b    d0,d2
  1044.         bra.s    PT_tre_set
  1045.  
  1046. PT_tre_sine    move.b    (a1,d0.w),d2
  1047.  
  1048. PT_tre_set    move.b    PTv_TremPara(a6),d0
  1049.         and.w    #15,d0
  1050.         mulu.w    d0,d2
  1051.         lsr.w    #6,d2
  1052.         moveq.l    #0,d0
  1053.         move.b    PTv_SmpVolume(a6),d0
  1054.         tst.b    PTv_TremPos(a6)
  1055.         bmi.s    PT_tremoloneg
  1056.         add.w    d2,d0
  1057.         bra.s    PT_tremolo3
  1058.  
  1059. PT_tremoloneg    sub.w    d2,d0
  1060.  
  1061. PT_tremolo3    bpl.s    PT_tremoloskip
  1062.         clr.w    d0
  1063.  
  1064. PT_tremoloskip
  1065.         cmp.w    #$40,d0
  1066.         bls.s    PT_tremolook
  1067.         move.w    #$40,d0
  1068.  
  1069. PT_tremolook    PT_calcvol
  1070.  
  1071.         move.w    d0,8(a5)
  1072.         move.b    PTv_TremPara(a6),d0
  1073.         lsr.w    #2,d0
  1074.         and.w    #$003c,d0
  1075.         add.b    d0,PTv_TremPos(a6)
  1076.         rts
  1077.  
  1078. PT_sampleoffset
  1079.         moveq.l    #0,d0
  1080.         move.b    PTv_Step3(a6),d0
  1081.         beq.s    PT_sononew
  1082.         move.b    d0,PTv_SampleOffs(a6)
  1083.  
  1084. PT_sononew    move.b    PTv_SampleOffs(a6),d0
  1085.         lsl.w    #7,d0
  1086.         cmp.w    PTv_SmpLength(a6),d0
  1087.         bge.s    PT_sofskip
  1088.         sub.w    d0,PTv_SmpLength(a6)
  1089.         add.w    d0,d0
  1090.         add.l    d0,PTv_SmpStart(a6)
  1091.         rts
  1092.  
  1093. PT_sofskip    move.w    #$0001,PTv_SmpLength(a6)
  1094.         rts
  1095.  
  1096. PT_volumeslide
  1097.         moveq.l    #0,d0
  1098.         move.b    PTv_Step3(a6),d0
  1099.         lsr.b    #4,d0
  1100.         tst.b    d0
  1101.         beq.s    PT_volslidedown
  1102.  
  1103. PT_volslideup    add.b    d0,PTv_SmpVolume(a6)
  1104.         cmp.b    #$40,PTv_SmpVolume(a6)
  1105.         bmi.s    PT_vsuskip
  1106.         move.b    #$40,PTv_SmpVolume(a6)
  1107.  
  1108. PT_vsuskip    move.b    PTv_SmpVolume(a6),d0
  1109.  
  1110.         PT_calcvol
  1111.  
  1112.         move.w    d0,8(a5)
  1113.         rts
  1114.  
  1115. PT_volslidedown
  1116.         moveq.l    #0,d0
  1117.         move.b    PTv_Step3(a6),d0
  1118.         and.b    #$0f,d0
  1119.  
  1120. PT_volslidedown2
  1121.         sub.b    d0,PTv_SmpVolume(a6)
  1122.         bpl.s    PT_vsdskip
  1123.         clr.b    PTv_SmpVolume(a6)
  1124.  
  1125. PT_vsdskip    moveq.l    #0,d0
  1126.         move.b    PTv_SmpVolume(a6),d0
  1127.  
  1128.         PT_calcvol
  1129.  
  1130.         move.w    d0,8(a5)
  1131.         rts
  1132.  
  1133. PT_positionjump
  1134.         move.b    PTv_Step3(a6),d0
  1135.         subq.b    #1,d0
  1136.         move.b    d0,PTm_SongPos(a4)
  1137.     ifne PT__OverStep
  1138.         move.w    #1,PTm_OverStep(a4)
  1139.     endc
  1140. PT_pj2        clr.b    PTm_PattBrkPos(a4)
  1141.         st    PTm_PosJumpFlag(a4)
  1142.         rts
  1143.  
  1144. PT_volumechange
  1145.         moveq.l    #0,d0
  1146.         move.b    PTv_Step3(a6),d0
  1147.         cmp.b    #$40,d0
  1148.         bls.s    PT_volumeok
  1149.         moveq.l    #$40,d0
  1150.  
  1151. PT_volumeok    move.b    d0,PTv_SmpVolume(a6)
  1152.  
  1153.         PT_calcvol
  1154.  
  1155.         move.w    d0,8(a5)
  1156.         rts
  1157.  
  1158. PT_patternbreak
  1159.         moveq.l    #0,d0
  1160.         move.b    PTv_Step3(a6),d0
  1161.         move.l    d0,d2
  1162.         lsr.b    #4,d0
  1163.         mulu.w    #10,d0
  1164.         and.b    #$0f,d2
  1165.         add.b    d2,d0
  1166.         cmp.b    #63,d0
  1167.         bhi.s    PT_pj2
  1168.         move.b    d0,PTm_PattBrkPos(a4)
  1169.         st    PTm_PosJumpFlag(a4)
  1170.         rts
  1171.  
  1172. PT_setspeed
  1173.         moveq.l    #0,d0
  1174.         move.b    PTv_Step3(a6),d0
  1175.  
  1176.     ifne PT__OverStep
  1177.         bne.s    .wasnotzero
  1178.         move.w    #1,PTm_OverStep(a4)
  1179. .wasnotzero
  1180.     endc
  1181.  
  1182.     ifne    PT__CIA
  1183.         cmp.b    #32,d0
  1184.         blo.s    .setspeed
  1185.  
  1186. .settempo    bsr.w    PT_SetIntRate
  1187.         rts
  1188.  
  1189.     endc
  1190.  
  1191. .setspeed    clr.b    PTm_Counter(a4)
  1192.         move.b    d0,PTm_Speed(a4)
  1193.         rts
  1194.  
  1195. PT_checkmoreefx
  1196.         bsr.w    PT_updatefunk
  1197.         move.b    PTv_Step2(a6),d0
  1198.         and.b    #$0f,d0
  1199.         cmp.b    #$9,d0
  1200.         beq.w    PT_sampleoffset
  1201.         cmp.b    #$b,d0
  1202.         beq.w    PT_positionjump
  1203.         cmp.b    #$d,d0
  1204.         beq.w    PT_patternbreak
  1205.         cmp.b    #$e,d0
  1206.         beq.s    PT_e_commands
  1207.         cmp.b    #$f,d0
  1208.         beq.w    PT_setspeed
  1209.         cmp.b    #$c,d0
  1210.         beq.w    PT_volumechange
  1211.         bra.w    PT_pernop
  1212.  
  1213. PT_e_commands    move.b    PTv_Step3(a6),d0
  1214.         and.b    #$f0,d0
  1215.         lsr.b    #4,d0
  1216.         beq.s    PT_filteronoff
  1217.         cmp.b    #1,d0
  1218.         beq.w    PT_fineportaup
  1219.         cmp.b    #2,d0
  1220.         beq.w    PT_fineportadown
  1221.         cmp.b    #3,d0
  1222.         beq.s    PT_setglisscontrol
  1223.         cmp.b    #4,d0
  1224.         beq.w    PT_setvibratocontrol
  1225.         cmp.b    #5,d0
  1226.         beq.w    PT_setfinetune
  1227.         cmp.b    #6,d0
  1228.         beq.w    PT_jumploop
  1229.         cmp.b    #7,d0
  1230.         beq.w    PT_settremolocontrol
  1231.         cmp.b    #9,d0
  1232.         beq.w    PT_retrignote
  1233.         cmp.b    #$a,d0
  1234.         beq.w    PT_volumefineup
  1235.         cmp.b    #$b,d0
  1236.         beq.w    PT_volumefinedown
  1237.         cmp.b    #$c,d0
  1238.         beq.w    PT_notecut
  1239.         cmp.b    #$d,d0
  1240.         beq.w    PT_notedelay
  1241.         cmp.b    #$e,d0
  1242.         beq.w    PT_patterndelay
  1243.         cmp.b    #$f,d0
  1244.         beq.w    PT_funkit
  1245.         rts
  1246.  
  1247. PT_filteronoff
  1248.         move.b    PTv_Step3(a6),d0
  1249.         and.b    #1,d0
  1250.         add.b    d0,d0
  1251.         and.b    #$fd,$bfe001
  1252.         or.b    d0,$bfe001
  1253.         rts    
  1254.  
  1255. PT_setglisscontrol
  1256.         move.b    PTv_Step3(a6),d0
  1257.         and.b    #$0f,d0
  1258.         and.b    #$f0,PTv_GlissFunk(a6)
  1259.         or.b    d0,PTv_GlissFunk(a6)
  1260.         rts
  1261.  
  1262. PT_setvibratocontrol
  1263.         move.b    PTv_Step3(a6),d0
  1264.         and.b    #$0f,d0
  1265.         and.b    #$f0,PTv_WaveCtrl(a6)
  1266.         or.b    d0,PTv_WaveCtrl(a6)
  1267.         rts
  1268.  
  1269. PT_setfinetune
  1270.         move.b    PTv_Step3(a6),d0
  1271.         and.b    #$0f,d0
  1272.         move.b    d0,PTv_SmpFinetune(a6)
  1273.         rts
  1274.  
  1275. PT_jumploop    tst.b    PTm_Counter(a4)
  1276.         bne.w    PT_return
  1277.         move.b    PTv_Step3(a6),d0
  1278.         and.b    #$0f,d0
  1279.         beq.s    PT_setloop
  1280.         tst.b    PTv_LoopCount(a6)
  1281.         beq.s    PT_jumpcnt
  1282.         subq.b    #1,PTv_LoopCount(a6)
  1283.         beq.w    PT_return
  1284.  
  1285. PT_jmploop    move.b    PTv_PattPos(a6),PTm_PattBrkPos(a4)
  1286.         st    PTm_PattBrkFlag(a4)
  1287.         rts
  1288.  
  1289. PT_jumpcnt    move.b    d0,PTv_LoopCount(a6)
  1290.         bra.s    PT_jmploop
  1291.  
  1292. PT_setloop    move.w    PTm_PattPos(a4),d0
  1293.         lsr.w    #4,d0
  1294.         move.b    d0,PTv_PattPos(a6)
  1295.         rts
  1296.  
  1297. PT_settremolocontrol
  1298.         move.b    PTv_Step3(a6),d0
  1299.         and.b    #$0f,d0
  1300.         lsl.b    #4,d0
  1301.         and.b    #$0f,PTv_WaveCtrl(a6)
  1302.         or.b    d0,PTv_WaveCtrl(a6)
  1303.         rts
  1304.  
  1305. PT_retrignote    move.l    d1,-(sp)
  1306.         moveq.l    #0,d0
  1307.         move.b    PTv_Step3(a6),d0
  1308.         and.b    #$0f,d0
  1309.         beq.s    PT_rtnend
  1310.         moveq.l    #0,d1
  1311.         move.b    PTm_Counter(a4),d1
  1312.         bne.s    PT_rtnskp
  1313.         move.w    PTv_Step0(a6),d1
  1314.         and.w    #$0fff,d1
  1315.         bne.s    PT_rtnend
  1316.         moveq.l    #0,d1
  1317.         move.b    PTm_Counter(a4),d1
  1318.  
  1319. PT_rtnskp    divu.w    d0,d1
  1320.         swap.w    d1
  1321.         tst.w    d1
  1322.         bne.s    PT_rtnend
  1323.  
  1324. PT_doretrig    move.w    PTv_DMAMask(a6),$dff096    ; channel dma off
  1325.         move.l    PTv_SmpStart(a6),(a5)    ; set sampledata pointer
  1326.         move.w    PTv_SmpLength(a6),4(a5)    ; set length
  1327.         move.w    #300,d0
  1328.  
  1329. PT_rtnloop1    dbra    d0,PT_rtnloop1
  1330.         move.w    PTv_DMAMask(a6),d0
  1331.         bset    #15,d0
  1332.         move.w    d0,$dff096
  1333.         move.w    #300,d0
  1334.  
  1335. PT_rtnloop2    dbra    d0,PT_rtnloop2
  1336.         move.l    PTv_SmpRepStart(a6),(a5)
  1337.         move.l    PTv_SmpRepLen(a6),4(a5)
  1338.  
  1339. PT_rtnend    move.l    (sp)+,d1
  1340.         rts
  1341.  
  1342. PT_volumefineup
  1343.         tst.b    PTm_Counter(a4)
  1344.         bne.w    PT_return
  1345.         moveq.l    #0,d0
  1346.         move.b    PTv_Step3(a6),d0
  1347.         and.b    #$f,d0
  1348.         bra.w    PT_volslideup
  1349.  
  1350. PT_volumefinedown
  1351.         tst.b    PTm_Counter(a4)
  1352.         bne.w    PT_return
  1353.         moveq.l    #0,d0
  1354.         move.b    PTv_Step3(a6),d0
  1355.         and.b    #$0f,d0
  1356.         bra.w    PT_volslidedown2
  1357.  
  1358. PT_notecut    moveq.l    #0,d0
  1359.         move.b    PTv_Step3(a6),d0
  1360.         and.b    #$0f,d0
  1361.         cmp.b    PTm_Counter(a4),d0
  1362.         bne.w    PT_return
  1363.         clr.b    PTv_SmpVolume(a6)
  1364.         move.w    #0,8(a5)
  1365.         rts
  1366.  
  1367. PT_notedelay    moveq.l    #0,d0
  1368.         move.b    PTv_Step3(a6),d0
  1369.         and.b    #$0f,d0
  1370.         cmp.b    PTm_Counter(a4),d0
  1371.         bne.w    PT_return
  1372.         move.w    PTv_Step0(a6),d0
  1373.         beq.w    PT_return
  1374.         move.l    d1,-(sp)
  1375.         bra.w    PT_doretrig
  1376.  
  1377. PT_patterndelay
  1378.         tst.b    PTm_Counter(a4)
  1379.         bne.w    PT_return
  1380.         moveq.l    #0,d0
  1381.         move.b    PTv_Step3(a6),d0
  1382.         and.b    #$0f,d0
  1383.         tst.b    PTm_PtDelTime2(a4)
  1384.         bne.w    PT_return
  1385.         addq.b    #1,d0
  1386.         move.b    d0,PTm_PtDelTime(a4)
  1387.         rts
  1388.  
  1389. PT_funkit    tst.b    PTm_Counter(a4)
  1390.         bne.w    PT_return
  1391.         move.b    PTv_Step3(a6),d0
  1392.         and.b    #$0f,d0
  1393.         lsl.b    #4,d0
  1394.         and.b    #$0f,PTv_GlissFunk(a6)
  1395.         or.b    d0,PTv_GlissFunk(a6)
  1396.         tst.b    d0
  1397.         beq.w    PT_return
  1398.  
  1399. PT_updatefunk    movem.l    a0/d1,-(sp)
  1400.         moveq.l    #0,d0
  1401.         move.b    PTv_GlissFunk(a6),d0
  1402.         lsr.b    #4,d0
  1403.         beq.s    PT_funkend
  1404.         lea.l    PT_funktable(pc),a0
  1405.         move.b    (a0,d0.w),d0
  1406.         add.b    d0,PTv_FunkOffs(a6)
  1407.         btst    #7,PTv_FunkOffs(a6)
  1408.         beq.s    PT_funkend
  1409.         clr.b    PTv_FunkOffs(a6)
  1410.  
  1411.         move.l    PTv_SmpRepStart(a6),d0
  1412.         moveq.l    #0,d1
  1413.         move.w    PTv_SmpRepLen(a6),d1
  1414.         add.l    d1,d0
  1415.         add.l    d1,d0
  1416.         move.l    PTv_WaveStart(a6),a0
  1417.         addq.l    #1,a0
  1418.         cmp.l    d0,a0
  1419.         blo.s    PT_funkok
  1420.         move.l    PTv_SmpRepStart(a6),a0
  1421.  
  1422. PT_funkok    move.l    a0,PTv_WaveStart(a6)
  1423.         moveq.l    #-1,d0
  1424.         sub.b    (a0),d0
  1425.         move.b    d0,(a0)
  1426.  
  1427. PT_funkend    movem.l    (sp)+,a0/d1
  1428.         rts
  1429.  
  1430. PT_funktable    dc.b    0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1431.  
  1432. PT_vibratotable    
  1433.         dc.b    000,024,049,074,097,120,141,161
  1434.         dc.b    180,197,212,224,235,244,250,253
  1435.         dc.b    255,253,250,244,235,224,212,197
  1436.         dc.b    180,161,141,120,097,074,049,024
  1437.  
  1438. PT_periodtable
  1439. ; tuning 0, normal
  1440.         dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1441.         dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1442.         dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1443. ; tuning 1
  1444.         dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1445.         dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1446.         dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1447. ; tuning 2
  1448.         dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1449.         dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1450.         dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1451. ; tuning 3
  1452.         dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1453.         dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1454.         dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1455. ; tuning 4
  1456.         dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1457.         dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1458.         dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1459. ; tuning 5
  1460.         dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1461.         dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1462.         dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1463. ; tuning 6
  1464.         dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1465.         dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1466.         dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1467. ; tuning 7
  1468.         dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1469.         dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1470.         dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1471. ; tuning -8
  1472.         dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1473.         dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1474.         dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1475. ; tuning -7
  1476.         dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1477.         dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1478.         dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1479. ; tuning -6
  1480.         dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1481.         dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1482.         dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1483. ; tuning -5
  1484.         dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1485.         dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1486.         dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1487. ; tuning -4
  1488.         dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1489.         dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1490.         dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1491. ; tuning -3
  1492.         dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1493.         dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1494.         dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1495. ; tuning -2
  1496.         dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1497.         dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1498.         dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1499. ; tuning -1
  1500.         dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1501.         dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1502.         dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1503.  
  1504.     cnop 0,4
  1505.  
  1506. PT_chan1temp    dcb.b    PTv_sizeof,0
  1507. PT_chan2temp    dcb.b    PTv_sizeof,0
  1508. PT_chan3temp    dcb.b    PTv_sizeof,0
  1509. PT_chan4temp    dcb.b    PTv_sizeof,0
  1510.  
  1511. PT_MainData    dcb.b    PTm_sizeof,0
  1512.  
  1513.