home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / goattracker_2.68.zip / src / resid / sid.h < prev    next >
C/C++ Source or Header  |  2009-01-03  |  4KB  |  152 lines

  1. //  ---------------------------------------------------------------------------
  2. //  This file is part of reSID, a MOS6581 SID emulator engine.
  3. //  Copyright (C) 2004  Dag Lem <resid@nimrod.no>
  4. //
  5. //  This program is free software; you can redistribute it and/or modify
  6. //  it under the terms of the GNU General Public License as published by
  7. //  the Free Software Foundation; either version 2 of the License, or
  8. //  (at your option) any later version.
  9. //
  10. //  This program is distributed in the hope that it will be useful,
  11. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. //  GNU General Public License for more details.
  14. //
  15. //  You should have received a copy of the GNU General Public License
  16. //  along with this program; if not, write to the Free Software
  17. //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18. //  ---------------------------------------------------------------------------
  19. // C64 DTV modifications written by
  20. //   Daniel Kahlin <daniel@kahlin.net>
  21. // Copyright (C) 2007  Daniel Kahlin <daniel@kahlin.net>
  22.  
  23. #ifndef __SID_H__
  24. #define __SID_H__
  25.  
  26. #include "siddefs.h"
  27. #include "voice.h"
  28. #include "filter.h"
  29. #include "extfilt.h"
  30. #include "pot.h"
  31.  
  32. class SID
  33. {
  34. public:
  35.   SID();
  36.   ~SID();
  37.  
  38.   void set_chip_model(chip_model model);
  39.   void enable_filter(bool enable);
  40.   void enable_external_filter(bool enable);
  41.   bool set_sampling_parameters(double clock_freq, sampling_method method,
  42.                    double sample_freq, double pass_freq = -1,
  43.                    double filter_scale = 0.97);
  44.   void adjust_sampling_frequency(double sample_freq);
  45.  
  46.   void fc_default(const fc_point*& points, int& count);
  47.   PointPlotter<sound_sample> fc_plotter();
  48.  
  49.   void clock();
  50.   void clock(cycle_count delta_t);
  51.   int clock(cycle_count& delta_t, short* buf, int n, int interleave = 1);
  52.   void reset();
  53.   
  54.   // Read/write registers.
  55.   reg8 read(reg8 offset);
  56.   void write(reg8 offset, reg8 value);
  57.  
  58.   // Read/write state.
  59.   class State
  60.   {
  61.   public:
  62.     State();
  63.  
  64.     char sid_register[0x20];
  65.  
  66.     reg8 bus_value;
  67.     cycle_count bus_value_ttl;
  68.  
  69.     reg24 accumulator[3];
  70.     reg24 shift_register[3];
  71.     reg16 rate_counter[3];
  72.     reg16 rate_counter_period[3];
  73.     reg16 exponential_counter[3];
  74.     reg16 exponential_counter_period[3];
  75.     reg8 envelope_counter[3];
  76.     EnvelopeGenerator::State envelope_state[3];
  77.     bool hold_zero[3];
  78.   };
  79.     
  80.   State read_state();
  81.   void write_state(const State& state);
  82.  
  83.   // 16-bit input (EXT IN).
  84.   void input(int sample);
  85.  
  86.   // 16-bit output (AUDIO OUT).
  87.   int output();
  88.   // n-bit output.
  89.   int output(int bits);
  90.  
  91. protected:
  92.   static double I0(double x);
  93.   RESID_INLINE int clock_fast(cycle_count& delta_t, short* buf, int n,
  94.                   int interleave);
  95.   RESID_INLINE int clock_interpolate(cycle_count& delta_t, short* buf, int n,
  96.                      int interleave);
  97.   RESID_INLINE int clock_resample_interpolate(cycle_count& delta_t, short* buf,
  98.                           int n, int interleave);
  99.   RESID_INLINE int clock_resample_fast(cycle_count& delta_t, short* buf,
  100.                        int n, int interleave);
  101.  
  102.   Voice voice[3];
  103.   Filter filter;
  104.   ExternalFilter extfilt;
  105.   Potentiometer potx;
  106.   Potentiometer poty;
  107.  
  108.   reg8 bus_value;
  109.   cycle_count bus_value_ttl;
  110.  
  111.   double clock_frequency;
  112.  
  113.   bool is_dtv;
  114.  
  115.   // External audio input.
  116.   int ext_in;
  117.  
  118.   // Resampling constants.
  119.   // The error in interpolated lookup is bounded by 1.234/L^2,
  120.   // while the error in non-interpolated lookup is bounded by
  121.   // 0.7854/L + 0.4113/L^2, see
  122.   // http://www-ccrma.stanford.edu/~jos/resample/Choice_Table_Size.html
  123.   // For a resolution of 16 bits this yields L >= 285 and L >= 51473,
  124.   // respectively.
  125.   enum { FIR_N = 125 };
  126.   enum { FIR_RES_INTERPOLATE = 285 };
  127.   enum { FIR_RES_FAST = 51473 };
  128.   enum { FIR_SHIFT = 15 };
  129.   enum { RINGSIZE = 16384 };
  130.  
  131.   // Fixpoint constants (16.16 bits).
  132.   enum { FIXP_SHIFT = 16 };
  133.   enum { FIXP_MASK = 0xffff };
  134.  
  135.   // Sampling variables.
  136.   sampling_method sampling;
  137.   cycle_count cycles_per_sample;
  138.   cycle_count sample_offset;
  139.   int sample_index;
  140.   short sample_prev;
  141.   int fir_N;
  142.   int fir_RES;
  143.  
  144.   // Ring buffer with overflow for contiguous storage of RINGSIZE samples.
  145.   short* sample;
  146.  
  147.   // FIR_RES filter tables (FIR_N*FIR_RES).
  148.   short* fir;
  149. };
  150.  
  151. #endif // not __SID_H__
  152.