home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / falcon / sound / dsppaula / pro__30b.q < prev    next >
Text File  |  1994-02-16  |  31KB  |  1,361 lines

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