2010-??-??  Dag Lem  <resid@nimrod.no>

	* Version 1.0 released.

	* configure.ac: Updated to current autoconf/automake standards.
	New option --enable-arch for gcc architecture specific
	optimizations, including vectorization. New option
	--enable-branch-hints for branch prediction optimizations.

	* Makefile.am, samp2src.pl: Generate header files instead of
	source files for waveform samples. Added dac.h, dac.cc.

	* siddefs.h.in: Sampling method names now better reflect their
	operation (SAMPLE_RESAMPLE_INTERPOLATE -> SAMPLE_RESAMPLE,
	SAMPLE_RESAMPLE_FAST -> SAMPLE_RESAMPLE_FASTMEM).
	New macros for branch prediction: likely / unlikely.

	* dac.h: New file; accurate emulation of non-monotonic MOS 6581
	D/A converters.

	* dac.cc: New file; accurate emulation of non-monotonic MOS 6581
	D/A converters.

	* envelope.h (EnvelopeGenerator::clock): Emulation of one cycle
	pipeline delay in the exponential frequency divider.
	(EnvelopeGenerator::output): Emulation of non-ideal DAC output.
	(EnvelopeGenerator::set_chip_model): New function; for emulation
	of DAC imperfections.
	(EnvelopeGenerator::set_exponential_counter): New function;
	modularization of exponential counter update.

	* envelope.cc (EnvelopeGenerator::EnvelopeGenerator):
	Initialization of DAC lookup tables.
	(EnvelopeGenerator::readENV): Return envelope_counter directly, in
	order to allow EnvelopeGenerator::output to emulate DAC
	imperfections.
	(EnvelopeGenerator::reset): Initialization of new
	variables.
	(EnvelopeGenerator::set_chip_model): New function; for emulation
	of DAC imperfections.
	(EnvelopeGenerator::writeCONTROL_REG): Flush of exponential
	frequency divider pipeline on attack.

	* extfilt.h (ExternalFilter::clock): Cutoff frequency fixed point
	accuracy is traded off for for vastly improved filter signal
	fixed point accuracy.
	(ExternalFilter::output): Output range reduced from 20 to 16
	bits.

	* extfilt.cc (ExternalFilter::ExternalFilter): Assumes audio
	equipment impedance of 10kOhm, yielding a high-pass 3-dB frequency
	of 1.6Hz (changed from 16Hz). Cutoff frequency fixed point accuracy
	is traded off for for vastly improved filter signal fixed point
	accuracy.
	(ExternalFilter::set_chip_model): Removed. Remaining DC levels can
	only be canceled by enabling the external filter (or by similar
	post processing).

	* filter.h: Major rewrite implementing an accurate model of the
	actual filter and output stage topology, including models for
	op-amps, input and feedback NMOS FET "resistors", and voltage
	controlled resistors (VCRs).
	(Filter::input): New interface to set external input level.
	(Filter::output): Output range reduced from 20 to 16 bits.
	(Filter::set_voice_mask): New function. Emulation of physical
	connection of EXT IN, and voice muting for test purposes.
	(Filter::solve_gain): New function; iterative solver using
	Newton-Raphson and bisection to calculate gain for SID op-amp
	gains and summers using NMOS FETs as input and feedback "resistors".
	(Filter::solve_integrate): New function; one-step fixpoint solver
	to calculate output from SID op-amp integrators using VCRs built
	from four NMOS FETs as inputs.

	* filter.cc: Major rewrite implementing an accurate model of the
	actual filter and output stage topology, including models for
	op-amps, input and feedback NMOS FET "resistors", and voltage
	controlled resistors (VCRs).
	(Filter::set_voice_mask): New function. Emulation of physical
	connection of EXT IN, and voice muting for test purposes.

	* sid.h: Resampling constants declared in enum.
	(SID::State): Added voice_mask, shift_register_reset,
	shift_pipeline, pulse_output, floating_output_ttl,
	envelope_pipeline.
	(SID::output): 16 bit output range only, n-bit interface
	removed.
	(SID::clock_resample): Renamed from
	SID::clock_resample_interpolate.
	(SID::clock_resample_fastmem): Renamed from
	SID::clock_resample_fast.

	* sid.cc (SID::clock): Emulation of one cycle pipeline write delay
	for the MOS8580.
	(SID::clock_resample): Renamed from SID::clock_resample_interpolate.
	Corrected bug in FIR table wraparound, courtesy of Antti Lankila.
	(SID::clock_resample_fastmem): Renamed from
	SID::clock_resample_fast.
	(SID::input): Hand off all processing of the external input to the
	filter.
	(SID::output): 16 bit output range only, n-bit output interface
	removed.
	(SID::read): Aging time for bus value increased from 0x2000 to
	0x4000 cycles.
	(SID::read_state, SID::write_state): Added voice_mask,
	shift_register_reset, shift_pipeline, pulse_output,
	floating_output_ttl, envelope_pipeline.
	(SID::set_voice_mask): New function. Emulation of physical
	connection of EXT IN, and voice muting for test purposes.
	(SID::write): Emulation of one cycle pipeline write delay for the
	MOS8580.
	(SID::write_pipeline): New function. Emulation of one cycle
	pipeline write delay for the MOS8580.

	* spline.h (PointPlotter::operator()): Rounding to nearest
	integer.

	* voice.h (Voice::output): Handling of DC for waveform "zero"
	level moved to Filter::clock.

	* voice.cc (Voice::set_chip_model): Call set_chip_model for
	envelope generator. Handling of DC for "zero" level moved to
	Filter::set_chip_model.

	* wave.h (WaveformGenerator::clock): Corrected shift register
	model. Emulation of reset time for the shift register. Emulation
	of two cycle pipeline delay for accumulator bit 19 to shift the
	shift register.
	(WaveformGenerator::clock_shift_register)
	(WaveformGenerator::write_shift_register)
	(WaveformGenerator::reset_shift_register)
	(WaveformGenerator::set_noise_output): New functions. Emulation
	of writes to the shift register by combined waveforms.
	(WaveformGenerator::set_waveform_output): New function. Emulation
	of floating DAC input with aging. Emulation of one cycle pipeline
	delay for the pulse width comparator to change the pulse
	level. Emulation of writes to the shift register by combined
	waveforms. Highly optimized waveform calculation using nearly
	branch-free table lookup for all waveforms; replaces 16 previous
	waveform functions named WaveformGenerator::outputXXXX.
	(WaveformGenerator::output): Emulation of non-ideal DAC output.

	* wave.cc (WaveformGenerator::WaveformGenerator): Initialization
	of lookup tables for basic waveforms and DACs.
	(WaveformGenerator::readOSC): Return waveform_output directly, in
	order to allow WaveformGenerator::output to emulate DAC
	imperfections.
	(WaveformGenerator::set_chip_model): Update pointer to current
	waveform table.
	(WaveformGenerator::writePW_LO, WaveformGenerator::writePW_HI):
	Push next pulse level into pulse level pipeline.
	(WaveformGenerator::writeCONTROL_REG): Emulation of the effects of
	the test bit on the shift register (shifting, reset time).
	Emulation of fading time for floating DAC input (waveform 0).
	Update pointer to current waveform table.
	(WaveformGenerator::reset): Initialization of new variables.

