fix up SGB memorydomains
This commit is contained in:
parent
8ba1453660
commit
513ceba3d2
|
@ -1106,8 +1106,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
||||||
BSX_PRAM = 3,
|
BSX_PRAM = 3,
|
||||||
SUFAMI_TURBO_A_RAM = 4,
|
SUFAMI_TURBO_A_RAM = 4,
|
||||||
SUFAMI_TURBO_B_RAM = 5,
|
SUFAMI_TURBO_B_RAM = 5,
|
||||||
GAME_BOY_RAM = 6,
|
SGB_CARTRAM = 6,
|
||||||
GAME_BOY_RTC = 7,
|
SGB_RTC = 7,
|
||||||
|
SGB_WRAM = 8,
|
||||||
|
SGB_HRAM = 9,
|
||||||
|
|
||||||
WRAM = 100,
|
WRAM = 100,
|
||||||
APURAM = 101,
|
APURAM = 101,
|
||||||
|
|
|
@ -258,7 +258,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
||||||
|
|
||||||
api.snes_power();
|
api.snes_power();
|
||||||
|
|
||||||
SetupMemoryDomains(romData);
|
SetupMemoryDomains(romData,sgbRomData);
|
||||||
|
|
||||||
this.DeterministicEmulation = DeterministicEmulation;
|
this.DeterministicEmulation = DeterministicEmulation;
|
||||||
if (DeterministicEmulation) // save frame-0 savestate now
|
if (DeterministicEmulation) // save frame-0 savestate now
|
||||||
|
@ -863,28 +863,49 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
||||||
MemoryDomains.Add(md);
|
MemoryDomains.Add(md);
|
||||||
|
|
||||||
return md;
|
return md;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetupMemoryDomains(byte[] romData)
|
void SetupMemoryDomains(byte[] romData, byte[] sgbRomData)
|
||||||
{
|
{
|
||||||
MemoryDomains = new List<MemoryDomain>();
|
MemoryDomains = new List<MemoryDomain>();
|
||||||
// remember, MainMemory must always be the same as MemoryDomains[0], else GIANT DRAGONS
|
// remember, MainMemory must always be the same as MemoryDomains[0], else GIANT DRAGONS
|
||||||
MainMemory = MakeMemoryDomain("WRAM", LibsnesApi.SNES_MEMORY.WRAM, Endian.Little);
|
//<zeromus> - this is stupid.
|
||||||
|
|
||||||
if (romData != null)
|
//lets just do this entirely differently for SGB
|
||||||
|
if (IsSGB)
|
||||||
{
|
{
|
||||||
|
//NOTE: CGB has 32K of wram, and DMG has 8KB of wram. Not sure how to control this right now.. bsnes might not have any ready way of doign that? I couldnt spot it.
|
||||||
|
//You wouldnt expect a DMG game to access excess wram, but what if it tried to? maybe an oversight in bsnes?
|
||||||
|
MakeMemoryDomain("SGB WRAM", LibsnesApi.SNES_MEMORY.SGB_WRAM, Endian.Little);
|
||||||
|
|
||||||
|
|
||||||
|
var romDomain = new MemoryDomain("SGB CARTROM", romData.Length, Endian.Little,
|
||||||
|
(addr) => romData[addr],
|
||||||
|
(addr, value) => romData[addr] = value);
|
||||||
|
MemoryDomains.Add(romDomain);
|
||||||
|
|
||||||
|
|
||||||
|
//the last 1 byte of this is special.. its an interrupt enable register, instead of ram. weird. maybe its actually ram and just getting specially used?
|
||||||
|
MakeMemoryDomain("SGB HRAM", LibsnesApi.SNES_MEMORY.SGB_HRAM, Endian.Little);
|
||||||
|
|
||||||
|
MakeMemoryDomain("SGB CARTRAM", LibsnesApi.SNES_MEMORY.SGB_CARTRAM, Endian.Little);
|
||||||
|
|
||||||
|
MainMemory = MakeMemoryDomain("WRAM", LibsnesApi.SNES_MEMORY.WRAM, Endian.Little);
|
||||||
|
|
||||||
|
var sgbromDomain = new MemoryDomain("SGB.SFC ROM", sgbRomData.Length, Endian.Little,
|
||||||
|
(addr) => sgbRomData[addr],
|
||||||
|
(addr, value) => sgbRomData[addr] = value);
|
||||||
|
MemoryDomains.Add(sgbromDomain);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MainMemory = MakeMemoryDomain("WRAM", LibsnesApi.SNES_MEMORY.WRAM, Endian.Little);
|
||||||
|
|
||||||
var romDomain = new MemoryDomain("CARTROM", romData.Length, Endian.Little,
|
var romDomain = new MemoryDomain("CARTROM", romData.Length, Endian.Little,
|
||||||
(addr) => romData[addr],
|
(addr) => romData[addr],
|
||||||
(addr, value) => romData[addr] = value);
|
(addr, value) => romData[addr] = value);
|
||||||
MemoryDomains.Add(romDomain);
|
MemoryDomains.Add(romDomain);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//someone needs to comprehensively address these in SGB mode, and go hook them up in the gameboy core
|
|
||||||
if (!IsSGB)
|
|
||||||
{
|
|
||||||
MakeMemoryDomain("CARTRAM", LibsnesApi.SNES_MEMORY.CARTRIDGE_RAM, Endian.Little);
|
MakeMemoryDomain("CARTRAM", LibsnesApi.SNES_MEMORY.CARTRIDGE_RAM, Endian.Little);
|
||||||
MakeMemoryDomain("VRAM", LibsnesApi.SNES_MEMORY.VRAM, Endian.Little);
|
MakeMemoryDomain("VRAM", LibsnesApi.SNES_MEMORY.VRAM, Endian.Little);
|
||||||
MakeMemoryDomain("OAM", LibsnesApi.SNES_MEMORY.OAM, Endian.Little);
|
MakeMemoryDomain("OAM", LibsnesApi.SNES_MEMORY.OAM, Endian.Little);
|
||||||
|
@ -895,8 +916,10 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES
|
||||||
MemoryDomains.Add(new MemoryDomain("BUS", 0x1000000, Endian.Little,
|
MemoryDomains.Add(new MemoryDomain("BUS", 0x1000000, Endian.Little,
|
||||||
(addr) => api.peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr),
|
(addr) => api.peek(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr),
|
||||||
(addr, val) => api.poke(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr, val)));
|
(addr, val) => api.poke(LibsnesApi.SNES_MEMORY.SYSBUS, (uint)addr, val)));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IList<MemoryDomain> MemoryDomains { get; private set; }
|
public IList<MemoryDomain> MemoryDomains { get; private set; }
|
||||||
public MemoryDomain MainMemory { get; private set; }
|
public MemoryDomain MainMemory { get; private set; }
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -441,14 +441,18 @@ namespace BizHawk.MultiClient
|
||||||
|
|
||||||
private void SetMemoryDomain(int pos)
|
private void SetMemoryDomain(int pos)
|
||||||
{
|
{
|
||||||
|
//<zeromus> THIS IS HORRIBLE.
|
||||||
if (pos == 999)
|
if (pos == 999)
|
||||||
{
|
{
|
||||||
|
//<zeromus> THIS IS HORRIBLE.
|
||||||
ROM = GetRomBytes() ?? new byte[] { 0xFF };
|
ROM = GetRomBytes() ?? new byte[] { 0xFF };
|
||||||
|
|
||||||
|
//<zeromus> THIS IS HORRIBLE.
|
||||||
ROMDomain = new MemoryDomain("ROM File", ROM.Length, Endian.Little,
|
ROMDomain = new MemoryDomain("ROM File", ROM.Length, Endian.Little,
|
||||||
i => ROM[i],
|
i => ROM[i],
|
||||||
(i, value) => ROM[i] = value);
|
(i, value) => ROM[i] = value);
|
||||||
|
|
||||||
|
//<zeromus> THIS IS HORRIBLE.
|
||||||
Domain = ROMDomain;
|
Domain = ROMDomain;
|
||||||
}
|
}
|
||||||
else if (pos < Global.Emulator.MemoryDomains.Count) //Sanity check
|
else if (pos < Global.Emulator.MemoryDomains.Count) //Sanity check
|
||||||
|
@ -498,6 +502,7 @@ namespace BizHawk.MultiClient
|
||||||
}
|
}
|
||||||
|
|
||||||
//Add ROM File memory domain
|
//Add ROM File memory domain
|
||||||
|
//<zeromus> THIS IS HORRIBLE.
|
||||||
var rom_item = new ToolStripMenuItem {Text = "ROM File"};
|
var rom_item = new ToolStripMenuItem {Text = "ROM File"};
|
||||||
rom_item.Click += (o, ev) => SetMemoryDomain(999); //999 will denote ROM file
|
rom_item.Click += (o, ev) => SetMemoryDomain(999); //999 will denote ROM file
|
||||||
memoryDomainsToolStripMenuItem.DropDownItems.Add(rom_item);
|
memoryDomainsToolStripMenuItem.DropDownItems.Add(rom_item);
|
||||||
|
|
|
@ -60,7 +60,7 @@ void Cartridge::load(System::Revision revision, const string &markup, const uint
|
||||||
case Mapper::HuC3: mapper = &huc3; break;
|
case Mapper::HuC3: mapper = &huc3; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ramdata = (uint8_t*)interface->allocSharedMemory("GAME_BOY_RAM",ramsize = info.ramsize);
|
ramdata = (uint8_t*)interface->allocSharedMemory("SGB_CARTRAM",ramsize = info.ramsize);
|
||||||
system.load(revision);
|
system.load(revision);
|
||||||
|
|
||||||
loaded = true;
|
loaded = true;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include <gameboy/gameboy.hpp>
|
#include <gameboy/gameboy.hpp>
|
||||||
|
|
||||||
|
#include <snes/snes.hpp>
|
||||||
|
|
||||||
#define CPU_CPP
|
#define CPU_CPP
|
||||||
namespace GameBoy {
|
namespace GameBoy {
|
||||||
|
|
||||||
|
@ -129,8 +131,8 @@ void CPU::power() {
|
||||||
bus.mmio[0xff77] = this; //???
|
bus.mmio[0xff77] = this; //???
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto &n : wram) n = 0x00;
|
for(unsigned n = 0; n < 32768; n++) wram[n] = 0x00;
|
||||||
for(auto &n : hram) n = 0x00;
|
for(unsigned n = 0; n < 8192; n++) hram[n] = 0x00;
|
||||||
|
|
||||||
r[PC] = 0x0000;
|
r[PC] = 0x0000;
|
||||||
r[SP] = 0x0000;
|
r[SP] = 0x0000;
|
||||||
|
@ -195,8 +197,24 @@ void CPU::power() {
|
||||||
status.interrupt_enable_vblank = 0;
|
status.interrupt_enable_vblank = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPU::CPU() : trace(false) {
|
CPU::CPU()
|
||||||
|
: trace(false)
|
||||||
|
, wram(nullptr)
|
||||||
|
, hram(nullptr)
|
||||||
|
{
|
||||||
initialize_opcode_table();
|
initialize_opcode_table();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CPU::~CPU()
|
||||||
|
{
|
||||||
|
SNES::interface()->freeSharedMemory(wram);
|
||||||
|
SNES::interface()->freeSharedMemory(hram);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CPU::initialize()
|
||||||
|
{
|
||||||
|
wram = (uint8*)SNES::interface()->allocSharedMemory("SGB_WRAM", 32768);
|
||||||
|
hram = (uint8*)SNES::interface()->allocSharedMemory("SGB_HRAM", 8192);
|
||||||
|
}
|
||||||
|
|
||||||
|
} //namespace GameBoy
|
||||||
|
|
|
@ -88,8 +88,8 @@ struct CPU : Processor, MMIO {
|
||||||
bool interrupt_enable_vblank;
|
bool interrupt_enable_vblank;
|
||||||
} status;
|
} status;
|
||||||
|
|
||||||
uint8 wram[32768]; //GB=8192, GBC=32768
|
uint8* wram; //[32768]; //GB=8192, GBC=32768
|
||||||
uint8 hram[128];
|
uint8* hram; //[128];
|
||||||
|
|
||||||
static void Main();
|
static void Main();
|
||||||
void main();
|
void main();
|
||||||
|
@ -99,7 +99,9 @@ struct CPU : Processor, MMIO {
|
||||||
void power();
|
void power();
|
||||||
|
|
||||||
void serialize(serializer&);
|
void serialize(serializer&);
|
||||||
|
void initialize();
|
||||||
CPU();
|
CPU();
|
||||||
|
~CPU();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CPU cpu;
|
extern CPU cpu;
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
void CPU::serialize(serializer &s) {
|
void CPU::serialize(serializer &s) {
|
||||||
Processor::serialize(s);
|
Processor::serialize(s);
|
||||||
|
|
||||||
s.array(wram);
|
s.array(wram,32768);
|
||||||
s.array(hram);
|
s.array(hram,8192);
|
||||||
|
|
||||||
s.integer(r.a.data);
|
s.integer(r.a.data);
|
||||||
s.integer(r.f.z);
|
s.integer(r.f.z);
|
||||||
|
|
|
@ -252,6 +252,10 @@ void snes_init(void) {
|
||||||
reconstruct(&SNES::ppu);
|
reconstruct(&SNES::ppu);
|
||||||
SNES::ppu.initialize();
|
SNES::ppu.initialize();
|
||||||
SNES::system.init();
|
SNES::system.init();
|
||||||
|
|
||||||
|
//zero 26-aug-2013 - yup. still more
|
||||||
|
reconstruct(&GameBoy::cpu); GameBoy::cpu.initialize();
|
||||||
|
|
||||||
SNES::input.connect(SNES::Controller::Port1, SNES::Input::Device::Joypad);
|
SNES::input.connect(SNES::Controller::Port1, SNES::Input::Device::Joypad);
|
||||||
SNES::input.connect(SNES::Controller::Port2, SNES::Input::Device::Joypad);
|
SNES::input.connect(SNES::Controller::Port2, SNES::Input::Device::Joypad);
|
||||||
}
|
}
|
||||||
|
@ -559,12 +563,18 @@ uint8_t* snes_get_memory_data(unsigned id) {
|
||||||
case SNES_MEMORY_SUFAMI_TURBO_B_RAM:
|
case SNES_MEMORY_SUFAMI_TURBO_B_RAM:
|
||||||
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SufamiTurbo) break;
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SufamiTurbo) break;
|
||||||
return SNES::sufamiturbo.slotB.ram.data();
|
return SNES::sufamiturbo.slotB.ram.data();
|
||||||
case SNES_MEMORY_GAME_BOY_RAM:
|
case SNES_MEMORY_GAME_BOY_CARTRAM:
|
||||||
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
return GameBoy::cartridge.ramdata;
|
return GameBoy::cartridge.ramdata;
|
||||||
//case SNES_MEMORY_GAME_BOY_RTC:
|
//case SNES_MEMORY_GAME_BOY_RTC:
|
||||||
// if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
// if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
// return GameBoy::cartridge.rtcdata;
|
// return GameBoy::cartridge.rtcdata;
|
||||||
|
case SNES_MEMORY_GAME_BOY_WRAM:
|
||||||
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
|
return GameBoy::cpu.wram;
|
||||||
|
case SNES_MEMORY_GAME_BOY_HRAM:
|
||||||
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
|
return GameBoy::cpu.hram;
|
||||||
|
|
||||||
case SNES_MEMORY_WRAM:
|
case SNES_MEMORY_WRAM:
|
||||||
return SNES::cpu.wram;
|
return SNES::cpu.wram;
|
||||||
|
@ -603,13 +613,20 @@ const char* snes_get_memory_id_name(unsigned id) {
|
||||||
case SNES_MEMORY_SUFAMI_TURBO_B_RAM:
|
case SNES_MEMORY_SUFAMI_TURBO_B_RAM:
|
||||||
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SufamiTurbo) break;
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SufamiTurbo) break;
|
||||||
return "SUFAMI_SLOTBRAM";
|
return "SUFAMI_SLOTBRAM";
|
||||||
case SNES_MEMORY_GAME_BOY_RAM:
|
case SNES_MEMORY_GAME_BOY_CARTRAM:
|
||||||
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
//return GameBoy::cartridge.ramdata;
|
//return GameBoy::cartridge.ramdata;
|
||||||
return "SGB_CARTRAM";
|
return "SGB_CARTRAM";
|
||||||
//case SNES_MEMORY_GAME_BOY_RTC:
|
//case SNES_MEMORY_GAME_BOY_RTC:
|
||||||
// if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
// if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
// return GameBoy::cartridge.rtcdata;
|
// return GameBoy::cartridge.rtcdata;
|
||||||
|
case SNES_MEMORY_GAME_BOY_WRAM:
|
||||||
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
|
//see notes in SetupMemoryDomains in bizhawk
|
||||||
|
return "SGB_WRAM";
|
||||||
|
case SNES_MEMORY_GAME_BOY_HRAM:
|
||||||
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
|
return "SGB_HRAM";
|
||||||
|
|
||||||
case SNES_MEMORY_WRAM:
|
case SNES_MEMORY_WRAM:
|
||||||
//return SNES::cpu.wram;
|
//return SNES::cpu.wram;
|
||||||
|
@ -655,7 +672,7 @@ unsigned snes_get_memory_size(unsigned id) {
|
||||||
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SufamiTurbo) break;
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SufamiTurbo) break;
|
||||||
size = SNES::sufamiturbo.slotB.ram.size();
|
size = SNES::sufamiturbo.slotB.ram.size();
|
||||||
break;
|
break;
|
||||||
case SNES_MEMORY_GAME_BOY_RAM:
|
case SNES_MEMORY_GAME_BOY_CARTRAM:
|
||||||
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
size = GameBoy::cartridge.ramsize;
|
size = GameBoy::cartridge.ramsize;
|
||||||
break;
|
break;
|
||||||
|
@ -663,6 +680,15 @@ unsigned snes_get_memory_size(unsigned id) {
|
||||||
// if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
// if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
// size = GameBoy::cartridge.rtcsize;
|
// size = GameBoy::cartridge.rtcsize;
|
||||||
// break;
|
// break;
|
||||||
|
case SNES_MEMORY_GAME_BOY_WRAM:
|
||||||
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
|
//see notes in SetupMemoryDomains in bizhawk
|
||||||
|
size = 32768;
|
||||||
|
break;
|
||||||
|
case SNES_MEMORY_GAME_BOY_HRAM:
|
||||||
|
if(SNES::cartridge.mode() != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||||
|
size = 128;
|
||||||
|
break;
|
||||||
|
|
||||||
case SNES_MEMORY_WRAM:
|
case SNES_MEMORY_WRAM:
|
||||||
size = 128 * 1024;
|
size = 128 * 1024;
|
||||||
|
|
|
@ -67,8 +67,10 @@ extern "C" {
|
||||||
#define SNES_MEMORY_BSX_PRAM 3
|
#define SNES_MEMORY_BSX_PRAM 3
|
||||||
#define SNES_MEMORY_SUFAMI_TURBO_A_RAM 4
|
#define SNES_MEMORY_SUFAMI_TURBO_A_RAM 4
|
||||||
#define SNES_MEMORY_SUFAMI_TURBO_B_RAM 5
|
#define SNES_MEMORY_SUFAMI_TURBO_B_RAM 5
|
||||||
#define SNES_MEMORY_GAME_BOY_RAM 6
|
#define SNES_MEMORY_GAME_BOY_CARTRAM 6
|
||||||
#define SNES_MEMORY_GAME_BOY_RTC 7
|
#define SNES_MEMORY_GAME_BOY_RTC 7
|
||||||
|
#define SNES_MEMORY_GAME_BOY_WRAM 8
|
||||||
|
#define SNES_MEMORY_GAME_BOY_HRAM 9
|
||||||
|
|
||||||
#define SNES_MEMORY_WRAM 100
|
#define SNES_MEMORY_WRAM 100
|
||||||
#define SNES_MEMORY_APURAM 101
|
#define SNES_MEMORY_APURAM 101
|
||||||
|
|
Loading…
Reference in New Issue