diff --git a/bsnes/Makefile b/bsnes/Makefile index 4af87086..d415b9d8 100755 --- a/bsnes/Makefile +++ b/bsnes/Makefile @@ -5,7 +5,7 @@ profile := accuracy ui := ui # debugger -options := +options := debugger # compiler c := $(compiler) -std=gnu99 diff --git a/bsnes/gameboy/apu/wave/wave.cpp b/bsnes/gameboy/apu/wave/wave.cpp index bce6f444..3b0cfb6c 100755 --- a/bsnes/gameboy/apu/wave/wave.cpp +++ b/bsnes/gameboy/apu/wave/wave.cpp @@ -73,7 +73,7 @@ void APU::Wave::power() { frequency = 0; counter = 0; - random_cyclic r; + random_lfsr r; foreach(n, pattern) n = r() & 15; output = 0; diff --git a/bsnes/nall/random.hpp b/bsnes/nall/random.hpp index 74ebc2d2..409c4561 100755 --- a/bsnes/nall/random.hpp +++ b/bsnes/nall/random.hpp @@ -8,12 +8,20 @@ namespace nall { return n = (n >> 1) ^ (((n & 1) - 1) & 0xedb88320); } - struct random_cyclic { - unsigned seed; - inline unsigned operator()() { - return seed = (seed >> 1) ^ (((seed & 1) - 1) & 0xedb88320); + struct random_lfsr { + inline void seed(unsigned seed__) { + seed_ = seed__; } - random_cyclic() : seed(0) {} + + inline unsigned operator()() { + return seed_ = (seed_ >> 1) ^ (((seed_ & 1) - 1) & 0xedb88320); + } + + random_lfsr() : seed_(0) { + } + + private: + unsigned seed_; }; } diff --git a/bsnes/snes/config/config.cpp b/bsnes/snes/config/config.cpp index 4c47ccd1..701af94c 100755 --- a/bsnes/snes/config/config.cpp +++ b/bsnes/snes/config/config.cpp @@ -7,6 +7,7 @@ Configuration::Configuration() { controller_port2 = Input::Device::Joypad; expansion_port = System::ExpansionPortDevice::BSX; region = System::Region::Autodetect; + random = true; cpu.version = 2; cpu.ntsc_frequency = 21477272; //315 / 88 * 6000000 diff --git a/bsnes/snes/config/config.hpp b/bsnes/snes/config/config.hpp index 7188d209..1f4d037c 100755 --- a/bsnes/snes/config/config.hpp +++ b/bsnes/snes/config/config.hpp @@ -3,6 +3,7 @@ struct Configuration { Input::Device controller_port2; System::ExpansionPortDevice expansion_port; System::Region region; + bool random; struct CPU { unsigned version; diff --git a/bsnes/snes/cpu/cpu.cpp b/bsnes/snes/cpu/cpu.cpp index 477cc809..55cf3761 100755 --- a/bsnes/snes/cpu/cpu.cpp +++ b/bsnes/snes/cpu/cpu.cpp @@ -124,7 +124,7 @@ void CPU::enable() { void CPU::power() { cpu_version = config.cpu.version; - foreach(n, wram) n = config.cpu.wram_init_value; + foreach(n, wram) n = random(config.cpu.wram_init_value); regs.a = regs.x = regs.y = 0x0000; regs.s = 0x01ff; diff --git a/bsnes/snes/cpu/timing/joypad.cpp b/bsnes/snes/cpu/timing/joypad.cpp index 145942e4..bd694b33 100755 --- a/bsnes/snes/cpu/timing/joypad.cpp +++ b/bsnes/snes/cpu/timing/joypad.cpp @@ -2,18 +2,12 @@ //called every 256 clocks; see CPU::add_clocks() void CPU::step_auto_joypad_poll() { - if(vcounter() >= (ppu.overscan() == false ? 225 : 240) && status.auto_joypad_counter <= 16) { - if(status.auto_joypad_counter == 0) { - status.auto_joypad_active = true; - input.poll(); - } else if(status.auto_joypad_counter == 16) { - status.auto_joypad_active = false; - return; - } + if(vcounter() >= (ppu.overscan() == false ? 225 : 240)) { + status.auto_joypad_active = status.auto_joypad_counter <= 15; - status.auto_joypad_counter++; + if(status.auto_joypad_active && status.auto_joypad_poll) { + if(status.auto_joypad_counter == 0) input.poll(); - if(status.auto_joypad_poll) { uint8 port0 = input.port_read(0); uint8 port1 = input.port_read(1); @@ -22,6 +16,8 @@ void CPU::step_auto_joypad_poll() { status.joy3 = (status.joy3 << 1) | (bool)(port0 & 2); status.joy4 = (status.joy4 << 1) | (bool)(port1 & 2); } + + status.auto_joypad_counter++; } } diff --git a/bsnes/snes/ppu/ppu.cpp b/bsnes/snes/ppu/ppu.cpp index fe4d1fe2..44352b3a 100755 --- a/bsnes/snes/ppu/ppu.cpp +++ b/bsnes/snes/ppu/ppu.cpp @@ -91,9 +91,9 @@ void PPU::power() { ppu1_version = config.ppu1.version; ppu2_version = config.ppu2.version; - foreach(n, vram) n = 0x00; - foreach(n, oam) n = 0x00; - foreach(n, cgram) n = 0x00; + foreach(n, vram) n = random(0x00); + foreach(n, oam) n = random(0x00); + foreach(n, cgram) n = random(0x00); reset(); } diff --git a/bsnes/snes/random/random.cpp b/bsnes/snes/random/random.cpp new file mode 100755 index 00000000..a92a980a --- /dev/null +++ b/bsnes/snes/random/random.cpp @@ -0,0 +1,18 @@ +Random random; + +void Random::seed(unsigned seed_iter) { + iter = seed_iter; +} + +unsigned Random::operator()(unsigned result) { + if(config.random == false) return result; + return iter = (iter >> 1) ^ (((iter & 1) - 1) & 0xedb88320); +} + +void Random::serialize(serializer &s) { + s.integer(iter); +} + +Random::Random() { + iter = 0; +} diff --git a/bsnes/snes/random/random.hpp b/bsnes/snes/random/random.hpp new file mode 100755 index 00000000..927d7172 --- /dev/null +++ b/bsnes/snes/random/random.hpp @@ -0,0 +1,11 @@ +struct Random { + void seed(unsigned seed); + unsigned operator()(unsigned result = 0); + void serialize(serializer&); + Random(); + +private: + unsigned iter; +}; + +extern Random random; diff --git a/bsnes/snes/smp/smp.cpp b/bsnes/snes/smp/smp.cpp index 791fffe1..6bb2a68f 100755 --- a/bsnes/snes/smp/smp.cpp +++ b/bsnes/snes/smp/smp.cpp @@ -71,7 +71,7 @@ void SMP::reset() { regs.sp = 0xef; regs.p = 0x02; - foreach(n, apuram) n = 0x00; + foreach(n, apuram) n = random(0x00); status.clock_counter = 0; status.dsp_counter = 0; diff --git a/bsnes/snes/snes.hpp b/bsnes/snes/snes.hpp index f8520bcd..6375e249 100755 --- a/bsnes/snes/snes.hpp +++ b/bsnes/snes/snes.hpp @@ -1,8 +1,8 @@ namespace SNES { namespace Info { static const char Name[] = "bsnes"; - static const char Version[] = "077"; - static const unsigned SerializerVersion = 18; + static const char Version[] = "077.01"; + static const unsigned SerializerVersion = 19; } } diff --git a/bsnes/snes/system/serialization.cpp b/bsnes/snes/system/serialization.cpp index 7e3820d2..693247dd 100755 --- a/bsnes/snes/system/serialization.cpp +++ b/bsnes/snes/system/serialization.cpp @@ -51,6 +51,7 @@ void System::serialize(serializer &s) { void System::serialize_all(serializer &s) { cartridge.serialize(s); system.serialize(s); + random.serialize(s); cpu.serialize(s); smp.serialize(s); ppu.serialize(s); diff --git a/bsnes/snes/system/system.cpp b/bsnes/snes/system/system.cpp index 03c7e328..e22e5514 100755 --- a/bsnes/snes/system/system.cpp +++ b/bsnes/snes/system/system.cpp @@ -8,6 +8,7 @@ System system; #include #include #include +#include #include #include @@ -147,6 +148,8 @@ void System::unload() { } void System::power() { + random.seed(0x62797575); + region = config.region; expansion = config.expansion_port; if(region == Region::Autodetect) { diff --git a/bsnes/snes/system/system.hpp b/bsnes/snes/system/system.hpp index 2382de8d..8bfbeddc 100755 --- a/bsnes/snes/system/system.hpp +++ b/bsnes/snes/system/system.hpp @@ -51,5 +51,6 @@ private: #include #include #include +#include extern System system; diff --git a/bsnes/ui/config.cpp b/bsnes/ui/config.cpp index a2351815..df3a78a0 100755 --- a/bsnes/ui/config.cpp +++ b/bsnes/ui/config.cpp @@ -9,6 +9,16 @@ void Configuration::save() { } void Configuration::create() { + attach(SNES::config.random, "snes.random"); + attach(SNES::config.cpu.version, "snes.cpu.version"); + attach(SNES::config.cpu.ntsc_frequency, "snes.cpu.ntscFrequency"); + attach(SNES::config.cpu.pal_frequency, "snes.cpu.palFrequency"); + attach(SNES::config.smp.ntsc_frequency, "snes.smp.ntscFrequency"); + attach(SNES::config.smp.pal_frequency, "snes.smp.palFrequency"); + attach(SNES::config.ppu1.version, "snes.ppu1.version"); + attach(SNES::config.ppu2.version, "snes.ppu2.version"); + attach(SNES::config.superfx.speed, "snes.superfx.speed"); + attach(video.driver = "", "video.driver"); attach(video.synchronize = false, "video.synchronize"); attach(video.smooth = true, "video.smooth");