libsidplayfp 2.8.0
reSIDfp::WaveformCalculator Class Reference

#include <WaveformCalculator.h>

Public Member Functions

matrix_tgetWaveTable ()
 
matrix_tbuildPulldownTable (ChipModel model, CombinedWaveforms cws)
 

Static Public Member Functions

static WaveformCalculatorgetInstance ()
 

Detailed Description

Combined waveform calculator for WaveformGenerator. By combining waveforms, the bits of each waveform are effectively short circuited, a zero bit in one waveform will result in a zero output bit, thus the claim that the waveforms are AND'ed. However, a zero bit in one waveform may also affect the neighboring bits in the output.

Example:

            1 1
Bit #       1 0 9 8 7 6 5 4 3 2 1 0
            -----------------------
Sawtooth    0 0 0 1 1 1 1 1 1 0 0 0

Triangle    0 0 1 1 1 1 1 1 0 0 0 0

AND         0 0 0 1 1 1 1 1 0 0 0 0

Output      0 0 0 0 1 1 1 0 0 0 0 0

Re-vectorized die photographs reveal the mechanism behind this behavior. Each waveform selector bit acts as a switch, which directly connects internal outputs into the waveform DAC inputs as follows:

  • Noise outputs the shift register bits to DAC inputs as described above. Each output is also used as input to the next bit when the shift register is shifted. Lower four bits are grounded.
  • Pulse connects a single line to all DAC inputs. The line is connected to either 5V (pulse on) or 0V (pulse off) at bit 11, and ends at bit 0.
  • Triangle connects the upper 11 bits of the (MSB EOR'ed) accumulator to the DAC inputs, so that DAC bit 0 = 0, DAC bit n = accumulator bit n - 1.
  • Sawtooth connects the upper 12 bits of the accumulator to the DAC inputs, so that DAC bit n = accumulator bit n. Sawtooth blocks out the MSB from the EOR used to generate the triangle waveform.

We can thus draw the following conclusions:

  • The shift register may be written to by combined waveforms.
  • The pulse waveform interconnects all bits in combined waveforms via the pulse line.
  • The combination of triangle and sawtooth interconnects neighboring bits of the sawtooth waveform.

Also in the 6581 the MSB of the oscillator, used as input for the triangle xor logic and the pulse adder's last bit, is connected directly to the waveform selector, while in the 8580 it is latched at sid_clk2 before being forwarded to the selector. Thus in the 6581 if the sawtooth MSB is pulled down it might affect the oscillator's adder driving the top bit low.

Member Function Documentation

◆ buildPulldownTable()

matrix_t * reSIDfp::WaveformCalculator::buildPulldownTable ( ChipModel model,
CombinedWaveforms cws )

Build pulldown table for use by WaveformGenerator.

Parameters
modelChip model to use
cwsstrength of combined waveforms
Returns
Pulldown table

◆ getInstance()

WaveformCalculator * reSIDfp::WaveformCalculator::getInstance ( )
static

Get the singleton instance.

◆ getWaveTable()

matrix_t * reSIDfp::WaveformCalculator::getWaveTable ( )
inline

Get the waveform table for use by WaveformGenerator.

Returns
Waveform table

The documentation for this class was generated from the following files: