/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2016 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DAC_H #define DAC_H #include "siddefs-fp.h" namespace reSIDfp { /** * Estimate DAC nonlinearity. * The SID DACs are built up as R-2R ladder as follows: * * n n-1 2 1 0 VGND * | | | | | | Termination * 2R 2R 2R 2R 2R 2R only for * | | | | | | MOS 8580 * Vo --R---R--...--R---R-- --- * * * All MOS 6581 DACs are missing a termination resistor at bit 0. This causes * pronounced errors for the lower 4 - 5 bits (e.g. the output for bit 0 is * actually equal to the output for bit 1), resulting in DAC discontinuities * for the lower bits. * In addition to this, the 6581 DACs exhibit further severe discontinuities * for higher bits, which may be explained by a less than perfect match between * the R and 2R resistors, or by output impedance in the NMOS transistors * providing the bit voltages. A good approximation of the actual DAC output is * achieved for 2R/R ~ 2.20. * * The MOS 8580 DACs, on the other hand, do not exhibit any discontinuities. * These DACs include the correct termination resistor, and also seem to have * very accurately matched R and 2R resistors (2R/R = 2.00). */ class Dac { private: /// analog values double * const dac; /// the dac array length const unsigned int dacLength; public: /** * Initialize DAC model. * * @param bits the number of input bits */ Dac(unsigned int bits); ~Dac(); /** * Build DAC model for specific chip. * * @param chipModel 6581 or 8580 */ void kinkedDac(ChipModel chipModel); /** * Get the Vo output for a given combination of input bits. * * @param input the digital input * @return the analog output value */ double getOutput(unsigned int input) const; }; } // namespace reSIDfp #endif