00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef SIDFP_H
00024 #define SIDFP_H
00025
00026 #include "residfp-config.h"
00027
00028 namespace reSIDfp
00029 {
00030
00031 class Filter;
00032 class Filter6581;
00033 class Filter8580;
00034 class ExternalFilter;
00035 class Potentiometer;
00036 class Voice;
00037 class Resampler;
00038
00042 class SIDError
00043 {
00044 private:
00045 const char* message;
00046
00047 public:
00048 SIDError(const char* msg) :
00049 message(msg) {}
00050 const char* getMessage() { return message; }
00051 };
00052
00064 class SID
00065 {
00066 private:
00070 static const int BUS_TTL;
00071
00073 Filter* filter;
00074
00076 Filter6581* filter6581;
00077
00079 Filter8580* filter8580;
00080
00085 ExternalFilter* externalFilter;
00086
00090 Resampler* resampler;
00091
00093 Potentiometer* potX;
00094
00096 Potentiometer* potY;
00097
00099 Voice* voice[3];
00100
00102 int busValueTtl;
00103
00107 int nextVoiceSync;
00108
00110 int delayedOffset;
00111
00115 ChipModel model;
00116
00118 unsigned char delayedValue;
00119
00121 unsigned char busValue;
00122
00123 bool muted[3];
00124
00125 private:
00132 void writeImmediate(int offset, unsigned char value);
00133
00139 void ageBusValue(int n);
00140
00146 int output() const;
00147
00154 void voiceSync(bool sync);
00155
00156 public:
00157 SID();
00158 ~SID();
00159
00165 void setChipModel(ChipModel model);
00166
00167 ChipModel getChipModel() const { return model; }
00168
00172 void reset();
00173
00182 void input(int value);
00183
00204 unsigned char read(int offset);
00205
00212 void write(int offset, unsigned char value);
00213
00220 void mute(int channel, bool enable) { muted[channel] = enable; }
00221
00246 void setSamplingParameters(double clockFrequency, SamplingMethod method, double samplingFrequency, double highestAccurateFrequency);
00247
00255 int clock(int cycles, short* buf);
00256
00267 void clockSilent(int cycles);
00268
00274 Filter6581* getFilter6581() const { return filter6581; }
00275
00281 Filter8580* getFilter8580() const { return filter8580; }
00282 };
00283
00284 }
00285
00286 #if RESID_INLINING || defined(SID_CPP)
00287
00288 #include <algorithm>
00289
00290 #include "Filter.h"
00291 #include "ExternalFilter.h"
00292 #include "Voice.h"
00293 #include "resample/Resampler.h"
00294
00295 namespace reSIDfp
00296 {
00297 RESID_INLINE
00298 int SID::output() const
00299 {
00300 return externalFilter->clock(
00301 filter->clock(
00302 voice[0]->output(voice[2]->wave()),
00303 voice[1]->output(voice[0]->wave()),
00304 voice[2]->output(voice[1]->wave())
00305 )
00306 );
00307 }
00308
00309
00310 RESID_INLINE
00311 int SID::clock(int cycles, short* buf)
00312 {
00313 ageBusValue(cycles);
00314 int s = 0;
00315
00316 while (cycles != 0)
00317 {
00318 int delta_t = std::min(nextVoiceSync, cycles);
00319
00320 if (delta_t > 0)
00321 {
00322 if (delayedOffset != -1)
00323 {
00324 delta_t = 1;
00325 }
00326
00327 for (int i = 0; i < delta_t; i ++)
00328 {
00329 if (resampler->input(output()))
00330 {
00331 buf[s++] = resampler->getOutput();
00332 }
00333
00334
00335 voice[0]->wave()->clock();
00336 voice[1]->wave()->clock();
00337 voice[2]->wave()->clock();
00338
00339
00340 voice[0]->envelope()->clock();
00341 voice[1]->envelope()->clock();
00342 voice[2]->envelope()->clock();
00343 }
00344
00345 if (delayedOffset != -1)
00346 {
00347 writeImmediate(delayedOffset, delayedValue);
00348 delayedOffset = -1;
00349 }
00350
00351 cycles -= delta_t;
00352 nextVoiceSync -= delta_t;
00353 }
00354
00355 if (nextVoiceSync == 0)
00356 {
00357 voiceSync(true);
00358 }
00359 }
00360
00361 return s;
00362 }
00363
00364 }
00365
00366 #endif
00367
00368 #endif