fix up SGB memorydomains

This commit is contained in:
zeromus 2013-08-26 07:17:47 +00:00
parent 8ba1453660
commit 513ceba3d2
11 changed files with 104 additions and 26 deletions

View File

@ -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,

View File

@ -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; }

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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