-
Notifications
You must be signed in to change notification settings - Fork 5
/
ChangeLog
469 lines (351 loc) · 17.4 KB
/
ChangeLog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
2010-??-?? Dag Lem <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* Version 0.9 released.
* filter.h (Filter::output): The sum of the filter outputs is no
longer weighted.
1999-06-24 Dag Lem <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* 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 <[email protected]>
* Version 0.1 released.