Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/Dac.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ double Dac::getOutput(unsigned int input, bool saturate) const
return dacValue;
}

void Dac::kinkedDac(ChipModel chipModel)
void Dac::kinkedDac(ChipModel chipModel, double leakLevel)
{
constexpr double R_INFINITY = 1e6;

Expand All @@ -79,7 +79,7 @@ void Dac::kinkedDac(ChipModel chipModel)
// 6581 DACs are not terminated by a 2R resistor
const bool term = chipModel == CSG8580;

leakage = chipModel == MOS6581 ? MOSFET_LEAKAGE_6581 : MOSFET_LEAKAGE_8580;
leakage = leakLevel * (chipModel == MOS6581 ? MOSFET_LEAKAGE_6581 : MOSFET_LEAKAGE_8580);

double Vsum = 0.;

Expand Down
3 changes: 2 additions & 1 deletion src/Dac.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,9 @@ class Dac
* Build DAC model for specific chip.
*
* @param chipModel 6581 or 8580
* @param leakLevel the level of the transistor leakage
*/
void kinkedDac(ChipModel chipModel);
void kinkedDac(ChipModel chipModel, double leakLevel=1.0);

/**
* Get the Vo output for a given combination of input bits.
Expand Down
17 changes: 15 additions & 2 deletions src/SID.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

#include "SID.h"

#include <algorithm>
#include <limits>

#include "array.h"
Expand Down Expand Up @@ -142,6 +143,7 @@ SID::SID() :
filter8580(new Filter8580()),
resampler(nullptr),
cws(AVERAGE),
dacLeakage(1.0),
p(new Params)
{
voice[0].setOtherVoices(voice[2], voice[1]);
Expand Down Expand Up @@ -252,7 +254,7 @@ void SID::setChipModel(ChipModel new_model)
// calculate envelope DAC table
{
Dac dacBuilder(ENV_DAC_BITS);
dacBuilder.kinkedDac(model);
dacBuilder.kinkedDac(model, dacLeakage);

for (unsigned int i = 0; i < (1 << ENV_DAC_BITS); i++)
{
Expand All @@ -265,7 +267,7 @@ void SID::setChipModel(ChipModel new_model)

{
Dac dacBuilder(OSC_DAC_BITS);
dacBuilder.kinkedDac(model);
dacBuilder.kinkedDac(model, dacLeakage);

//const double offset = dacBuilder.getOutput(is6581 ? OFFSET_6581 : OFFSET_8580);
const double offset = dacBuilder.getOutput(is6581 ? OFFSET_6581 : 0x7ff, is6581);
Expand Down Expand Up @@ -614,4 +616,15 @@ void SID::setPaddle(uint8_t x, uint8_t y)
paddleY = y;
}


void SID::setDacLeakage(double level)
{
#ifdef HAVE_CXX17
dacLeakage = std::clamp(level, 0.0, 1.0);
#else
dacLeakage = std::max(std::min(level, 1.0), 0.0);
#endif
setChipModel(model);
}

} // namespace reSIDfp
8 changes: 8 additions & 0 deletions src/SID.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ class SID
/// Currently selected combined waveforms strength.
CombinedWaveforms cws;

// Dac leakage
double dacLeakage;

/// Last written value
uint8_t busValue;

Expand Down Expand Up @@ -358,6 +361,11 @@ class SID
* Set paddle coordinates.
*/
void setPaddle(uint8_t x, uint8_t y);

/*
* Set the DAC leakage level.
*/
void setDacLeakage(double level);
};

} // namespace reSIDfp
Expand Down
2 changes: 2 additions & 0 deletions src/State.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ int State::saveState(SID &s, char* buffer, int size)
state.env3[i] = envelope->env3;
}

state.dacLeakage = s.dacLeakage;
state.bus_value = s.busValue;
state.bus_value_ttl = s.busValueTtl;
state.nextVoiceSync = s.nextVoiceSync;
Expand Down Expand Up @@ -194,6 +195,7 @@ void State::restoreState(SID &s, char* buffer, int size)
State state;
std::memcpy(&state, buffer, cnt);

s.dacLeakage = state.dacLeakage;
s.busValue = state.bus_value;
s.busValueTtl = state.bus_value_ttl;
s.nextVoiceSync = state.nextVoiceSync;
Expand Down
1 change: 1 addition & 0 deletions src/State.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ struct State
unsigned int nextVoiceSync;
ChipModel model;
CombinedWaveforms cws;
double dacLeakage;
uint8_t bus_value;
uint8_t paddle_x;
uint8_t paddle_y;
Expand Down
5 changes: 5 additions & 0 deletions src/residfp/residfp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,8 @@ void residfp::restoreState(char* buffer, int size)
{
State::restoreState(sid, buffer, size);
}

void residfp::setDacLeakage(double level)
{
sid.setDacLeakage(level);
}
10 changes: 10 additions & 0 deletions src/residfp/residfp.h
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,16 @@ class RESIDFP_EXTERN residfp
* @since 1.1
*/
void restoreState(char* buffer, int size);

/**
* Set the DAC leakage level.
* Affects the envelope and waveforms.
*
* @param level the leakage level, between 0 (no leakage) and 1
*
* @since 1.2
*/
void setDacLeakage(double level);
};

}
Expand Down
Loading