2004-06-11  Dag Lem  <resid@nimrod.no>

	* Version 0.16 released.

	* envelope.h (EnvelopeGenerator::clock): Corrected off-by-one
	error in check for ADSR delay bug in delta_t cycle interface.

	* filter.cc (Filter::set_chip_model): Initialize filter cutoff
	mappings before call to set_chip_model.

	* sid.cc (SID::set_sampling_parameters): Build shifted FIR tables
	with samples according to the sampling frequency.
	(SID::clock_resample_interpolate): New function; factorized linear
	interpolation out from filter convolutions, and made convolutions
	vectorizable.
	(SID::clock_resample_fast): New function; single convolution, same
	accuracy as with interpolation by using more filter tables.
	(SID::State, SID::read_state, SID::write_state): Read and write
	rate_counter_period and exponential_counter_period. Read sustain
	value.

2003-10-20  Dag Lem  <resid@nimrod.no>

	* Version 0.15 released.

	* envelope.h (EnvelopeGenerator): Added public State enum.
	(EnvelopeGenerator::clock): Rate counter is 15 bits, count
	rate_period - 1 after wrapping from 0x8000 to 0 in ADSR delay bug.

	* sid.cc, sid.h (SID::State): Added envelope_state.
	(SID::State::write_state): Restore register 0x18.
	(SID::set_sampling_parameters): Scale resampling filter to avoid
	clipping.
	(SID::clock_resample): Saturated arithmetics to avoid clipping.

