mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-02-23 14:42:33 +01:00
byuu says: Changelog: - higan: readded support for soft-reset to Famicom, Super Famicom, Mega Drive cores (work in progress) - handhelds lack soft reset obviously - the PC Engine also lacks a physical reset button - the Master System's reset button acts like a gamepad button, so can't show up in the menu - Mega Drive: power cycle wasn't initializing CPU (M68K) or APU (Z80) RAM - Super Famicom: fix SPC700 opcode 0x3b regression; fixes Majuu Ou [Jonas Quinn] - Super Famicom: fix SharpRTC save regression; fixes Dai Kaijuu Monogatari II's real-time clock [Talarubi] - Super Famicom: fix EpsonRTC save regression; fixes Tengai Makyou Zero's real-time clock [Talarubi] - Super Famicom: removed `*::init()` functions, as they were never used - Super Famicom: removed all but two `*::load()` functions, as they were not used - higan: added option to auto-save backup RAM every five seconds (enabled by default) - this is in case the emulator crashes, or there's a power outage; turn it off under advanced settings if you want - libco: updated license from public domain to ISC, for consistency with nall, ruby, hiro - nall: Linux compiler defaults to g++; override with g++-version if g++ is <= 4.8 - FreeBSD compiler default is going to remain g++49 until my dev box OS ships with g++ >= 4.9 Errata: I have weird RAM initialization constants, thanks to hex_usr and onethirdxcubed for both finding this: http://wiki.nesdev.com/w/index.php?title=CPU_power_up_state&diff=11711&oldid=11184 I'll remove this in the next WIP.
46 lines
905 B
C++
46 lines
905 B
C++
#include <fc/fc.hpp>
|
|
|
|
namespace Famicom {
|
|
|
|
#include "memory.cpp"
|
|
#include "timing.cpp"
|
|
#include "serialization.cpp"
|
|
CPU cpu;
|
|
|
|
auto CPU::Enter() -> void {
|
|
while(true) scheduler.synchronize(), cpu.main();
|
|
}
|
|
|
|
auto CPU::main() -> void {
|
|
if(io.interruptPending) return interrupt();
|
|
instruction();
|
|
}
|
|
|
|
auto CPU::step(uint clocks) -> void {
|
|
Thread::step(clocks);
|
|
synchronize(apu);
|
|
synchronize(ppu);
|
|
synchronize(cartridge);
|
|
for(auto peripheral : peripherals) synchronize(*peripheral);
|
|
}
|
|
|
|
auto CPU::power(bool reset) -> void {
|
|
MOS6502::BCD = 0;
|
|
MOS6502::power();
|
|
create(CPU::Enter, system.frequency());
|
|
|
|
if(!reset) for(auto& data : ram) data = 0xff;
|
|
ram[0x008] = 0xf7; //todo: what is this about?
|
|
ram[0x009] = 0xef;
|
|
ram[0x00a] = 0xdf;
|
|
ram[0x00f] = 0xbf;
|
|
|
|
r.pc.byte(0) = bus.read(0xfffc);
|
|
r.pc.byte(1) = bus.read(0xfffd);
|
|
|
|
memory::fill(&io, sizeof(IO));
|
|
io.rdyLine = 1;
|
|
}
|
|
|
|
}
|