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