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

  1. *************************************************************************
  2. ** Future Composer Version 1.0-1.3 Player for Eagleplayer/Delitracker  **
  3. ** adapted 1993 by Buggs of DEFECT (using ASM-ONE)                     **
  4. *************************************************************************
  5.     ;
  6.     incdir    Include:
  7.     include    "misc/EaglePlayer.i"
  8.  
  9.     section    0,code
  10.  
  11.     PLAYERHEADER PlayerTags
  12.  
  13.     dc.b '$VER: FutureComposer 1.0-1.3 Eagleplayer V1.3 (jan/26/93)',0
  14.     even
  15.  
  16. PlayerTags
  17. Tags:    
  18.     dc.l    DTP_RequestDTVersion,$ffff
  19.     dc.l    EP_PlayerVersion,4
  20.     dc.l    DTP_Volume,SetVoices
  21.     dc.l    DTP_Balance,SetVoices
  22.     dc.l    EP_Voices,SetVoices
  23.     dc.l    EP_Flags,EPB_Packable!EPB_VolVoices!EPB_Save!EPB_Restart!EPB_Songend!EPB_Volume!EPB_Balance!EPB_Voices!EPB_Analyzer
  24.     dc.l    DTP_PlayerVersion,4
  25.     dc.l    DTP_PlayerName,FC_Name
  26.     dc.l    DTP_Creator,FC_SUPERIONS
  27.     dc.l    DTP_Check2,TESTMOD
  28.     dc.l    DTP_Interrupt,FC_Music
  29.     dc.l    DTP_InitPlayer,GetAudio
  30.     dc.l    DTP_EndPlayer,Freeaudio
  31.     dc.l    DTP_InitSound,init_music
  32.     dc.l    DTP_EndSound,FC_END
  33.  
  34.     dc.l    EP_StructInit,StrukInit
  35.     dc.l    EP_StructEnd,StrukEnd
  36.     dc.l    0
  37.  
  38. FC_Name    dc.b    'FutureComposer 1.3',0
  39. FC_SUPERIONS
  40.     dc.b    `SuperSero of Superions,`,$0a
  41.     dc.b    'adapted by Buggs of DEFECT',0
  42.     even
  43. FC_MODULE    dc.l    0
  44. DTBase        dc.l    0
  45. FC_Structadr:    ds.l    UPS_Sizeof
  46. FC_VolVoice1    dc.w    1
  47. FC_VolVoice2    dc.w    1
  48. FC_VolVoice3    dc.w    1
  49. FC_VolVoice4    dc.w    1
  50. ;============ Testet,ob es sich um FC1.3 handelt =====================
  51. TESTMOD
  52.     moveq    #-1,d0
  53.     move.l    dtg_ChkData(a5),a0
  54.     cmp.l    #`SMOD`,(a0)
  55.     bne.s    .no
  56.     moveq    #0,d0
  57. .no    rts
  58. ;=========== Struktur ⁿbergeben und Sampleadressen l÷schen ==============
  59. Strukinit:
  60.     lea    FC_StructAdr(pc),a0
  61. StrukEnd:
  62.     rts
  63. *-----------------------------------------------------------------------*
  64. *        d0 Bit 0-3 = Set Voices Bit=1 Voice on            *
  65. SetVoices:    lea    FC_StructAdr+UPS_DmaCon(pc),a0
  66.         move.w    EPG_Voices(a5),(a0)                ;Voices retten
  67.         lea    FC_VolVoice1(pc),a1
  68.         move.l    EPG_Voice1Vol(a5),(a1)
  69.         move.l    EPG_Voice3Vol(a5),4(a1)
  70.  
  71.         lea    FC_StructAdr+UPS_Voice1Vol(pc),a0
  72.         lea    $dff0a0,a5
  73.         moveq    #3,d1
  74. .SetNew        moveq    #0,d0
  75.         move.w    (a0),d0
  76.         bsr.s    FC_SetVoices
  77.         moveq    #UPS_Modulo,d0
  78.         add.l    d0,a0
  79.         addq.l    #8,a5
  80.         addq.l    #8,a5
  81.         dbf    d1,.SetNew
  82.         rts
  83.  
  84. *-----------------------------------------------------------------------*
  85. FC_SetVoices:    movem.l    a0/d0,-(a7)
  86.         and.w    #$7f,d0
  87.         lea    FC_StructAdr(pc),a0
  88.         cmp.l    #$dff0a0,a5            ;Left Volume
  89.         bne.s    .NoVoice1
  90.         move.w    d0,UPS_Voice1Vol(a0)
  91.         mulu.w    FC_VolVoice1(pc),d0
  92.         bra.b    .SetIt
  93. .NoVoice1:    cmp.l    #$dff0b0,a5            ;Right Volume
  94.         bne.s    .NoVoice2
  95.         move.w    d0,UPS_Voice2Vol(a0)
  96.         mulu.w    FC_VolVoice2(pc),d0
  97.         bra.b    .SetIt
  98. .NoVoice2:    cmp.l    #$dff0c0,a5            ;Right Volume
  99.         bne.s    .NoVoice3
  100.         move.w    d0,UPS_Voice3Vol(a0)
  101.         mulu.w    FC_VolVoice3(pc),d0
  102.         bra.b    .SetIt
  103. .NoVoice3:    move.w    d0,UPS_Voice4Vol(a0)
  104.         mulu.w    FC_VolVoice4(pc),d0
  105. .SetIt:        lsr.w    #6,d0
  106.         move.w    d0,8(a5)
  107. .Return:    movem.l    (a7)+,a0/d0
  108.         rts
  109. ;======================================================================
  110. FC_MUSIC
  111.     movem.l    d1-a6,-(sp)
  112.     lea    FC_StructAdr(pc),a1
  113.     moveq    #-1,d0
  114.     move.w    d0,UPS_Enabled(a1)
  115.     move.w    #UPSB_Adr!UPSB_LEN!UPSB_Per!UPSB_Vol!UPSB_DMACON,d0
  116.     move.w    d0,UPS_Flags(a1)
  117.  
  118.     clr.w    UPS_Voice1Per(a1)
  119.     clr.w    UPS_Voice2Per(a1)
  120.     clr.w    UPS_Voice3Per(a1)
  121.     clr.w    UPS_Voice4Per(a1)
  122.  
  123.     bsr    FC_Play
  124.  
  125.     lea    FC_StructAdr(pc),a1
  126.     clr.w    UPS_Enabled(a1)
  127.  
  128.     movem.l    (sp)+,d1-a6
  129.     moveq    #0,d0
  130.     rts
  131.  
  132. GetAudio
  133.     move.l    a5,dtbase
  134.  
  135.     moveq    #0,d0
  136.     move.l    dtg_GetListData(a5),a0    ;Get whole Module
  137.     jsr    (a0)
  138.     move.l    a0,FC_MODULE
  139.  
  140.     move.l    dtg_AudioAlloc(a5),a0    ;Alloc Audio Channels
  141.     jmp    (a0)
  142. FreeAudio
  143.     move.l    dtg_AudioFree(a5),a0        ; Function
  144.     jmp    (a0)
  145.  
  146. ***************************************************************
  147. **  Amiga FUTURE COMPOSER V1.0 / 1.2 / 1.3   Replay routine  **
  148. ***************************************************************
  149.  
  150. FC_END:
  151.     clr.w onoff
  152.     clr.l $dff0a6
  153.     clr.l $dff0b6
  154.     clr.l $dff0c6
  155.     clr.l $dff0d6
  156.     move.w #$000f,$dff096
  157.     rts
  158.  
  159. INIT_MUSIC:
  160.     move.w #1,onoff
  161.     move.l FC_MODULE,a0
  162.     lea 100(a0),a1
  163.     move.l a1,SEQpoint
  164.     move.l a0,a1
  165.     add.l 8(a0),a1
  166.     move.l a1,PATpoint
  167.     move.l a0,a1
  168.     add.l 16(a0),a1
  169.     move.l a1,FRQpoint
  170.     move.l a0,a1
  171.     add.l 24(a0),a1
  172.     move.l a1,VOLpoint
  173.     move.l 4(a0),d0
  174.     divu #13,d0
  175.  
  176.     lea 40(a0),a1
  177.     lea SOUNDINFO+4,a2
  178.     moveq #10-1,d1
  179. initloop:
  180.     move.w (a1)+,(a2)+
  181.     move.l (a1)+,(a2)+
  182.     addq.w #4,a2
  183.     dbf d1,initloop
  184.     moveq #0,d2
  185.     move.l a0,d1
  186.     add.l 32(a0),d1
  187.     sub.l #WAVEFORMS,d1
  188.     lea SOUNDINFO,a0
  189.     move.l d1,(a0)+
  190.     moveq #9-1,d3
  191. initloop1:
  192.     move.w (a0),d2
  193.     add.l d2,d1
  194.     add.l d2,d1
  195.     addq.w #6,a0
  196.     move.l d1,(a0)+
  197.     dbf d3,initloop1
  198.  
  199.     move.l SEQpoint(pc),a0
  200.     moveq #0,d2
  201.     move.b 12(a0),d2        ;Get replay speed
  202.     bne.s speedok
  203.     move.b #3,d2            ;Set default speed
  204. speedok:
  205.     move.w d2,respcnt        ;Init repspeed counter
  206.     move.w d2,repspd
  207. INIT2:
  208.     clr.w audtemp
  209.     clr.w spdtemp
  210.     move.w #$000f,$dff096        ;Disable audio DMA
  211.     move.w #$0780,$dff09a        ;Disable audio IRQ
  212.     moveq #0,d7
  213.     mulu #13,d0
  214.     moveq #4-1,d6            ;Number of soundchannels-1
  215.     lea V1data(pc),a0        ;Point to 1st voice data area
  216.     lea SILENT,a1
  217.     lea o4a0c8(pc),a2
  218. initloop2:
  219.     move.l a1,10(a0)
  220.     move.l a1,18(a0)
  221.     clr.l 14(a0)
  222.     clr.b 45(a0)
  223.     clr.b 47(a0)
  224.     clr.w 8(a0)
  225.     clr.l 48(a0)
  226.     move.b #$01,23(a0)
  227.     move.b #$01,24(a0)
  228.     clr.b 25(a0)
  229.     clr.l 26(a0)
  230.     clr.w 30(a0)
  231.     moveq #$00,d3
  232.     move.w (a2)+,d1
  233.     move.w (a2)+,d3
  234.     divu #$0003,d3
  235.     move.b d3,32(a0)
  236.     mulu #$0003,d3
  237.     andi.l #$00ff,d3
  238.     andi.l #$00ff,d1
  239.     addi.l #$dff0a0,d1
  240.     move.l d1,a6
  241.     move.l #$0000,(a6)
  242.     move.w #$0100,4(a6)
  243.     move.w #$0000,6(a6)
  244.     move.w #$0000,8(a6)
  245.     move.l d1,60(a0)
  246.     clr.w 64(a0)
  247.     move.l SEQpoint(pc),(a0)
  248.     move.l SEQpoint(pc),52(a0)
  249.     add.l d0,52(a0)
  250.     add.l d3,52(a0)
  251.     add.l d7,(a0)
  252.     add.l d3,(a0)
  253.     move.w #$000d,6(a0)
  254.     move.l (a0),a3
  255.     move.b (a3),d1
  256.     andi.l #$00ff,d1
  257.     lsl.w #6,d1
  258.     move.l PATpoint(pc),a4
  259.     adda.w d1,a4
  260.     move.l a4,34(a0)
  261.     clr.l 38(a0)
  262.     move.b #$01,33(a0)
  263.     move.b #$02,42(a0)
  264.     move.b 1(a3),44(a0)
  265.     move.b 2(a3),22(a0)
  266.     clr.b 43(a0)
  267.     clr.b 45(a0)
  268.     clr.w 56(a0)
  269.     adda.w #$004a,a0    ;Point to next voice's data area
  270.     dbf d6,initloop2
  271.     rts
  272.  
  273. FC_PLAY:
  274.     lea pervol(pc),a6
  275.     tst.w onoff
  276.     bne.s music_on
  277.     rts
  278. music_on:
  279.     subq.w #1,respcnt        ;Decrease replayspeed counter
  280.     bne.s nonewnote
  281.     move.w repspd(pc),respcnt    ;Restore replayspeed counter
  282.     lea V1data(pc),a0        ;Point to voice1 data area
  283.     bsr new_note
  284.     lea V2data(pc),a0        ;Point to voice2 data area
  285.     bsr new_note
  286.     lea V3data(pc),a0        ;Point to voice3 data area
  287.     bsr new_note
  288.     lea V4data(pc),a0        ;Point to voice4 data area
  289.     bsr new_note
  290. nonewnote:
  291.     clr.w audtemp
  292.     lea V1data(pc),a0
  293.     bsr effects
  294.     move.w d0,(a6)+
  295.     move.w d1,(a6)+
  296.     lea V2data(pc),a0
  297.     bsr effects
  298.     move.w d0,(a6)+
  299.     move.w d1,(a6)+
  300.     lea V3data(pc),a0
  301.     bsr effects
  302.     move.w d0,(a6)+
  303.     move.w d1,(a6)+
  304.     lea V4data(pc),a0
  305.     bsr effects
  306.     move.w d0,(a6)+
  307.     move.w d1,(a6)+
  308.     lea pervol(pc),a6
  309.     move.w audtemp(pc),d0
  310.     ori.w #$8000,d0            ;Set/clr bit = 1
  311.     move.w d0,-(a7)
  312.     moveq #0,d1
  313.     move.l start1(pc),d2        ;Get samplepointers
  314.     move.w offset1(pc),d1        ;Get offset
  315.     add.l d1,d2            ;Add offset
  316.     move.l start2(pc),d3
  317.     move.w offset2(pc),d1
  318.     add.l d1,d3
  319.     move.l start3(pc),d4
  320.     move.w offset3(pc),d1
  321.     add.l d1,d4
  322.     move.l start4(pc),d5
  323.     move.w offset4(pc),d1
  324.     add.l d1,d5
  325.     move.w ssize1(pc),d0        ;Get sound lengths
  326.     move.w ssize2(pc),d1
  327.     move.w ssize3(pc),d6
  328.     move.w ssize4(pc),d7
  329.  
  330.     bsr    waitdma
  331.     move.w (a7)+,$dff096        ;Enable audio DMA
  332.     bsr    waitdma
  333. chan1:
  334.     lea V1data(pc),a0
  335.     tst.w 72(a0)
  336.     beq.s chan2
  337.     subq.w #1,72(a0)
  338.     cmpi.w #1,72(a0)
  339.     bne.s chan2
  340.     clr.w 72(a0)
  341.     move.l    d2,$dff0a0        ;Set soundstart
  342.     move.l    d2,FC_structadr+UPS_Voice1adr
  343.     move.w d0,$dff0a4        ;Set soundlength
  344.     move.w    d0,FC_structadr+UPS_Voice1len
  345. chan2:
  346.     lea V2data(pc),a0
  347.     tst.w 72(a0)
  348.     beq.s chan3
  349.     subq.w #1,72(a0)
  350.     cmpi.w #1,72(a0)
  351.     bne.s chan3
  352.     clr.w 72(a0)
  353.     move.l d3,$dff0b0
  354.     move.w d1,$dff0b4
  355.     move.l    d3,FC_structadr+UPS_Voice2adr
  356.     move.w    d1,FC_structadr+UPS_Voice2len
  357. chan3:
  358.     lea V3data(pc),a0
  359.     tst.w 72(a0)
  360.     beq.s chan4
  361.     subq.w #1,72(a0)
  362.     cmpi.w #1,72(a0)
  363.     bne.s chan4
  364.     clr.w 72(a0)
  365.     move.l d4,$dff0c0
  366.     move.w d6,$dff0c4
  367.     move.l    d4,FC_structadr+UPS_Voice3adr
  368.     move.w    d6,FC_structadr+UPS_Voice3len
  369. chan4:
  370.     lea V4data(pc),a0
  371.     tst.w 72(a0)
  372.     beq.s setpervol
  373.     subq.w #1,72(a0)
  374.     cmpi.w #1,72(a0)
  375.     bne.s setpervol
  376.     clr.w 72(a0)
  377.     move.l d5,$dff0d0
  378.     move.w d7,$dff0d4
  379.     move.l    d5,FC_structadr+UPS_Voice4adr
  380.     move.w    d7,FC_structadr+UPS_Voice4len
  381. setpervol:
  382.     lea $dff0a6,a5
  383.     move.w    (a6)+,d0
  384.     move.w    d0,(a5)        ;Sampleperiod
  385.     move.w    d0,FC_Structadr+UPS_Voice1per
  386.  
  387.     move.w (a6)+,d0        ;Volume
  388.     move.w    d0,FC_Structadr+UPS_Voice1vol
  389.     mulu    FC_VolVoice1(pc),d0
  390.     lsr.w    #6,d0
  391.     move.w    d0,2(a5)
  392.  
  393.     move.w (a6)+,d0
  394.     move.w    d0,16(a5)    ;Sampleperiod
  395.     move.w    d0,FC_Structadr+UPS_Voice2per
  396.  
  397.     move.w    (a6)+,d0        ;Volume
  398.     move.w    d0,FC_StructAdr+UPS_Voice2Vol
  399.     mulu    FC_VolVoice2(pc),d0
  400.     lsr.w    #6,d0
  401.     move.w    d0,18(a5)
  402.  
  403.     move.w    (a6)+,d0
  404.     move.w    d0,32(a5)    ;Sampleperiod
  405.     move.w    d0,FC_Structadr+UPS_Voice3per
  406.  
  407.     move.w    (a6)+,d0        ;Volume
  408.     move.w    d0,FC_StructAdr+UPS_Voice3Vol
  409.     mulu    FC_VolVoice3,d0
  410.     lsr.w    #6,d0
  411.     move.w    d0,34(a5)
  412.  
  413.     move.w    (a6)+,d0
  414.     move.w    d0,48(a5)    ;Sampleperiod
  415.     move.w    d0,FC_Structadr+UPS_Voice4per
  416.  
  417.     move.w    (a6)+,d0        ;Volume
  418.     move.w    d0,FC_StructAdr+UPS_Voice4Vol
  419.     mulu    FC_Volvoice4,d0
  420.     asr.w    #6,d0
  421.     move.w    d0,50(a5)
  422.     rts
  423.  
  424. new_note:
  425.     moveq #0,d5
  426.     move.l 34(a0),a1
  427.     adda.w 40(a0),a1
  428.     cmp.w #64,40(a0)
  429.     bne samepat
  430.     move.l (a0),a2
  431.     adda.w 6(a0),a2        ;Point to next sequence row
  432.     cmpa.l 52(a0),a2    ;Is it the end?
  433.     bne.s notend
  434.  
  435.     move.l    dtbase(pc),a2
  436.     move.l    dtg_SongEnd(a2),a2
  437.     jsr    (a2)        ;End of Song for Playerprogram
  438.     
  439.     move.w d5,6(a0)        ;yes!
  440.     move.l (a0),a2        ;Point to first sequence
  441. notend:
  442.     moveq #1,d1
  443.     addq.b #1,spdtemp
  444.     cmpi.b #5,spdtemp
  445.     bne.s nonewspd
  446.     move.b d1,spdtemp
  447.     move.b 12(a2),d1    ;Get new replay speed
  448.     beq.s nonewspd
  449.     move.w d1,respcnt    ;store in counter
  450.     move.w d1,repspd
  451. nonewspd:
  452.     move.b (a2),d1        ;Pattern to play
  453.     move.b 1(a2),44(a0)    ;Transpose value
  454.     move.b 2(a2),22(a0)    ;Soundtranspose value
  455.  
  456.     move.w d5,40(a0)
  457.     lsl.w #6,d1
  458.     add.l PATpoint(pc),d1    ;Get pattern pointer
  459.     move.l d1,34(a0)
  460.     addi.w #$000d,6(a0)
  461.     move.l d1,a1
  462. samepat:
  463.     move.b 1(a1),d1        ;Get info byte
  464.     move.b (a1)+,d0        ;Get note
  465.     bne.s ww1
  466.     andi.w #%11000000,d1
  467.     beq.s noport
  468.     bra.s ww11
  469. ww1:
  470.     move.w d5,56(a0)
  471. ww11:
  472.     move.b d5,47(a0)
  473.     move.b (a1),31(a0)
  474.  
  475.         ;31(a0) = PORTAMENTO/INSTR. info
  476.             ;Bit 7 = portamento on
  477.             ;Bit 6 = portamento off
  478.             ;Bit 5-0 = instrument number
  479.         ;47(a0) = portamento value
  480.             ;Bit 7-5 = always zero
  481.             ;Bit 4 = up/down
  482.             ;Bit 3-0 = value
  483. t_porton:
  484.     btst #7,d1
  485.     beq.s noport
  486.     move.b 2(a1),47(a0)    
  487. noport:
  488.     andi.w #$007f,d0
  489.     beq nextnote
  490.     move.b d0,8(a0)
  491.     move.b (a1),9(a0)
  492.     move.b 32(a0),d2
  493.     moveq #0,d3
  494.     bset d2,d3
  495.     or.w d3,audtemp
  496.     move.w d3,$dff096
  497.     move.b (a1),d1
  498.     andi.w #$003f,d1    ;Max 64 instruments
  499.     add.b 22(a0),d1
  500.     move.l VOLpoint(pc),a2
  501.     lsl.w #6,d1
  502.     adda.w d1,a2
  503.     move.w d5,16(a0)
  504.     move.b (a2),23(a0)
  505.     move.b (a2)+,24(a0)
  506.     move.b (a2)+,d1
  507.     andi.w #$00ff,d1
  508.     move.b (a2)+,27(a0)
  509.     move.b #$40,46(a0)
  510.     move.b (a2)+,d0
  511.     move.b d0,28(a0)
  512.     move.b d0,29(a0)
  513.     move.b (a2)+,30(a0)
  514.     move.l a2,10(a0)
  515.     move.l FRQpoint(pc),a2
  516.     lsl.w #6,d1
  517.     adda.w d1,a2
  518.     move.l a2,18(a0)
  519.     move.w d5,50(a0)
  520.     move.b d5,26(a0)
  521.     move.b d5,25(a0)
  522. nextnote:
  523.     addq.w #2,40(a0)
  524.     rts
  525.  
  526. effects:
  527.     moveq #0,d7
  528. testsustain:
  529.     tst.b 26(a0)        ;Is sustain counter = 0
  530.     beq.s sustzero
  531.     subq.b #1,26(a0)    ;if no, decrease counter
  532.     bra VOLUfx
  533. sustzero:        ;Next part of effect sequence
  534.     move.l 18(a0),a1    ;can be executed now.
  535.     adda.w 50(a0),a1
  536. testeffects:
  537.     cmpi.b #$e1,(a1)    ;E1 = end of FREQseq sequence
  538.     beq VOLUfx
  539.     cmpi.b #$e0,(a1)    ;E0 = loop to other part of sequence
  540.     bne.s testnewsound
  541.     move.b 1(a1),d0        ;loop to start of sequence + 1(a1)
  542.     andi.w #$003f,d0
  543.     move.w d0,50(a0)
  544.     move.l 18(a0),a1
  545.     adda.w d0,a1
  546. testnewsound:
  547.     cmpi.b #$e2,(a1)    ;E2 = set waveform
  548.     bne.s o49c64
  549.     moveq #0,d0
  550.     moveq #0,d1
  551.     move.b 32(a0),d1
  552.     bset d1,d0
  553.     or.w d0,audtemp
  554.     move.w d0,$dff096
  555.     move.b 1(a1),d0
  556.     andi.w #$00ff,d0
  557.     lea SOUNDINFO,a4
  558.     add.w d0,d0
  559.     move.w d0,d1
  560.     add.w d1,d1
  561.     add.w d1,d1
  562.     add.w d1,d0
  563.     adda.w d0,a4
  564.     move.l 60(a0),a3
  565.     move.l (a4),d1
  566.     add.l #WAVEFORMS,d1
  567.     move.l d1,(a3)
  568.     move.l d1,68(a0)
  569.     move.w 4(a4),4(a3)
  570.     move.l 6(a4),64(a0)
  571.     swap d1
  572.     move.w #$0003,72(a0)
  573.     tst.w d1
  574.     bne.s o49c52
  575.     move.w #$0002,72(a0)
  576. o49c52:
  577.     clr.w 16(a0)
  578.     move.b #$01,23(a0)
  579.     addq.w #2,50(a0)
  580.     bra o49d02
  581. o49c64:
  582.     cmpi.b #$e4,(a1)
  583.     bne.s testpatjmp
  584.     move.b 1(a1),d0
  585.     andi.w #$00ff,d0
  586.     lea SOUNDINFO,a4
  587.     add.w d0,d0
  588.     move.w d0,d1
  589.     add.w d1,d1
  590.     add.w d1,d1
  591.     add.w d1,d0
  592.     adda.w d0,a4
  593.     move.l 60(a0),a3
  594.     move.l (a4),d1
  595.     add.l #WAVEFORMS,d1
  596.     move.l d1,(a3)
  597.     move.l d1,68(a0)
  598.     move.w 4(a4),4(a3)
  599.     move.l 6(a4),64(a0)
  600.  
  601.     swap d1
  602.     move.w #$0003,72(a0)
  603.     tst.w d1
  604.     bne.s o49cae
  605.     move.w #$0002,72(a0)
  606. o49cae:
  607.     addq.w #2,50(a0)
  608.     bra.s o49d02
  609. testpatjmp:
  610.     cmpi.b #$e7,(a1)
  611.     bne.s testnewsustain
  612.     move.b 1(a1),d0
  613.     andi.w #$00ff,d0
  614.     lsl.w #6,d0
  615.     move.l FRQpoint(pc),a1
  616.     adda.w d0,a1
  617.     move.l a1,18(a0)
  618.     move.w d7,50(a0)
  619.     bra testeffects
  620. testnewsustain:
  621.     cmpi.b #$e8,(a1)    ;E8 = set sustain time
  622.     bne.s o49cea
  623.     move.b 1(a1),26(a0)
  624.     addq.w #2,50(a0)
  625.     bra testsustain
  626. o49cea:
  627.     cmpi.b #$e3,(a1)
  628.     bne.s o49d02
  629.     addq.w #3,50(a0)
  630.     move.b 1(a1),27(a0)
  631.     move.b 2(a1),28(a0)
  632. o49d02:
  633.     move.l 18(a0),a1
  634.     adda.w 50(a0),a1
  635.     move.b (a1),43(a0)
  636.     addq.w #1,50(a0)
  637. VOLUfx:
  638.     tst.b 25(a0)
  639.     beq.s o49d1e
  640.     subq.b #1,25(a0)
  641.     bra.s o49d70
  642. o49d1e:
  643.     subq.b #1,23(a0)
  644.     bne.s o49d70
  645.     move.b 24(a0),23(a0)
  646. o49d2a:
  647.     move.l 10(a0),a1
  648.     adda.w 16(a0),a1
  649.     move.b (a1),d0
  650.     cmpi.b #$e8,d0
  651.     bne.s o49d4a
  652.     addq.w #2,16(a0)
  653.     move.b 1(a1),25(a0)
  654.     bra.s VOLUfx
  655. o49d4a:
  656.     cmpi.b #$e1,d0
  657.     beq.s o49d70
  658.     cmpi.b #$e0,d0
  659.     bne.s o49d68
  660.     move.b 1(a1),d0
  661.     andi.l #$003f,d0
  662.     subq.b #5,d0
  663.     move.w d0,16(a0)
  664.     bra.s o49d2a
  665. o49d68:
  666.     move.b (a1),45(a0)
  667.     addq.w #1,16(a0)
  668. o49d70:
  669.     move.b 43(a0),d0
  670.     bmi.s o49d7e
  671.     add.b 8(a0),d0
  672.     add.b 44(a0),d0
  673. o49d7e:
  674.     andi.w #$007f,d0
  675.     lea PERIODS,a1
  676.     add.w d0,d0
  677.     move.w d0,d1
  678.     adda.w d0,a1
  679.     move.w (a1),d0
  680.     move.b 46(a0),d7
  681.     tst.b 30(a0)
  682.     beq.s o49d9e
  683.     subq.b #1,30(a0)
  684.  
  685.     bra.s o49df4
  686. o49d9e:
  687.     move.b d1,d5
  688.     move.b 28(a0),d4
  689.     add.b d4,d4
  690.     move.b 29(a0),d1
  691.     tst.b d7
  692.     bpl.s o49db4
  693.     btst #0,d7
  694.     bne.s o49dda
  695. o49db4:
  696.     btst #5,d7
  697.     bne.s o49dc8
  698.     sub.b 27(a0),d1
  699.     bcc.s o49dd6
  700.     bset #5,d7
  701.     moveq #0,d1
  702.     bra.s o49dd6
  703. o49dc8:
  704.     add.b 27(a0),d1
  705.     cmp.b d4,d1
  706.     bcs.s o49dd6
  707.     bclr #5,d7
  708.     move.b d4,d1
  709. o49dd6:
  710.     move.b d1,29(a0)
  711. o49dda:
  712.     lsr.b #1,d4
  713.     sub.b d4,d1
  714.     bcc.s o49de4
  715.     subi.w #$0100,d1
  716. o49de4:
  717.     addi.b #$a0,d5
  718.     bcs.s o49df2
  719. o49dea:
  720.     add.w d1,d1
  721.     addi.b #$18,d5
  722.     bcc.s o49dea
  723. o49df2:
  724.     add.w d1,d0
  725. o49df4:
  726.     eori.b #$01,d7
  727.     move.b d7,46(a0)
  728.  
  729.     ; DO THE PORTAMENTO THING
  730.     moveq #0,d1
  731.     move.b 47(a0),d1    ;get portavalue
  732.     beq.s a56d0        ;0=no portamento
  733.     cmpi.b #$1f,d1
  734.     bls.s portaup
  735. portadown: 
  736.     andi.w #$1f,d1
  737.     neg.w d1
  738. portaup:
  739.     sub.w d1,56(a0)
  740. a56d0:
  741.     add.w 56(a0),d0
  742. o49e3e:
  743.     cmpi.w #$0070,d0
  744.     bhi.s nn1
  745.     move.w #$0071,d0
  746. nn1:
  747.     cmpi.w #$06b0,d0
  748.     bls.s nn2
  749.     move.w #$06b0,d0
  750. nn2:
  751.     moveq #0,d1
  752.     move.b 45(a0),d1
  753.     rts
  754. waitdma    move.l    a0,-(sp)
  755.     move.l    dtbase(pc),a0
  756.     move.l    DTG_waitaudiodma(a0),a0
  757.     jsr    (a0)
  758.     move.l    (sp)+,a0
  759.     rts    
  760.  
  761.  
  762.  
  763. pervol: dcb.b 16,0    ;Periods & Volumes temp. store
  764. respcnt: dc.w 0        ;Replay speed counter 
  765. repspd:  dc.w 0        ;Replay speed counter temp
  766. onoff:   dc.w 0        ;Music on/off flag.
  767. firseq:     dc.w 0        ;First sequence
  768. lasseq:     dc.w 0        ;Last sequence
  769. audtemp: dc.w 0
  770. spdtemp: dc.w 0
  771.  
  772. V1data:  dcb.b 64,0    ;Voice 1 data area
  773. offset1: dcb.b 02,0    ;Is added to start of sound
  774. ssize1:  dcb.b 02,0    ;Length of sound
  775. start1:  dcb.b 06,0    ;Start of sound
  776.  
  777. V2data:  dcb.b 64,0    ;Voice 2 data area
  778. offset2: dcb.b 02,0
  779. ssize2:  dcb.b 02,0
  780. start2:  dcb.b 06,0
  781.  
  782. V3data:  dcb.b 64,0    ;Voice 3 data area
  783. offset3: dcb.b 02,0
  784. ssize3:  dcb.b 02,0
  785. start3:  dcb.b 06,0
  786.  
  787. V4data:  dcb.b 64,0    ;Voice 4 data area
  788. offset4: dcb.b 02,0
  789. ssize4:  dcb.b 02,0
  790. start4:  dcb.b 06,0
  791.  
  792. o4a0c8: dc.l $00000000,$00100003,$00200006,$00300009
  793. SEQpoint: dc.l 0
  794. PATpoint: dc.l 0
  795. FRQpoint: dc.l 0
  796. VOLpoint: dc.l 0
  797.  
  798.     section    fcdatas,data_c
  799.  
  800.     even
  801. SILENT: dc.w $0100,$0000,$0000,$00e1
  802.  
  803. PERIODS:dc.w $06b0,$0650,$05f4,$05a0,$054c,$0500,$04b8,$0474
  804.     dc.w $0434,$03f8,$03c0,$038a,$0358,$0328,$02fa,$02d0
  805.     dc.w $02a6,$0280,$025c,$023a,$021a,$01fc,$01e0,$01c5
  806.     dc.w $01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d
  807.     dc.w $010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be,$00b4
  808.     dc.w $00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  809.     dc.w $0071,$0071,$0071,$0071,$0071,$0071,$0071,$0071
  810.     dc.w $0071,$0071,$0071,$0071,$0d60,$0ca0,$0be8,$0b40
  811.     dc.w $0a98,$0a00,$0970,$08e8,$0868,$07f0,$0780,$0714
  812.     dc.w $1ac0,$1940,$17d0,$1680,$1530,$1400,$12e0,$11d0
  813.     dc.w $10d0,$0fe0,$0f00,$0e28
  814.  
  815. SOUNDINFO:
  816. ;Offset.l , Sound-length.w , Start-offset.w , Repeat-length.w 
  817.  
  818. ;Reserved for samples
  819.     dc.w $0000,$0000,$0000,$0000,$0001 
  820.     dc.w $0000,$0000,$0000,$0000,$0001 
  821.     dc.w $0000,$0000,$0000,$0000,$0001 
  822.     dc.w $0000,$0000,$0000,$0000,$0001 
  823.     dc.w $0000,$0000,$0000,$0000,$0001 
  824.     dc.w $0000,$0000,$0000,$0000,$0001 
  825.     dc.w $0000,$0000,$0000,$0000,$0001 
  826.     dc.w $0000,$0000,$0000,$0000,$0001 
  827.     dc.w $0000,$0000,$0000,$0000,$0001 
  828.     dc.w $0000,$0000,$0000,$0000,$0001 
  829. ;Reserved for synth sounds
  830.     dc.w $0000,$0000,$0010,$0000,$0010 
  831.     dc.w $0000,$0020,$0010,$0000,$0010 
  832.     dc.w $0000,$0040,$0010,$0000,$0010 
  833.     dc.w $0000,$0060,$0010,$0000,$0010 
  834.     dc.w $0000,$0080,$0010,$0000,$0010 
  835.     dc.w $0000,$00a0,$0010,$0000,$0010 
  836.     dc.w $0000,$00c0,$0010,$0000,$0010 
  837.     dc.w $0000,$00e0,$0010,$0000,$0010 
  838.     dc.w $0000,$0100,$0010,$0000,$0010 
  839.     dc.w $0000,$0120,$0010,$0000,$0010 
  840.     dc.w $0000,$0140,$0010,$0000,$0010 
  841.     dc.w $0000,$0160,$0010,$0000,$0010 
  842.     dc.w $0000,$0180,$0010,$0000,$0010 
  843.     dc.w $0000,$01a0,$0010,$0000,$0010 
  844.     dc.w $0000,$01c0,$0010,$0000,$0010 
  845.     dc.w $0000,$01e0,$0010,$0000,$0010 
  846.     dc.w $0000,$0200,$0010,$0000,$0010 
  847.     dc.w $0000,$0220,$0010,$0000,$0010 
  848.     dc.w $0000,$0240,$0010,$0000,$0010 
  849.     dc.w $0000,$0260,$0010,$0000,$0010 
  850.     dc.w $0000,$0280,$0010,$0000,$0010 
  851.     dc.w $0000,$02a0,$0010,$0000,$0010 
  852.     dc.w $0000,$02c0,$0010,$0000,$0010 
  853.     dc.w $0000,$02e0,$0010,$0000,$0010 
  854.     dc.w $0000,$0300,$0010,$0000,$0010 
  855.     dc.w $0000,$0320,$0010,$0000,$0010 
  856.     dc.w $0000,$0340,$0010,$0000,$0010 
  857.     dc.w $0000,$0360,$0010,$0000,$0010 
  858.     dc.w $0000,$0380,$0010,$0000,$0010 
  859.     dc.w $0000,$03a0,$0010,$0000,$0010 
  860.     dc.w $0000,$03c0,$0010,$0000,$0010 
  861.     dc.w $0000,$03e0,$0010,$0000,$0010 
  862.     dc.w $0000,$0400,$0008,$0000,$0008 
  863.     dc.w $0000,$0410,$0008,$0000,$0008 
  864.     dc.w $0000,$0420,$0008,$0000,$0008 
  865.     dc.w $0000,$0430,$0008,$0000,$0008 
  866.     dc.w $0000,$0440,$0008,$0000,$0008
  867.     dc.w $0000,$0450,$0008,$0000,$0008
  868.     dc.w $0000,$0460,$0008,$0000,$0008
  869.     dc.w $0000,$0470,$0008,$0000,$0008
  870.     dc.w $0000,$0480,$0010,$0000,$0010
  871.     dc.w $0000,$04a0,$0008,$0000,$0008
  872.     dc.w $0000,$04b0,$0010,$0000,$0010
  873.     dc.w $0000,$04d0,$0010,$0000,$0010
  874.     dc.w $0000,$04f0,$0008,$0000,$0008
  875.     dc.w $0000,$0500,$0008,$0000,$0008
  876.     dc.w $0000,$0510,$0018,$0000,$0018
  877.  
  878.  
  879. WAVEFORMS:
  880.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  881.     dc.w $3f37,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  882.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  883.     dc.w $c037,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  884.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  885.     dc.w $c0b8,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  886.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  887.     dc.w $c0b8,$b027,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  888.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  889.     dc.w $c0b8,$b0a8,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  890.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  891.     dc.w $c0b8,$b0a8,$a017,$0f07,$ff07,$0f17,$1f27,$2f37
  892.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  893.     dc.w $c0b8,$b0a8,$a098,$0f07,$ff07,$0f17,$1f27,$2f37
  894.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  895.     dc.w $c0b8,$b0a8,$a098,$9007,$ff07,$0f17,$1f27,$2f37
  896.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  897.     dc.w $c0b8,$b0a8,$a098,$9088,$ff07,$0f17,$1f27,$2f37
  898.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  899.     dc.w $c0b8,$b0a8,$a098,$9088,$8007,$0f17,$1f27,$2f37
  900.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  901.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$0f17,$1f27,$2f37
  902.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  903.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9017,$1f27,$2f37
  904.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  905.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$1f27,$2f37
  906.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  907.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a027,$2f37
  908.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  909.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a0a8,$2f37
  910.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  911.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a0a8,$b037
  912.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  913.     dc.w $7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  914.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  915.     dc.w $817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  916.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  917.     dc.w $8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  918.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  919.     dc.w $8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  920.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  921.     dc.w $8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  922.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  923.     dc.w $8181,$8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  924.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  925.     dc.w $8181,$8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  926.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  927.     dc.w $8181,$8181,$8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f
  928.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  929.     dc.w $8181,$8181,$8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f
  930.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  931.     dc.w $8181,$8181,$8181,$8181,$817f,$7f7f,$7f7f,$7f7f
  932.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  933.     dc.w $8181,$8181,$8181,$8181,$8181,$7f7f,$7f7f,$7f7f
  934.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  935.     dc.w $8181,$8181,$8181,$8181,$8181,$817f,$7f7f,$7f7f
  936.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  937.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$7f7f,$7f7f
  938.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  939.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$817f,$7f7f
  940.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$8080
  941.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$7f7f
  942.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$8080
  943.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$807f
  944.     dc.w $8080,$8080,$8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f
  945.     dc.w $8080,$8080,$8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f
  946.     dc.w $8080,$8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  947.     dc.w $8080,$8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  948.     dc.w $8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  949.     dc.w $8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  950.     dc.w $8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  951.     dc.w $8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  952.     dc.w $8080,$9098,$a0a8,$b0b8,$c0c8,$d0d8,$e0e8,$f0f8
  953.     dc.w $0008,$1018,$2028,$3038,$4048,$5058,$6068,$707f
  954.     dc.w $8080,$a0b0,$c0d0,$e0f0,$0010,$2030,$4050,$6070
  955.     dc.w $4545,$797d,$7a77,$7066,$6158,$534d,$2c20,$1812
  956.     dc.w $04db,$d3cd,$c6bc,$b5ae,$a8a3,$9d99,$938e,$8b8a
  957.     dc.w $4545,$797d,$7a77,$7066,$5b4b,$4337,$2c20,$1812
  958.     dc.w $04f8,$e8db,$cfc6,$beb0,$a8a4,$9e9a,$9594,$8d83
  959.     dc.w $0000,$4060,$7f60,$4020,$00e0,$c0a0,$80a0,$c0e0
  960.     dc.w $0000,$4060,$7f60,$4020,$00e0,$c0a0,$80a0,$c0e0
  961.     dc.w $8080,$9098,$a0a8,$b0b8,$c0c8,$d0d8,$e0e8,$f0f8
  962.     dc.w $0008,$1018,$2028,$3038,$4048,$5058,$6068,$707f
  963.     dc.w $8080,$a0b0,$c0d0,$e0f0,$0010,$2030,$4050,$6070
  964.     end
  965.