Skip to content

Commit 5e7c81d

Browse files
committed
Better(?) register write granularity per voice
1 parent 01fd6a1 commit 5e7c81d

File tree

1 file changed

+41
-17
lines changed

1 file changed

+41
-17
lines changed

src/spu/registers.cc

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void PCSX::SPU::impl::writeRegister(uint32_t reg, uint16_t val) {
102102
(val & (ADSRFlags::AttackShiftMask | ADSRFlags::AttackStepMask)) >> 8;
103103
s_chan[ch].ADSRX.get<exDecayRate>().value = (val & ADSRFlags::DecayShiftMask) >> 4;
104104
s_chan[ch].ADSRX.get<exSustainLevel>().value = val & ADSRFlags::SustainLevelMask;
105-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice[%02i] ADSR = %04x\n", ch, val);
105+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice[%02i] ADSR(lo) = %04x\n", ch, val);
106106
//---------------------------------------------// stuff below is only for debug mode
107107

108108
s_chan[ch].ADSR.get<AttackModeExp>().value = (val & ADSRFlags::AttackMode) ? 1 : 0;
@@ -146,7 +146,7 @@ void PCSX::SPU::impl::writeRegister(uint32_t reg, uint16_t val) {
146146
(val & (ADSRFlags::SustainShiftMask | ADSRFlags::SustainStepMask)) >> 6;
147147
s_chan[ch].ADSRX.get<exReleaseModeExp>().value = (val & ADSRFlags::ReleaseMode) ? 1 : 0;
148148
s_chan[ch].ADSRX.get<exReleaseRate>().value = val & ADSRFlags::ReleaseShiftMask;
149-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice[%02i] ADSR2 = %04x\n", ch, val);
149+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice[%02i] ADSR(hi) = %04x\n", ch, val);
150150
//----------------------------------------------// stuff below is only for debug mode
151151

152152
s_chan[ch].ADSR.get<SustainModeExp>().value = (val & ADSRFlags::SustainMode) ? 1 : 0;
@@ -199,7 +199,7 @@ void PCSX::SPU::impl::writeRegister(uint32_t reg, uint16_t val) {
199199
// WaitForSingleObject(s_chan[ch].hMutex,2000); // -> no multithread fuckups
200200
// align to 16-byte boundary
201201
s_chan[ch].pLoop = spuMemC + ((uint32_t)((val << 3) & ~0xf));
202-
// s_chan[ch].data.get<Chan::IgnoreLoop>().value = true;
202+
s_chan[ch].data.get<Chan::IgnoreLoop>().value = true;
203203
// ReleaseMutex(s_chan[ch].hMutex); // -> oki, on with the thread
204204
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice[%02i] ADPCM Repeat Address = %04x\n", ch, val);
205205
break;
@@ -287,32 +287,28 @@ void PCSX::SPU::impl::writeRegister(uint32_t reg, uint16_t val) {
287287
//-------------------------------------------------//
288288
case H_SPUMute1:
289289
// auxprintf("M0 %04x\n",val);
290-
//PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 ON/OFF (status) (ENDX) = %04x, (read-only)\n", val);
290+
// PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 ON/OFF (status) (ENDX) = %04x, (read-only)\n", val);
291291
break;
292292
//-------------------------------------------------//
293293
case H_SPUMute2:
294294
// auxprintf("M1 %04x\n",val);
295-
//PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 ON/OFF2 (status) (ENDX) = %04x, (read-only)\n", val);
295+
// PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 ON/OFF2 (status) (ENDX) = %04x, (read-only)\n", val);
296296
break;
297297

298298
case H_SPUon1:
299299
SoundOn(0, 16, val);
300-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 Key ON = %04x\n", val);
301300
break;
302301

303302
case H_SPUon2:
304303
SoundOn(16, 24, val);
305-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 Key ON2 = %04x\n", val);
306304
break;
307305

308306
case H_SPUoff1:
309307
SoundOff(0, 16, val);
310-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 Key OFF = %04x\n", val);
311308
break;
312309

313310
case H_SPUoff2:
314311
SoundOff(16, 24, val);
315-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 Key OFF2 = %04x\n", val);
316312
break;
317313

318314
case H_CDLeft:
@@ -333,32 +329,26 @@ void PCSX::SPU::impl::writeRegister(uint32_t reg, uint16_t val) {
333329

334330
case H_FMod1:
335331
FModOn(0, 16, val);
336-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 Pitch Modulation Enable Flags = %04x\n", val);
337332
break;
338333

339334
case H_FMod2:
340335
FModOn(16, 24, val);
341-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice 0..23 Pitch Modulation Enable Flags2 = %04x\n", val);
342336
break;
343337

344338
case H_Noise1:
345339
NoiseOn(0, 16, val);
346-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Noise mode enable 0..23 = %04x\n", val);
347340
break;
348341

349342
case H_Noise2:
350343
NoiseOn(16, 24, val);
351-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Noise mode enable2 0..23 = %04x\n", val);
352344
break;
353345

354346
case H_RVBon1:
355347
ReverbOn(0, 16, val);
356-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Reverb enable 0..23 = %04x\n", val);
357348
break;
358349

359350
case H_RVBon2:
360351
ReverbOn(16, 24, val);
361-
PCSX::PSXSPU_LOGGER::Log("SPU.write, Reverb enable2 0..23 = %04x\n", val);
362352
break;
363353

364354
case H_Reverb + 0:
@@ -568,6 +558,7 @@ void PCSX::SPU::impl::SoundOn(int start, int end, uint16_t val) {
568558
s_chan[ch].data.get<Chan::IgnoreLoop>().value = false;
569559
s_chan[ch].data.get<Chan::New>().value = true;
570560
dwNewChannel |= (1 << ch); // bitfield for faster testing
561+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice %02i ON\n", ch);
571562
}
572563
}
573564
}
@@ -576,6 +567,9 @@ void PCSX::SPU::impl::SoundOn(int start, int end, uint16_t val) {
576567
void PCSX::SPU::impl::SoundOff(int start, int end, uint16_t val) {
577568
for (int ch = start; ch < end; ch++, val >>= 1) {
578569
if (val & 1) {
570+
if(s_chan[ch].data.get<Chan::Stop>().value != true) {
571+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice %02i OFF\n", ch);
572+
}
579573
s_chan[ch].data.get<Chan::Stop>().value = true;
580574
}
581575
}
@@ -586,10 +580,16 @@ void PCSX::SPU::impl::FModOn(int start, int end, uint16_t val) {
586580
for (int ch = start; ch < end; ch++, val >>= 1) {
587581
if (val & 1) { // Check if modulation should be enabled for this voice
588582
if (ch > 0) { // Pitch modulation doesn't work for voice 0
583+
if (s_chan[ch].data.get<Chan::FMod>().value != 1) {
584+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice %02i Pitch Modulation ON\n", ch);
585+
}
589586
s_chan[ch].data.get<Chan::FMod>().value = 1; // sound channel
590587
s_chan[ch - 1].data.get<Chan::FMod>().value = 2; // freq channel
591588
}
592589
} else {
590+
if (s_chan[ch].data.get<Chan::FMod>().value != 0) {
591+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice %02i Pitch Modulation OFF\n", ch);
592+
}
593593
s_chan[ch].data.get<Chan::FMod>().value = 0; // --> turn off fmod
594594
}
595595
}
@@ -599,7 +599,17 @@ void PCSX::SPU::impl::FModOn(int start, int end, uint16_t val) {
599599
// respectively
600600
void PCSX::SPU::impl::NoiseOn(int start, int end, uint16_t val) {
601601
for (int ch = start; ch < end; ch++, val >>= 1) {
602-
s_chan[ch].data.get<Chan::Noise>().value = val & 1;
602+
if (val & 1) {
603+
if (s_chan[ch].data.get<Chan::Noise>().value != true) {
604+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice %02i Noise ON\n", ch);
605+
}
606+
s_chan[ch].data.get<Chan::Noise>().value = true;
607+
} else {
608+
if(s_chan[ch].data.get<Chan::Noise>().value != false) {
609+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice %02i Noise OFF\n", ch);
610+
}
611+
s_chan[ch].data.get<Chan::Noise>().value = false;
612+
}
603613
}
604614
}
605615

@@ -701,6 +711,20 @@ void PCSX::SPU::impl::SetPitch(int ch, uint16_t val) // SET PITCH
701711
// Enable/disable reverb for voices [start, end] depending on val
702712
void PCSX::SPU::impl::ReverbOn(int start, int end, uint16_t val) {
703713
for (int ch = start; ch < end; ch++, val >>= 1) {
704-
s_chan[ch].data.get<Chan::Reverb>().value = val & 1;
714+
if (val & 1) {
715+
if (s_chan[ch].data.get<Chan::Reverb>().value != true) {
716+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice %02i Reverb ON\n", ch);
717+
}
718+
s_chan[ch].data.get<Chan::Reverb>().value = true;
719+
720+
}
721+
else
722+
{
723+
if (s_chan[ch].data.get<Chan::Reverb>().value != false) {
724+
PCSX::PSXSPU_LOGGER::Log("SPU.write, Voice %02i Reverb OFF\n", ch);
725+
}
726+
s_chan[ch].data.get<Chan::Reverb>().value = false;
727+
}
728+
705729
}
706730
}

0 commit comments

Comments
 (0)