Skip to content

Commit

Permalink
platform cleanup (fixes DMG-on-CGB)
Browse files Browse the repository at this point in the history
  • Loading branch information
gifvex committed Feb 8, 2020
1 parent e93d89e commit c5e4823
Show file tree
Hide file tree
Showing 14 changed files with 65 additions and 70 deletions.
5 changes: 2 additions & 3 deletions libgambatte/src/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ class CPU {
mem_.setOsdElement(osdElement);
}

LoadRes load(std::string const &romfile, bool cgbMode, bool multicartCompat) {
return mem_.loadROM(romfile, cgbMode, multicartCompat);
LoadRes load(std::string const &romfile, unsigned flags) {
return mem_.loadROM(romfile, flags);
}

bool loaded() const { return mem_.loaded(); }
Expand All @@ -75,7 +75,6 @@ class CPU {
void setGameGenie(std::string const &codes) { mem_.setGameGenie(codes); }
void setGameShark(std::string const &codes) { mem_.setGameShark(codes); }
void setBios(unsigned char *buffer, std::size_t size) { mem_.setBios(buffer, size); }
bool gbIsCgb() { return mem_.gbIsCgb(); }

unsigned char externalRead(unsigned short addr) {
return mem_.read(addr, cycleCounter_);
Expand Down
10 changes: 4 additions & 6 deletions libgambatte/src/gambatte.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,7 @@ void GB::reset(std::size_t samplesToStall, std::string const &build) {
SaveState state;
p_->cpu.setStatePtrs(state);
p_->cpu.saveState(state);
unsigned flags = p_->loadflags;
setInitState(state, flags & CGB_MODE, flags & GBA_FLAG, flags & SGB_MODE);
setInitState(state, p_->loadflags & CGB_MODE, p_->loadflags & SGB_MODE);
p_->cpu.loadState(state);

if (samplesToStall > 0)
Expand All @@ -118,14 +117,13 @@ LoadRes GB::load(std::string const &romfile, unsigned const flags) {
if (p_->cpu.loaded() && p_->implicitSave())
p_->cpu.saveSavedata();

LoadRes const loadres = p_->cpu.load(romfile,
flags & CGB_MODE,
flags & MULTICART_COMPAT);
LoadRes const loadres = p_->cpu.load(romfile, flags);

if (loadres == LOADRES_OK) {
SaveState state;
p_->cpu.setStatePtrs(state);
p_->loadflags = flags;
setInitState(state, flags & CGB_MODE, flags & GBA_FLAG, flags & SGB_MODE);
setInitState(state, flags & CGB_MODE, flags & SGB_MODE);
setInitStateCart(state);
p_->cpu.loadState(state);
p_->cpu.loadSavedata();
Expand Down
8 changes: 2 additions & 6 deletions libgambatte/src/initstate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1150,7 +1150,7 @@ static void setInitialDmgIoamhram(unsigned char ioamhram[]) {

} // anon namespace

void gambatte::setInitState(SaveState &state, bool const cgb, bool const agb, bool const sgb) {
void gambatte::setInitState(SaveState &state, bool const cgb, bool const sgb) {
static unsigned char const cgbObjpDump[0x40] = {
0x00, 0x00, 0xF2, 0xAB,
0x61, 0xC2, 0xD9, 0xBA,
Expand Down Expand Up @@ -1187,8 +1187,6 @@ void gambatte::setInitState(SaveState &state, bool const cgb, bool const agb, bo
state.cpu.prefetched = false;
state.cpu.skip = false;
state.mem.biosMode = true;
state.mem.cgbSwitching = false;
state.mem.agbFlag = cgb && agb;

setInitialVram(state.mem.vram.ptr, cgb);

Expand Down Expand Up @@ -1225,8 +1223,6 @@ void gambatte::setInitState(SaveState &state, bool const cgb, bool const agb, bo
state.mem.enableRam = false;
state.mem.rambankMode = false;
state.mem.hdmaTransfer = false;
state.mem.gbIsCgb = cgb;
state.mem.gbIsSgb = sgb;
state.mem.stopped = false;


Expand Down Expand Up @@ -1300,7 +1296,7 @@ void gambatte::setInitState(SaveState &state, bool const cgb, bool const agb, bo
state.ppu.nextM0Irq = 0;
state.ppu.oldWy = state.mem.ioamhram.get()[0x14A];
state.ppu.pendingLcdstatIrq = false;
state.ppu.isCgb = cgb;
state.ppu.notCgbDmg = true;

// spu.cycleCounter >> 12 & 7 represents the frame sequencer position.
state.spu.cycleCounter = state.cpu.cycleCounter >> 1;
Expand Down
2 changes: 1 addition & 1 deletion libgambatte/src/initstate.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

namespace gambatte {

void setInitState(struct SaveState &state, bool cgb, bool agb, bool sgb);
void setInitState(struct SaveState &state, bool cgb, bool sgb);
void setInitStateCart(struct SaveState &state);

}
Expand Down
2 changes: 1 addition & 1 deletion libgambatte/src/mem/time.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void Time::loadState(SaveState const &state) {
lastTime_.tv_sec = state.time.lastTimeSec;
lastTime_.tv_usec = state.time.lastTimeUsec;
lastCycles_ = state.time.lastCycles;
ds_ = state.ppu.isCgb & state.mem.ioamhram.get()[0x14D] >> 7;
ds_ = state.mem.ioamhram.get()[0x14D] >> 7;
}

std::time_t Time::get(unsigned long const cc) {
Expand Down
56 changes: 30 additions & 26 deletions libgambatte/src/memory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
//

#include "memory.h"
#include "gambatte.h"
#include "inputgetter.h"
#include "savestate.h"
#include "sound.h"
Expand Down Expand Up @@ -92,10 +93,6 @@ unsigned long Memory::saveState(SaveState &state, unsigned long cc) {
state.mem.oamDmaPos = oamDmaPos_;
state.mem.haltHdmaState = haltHdmaState_;
state.mem.biosMode = biosMode_;
state.mem.cgbSwitching = cgbSwitching_;
state.mem.agbFlag = agbFlag_;
state.mem.gbIsCgb = gbIsCgb_;
state.mem.gbIsSgb = gbIsSgb_;
state.mem.stopped = stopped_;

intreq_.saveState(state);
Expand All @@ -110,10 +107,6 @@ unsigned long Memory::saveState(SaveState &state, unsigned long cc) {

void Memory::loadState(SaveState const &state) {
biosMode_ = state.mem.biosMode;
cgbSwitching_ = state.mem.cgbSwitching;
agbFlag_ = state.mem.agbFlag;
gbIsCgb_ = state.mem.gbIsCgb;
gbIsSgb_ = state.mem.gbIsSgb;
stopped_ = state.mem.stopped;
psg_.loadState(state);
lcd_.loadState(state, state.mem.oamDmaPos < oam_size ? cart_.rdisabledRam() : ioamhram_);
Expand Down Expand Up @@ -232,7 +225,7 @@ unsigned long Memory::event(unsigned long cc) {
if (lcden | blanklcd_) {
if (intreq_.eventTime(intevent_unhalt) == disabled_time) {
lcd_.updateScreen(blanklcd_, cc, 0);
if (gbIsSgb_)
if (isSgb())
sgb_.updateScreen();
lcd_.updateScreen(blanklcd_, cc, 1);
} else {
Expand Down Expand Up @@ -285,7 +278,7 @@ unsigned long Memory::event(unsigned long cc) {
}

if (halted()) {
cc += 4 * (gbIsCgb_ || cc - intreq_.eventTime(intevent_interrupts) < 2);
cc += 4 * (isCgb() || cc - intreq_.eventTime(intevent_interrupts) < 2);
if (cc > lastOamDmaUpdate_)
updateOamDma(cc);
if ((lcd_.hdmaIsEnabled() && lcd_.isHdmaPeriod(cc) && haltHdmaState_ == hdma_low)
Expand Down Expand Up @@ -533,7 +526,7 @@ void Memory::updateInput() {
if (state != 0xF && (ioamhram_[0x100] & 0xF) == 0xF)
intreq_.flagIrq(0x10);
}
} else if (gbIsSgb_)
} else if (isSgb())
state -= sgb_.getJoypadIndex();

ioamhram_[0x100] = (ioamhram_[0x100] & -0x10u) | state;
Expand Down Expand Up @@ -725,7 +718,7 @@ void Memory::nontrivial_ff_write(unsigned const p, unsigned data, unsigned long
switch (p & 0xFF) {
case 0x00:
if ((data ^ ioamhram_[0x100]) & 0x30) {
if (gbIsSgb_) {
if (isSgb()) {
if ((((data ^ ioamhram_[0x100]) & 0x30) & data) && !biosMode_)
sgb_.onJoypad(ioamhram_[0x100]);
}
Expand Down Expand Up @@ -1027,17 +1020,17 @@ void Memory::nontrivial_ff_write(unsigned const p, unsigned data, unsigned long
oamDmaInitSetup();
return;
case 0x47:
if (!isCgb())
if (!isCgb() || isCgbDmg())
lcd_.dmgBgPaletteChange(data, cc);

break;
case 0x48:
if (!isCgb())
if (!isCgb() || isCgbDmg())
lcd_.dmgSpPalette1Change(data, cc);

break;
case 0x49:
if (!isCgb())
if (!isCgb() || isCgbDmg())
lcd_.dmgSpPalette2Change(data, cc);

break;
Expand All @@ -1047,26 +1040,33 @@ void Memory::nontrivial_ff_write(unsigned const p, unsigned data, unsigned long
case 0x4B:
lcd_.wxChange(data, cc);
break;
case 0x4C:
if (!biosMode_)
return;

break;
case 0x4D:
if (isCgb())
if (isCgb() && !isCgbDmg())
ioamhram_[0x14D] = (ioamhram_[0x14D] & ~1u) | (data & 1);

return;
case 0x4F:
if (isCgb()) {
if (isCgb() && !isCgbDmg()) {
cart_.setVrambank(data & 1);
ioamhram_[0x14F] = 0xFE | data;
}

return;
case 0x50:
biosMode_ = false;
if(cgbSwitching_) {
if (!biosMode_)
return;

if (isCgb() && (ioamhram_[0x14C] & 0x04)) {
lcd_.copyCgbPalettesToDmg();
lcd_.setCgb(false);
cgbSwitching_ = false;
lcd_.setCgbDmg(true);
}

biosMode_ = false;
return;
case 0x51:
dmaSource_ = data << 8 | (dmaSource_ & 0xFF);
Expand Down Expand Up @@ -1135,14 +1135,12 @@ void Memory::nontrivial_ff_write(unsigned const p, unsigned data, unsigned long

return;
case 0x6C:
if (isCgb()) {
if (isCgb())
ioamhram_[0x16C] = data | 0xFE;
cgbSwitching_ = true;
}

return;
case 0x70:
if (isCgb()) {
if (isCgb() && !isCgbDmg()) {
cart_.setWrambank(data & 0x07 ? data & 0x07 : 1);
ioamhram_[0x170] = data | 0xF8;
}
Expand Down Expand Up @@ -1221,14 +1219,20 @@ void Memory::nontrivial_write(unsigned const p, unsigned const data, unsigned lo
ioamhram_[p - mm_oam_begin] = data;
}

LoadRes Memory::loadROM(std::string const &romfile, bool const cgbMode, bool const multicartCompat) {
LoadRes Memory::loadROM(std::string const &romfile, unsigned const flags) {
bool const cgbMode = flags & GB::LoadFlag::CGB_MODE;
bool const multicartCompat = flags & GB::LoadFlag::MULTICART_COMPAT;

if (LoadRes const fail = cart_.loadROM(romfile, cgbMode, multicartCompat))
return fail;

psg_.init(cart_.isCgb());
lcd_.reset(ioamhram_, cart_.vramdata(), cart_.isCgb());
interrupter_.setGameShark(std::string());

agbFlag_ = flags & GB::LoadFlag::GBA_FLAG;
gbIsSgb_ = flags & GB::LoadFlag::SGB_MODE;

return LOADRES_OK;
}

Expand Down
7 changes: 3 additions & 4 deletions libgambatte/src/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ class Memory {
unsigned long stop(unsigned long cycleCounter, bool &skip);
void stall(unsigned long cycleCounter, unsigned long cycles);
bool isCgb() const { return lcd_.isCgb(); }
bool isCgbDmg() const { return lcd_.isCgbDmg(); }
bool isSgb() const { return gbIsSgb_; }
bool ime() const { return intreq_.ime(); }
bool halted() const { return intreq_.halted(); }
unsigned long nextEventTime() const { return intreq_.minEventTime(); }
Expand Down Expand Up @@ -111,7 +113,7 @@ class Memory {

unsigned long event(unsigned long cycleCounter);
unsigned long resetCounters(unsigned long cycleCounter);
LoadRes loadROM(std::string const &romfile, bool cgbMode, bool multicartCompat);
LoadRes loadROM(std::string const &romfile, unsigned flags);
void setSaveDir(std::string const &dir) { cart_.setSaveDir(dir); }

void setInputGetter(InputGetter *getInput, void *p) {
Expand Down Expand Up @@ -156,7 +158,6 @@ class Memory {
std::memcpy(bios_, buffer, size);
biosSize_ = size;
}
bool gbIsCgb() { return gbIsCgb_; }

unsigned timeNow(unsigned long const cc) const { return cart_.timeNow(cc); }

Expand Down Expand Up @@ -190,9 +191,7 @@ class Memory {
unsigned char serialCnt_;
bool blanklcd_;
bool biosMode_;
bool cgbSwitching_;
bool agbFlag_;
bool gbIsCgb_;
bool gbIsSgb_;
bool stopped_;
enum HdmaState { hdma_low, hdma_high, hdma_requested } haltHdmaState_;
Expand Down
8 changes: 2 additions & 6 deletions libgambatte/src/savestate.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ struct SaveState {
void set(T *p, std::size_t size) { ptr = p; size_ = size; }

friend class SaverList;
friend void setInitState(SaveState &, bool, bool, bool);
friend void setInitState(SaveState &, bool, bool);
friend void setInitStateCart(SaveState &);

private:
Expand Down Expand Up @@ -85,10 +85,6 @@ struct SaveState {
unsigned char /*bool*/ rambankMode;
unsigned char /*bool*/ hdmaTransfer;
unsigned char /*bool*/ biosMode;
unsigned char /*bool*/ cgbSwitching;
unsigned char /*bool*/ agbFlag;
unsigned char /*bool*/ gbIsCgb;
unsigned char /*bool*/ gbIsSgb;
unsigned char /*bool*/ stopped;

struct SGB {
Expand Down Expand Up @@ -141,7 +137,7 @@ struct SaveState {
unsigned char wscx;
unsigned char /*bool*/ weMaster;
unsigned char /*bool*/ pendingLcdstatIrq;
unsigned char /*bool*/ isCgb;
unsigned char /*bool*/ notCgbDmg;
} ppu;

struct SPU {
Expand Down
1 change: 1 addition & 0 deletions libgambatte/src/sound/channel4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ inline void Channel4::Lfsr::event() {
void Channel4::Lfsr::nr3Change(unsigned newNr3, unsigned long cc) {
updateBackupCounter(cc);
nr3_ = newNr3;
counter_ = cc;
}

void Channel4::Lfsr::nr4Init(unsigned long cc) {
Expand Down
6 changes: 1 addition & 5 deletions libgambatte/src/statesaver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -262,10 +262,6 @@ SaverList::SaverList()
{ static char const label[] = { r,a,m,b,m,o,d, NUL }; ADD(mem.rambankMode); }
{ static char const label[] = { h,d,m,a, NUL }; ADD(mem.hdmaTransfer); }
{ static char const label[] = { b,i,o,s, NUL }; ADD(mem.biosMode); }
{ static char const label[] = { a,g,b,f,l,a,g, NUL }; ADD(mem.agbFlag); }
{ static char const label[] = { c,g,b,s,w, NUL }; ADD(mem.cgbSwitching); }
{ static char const label[] = { b,i,o,s,c,g,b, NUL }; ADD(mem.gbIsCgb); }
{ static char const label[] = { i,s,s,g,b, NUL }; ADD(mem.gbIsSgb); }
{ static char const label[] = { s,t,o,p,p,e,d, NUL }; ADD(mem.stopped); }
{ static char const label[] = { h,u,c,NO3,r,a,m, NUL }; ADD(mem.HuC3RAMflag); }
{ static char const label[] = { s,g,b,s,y,s, NUL }; ADDPTR(mem.sgb.systemColors); }
Expand Down Expand Up @@ -311,7 +307,7 @@ SaverList::SaverList()
{ static char const label[] = { w,s,c,x, NUL }; ADD(ppu.wscx); }
{ static char const label[] = { w,e,m,a,s,t,r, NUL }; ADD(ppu.weMaster); }
{ static char const label[] = { l,c,d,s,i,r,q, NUL }; ADD(ppu.pendingLcdstatIrq); }
{ static char const label[] = { i,s,c,g,b, NUL }; ADD(ppu.isCgb); }
{ static char const label[] = { i,s,c,g,b, NUL }; ADD(ppu.notCgbDmg); }
{ static char const label[] = { s,p,u,c,n,t,r, NUL }; ADD(spu.cycleCounter); }
{ static char const label[] = { s,p,u,c,n,t,l, NUL }; ADD(spu.lastUpdate); }
{ static char const label[] = { s,w,p,c,n,t,r, NUL }; ADD(spu.ch1.sweep.counter); }
Expand Down
6 changes: 1 addition & 5 deletions libgambatte/src/video.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,6 @@ void LCD::reset(unsigned char const *oamram, unsigned char const *vram, bool cgb
refreshPalettes();
}

void LCD::setCgb(bool cgb) {
ppu_.setCgb(cgb);
}

void LCD::setStatePtrs(SaveState &state) {
state.ppu.dmgColorsBgr15.set(dmgColorsBgr15_, sizeof dmgColorsBgr15_ / sizeof dmgColorsBgr15_[0]);
state.ppu.bgpData.set( bgpData_, sizeof bgpData_);
Expand Down Expand Up @@ -202,7 +198,7 @@ void LCD::loadState(SaveState const &state, unsigned char const *const oamram) {
}

void LCD::refreshPalettes() {
if (ppu_.cgb()) {
if (isCgb() && !isCgbDmg()) {
for (int i = 0; i < max_num_palettes * num_palette_entries; ++i) {
ppu_.bgPalette()[i] = gbcToRgb32( bgpData_[2 * i] | bgpData_[2 * i + 1] * 0x100l, isTrueColors());
ppu_.spPalette()[i] = gbcToRgb32(objpData_[2 * i] | objpData_[2 * i + 1] * 0x100l, isTrueColors());
Expand Down
Loading

0 comments on commit c5e4823

Please sign in to comment.