home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Sound / Eagleplayer2 / Developer / Examples / FutureComposer_1.3.s
Text File  |  1998-01-09  |  23KB  |  969 lines

  1. *************************************************************
  2. ** Future Composer Version 1.0-1.3 Player for Eagleplayer  **
  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.     EPPHEADER 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. chan1:
  331.     lea V1data(pc),a0
  332.     tst.w 72(a0)
  333.     beq.s chan2
  334.     subq.w #1,72(a0)
  335.     cmpi.w #1,72(a0)
  336.     bne.s chan2
  337.     clr.w 72(a0)
  338.     move.l    d2,$dff0a0        ;Set soundstart
  339.     move.l    d2,FC_structadr+UPS_Voice1adr
  340.     move.w d0,$dff0a4        ;Set soundlength
  341.     move.w    d0,FC_structadr+UPS_Voice1len
  342. chan2:
  343.     lea V2data(pc),a0
  344.     tst.w 72(a0)
  345.     beq.s chan3
  346.     subq.w #1,72(a0)
  347.     cmpi.w #1,72(a0)
  348.     bne.s chan3
  349.     clr.w 72(a0)
  350.     move.l d3,$dff0b0
  351.     move.w d1,$dff0b4
  352.     move.l    d3,FC_structadr+UPS_Voice2adr
  353.     move.w    d1,FC_structadr+UPS_Voice2len
  354. chan3:
  355.     lea V3data(pc),a0
  356.     tst.w 72(a0)
  357.     beq.s chan4
  358.     subq.w #1,72(a0)
  359.     cmpi.w #1,72(a0)
  360.     bne.s chan4
  361.     clr.w 72(a0)
  362.     move.l d4,$dff0c0
  363.     move.w d6,$dff0c4
  364.     move.l    d4,FC_structadr+UPS_Voice3adr
  365.     move.w    d6,FC_structadr+UPS_Voice3len
  366. chan4:
  367.     lea V4data(pc),a0
  368.     tst.w 72(a0)
  369.     beq.s setpervol
  370.     subq.w #1,72(a0)
  371.     cmpi.w #1,72(a0)
  372.     bne.s setpervol
  373.     clr.w 72(a0)
  374.     move.l d5,$dff0d0
  375.     move.w d7,$dff0d4
  376.     move.l    d5,FC_structadr+UPS_Voice4adr
  377.     move.w    d7,FC_structadr+UPS_Voice4len
  378. setpervol:
  379.  
  380. ;------------------- original gehört dieses DMASet über die Audio Pokes ------------
  381.     bsr    waitdma
  382.     move.w (a7)+,$dff096        ;Enable audio DMA
  383.     bsr    waitdma
  384. ;_________________________________________________________________________________
  385.  
  386.     lea $dff0a6,a5
  387.     move.w    (a6)+,d0
  388.     move.w    d0,(a5)        ;Sampleperiod
  389.     move.w    d0,FC_Structadr+UPS_Voice1per
  390.  
  391.     move.w (a6)+,d0        ;Volume
  392.     move.w    d0,FC_Structadr+UPS_Voice1vol
  393.     mulu    FC_VolVoice1(pc),d0
  394.     lsr.w    #6,d0
  395.     move.w    d0,2(a5)
  396.  
  397.     move.w (a6)+,d0
  398.     move.w    d0,16(a5)    ;Sampleperiod
  399.     move.w    d0,FC_Structadr+UPS_Voice2per
  400.  
  401.     move.w    (a6)+,d0        ;Volume
  402.     move.w    d0,FC_StructAdr+UPS_Voice2Vol
  403.     mulu    FC_VolVoice2(pc),d0
  404.     lsr.w    #6,d0
  405.     move.w    d0,18(a5)
  406.  
  407.     move.w    (a6)+,d0
  408.     move.w    d0,32(a5)    ;Sampleperiod
  409.     move.w    d0,FC_Structadr+UPS_Voice3per
  410.  
  411.     move.w    (a6)+,d0        ;Volume
  412.     move.w    d0,FC_StructAdr+UPS_Voice3Vol
  413.     mulu    FC_VolVoice3,d0
  414.     lsr.w    #6,d0
  415.     move.w    d0,34(a5)
  416.  
  417.     move.w    (a6)+,d0
  418.     move.w    d0,48(a5)    ;Sampleperiod
  419.     move.w    d0,FC_Structadr+UPS_Voice4per
  420.  
  421.     move.w    (a6)+,d0        ;Volume
  422.     move.w    d0,FC_StructAdr+UPS_Voice4Vol
  423.     mulu    FC_Volvoice4,d0
  424.     asr.w    #6,d0
  425.     move.w    d0,50(a5)
  426.     rts
  427.  
  428. new_note:
  429.     moveq #0,d5
  430.     move.l 34(a0),a1
  431.     adda.w 40(a0),a1
  432.     cmp.w #64,40(a0)
  433.     bne samepat
  434.     move.l (a0),a2
  435.     adda.w 6(a0),a2        ;Point to next sequence row
  436.     cmpa.l 52(a0),a2    ;Is it the end?
  437.     bne.s notend
  438.  
  439.     move.l    dtbase(pc),a2
  440.     move.l    dtg_SongEnd(a2),a2
  441.     jsr    (a2)        ;End of Song for Playerprogram
  442.     
  443.     move.w d5,6(a0)        ;yes!
  444.     move.l (a0),a2        ;Point to first sequence
  445. notend:
  446.     moveq #1,d1
  447.     addq.b #1,spdtemp
  448.     cmpi.b #5,spdtemp
  449.     bne.s nonewspd
  450.     move.b d1,spdtemp
  451.     move.b 12(a2),d1    ;Get new replay speed
  452.     beq.s nonewspd
  453.     move.w d1,respcnt    ;store in counter
  454.     move.w d1,repspd
  455. nonewspd:
  456.     move.b (a2),d1        ;Pattern to play
  457.     move.b 1(a2),44(a0)    ;Transpose value
  458.     move.b 2(a2),22(a0)    ;Soundtranspose value
  459.  
  460.     move.w d5,40(a0)
  461.     lsl.w #6,d1
  462.     add.l PATpoint(pc),d1    ;Get pattern pointer
  463.     move.l d1,34(a0)
  464.     addi.w #$000d,6(a0)
  465.     move.l d1,a1
  466. samepat:
  467.     move.b 1(a1),d1        ;Get info byte
  468.     move.b (a1)+,d0        ;Get note
  469.     bne.s ww1
  470.     andi.w #%11000000,d1
  471.     beq.s noport
  472.     bra.s ww11
  473. ww1:
  474.     move.w d5,56(a0)
  475. ww11:
  476.     move.b d5,47(a0)
  477.     move.b (a1),31(a0)
  478.  
  479.         ;31(a0) = PORTAMENTO/INSTR. info
  480.             ;Bit 7 = portamento on
  481.             ;Bit 6 = portamento off
  482.             ;Bit 5-0 = instrument number
  483.         ;47(a0) = portamento value
  484.             ;Bit 7-5 = always zero
  485.             ;Bit 4 = up/down
  486.             ;Bit 3-0 = value
  487. t_porton:
  488.     btst #7,d1
  489.     beq.s noport
  490.     move.b 2(a1),47(a0)    
  491. noport:
  492.     andi.w #$007f,d0
  493.     beq nextnote
  494.     move.b d0,8(a0)
  495.     move.b (a1),9(a0)
  496.     move.b 32(a0),d2
  497.     moveq #0,d3
  498.     bset d2,d3
  499.     or.w d3,audtemp
  500.     move.w d3,$dff096
  501.     move.b (a1),d1
  502.     andi.w #$003f,d1    ;Max 64 instruments
  503.     add.b 22(a0),d1
  504.     move.l VOLpoint(pc),a2
  505.     lsl.w #6,d1
  506.     adda.w d1,a2
  507.     move.w d5,16(a0)
  508.     move.b (a2),23(a0)
  509.     move.b (a2)+,24(a0)
  510.     move.b (a2)+,d1
  511.     andi.w #$00ff,d1
  512.     move.b (a2)+,27(a0)
  513.     move.b #$40,46(a0)
  514.     move.b (a2)+,d0
  515.     move.b d0,28(a0)
  516.     move.b d0,29(a0)
  517.     move.b (a2)+,30(a0)
  518.     move.l a2,10(a0)
  519.     move.l FRQpoint(pc),a2
  520.     lsl.w #6,d1
  521.     adda.w d1,a2
  522.     move.l a2,18(a0)
  523.     move.w d5,50(a0)
  524.     move.b d5,26(a0)
  525.     move.b d5,25(a0)
  526. nextnote:
  527.     addq.w #2,40(a0)
  528.     rts
  529.  
  530. effects:
  531.     moveq #0,d7
  532. testsustain:
  533.     tst.b 26(a0)        ;Is sustain counter = 0
  534.     beq.s sustzero
  535.     subq.b #1,26(a0)    ;if no, decrease counter
  536.     bra VOLUfx
  537. sustzero:        ;Next part of effect sequence
  538.     move.l 18(a0),a1    ;can be executed now.
  539.     adda.w 50(a0),a1
  540. testeffects:
  541.     cmpi.b #$e1,(a1)    ;E1 = end of FREQseq sequence
  542.     beq VOLUfx
  543.     cmpi.b #$e0,(a1)    ;E0 = loop to other part of sequence
  544.     bne.s testnewsound
  545.     move.b 1(a1),d0        ;loop to start of sequence + 1(a1)
  546.     andi.w #$003f,d0
  547.     move.w d0,50(a0)
  548.     move.l 18(a0),a1
  549.     adda.w d0,a1
  550. testnewsound:
  551.     cmpi.b #$e2,(a1)    ;E2 = set waveform
  552.     bne.s o49c64
  553.     moveq #0,d0
  554.     moveq #0,d1
  555.     move.b 32(a0),d1
  556.     bset d1,d0
  557.     or.w d0,audtemp
  558.     move.w d0,$dff096
  559.     move.b 1(a1),d0
  560.     andi.w #$00ff,d0
  561.     lea SOUNDINFO,a4
  562.     add.w d0,d0
  563.     move.w d0,d1
  564.     add.w d1,d1
  565.     add.w d1,d1
  566.     add.w d1,d0
  567.     adda.w d0,a4
  568.     move.l 60(a0),a3
  569.     move.l (a4),d1
  570.     add.l #WAVEFORMS,d1
  571.     move.l d1,(a3)
  572.     move.l d1,68(a0)
  573.     move.w 4(a4),4(a3)
  574.     move.l 6(a4),64(a0)
  575.     swap d1
  576.     move.w #$0003,72(a0)
  577.     tst.w d1
  578.     bne.s o49c52
  579.     move.w #$0002,72(a0)
  580. o49c52:
  581.     clr.w 16(a0)
  582.     move.b #$01,23(a0)
  583.     addq.w #2,50(a0)
  584.     bra o49d02
  585. o49c64:
  586.     cmpi.b #$e4,(a1)
  587.     bne.s testpatjmp
  588.     move.b 1(a1),d0
  589.     andi.w #$00ff,d0
  590.     lea SOUNDINFO,a4
  591.     add.w d0,d0
  592.     move.w d0,d1
  593.     add.w d1,d1
  594.     add.w d1,d1
  595.     add.w d1,d0
  596.     adda.w d0,a4
  597.     move.l 60(a0),a3
  598.     move.l (a4),d1
  599.     add.l #WAVEFORMS,d1
  600.     move.l d1,(a3)
  601.     move.l d1,68(a0)
  602.     move.w 4(a4),4(a3)
  603.     move.l 6(a4),64(a0)
  604.  
  605.     swap d1
  606.     move.w #$0003,72(a0)
  607.     tst.w d1
  608.     bne.s o49cae
  609.     move.w #$0002,72(a0)
  610. o49cae:
  611.     addq.w #2,50(a0)
  612.     bra.s o49d02
  613. testpatjmp:
  614.     cmpi.b #$e7,(a1)
  615.     bne.s testnewsustain
  616.     move.b 1(a1),d0
  617.     andi.w #$00ff,d0
  618.     lsl.w #6,d0
  619.     move.l FRQpoint(pc),a1
  620.     adda.w d0,a1
  621.     move.l a1,18(a0)
  622.     move.w d7,50(a0)
  623.     bra testeffects
  624. testnewsustain:
  625.     cmpi.b #$e8,(a1)    ;E8 = set sustain time
  626.     bne.s o49cea
  627.     move.b 1(a1),26(a0)
  628.     addq.w #2,50(a0)
  629.     bra testsustain
  630. o49cea:
  631.     cmpi.b #$e3,(a1)
  632.     bne.s o49d02
  633.     addq.w #3,50(a0)
  634.     move.b 1(a1),27(a0)
  635.     move.b 2(a1),28(a0)
  636. o49d02:
  637.     move.l 18(a0),a1
  638.     adda.w 50(a0),a1
  639.     move.b (a1),43(a0)
  640.     addq.w #1,50(a0)
  641. VOLUfx:
  642.     tst.b 25(a0)
  643.     beq.s o49d1e
  644.     subq.b #1,25(a0)
  645.     bra.s o49d70
  646. o49d1e:
  647.     subq.b #1,23(a0)
  648.     bne.s o49d70
  649.     move.b 24(a0),23(a0)
  650. o49d2a:
  651.     move.l 10(a0),a1
  652.     adda.w 16(a0),a1
  653.     move.b (a1),d0
  654.     cmpi.b #$e8,d0
  655.     bne.s o49d4a
  656.     addq.w #2,16(a0)
  657.     move.b 1(a1),25(a0)
  658.     bra.s VOLUfx
  659. o49d4a:
  660.     cmpi.b #$e1,d0
  661.     beq.s o49d70
  662.     cmpi.b #$e0,d0
  663.     bne.s o49d68
  664.     move.b 1(a1),d0
  665.     andi.l #$003f,d0
  666.     subq.b #5,d0
  667.     move.w d0,16(a0)
  668.     bra.s o49d2a
  669. o49d68:
  670.     move.b (a1),45(a0)
  671.     addq.w #1,16(a0)
  672. o49d70:
  673.     move.b 43(a0),d0
  674.     bmi.s o49d7e
  675.     add.b 8(a0),d0
  676.     add.b 44(a0),d0
  677. o49d7e:
  678.     andi.w #$007f,d0
  679.     lea PERIODS,a1
  680.     add.w d0,d0
  681.     move.w d0,d1
  682.     adda.w d0,a1
  683.     move.w (a1),d0
  684.     move.b 46(a0),d7
  685.     tst.b 30(a0)
  686.     beq.s o49d9e
  687.     subq.b #1,30(a0)
  688.  
  689.     bra.s o49df4
  690. o49d9e:
  691.     move.b d1,d5
  692.     move.b 28(a0),d4
  693.     add.b d4,d4
  694.     move.b 29(a0),d1
  695.     tst.b d7
  696.     bpl.s o49db4
  697.     btst #0,d7
  698.     bne.s o49dda
  699. o49db4:
  700.     btst #5,d7
  701.     bne.s o49dc8
  702.     sub.b 27(a0),d1
  703.     bcc.s o49dd6
  704.     bset #5,d7
  705.     moveq #0,d1
  706.     bra.s o49dd6
  707. o49dc8:
  708.     add.b 27(a0),d1
  709.     cmp.b d4,d1
  710.     bcs.s o49dd6
  711.     bclr #5,d7
  712.     move.b d4,d1
  713. o49dd6:
  714.     move.b d1,29(a0)
  715. o49dda:
  716.     lsr.b #1,d4
  717.     sub.b d4,d1
  718.     bcc.s o49de4
  719.     subi.w #$0100,d1
  720. o49de4:
  721.     addi.b #$a0,d5
  722.     bcs.s o49df2
  723. o49dea:
  724.     add.w d1,d1
  725.     addi.b #$18,d5
  726.     bcc.s o49dea
  727. o49df2:
  728.     add.w d1,d0
  729. o49df4:
  730.     eori.b #$01,d7
  731.     move.b d7,46(a0)
  732.  
  733.     ; DO THE PORTAMENTO THING
  734.     moveq #0,d1
  735.     move.b 47(a0),d1    ;get portavalue
  736.     beq.s a56d0        ;0=no portamento
  737.     cmpi.b #$1f,d1
  738.     bls.s portaup
  739. portadown: 
  740.     andi.w #$1f,d1
  741.     neg.w d1
  742. portaup:
  743.     sub.w d1,56(a0)
  744. a56d0:
  745.     add.w 56(a0),d0
  746. o49e3e:
  747.     cmpi.w #$0070,d0
  748.     bhi.s nn1
  749.     move.w #$0071,d0
  750. nn1:
  751.     cmpi.w #$06b0,d0
  752.     bls.s nn2
  753.     move.w #$06b0,d0
  754. nn2:
  755.     moveq #0,d1
  756.     move.b 45(a0),d1
  757.     rts
  758. waitdma    move.l    a0,-(sp)
  759.     move.l    dtbase(pc),a0
  760.     move.l    DTG_waitaudiodma(a0),a0
  761.     jsr    (a0)
  762.     move.l    (sp)+,a0
  763.     rts    
  764.  
  765.  
  766.  
  767. pervol: dcb.b 16,0    ;Periods & Volumes temp. store
  768. respcnt: dc.w 0        ;Replay speed counter 
  769. repspd:  dc.w 0        ;Replay speed counter temp
  770. onoff:   dc.w 0        ;Music on/off flag.
  771. firseq:     dc.w 0        ;First sequence
  772. lasseq:     dc.w 0        ;Last sequence
  773. audtemp: dc.w 0
  774. spdtemp: dc.w 0
  775.  
  776. V1data:  dcb.b 64,0    ;Voice 1 data area
  777. offset1: dcb.b 02,0    ;Is added to start of sound
  778. ssize1:  dcb.b 02,0    ;Length of sound
  779. start1:  dcb.b 06,0    ;Start of sound
  780.  
  781. V2data:  dcb.b 64,0    ;Voice 2 data area
  782. offset2: dcb.b 02,0
  783. ssize2:  dcb.b 02,0
  784. start2:  dcb.b 06,0
  785.  
  786. V3data:  dcb.b 64,0    ;Voice 3 data area
  787. offset3: dcb.b 02,0
  788. ssize3:  dcb.b 02,0
  789. start3:  dcb.b 06,0
  790.  
  791. V4data:  dcb.b 64,0    ;Voice 4 data area
  792. offset4: dcb.b 02,0
  793. ssize4:  dcb.b 02,0
  794. start4:  dcb.b 06,0
  795.  
  796. o4a0c8: dc.l $00000000,$00100003,$00200006,$00300009
  797. SEQpoint: dc.l 0
  798. PATpoint: dc.l 0
  799. FRQpoint: dc.l 0
  800. VOLpoint: dc.l 0
  801.  
  802.     section    fcdatas,data_c
  803.  
  804.     even
  805. SILENT: dc.w $0100,$0000,$0000,$00e1
  806.  
  807. PERIODS:dc.w $06b0,$0650,$05f4,$05a0,$054c,$0500,$04b8,$0474
  808.     dc.w $0434,$03f8,$03c0,$038a,$0358,$0328,$02fa,$02d0
  809.     dc.w $02a6,$0280,$025c,$023a,$021a,$01fc,$01e0,$01c5
  810.     dc.w $01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d
  811.     dc.w $010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be,$00b4
  812.     dc.w $00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  813.     dc.w $0071,$0071,$0071,$0071,$0071,$0071,$0071,$0071
  814.     dc.w $0071,$0071,$0071,$0071,$0d60,$0ca0,$0be8,$0b40
  815.     dc.w $0a98,$0a00,$0970,$08e8,$0868,$07f0,$0780,$0714
  816.     dc.w $1ac0,$1940,$17d0,$1680,$1530,$1400,$12e0,$11d0
  817.     dc.w $10d0,$0fe0,$0f00,$0e28
  818.  
  819. SOUNDINFO:
  820. ;Offset.l , Sound-length.w , Start-offset.w , Repeat-length.w 
  821.  
  822. ;Reserved for samples
  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.     dc.w $0000,$0000,$0000,$0000,$0001 
  830.     dc.w $0000,$0000,$0000,$0000,$0001 
  831.     dc.w $0000,$0000,$0000,$0000,$0001 
  832.     dc.w $0000,$0000,$0000,$0000,$0001 
  833. ;Reserved for synth sounds
  834.     dc.w $0000,$0000,$0010,$0000,$0010 
  835.     dc.w $0000,$0020,$0010,$0000,$0010 
  836.     dc.w $0000,$0040,$0010,$0000,$0010 
  837.     dc.w $0000,$0060,$0010,$0000,$0010 
  838.     dc.w $0000,$0080,$0010,$0000,$0010 
  839.     dc.w $0000,$00a0,$0010,$0000,$0010 
  840.     dc.w $0000,$00c0,$0010,$0000,$0010 
  841.     dc.w $0000,$00e0,$0010,$0000,$0010 
  842.     dc.w $0000,$0100,$0010,$0000,$0010 
  843.     dc.w $0000,$0120,$0010,$0000,$0010 
  844.     dc.w $0000,$0140,$0010,$0000,$0010 
  845.     dc.w $0000,$0160,$0010,$0000,$0010 
  846.     dc.w $0000,$0180,$0010,$0000,$0010 
  847.     dc.w $0000,$01a0,$0010,$0000,$0010 
  848.     dc.w $0000,$01c0,$0010,$0000,$0010 
  849.     dc.w $0000,$01e0,$0010,$0000,$0010 
  850.     dc.w $0000,$0200,$0010,$0000,$0010 
  851.     dc.w $0000,$0220,$0010,$0000,$0010 
  852.     dc.w $0000,$0240,$0010,$0000,$0010 
  853.     dc.w $0000,$0260,$0010,$0000,$0010 
  854.     dc.w $0000,$0280,$0010,$0000,$0010 
  855.     dc.w $0000,$02a0,$0010,$0000,$0010 
  856.     dc.w $0000,$02c0,$0010,$0000,$0010 
  857.     dc.w $0000,$02e0,$0010,$0000,$0010 
  858.     dc.w $0000,$0300,$0010,$0000,$0010 
  859.     dc.w $0000,$0320,$0010,$0000,$0010 
  860.     dc.w $0000,$0340,$0010,$0000,$0010 
  861.     dc.w $0000,$0360,$0010,$0000,$0010 
  862.     dc.w $0000,$0380,$0010,$0000,$0010 
  863.     dc.w $0000,$03a0,$0010,$0000,$0010 
  864.     dc.w $0000,$03c0,$0010,$0000,$0010 
  865.     dc.w $0000,$03e0,$0010,$0000,$0010 
  866.     dc.w $0000,$0400,$0008,$0000,$0008 
  867.     dc.w $0000,$0410,$0008,$0000,$0008 
  868.     dc.w $0000,$0420,$0008,$0000,$0008 
  869.     dc.w $0000,$0430,$0008,$0000,$0008 
  870.     dc.w $0000,$0440,$0008,$0000,$0008
  871.     dc.w $0000,$0450,$0008,$0000,$0008
  872.     dc.w $0000,$0460,$0008,$0000,$0008
  873.     dc.w $0000,$0470,$0008,$0000,$0008
  874.     dc.w $0000,$0480,$0010,$0000,$0010
  875.     dc.w $0000,$04a0,$0008,$0000,$0008
  876.     dc.w $0000,$04b0,$0010,$0000,$0010
  877.     dc.w $0000,$04d0,$0010,$0000,$0010
  878.     dc.w $0000,$04f0,$0008,$0000,$0008
  879.     dc.w $0000,$0500,$0008,$0000,$0008
  880.     dc.w $0000,$0510,$0018,$0000,$0018
  881.  
  882.  
  883. WAVEFORMS:
  884.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  885.     dc.w $3f37,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  886.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  887.     dc.w $c037,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  888.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  889.     dc.w $c0b8,$2f27,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  890.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  891.     dc.w $c0b8,$b027,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  892.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  893.     dc.w $c0b8,$b0a8,$1f17,$0f07,$ff07,$0f17,$1f27,$2f37
  894.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  895.     dc.w $c0b8,$b0a8,$a017,$0f07,$ff07,$0f17,$1f27,$2f37
  896.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  897.     dc.w $c0b8,$b0a8,$a098,$0f07,$ff07,$0f17,$1f27,$2f37
  898.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  899.     dc.w $c0b8,$b0a8,$a098,$9007,$ff07,$0f17,$1f27,$2f37
  900.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  901.     dc.w $c0b8,$b0a8,$a098,$9088,$ff07,$0f17,$1f27,$2f37
  902.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  903.     dc.w $c0b8,$b0a8,$a098,$9088,$8007,$0f17,$1f27,$2f37
  904.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  905.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$0f17,$1f27,$2f37
  906.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  907.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9017,$1f27,$2f37
  908.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  909.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$1f27,$2f37
  910.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  911.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a027,$2f37
  912.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  913.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a0a8,$2f37
  914.     dc.w $c0c0,$d0d8,$e0e8,$f0f8,$00f8,$f0e8,$e0d8,$d0c8
  915.     dc.w $c0b8,$b0a8,$a098,$9088,$8088,$9098,$a0a8,$b037
  916.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  917.     dc.w $7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  918.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  919.     dc.w $817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  920.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  921.     dc.w $8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  922.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  923.     dc.w $8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  924.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  925.     dc.w $8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  926.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  927.     dc.w $8181,$8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  928.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  929.     dc.w $8181,$8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  930.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  931.     dc.w $8181,$8181,$8181,$817f,$7f7f,$7f7f,$7f7f,$7f7f
  932.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  933.     dc.w $8181,$8181,$8181,$8181,$7f7f,$7f7f,$7f7f,$7f7f
  934.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  935.     dc.w $8181,$8181,$8181,$8181,$817f,$7f7f,$7f7f,$7f7f
  936.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  937.     dc.w $8181,$8181,$8181,$8181,$8181,$7f7f,$7f7f,$7f7f
  938.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  939.     dc.w $8181,$8181,$8181,$8181,$8181,$817f,$7f7f,$7f7f
  940.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  941.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$7f7f,$7f7f
  942.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$8181,$8181
  943.     dc.w $8181,$8181,$8181,$8181,$8181,$8181,$817f,$7f7f
  944.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$8080
  945.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$7f7f
  946.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$8080
  947.     dc.w $8080,$8080,$8080,$8080,$8080,$8080,$8080,$807f
  948.     dc.w $8080,$8080,$8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f
  949.     dc.w $8080,$8080,$8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f
  950.     dc.w $8080,$8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  951.     dc.w $8080,$8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  952.     dc.w $8080,$8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  953.     dc.w $8080,$807f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  954.     dc.w $8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  955.     dc.w $8080,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f,$7f7f
  956.     dc.w $8080,$9098,$a0a8,$b0b8,$c0c8,$d0d8,$e0e8,$f0f8
  957.     dc.w $0008,$1018,$2028,$3038,$4048,$5058,$6068,$707f
  958.     dc.w $8080,$a0b0,$c0d0,$e0f0,$0010,$2030,$4050,$6070
  959.     dc.w $4545,$797d,$7a77,$7066,$6158,$534d,$2c20,$1812
  960.     dc.w $04db,$d3cd,$c6bc,$b5ae,$a8a3,$9d99,$938e,$8b8a
  961.     dc.w $4545,$797d,$7a77,$7066,$5b4b,$4337,$2c20,$1812
  962.     dc.w $04f8,$e8db,$cfc6,$beb0,$a8a4,$9e9a,$9594,$8d83
  963.     dc.w $0000,$4060,$7f60,$4020,$00e0,$c0a0,$80a0,$c0e0
  964.     dc.w $0000,$4060,$7f60,$4020,$00e0,$c0a0,$80a0,$c0e0
  965.     dc.w $8080,$9098,$a0a8,$b0b8,$c0c8,$d0d8,$e0e8,$f0f8
  966.     dc.w $0008,$1018,$2028,$3038,$4048,$5058,$6068,$707f
  967.     dc.w $8080,$a0b0,$c0d0,$e0f0,$0010,$2030,$4050,$6070
  968.     end
  969.