mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-02-24 23:22:25 +01:00
byuu says: Changelog: - moved Thread, Scheduler, Cheat functionality into emulator/ for all cores - start of actual Mega Drive emulation (two 68K instructions) I'm going to be rather terse on MD emulation, as it's too early for any meaningful dialogue here.
64 lines
1.7 KiB
C++
64 lines
1.7 KiB
C++
#include <ws/ws.hpp>
|
|
|
|
namespace WonderSwan {
|
|
|
|
InternalRAM iram;
|
|
Bus bus;
|
|
|
|
auto InternalRAM::power() -> void {
|
|
for(auto& byte : memory) byte = 0x00;
|
|
}
|
|
|
|
auto InternalRAM::serialize(serializer& s) -> void {
|
|
s.array(memory, system.model() == Model::WonderSwan ? 0x4000 : 0x10000);
|
|
}
|
|
|
|
auto InternalRAM::read(uint16 addr, uint size) -> uint32 {
|
|
if(size == Long) return read(addr + 0, Word) << 0 | read(addr + 2, Word) << 16;
|
|
if(size == Word) return read(addr + 0, Byte) << 0 | read(addr + 1, Byte) << 8;
|
|
|
|
if(addr >= 0x4000 && !system.color()) return 0x90;
|
|
return memory[addr];
|
|
}
|
|
|
|
auto InternalRAM::write(uint16 addr, uint8 data) -> void {
|
|
if(addr >= 0x4000 && !system.color()) return;
|
|
memory[addr] = data;
|
|
}
|
|
|
|
auto Bus::power() -> void {
|
|
for(auto& io : port) io = nullptr;
|
|
}
|
|
|
|
auto Bus::read(uint20 addr) -> uint8 {
|
|
uint8 data = 0;
|
|
if(addr.bits(16,19) == 0) data = iram.read(addr);
|
|
if(addr.bits(16,19) == 1) data = cartridge.ramRead(addr);
|
|
if(addr.bits(16,19) >= 2) data = cartridge.romRead(addr);
|
|
if(cheat) {
|
|
if(auto result = cheat.find(addr, data)) data = result();
|
|
}
|
|
return data;
|
|
}
|
|
|
|
auto Bus::write(uint20 addr, uint8 data) -> void {
|
|
if(addr.bits(16,19) == 0) iram.write(addr, data);
|
|
if(addr.bits(16,19) == 1) cartridge.ramWrite(addr, data);
|
|
if(addr.bits(16,19) >= 2) cartridge.romWrite(addr, data);
|
|
}
|
|
|
|
auto Bus::map(IO* io, uint16_t lo, maybe<uint16_t> hi) -> void {
|
|
for(uint addr = lo; addr <= (hi ? hi() : lo); addr++) port[addr] = io;
|
|
}
|
|
|
|
auto Bus::portRead(uint16 addr) -> uint8 {
|
|
if(auto io = port[addr]) return io->portRead(addr);
|
|
return 0x00;
|
|
}
|
|
|
|
auto Bus::portWrite(uint16 addr, uint8 data) -> void {
|
|
if(auto io = port[addr]) return io->portWrite(addr, data);
|
|
}
|
|
|
|
}
|