home *** CD-ROM | disk | FTP | other *** search
/ YPA: Your Privacy Assured / YPA.ISO / other_goodies / music / ep154b_1.dms / ep154b_1.adf / EagleplayerDeveloper / Examples / JamCracker.s < prev    next >
Text File  |  1995-01-17  |  15KB  |  732 lines

  1. *******************************************************************
  2. * Jamcracker Playroutine by M.Gemmel / Improved XGAG of Beltrayal *
  3. *    adapted for Eagleplayer / Delitracker 1.3+ by Buggs          *
  4. *                     using ASM-ONE                               *
  5. *******************************************************************
  6.  
  7.     incdir    include:
  8.     include    "misc/EaglePlayer.i"
  9.  
  10.     SECTION 0,Code
  11.  
  12.     PLAYERHEADER Tags
  13.  
  14.     dc.b '$VER: JamCracker player module V1.1 (JAN/28/93)',0
  15.  
  16. Tags
  17.     dc.l    DTP_RequestDTVersion,$ffff
  18.     dc.l    EP_PlayerVersion,4
  19.     dc.l    DTP_Volume,SetVoices
  20.     dc.l    DTP_Balance,SetVoices
  21.     dc.l    EP_Voices,SetVoices
  22.  
  23.     dc.l    DTP_PlayerVersion,3
  24.     dc.l    DTP_PlayerName,Player
  25.     dc.l    DTP_Creator,Creator
  26.     dc.l    DTP_Check2,Checkmod
  27.     dc.l    DTP_Interrupt,JC_Music
  28.  
  29.     dc.l    DTP_InitPlayer,InitPlay
  30.     dc.l    DTP_EndPlayer,EndPlay
  31.  
  32.     dc.l    DTP_InitSound,pp_init
  33.     dc.l    DTP_EndSound,pp_end
  34.  
  35.     dc.l    EP_StructInit,GetStrucAdr
  36.     dc.l    EP_StructEnd,Return
  37.  
  38.     dc.l    ep_flags,EPB_Volvoices!EPB_Packable!EPB_restart!EPB_songend!EPB_Volume!EPB_Balance!EPB_Voices!EPB_Analyzer
  39.  
  40.     dc.l    0
  41.  
  42. Player    dc.b 'JamCracker',0
  43. Creator    dc.b 'M.Gemmel & Xag of Betrayal,',10
  44.     dc.b `adapted by Buggs of DEFECT`,0
  45.  
  46. DTsave        dc.l    0
  47.  
  48. JC_VolVoice1    dc.w    1
  49. JC_VolVoice2    dc.w    1
  50. JC_VolVoice3    dc.w    1
  51. JC_VolVoice4    dc.w    1
  52.  
  53. JC_structadr    ds.b    UPS_Sizeof
  54. JC_Data        dc.l 0
  55.  
  56. ;========================================================================
  57. GetStrucAdr    lea    jc_structadr(pc),a0
  58. Return        rts
  59. ;========================================================================
  60. checkmod
  61.     moveq    #-1,d0
  62.     move.l    dtg_ChkData(a5),a0
  63.     cmp.l    #`BeEp`,(a0)
  64.     bne.s    .rts
  65.     moveq    #0,d0
  66. .rts
  67.     rts
  68. *-----------------------------------------------------------------------*
  69. *        d0 Bit 0-3 = Set Voices Bit=1 Voice on            *
  70. SetVoices:    lea    JC_StructAdr+UPS_DmaCon(pc),a0
  71.         move.w    EPG_Voices(a5),(a0)                ;Voices retten
  72.         lea    JC_VolVoice1(pc),a1
  73.         move.l    EPG_Voice1Vol(a5),(a1)
  74.         move.l    EPG_Voice3Vol(a5),4(a1)
  75.  
  76.         lea    JC_StructAdr+UPS_Voice1Vol(pc),a1
  77.         lea    $dff0a0,a0
  78.         moveq    #3,d2
  79. .SetNew        moveq    #0,d1
  80.         move.w    (a1),d1
  81.         bsr.s    JC_SetVoices
  82.         moveq    #UPS_Modulo,d0
  83.         add.l    d0,a1
  84.         addq.l    #8,a0
  85.         addq.l    #8,a0
  86.         dbf    d2,.SetNew
  87.         rts
  88.  
  89. *-----------------------------------------------------------------------*
  90. JC_SetVoices:    move.l    d1,-(a7)
  91.         and.w    #$7f,d1
  92.         cmp.l    #$dff0a0,a0            ;Left Volume
  93.         bne.s    .NoVoice1
  94.         move.w    d1,UPS_Voice1Vol+JC_Structadr
  95.         mulu.w    JC_VolVoice1(pc),d1
  96.         bra.b    .SetIt
  97. .NoVoice1:    cmp.l    #$dff0b0,a0            ;Right Volume
  98.         bne.s    .NoVoice2
  99.         move.w    d1,UPS_Voice2Vol+JC_Structadr
  100.         mulu.w    JC_VolVoice2(pc),d1
  101.         bra.b    .SetIt
  102. .NoVoice2:    cmp.l    #$dff0c0,a0            ;Right Volume
  103.         bne.s    .NoVoice3
  104.         move.w    d1,UPS_Voice3Vol+JC_Structadr
  105.         mulu.w    JC_VolVoice3(pc),d1
  106.         bra.b    .SetIt
  107. .NoVoice3:    move.w    d1,UPS_Voice4Vol+JC_Structadr
  108.         mulu.w    JC_VolVoice4(pc),d1
  109. .SetIt:        lsr.w    #6,d1
  110.         move.w    d1,8(a0)
  111. .Return:    move.l    (a7)+,d1
  112.         rts
  113. ;===========================================================================
  114. jc_zeroadr
  115.     movem.l    d0-d1/a2,-(sp)
  116.     lea    JC_Structadr(pc),a2    ;1.Kanal
  117.     cmp.l    #$dff0a0,a0
  118.     beq.s    .yes
  119.     lea    JC_Structadr+ups_modulo(pc),a2    ;2.Kanal
  120.     cmp.l    #$dff0b0,a0
  121.     beq.s    .yes
  122.     lea    JC_Structadr+ups_modulo*2(pc),a2    ;3.Kanal
  123.     cmp.l    #$dff0c0,a0
  124.     beq.s    .yes
  125.     lea    JC_Structadr+ups_modulo*3(pc),a2    ;4.Kanal
  126. .yes
  127.     clr.l    UPS_Voice1adr(a2)
  128.     clr.w    UPS_Voice1len(a2)
  129.     clr.w    UPS_Voice1Per(A2)
  130.     clr.w    UPS_Voice1vol(a2)
  131.  
  132.     movem.l    (sp)+,d0-d1/a2
  133.     rts
  134. JC_getvoice:
  135.     movem.l    d0-d1/a2,-(sp)
  136.     lea    JC_Structadr(pc),a2    ;1.Kanal
  137.     cmp.l    #$dff0a0,a0
  138.     beq.s    .yes
  139.     lea    JC_Structadr+ups_modulo(pc),a2    ;2.Kanal
  140.     cmp.l    #$dff0b0,a0
  141.     beq.s    .yes
  142.     lea    JC_Structadr+ups_modulo*2(pc),a2    ;3.Kanal
  143.     cmp.l    #$dff0c0,a0
  144.     beq.s    .yes
  145.     lea    JC_Structadr+ups_modulo*3(pc),a2    ;4.Kanal
  146. .yes
  147.     move.l    pv_insaddress(a1),UPS_Voice1adr(a2)
  148.     move.w    pv_inslen(a1),UPS_Voice1len(a2)
  149.     move.w    pv_pers(a1),UPS_Voice1Per(A2)
  150.  
  151.     movem.l    (sp)+,d0-d1/a2
  152.     rts
  153. ;=======================================================================
  154. InitPlay
  155.     moveq    #0,d0
  156.     move.l    dtg_GetListData(a5),a0
  157.     jsr    (a0)
  158.     move.l    a0,JC_Data
  159.     move.l    a5,DTsave
  160.     move.l    dtg_AudioAlloc(a5),a0
  161.     jmp    (a0)
  162. ;=======================================================================
  163. EndPlay
  164.     move.l    dtg_AudioFree(a5),a0        ; Function
  165.     jmp    (a0)
  166.  
  167.                   ****************************************
  168.                   *** JamCrackerPro V1.0a play-routine ***
  169.                   ***   Originally coded by M. Gemmel  ***
  170.                   ***           Code optimised         ***
  171.                   ***         by Xag of Betrayal       ***
  172.                   ***    See docs for important info   ***
  173.                   ****************************************
  174.  
  175.     *** Relative offset definitions ***
  176.  
  177.         RSRESET        ;Instrument info structure
  178. it_name        RS.B    31
  179. it_flags    RS.B    1
  180. it_size        RS.L    1
  181. it_address    RS.L    1
  182. it_sizeof    RS.W    0
  183.  
  184.         RSRESET        ;Pattern info structure
  185. pt_size        RS.W    1
  186. pt_address    RS.L    1
  187. pt_sizeof    RS.W    0
  188.  
  189.         RSRESET        ;Note info structure
  190. nt_period    RS.B    1
  191. nt_instr    RS.B    1
  192. nt_speed    RS.B    1
  193. nt_arpeggio    RS.B    1
  194. nt_vibrato    RS.B    1
  195. nt_phase    RS.B    1
  196. nt_volume    RS.B    1
  197. nt_porta    RS.B    1
  198. nt_sizeof    RS.W    0
  199.  
  200.         RSRESET        ;Voice info structure
  201. pv_waveoffset    RS.W    1
  202. pv_dmacon    RS.W    1
  203. pv_custbase    RS.L    1
  204. pv_inslen    RS.W    1
  205. pv_insaddress    RS.L    1
  206. pv_peraddress    RS.L    1
  207. pv_pers        RS.W    3
  208. pv_por        RS.W    1
  209. pv_deltapor    RS.W    1
  210. pv_porlevel    RS.W    1
  211. pv_vib        RS.W    1
  212. pv_deltavib    RS.W    1
  213. pv_vol        RS.W    1
  214. pv_deltavol    RS.W    1
  215. pv_vollevel    RS.W    1
  216. pv_phase    RS.W    1
  217. pv_deltaphase    RS.W    1
  218. pv_vibcnt    RS.B    1
  219. pv_vibmax    RS.B    1
  220. pv_flags    RS.B    2
  221. pv_sizeof    RS.W    0
  222.  
  223.  
  224.     *** Initialise routine ***
  225.  
  226. pp_init:move.l    JC_Data,a0
  227.     addq.w    #4,a0
  228.     move.w    (a0)+,d0
  229.     move.w    d0,d1
  230.     move.l    a0,instable
  231.     mulu    #it_sizeof,d0
  232.     add.w    d0,a0
  233.  
  234.     move.w    (a0)+,d0
  235.     move.w    d0,d2
  236.     move.l    a0,patttable
  237.     mulu    #pt_sizeof,d0
  238.     add.w    d0,a0
  239.  
  240.     move.w    (a0)+,d0
  241.     move.w    d0,songlen
  242.     move.l    a0,songtable
  243.     add.w    d0,d0
  244.     add.w    d0,a0
  245.  
  246.     move.l    patttable(PC),a1
  247.     move.w    d2,d0
  248.     subq.w    #1,d0
  249. .l0:    move.l    a0,pt_address(a1)
  250.     move.w    (a1),d3        ;pt_size
  251.     mulu    #nt_sizeof*4,d3
  252.     add.w    d3,a0
  253.     addq.w    #pt_sizeof,a1
  254.     dbra    d0,.l0
  255.  
  256.     move.l    instable(PC),a1
  257.     move.w    d1,d0
  258.     subq.w    #1,d0
  259. .l1:    move.l    a0,it_address(a1)
  260.     move.l    it_size(a1),d2
  261.     add.l    d2,a0
  262.     add.w    #it_sizeof,a1
  263.     dbra    d0,.l1
  264.  
  265.     move.l    songtable(PC),pp_songptr
  266.     move.w    songlen(PC),pp_songcnt
  267.     move.l    pp_songptr(PC),a0
  268.     move.w    (a0),d0
  269.     mulu    #pt_sizeof,d0
  270.     add.l    patttable(PC),d0
  271.     move.l    d0,a0
  272.     move.l    a0,pp_pattentry
  273.     move.b    pt_size+1(a0),pp_notecnt
  274.     move.l    pt_address(a0),pp_address
  275.     move.b    #6,pp_wait
  276.     move.b    #1,pp_waitcnt
  277.     clr.l    pp_nullwave
  278.     move.w    #$000F,$DFF096
  279.  
  280.     lea    pp_variables(PC),a0
  281.     lea    $DFF0A0,a1
  282.     moveq    #1,d1
  283.     move.w    #$80,d2
  284.     moveq    #4-1,d0
  285. .l2:    move.w    #0,8(a1)
  286.     move.w    d2,(a0)        ;pv_waveoffset
  287.     move.w    d1,pv_dmacon(a0)
  288.     move.l    a1,pv_custbase(a0)
  289.     move.l    #pp_periods,pv_peraddress(a0)
  290.     move.w    #1019,pv_pers(a0)
  291.     clr.w    pv_pers+2(a0)
  292.     clr.w    pv_pers+4(a0)
  293.     clr.l    pv_por(a0)
  294.     clr.w    pv_porlevel(a0)
  295.     clr.l    pv_vib(a0)
  296.     clr.l    pv_vol(a0)
  297.     move.w    #$40,pv_vollevel(a0)
  298.     clr.l    pv_phase(a0)
  299.     clr.w    pv_vibcnt(a0)
  300.     clr.b    pv_flags(a0)
  301.     add.w    #pv_sizeof,a0
  302.     add.w    #$10,a1
  303.     add.w    d1,d1
  304.     add.w    #$40,d2
  305.     dbra    d0,.l2
  306.     rts
  307.  
  308.     *** Clean-up routine ***
  309.  
  310. pp_end:    moveq    #0,d0
  311.     lea    $DFF000,a0
  312.     move.w    d0,$A8(a0)
  313.     move.w    d0,$B8(a0)
  314.     move.w    d0,$C8(a0)
  315.     move.w    d0,$D8(a0)
  316.     move.w    #$000F,$96(a0)
  317.     rts
  318.  
  319. JC_Music
  320.     movem.l    d1-a6,-(sp)
  321.  
  322.     lea    JC_StructAdr(pc),a1
  323.     move.w    #1,UPS_Enabled(a1)
  324.  
  325.     move.w    #UPSB_Adr!UPSB_LEN!UPSB_Per!UPSB_Vol!UPSB_DMACON,d0
  326.     move.w    d0,UPS_Flags(a1)
  327.     clr.w    UPS_Voice1Per(a1)
  328.     clr.w    UPS_Voice2Per(a1)
  329.     clr.w    UPS_Voice3Per(a1)
  330.     clr.w    UPS_Voice4Per(a1)
  331.  
  332.     bsr.s    pp_play
  333.  
  334.     lea    JC_StructAdr(pc),a1
  335.     clr.w    UPS_Enabled(a1)
  336.  
  337.     movem.l    (sp)+,d1-a6
  338.     moveq    #0,d0
  339.     rts
  340.  
  341. pp_play:lea    $DFF000,a6
  342.     subq.b    #1,pp_waitcnt
  343.     bne.s    .l0
  344.  
  345.     bsr    pp_nwnt
  346.     move.b    pp_wait(PC),pp_waitcnt
  347.  
  348. .l0:    lea    pp_variables+0*pv_sizeof(PC),a1
  349.     bsr.s    pp_uvs
  350.     lea    pp_variables+1*pv_sizeof(PC),a1
  351.     bsr.s    pp_uvs
  352.     lea    pp_variables+2*pv_sizeof(PC),a1
  353.     bsr.s    pp_uvs
  354.     lea    pp_variables+3*pv_sizeof(PC),a1
  355. pp_uvs:
  356.     move.l    pv_custbase(a1),a0
  357.  
  358. .l0:    move.w    pv_pers(a1),d0
  359.     bne.s    .l1
  360.     bsr    pp_rot
  361.     bra.s    .l0
  362. .l1:    add.w    pv_por(a1),d0
  363.     tst.w    pv_por(a1)
  364.     beq.s    .l1c
  365.     bpl.s    .l1a
  366.     cmp.w    pv_porlevel(a1),d0
  367.     bge.s    .l1c
  368.     bra.s    .l1b
  369. .l1a:    cmp.w    pv_porlevel(a1),d0
  370.     ble.s    .l1c
  371. .l1b:    move.w    pv_porlevel(a1),d0
  372.  
  373. .l1c:    add.w    pv_vib(a1),d0
  374.     cmp.w    #135,d0
  375.     bge.s    .l1d
  376.     move.w    #135,d0
  377.     bra.s    .l1e
  378. .l1d:    cmp.w    #1019,d0
  379.     ble.s    .l1e
  380.     move.w    #1019,d0
  381. .l1e:    move.w    d0,6(a0)
  382.     bsr    pp_rot
  383.  
  384.     move.w    pv_deltapor(a1),d0
  385.     add.w    d0,pv_por(a1)
  386.     cmp.w    #-1019,pv_por(a1)
  387.     bge.s    .l3
  388.     move.w    #-1019,pv_por(a1)
  389.     bra.s    .l5
  390. .l3:    cmp.w    #1019,pv_por(a1)
  391.     ble.s    .l5
  392.     move.w    #1019,pv_por(a1)
  393.  
  394. .l5:    tst.b    pv_vibcnt(a1)
  395.     beq.s    .l7
  396.     move.w    pv_deltavib(a1),d0
  397.     add.w    d0,pv_vib(a1)
  398.     subq.b    #1,pv_vibcnt(a1)
  399.     bne.s    .l7
  400.     neg.w    pv_deltavib(a1)
  401.     move.b    pv_vibmax(a1),pv_vibcnt(a1)
  402.  
  403. .l7:    move.w    pv_dmacon(a1),d0
  404.  
  405.     move.w    pv_vol(a1),d1
  406.     bsr    JC_Setvoices
  407.  
  408.     move.w    pv_deltavol(a1),d0
  409.     add.w    d0,pv_vol(a1)
  410.     tst.w    pv_vol(a1)
  411.     bpl.s    .l8
  412.     clr.w    pv_vol(a1)
  413.     bra.s    .la
  414. .l8:    cmp.w    #$40,pv_vol(a1)
  415.     ble.s    .la
  416.     move.w    #$40,pv_vol(a1)
  417.  
  418. .la:    btst    #1,pv_flags(a1)
  419.     beq.s    .l10
  420.     tst.w    pv_deltaphase(a1)
  421.     beq.s    .l10
  422.     bpl.s    .sk
  423.     clr.w    pv_deltaphase(a1)
  424. .sk:    move.l    pv_insaddress(a1),a0
  425.     move.w    (a1),d0        ;pv_waveoffset
  426.     neg.w    d0
  427.     lea    (a0,d0.w),a2
  428.     move.l    a2,a3
  429.     move.w    pv_phase(a1),d0
  430.     lsr.w    #2,d0
  431.     add.w    d0,a3
  432.  
  433.     moveq    #$40-1,d0
  434. .lb:    move.b    (a2)+,d1
  435.     ext.w    d1
  436.     move.b    (a3)+,d2
  437.     ext.w    d2
  438.     add.w    d1,d2
  439.     asr.w    #1,d2
  440.     move.b    d2,(a0)+
  441.     dbra    d0,.lb
  442.  
  443.     move.w    pv_deltaphase(a1),d0
  444.     add.w    d0,pv_phase(a1)
  445.     cmp.w    #$100,pv_phase(a1)
  446.     blt.s    .l10
  447.     sub.w    #$100,pv_phase(a1)
  448.  
  449. .l10:    rts
  450.  
  451. pp_rot:    move.w    pv_pers(a1),d0
  452.     move.w    pv_pers+2(a1),pv_pers(a1)
  453.     move.w    pv_pers+4(a1),pv_pers+2(a1)
  454.     move.w    d0,pv_pers+4(a1)
  455.     rts
  456.  
  457. pp_nwnt:move.l    pp_address(PC),a0
  458.     add.l    #4*nt_sizeof,pp_address
  459.     subq.b    #1,pp_notecnt
  460.     bne.s    .l5
  461.  
  462. .l0:    addq.l    #2,pp_songptr
  463.     subq.w    #1,pp_songcnt
  464.     bne.s    .l1
  465.  
  466.     move.l    dtsave(pc),a5        ;;Send Songend to Playerprogram
  467.     move.l    dtg_SongEnd(a5),a1
  468.     jsr    (a1)
  469.  
  470.     move.l    songtable(PC),pp_songptr
  471.     move.w    songlen(PC),pp_songcnt
  472. .l1:    move.l    pp_songptr(PC),a1
  473.     move.w    (a1),d0
  474.     mulu    #pt_sizeof,d0
  475.     add.l    patttable(PC),d0
  476.     move.l    d0,a1
  477.     move.b    pt_size+1(a1),pp_notecnt
  478.     move.l    pt_address(a1),pp_address
  479.  
  480. .l5:    clr.w    pp_tmpdmacon
  481.     lea    pp_variables(PC),a1
  482.     bsr    pp_nnt
  483.     addq.w    #nt_sizeof,a0
  484.     lea    pp_variables+pv_sizeof(PC),a1
  485.     bsr    pp_nnt
  486.     addq.w    #nt_sizeof,a0
  487.     lea    pp_variables+2*pv_sizeof(PC),a1
  488.     bsr    pp_nnt
  489.     addq.w    #nt_sizeof,a0
  490.     lea    pp_variables+3*pv_sizeof(PC),a1
  491.     bsr    pp_nnt
  492.  
  493.     move.w    pp_tmpdmacon(PC),$96(a6)
  494.  
  495.     bsr    Dmawait
  496.  
  497.     lea    pp_variables(PC),a1
  498.     bsr.s    pp_scr
  499.     lea    pp_variables+pv_sizeof(PC),a1
  500.     bsr.s    pp_scr
  501.     lea    pp_variables+2*pv_sizeof(PC),a1
  502.     bsr.s    pp_scr
  503.     lea    pp_variables+3*pv_sizeof(PC),a1
  504.     bsr.s    pp_scr
  505.  
  506.     bset    #7,pp_tmpdmacon
  507.     move.w    pp_tmpdmacon(PC),$96(a6)
  508.  
  509.     bsr    dmawait
  510.  
  511.     move.l    pp_variables+pv_insaddress(PC),$A0(a6)
  512.     move.w    pp_variables+pv_inslen(PC),$A4(a6)
  513.     move.l    pp_variables+pv_sizeof+pv_insaddress(PC),$B0(a6)
  514.     move.w    pp_variables+pv_sizeof+pv_inslen(PC),$B4(a6)
  515.     move.l    pp_variables+2*pv_sizeof+pv_insaddress(PC),$C0(a6)
  516.     move.w    pp_variables+2*pv_sizeof+pv_inslen(PC),$C4(a6)
  517.     move.l    pp_variables+3*pv_sizeof+pv_insaddress(PC),$D0(a6)
  518.     move.w    pp_variables+3*pv_sizeof+pv_inslen(PC),$D4(a6)
  519.  
  520. pp_rts    rts
  521.  
  522. pp_scr:    move.w    pp_tmpdmacon(PC),d0
  523.     and.w    pv_dmacon(a1),d0
  524.     beq.s    pp_rts
  525.  
  526.     move.l    pv_custbase(a1),a0
  527.  
  528.     move.l    pv_insaddress(a1),(a0)
  529.     move.w    pv_inslen(a1),4(a0)
  530.     move.w    pv_pers(a1),6(a0)
  531.  
  532.     bsr    jc_getvoice
  533.  
  534.     btst    #0,pv_flags(a1)
  535.     bne.s    pp_rts
  536.     move.l    #pp_nullwave,pv_insaddress(a1)
  537.     move.w    #1,pv_inslen(a1)
  538.     bra    jc_zeroadr
  539. pp_nnt:    move.b    (a0),d1        ;nt_period
  540.     beq    .l5
  541.  
  542.     and.l    #$000000FF,d1
  543.     add.w    d1,d1
  544.     add.l    #pp_periods-2,d1
  545.     move.l    d1,a2
  546.  
  547.     btst    #6,nt_speed(a0)
  548.     beq.s    .l2
  549.     move.w    (a2),pv_porlevel(a1)
  550.     bra.s    .l5
  551.  
  552. .l2:    move.w    pv_dmacon(a1),d0
  553.     or.w    d0,pp_tmpdmacon
  554.  
  555.     move.l    a2,pv_peraddress(a1)
  556.     move.w    (a2),pv_pers(a1)
  557.     move.w    (a2),pv_pers+2(a1)
  558.     move.w    (a2),pv_pers+4(a1)
  559.  
  560.     clr.w    pv_por(a1)
  561.  
  562.     move.b    nt_instr(a0),d0
  563.     ext.w    d0
  564.     mulu    #it_sizeof,d0
  565.     add.l    instable(PC),d0
  566.     move.l    d0,a2
  567.     tst.l    it_address(a2)
  568.     bne.s    .l1
  569.     move.l    #pp_nullwave,pv_insaddress(a1)
  570.     move.w    #1,pv_inslen(a1)
  571.     clr.b    pv_flags(a1)
  572.     bra.s    .l5
  573.  
  574. .l1:    move.l    it_address(a2),a3
  575.     btst    #1,it_flags(a2)
  576.     bne.s    .l0a
  577.     move.l    it_size(a2),d0
  578.     lsr.l    #1,d0
  579.     move.w    d0,pv_inslen(a1)
  580.     bra.s    .l0
  581. .l0a:    move.w    (a1),d0        ;pv_waveoffset
  582.     add.w    d0,a3
  583.     move.w    #$20,pv_inslen(a1)
  584. .l0:    move.l    a3,pv_insaddress(a1)
  585.     move.b    it_flags(a2),pv_flags(a1)
  586.     move.w    pv_vollevel(a1),pv_vol(a1)
  587.  
  588. .l5:    move.b    nt_speed(a0),d0
  589.     and.b    #$0F,d0
  590.     beq.s    .l6
  591.     move.b    d0,pp_wait
  592.  
  593. .l6:    move.l    pv_peraddress(a1),a2
  594.     move.b    nt_arpeggio(a0),d0
  595.     beq.s    .l9
  596.     cmp.b    #$FF,d0
  597.     bne.s    .l7
  598.     move.w    (a2),pv_pers(a1)
  599.     move.w    (a2),pv_pers+2(a1)
  600.     move.w    (a2),pv_pers+4(a1)
  601.     bra.s    .l9
  602.  
  603. .l7:    and.b    #$0F,d0
  604.     add.b    d0,d0
  605.     ext.w    d0
  606.     move.w    (a2,d0.w),pv_pers+4(a1)
  607.     move.b    nt_arpeggio(a0),d0
  608.     lsr.b    #4,d0
  609.     add.b    d0,d0
  610.     ext.w    d0
  611.     move.w    (a2,d0.w),pv_pers+2(a1)
  612.     move.w    (a2),pv_pers(a1)
  613.  
  614. .l9:    move.b    nt_vibrato(a0),d0
  615.     beq.s    .ld
  616.     cmp.b    #$FF,d0
  617.     bne.s    .la
  618.     clr.l    pv_vib(a1)
  619.     clr.b    pv_vibcnt(a1)
  620.     bra.s    .ld
  621. .la:    clr.w    pv_vib(a1)
  622.     and.b    #$0F,d0
  623.     ext.w    d0
  624.     move.w    d0,pv_deltavib(a1)
  625.     move.b    nt_vibrato(a0),d0
  626.     lsr.b    #4,d0
  627.     move.b    d0,pv_vibmax(a1)
  628.     lsr.b    #1,d0
  629.     move.b    d0,pv_vibcnt(a1)
  630.  
  631. .ld:    move.b    nt_phase(a0),d0
  632.     beq.s    .l10
  633.     cmp.b    #$FF,d0
  634.     bne.s    .le
  635.     clr.w    pv_phase(a1)
  636.     move.w    #$FFFF,pv_deltaphase(a1)
  637.     bra.s    .l10
  638. .le:    and.b    #$0F,d0
  639.     ext.w    d0
  640.     move.w    d0,pv_deltaphase(a1)
  641.     clr.w    pv_phase(a1)
  642. .l10:    move.b    nt_volume(a0),d0
  643.     bne.s    .l10a
  644.     btst    #7,nt_speed(a0)
  645.     beq.s    .l16
  646.     bra.s    .l11a
  647. .l10a:    cmp.b    #$FF,d0
  648.     bne.s    .l11
  649.     clr.w    pv_deltavol(a1)
  650.     bra.s    .l16
  651. .l11:    btst    #7,nt_speed(a0)
  652.     beq.s    .l12
  653. .l11a:    move.b    d0,pv_vol+1(a1)
  654.     move.b    d0,pv_vollevel+1(a1)
  655.     clr.w    pv_deltavol(a1)
  656.     bra.s    .l16
  657. .l12:    bclr    #7,d0
  658.     beq.s    .l13
  659.     neg.b    d0
  660. .l13:    ext.w    d0
  661.     move.w    d0,pv_deltavol(a1)
  662.  
  663. .l16:    move.b    nt_porta(a0),d0
  664.     beq.s    .l1a
  665.     cmp.b    #$FF,d0
  666.     bne.s    .l17
  667.     clr.l    pv_por(a1)
  668.     bra.s    .l1a
  669. .l17:    clr.w    pv_por(a1)
  670.     btst    #6,nt_speed(a0)
  671.     beq.s    .l17a
  672.     move.w    pv_porlevel(a1),d1
  673.     cmp.w    pv_pers(a1),d1
  674.     bgt.s    .l17c
  675.     neg.b    d0
  676.     bra.s    .l17c
  677.  
  678. .l17a:    bclr    #7,d0
  679.     bne.s    .l18
  680.     neg.b    d0
  681.     move.w    #135,pv_porlevel(a1)
  682.     bra.s    .l17c
  683.  
  684. .l18:    move.w    #1019,pv_porlevel(a1)
  685. .l17c:    ext.w    d0
  686. .l18a:    move.w    d0,pv_deltapor(a1)
  687.  
  688. .l1a:    rts
  689.  
  690. Dmawait
  691.     movem.l    d0/d1,-(sp)
  692.     moveq    #7,d1
  693. .wait    move.b    $dff006,d0
  694. .wait2    cmp.b    $dff006,d0
  695.     beq.s    .wait2
  696.     dbf    d1,.wait
  697.     movem.l    (sp)+,d0/d1
  698.     rts
  699.  
  700.     *** Data section ***
  701.  
  702. pp_periods:    DC.W    1019,962,908,857,809,763,720,680,642,606,572,540
  703.         DC.W    509,481,454,428,404,381,360,340,321,303,286,270
  704.         DC.W    254,240,227,214,202,190,180,170,160,151,143,135
  705.         DC.W    135,135,135,135,135,135,135,135,135
  706.         DC.W    135,135,135,135,135,135
  707.  
  708. songlen:    DS.W    1
  709. songtable:    DS.L    1
  710. instable:    DS.L    1
  711. patttable:    DS.L    1
  712.  
  713. pp_wait:    DS.B    1
  714. pp_waitcnt:    DS.B    1
  715. pp_notecnt:    DS.B    1
  716.     even
  717. pp_address:    DS.L    1
  718. pp_songptr:    DS.L    1
  719. pp_songcnt:    DS.W    1
  720. pp_pattentry:    DS.L    1
  721. pp_tmpdmacon:    DS.W    1
  722.  
  723. pp_variables:    DS.B    4*pv_sizeof
  724.  
  725.         SECTION    1,DATA_C
  726.  
  727.     *** Chip section ***
  728.  
  729. pp_nullwave:    DS.L    1
  730.  
  731.  
  732.