GB Audio: Fix channel 1 shadow register

This commit is contained in:
Jeffrey Pfau 2016-02-16 00:23:45 -08:00
parent 0a6b66248b
commit df619d4b56
1 changed files with 7 additions and 7 deletions

View File

@ -118,13 +118,13 @@ void GBAudioWriteNR12(struct GBAudio* audio, uint8_t value) {
} }
void GBAudioWriteNR13(struct GBAudio* audio, uint8_t value) { void GBAudioWriteNR13(struct GBAudio* audio, uint8_t value) {
audio->ch1.realFrequency &= 0x700; audio->ch1.control.frequency &= 0x700;
audio->ch1.realFrequency |= GBAudioRegisterControlGetFrequency(value); audio->ch1.control.frequency |= GBAudioRegisterControlGetFrequency(value);
} }
void GBAudioWriteNR14(struct GBAudio* audio, uint8_t value) { void GBAudioWriteNR14(struct GBAudio* audio, uint8_t value) {
audio->ch1.realFrequency &= 0xFF; audio->ch1.control.frequency &= 0xFF;
audio->ch1.realFrequency |= GBAudioRegisterControlGetFrequency(value << 8); audio->ch1.control.frequency |= GBAudioRegisterControlGetFrequency(value << 8);
bool wasStop = audio->ch1.control.stop; bool wasStop = audio->ch1.control.stop;
audio->ch1.control.stop = GBAudioRegisterControlGetStop(value << 8); audio->ch1.control.stop = GBAudioRegisterControlGetStop(value << 8);
if (!wasStop && audio->ch1.control.stop && audio->ch1.control.length && !(audio->frame & 1)) { if (!wasStop && audio->ch1.control.stop && audio->ch1.control.length && !(audio->frame & 1)) {
@ -145,7 +145,7 @@ void GBAudioWriteNR14(struct GBAudio* audio, uint8_t value) {
if (audio->ch1.envelope.currentVolume > 0 && audio->ch1.envelope.stepTime) { if (audio->ch1.envelope.currentVolume > 0 && audio->ch1.envelope.stepTime) {
audio->ch1.envelope.dead = 0; audio->ch1.envelope.dead = 0;
} }
audio->ch1.control.frequency = audio->ch1.realFrequency; audio->ch1.realFrequency = audio->ch1.control.frequency;
audio->ch1.sweepStep = audio->ch1.time; audio->ch1.sweepStep = audio->ch1.time;
audio->ch1.sweepEnable = (audio->ch1.sweepStep != 8) || audio->ch1.shift; audio->ch1.sweepEnable = (audio->ch1.sweepStep != 8) || audio->ch1.shift;
audio->ch1.sweepOccurred = false; audio->ch1.sweepOccurred = false;
@ -753,7 +753,7 @@ static void _updateEnvelope(struct GBAudioEnvelope* envelope) {
static bool _updateSweep(struct GBAudioChannel1* ch, bool initial) { static bool _updateSweep(struct GBAudioChannel1* ch, bool initial) {
if (initial || ch->time != 8) { if (initial || ch->time != 8) {
int frequency = ch->control.frequency; int frequency = ch->realFrequency;
if (ch->direction) { if (ch->direction) {
frequency -= frequency >> ch->shift; frequency -= frequency >> ch->shift;
if (!initial && frequency >= 0) { if (!initial && frequency >= 0) {
@ -765,10 +765,10 @@ static bool _updateSweep(struct GBAudioChannel1* ch, bool initial) {
if (frequency < 2048) { if (frequency < 2048) {
if (!initial && ch->shift) { if (!initial && ch->shift) {
ch->control.frequency = frequency; ch->control.frequency = frequency;
ch->realFrequency = frequency;
if (!_updateSweep(ch, true)) { if (!_updateSweep(ch, true)) {
return false; return false;
} }
ch->realFrequency = frequency;
} }
} else { } else {
return false; return false;