2002-12-31  Dag Lem  <resid@nimrod.no>

	* Version 0.14 released.

	* envelope.h (EnvelopeGenerator::clock): Corrected one cycle error
	in ADSR delay bug. Only load the exponential counter period at the
	envelope counter values 255, 93, 54, 26, 14, 6, 0.

	* filter.cc (Filter::set_chip_model): Call set_w0() and set_Q() to
	update filter settings.
	(Filter::set_w0): Limit cutoff frequency for both 1 cycle and
	delta_t cycle filter.

	* filter.h (Filter::clock): Mix in external audio input.

	* sid.cc, sid.h (SID::input): New function; accepts external audio
	input sample.

	* spline.h (PointPlotter::operator ()): Clamp negative values to
	zero.

	* voice.cc, voice.h: Changed misleading name wave_DC to wave_zero.

	* wave.h (WaveformGenerator::clock): Corrected bug in check for
	accumulator bit 19 in noise register shift.

2002-01-19  Dag Lem  <resid@nimrod.no>

	* Version 0.13 released.

	* configure.in: Replaced AC_TRY_COMPILER with AC_TRY_COMPILE,
	removed AC_PROG_RANLIB.

	* envelope.h (EnvelopeGenerator::clock): Reset rate_step on state
	change.

	* extfilt.cc (ExternalFilter::set_chip_model): New calculation of
	maximum mixer DC level.

	* filter.cc (Filter::set_chip_model): Moved calculation of
	voice_DC to voice.cc, corrected calculation of mixer_DC.

	* filter.h (Filter::output): Mixer output is not inverted.

	* sid.cc (SID::set_chip_model): Call voice.set_chip_model instead
	of voice.wave.set_chip_model.

	* voice.cc (Voice::Voice): Call set_chip_model.
	(Voice::set_chip_model): New function; model both waveform D/A
	converter and envelope multiplying D/A converter DC offsets.

	* voice.h (Voice::output): Add both waveform D/A converter and
	envelope multiplying D/A converter DC offsets.

	* wave.h (WaveformGenerator::output____): Reverted to output
	minimum wave level when no waveform is selected. The maximum and
	minimum wave output levels are interchanged in C= Hacking Issue	#20.

