2016-02-09 11:51:12 +00:00
|
|
|
#include <sfc/sfc.hpp>
|
|
|
|
|
|
|
|
namespace SuperFamicom {
|
|
|
|
|
2010-08-09 13:28:56 +00:00
|
|
|
Scheduler scheduler;
|
|
|
|
|
2016-02-09 11:51:12 +00:00
|
|
|
auto Scheduler::reset() -> void {
|
|
|
|
host = co_active();
|
|
|
|
resume = cpu.thread;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto Scheduler::enter(Mode mode_) -> Event {
|
|
|
|
mode = mode_;
|
|
|
|
host = co_active();
|
|
|
|
co_switch(resume);
|
Update to v098r06 release.
byuu says:
Changelog:
- emulation cores now refresh video from host thread instead of
cothreads (fix AMD crash)
- SFC: fixed another bug with leap year months in SharpRTC emulation
- SFC: cleaned up camelCase on function names for
armdsp,epsonrtc,hitachidsp,mcc,nss,sharprtc classes
- GB: added MBC1M emulation (requires manually setting mapper=MBC1M in
manifest.bml for now, sorry)
- audio: implemented Emulator::Audio mixer and effects processor
- audio: implemented Emulator::Stream interface
- it is now possible to have more than two audio streams: eg SNES
+ SGB + MSU1 + Voicer-Kun (eventually)
- audio: added reverb delay + reverb level settings; exposed balance
configuration in UI
- video: reworked palette generation to re-enable saturation, gamma,
luminance adjustments
- higan/emulator.cpp is gone since there was nothing left in it
I know you guys are going to say the color adjust/balance/reverb stuff
is pointless. And indeed it mostly is. But I like the idea of allowing
some fun special effects and configurability that isn't system-wide.
Note: there seems to be some kind of added audio lag in the SGB
emulation now, and I don't really understand why. The code should be
effectively identical to what I had before. The only main thing is that
I'm sampling things to 48000hz instead of 32040hz before mixing. There's
no point where I'm intentionally introducing added latency though. I'm
kind of stumped, so if anyone wouldn't mind taking a look at it, it'd be
much appreciated :/
I don't have an MSU1 test ROM, but the latency issue may affect MSU1 as
well, and that would be very bad.
2016-04-22 13:35:51 +00:00
|
|
|
if(event == Event::Frame) ppu.refresh();
|
2016-02-09 11:51:12 +00:00
|
|
|
return event;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto Scheduler::exit(Event event_) -> void {
|
|
|
|
event = event_;
|
|
|
|
resume = co_active();
|
|
|
|
co_switch(host);
|
|
|
|
}
|
|
|
|
|
|
|
|
auto Scheduler::synchronize(cothread_t thread) -> void {
|
|
|
|
if(thread == cpu.thread) {
|
|
|
|
while(enter(Mode::SynchronizeCPU) != Event::Synchronize);
|
|
|
|
} else {
|
|
|
|
resume = thread;
|
|
|
|
while(enter(Mode::SynchronizeAll) != Event::Synchronize);
|
|
|
|
}
|
Update to v094r39 release.
byuu says:
Changelog:
- SNES mid-scanline BGMODE fixes finally merged (can run
atx2.zip{mode7.smc}+mtest(2).sfc properly now)
- Makefile now discards all built-in rules and variables
- switch on bool warning disabled for GCC now as well (was already
disabled for Clang)
- when loading a game, if any required files are missing, display
a warning message box (manifest.bml, program.rom, bios.rom, etc)
- when loading a game (or a game slot), if manifest.bml is missing, it
will invoke icarus to try and generate it
- if that fails (icarus is missing or the folder is bad), you will get
a warning telling you that the manifest can't be loaded
The warning prompt on missing files work for both games and the .sys
folders and their files. For some reason, failing to load the DMG/CGB
BIOS is causing a crash before I can display the modal dialog. I have no
idea why, and the stack frame backtrace is junk.
I also can't seem to abort the failed loading process. If I call
Program::unloadMedia(), I get a nasty segfault. Again with a really
nasty stack trace. So for now, it'll just end up sitting there emulating
an empty ROM (solid black screen.) In time, I'd like to fix that too.
Lastly, I need a better method than popen for Windows. popen is kind of
ugly and flashes a console window for a brief second even if the
application launched is linked with -mwindows. Not sure if there even is
one (I need to read the stdout result, so CreateProcess may not work
unless I do something nasty like "> %tmp%/temp") I'm also using the
regular popen instead of _wpopen, so for this WIP, it won't work if your
game folder has non-English letters in the path.
2015-08-04 09:00:55 +00:00
|
|
|
}
|
|
|
|
|
2016-02-09 11:51:12 +00:00
|
|
|
auto Scheduler::synchronize() -> void {
|
|
|
|
if(co_active() == cpu.thread && mode == Mode::SynchronizeCPU) return exit(Event::Synchronize);
|
|
|
|
if(co_active() != cpu.thread && mode == Mode::SynchronizeAll) return exit(Event::Synchronize);
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
2016-02-09 11:51:12 +00:00
|
|
|
auto Scheduler::synchronizing() const -> bool {
|
|
|
|
return mode == Mode::SynchronizeAll;
|
2010-08-09 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
2012-02-09 12:53:55 +00:00
|
|
|
}
|