/**************************************************************
   Psudo Explode Sound Module for "FPGA Xevious"

      Written by Tsuyoshi HASEGAWA <t-haseg@lares.dti.ne.jp>
***************************************************************/
module XEVIOUS_EXPSND(

   input             RESET,

   input             PCMCLKx2,
   output [16:0]     PCMAD,
   input   [7:0]     PCMDT,

   input             KICK_EXP0,
   input             KICK_EXP1,

   output            PCMPLAY,
   output reg [7:0]  PCMOUT

);

reg         phase;

reg [16:0]  pcmadr0;
reg [16:0]  pcmadr1;

reg [15:0]  pcmlen0;
reg [15:0]  pcmlen1;

reg  [7:0]  pcmout0 = 8'h80;
reg  [7:0]  pcmout1 = 8'h80;

wire        pcmplay0 = ( pcmlen0 != 0 );
wire        pcmplay1 = ( pcmlen1 != 0 );

wire [8:0]  pcmmix   = pcmout0 + pcmout1;

assign      PCMPLAY  = pcmplay0 | pcmplay1;

busdriver   adrsbus( 1'b1, phase, pcmadr1, pcmadr0, PCMAD );

always @ ( posedge PCMCLKx2 or posedge RESET ) begin

   if ( RESET ) begin

      phase   <= 0;

      pcmadr0 <= 0;
      pcmlen0 <= 0;
      pcmout0 <= 8'h80;

      pcmadr1 <= 0;
      pcmlen1 <= 0;
      pcmout1 <= 8'h80;

   end
   else begin

      if ( KICK_EXP0 ) begin
         pcmadr0 <= 0;
         pcmlen0 <= 9845;
      end

      if ( KICK_EXP1 ) begin
         pcmadr1 <= 17'h2680;
         pcmlen1 <= 17951;
      end

      case ( phase ) 

      0: begin
            PCMOUT <= pcmmix[8:1];

            if ( pcmplay0 ) begin
               pcmout0 <= PCMDT;
               pcmadr0 <= pcmadr0+1;
               pcmlen0 <= pcmlen0-1;
            end
         end

      1: begin
            if ( pcmplay1 ) begin
               pcmout1 <= PCMDT;
               pcmadr1 <= pcmadr1+1;
               pcmlen1 <= pcmlen1-1;
            end
         end

      default:;

      endcase

      phase <= phase+1;

   end

end

endmodule

