189 lines
4.8 KiB
C++
Executable File
189 lines
4.8 KiB
C++
Executable File
#include <../base.hpp>
|
|
|
|
#define SYSTEM_CPP
|
|
namespace SNES {
|
|
|
|
System system;
|
|
BUSCORE bus;
|
|
CPUCORE cpu;
|
|
SMPCORE smp;
|
|
DSPCORE dsp;
|
|
PPUCORE ppu;
|
|
|
|
#include "scheduler/scheduler.cpp"
|
|
#include "tracer/tracer.cpp"
|
|
#include "config/config.cpp"
|
|
|
|
#include "video/video.cpp"
|
|
#include "audio/audio.cpp"
|
|
#include "input/input.cpp"
|
|
|
|
void System::coprocessor_enter() {
|
|
if(cartridge.mode() == Cartridge::ModeSuperGameBoy) sgb.enter();
|
|
if(cartridge.has_sa1()) sa1.enter();
|
|
|
|
while(true) {
|
|
scheduler.addclocks_cop(64 * 1024 * 1024);
|
|
scheduler.sync_copcpu();
|
|
}
|
|
}
|
|
|
|
void System::run() {
|
|
}
|
|
|
|
void System::runtoframe() {
|
|
scheduler.enter();
|
|
}
|
|
|
|
void System::init(Interface *interface_) {
|
|
interface = interface_;
|
|
assert(interface != 0);
|
|
|
|
sgb.init();
|
|
sa1.init();
|
|
bsxbase.init();
|
|
bsxcart.init();
|
|
bsxflash.init();
|
|
srtc.init();
|
|
sdd1.init();
|
|
spc7110.init();
|
|
cx4.init();
|
|
dsp1.init();
|
|
dsp2.init();
|
|
dsp3.init();
|
|
dsp4.init();
|
|
obc1.init();
|
|
st010.init();
|
|
|
|
video.init();
|
|
audio.init();
|
|
input.init();
|
|
}
|
|
|
|
void System::term() {
|
|
}
|
|
|
|
void System::power() {
|
|
snes_region = max(0, min(2, config.region));
|
|
snes_expansion = max(0, min(1, config.expansion_port));
|
|
|
|
if(snes_region == Autodetect) {
|
|
snes_region = (cartridge.region() == Cartridge::NTSC ? NTSC : PAL);
|
|
}
|
|
|
|
scheduler.init();
|
|
|
|
ppu.PPUcounter::reset();
|
|
cpu.power();
|
|
smp.power();
|
|
dsp.power();
|
|
ppu.power();
|
|
bus.power();
|
|
|
|
if(expansion() == ExpansionBSX) bsxbase.power();
|
|
if(memory::bsxflash.data()) bsxflash.power();
|
|
if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.power();
|
|
if(cartridge.mode() == Cartridge::ModeSuperGameBoy) sgb.power();
|
|
|
|
if(cartridge.has_sa1()) sa1.power();
|
|
if(cartridge.has_srtc()) srtc.power();
|
|
if(cartridge.has_sdd1()) sdd1.power();
|
|
if(cartridge.has_spc7110()) spc7110.power();
|
|
if(cartridge.has_cx4()) cx4.power();
|
|
if(cartridge.has_dsp1()) dsp1.power();
|
|
if(cartridge.has_dsp2()) dsp2.power();
|
|
if(cartridge.has_dsp3()) dsp3.power();
|
|
if(cartridge.has_dsp4()) dsp4.power();
|
|
if(cartridge.has_obc1()) obc1.power();
|
|
if(cartridge.has_st010()) st010.power();
|
|
|
|
for(unsigned i = 0x2100; i <= 0x213f; i++) memory::mmio.map(i, ppu);
|
|
for(unsigned i = 0x2140; i <= 0x217f; i++) memory::mmio.map(i, cpu);
|
|
for(unsigned i = 0x2180; i <= 0x2183; i++) memory::mmio.map(i, cpu);
|
|
for(unsigned i = 0x4016; i <= 0x4017; i++) memory::mmio.map(i, cpu);
|
|
for(unsigned i = 0x4200; i <= 0x421f; i++) memory::mmio.map(i, cpu);
|
|
for(unsigned i = 0x4300; i <= 0x437f; i++) memory::mmio.map(i, cpu);
|
|
|
|
if(expansion() == ExpansionBSX) bsxbase.enable();
|
|
if(memory::bsxflash.data()) bsxflash.enable();
|
|
if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.enable();
|
|
if(cartridge.mode() == Cartridge::ModeSuperGameBoy) sgb.enable();
|
|
|
|
if(cartridge.has_sa1()) sa1.enable();
|
|
if(cartridge.has_srtc()) srtc.enable();
|
|
if(cartridge.has_sdd1()) sdd1.enable();
|
|
if(cartridge.has_spc7110()) spc7110.enable();
|
|
if(cartridge.has_cx4()) cx4.enable();
|
|
if(cartridge.has_dsp1()) dsp1.enable();
|
|
if(cartridge.has_dsp2()) dsp2.enable();
|
|
if(cartridge.has_dsp3()) dsp3.enable();
|
|
if(cartridge.has_dsp4()) dsp4.enable();
|
|
if(cartridge.has_obc1()) obc1.enable();
|
|
if(cartridge.has_st010()) st010.enable();
|
|
|
|
input.port_set_device(0, config.controller_port1);
|
|
input.port_set_device(1, config.controller_port2);
|
|
input.update();
|
|
video.update();
|
|
}
|
|
|
|
void System::reset() {
|
|
scheduler.init();
|
|
|
|
ppu.PPUcounter::reset();
|
|
cpu.reset();
|
|
smp.reset();
|
|
dsp.reset();
|
|
ppu.reset();
|
|
bus.reset();
|
|
|
|
if(expansion() == ExpansionBSX) bsxbase.reset();
|
|
if(memory::bsxflash.data()) bsxflash.reset();
|
|
if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.reset();
|
|
if(cartridge.mode() == Cartridge::ModeSuperGameBoy) sgb.reset();
|
|
|
|
if(cartridge.has_sa1()) sa1.reset();
|
|
if(cartridge.has_srtc()) srtc.reset();
|
|
if(cartridge.has_sdd1()) sdd1.reset();
|
|
if(cartridge.has_spc7110()) spc7110.reset();
|
|
if(cartridge.has_cx4()) cx4.reset();
|
|
if(cartridge.has_dsp1()) dsp1.reset();
|
|
if(cartridge.has_dsp2()) dsp2.reset();
|
|
if(cartridge.has_dsp3()) dsp3.reset();
|
|
if(cartridge.has_dsp4()) dsp4.reset();
|
|
if(cartridge.has_obc1()) obc1.reset();
|
|
if(cartridge.has_st010()) st010.reset();
|
|
|
|
input.port_set_device(0, config.controller_port1);
|
|
input.port_set_device(1, config.controller_port2);
|
|
input.update();
|
|
video.update();
|
|
}
|
|
|
|
void System::scanline() {
|
|
video.scanline();
|
|
|
|
if(ppu.vcounter() == 241) {
|
|
input.update();
|
|
video.update();
|
|
scheduler.exit();
|
|
}
|
|
}
|
|
|
|
void System::frame() {
|
|
}
|
|
|
|
System::Region System::region() const {
|
|
return (System::Region)snes_region;
|
|
}
|
|
|
|
System::ExpansionPortDevice System::expansion() const {
|
|
return (System::ExpansionPortDevice)snes_expansion;
|
|
}
|
|
|
|
System::System() : interface(0), snes_region(NTSC), snes_expansion(ExpansionNone) {
|
|
}
|
|
|
|
};
|
|
|