home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / audio / ProTracker301.lha / SOURCE / PTPlay30B.S
Text File  |  1993-01-18  |  26KB  |  1,254 lines

  1. *****************************************************************
  2. *               ╗╗ Protracker 3.00B playroutine ½½              *
  3. * Written by Tom "Outland" Bech, Ivar "Heatseeker" J. Olsen,    *
  4. *     and  Bjarte "Krest" Andreassen of Cryptoburners.    *
  5. * Based upon Protracker 1.1A playroutine written by Lars Hamre. *
  6. *          VBlank version. Not optimised in any way.            *
  7. *****************************************************************
  8. * Call pt_InitMusic before start. Then call pt_PlayMusic at VB. *
  9. * To stop the music, call pt_StopMusic.                         *
  10. * Please note that in this version, all SetTempo commands are   *
  11. * ignored. This assembly language program has been tested with  *
  12. * the Devpac 3.02, AsmOne 1.2, MCAsm 1.5 and a68k assemblers and*
  13. * may have to be modified for other assemblers.            *
  14. *****************************************************************
  15.  
  16. ; FileFormat offsets
  17. sd_songname    EQU    0    ;songname offset
  18. sd_sampleinfo    EQU    20    ;first sample starts here
  19. sd_numofpatt    EQU    950    ;number of patterns are stored here
  20. sd_pattpos    EQU    952    ;pattern positions table is here
  21. sd_mahokakt    EQU    1080    ;"M.K." :)
  22. sd_patterndata    EQU    1084    ;first pattern starts at this position
  23.  
  24. ; Song offsets. W/L/B means word/longword/byte length.
  25. n_note        EQU    0      ;W
  26. n_cmd        EQU    2      ;W
  27. n_cmdlo        EQU    3      ;low B of cmd
  28. n_start        EQU    4      ;L
  29. n_length    EQU    8      ;W
  30. n_loopstart    EQU    10     ;L
  31. n_replen    EQU    14     ;W
  32. n_period    EQU    16     ;W
  33. n_finetune    EQU    18     ;B
  34. n_volume    EQU    19     ;B
  35. n_dmabit    EQU    20     ;W
  36. n_toneportdirec    EQU    22     ;B
  37. n_toneportspeed    EQU    23     ;B
  38. n_wantedperiod    EQU    24     ;W
  39. n_vibratocmd    EQU    26     ;B
  40. n_vibratopos    EQU    27     ;B
  41. n_tremolocmd    EQU    28     ;B
  42. n_tremolopos    EQU    29     ;B
  43. n_wavecontrol    EQU    30     ;B
  44. n_glissfunk    EQU    31     ;B
  45. n_sampleoffset    EQU    32     ;B
  46. n_pattpos    EQU    33     ;B
  47. n_loopcount    EQU    34     ;B
  48. n_funkoffset    EQU    35     ;B
  49. n_wavestart    EQU    36     ;L
  50. n_reallength    EQU    40     ;W
  51. n_trigger    EQU    42     ;B
  52. n_samplenum    EQU    43     ;B
  53.  
  54. pt_InitMusic
  55.     MOVEM.L    D0-D3/A0-A2,-(SP)
  56.     LEA    pt_data,a0
  57.     MOVE.L    A0,pt_SongDataPtr
  58.     LEA    sd_pattpos(A0),A1
  59.     MOVEQ    #128-1,D0
  60.     MOVEQ    #0,D1
  61.     MOVEQ    #0,D2
  62.     moveq    #$1e,d3
  63. pt_lop2 MOVE.B    (A1)+,D1
  64.     CMP.B    D2,D1
  65.     BLE.B    pt_lop
  66.     MOVE.L    D1,D2
  67. pt_lop    DBRA    D0,pt_lop2
  68.     ADDQ.W    #1,d2
  69.     ASL.L    #8,D2
  70.     ASL.L    #2,D2
  71.     LEA    4(A1,D2.L),A2
  72.     LEA    pt_SampleStarts(PC),A1
  73.     ADD.W    #2*20+2,A0        ;find first sample length
  74.     MOVEQ    #31-1,D0
  75. pt_lop3 MOVE.L    A2,(A1)+
  76.     MOVEQ    #0,D1
  77.     MOVE.W    (A0),D1
  78.     ASL.L    #1,D1
  79.     ADD.L    D1,A2
  80.     ADD.L    D3,A0
  81.     DBRA    D0,pt_lop3
  82.     MOVE.B    #6,pt_Speed        ;default speed
  83.     OR.B    #2,$BFE001
  84.     MOVEQ    #0,D0
  85.     LEA    $DFF000,A0
  86.     MOVE.W    D0,$A8(A0)
  87.     MOVE.W    D0,$B8(A0)
  88.     MOVE.W    D0,$C8(A0)
  89.     MOVE.W    D0,$D8(A0)
  90.     CLR.B    pt_SongPos
  91.     CLR.B    pt_Counter
  92.     CLR.B    pt_PattPos
  93.     MOVEM.L    (SP)+,D0-D3/A0-A2
  94.     RTS
  95.  
  96. pt_StopMusic
  97.     MOVEM.L    D0/A0,-(SP)
  98.     MOVEQ    #0,D0
  99.     LEA    $DFF000,A0
  100.     MOVE.W    D0,$A8(A0)
  101.     MOVE.W    D0,$B8(A0)
  102.     MOVE.W    D0,$C8(A0)
  103.     MOVE.W    D0,$D8(A0)
  104.     MOVE.W    #$000F,$DFF096        ;stop AudioDMA activity
  105.     MOVEM.L    (SP)+,D0/A0
  106.     RTS
  107.  
  108. pt_PlayMusic
  109.     MOVEM.L    D0-D7/A0-A6,-(SP)
  110.     MOVE.L    pt_SongDataPtr(PC),A0
  111.     ADDQ.L    #1,pt_Counter
  112.     MOVE.L    pt_Counter(PC),D0
  113.     CMP.L    pt_CurrSpeed(PC),D0
  114.     BLO.B    pt_NoNewNote
  115.     CLR.L    pt_Counter
  116.     TST.B    pt_PattDelayTime2
  117.     BEQ.B    pt_GetNewNote
  118.     BSR.B    pt_NoNewAllChannels
  119.     BRA.W    pt_dskip
  120.  
  121. pt_NoNewNote
  122.     BSR.B    pt_NoNewAllChannels
  123.     BRA.W    pt_NoNewPositionYet
  124.  
  125. pt_NoNewAllChannels
  126.     LEA    pt_audchan1temp(PC),A6
  127.     LEA    $DFF0A0,A5
  128.     BSR.W    pt_CheckEffects
  129.     LEA    pt_audchan2temp(PC),A6
  130.     LEA    $DFF0B0,A5
  131.     BSR.W    pt_CheckEffects
  132.     LEA    pt_audchan3temp(PC),A6
  133.     LEA    $DFF0C0,A5
  134.     BSR.W    pt_CheckEffects
  135.     LEA    pt_audchan4temp(PC),A6
  136.     LEA    $DFF0D0,A5
  137.     BRA.W    pt_CheckEffects
  138.  
  139. pt_GetNewNote
  140.     LEA    12(A0),A3
  141.     LEA    sd_pattpos(A0),A2
  142.     LEA    sd_patterndata(A0),A0
  143.     MOVEQ    #0,D1
  144.     MOVE.L    pt_SongPosition(PC),D0
  145.     MOVE.B    0(a2,D0.W),D1
  146.     ASL.L    #8,D1                ;*1024
  147.     ASL.L    #2,D1
  148.  
  149.     ADD.L    pt_PatternPosition(PC),D1
  150.     MOVE.L    D1,pt_PatternPtr
  151.     CLR.W    pt_DMACONtemp
  152.     LEA    $DFF0A0,A5
  153.     LEA    pt_audchan1temp(PC),A6
  154.     MOVEQ    #1,D2
  155.     BSR.W    pt_PlayVoice
  156.     MOVEQ    #0,D0
  157.     MOVE.B    n_volume(A6),D0
  158.     MOVE.W    D0,8(A5)
  159.     LEA    $DFF0B0,A5
  160.     LEA    pt_audchan2temp(PC),A6
  161.     MOVEQ    #2,D2
  162.     BSR.B    pt_PlayVoice
  163.     MOVEQ    #0,D0
  164.     MOVE.B    n_volume(A6),D0
  165.     MOVE.W    D0,8(A5)
  166.     LEA    $DFF0C0,A5
  167.     LEA    pt_audchan3temp(PC),A6
  168.     MOVEQ    #3,D2
  169.     BSR.B    pt_PlayVoice
  170.     MOVEQ    #0,D0
  171.     MOVE.B    n_volume(A6),D0
  172.     MOVE.W    D0,8(A5)
  173.     LEA    $DFF0D0,A5
  174.     LEA    pt_audchan4temp(PC),A6
  175.     MOVEQ    #4,D2
  176.     BSR.B    pt_PlayVoice
  177.     MOVEQ    #0,D0
  178.     MOVE.B    n_volume(A6),D0
  179.     MOVE.W    D0,8(A5)
  180.     BRA.W    pt_SetDMA
  181.  
  182. pt_CheckMetronome
  183.     CMP.B    pt_MetroChannel,D2
  184.     BNE.W    pt_Return
  185.     MOVE.B    pt_MetroSpeed,D2
  186.     BEQ.W    pt_Return
  187.     MOVE.L    pt_PatternPosition,D3
  188.     LSR.L    #4,D3
  189.     DIVU    D2,D3
  190.     SWAP    D3
  191.     TST.W    D3
  192.     BNE.W    pt_Return
  193.     AND.L    #$00000FFF,(A6)
  194.     OR.L    #$10D6F000,(A6)     ;Play sample $1F at period $0D6 (214)
  195.     RTS
  196.  
  197. pt_PlayVoice
  198.     TST.L    (A6)
  199.     BNE.B    pt_plvskip
  200.     BSR.W    pt_PerNop
  201. pt_plvskip
  202.     MOVE.L    0(a0,D1.L),(A6)        ;Read one track from pattern
  203.     BSR.B    pt_CheckMetronome
  204.     ADDQ.L    #4,D1
  205.     MOVEQ    #0,D2
  206.     MOVE.B    n_cmd(A6),D2        ;Get lower 4 bits of instrument
  207.     AND.B    #$F0,D2
  208.     LSR.B    #4,D2
  209.     MOVE.B    (A6),D0            ;Get higher 4 bits of instrument
  210.     AND.B    #$F0,D0
  211.     OR.B    D0,D2
  212.     TST.B    D2
  213.     BEQ.B    pt_SetRegisters        ;Instrument was zero
  214.     MOVEQ    #0,D3
  215.     LEA    pt_SampleStarts(PC),A1
  216.     MOVE    D2,D4
  217.     MOVE.B    D2,n_samplenum(A6)
  218.     SUBQ.L    #1,D2
  219.     LSL.L    #2,D2
  220.     MULU    #30,D4
  221.     MOVE.L    0(a1,D2.L),n_start(A6)
  222.     MOVE.W    0(a3,D4.L),n_length(A6)
  223.     MOVE.W    0(a3,D4.L),n_reallength(A6)
  224.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  225.     MOVE.B    3(A3,D4.L),n_volume(A6)
  226.     MOVE.W    4(A3,D4.L),D3         ;Get repeat
  227.     TST.W    D3
  228.     BEQ.B    pt_NoLoop
  229.     MOVE.L    n_start(A6),D2        ;Get start
  230.     ASL.W    #1,D3
  231.     ADD.L    D3,D2            ;Add repeat
  232.     MOVE.L    D2,n_loopstart(A6)
  233.     MOVE.L    D2,n_wavestart(A6)
  234.     MOVE.W    4(A3,D4.L),D0        ;Get repeat
  235.     ADD.W    6(A3,D4.L),D0        ;Add replen
  236.     MOVE.W    D0,n_length(A6)
  237.     MOVE.W    6(A3,D4.L),n_replen(A6)    ;Save replen
  238.     BRA.B    pt_SetRegisters
  239.  
  240. pt_NoLoop
  241.     MOVE.L    n_start(A6),D2
  242.     ADD.L    D3,D2
  243.     MOVE.L    D2,n_loopstart(A6)
  244.     MOVE.L    D2,n_wavestart(A6)
  245.     MOVE.W    6(A3,D4.L),n_replen(A6)    ;Save replen
  246. pt_SetRegisters
  247.     MOVE.W    (A6),D0
  248.     AND.W    #$0FFF,D0
  249.     BEQ.W    pt_CheckMoreEffects    ;If no note ->
  250.     MOVE.W    2(A6),D0
  251.     AND.W    #$0FF0,D0
  252.     CMP.W    #$0E50,D0         ;finetune?
  253.     BEQ.B    pt_DoSetFineTune
  254.     MOVE.B    2(A6),D0
  255.     AND.B    #$0F,D0
  256.     CMP.B    #3,D0            ;TonePortamento?
  257.     BEQ.B    pt_ChkTonePorta
  258.     CMP.B    #5,D0            ;TonePortamento + VolSlide?
  259.     BEQ.B    pt_ChkTonePorta
  260.     CMP.B    #9,D0            ;Sample Offset?
  261.     BNE.B    pt_SetPeriod
  262.     BSR.W    pt_CheckMoreEffects
  263.     BRA.B    pt_SetPeriod
  264.  
  265. pt_DoSetFineTune
  266.     BSR.W    pt_SetFineTune
  267.     BRA.B    pt_SetPeriod
  268.  
  269. pt_ChkTonePorta
  270.     BSR.W    pt_SetTonePorta
  271.     BRA.W    pt_CheckMoreEffects
  272.  
  273. pt_SetPeriod
  274.     MOVEM.L    D0-D1/A0-A1,-(SP)
  275.     MOVE.W    (A6),D1
  276.     AND.W    #$0FFF,D1
  277.     LEA    pt_PeriodTable(PC),A1
  278.     MOVEQ    #0,D0
  279.     MOVEQ    #$24,D7
  280. pt_ftuloop
  281.     CMP.W    0(a1,D0.W),D1
  282.     BHS.B    pt_ftufound
  283.     ADDQ.L    #2,D0
  284.     DBRA    D7,pt_ftuloop
  285. pt_ftufound
  286.     MOVEQ    #0,D1
  287.     MOVE.B    n_finetune(A6),D1
  288.     MULU    #37*2,D1
  289.     ADD.L    D1,A1
  290.     MOVE.W    0(a1,D0.W),n_period(A6)
  291.     MOVEM.L    (SP)+,D0-D1/A0-A1
  292.  
  293.     MOVE.W    2(A6),D0
  294.     AND.W    #$0FF0,D0
  295.     CMP.W    #$0ED0,D0
  296.     BEQ.W    pt_CheckMoreEffects
  297.  
  298.     MOVE.W    n_dmabit(A6),$DFF096
  299.     BTST    #2,n_wavecontrol(A6)
  300.     BNE.B    pt_vibnoc
  301.     CLR.B    n_vibratopos(A6)
  302. pt_vibnoc
  303.     BTST    #6,n_wavecontrol(A6)
  304.     BNE.B    pt_trenoc
  305.     CLR.B    n_tremolopos(A6)
  306. pt_trenoc
  307.     MOVE.W    n_length(A6),4(A5)    ;Set length
  308.     MOVE.L    n_start(A6),(A5)    ;Set start
  309.     BNE.B    pt_sdmaskp
  310.     CLR.L    n_loopstart(A6)
  311.     MOVEQ    #1,D0
  312.     MOVE.W    D0,4(A5)
  313.     MOVE.W    D0,n_replen(A6)
  314. pt_sdmaskp
  315.     MOVE.W    n_period(A6),D0
  316.     MOVE.W    D0,6(A5)        ;Set period
  317.     ST    n_trigger(A6)
  318.     MOVE.W    n_dmabit(A6),D0
  319.     OR.W    D0,pt_DMACONtemp
  320.     BRA.W    pt_CheckMoreEffects
  321.  
  322. pt_SetDMA
  323.     move.b    pt_timeout,$bfe701    ;TimerB HI
  324.     move.b    pt_timeout+1,$bfe601    ;TimerB LO
  325.     move.b    #%000011001,$bfef01    ;set commandbits: OneShot & CLK & Start
  326. pt_timerwait1
  327.     btst    #0,$bfef01        ;timeout on timerB? (ICR TimerB)
  328.     bne.s    pt_timerwait1        ;nope...
  329.     MOVE.W    pt_DMACONtemp,D0
  330.     AND.W    pt_ActiveChannels,D0    ;mask out inactive channels
  331.     OR.W    #$8000,D0
  332.     MOVE.W    D0,$DFF096
  333.     move.b    pt_timeout,$bfe701    ;TimerB HI
  334.     move.b    pt_timeout+1,$bfe601    ;TimerB LO
  335.     move.b    #%000011001,$bfef01    ;set commandbits: OneShot & CLK & Start
  336. pt_timerwait2
  337.     btst    #0,$bfef01        ;timeout on timerB? (ICR TimerB)
  338.     bne.s    pt_timerwait2        ;nope...
  339.     LEA    $DFF000,A5
  340.     LEA    pt_audchan4temp(PC),A6
  341.     MOVE.L    n_loopstart(A6),$D0(A5)
  342.     MOVE.W    n_replen(A6),$D4(A5)
  343.     LEA    pt_audchan3temp(PC),A6
  344.     MOVE.L    n_loopstart(A6),$C0(A5)
  345.     MOVE.W    n_replen(A6),$C4(A5)
  346.     LEA    pt_audchan2temp(PC),A6
  347.     MOVE.L    n_loopstart(A6),$B0(A5)
  348.     MOVE.W    n_replen(A6),$B4(A5)
  349.     LEA    pt_audchan1temp(PC),A6
  350.     MOVE.L    n_loopstart(A6),$A0(A5)
  351.     MOVE.W    n_replen(A6),$A4(A5)
  352.  
  353. pt_dskip
  354.     ADD.L    #16,pt_PatternPosition
  355.     MOVE.B    pt_PattDelayTime,D0
  356.     BEQ.B    pt_dskpc
  357.     MOVE.B    D0,pt_PattDelayTime2
  358.     CLR.B    pt_PattDelayTime
  359. pt_dskpc
  360.     TST.B    pt_PattDelayTime2
  361.     BEQ.B    pt_dskpa
  362.     SUBQ.B    #1,pt_PattDelayTime2
  363.     BEQ.B    pt_dskpa
  364.     SUB.L    #16,pt_PatternPosition
  365. pt_dskpa
  366.     TST.B    pt_PBreakFlag
  367.     BEQ.B    pt_nnpysk
  368.     SF    pt_PBreakFlag
  369.     MOVEQ    #0,D0
  370.     MOVE.B    pt_PBreakPosition(PC),D0
  371.     LSL.W    #4,D0
  372.     MOVE.L    D0,pt_PatternPosition
  373.     CLR.B    pt_PBreakPosition
  374. pt_nnpysk
  375.     CMP.L    #1024,pt_PatternPosition
  376.     BNE.B    pt_NoNewPositionYet
  377. pt_NextPosition    
  378.     MOVEQ    #0,D0
  379.     MOVE.B    pt_PBreakPosition(PC),D0
  380.     LSL.W    #4,D0
  381.     MOVE.L    D0,pt_PatternPosition
  382.     CLR.B    pt_PBreakPosition
  383.     CLR.B    pt_PosJumpAssert
  384.     ADDQ.L    #1,pt_SongPosition
  385.     AND.L    #$7F,pt_SongPosition
  386.     MOVE.L    pt_SongPosition(PC),D1
  387.     MOVE.L    pt_SongDataPtr(PC),A0
  388.     CMP.B    sd_numofpatt(A0),D1
  389.     BLO.B    pt_NoNewPositionYet
  390.     CLR.L    pt_SongPosition
  391. pt_NoNewPositionYet
  392.     TST.B    pt_PosJumpAssert
  393.     BNE.B    pt_NextPosition
  394.     MOVEM.L    (SP)+,D0-D7/A0-A6
  395.     RTS
  396.  
  397. pt_CheckEffects
  398.     BSR.B    pt_chkefx2
  399.     MOVEQ    #0,D0
  400.     MOVE.B    n_volume(A6),D0
  401.     MOVE.W    D0,8(A5)
  402.     RTS
  403.  
  404. pt_chkefx2
  405.     BSR.W    pt_UpdateFunk
  406.     MOVE.W    n_cmd(A6),D0
  407.     AND.W    #$0FFF,D0
  408.     BEQ.B    pt_Return
  409.     MOVE.B    n_cmd(A6),D0
  410.     AND.B    #$0F,D0
  411.     TST.B    D0
  412.     BEQ.B    pt_Arpeggio
  413.     CMP.B    #1,D0
  414.     BEQ.W    pt_PortaUp
  415.     CMP.B    #2,D0
  416.     BEQ.W    pt_PortaDown
  417.     CMP.B    #3,D0
  418.     BEQ.W    pt_TonePortamento
  419.     CMP.B    #4,D0
  420.     BEQ.W    pt_Vibrato
  421.     CMP.B    #5,D0
  422.     BEQ.W    pt_TonePlusVolSlide
  423.     CMP.B    #6,D0
  424.     BEQ.W    pt_VibratoPlusVolSlide
  425.     CMP.B    #$E,D0
  426.     BEQ.W    pt_ECommands
  427. pt_SetBack
  428.     MOVE.W    n_period(A6),6(A5)
  429.     CMP.B    #7,D0
  430.     BEQ.W    pt_Tremolo
  431.     CMP.B    #$A,D0
  432.     BEQ.W    pt_VolumeSlide
  433. pt_Return
  434.     RTS
  435.  
  436. pt_PerNop
  437.     MOVE.W    n_period(A6),6(A5)
  438.     RTS
  439.  
  440. pt_Arpeggio
  441.     MOVEQ    #0,D0
  442.     MOVE.L    pt_Counter(PC),D0
  443.     DIVS    #3,D0
  444.     SWAP    D0
  445.     CMP.W    #1,D0
  446.     BEQ.B    pt_Arpeggio1
  447.     CMP.W    #2,D0
  448.     BEQ.B    pt_Arpeggio2
  449. pt_Arpeggio0
  450.     MOVE.W    n_period(A6),D2
  451.     BRA.B    pt_ArpeggioSet
  452.  
  453. pt_Arpeggio1
  454.     MOVEQ    #0,D0
  455.     MOVE.B    n_cmdlo(A6),D0
  456.     LSR.B    #4,D0
  457.     BRA.B    pt_ArpeggioFind
  458.  
  459. pt_Arpeggio2
  460.     MOVEQ    #0,D0
  461.     MOVE.B    n_cmdlo(A6),D0
  462.     AND.B    #15,D0
  463. pt_ArpeggioFind
  464.     ASL.W    #1,D0
  465.     MOVEQ    #0,D1
  466.     MOVE.B    n_finetune(A6),D1
  467.     MULU    #37*2,D1
  468.     LEA    pt_PeriodTable(PC),A0
  469.     ADD.L    D1,A0
  470.     MOVEQ    #0,D1
  471.     MOVE.W    n_period(A6),D1
  472.     MOVEQ    #$24,D7
  473. pt_arploop
  474.     MOVE.W    0(a0,D0.W),D2
  475.     CMP.W    (A0),D1
  476.     BHS.B    pt_ArpeggioSet
  477.     ADDQ.L    #2,A0
  478.     DBRA    D7,pt_arploop
  479.     RTS
  480.  
  481. pt_ArpeggioSet
  482.     MOVE.W    D2,6(A5)
  483.     RTS
  484.  
  485. pt_FinePortaUp
  486.     TST.L    pt_Counter
  487.     BNE.B    pt_Return
  488.     MOVE.B    #$0F,pt_LowMask
  489. pt_PortaUp
  490.     MOVEQ    #0,D0
  491.     MOVE.B    n_cmdlo(A6),D0
  492.     AND.B    pt_LowMask,D0
  493.     MOVE.B    #$FF,pt_LowMask
  494.     SUB.W    D0,n_period(A6)
  495.     MOVE.W    n_period(A6),D0
  496.     AND.W    #$0FFF,D0
  497.     CMP.W    #$0071,D0
  498.     BPL.B    pt_PortaUskip
  499.     AND.W    #$F000,n_period(A6)
  500.     OR.W    #$0071,n_period(A6)
  501. pt_PortaUskip
  502.     MOVE.W    n_period(A6),D0
  503.     AND.W    #$0FFF,D0
  504.     MOVE.W    D0,6(A5)
  505.     RTS
  506.  
  507. pt_FinePortaDown
  508.     TST.L    pt_Counter
  509.     BNE.W    pt_Return
  510.     MOVE.B    #$0F,pt_LowMask
  511. pt_PortaDown
  512.     CLR.W    D0
  513.     MOVE.B    n_cmdlo(A6),D0
  514.     AND.B    pt_LowMask,D0
  515.     MOVE.B    #$FF,pt_LowMask
  516.     ADD.W    D0,n_period(A6)
  517.     MOVE.W    n_period(A6),D0
  518.     AND.W    #$0FFF,D0
  519.     CMP.W    #$0358,D0
  520.     BMI.B    pt_Portadskip
  521.     AND.W    #$F000,n_period(A6)
  522.     OR.W    #$0358,n_period(A6)
  523. pt_Portadskip
  524.     MOVE.W    n_period(A6),D0
  525.     AND.W    #$0FFF,D0
  526.     MOVE.W    D0,6(A5)
  527.     RTS
  528.  
  529. pt_SetTonePorta
  530.     MOVE.L    A0,-(SP)
  531.     MOVE.W    (A6),D2
  532.     AND.W    #$0FFF,D2
  533.     MOVEQ    #0,D0
  534.     MOVE.B    n_finetune(A6),D0
  535.     MULU    #37*2,D0
  536.     LEA    pt_PeriodTable(PC),A0
  537.     ADD.L    D0,A0
  538.     MOVEQ    #0,D0
  539. pt_StpLoop
  540.     CMP.W    0(a0,D0.W),D2
  541.     BHS.B    pt_StpFound
  542.     ADDQ.W    #2,D0
  543.     CMP.W    #37*2,D0
  544.     BLO.B    pt_StpLoop
  545.     MOVEQ    #35*2,D0
  546. pt_StpFound
  547.     MOVE.B    n_finetune(A6),D2
  548.     AND.B    #8,D2
  549.     BEQ.B    pt_StpGoss
  550.     TST.W    D0
  551.     BEQ.B    pt_StpGoss
  552.     SUBQ.W    #2,D0
  553. pt_StpGoss
  554.     MOVE.W    0(a0,D0.W),D2
  555.     MOVE.L    (SP)+,A0
  556.     MOVE.W    D2,n_wantedperiod(A6)
  557.     MOVE.W    n_period(A6),D0
  558.     CLR.B    n_toneportdirec(A6)
  559.     CMP.W    D0,D2
  560.     BEQ.B    pt_ClearTonePorta
  561.     BGE.W    pt_Return
  562.     MOVE.B    #1,n_toneportdirec(A6)
  563.     RTS
  564.  
  565. pt_ClearTonePorta
  566.     CLR.W    n_wantedperiod(A6)
  567.     RTS    
  568.  
  569. pt_TonePortamento
  570.     MOVE.B    n_cmdlo(A6),D0
  571.     BEQ.B    pt_TonePortNoChange
  572.     MOVE.B    D0,n_toneportspeed(A6)
  573.     CLR.B    n_cmdlo(A6)
  574. pt_TonePortNoChange
  575.     TST.W    n_wantedperiod(A6)
  576.     BEQ.W    pt_Return
  577.     MOVEQ    #0,D0
  578.     MOVE.B    n_toneportspeed(A6),D0
  579.     TST.B    n_toneportdirec(A6)
  580.     BNE.B    pt_TonePortaUp
  581. pt_TonePortaDown
  582.     ADD.W    D0,n_period(A6)
  583.     MOVE.W    n_wantedperiod(A6),D0
  584.     CMP.W    n_period(A6),D0
  585.     BGT.B    pt_TonePortaSetPer
  586.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  587.     CLR.W    n_wantedperiod(A6)
  588.     BRA.B    pt_TonePortaSetPer
  589.  
  590. pt_TonePortaUp
  591.     SUB.W    D0,n_period(A6)
  592.     MOVE.W    n_wantedperiod(A6),D0
  593.     CMP.W    n_period(A6),D0
  594.     BLT.B    pt_TonePortaSetPer
  595.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  596.     CLR.W    n_wantedperiod(A6)
  597.  
  598. pt_TonePortaSetPer
  599.     MOVE.W    n_period(A6),D2
  600.     MOVE.B    n_glissfunk(A6),D0
  601.     AND.B    #$0F,D0
  602.     BEQ.B    pt_GlissSkip
  603.     MOVEQ    #0,D0
  604.     MOVE.B    n_finetune(A6),D0
  605.     MULU    #37*2,D0
  606.     LEA    pt_PeriodTable(PC),A0
  607.     ADD.L    D0,A0
  608.     MOVEQ    #0,D0
  609. pt_GlissLoop
  610.     CMP.W    0(a0,D0.W),D2
  611.     BHS.B    pt_GlissFound
  612.     ADDQ.W    #2,D0
  613.     CMP.W    #37*2,D0
  614.     BLO.B    pt_GlissLoop
  615.     MOVEQ    #35*2,D0
  616. pt_GlissFound
  617.     MOVE.W    0(a0,D0.W),D2
  618. pt_GlissSkip
  619.     MOVE.W    D2,6(A5)         ;Set period
  620.     RTS
  621.  
  622. pt_Vibrato
  623.     MOVE.B    n_cmdlo(A6),D0
  624.     BEQ.B    pt_Vibrato2
  625.     MOVE.B    n_vibratocmd(A6),D2
  626.     AND.B    #$0F,D0
  627.     BEQ.B    pt_vibskip
  628.     AND.B    #$F0,D2
  629.     OR.B    D0,D2
  630. pt_vibskip
  631.     MOVE.B    n_cmdlo(A6),D0
  632.     AND.B    #$F0,D0
  633.     BEQ.B    pt_vibskip2
  634.     AND.B    #$0F,D2
  635.     OR.B    D0,D2
  636. pt_vibskip2
  637.     MOVE.B    D2,n_vibratocmd(A6)
  638. pt_Vibrato2
  639.     MOVE.L    A4,-(SP)
  640.     MOVE.B    n_vibratopos(A6),D0
  641.     LEA    pt_VibratoTable(PC),A4
  642.     LSR.W    #2,D0
  643.     AND.W    #$001F,D0
  644.     MOVEQ    #0,D2
  645.     MOVE.B    n_wavecontrol(A6),D2
  646.     AND.B    #$03,D2
  647.     BEQ.B    pt_vib_sine
  648.     LSL.B    #3,D0
  649.     CMP.B    #1,D2
  650.     BEQ.B    pt_vib_rampdown
  651.     MOVE.B    #255,D2
  652.     BRA.B    pt_vib_set
  653. pt_vib_rampdown
  654.     TST.B    n_vibratopos(A6)
  655.     BPL.B    pt_vib_rampdown2
  656.     MOVE.B    #255,D2
  657.     SUB.B    D0,D2
  658.     BRA.B    pt_vib_set
  659. pt_vib_rampdown2
  660.     MOVE.B    D0,D2
  661.     BRA.B    pt_vib_set
  662. pt_vib_sine
  663.     MOVE.B    0(A4,D0.W),D2
  664. pt_vib_set
  665.     MOVE.B    n_vibratocmd(A6),D0
  666.     AND.W    #15,D0
  667.     MULU    D0,D2
  668.     LSR.W    #7,D2
  669.     MOVE.W    n_period(A6),D0
  670.     TST.B    n_vibratopos(A6)
  671.     BMI.B    pt_VibratoNeg
  672.     ADD.W    D2,D0
  673.     BRA.B    pt_Vibrato3
  674. pt_VibratoNeg
  675.     SUB.W    D2,D0
  676. pt_Vibrato3
  677.     MOVE.W    D0,6(A5)
  678.     MOVE.B    n_vibratocmd(A6),D0
  679.     LSR.W    #2,D0
  680.     AND.W    #$003C,D0
  681.     ADD.B    D0,n_vibratopos(A6)
  682.     MOVE.L    (SP)+,A4
  683.     RTS
  684.  
  685. pt_TonePlusVolSlide
  686.     BSR.W    pt_TonePortNoChange
  687.     BRA.W    pt_VolumeSlide
  688.  
  689. pt_VibratoPlusVolSlide
  690.     BSR.B    pt_Vibrato2
  691.     BRA.W    pt_VolumeSlide
  692.  
  693. pt_Tremolo
  694.     MOVE.L    A4,-(SP)
  695.     MOVE.B    n_cmdlo(A6),D0
  696.     BEQ.B    pt_Tremolo2
  697.     MOVE.B    n_tremolocmd(A6),D2
  698.     AND.B    #$0F,D0
  699.     BEQ.B    pt_treskip
  700.     AND.B    #$F0,D2
  701.     OR.B    D0,D2
  702. pt_treskip
  703.     MOVE.B    n_cmdlo(A6),D0
  704.     AND.B    #$F0,D0
  705.     BEQ.B    pt_treskip2
  706.     AND.B    #$0F,D2
  707.     OR.B    D0,D2
  708. pt_treskip2
  709.     MOVE.B    D2,n_tremolocmd(A6)
  710. pt_Tremolo2
  711.     MOVE.B    n_tremolopos(A6),D0
  712.     LEA    pt_VibratoTable(PC),A4
  713.     LSR.W    #2,D0
  714.     AND.W    #$001F,D0
  715.     MOVEQ    #0,D2
  716.     MOVE.B    n_wavecontrol(A6),D2
  717.     LSR.B    #4,D2
  718.     AND.B    #$03,D2
  719.     BEQ.B    pt_tre_sine
  720.     LSL.B    #3,D0
  721.     CMP.B    #1,D2
  722.     BEQ.B    pt_tre_rampdown
  723.     MOVE.B    #255,D2
  724.     BRA.B    pt_tre_set
  725. pt_tre_rampdown
  726.     TST.B    n_vibratopos(A6)
  727.     BPL.B    pt_tre_rampdown2
  728.     MOVE.B    #255,D2
  729.     SUB.B    D0,D2
  730.     BRA.B    pt_tre_set
  731. pt_tre_rampdown2
  732.     MOVE.B    D0,D2
  733.     BRA.B    pt_tre_set
  734. pt_tre_sine
  735.     MOVE.B    0(A4,D0.W),D2
  736. pt_tre_set
  737.     MOVE.B    n_tremolocmd(A6),D0
  738.     AND.W    #15,D0
  739.     MULU    D0,D2
  740.     LSR.W    #6,D2
  741.     MOVEQ    #0,D0
  742.     MOVE.B    n_volume(A6),D0
  743.     TST.B    n_tremolopos(A6)
  744.     BMI.B    pt_TremoloNeg
  745.     ADD.W    D2,D0
  746.     BRA.B    pt_Tremolo3
  747. pt_TremoloNeg
  748.     SUB.W    D2,D0
  749. pt_Tremolo3
  750.     BPL.B    pt_TremoloSkip
  751.     CLR.W    D0
  752. pt_TremoloSkip
  753.     CMP.W    #$40,D0
  754.     BLS.B    pt_TremoloOk
  755.     MOVE.W    #$40,D0
  756. pt_TremoloOk
  757.     MOVE.W    D0,8(A5)
  758.     MOVE.B    n_tremolocmd(A6),D0
  759.     LSR.W    #2,D0
  760.     AND.W    #$003C,D0
  761.     ADD.B    D0,n_tremolopos(A6)
  762.     MOVE.L    (SP)+,A4
  763.     ADDQ.L    #4,SP
  764.     RTS
  765.  
  766. pt_SampleOffset
  767.     MOVEQ    #0,D0
  768.     MOVE.B    n_cmdlo(A6),D0
  769.     BEQ.B    pt_sononew
  770.     MOVE.B    D0,n_sampleoffset(A6)
  771. pt_sononew
  772.     MOVE.B    n_sampleoffset(A6),D0
  773.     LSL.W    #7,D0
  774.     CMP.W    n_length(A6),D0
  775.     BGE.B    pt_sofskip
  776.     SUB.W    D0,n_length(A6)
  777.     LSL.W    #1,D0
  778.     ADD.L    D0,n_start(A6)
  779.     RTS
  780. pt_sofskip
  781.     MOVE.W    #1,n_length(A6)
  782.     RTS
  783.  
  784. pt_VolumeSlide
  785.     MOVEQ    #0,D0
  786.     MOVE.B    n_cmdlo(A6),D0
  787.     LSR.B    #4,D0
  788.     TST.B    D0
  789.     BEQ.B    pt_VolSlideDown
  790. pt_VolSlideUp
  791.     ADD.B    D0,n_volume(A6)
  792.     CMP.B    #$40,n_volume(A6)
  793.     BMI.B    pt_vsuskip
  794.     MOVE.B    #$40,n_volume(A6)
  795. pt_vsuskip
  796.     MOVE.B    n_volume(A6),D0
  797.     RTS
  798.  
  799. pt_VolSlideDown
  800.     MOVEQ    #0,D0
  801.     MOVE.B    n_cmdlo(A6),D0
  802.     AND.B    #$0F,D0
  803. pt_VolSlideDown2
  804.     SUB.B    D0,n_volume(A6)
  805.     BPL.B    pt_vsdskip
  806.     CLR.B    n_volume(A6)
  807. pt_vsdskip
  808.     MOVE.B    n_volume(A6),D0
  809.     RTS
  810.  
  811. pt_PositionJump
  812.     MOVEQ    #0,D0
  813.     MOVE.B    n_cmdlo(A6),D0
  814.     SUBQ.B    #1,D0
  815.     MOVE.L    D0,pt_SongPosition
  816. pt_pj2    CLR.B    pt_PBreakPosition
  817.     ST     pt_PosJumpAssert
  818.     RTS
  819.  
  820. pt_VolumeChange
  821.     MOVEQ    #0,D0
  822.     MOVE.B    n_cmdlo(A6),D0
  823.     CMP.B    #$40,D0
  824.     BLS.B    pt_VolumeOk
  825.     MOVEQ    #$40,D0
  826. pt_VolumeOk
  827.     MOVE.B    D0,n_volume(A6)
  828.     RTS
  829.  
  830. pt_PatternBreak
  831.     MOVEQ    #0,D0
  832.     MOVE.B    n_cmdlo(A6),D0
  833.     MOVE.L    D0,D2
  834.     LSR.B    #4,D0
  835.     MULU    #10,D0
  836.     AND.B    #$0F,D2
  837.     ADD.B    D2,D0
  838.     CMP.B    #63,D0
  839.     BHI.B    pt_pj2
  840.     MOVE.B    D0,pt_PBreakPosition
  841.     ST    pt_PosJumpAssert
  842.     RTS
  843.  
  844. pt_SetSpeed
  845.     MOVE.B    3(A6),D0
  846.     AND.W    #$FF,D0
  847.     BEQ.B    pt_SpeedNull
  848. ;    CMP.W    #32,D0            ;change this for lev6/CIA users
  849. ;    BLO.B    normspd            ;it updates the countervalues (Tempo)
  850. ;    MOVE.W    D0,RealTempo        ;for the BPM timer
  851. ;    MOVEM.L    D0-D7/A0-A6,-(SP)
  852. ;    ST    UpdateTempo
  853. ;    JSR    SetTempo
  854. ;    MOVEM.L    (SP)+,D0-D7/A0-A6
  855. ;    RTS
  856. pt_normspd
  857.     CLR.L    pt_Counter
  858.     MOVE.W    D0,pt_CurrSpeed+2
  859.     RTS
  860. pt_SpeedNull
  861.     RTS
  862.  
  863. pt_CheckMoreEffects
  864.     MOVE.B    2(A6),D0
  865.     AND.B    #$0F,D0
  866.     CMP.B    #$9,D0
  867.     BEQ.W    pt_SampleOffset
  868.     CMP.B    #$B,D0
  869.     BEQ.W    pt_PositionJump
  870.     CMP.B    #$D,D0
  871.     BEQ.B    pt_PatternBreak
  872.     CMP.B    #$E,D0
  873.     BEQ.B    pt_ECommands
  874.     CMP.B    #$F,D0
  875.     BEQ.B    pt_SetSpeed
  876.     CMP.B    #$C,D0
  877.     BEQ.W    pt_VolumeChange
  878.     BRA.W    pt_PerNop
  879.  
  880. pt_ECommands
  881.     MOVE.B    n_cmdlo(A6),D0
  882.     AND.B    #$F0,D0
  883.     LSR.B    #4,D0
  884.     BEQ.B    pt_FilterOnOff
  885.     CMP.B    #1,D0
  886.     BEQ.W    pt_FinePortaUp
  887.     CMP.B    #2,D0
  888.     BEQ.W    pt_FinePortaDown
  889.     CMP.B    #3,D0
  890.     BEQ.B    pt_SetGlissControl
  891.     CMP.B    #4,D0
  892.     BEQ.W    pt_SetVibratoControl
  893.     CMP.B    #5,D0
  894.     BEQ.W    pt_SetFineTune
  895.     CMP.B    #6,D0
  896.     BEQ.W    pt_JumpLoop
  897.     CMP.B    #7,D0
  898.     BEQ.W    pt_SetTremoloControl
  899.     CMP.B    #8,D0
  900.     BEQ.W    pt_KarplusStrong
  901.     CMP.B    #$E,D0
  902.     BEQ.W    pt_PatternDelay
  903.     CMP.B    #9,D0
  904.     BEQ.W    pt_RetrigNote
  905.     CMP.B    #$A,D0
  906.     BEQ.W    pt_VolumeFineUp
  907.     CMP.B    #$B,D0
  908.     BEQ.W    pt_VolumeFineDown
  909.     CMP.B    #$C,D0
  910.     BEQ.W    pt_NoteCut
  911.     CMP.B    #$D,D0
  912.     BEQ.W    pt_NoteDelay
  913.     CMP.B    #$F,D0
  914.     BEQ.W    pt_FunkIt
  915.     RTS
  916.  
  917. pt_FilterOnOff
  918.     MOVE.B    n_cmdlo(A6),D0
  919.     AND.B    #1,D0
  920.     ASL.B    #1,D0
  921.     AND.B    #$FD,$BFE001
  922.     OR.B    D0,$BFE001
  923.     RTS    
  924.  
  925. pt_SetGlissControl
  926.     MOVE.B    n_cmdlo(A6),D0
  927.     AND.B    #$0F,D0
  928.     AND.B    #$F0,n_glissfunk(A6)
  929.     OR.B    D0,n_glissfunk(A6)
  930.     RTS
  931.  
  932. pt_SetVibratoControl
  933.     MOVE.B    n_cmdlo(A6),D0
  934.     AND.B    #$0F,D0
  935.     AND.B    #$F0,n_wavecontrol(A6)
  936.     OR.B    D0,n_wavecontrol(A6)
  937.     RTS
  938.  
  939. pt_SetFineTune
  940.     MOVE.B    n_cmdlo(A6),D0
  941.     AND.B    #$0F,D0
  942.     MOVE.B    D0,n_finetune(A6)
  943.     RTS
  944.  
  945. pt_JumpLoop
  946.     TST.L    pt_Counter
  947.     BNE.W    pt_Return
  948.     MOVE.B    n_cmdlo(A6),D0
  949.     AND.B    #$0F,D0
  950.     BEQ.B    pt_SetLoop
  951.     TST.B    n_loopcount(A6)
  952.     BEQ.B    pt_jumpcnt
  953.     SUB.B    #1,n_loopcount(A6)
  954.     BEQ.W    pt_Return
  955. pt_jmploop
  956.     MOVE.B    n_pattpos(A6),pt_PBreakPosition
  957.     ST    pt_PBreakFlag
  958.     RTS
  959.  
  960. pt_jumpcnt
  961.     MOVE.B    D0,n_loopcount(A6)
  962.     BRA.B    pt_jmploop
  963.  
  964. pt_SetLoop
  965.     MOVE.L    pt_PatternPosition,D0
  966.     LSR.L    #4,D0
  967.     AND.B    #63,D0
  968.     MOVE.B    D0,n_pattpos(A6)
  969.     RTS
  970.  
  971. pt_SetTremoloControl
  972.     MOVE.B    n_cmdlo(A6),D0
  973.     AND.B    #$0F,D0
  974.     LSL.B    #4,D0
  975.     AND.B    #$0F,n_wavecontrol(A6)
  976.     OR.B    D0,n_wavecontrol(A6)
  977.     RTS
  978.  
  979. pt_KarplusStrong
  980.     MOVEM.L    D1-D2/A0-A1,-(SP)
  981.     MOVE.L    n_loopstart(A6),A0
  982.     MOVE.L    A0,A1
  983.     MOVE.W    n_replen(A6),D0
  984.     ADD.W    D0,D0
  985.     SUBQ.W    #2,D0
  986. pt_karplop
  987.     MOVE.B    (A0),D1
  988.     EXT.W    D1
  989.     MOVE.B    1(A0),D2
  990.     EXT.W    D2
  991.     ADD.W    D1,D2
  992.     ASR.W    #1,D2
  993.     MOVE.B    D2,(A0)+
  994.     DBRA    D0,pt_karplop
  995.     MOVE.B    (A0),D1
  996.     EXT.W    D1
  997.     MOVE.B    (A1),D2
  998.     EXT.W    D2
  999.     ADD.W    D1,D2
  1000.     ASR.W    #1,D2
  1001.     MOVE.B    D2,(A0)
  1002.     MOVEM.L    (SP)+,D1-D2/A0-A1
  1003.     RTS
  1004.  
  1005. pt_RetrigNote
  1006.     MOVE.L    D1,-(SP)
  1007.     MOVEQ    #0,D0
  1008.     MOVE.B    n_cmdlo(A6),D0
  1009.     AND.B    #$0F,D0
  1010.     BEQ.W    pt_rtnend
  1011.     MOVE.L    pt_Counter,D1
  1012.     BNE.B    pt_rtnskp
  1013.     MOVE.W    n_note(A6),D1
  1014.     AND.W    #$0FFF,D1
  1015.     BNE.W    pt_rtnend
  1016.     MOVE.L    pt_Counter,D1
  1017. pt_rtnskp
  1018.     DIVU    D0,D1
  1019.     SWAP    D1
  1020.     TST.W    D1
  1021.     BNE.W    pt_rtnend
  1022. pt_DoRetrg
  1023.     MOVE.W    n_dmabit(A6),$DFF096    ;Audio DMA off
  1024.     MOVE.L    n_start(A6),(A5)    ;Set sampledata pointer
  1025.     MOVE.W    n_length(A6),4(A5)    ;Set length
  1026.     MOVE.W    n_period(A6),6(A5)
  1027.     MOVEQ    #0,D0
  1028.     MOVE.B    n_volume(A6),D0
  1029.  
  1030.     move.b    pt_timeout,$bfe701    ;TimerB HI
  1031.     move.b    pt_timeout+1,$bfe601    ;TimerB LO
  1032.     move.b    #%000011001,$bfef01    ;set commandbits: OneShot & CLK & Start
  1033. pt_timerwait3
  1034.     btst    #0,$bfef01        ;timeout on timerB? (ICR TimerB)
  1035.     bne.s    pt_timerwait3        ;nope...
  1036.  
  1037.     MOVE.W    n_dmabit(A6),D0
  1038.     BSET    #15,D0
  1039.     MOVE.W    D0,$DFF096
  1040.  
  1041.     move.b    pt_timeout,$bfe701    ;TimerB HI
  1042.     move.b    pt_timeout+1,$bfe601    ;TimerB LO
  1043.     move.b    #%000011001,$bfef01    ;set commandbits: OneShot & CLK & Start
  1044. pt_timerwait4
  1045.     btst    #0,$bfef01        ;timeout on timerB? (ICR TimerB)
  1046.     bne.s    pt_timerwait4        ;nope...
  1047.  
  1048.     MOVE.L    n_loopstart(A6),(A5)
  1049.     MOVE.L    n_replen(A6),4(A5)
  1050. pt_rtnend
  1051.     MOVE.L    (SP)+,D1
  1052.     RTS
  1053.  
  1054. pt_VolumeFineUp
  1055.     TST.L    pt_Counter
  1056.     BNE.W    pt_Return
  1057.     MOVEQ    #0,D0
  1058.     MOVE.B    n_cmdlo(A6),D0
  1059.     AND.B    #$F,D0
  1060.     BRA.W    pt_VolSlideUp
  1061.  
  1062. pt_VolumeFineDown
  1063.     TST.L    pt_Counter
  1064.     BNE.W    pt_Return
  1065.     MOVEQ    #0,D0
  1066.     MOVE.B    n_cmdlo(A6),D0
  1067.     AND.B    #$0F,D0
  1068.     BRA.W    pt_VolSlideDown2
  1069.  
  1070. pt_NoteCut
  1071.     MOVEQ    #0,D0
  1072.     MOVE.B    n_cmdlo(A6),D0
  1073.     AND.B    #$0F,D0
  1074.     CMP.L    pt_Counter,D0
  1075.     BNE.W    pt_Return
  1076.     CLR.B    n_volume(A6)
  1077.     RTS
  1078.  
  1079. pt_NoteDelay
  1080.     MOVEQ    #0,D0
  1081.     MOVE.B    n_cmdlo(A6),D0
  1082.     AND.B    #$0F,D0
  1083.     CMP.L    pt_Counter,D0
  1084.     BNE.W    pt_Return
  1085.     MOVE.W    (A6),D0
  1086.     AND.W    #$0FFF,D0
  1087.     BEQ.W    pt_Return
  1088.     MOVE.L    D1,-(SP)
  1089.     BRA.W    pt_DoRetrg
  1090.  
  1091. pt_PatternDelay
  1092.     TST.L    pt_Counter
  1093.     BNE.W    pt_Return
  1094.     MOVEQ    #0,D0
  1095.     MOVE.B    n_cmdlo(A6),D0
  1096.     AND.B    #$0F,D0
  1097.     TST.B    pt_PattDelayTime2
  1098.     BNE.W    pt_Return
  1099.     ADDQ.B    #1,D0
  1100.     MOVE.B    D0,pt_PattDelayTime
  1101.     RTS
  1102.  
  1103. pt_FunkIt
  1104.     TST.L    pt_Counter
  1105.     BNE.W    pt_Return
  1106.     MOVE.B    n_cmdlo(A6),D0
  1107.     AND.B    #$0F,D0
  1108.     LSL.B    #4,D0
  1109.     AND.B    #$0F,n_glissfunk(A6)
  1110.     OR.B    D0,n_glissfunk(A6)
  1111.     TST.B    D0
  1112.     BEQ.W    pt_Return
  1113. pt_UpdateFunk
  1114.     MOVEM.L    A0/D1,-(SP)
  1115.     MOVEQ    #0,D0
  1116.     MOVE.B    n_glissfunk(A6),D0
  1117.     LSR.B    #4,D0
  1118.     BEQ.B    pt_funkend
  1119.     LEA    pt_FunkTable(PC),A0
  1120.     MOVE.B    0(a0,D0.W),D0
  1121.     ADD.B    D0,n_funkoffset(A6)
  1122.     BTST    #7,n_funkoffset(A6)
  1123.     BEQ.B    pt_funkend
  1124.     CLR.B    n_funkoffset(A6)
  1125.     MOVE.L    n_loopstart(A6),D0
  1126.     MOVEQ    #0,D1
  1127.     MOVE.W    n_replen(A6),D1
  1128.     ADD.L    D1,D0
  1129.     ADD.L    D1,D0
  1130.     MOVE.L    n_wavestart(A6),A0
  1131.     ADDQ.L    #1,A0
  1132.     CMP.L    D0,A0
  1133.     BLO.B    pt_funkok
  1134.     MOVE.L    n_loopstart(A6),A0
  1135. pt_funkok
  1136.     MOVE.L    A0,n_wavestart(A6)
  1137.     MOVEQ    #-1,D0
  1138.     SUB.B    (A0),D0
  1139.     MOVE.B    D0,(A0)
  1140. pt_funkend
  1141.     MOVEM.L    (SP)+,A0/D1
  1142.     RTS
  1143.  
  1144. pt_FunkTable
  1145.     dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1146.  
  1147. pt_VibratoTable    
  1148.     dc.b 0,24,49,74,97,120,141,161
  1149.     dc.b 180,197,212,224,235,244,250,253
  1150.     dc.b 255,253,250,244,235,224,212,197
  1151.     dc.b 180,161,141,120,97,74,49,24
  1152.  
  1153. pt_PeriodTable
  1154. ; -> Tuning 0
  1155.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1156.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1157.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113,0
  1158. ; -> Tuning 1
  1159.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1160.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1161.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113,0
  1162. ; -> Tuning 2
  1163.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1164.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1165.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112,0
  1166. ; -> Tuning 3
  1167.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1168.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1169.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111,0
  1170. ; -> Tuning 4
  1171.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1172.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1173.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110,0
  1174. ; -> Tuning 5
  1175.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1176.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1177.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109,0
  1178. ; -> Tuning 6
  1179.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1180.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1181.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109,0
  1182. ; -> Tuning 7
  1183.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1184.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1185.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108,0
  1186. ; -> Tuning -8
  1187.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1188.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1189.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120,0
  1190. ; -> Tuning -7
  1191.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1192.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1193.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119,0
  1194. ; -> Tuning -6
  1195.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1196.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1197.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118,0
  1198. ; -> Tuning -5
  1199.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1200.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1201.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118,0
  1202. ; -> Tuning -4
  1203.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1204.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1205.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117,0
  1206. ; -> Tuning -3
  1207.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1208.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1209.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116,0
  1210. ; -> Tuning -2
  1211.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1212.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1213.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115,0
  1214. ; -> Tuning -1
  1215.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1216.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1217.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114,0
  1218.  
  1219. pt_audchan1temp    dc.l    0,0,0,0,0,$00010000,0,0,0,0,0
  1220. pt_audchan2temp    dc.l    0,0,0,0,0,$00020000,0,0,0,0,0
  1221. pt_audchan3temp    dc.l    0,0,0,0,0,$00040000,0,0,0,0,0
  1222. pt_audchan4temp    dc.l    0,0,0,0,0,$00080000,0,0,0,0,0
  1223.  
  1224. pt_SampleStarts    dcb.l    31,0
  1225.  
  1226. pt_timeout    dc.w    330        ;CIA-B timeout-value
  1227. pt_Counter    dc.l    0
  1228. pt_CurrSpeed    dc.l    6
  1229. pt_PattPos    dc.w    0
  1230. pt_DMACONtemp    dc.w    0
  1231. pt_ActiveChannels
  1232.         dc.w    %00001111
  1233. pt_PatternPtr    dc.l    0
  1234. pt_PatternPosition
  1235.         dc.l    0
  1236. pt_SongPosition    dc.l    0    
  1237. pt_SongDataPtr    dc.l    0
  1238. pt_MetroSpeed    dc.b    0
  1239. pt_MetroChannel    dc.b    0
  1240. pt_Speed    dc.b    6
  1241. pt_SongPos    dc.b    0
  1242. pt_PBreakPosition
  1243.         dc.b    0
  1244. pt_PosJumpAssert
  1245.         dc.b    0
  1246. pt_PBreakFlag    dc.b    0
  1247. pt_LowMask    dc.b    0
  1248. pt_PattDelayTime
  1249.         dc.b    0
  1250. pt_PattDelayTime2
  1251.         dc.b    0
  1252.         even
  1253.  
  1254.