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.4.s < prev    next >
Text File  |  1995-01-17  |  18KB  |  889 lines

  1. ***************************************************************************
  2. * Future Compose 1.4 Eagleplayer/Deliplayer1.3+ ,Playroutine by Supersero *
  3. * adapted by Buggs of DEFECT                                              *
  4. ***************************************************************************
  5.  
  6.     incdir    Include:
  7.     include    "misc/EaglePlayer.i"
  8.  
  9.     SECTION Player,Code
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: FutureComposer 1.4 Eagleplayer module V1.3 (Jan/26/93)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_RequestDTVersion,$ffff
  18.     dc.l    EP_PlayerVersion,4
  19.     dc.l    DTP_PlayerVersion,6
  20.     dc.l    DTP_PlayerName,Fcname
  21.     dc.l    DTP_Creator,Creator
  22.     dc.l    DTP_Check2,testifitis
  23.     dc.l    DTP_Interrupt,FC14_Music
  24.     dc.l    DTP_InitPlayer,GetAudio
  25.     dc.l    DTP_EndPlayer,Freeaudio
  26.     dc.l    DTP_InitSound,init_Music
  27.     dc.l    DTP_EndSound,End_Music
  28.  
  29.     dc.l    DTP_Volume,SetVoices
  30.     dc.l    DTP_Balance,SetVoices
  31.     dc.l    EP_Voices,SetVoices
  32. ;    dc.l    DTP_Nextpatt,nextpatt
  33.  
  34.     dc.l    EP_StructInit,StrukInit
  35.     dc.l    EP_StructEnd,StrukEnd
  36.  
  37.     dc.l    EP_Flags,EPB_Packable!EPB_VolVoices!EPB_Save!EPB_Restart!EPB_Songend!EPB_Volume!EPB_Balance!EPB_Voices!EPB_Analyzer
  38.     dc.l    0
  39.  
  40. ;========================================================================
  41.  
  42. FCName    dc.b 'FutureComposer 1.4',0
  43. Creator    dc.b 'SuperSero of the Superions,',10
  44.     dc.b 'adapted by Buggs of DEFECT',0
  45.     even
  46. FC14_Data    dc.l    0
  47. Dtbase        dc.l    0
  48. FC_Structadr:    ds.b    UPS_Sizeof
  49.  
  50.  
  51. FC_VolVoice1    dc.w    1
  52. FC_VolVoice2    dc.w    1
  53. FC_VolVoice3    dc.w    1
  54. FC_VolVoice4    dc.w    1
  55.  
  56. Nextpatt
  57. ;    lea    audtemp(pc),a5
  58. ;    move.w    6(a5),4(a5)        ;Restore replayspeed counter
  59. ;    moveq    #0,d5
  60. ;    lea    V1data(pc),a0        ;Point to voice1 data area
  61. ;    cmp.w    #64,40(a0)
  62. ;    bsr    new_note
  63. ;    lea    V2data(pc),a0        ;Point to voice2 data area
  64. ;    cmp.w    #64,40(a0)
  65. ;    bsr    new_note
  66. ;    lea    V3data(pc),a0        ;Point to voice3 data area
  67. ;    cmp.w    #64,40(a0)
  68. ;    bsr    new_note
  69. ;    lea    V4data(pc),a0        ;Point to voice4 data area
  70. ;    cmp.w    #64,40(a0)
  71. ;    bra    new_note
  72. ;=========== Struktur ⁿbergeben und Sampleadressen l÷schen ==============
  73. Strukinit:
  74.     lea    FC_StructAdr(pc),a0
  75. StrukEnd:
  76.     rts
  77. ;========= Load Module & Get Audio Channels ===========================
  78. Getaudio
  79.     moveq    #0,d0
  80.     move.l    dtg_GetListData(a5),a0        ; Function
  81.     jsr    (a0)
  82.  
  83.     move.l    a0,FC14_Data
  84.     move.l    a5,dtbase
  85.  
  86.     move.l    dtg_AudioAlloc(a5),a0
  87.     jmp    (a0)
  88. ;=============== Free Audio Channels ===================================
  89. Freeaudio
  90.     move.l    dtg_AudioFree(a5),a0
  91.     jmp    (a0)
  92. ;========================== Is is a Futurecomposer 1.4 Module ??? ========
  93. testifitis
  94.     move.l    dtg_ChkData(a5),a0
  95.     move.l    (a0),d0
  96.     sub.l    #"FC14",d0
  97.     rts
  98. ;========================================================================
  99. ;==    d0 Bit 0-3 = Set Voices Bit=1 Voice on                   ==
  100.  
  101. *-----------------------------------------------------------------------*
  102. *        d0 Bit 0-3 = Set Voices Bit=1 Voice on            *
  103. SetVoices:    lea    FC_StructAdr+UPS_DmaCon(pc),a0
  104.         move.w    EPG_Voices(a5),(a0)                ;Voices retten
  105.         lea    FC_VolVoice1(pc),a1
  106.         move.l    EPG_Voice1Vol(a5),(a1)
  107.         move.l    EPG_Voice3Vol(a5),4(a1)
  108.  
  109.         lea    FC_StructAdr+UPS_Voice1Vol(pc),a0
  110.         lea    $dff0a0,a5
  111.         moveq    #3,d1
  112. .SetNew        moveq    #0,d0
  113.         move.w    (a0),d0
  114.         bsr.s    FC_SetVoices
  115.         moveq    #UPS_Modulo,d0
  116.         add.l    d0,a0
  117.         addq.l    #8,a5
  118.         addq.l    #8,a5
  119.         dbf    d1,.SetNew
  120.         rts
  121.  
  122. *-----------------------------------------------------------------------*
  123. FC_SetVoices:    movem.l    a0/d0,-(a7)
  124.         and.w    #$7f,d0
  125.         lea    FC_StructAdr(pc),a0
  126.         cmp.l    #$dff0a0,a5            ;Left Volume
  127.         bne.s    .NoVoice1
  128.         move.w    d0,UPS_Voice1Vol(a0)
  129.         mulu.w    FC_VolVoice1(pc),d0
  130.         bra.b    .SetIt
  131. .NoVoice1:    cmp.l    #$dff0b0,a5            ;Right Volume
  132.         bne.s    .NoVoice2
  133.         move.w    d0,UPS_Voice2Vol(a0)
  134.         mulu.w    FC_VolVoice2(pc),d0
  135.         bra.b    .SetIt
  136. .NoVoice2:    cmp.l    #$dff0c0,a5            ;Right Volume
  137.         bne.s    .NoVoice3
  138.         move.w    d0,UPS_Voice3Vol(a0)
  139.         mulu.w    FC_VolVoice3(pc),d0
  140.         bra.b    .SetIt
  141. .NoVoice3:    move.w    d0,UPS_Voice4Vol(a0)
  142.         mulu.w    FC_VolVoice4(pc),d0
  143. .SetIt:        lsr.w    #6,d0
  144.         move.w    d0,8(a5)
  145. .Return:    movem.l    (a7)+,a0/d0
  146.         rts
  147.  
  148. *********************************************************
  149. **  Amiga FUTURE COMPOSER  ╗╗ V1.4 ½½  Replay routine  **
  150. *********************************************************
  151. ;Doesn't work with V1.0 - V1.3 modules !!
  152.  
  153. END_MUSIC:
  154.     clr.w    onoff
  155.     lea    $dff096,a0
  156.     clr.l    $10(A0)
  157.     clr.l    $20(A0)
  158.     clr.l    $30(A0)
  159.     clr.l    $40(A0)
  160.     move.w    #$000f,(a0)
  161.     rts
  162.  
  163. INIT_MUSIC:
  164.     move.w #1,onoff
  165.     move.l FC14_Data,a0
  166.     lea 180(a0),a1
  167.     move.l a1,SEQpoint
  168.     move.l a0,a1
  169.     add.l 8(a0),a1
  170.     move.l a1,PATpoint
  171.     move.l a0,a1
  172.     add.l 16(a0),a1
  173.     move.l a1,FRQpoint
  174.     move.l a0,a1
  175.     add.l 24(a0),a1
  176.     move.l a1,VOLpoint
  177.     move.l 4(a0),d0
  178.     divu #13,d0
  179.  
  180.     lea    40(a0),a1
  181.     lea    SOUNDINFO+4,a2
  182.     moveq    #10-1,d1
  183. initloop:
  184.     move.w (a1)+,(a2)+
  185.     move.l (a1)+,(a2)+
  186.     adda.w #10,a2
  187.     dbf d1,initloop
  188.     move.l a0,d1
  189.     add.l 32(a0),d1
  190.     lea SOUNDINFO,a3
  191.     move.l d1,(a3)+
  192.     moveq #9-1,d3
  193.     moveq #0,d2
  194. initloop1:
  195.     move.w (a3),d2
  196.     add.l d2,d1
  197.     add.l d2,d1
  198.     addq.l #2,d1
  199.     adda.w #12,a3
  200.     move.l d1,(a3)+
  201.     dbf d3,initloop1
  202.  
  203.     lea 100(a0),a1
  204.     lea SOUNDINFO+(10*16),a2
  205.     move.l a0,a3
  206.     add.l 36(a0),a3
  207.  
  208.     moveq #80-1,d1
  209.     moveq #0,d2
  210. initloop2:
  211.     move.l a3,(a2)+
  212.     move.b (a1)+,d2
  213.     move.w d2,(a2)+
  214.     clr.w (a2)+
  215.     move.w d2,(a2)+
  216.     addq.w #6,a2
  217.     add.w d2,a3
  218.     add.w d2,a3
  219.     dbf d1,initloop2
  220.  
  221.     move.l SEQpoint(pc),a0
  222.     moveq #0,d2
  223.     move.b 12(a0),d2        ;Get replay speed
  224.     bne.s speedok
  225.     move.b #3,d2            ;Set default speed
  226. speedok:
  227.     move.w d2,respcnt        ;Init repspeed counter
  228.     move.w d2,repspd
  229. INIT2:
  230.     clr.w audtemp
  231.     clr.w spdtemp
  232.     move.w #$000f,$dff096        ;Disable audio DMA
  233.     move.w #$0780,$dff09a        ;Disable audio IRQ
  234.     moveq #0,d7
  235.     mulu #13,d0
  236.     moveq #4-1,d6            ;Number of soundchannels-1
  237.     lea V1data(pc),a0        ;Point to 1st voice data area
  238.     lea silent,a1
  239.     lea Chandata(pc),a2
  240. initloop3:
  241.     move.l a1,10(a0)
  242.     move.l a1,18(a0)
  243.     clr.w 4(a0)
  244.     move.w #$000d,6(a0)
  245.     clr.w 8(a0)
  246.     clr.l 14(a0)
  247.     move.b #$01,23(a0)
  248.     move.b #$01,24(a0)
  249.     clr.b 25(a0)
  250.     clr.l 26(a0)
  251.     clr.w 30(a0)
  252.     clr.l 38(a0)
  253.     clr.w 42(a0)
  254.     clr.l 44(a0)
  255.     clr.l 48(a0)
  256.     clr.w 56(a0)
  257.     moveq #$00,d3
  258.     move.w (a2)+,d1
  259.     move.w (a2),d3
  260.     divu #$0003,d3
  261.     moveq #0,d4
  262.     bset d3,d4
  263.     move.w d4,32(a0)
  264.     move.w (a2)+,d3
  265.     andi.l #$00ff,d3
  266.     andi.l #$00ff,d1
  267.     lea $dff0a0,a6
  268.     add.w d1,a6
  269.     move.l #$0000,(a6)
  270.     move.w #$0100,4(a6)
  271.     move.w #$0000,6(a6)
  272.     move.w #$0000,8(a6)
  273.     move.l a6,60(a0)
  274.     move.l SEQpoint(pc),(a0)
  275.     move.l SEQpoint(pc),52(a0)
  276.     add.l d0,52(a0)
  277.     add.l d3,52(a0)
  278.     add.l d7,(a0)
  279.     add.l d3,(a0)
  280.     move.l (a0),a3
  281.     move.b (a3),d1
  282.     andi.l #$00ff,d1
  283.     lsl.w #6,d1
  284.     move.l PATpoint(pc),a4
  285.     adda.w d1,a4
  286.     move.l a4,34(a0)
  287.     move.b 1(a3),44(a0)
  288.     move.b 2(a3),22(a0)
  289.     lea $4a(a0),a0        ;Point to next voice's data area
  290.     dbf d6,initloop3
  291.     rts
  292. FC14_Music
  293.     movem.l    d1-a6,-(sp)
  294.     lea    FC_StructAdr(pc),a1
  295.     moveq    #-1,d0
  296.     move.w    d0,UPS_Enabled(a1)
  297.     move.w    #UPSB_Adr!UPSB_LEN!UPSB_Per!UPSB_Vol!UPSB_DMACON,d0
  298.         ;UPSB_Note;UPSB_SNr;UPSB_STy;UPSB_Res
  299.     move.w    d0,UPS_Flags(a1)
  300.     clr.w    UPS_Voice1Per(a1)
  301.     clr.w    UPS_Voice2Per(a1)
  302.     clr.w    UPS_Voice3Per(a1)
  303.     clr.w    UPS_Voice4Per(a1)
  304.  
  305.     bsr.s    PLAY
  306.  
  307.     lea    FC_StructAdr(pc),a1
  308.     clr.w    UPS_Enabled(a1)
  309.  
  310.     movem.l    (a7)+,d1-a6
  311.     moveq    #0,d0
  312.     rts
  313. PLAY:
  314.     lea audtemp(pc),a5
  315.     tst.w 8(a5)
  316.     bne.s music_on
  317.     rts
  318. music_on:
  319.     moveq #6,d6
  320.     subq.w #1,4(a5)            ;Decrease replayspeed counter
  321.     bne.s nonewnote
  322.     move.w 6(a5),4(a5)        ;Restore replayspeed counter
  323.     moveq #0,d5
  324.     lea V1data(pc),a0        ;Point to voice1 data area
  325.     bsr new_note
  326.     lea V2data(pc),a0        ;Point to voice2 data area
  327.     bsr new_note
  328.     lea V3data(pc),a0        ;Point to voice3 data area
  329.     bsr new_note
  330.     lea V4data(pc),a0        ;Point to voice4 data area
  331.     bsr new_note
  332. nonewnote:
  333.     clr.w (a5)
  334.     lea $dff000,a6
  335.     lea V1data(pc),a0
  336.     bsr effects
  337.  
  338.     swap    d0
  339.     move.w    d0,$a6(a6)
  340.     move.w    d0,FC_StructAdr+UPS_Voice1per
  341.     swap    d0
  342.  
  343.     move.w    d0,FC_StructAdr+UPS_Voice1Vol
  344.     mulu    FC_Volvoice1(pc),d0
  345.     lsr.w    #6,d0
  346.     move.w    d0,$a8(a6)
  347.  
  348.     lea V2data(pc),a0
  349.     bsr effects
  350.  
  351.     swap    d0
  352.     move.w    d0,$b6(a6)
  353.     move.w    d0,FC_StructAdr+UPS_Voice2per
  354.     swap    d0
  355.  
  356.     move.w    d0,FC_StructAdr+UPS_Voice2Vol
  357.     mulu    FC_volvoice2(pc),d0
  358.     lsr.w    #6,d0
  359.     move.w    d0,$b8(a6)
  360.  
  361.     lea V3data(pc),a0
  362.     bsr effects
  363.  
  364.     swap    d0
  365.     move.w    d0,$c6(a6)
  366.     move.w    d0,FC_StructAdr+UPS_Voice3per
  367.     swap    d0
  368.     move.w    d0,FC_StructAdr+UPS_Voice3Vol
  369.     mulu    FC_Volvoice3(pc),d0
  370.     lsr.w    #6,d0
  371.     move.w    d0,$c8(a6)
  372.  
  373.     lea V4data(pc),a0
  374.     bsr effects
  375.  
  376.     swap    d0
  377.     move.w    d0,$d6(a6)
  378.     move.w    d0,FC_StructAdr+UPS_Voice4per
  379.     swap    d0
  380.     move.w    d0,FC_StructAdr+UPS_Voice4Vol
  381.     mulu    FC_Volvoice4(pc),d0
  382.     lsr.w    #6,d0
  383.     move.w    d0,$d8(a6)
  384.  
  385.     lea V1data(pc),a0
  386.     move.l 68+(0*74)(a0),a1        ;Get samplepointer
  387.     adda.w 64+(0*74)(a0),a1        ;add repeat_start
  388.     move.l 68+(1*74)(a0),a2
  389.     adda.w 64+(1*74)(a0),a2
  390.     move.l 68+(2*74)(a0),a3
  391.     adda.w 64+(2*74)(a0),a3
  392.     move.l 68+(3*74)(a0),a4
  393.     adda.w 64+(3*74)(a0),a4
  394.     move.w 66+(0*74)(a0),d1        ;Get repeat_length
  395.     move.w 66+(1*74)(a0),d2
  396.     move.w 66+(2*74)(a0),d3
  397.     move.w 66+(3*74)(a0),d4
  398.     moveq #2,d0
  399.     moveq #0,d5
  400.     move.w (a5),d7
  401.     ori.w #$8000,d7            ;Set/clr bit = 1
  402.     move.w d7,$dff096        ;Enable audio DMA
  403. chan1:
  404.     lea V1data+72(pc),a0
  405.     move.w (a0),d7
  406.     beq.s chan2
  407.     subq.w #1,(a0)
  408.     cmp.w d0,d7
  409.     bne.s chan2
  410.     move.w d5,(a0)
  411.     move.l    a1,$a0(a6)        ;Set samplestart
  412.     move.w    d1,$a4(a6)        ;Set samplelength
  413.     move.l    a1,FC_structadr+UPS_Voice1adr
  414.     move.w    d1,FC_structadr+UPS_Voice1len
  415. chan2:
  416.     lea V2data+72(pc),a0
  417.     move.w (a0),d7
  418.     beq.s chan3
  419.     subq.w #1,(a0)
  420.     cmp.w d0,d7
  421.     bne.s chan3
  422.     move.w d5,(a0)
  423.     move.l a2,$b0(a6)
  424.     move.w d2,$b4(a6)
  425.     move.l    a2,FC_structadr+UPS_Voice2adr
  426.     move.w    d2,FC_structadr+UPS_Voice2len
  427. chan3:
  428.     lea V3data+72(pc),a0
  429.     move.w (a0),d7
  430.     beq.s chan4
  431.     subq.w #1,(a0)
  432.     cmp.w d0,d7
  433.     bne.s chan4
  434.     move.w d5,(a0)
  435.     move.l a3,$c0(a6)
  436.     move.w d3,$c4(a6)
  437.     move.l    a3,FC_structadr+UPS_Voice3adr
  438.     move.w    d3,FC_structadr+UPS_Voice3len
  439. chan4:
  440.     lea V4data+72(pc),a0
  441.     move.w (a0),d7
  442.     beq.s endplay
  443.     subq.w #1,(a0)
  444.     cmp.w d0,d7
  445.     bne.s endplay
  446.     move.w d5,(a0)
  447.     move.l a4,$d0(a6)
  448.     move.w d4,$d4(a6)
  449.     move.l    a4,FC_structadr+UPS_Voice4adr
  450.     move.w    d4,FC_structadr+UPS_Voice4len
  451. endplay:
  452.     rts
  453. new_note:
  454.     move.l 34(a0),a1
  455.     adda.w 40(a0),a1
  456.     cmp.b #$49,(a1)        ;Check "END" mark in pattern
  457.     beq.s patend
  458.     cmp.w #64,40(a0)        ;Have all the notes been played?
  459.     bne samepat
  460. patend:
  461.     move.w d5,40(a0)
  462.     move.l (a0),a2
  463.     adda.w 6(a0),a2        ;Point to next sequence row
  464.     cmpa.l 52(a0),a2    ;Is it the end?
  465.     bne.s notend
  466.  
  467.     movem.l    d0-a6,-(sp)
  468.     move.l    dtbase(pc),a5
  469.     move.l    dtg_SongEnd(a5),a2
  470.     jsr    (a2)        ;End Of Song My Master
  471.     movem.l    (sp)+,d0-a6
  472.  
  473.     move.w d5,6(a0)        ;yes!
  474.     move.l (a0),a2        ;Point to first sequence
  475. notend:
  476.     lea spdtemp(pc),a3
  477.     moveq #1,d1
  478.     addq.b #1,(a3)
  479.     cmpi.b #5,(a3)
  480.     bne.s nonewspd
  481.     move.b d1,(a3)
  482.     move.b 12(a2),d1    ;Get new replay speed
  483.     beq.s nonewspd
  484.     move.w d1,2(a3)        ;store in counter
  485.     move.w d1,4(a3)
  486. nonewspd:
  487.     move.b (a2)+,d1        ;Pattern to play
  488.     move.b (a2)+,44(a0)    ;Transpose value
  489.     move.b (a2)+,22(a0)    ;Soundtranspose value
  490.     lsl.w d6,d1
  491.     move.l PATpoint(pc),a1    ;Get pattern pointer
  492.     add.w d1,a1
  493.     move.l a1,34(a0)
  494.     addi.w #$000d,6(a0)
  495. samepat:
  496.     move.b 1(a1),d1        ;Get info byte
  497.     move.b (a1)+,d0        ;Get note
  498.     bne.s ww1
  499.     andi.w #%11000000,d1
  500.     beq.s noport
  501.     bra.s ww11
  502. ww1:
  503.     move.w d5,56(a0)
  504. ww11:
  505.     move.b d5,47(a0)
  506.     btst #7,d1
  507.     beq.s noport
  508.     move.b 2(a1),47(a0)    
  509. noport:
  510.     andi.w #$007f,d0
  511.     beq nextnote
  512.     move.b d0,8(a0)
  513.     move.b (a1),d1
  514.     move.b d1,9(a0)
  515.     move.w 32(a0),d3
  516.     or.w d3,(a5)
  517.     move.w d3,$dff096
  518.     andi.w #$003f,d1    ;Max 64 instruments
  519.     add.b 22(a0),d1        ;add Soundtranspose
  520.     move.l VOLpoint(pc),a2
  521.     lsl.w d6,d1
  522.     adda.w d1,a2
  523.     move.w d5,16(a0)
  524.     move.b (a2),23(a0)
  525.     move.b (a2)+,24(a0)
  526.     moveq #0,d1
  527.     move.b (a2)+,d1
  528.     move.b (a2)+,27(a0)
  529.     move.b #$40,46(a0)
  530.     move.b (a2),28(a0)
  531.     move.b (a2)+,29(a0)
  532.     move.b (a2)+,30(a0)
  533.     move.l a2,10(a0)
  534.     move.l FRQpoint(pc),a2
  535.     lsl.w d6,d1
  536.     adda.w d1,a2
  537.     move.l a2,18(a0)
  538.     move.w d5,50(a0)
  539.     move.b d5,25(a0)
  540.     move.b d5,26(a0)
  541. nextnote:
  542.     addq.w #2,40(a0)
  543.     rts
  544.  
  545. effects:
  546.     moveq #0,d7
  547. testsustain:
  548.     tst.b 26(a0)        ;Is sustain counter = 0
  549.     beq.s sustzero
  550.     subq.b #1,26(a0)    ;if no, decrease counter
  551.     bra VOLUfx
  552. sustzero:        ;Next part of effect sequence
  553.     move.l 18(a0),a1    ;can be executed now.
  554.     adda.w 50(a0),a1
  555. testeffects:
  556.     cmpi.b #$e1,(a1)    ;E1 = end of FREQseq sequence
  557.     beq VOLUfx
  558.     move.b (a1),d0
  559.     cmpi.b #$e0,d0        ;E0 = loop to other part of sequence
  560.     bne.s testnewsound
  561.     move.b 1(a1),d1        ;loop to start of sequence + 1(a1)
  562.     andi.w #$003f,d1
  563.     move.w d1,50(a0)
  564.     move.l 18(a0),a1
  565.     adda.w d1,a1
  566.     move.b (a1),d0
  567. testnewsound:
  568.     cmpi.b #$e2,d0        ;E2 = set waveform
  569.     bne.s testE4
  570.     move.w 32(a0),d1
  571.     or.w d1,(a5)
  572.     move.w d1,$dff096
  573.     moveq #0,d0
  574.     move.b 1(a1),d0
  575.     lea SOUNDINFO,a4
  576.     lsl.w #4,d0
  577.     adda.w d0,a4
  578.     move.l 60(a0),a3
  579.     move.l (a4)+,d1
  580.     move.l d1,(a3)
  581.     move.l d1,68(a0)
  582.     move.w (a4)+,4(a3)
  583.     move.l (a4),64(a0)
  584.     move.w #$0003,72(a0)
  585.     move.w d7,16(a0)
  586.     move.b #$01,23(a0)
  587.     addq.w #2,50(a0)
  588.     bra transpose
  589. testE4:
  590.     cmpi.b #$e4,d0
  591.     bne.s testE9
  592.     moveq #0,d0
  593.     move.b 1(a1),d0
  594.     lea SOUNDINFO,a4
  595.     lsl.w #4,d0
  596.     adda.w d0,a4
  597.     move.l 60(a0),a3
  598.     move.l (a4)+,d1
  599.     move.l d1,(a3)
  600.     move.l d1,68(a0)
  601.     move.w (a4)+,4(a3)
  602.     move.l (a4),64(a0)
  603.     move.w #$0003,72(a0)
  604.     addq.w #2,50(a0)
  605.     bra transpose
  606. testE9:
  607.     cmpi.b #$e9,d0
  608.     bne testpatjmp
  609.     move.w 32(a0),d1
  610.     or.w d1,(a5)
  611.     move.w d1,$dff096
  612.     moveq #0,d0
  613.     move.b 1(a1),d0
  614.     lea SOUNDINFO,a4
  615.     lsl.w #4,d0
  616.     adda.w d0,a4
  617.     move.l (a4),a2
  618.     cmpi.l #"SSMP",(a2)+
  619.     bne.s nossmp
  620.     lea 320(a2),a4
  621.     moveq #0,d1
  622.     move.b 2(a1),d1
  623.     lsl.w #4,d1
  624.     add.w d1,a2
  625.     add.l (a2),a4
  626.     move.l 60(a0),a3
  627.     move.l a4,(a3)
  628.     move.l 4(a2),4(a3)
  629.     move.l a4,68(a0)
  630.     move.l 6(a2),64(a0)
  631.     move.w d7,16(a0)
  632.     move.b #1,23(a0)
  633.     move.w #3,72(a0)
  634. nossmp:
  635.     addq.w #3,50(a0)
  636.     bra.s transpose
  637. testpatjmp:
  638.     cmpi.b #$e7,d0
  639.     bne.s testpitchbend
  640.     moveq #0,d0
  641.     move.b 1(a1),d0
  642.     lsl.w d6,d0
  643.     move.l FRQpoint(pc),a1
  644.     adda.w d0,a1
  645.     move.l a1,18(a0)
  646.     move.w d7,50(a0)
  647.     bra testeffects
  648. testpitchbend:
  649.     cmpi.b #$ea,d0
  650.     bne.s testnewsustain
  651.     move.b 1(a1),4(a0)
  652.     move.b 2(a1),5(a0)
  653.     addq.w #3,50(a0)
  654.     bra.s transpose
  655. testnewsustain:
  656.     cmpi.b #$e8,d0
  657.     bne.s testnewvib
  658.     move.b 1(a1),26(a0)
  659.     addq.w #2,50(a0)
  660.     bra testsustain
  661. testnewvib:
  662.     cmpi.b #$e3,(a1)+
  663.     bne.s transpose
  664.     addq.w #3,50(a0)
  665.     move.b (a1)+,27(a0)
  666.     move.b (a1),28(a0)
  667. transpose:
  668.     move.l 18(a0),a1
  669.     adda.w 50(a0),a1
  670.     move.b (a1),43(a0)
  671.     addq.w #1,50(a0)
  672.  
  673. VOLUfx:
  674.     tst.b 25(a0)
  675.     beq.s volsustzero
  676.     subq.b #1,25(a0)
  677.     bra calcperiod
  678. volsustzero:
  679.     tst.b 15(a0)
  680.     bne.s do_VOLbend
  681.     subq.b #1,23(a0)
  682.     bne.s calcperiod
  683.     move.b 24(a0),23(a0)
  684. volu_cmd:
  685.     move.l 10(a0),a1
  686.     adda.w 16(a0),a1
  687.     move.b (a1),d0
  688. testvoluend:
  689.     cmpi.b #$e1,d0
  690.     beq.s calcperiod
  691.     cmpi.b #$ea,d0
  692.     bne.s testVOLsustain
  693.     move.b 1(a1),14(a0)
  694.     move.b 2(a1),15(a0)
  695.     addq.w #3,16(a0)
  696.     bra.s do_VOLbend
  697. testVOLsustain:
  698.     cmpi.b #$e8,d0
  699.     bne.s testVOLloop
  700.     addq.w #2,16(a0)
  701.     move.b 1(a1),25(a0)
  702.     bra.s calcperiod
  703. testVOLloop:
  704.     cmpi.b #$e0,d0
  705.     bne.s setvolume
  706.     move.b 1(a1),d0
  707.     andi.w #$003f,d0
  708.     subq.b #5,d0
  709.     move.w d0,16(a0)
  710.     bra.s volu_cmd
  711. do_VOLbend:
  712.     not.b 38(a0)
  713.     beq.s calcperiod
  714.     subq.b #1,15(a0)
  715.     move.b 14(a0),d1
  716.     add.b d1,45(a0)
  717.     bpl.s calcperiod
  718.     moveq #0,d1
  719.     move.b d1,15(a0)
  720.     move.b d1,45(a0)
  721.     bra.s calcperiod
  722. setvolume:
  723.     move.b (a1),45(a0)
  724.     addq.w #1,16(a0)
  725. calcperiod:
  726.     move.b 43(a0),d0
  727.     bmi.s lockednote
  728.     add.b 8(a0),d0
  729.     add.b 44(a0),d0
  730. lockednote:
  731.     moveq #$7f,d1
  732.     and.l d1,d0
  733.     lea PERIODS,a1
  734.     add.w d0,d0
  735.     move.w d0,d1
  736.     adda.w d0,a1
  737.     move.w (a1),d0
  738.  
  739.     move.b 46(a0),d7
  740.     tst.b 30(a0)        ;Vibrato_delay = zero ?
  741.     beq.s vibrator
  742.     subq.b #1,30(a0)
  743.     bra.s novibrato
  744. vibrator:
  745.     moveq #5,d2
  746.     move.b d1,d5
  747.     move.b 28(a0),d4
  748.     add.b d4,d4
  749.     move.b 29(a0),d1
  750.     tst.b d7
  751.     bpl.s vib1
  752.     btst #0,d7
  753.     bne.s vib4
  754. vib1:
  755.     btst d2,d7
  756.     bne.s vib2
  757.     sub.b 27(a0),d1
  758.     bcc.s vib3
  759.     bset d2,d7
  760.     moveq #0,d1
  761.     bra.s vib3
  762. vib2:
  763.     add.b 27(a0),d1
  764.     cmp.b d4,d1
  765.     bcs.s vib3
  766.     bclr d2,d7
  767.     move.b d4,d1
  768. vib3:
  769.     move.b d1,29(a0)
  770. vib4:
  771.     lsr.b #1,d4
  772.     sub.b d4,d1
  773.     bcc.s vib5
  774.     subi.w #$0100,d1
  775. vib5:
  776.     addi.b #$a0,d5
  777.     bcs.s vib7
  778. vib6:
  779.     add.w d1,d1
  780.     addi.b #$18,d5
  781.     bcc.s vib6
  782. vib7:
  783.     add.w d1,d0
  784. novibrato:
  785.     eori.b #$01,d7
  786.     move.b d7,46(a0)
  787.  
  788. ; DO THE PORTAMENTO THING
  789.     not.b 39(a0)
  790.     beq.s pitchbend
  791.     moveq #0,d1
  792.     move.b 47(a0),d1    ;get portavalue
  793.     beq.s pitchbend        ;0=no portamento
  794.     cmpi.b #$1f,d1
  795.     bls.s portaup
  796. portadown: 
  797.     andi.w #$1f,d1
  798.     neg.w d1
  799. portaup:
  800.     sub.w d1,56(a0)
  801. pitchbend:
  802.     not.b 42(a0)
  803.     beq.s addporta
  804.     tst.b 5(a0)
  805.     beq.s addporta
  806.     subq.b #1,5(a0)
  807.     moveq #0,d1
  808.     move.b 4(a0),d1
  809.     bpl.s pitchup
  810.     ext.w d1
  811. pitchup:
  812.     sub.w d1,56(a0)
  813. addporta:
  814.     add.w 56(a0),d0
  815.     cmpi.w #$0070,d0
  816.     bhi.s nn1
  817.     move.w #$0071,d0
  818. nn1:
  819.     cmpi.w #$0d60,d0
  820.     bls.s nn2
  821.     move.w #$0d60,d0
  822. nn2:
  823.     swap d0
  824.     move.b 45(a0),d0
  825.     rts
  826.  
  827.  
  828.  
  829. V1data:  dcb.b 64,0    ;Voice 1 data area
  830. offset1: dcb.b 02,0    ;Is added to start of sound
  831. ssize1:  dcb.b 02,0    ;Length of sound
  832. start1:  dcb.b 06,0    ;Start of sound
  833.  
  834. V2data:  dcb.b 64,0    ;Voice 2 data area
  835. offset2: dcb.b 02,0
  836. ssize2:  dcb.b 02,0
  837. start2:  dcb.b 06,0
  838.  
  839. V3data:  dcb.b 64,0    ;Voice 3 data area
  840. offset3: dcb.b 02,0
  841. ssize3:  dcb.b 02,0
  842. start3:  dcb.b 06,0
  843.  
  844. V4data:  dcb.b 64,0    ;Voice 4 data area
  845. offset4: dcb.b 02,0
  846. ssize4:  dcb.b 02,0
  847. start4:  dcb.b 06,0
  848.  
  849. audtemp: dc.w 0        ;DMACON
  850. spdtemp: dc.w 0
  851. respcnt: dc.w 0        ;Replay speed counter 
  852. repspd:  dc.w 0        ;Replay speed counter temp
  853. onoff:   dc.w 0        ;Music on/off flag.
  854.  
  855. Chandata: dc.l $00000000,$00100003,$00200006,$00300009
  856. SEQpoint: dc.l 0
  857. PATpoint: dc.l 0
  858. FRQpoint: dc.l 0
  859. VOLpoint: dc.l 0
  860.  
  861. PERIODS:dc.w $06b0,$0650,$05f4,$05a0,$054c,$0500,$04b8,$0474
  862.     dc.w $0434,$03f8,$03c0,$038a,$0358,$0328,$02fa,$02d0
  863.     dc.w $02a6,$0280,$025c,$023a,$021a,$01fc,$01e0,$01c5
  864.     dc.w $01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d
  865.     dc.w $010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be,$00b4
  866.     dc.w $00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  867.     dc.w $0071,$0071,$0071,$0071,$0071,$0071,$0071,$0071
  868.     dc.w $0071,$0071,$0071,$0071,$0d60,$0ca0,$0be8,$0b40
  869.     dc.w $0a98,$0a00,$0970,$08e8,$0868,$07f0,$0780,$0714
  870.     dc.w $1ac0,$1940,$17d0,$1680,$1530,$1400,$12e0,$11d0
  871.     dc.w $10d0,$0fe0,$0f00,$0e28,$06b0,$0650,$05f4,$05a0
  872.     dc.w $054c,$0500,$04b8,$0474,$0434,$03f8,$03c0,$038a
  873.     dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a
  874.     dc.w $021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d,$0168
  875.     dc.w $0153,$0140,$012e,$011d,$010d,$00fe,$00f0,$00e2
  876.     dc.w $00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f
  877.     dc.w $0087,$007f,$0078,$0071
  878.  
  879.     section    FCchip,data_c
  880.  
  881. silent: dc.w $0100,$0000,$0000,$00e1
  882.  
  883. SOUNDINFO:
  884. ;Start.l , Length.w , Repeat start.w , Repeat-length.w , blk.b 6,0
  885.  
  886.     dcb.b 10*16,0    ;Reserved for samples
  887.     dcb.b 80*16,0    ;Reserved for waveforms
  888.     end
  889.