#include namespace SuperFamicom { System system; #include "video.cpp" #include "peripherals.cpp" #include "random.cpp" #include "serialization.cpp" auto System::run() -> void { scheduler.enter(); } auto System::runToSave() -> void { scheduler.synchronize(cpu.thread); scheduler.synchronize(smp.thread); scheduler.synchronize(ppu.thread); scheduler.synchronize(dsp.thread); for(auto coprocessor : cpu.coprocessors) { scheduler.synchronize(coprocessor->thread); } for(auto peripheral : cpu.peripherals) { scheduler.synchronize(peripheral->thread); } } auto System::init() -> void { assert(interface != nullptr); icd2.init(); mcc.init(); nss.init(); event.init(); sa1.init(); superfx.init(); armdsp.init(); hitachidsp.init(); necdsp.init(); epsonrtc.init(); sharprtc.init(); spc7110.init(); sdd1.init(); obc1.init(); msu1.init(); bsmemory.init(); } auto System::term() -> void { } auto System::load() -> void { bus.reset(); interface->loadRequest(ID::SystemManifest, "manifest.bml", true); auto document = BML::unserialize(information.manifest); if(auto iplrom = document["system/smp/rom/name"].text()) { interface->loadRequest(ID::IPLROM, iplrom, true); } cartridge.load(); _region = cartridge.region() == Cartridge::Region::NTSC ? Region::NTSC : Region::PAL; _cpuFrequency = region() == Region::NTSC ? 21'477'272 : 21'281'370; _apuFrequency = 24'606'720; if(cartridge.hasICD2()) icd2.load(); if(cartridge.hasMCC()) mcc.load(); if(cartridge.hasNSSDIP()) nss.load(); if(cartridge.hasEvent()) event.load(); if(cartridge.hasSA1()) sa1.load(); if(cartridge.hasSuperFX()) superfx.load(); if(cartridge.hasARMDSP()) armdsp.load(); if(cartridge.hasHitachiDSP()) hitachidsp.load(); if(cartridge.hasNECDSP()) necdsp.load(); if(cartridge.hasEpsonRTC()) epsonrtc.load(); if(cartridge.hasSharpRTC()) sharprtc.load(); if(cartridge.hasSPC7110()) spc7110.load(); if(cartridge.hasSDD1()) sdd1.load(); if(cartridge.hasOBC1()) obc1.load(); if(cartridge.hasMSU1()) msu1.load(); if(cartridge.hasBSMemorySlot()) bsmemory.load(); if(cartridge.hasSufamiTurboSlots()) sufamiturboA.load(), sufamiturboB.load(); serializeInit(); _loaded = true; } auto System::unload() -> void { if(!loaded()) return; peripherals.unload(); if(cartridge.hasICD2()) icd2.unload(); if(cartridge.hasMCC()) mcc.unload(); if(cartridge.hasNSSDIP()) nss.unload(); if(cartridge.hasEvent()) event.unload(); if(cartridge.hasSA1()) sa1.unload(); if(cartridge.hasSuperFX()) superfx.unload(); if(cartridge.hasARMDSP()) armdsp.unload(); if(cartridge.hasHitachiDSP()) hitachidsp.unload(); if(cartridge.hasNECDSP()) necdsp.unload(); if(cartridge.hasEpsonRTC()) epsonrtc.unload(); if(cartridge.hasSharpRTC()) sharprtc.unload(); if(cartridge.hasSPC7110()) spc7110.unload(); if(cartridge.hasSDD1()) sdd1.unload(); if(cartridge.hasOBC1()) obc1.unload(); if(cartridge.hasMSU1()) msu1.unload(); if(cartridge.hasBSMemorySlot()) bsmemory.unload(); if(cartridge.hasSufamiTurboSlots()) sufamiturboA.unload(), sufamiturboB.unload(); cartridge.unload(); _loaded = false; } auto System::power() -> void { random.seed((uint)time(0)); cpu.power(); smp.power(); dsp.power(); ppu.power(); if(cartridge.hasICD2()) icd2.power(); if(cartridge.hasMCC()) mcc.power(); if(cartridge.hasNSSDIP()) nss.power(); if(cartridge.hasEvent()) event.power(); if(cartridge.hasSA1()) sa1.power(); if(cartridge.hasSuperFX()) superfx.power(); if(cartridge.hasARMDSP()) armdsp.power(); if(cartridge.hasHitachiDSP()) hitachidsp.power(); if(cartridge.hasNECDSP()) necdsp.power(); if(cartridge.hasEpsonRTC()) epsonrtc.power(); if(cartridge.hasSharpRTC()) sharprtc.power(); if(cartridge.hasSPC7110()) spc7110.power(); if(cartridge.hasSDD1()) sdd1.power(); if(cartridge.hasOBC1()) obc1.power(); if(cartridge.hasMSU1()) msu1.power(); if(cartridge.hasBSMemorySlot()) bsmemory.power(); reset(); } auto System::reset() -> void { Emulator::video.reset(); Emulator::video.setInterface(interface); configureVideoPalette(); configureVideoEffects(); Emulator::audio.reset(); Emulator::audio.setInterface(interface); cpu.reset(); smp.reset(); dsp.reset(); ppu.reset(); if(cartridge.hasICD2()) icd2.reset(); if(cartridge.hasMCC()) mcc.reset(); if(cartridge.hasNSSDIP()) nss.reset(); if(cartridge.hasEvent()) event.reset(); if(cartridge.hasSA1()) sa1.reset(); if(cartridge.hasSuperFX()) superfx.reset(); if(cartridge.hasARMDSP()) armdsp.reset(); if(cartridge.hasHitachiDSP()) hitachidsp.reset(); if(cartridge.hasNECDSP()) necdsp.reset(); if(cartridge.hasEpsonRTC()) epsonrtc.reset(); if(cartridge.hasSharpRTC()) sharprtc.reset(); if(cartridge.hasSPC7110()) spc7110.reset(); if(cartridge.hasSDD1()) sdd1.reset(); if(cartridge.hasOBC1()) obc1.reset(); if(cartridge.hasMSU1()) msu1.reset(); if(cartridge.hasBSMemorySlot()) bsmemory.reset(); if(cartridge.hasICD2()) cpu.coprocessors.append(&icd2); if(cartridge.hasEvent()) cpu.coprocessors.append(&event); if(cartridge.hasSA1()) cpu.coprocessors.append(&sa1); if(cartridge.hasSuperFX()) cpu.coprocessors.append(&superfx); if(cartridge.hasARMDSP()) cpu.coprocessors.append(&armdsp); if(cartridge.hasHitachiDSP()) cpu.coprocessors.append(&hitachidsp); if(cartridge.hasNECDSP()) cpu.coprocessors.append(&necdsp); if(cartridge.hasEpsonRTC()) cpu.coprocessors.append(&epsonrtc); if(cartridge.hasSharpRTC()) cpu.coprocessors.append(&sharprtc); if(cartridge.hasSPC7110()) cpu.coprocessors.append(&spc7110); if(cartridge.hasMSU1()) cpu.coprocessors.append(&msu1); scheduler.reset(); peripherals.reset(); } }