2001-10-20  Dag Lem  <resid@nimrod.no>

	* Version 0.12 released.

	* envelope.cc, envelope.h, filter.cc, filter.h, wave.cc, wave.h:
	Removed bool usage. This avoids unnecessary conversion to 1/0.

	* filter.cc (Filter::set_chip_model): New function; selects voice
	and mixer DC offsets and mapping from the FC registers to filter
	cutoff frequency. The voice and mixer DC offsets for the MOS6581 are
	calculated from	measurements made by Hársfalvi, Levente in
	C= Hacking Issue #20.
	(Filter::Filter): Call set_chip_model.
	(Filter::f0_6581, Filter::f0_8580): Separate FC mapping tables.
	(Filter::f0_points_6581, Filter::f0_points_8580): Separate FC mapping
	points.

	* extfilt.cc, extfilt.h (ExternalFilter::set_chip_model): New
	function supporting separate DC correction for MOS6581 and MOS8580.

	* sid.cc, sid.h (SID::adjust_sampling_frequency): New function for
	on-the-fly adjustment of sampling frequency.
	(SID::clock_fast): Corrected sample calculation.
	(SID::set_chip_model): Set filter chip model.
	(SID::output): Added audio clipping.
	(SID::clock, SID::clock_fast, SID::clock_interpolate,
	SID::clock_resample): Added sample interleaving.

	* spline.h (interpolate): Generalized to accept repeated points to
	introduce points of non-differentiability and discontinuity.

	* wave.h (WaveformGenerator::output____): No selected waveform
	yields maximum wave output level. This was found by Hársfalvi,
	Levente in C= Hacking Issue #20.
	(WaveformGenerator::clock): Optimized for speed (no division).

2001-03-10  Dag Lem  <resid@nimrod.no>

	* Version 0.11 released.

	* configure.in: Disable building of shared library by default.
	Control inlining with RESID_INLINING (0 or 1) and RESID_INLINE
	(blank or "inline").

	* envelope.h, extfilt.h, filter.h, voice.h, wave.h: inline keyword
	in both function declarations and function definitions.

	* samp2src.pl: Beautified Perl code.

	* sid.h, sid.cc: Replaced voice variables with array. Removed
	filter variables from SID::State.
	(SID::clock): New audio sample generating interface. Three
	clocking methods are available; clocking at output sample
	frequency, clocking at cycle frequency with linear sample
	interpolation, and clocking at cycle frequency with audio
	resampling.
	(SID::clock_fast, SID::clock_interpolate, SID::clock_resample):
	New functions called by SID::clock.
	(SID::set_sampling_parameters): New function to set up SID for
	sample generation. The FIR table used in SID::clock_resample is
	calculated here.
	(SID::I0): 0th order modified Bessel function to calculate Kaiser
	window.

	* siddefs.h: Control inlining with RESID_INLINING (0 or 1) and
	RESID_INLINE (blank or "inline"). Added enum sampling_method.

	* voice.h, voice.cc (Voice::set_sync_source): Moved setting of
	sync source from constructor.

	* wave.h, wave.cc (WaveformGenerator::set_sync_source): Moved
	setting of sync source from constructor.

2000-11-22  Dag Lem  <resid@nimrod.no>

	* Version 0.10 released.

	* configure.in, Makefile.am: Use libtool to build library. The
	hack to "disable" install is removed.

	* extfilt.h, filter.h: Moved filter stability code from sid.cc.

	* sid.cc (SID::clock): Moved filter stability code to
	extfilt.h/filter.h. Don't clock the rest of the chip more
	frequently than necessary.

	* wave.cc: Typecast for pedantic (and probably incorrect)
	compilers.

2000-05-18  Dag Lem  <resid@nimrod.no>

	* Version 0.9 released.

	* filter.h (Filter::output): The sum of the filter outputs is no
	longer weighted.

1999-06-24  Dag Lem  <resid@nimrod.no>

	* Version 0.8 released.

	* filter.h, filter.cc, wave.h, wave.cc: Typecasts for pedantic
	compilers.

	* filter.h (Filter::clock): Voice 3 is only silenced by voice3off
	if it is not routed through the filter.

	* sid.cc (SID::State): Added constructor for proper initalization.

	* spline.h: Inlined template functions to avoid problems at link
	time with certain compilers.

