void Player_SID::useSwapVars(int channel) { // $5342 if (channel >= 3) return; swapVars(channel, 0); setSIDFreqAS(channel); if (pulseWidthSwapped) { swapVars(channel+4, 1); setSIDFreqAS(channel+4); } if (filterSwapped) { swapVars(3, 2); // resonating filter freq. or voice-to-filter mapping? SIDReg23 = (SIDReg23Stuff & 0xf0) | BITMASK[channel]; SID_Write(23, SIDReg23); // filter props SIDReg24 = (SIDReg24 & 0x0f) | SIDReg24_HiNibble; SID_Write(24, SIDReg24); // filter freq. SID_Write(21, LOBYTE_(freqReg[3])); SID_Write(22, HIBYTE_(freqReg[3])); } else { SIDReg23 = SIDReg23Stuff & BITMASK_INV[channel]; SID_Write(23, SIDReg23); } swapPrepared = false; pulseWidthSwapped = false; keepSwapVars = false; SIDReg24_HiNibble = 0; filterSwapped = false; }
void Player_SID::update() { // $481B if (initializing) return; if (_soundInQueue) { for (int i = 6; i >= 0; --i) { if (_soundQueue[i] != -1) processSongData(i); } _soundInQueue = false; } // no sound if (busyChannelBits == 0) return; for (int i = 6; i >= 0; --i) { if (busyChannelBits & BITMASK[i]) { updateFreq(i); } } // seems to be used for background (prio=1?) sounds. // If a bg sound cannot be played because all SID // voices are used by higher priority sounds, the // bg sound's state is updated here so it will be at // the correct state when a voice is available again. if (swapPrepared) { swapVars(0, 0); swapVarLoaded = true; updateFreq(0); swapVars(0, 0); if (pulseWidthSwapped) { swapVars(4, 1); updateFreq(4); swapVars(4, 1); } swapVarLoaded = false; } for (int i = 6; i >= 0; --i) { if (busyChannelBits & BITMASK[i]) setSIDWaveCtrlReg(i); }; if (isMusicPlaying) { handleMusicBuffer(); } return; }
void deleteVar(int i) { if(i<MAX_VARS) { size--; free(env[i]); for(; i<size; i++) { swapVars(i, i+1); } env[size] = NULL; } }
void Player_SID::prepareSwapVars(int channel) { // $52E5 if (channel >= 4) return; if (channel < 3) { if (!keepSwapVars) { resetSwapVars(); } swapVars(channel, 0); if (busyChannelBits & BITMASK[channel+4]) { swapVars(channel+4, 1); pulseWidthSwapped = true; } } else if (channel == 3) { SIDReg24_HiNibble = SIDReg24 & 0x70; resetSwapVars(); keepSwapVars = true; swapVars(3, 2); filterSwapped = true; } swapPrepared = true; }