From 06ceb7d29eb064200b2fa02ad2691d57cf2da576 Mon Sep 17 00:00:00 2001 From: byuu <2107894+byuu@users.noreply.github.com> Date: Mon, 5 Aug 2019 11:08:25 +0900 Subject: [PATCH] Minor speedups for SuperFX and Cx4 emulation. --- bsnes/sfc/GNUmakefile | 2 +- bsnes/sfc/cartridge/load.cpp | 2 +- .../sfc/coprocessor/hitachidsp/hitachidsp.cpp | 1 + bsnes/sfc/coprocessor/necdsp/necdsp.cpp | 1 + bsnes/sfc/coprocessor/superfx/superfx.cpp | 1 + bsnes/sfc/cpu/timing.cpp | 7 +++---- bsnes/sfc/dsp/SPC_DSP.h | 3 +++ bsnes/sfc/dsp/dsp.cpp | 18 +++++++++--------- bsnes/sfc/dsp/dsp.hpp | 19 ++++++++++--------- bsnes/sfc/dsp/serialization.cpp | 8 ++++---- bsnes/sfc/memory/memory.cpp | 4 ++-- bsnes/sfc/memory/memory.hpp | 2 +- 12 files changed, 37 insertions(+), 31 deletions(-) diff --git a/bsnes/sfc/GNUmakefile b/bsnes/sfc/GNUmakefile index 84c1004e..3bbd7483 100644 --- a/bsnes/sfc/GNUmakefile +++ b/bsnes/sfc/GNUmakefile @@ -1,4 +1,4 @@ -processors += wdc65816 spc700 arm7tdmi gsu hg51b upd96050 +processors += wdc65816 spc700 arm7tdmi objects += sfc-interface sfc-system sfc-controller objects += sfc-cartridge sfc-memory diff --git a/bsnes/sfc/cartridge/load.cpp b/bsnes/sfc/cartridge/load.cpp index 5f2db767..94719906 100644 --- a/bsnes/sfc/cartridge/load.cpp +++ b/bsnes/sfc/cartridge/load.cpp @@ -141,7 +141,7 @@ auto Cartridge::loadMap(Markup::Node map, T& memory) -> uint { auto Cartridge::loadMap( Markup::Node map, const function& reader, - const function& writer + const function& writer ) -> uint { auto addr = map["address"].text(); auto size = map["size"].natural(); diff --git a/bsnes/sfc/coprocessor/hitachidsp/hitachidsp.cpp b/bsnes/sfc/coprocessor/hitachidsp/hitachidsp.cpp index ec4f90ef..56a0852a 100644 --- a/bsnes/sfc/coprocessor/hitachidsp/hitachidsp.cpp +++ b/bsnes/sfc/coprocessor/hitachidsp/hitachidsp.cpp @@ -1,4 +1,5 @@ #include +#include namespace SuperFamicom { diff --git a/bsnes/sfc/coprocessor/necdsp/necdsp.cpp b/bsnes/sfc/coprocessor/necdsp/necdsp.cpp index 9db99df5..522dc87a 100644 --- a/bsnes/sfc/coprocessor/necdsp/necdsp.cpp +++ b/bsnes/sfc/coprocessor/necdsp/necdsp.cpp @@ -1,4 +1,5 @@ #include +#include namespace SuperFamicom { diff --git a/bsnes/sfc/coprocessor/superfx/superfx.cpp b/bsnes/sfc/coprocessor/superfx/superfx.cpp index c651cf9c..9b3dc9f9 100644 --- a/bsnes/sfc/coprocessor/superfx/superfx.cpp +++ b/bsnes/sfc/coprocessor/superfx/superfx.cpp @@ -1,4 +1,5 @@ #include +#include namespace SuperFamicom { diff --git a/bsnes/sfc/cpu/timing.cpp b/bsnes/sfc/cpu/timing.cpp index 04eea3ac..5fb78f92 100644 --- a/bsnes/sfc/cpu/timing.cpp +++ b/bsnes/sfc/cpu/timing.cpp @@ -29,7 +29,7 @@ auto CPU::step() -> void { static_assert(Clocks == 2 || Clocks == 4 || Clocks == 6 || Clocks == 8 || Clocks == 10 || Clocks == 12); for(auto coprocessor : coprocessors) { - coprocessor->clock -= Clocks * (uint64_t)coprocessor->frequency; + coprocessor->clock -= Clocks * (uint64)coprocessor->frequency; } if(overclocking.target) { @@ -37,9 +37,8 @@ auto CPU::step() -> void { if(overclocking.counter < overclocking.target) { if constexpr(Synchronize) { if(configuration.hacks.coprocessor.delayedSync) return; - synchronizeCoprocessors(); + return synchronizeCoprocessors(); } - return; } } @@ -50,7 +49,7 @@ auto CPU::step() -> void { if constexpr(Clocks >= 10) stepOnce(); if constexpr(Clocks >= 12) stepOnce(); - smp.clock -= Clocks * (uint64_t)smp.frequency; + smp.clock -= Clocks * (uint64)smp.frequency; ppu.clock -= Clocks; if(!status.dramRefresh && hcounter() >= status.dramRefreshPosition) { diff --git a/bsnes/sfc/dsp/SPC_DSP.h b/bsnes/sfc/dsp/SPC_DSP.h index 4522ace9..6c0cc833 100644 --- a/bsnes/sfc/dsp/SPC_DSP.h +++ b/bsnes/sfc/dsp/SPC_DSP.h @@ -231,6 +231,9 @@ private: void echo_30(); void soft_reset_common(); + +public: + bool mute() { return m.regs[r_flg] & 0x40; } }; #include diff --git a/bsnes/sfc/dsp/dsp.cpp b/bsnes/sfc/dsp/dsp.cpp index 349bb117..fbfb47c1 100644 --- a/bsnes/sfc/dsp/dsp.cpp +++ b/bsnes/sfc/dsp/dsp.cpp @@ -7,7 +7,7 @@ DSP dsp; #include "serialization.cpp" #include "SPC_DSP.cpp" -void DSP::main() { +auto DSP::main() -> void { if(!configuration.hacks.dsp.fast) { spc_dsp.run(1); clock += 2; @@ -25,19 +25,19 @@ void DSP::main() { } } -uint8 DSP::read(uint8 addr) { - return spc_dsp.read(addr); +auto DSP::read(uint8 address) -> uint8 { + return spc_dsp.read(address); } -void DSP::write(uint8 addr, uint8 data) { - spc_dsp.write(addr, data); +auto DSP::write(uint8 address, uint8 data) -> void { + spc_dsp.write(address, data); } -bool DSP::load() { +auto DSP::load() -> bool { return true; } -void DSP::power(bool reset) { +auto DSP::power(bool reset) -> void { clock = 0; stream = Emulator::audio.createStream(2, system.apuFrequency() / 768.0); @@ -51,8 +51,8 @@ void DSP::power(bool reset) { } } -bool DSP::mute() { - return false; +auto DSP::mute() -> bool { + return spc_dsp.mute(); } } diff --git a/bsnes/sfc/dsp/dsp.hpp b/bsnes/sfc/dsp/dsp.hpp index 91937347..aeefa098 100644 --- a/bsnes/sfc/dsp/dsp.hpp +++ b/bsnes/sfc/dsp/dsp.hpp @@ -2,23 +2,24 @@ struct DSP { shared_pointer stream; - uint8_t apuram[64 * 1024] = {}; + uint8 apuram[64 * 1024] = {}; - void main(); - uint8 read(uint8 addr); - void write(uint8 addr, uint8 data); + auto main() -> void; + auto read(uint8 address) -> uint8; + auto write(uint8 address, uint8 data) -> void; - bool load(); - void power(bool reset); - bool mute(); + auto load() -> bool; + auto power(bool reset) -> void; + auto mute() -> bool; - void serialize(serializer&); + auto serialize(serializer&) -> void; int64 clock = 0; private: + bool fastDSP = false; SPC_DSP spc_dsp; - int16_t samplebuffer[8192]; + int16 samplebuffer[8192]; }; extern DSP dsp; diff --git a/bsnes/sfc/dsp/serialization.cpp b/bsnes/sfc/dsp/serialization.cpp index dd071487..ec45155e 100644 --- a/bsnes/sfc/dsp/serialization.cpp +++ b/bsnes/sfc/dsp/serialization.cpp @@ -1,20 +1,20 @@ -static void dsp_state_save(unsigned char **out, void *in, size_t size) { +static auto dsp_state_save(unsigned char** out, void* in, size_t size) -> void { memcpy(*out, in, size); *out += size; } -static void dsp_state_load(unsigned char **in, void *out, size_t size) { +static auto dsp_state_load(unsigned char** in, void* out, size_t size) -> void { memcpy(out, *in, size); *in += size; } -void DSP::serialize(serializer &s) { +auto DSP::serialize(serializer& s) -> void { s.array(apuram); s.array(samplebuffer); s.integer(clock); unsigned char state[SPC_DSP::state_size]; - unsigned char *p = state; + unsigned char* p = state; memset(&state, 0, SPC_DSP::state_size); if(s.mode() == serializer::Save) { spc_dsp.copy_state(&p, dsp_state_save); diff --git a/bsnes/sfc/memory/memory.cpp b/bsnes/sfc/memory/memory.cpp index 63f93f33..99618f76 100644 --- a/bsnes/sfc/memory/memory.cpp +++ b/bsnes/sfc/memory/memory.cpp @@ -11,7 +11,7 @@ Bus::~Bus() { } auto Bus::reset() -> void { - for(auto id : range(256)) { + for(uint id : range(256)) { reader[id].reset(); writer[id].reset(); counter[id] = 0; @@ -29,7 +29,7 @@ auto Bus::reset() -> void { auto Bus::map( const function& read, - const function& write, + const function& write, const string& addr, uint size, uint base, uint mask ) -> uint { uint id = 1; diff --git a/bsnes/sfc/memory/memory.hpp b/bsnes/sfc/memory/memory.hpp index e86c11fe..fa028309 100644 --- a/bsnes/sfc/memory/memory.hpp +++ b/bsnes/sfc/memory/memory.hpp @@ -42,7 +42,7 @@ private: uint32* target = nullptr; function reader[256]; - function writer[256]; + function writer[256]; uint counter[256]; };