1999-02-25  Dag Lem  <resid@nimrod.no>

	* Version 0.7 released.

	* configure.in: Check whether compiler supports bool.

	* extfilt.h, extfilt.cc: Implementation of C64 filter, external to
	the SID chip.

	* filter.h (Filter::clock): Optimized filter routing using a switch.
	(Filter::output): Optimized filter mixing using a switch, avoiding
	integer division. Corrected sign of filtered output, which is
	inverted compared to unfiltered output.

	* filter.cc (Filter::set_w0): Removed use of M_PI and math.h
	functions. Use spline table to map fc to w0.
	(Filter::fc_default): Return array of FC spline interpolation points.
	(Filter::fc_plotter): Return FC spline plotter object.

	* sid.h (SID::enable_external_filter): Enable/disable external
	filter.
	(SID::fc_default): Return array of FC spline interpolation points.
	(SID::fc_plotter): Return FC spline plotter object.
	(SID::State, SID::read_state, SID::write_state): Read and write
	complete SID state.

	* sid.cc (SID::clock): Age bus value. Clock external filter.
	(SID::enable_external_filter): Enable/disable external filter.

	* spline.h: Spline implementation. Used to specify mapping from
	the FC register to filter cutoff frequency.

1998-11-14  Dag Lem  <resid@nimrod.no>

	* Version 0.6 released.

	* configure.in: Allow compilation in a separate directory.

	* wave.h (WaveformGenerator::synchronize): Handle special case when a
	sync source is synced itself on the same cycle as its MSB is set
	high.

	* sid.cc (SID::clock): Only clock on MSB on/off for hard sync.

1998-09-06  Dag Lem  <resid@nimrod.no>

	* Version 0.5 released.

	* version.cc (resid_version_string): Version string with C linkage.

	* wave.cc (WaveformGenerator::set_chip_model): Emulation of MOS8580
	combined waveforms.

1998-08-28  Dag Lem  <resid@nimrod.no>

	* Version 0.4 released.

	* envelope.h (EnvelopeGenerator::clock): Count up to rate_period twice
	during ADSR delay bug, and add one extra rate counter step.

	* filter.cc (Filter::bsd_copysign): Renamed copysign function for
	compilation on platforms where copysign is implemented as a macro.

1998-08-23  Dag Lem  <resid@nimrod.no>

	* Version 0.3 released.

	* envelope.h (EnvelopeGenerator::clock): Handle ADSR boundary bug.

	* envelope.cc (EnvelopeGenerator::rate_counter_period,
	EnvelopeGenerator::exponential_counter_period): Corrected counter
	periods.

	* filter.h (Filter::clock): Optimized for speed (division by shifting).

	* sid.h (SID::clock): New one-cycle optimized overload of the clock()
	function.

	* wave.h (WaveformGenerator::output_P_T): Combined waveform
	pulse+triangle indexing corrected.
	(WaveformGenerator::output_P__): Check for test bit to handle
	pulse+test bit samples.
	(WaveformGenerator::output): Optimized for speed (inlining).

1998-07-28  Dag Lem  <resid@nimrod.no>

	* Version 0.2 released.

	* envelope.h (EnvelopeGenerator::clock): Start decay cycle immediately
	at envelope counter 0xff. New sustain value is zero if the sustain
	level is raised above the current envelope counter value.
	(EnvelopeGenerator::step_envelope): Handle ADSR delay bug.

	* envelope.cc (EnvelopeGenerator::rate_counter_period,
	EnvelopeGenerator::exponential_counter_period): Corrected counter
	periods.
	(EnvelopeGenerator::writeCONTROL_REG): Do not modify rate counter.

	* filter.cc (Filter::set_Q): Constrain Q to keep filter stable.

	* sid.h (SID::read, SID::write, SID::bypass_filter): Simplified API
	routing register access through the SID class.

	* sid.cc (SID::output): Corrected variable-bit audio output return.
	(SID::read, SID::write): Allow read of write only registers.

1998-06-09  Dag Lem  <resid@nimrod.no>

	* Version 0.1 released.
