From 5ffda66f2257358f5f7290276d9201d92b2a98a5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 20 Feb 2022 21:54:03 -0500 Subject: [PATCH] NES: better channel muting --- src/engine/platform/nes.cpp | 10 ++++------ src/engine/platform/sound/nes/apu.h | 11 ++++++----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index 0b8b3dc26..628cecb5d 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -428,10 +428,7 @@ int DivPlatformNES::dispatch(DivCommand c) { void DivPlatformNES::muteChannel(int ch, bool mute) { isMuted[ch]=mute; - rWrite(0x4015,(!isMuted[0])|((!isMuted[1])<<1)|((!isMuted[2])<<2)|((!isMuted[3])<<3)|((!isMuted[4])<<4)); - if (isMuted[4]) { - rWrite(0x4011,0); - } + nes->muted[ch]=mute; } void DivPlatformNES::forceIns() { @@ -465,7 +462,7 @@ void DivPlatformNES::reset() { nes->apu.cpu_cycles=0; nes->apu.cpu_opcode_cycle=0; - rWrite(0x4015,(!isMuted[0])|((!isMuted[1])<<1)|((!isMuted[2])<<2)|((!isMuted[3])<<3)|((!isMuted[4])<<4)); + rWrite(0x4015,0x1f); rWrite(0x4001,chan[0].sweep); rWrite(0x4005,chan[1].sweep); } @@ -510,10 +507,11 @@ int DivPlatformNES::init(DivEngine* p, int channels, int sugRate, unsigned int f apuType=flags; dumpWrites=false; skipRegisterWrites=false; + nes=new struct NESAPU; for (int i=0; i<5; i++) { isMuted[i]=false; + nes->muted[i]=false; } - nes=new struct NESAPU; setFlags(flags); init_nla_table(500,500); diff --git a/src/engine/platform/sound/nes/apu.h b/src/engine/platform/sound/nes/apu.h index 4d3649e0d..93cf72fef 100644 --- a/src/engine/platform/sound/nes/apu.h +++ b/src/engine/platform/sound/nes/apu.h @@ -338,15 +338,15 @@ enum apu_mode { APU_60HZ, APU_48HZ }; #define _apu_channel_volume_adjust(ch, index)\ ((ch)) #define s1_out(a)\ - _apu_channel_volume_adjust(a->S1.output, APU_S1) + (a->muted[0] ? 0 : _apu_channel_volume_adjust(a->S1.output, APU_S1)) #define s2_out(a)\ - _apu_channel_volume_adjust(a->S2.output, APU_S2) + (a->muted[1] ? 0 : _apu_channel_volume_adjust(a->S2.output, APU_S2)) #define tr_out(a)\ - _apu_channel_volume_adjust(a->TR.output, APU_TR) + (a->muted[2] ? 0 : _apu_channel_volume_adjust(a->TR.output, APU_TR)) #define ns_out(a)\ - _apu_channel_volume_adjust(a->NS.output, APU_NS) + (a->muted[3] ? 0 : _apu_channel_volume_adjust(a->NS.output, APU_NS)) #define dmc_out(a)\ - _apu_channel_volume_adjust(a->DMC.output, APU_DMC) + (a->muted[4] ? 0 : _apu_channel_volume_adjust(a->DMC.output, APU_DMC)) #define extra_out(ch)\ (ch * cfg->apu.channel[APU_EXTRA]) #define pulse_output(a)\ @@ -523,6 +523,7 @@ EXTERNC struct NESAPU { _apuTriangle TR; _apuNoise NS; _apuDMC DMC; + unsigned char muted[5]; }; /* apuPeriod[mode][type][cycles] */