| 
    
       #include "stdio.h"
 
     | 
  
  
     | 
    
       #include "stdlib.h"
 
     | 
  
  
     | 
    
       #include <math.h>
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       unsigned short data[] = 
 
     | 
  
  
     | 
    
       {
 
     | 
  
  
     | 
    
       #include "SID/investigation/sidsimplify.out"
 
     | 
  
  
     | 
    
       };
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       int main(void)
 
     | 
  
  
     | 
    
       {
 
     | 
  
  
     | 
    
       	unsigned short * buffer = (unsigned short *) malloc(16384*2*2); //16-bit, 2 copies
 
     | 
  
  
     | 
    
       	int i=0;
 
     | 
  
  
     | 
    
       	for (i=0;i!=32768;++i)
 
     | 
  
  
     | 
    
       	{
 
     | 
  
  
     | 
    
       		//buffer[i] = i;
 
     | 
  
  
     | 
    
       		//buffer[16384+i] = i;
 
     | 
  
  
     | 
    
       		buffer[i] = data[i];
 
     | 
  
  
     | 
    
       	}
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       	// 0x100(0x400 8-bit) sid tables --TODO!!
 
     | 
  
  
     | 
    
       	// to store: 
 
     | 
  
  
     | 
    
       	// i) 6581 channel mixing:
 
     | 
  
  
     | 
    
       	// 	wire [7:0] wave__st[4096]; (sawtooth + triangle)
 
     | 
  
  
     | 
    
       	// 	wire [7:0] wave_p_t[2048]; (pulse + triangle - symmetric)
 
     | 
  
  
     | 
    
       	// 	wire [7:0] wave_ps_[4096]; (pulse + sawtooth)
 
     | 
  
  
     | 
    
       	// 	wire [7:0] wave_pst[4096]; (pulse + sawtooth + triangle)
 
     | 
  
  
     | 
    
       	// 	        _st_out <= wave__st[sawtooth]; 
 
     | 
  
  
     | 
    
               //		p_t_out <= wave_p_t[triangle[11:1]];
 
     | 
  
  
     | 
    
               //		ps__out <= wave_ps_[sawtooth];
 
     | 
  
  
     | 
    
               //		pst_out <= wave_pst[sawtooth];
 
     | 
  
  
     | 
    
       	//	              4'b0001: wave_out = triangle;
 
     | 
  
  
     | 
    
               //  		      4'b0010: wave_out = sawtooth;
 
     | 
  
  
     | 
    
               //  		      4'b0011: wave_out = {_st_out, 4'b0000};
 
     | 
  
  
     | 
    
               //  		      4'b0100: wave_out = pulse;
 
     | 
  
  
     | 
    
               //  		      4'b0101: wave_out = {p_t_out, 4'b0000} & pulse;
 
     | 
  
  
     | 
    
               //  		      4'b0110: wave_out = {ps__out, 4'b0000} & pulse;
 
     | 
  
  
     | 
    
               //  		      4'b0111: wave_out = {pst_out, 4'b0000} & pulse;
 
     | 
  
  
     | 
    
               //  		      4'b1000: wave_out = noise;
 
     | 
  
  
     | 
    
               //  		      default: wave_out = 0;
 
     | 
  
  
     | 
    
       	// ii) 8580 channel mixing: just and?
 
     | 
  
  
     | 
    
       	// iii) linear filter
 
     | 
  
  
     | 
    
       	// iv) 6581 filter frequency table
 
     | 
  
  
     | 
    
       	// v) 8580 filter frequency table
 
     | 
  
  
     | 
    
       	// vi) 6581 volume non-linearity filter adjustment
 
     | 
  
  
     | 
    
       	
 
     | 
  
  
     | 
    
       //      CLKSPEED : IN integer; --In Hz 58333333
 
     | 
  
  
     | 
    
       //      FMIN : IN integer;   --In Hz (30)
 
     | 
  
  
     | 
    
       //      FMAX : IN integer   --In Hz (12500 on 8580)
 
     | 
  
  
     | 
    
       //      process(CUTOFF_FREQUENCY)
 
     | 
  
  
     | 
    
       //              constant f_min : real := 2.0*sin(MATH_PI*real(FMIN)/real(CLKSPEED));
 
     | 
  
  
     | 
    
       //              constant f_max : real := 2.0*sin(MATH_PI*real(FMAX)/real(CLKSPEED));
 
     | 
  
  
     | 
    
       //
 
     | 
  
  
     | 
    
       //              variable f_offset : unsigned(17 downto 0); --0.21(000,18)
 
     | 
  
  
     | 
    
       //              variable f_scale : unsigned(17 downto 0); --0.21(000,18)
 
     | 
  
  
     | 
    
       //
 
     | 
  
  
     | 
    
       //              variable F_MULT : UNSIGNED(35 DOWNTO 0);
 
     | 
  
  
     | 
    
       //      begin
 
     | 
  
  
     | 
    
       //              --f = 2*sin(pi*10000/inrate);
 
     | 
  
  
     | 
    
       //              --CUTOFF_FREQUENCY : IN STD_LOGIC_VECTOR(10 downto 0);
 
     | 
  
  
     | 
    
       //              --CLKSPEED : IN integer; --In Hz
 
     | 
  
  
     | 
    
       //              --FMIN : IN integer;   --In Hz
 
     | 
  
  
     | 
    
       //              --FMAX : IN integer;   --In Hz
 
     | 
  
  
     | 
    
       //
 
     | 
  
  
     | 
    
       //              f_offset := to_unsigned(integer(f_min*2.0**21.0),18);
 
     | 
  
  
     | 
    
       //              f_scale  := to_unsigned(integer(2.0**21.0*((f_max-f_min)/2.0**11.0)),18);
 
     | 
  
  
     | 
    
       //
 
     | 
  
  
     | 
    
       //              -- TODO: Could use a real curve captured from a chip? Lets start with it correctly then...
 
     | 
  
  
     | 
    
       //              f_mult := f_scale * resize(unsigned(CUTOFF_FREQUENCY),18);
 
     | 
  
  
     | 
    
       //              f_next <= f_mult(17 downto 0) + f_offset;
 
     | 
  
  
     | 
    
       //      end process;
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       	FILE * x =fopen("sidwavedata.bin","w");
 
     | 
  
  
     | 
    
       		fwrite(&buffer[0],1,65536,x);
 
     | 
  
  
     | 
    
       	fclose(x);
 
     | 
  
  
     | 
    
       
     | 
  
  
     | 
    
       	return 0;
 
     | 
  
  
     | 
    
       }
 
     | 
  
  
     | 
    
       
     |