summaryrefslogtreecommitdiff
path: root/plugins/sid/sidplay-libs/resid/sid.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/sid/sidplay-libs/resid/sid.h')
-rw-r--r--plugins/sid/sidplay-libs/resid/sid.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/plugins/sid/sidplay-libs/resid/sid.h b/plugins/sid/sidplay-libs/resid/sid.h
new file mode 100644
index 00000000..33754547
--- /dev/null
+++ b/plugins/sid/sidplay-libs/resid/sid.h
@@ -0,0 +1,136 @@
+// ---------------------------------------------------------------------------
+// This file is part of reSID, a MOS6581 SID emulator engine.
+// Copyright (C) 2002 Dag Lem <resid@nimrod.no>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// ---------------------------------------------------------------------------
+
+#ifndef __SID_H__
+#define __SID_H__
+
+#include "siddefs.h"
+#include "voice.h"
+#include "filter.h"
+#include "extfilt.h"
+#include "pot.h"
+
+enum
+{ // VC <= 6 patch
+ RESID_FIR_ORDER = 123,
+ RESID_FIR_N = RESID_FIR_ORDER/2 + 1,
+ RESID_FIR_RES = 512,
+ RESID_FIR_SHIFT = 16
+};
+
+RESID_NAMESPACE_START
+
+class SID
+{
+public:
+ SID();
+
+ void set_chip_model(chip_model model);
+ void enable_filter(bool enable);
+ void enable_external_filter(bool enable);
+ bool set_sampling_parameters(double clock_freq, sampling_method method,
+ double sample_freq, double pass_freq = -1);
+ void adjust_sampling_frequency(double sample_freq);
+
+ void fc_default(const fc_point*& points, int& count);
+ PointPlotter<sound_sample> fc_plotter();
+
+ void clock();
+ void clock(cycle_count delta_t);
+ int clock(cycle_count& delta_t, short* buf, int n, int interleave = 1);
+ void reset();
+
+ // Read/write registers.
+ reg8 read(reg8 offset);
+ void write(reg8 offset, reg8 value);
+ void mute(reg8 channel, bool enable);
+
+ // Read/write state.
+ class State
+ {
+ public:
+ State();
+
+ char sid_register[0x20];
+
+ reg8 bus_value;
+ cycle_count bus_value_ttl;
+
+ reg24 accumulator[3];
+ reg24 shift_register[3];
+ reg16 rate_counter[3];
+ reg16 exponential_counter[3];
+ reg8 envelope_counter[3];
+ bool hold_zero[3];
+ };
+
+ State read_state();
+ void write_state(const State& state);
+
+ // 16-bit output.
+ int output();
+ // n-bit output.
+ int output(int bits);
+
+protected:
+ static double I0(double x);
+ RESID_INLINE int clock_fast(cycle_count& delta_t, short* buf, int n,
+ int interleave);
+ RESID_INLINE int clock_interpolate(cycle_count& delta_t, short* buf, int n,
+ int interleave);
+ RESID_INLINE int clock_resample(cycle_count& delta_t, short* buf, int n,
+ int interleave);
+
+ Voice voice[3];
+ Filter filter;
+ ExternalFilter extfilt;
+ Potentiometer potx;
+ Potentiometer poty;
+
+ reg8 bus_value;
+ cycle_count bus_value_ttl;
+
+ double clock_frequency;
+
+ // Sampling variables.
+ cycle_count sample_offset;
+ short sample_prev;
+ unsigned int sample_index;
+ short sample[16384];
+
+ // Sampling constants.
+ // VC <= 6 patch
+ static const int FIR_ORDER;
+ static const int FIR_N;
+ static const int FIR_RES;
+ static const int FIR_SHIFT;
+ sampling_method sampling;
+ cycle_count cycles_per_sample;
+ cycle_count fstep_per_cycle;
+ cycle_count sample_delay;
+ int fir_N;
+ int foffset_max;
+ // VC <= 6 patch
+ short fir[RESID_FIR_N*RESID_FIR_RES + 1];
+ short fir_diff[RESID_FIR_N*RESID_FIR_RES + 1];
+};
+
+RESID_NAMESPACE_STOP
+
+#endif // not __SID_H__