diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 3fdb0fa2..07d04a6a 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -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(); } @@ -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_); diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index 7cfb76bb..212dcba6 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -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) @@ -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(); diff --git a/libgambatte/src/initstate.cpp b/libgambatte/src/initstate.cpp index 52ef7d1b..136f72a1 100644 --- a/libgambatte/src/initstate.cpp +++ b/libgambatte/src/initstate.cpp @@ -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, @@ -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); @@ -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; @@ -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; diff --git a/libgambatte/src/initstate.h b/libgambatte/src/initstate.h index 1676a546..f16c5a61 100644 --- a/libgambatte/src/initstate.h +++ b/libgambatte/src/initstate.h @@ -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); } diff --git a/libgambatte/src/mem/time.cpp b/libgambatte/src/mem/time.cpp index a23d1371..4f513fd7 100644 --- a/libgambatte/src/mem/time.cpp +++ b/libgambatte/src/mem/time.cpp @@ -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) { diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index 60c055fa..7934f6e1 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -17,6 +17,7 @@ // #include "memory.h" +#include "gambatte.h" #include "inputgetter.h" #include "savestate.h" #include "sound.h" @@ -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); @@ -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_); @@ -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 { @@ -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) @@ -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; @@ -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]); } @@ -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; @@ -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); @@ -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; } @@ -1221,7 +1219,10 @@ 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; @@ -1229,6 +1230,9 @@ LoadRes Memory::loadROM(std::string const &romfile, bool const cgbMode, bool con 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; } diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 02402fd1..f636ee41 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -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(); } @@ -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) { @@ -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); } @@ -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_; diff --git a/libgambatte/src/savestate.h b/libgambatte/src/savestate.h index 1916bbd5..f05d36e5 100644 --- a/libgambatte/src/savestate.h +++ b/libgambatte/src/savestate.h @@ -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: @@ -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 { @@ -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 { diff --git a/libgambatte/src/sound/channel4.cpp b/libgambatte/src/sound/channel4.cpp index 9e3ee09d..c2c5e009 100644 --- a/libgambatte/src/sound/channel4.cpp +++ b/libgambatte/src/sound/channel4.cpp @@ -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) { diff --git a/libgambatte/src/statesaver.cpp b/libgambatte/src/statesaver.cpp index f2a2d709..9a9822a2 100644 --- a/libgambatte/src/statesaver.cpp +++ b/libgambatte/src/statesaver.cpp @@ -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); } @@ -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); } diff --git a/libgambatte/src/video.cpp b/libgambatte/src/video.cpp index 1df54a8b..d3dca320 100644 --- a/libgambatte/src/video.cpp +++ b/libgambatte/src/video.cpp @@ -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_); @@ -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()); diff --git a/libgambatte/src/video.h b/libgambatte/src/video.h index 17e629cf..bd083983 100644 --- a/libgambatte/src/video.h +++ b/libgambatte/src/video.h @@ -51,12 +51,12 @@ class LCD { LCD(unsigned char const *oamram, unsigned char const *vram, VideoInterruptRequester memEventRequester); void reset(unsigned char const *oamram, unsigned char const *vram, bool cgb); + void setCgbDmg(bool enabled) { ppu_.setCgbDmg(enabled); } void setStatePtrs(SaveState &state); void saveState(SaveState &state) const; void loadState(SaveState const &state, unsigned char const *oamram); void setDmgPaletteColor(unsigned palNum, unsigned colorNum, unsigned long rgb32); void setVideoBuffer(uint_least32_t *videoBuf, std::ptrdiff_t pitch); - void setCgb(bool cgb); void copyCgbPalettesToDmg(); void setTrueColors(bool trueColors); void setOsdElement(transfer_ptr osdElement) { osdElement_ = osdElement; } @@ -146,6 +146,7 @@ class LCD { bool hdmaIsEnabled() const { return eventTimes_(memevent_hdma) != disabled_time; } void update(unsigned long cycleCounter); bool isCgb() const { return ppu_.cgb(); } + bool isCgbDmg() const { return ppu_.cgbDmg(); } bool isDoubleSpeed() const { return ppu_.lyCounter().isDoubleSpeed(); } bool isTrueColors() const { return ppu_.trueColors(); } void setSpeedupFlags(unsigned flags) { ppu_.setSpeedupFlags(flags); } diff --git a/libgambatte/src/video/ppu.cpp b/libgambatte/src/video/ppu.cpp index 4a517b4c..e2d54d2b 100644 --- a/libgambatte/src/video/ppu.cpp +++ b/libgambatte/src/video/ppu.cpp @@ -139,6 +139,13 @@ inline void nextCall(int const cycles, PPUState const &state, PPUPriv &p) { p.nextCallPtr = &state; } +inline unsigned long const * cgbSpPalette(PPUPriv const &p, unsigned const attrib) { + if (!p.cgbDmg) + return p.spPalette + (attrib & attr_cgbpalno) * num_palette_entries; + else + return p.spPalette + (attrib & attr_dmgpalno ? num_palette_entries : 0); +} + namespace M2_Ly0 { void f0(PPUPriv &p) { p.weMaster = lcdcWinEn(p) && 0 == p.wy; @@ -683,8 +690,7 @@ void doFullTilesUnrolledCgb(PPUPriv &p, int const xend, uint_least32_t *const db unsigned char const id = p.spriteList[i].oampos; unsigned const sattrib = p.spriteList[i].attrib; long spword = p.spwordList[i]; - unsigned long const *const spPalette = p.spPalette - + (sattrib & attr_cgbpalno) * num_palette_entries; + unsigned long const *const spPalette = cgbSpPalette(p, sattrib); if (!((attrib | sattrib) & bgprioritymask)) { unsigned char *const idt = idtab + pos; @@ -873,7 +879,7 @@ void plotPixel(PPUPriv &p) { if (spdata && lcdcObjEn(p) && (!((attrib | p.attrib) & attr_bgpriority) || !twdata || !lcdcBgEn(p))) { - pixel = p.spPalette[(attrib & attr_cgbpalno) * num_palette_entries + spdata]; + pixel = *(cgbSpPalette(p, attrib) + spdata); } } else { do { @@ -1698,7 +1704,7 @@ void PPU::saveState(SaveState &ss) const { saveSpriteList(p_, ss); ss.ppu.state = p_.nextCallPtr->id; ss.ppu.lastM0Time = p_.now - p_.lastM0Time; - ss.ppu.isCgb = p_.cgb; + ss.ppu.notCgbDmg = !p_.cgbDmg; } void PPU::loadState(SaveState const &ss, unsigned char const *const oamram) { @@ -1731,7 +1737,7 @@ void PPU::loadState(SaveState const &ss, unsigned char const *const oamram) { p_.weMaster = ss.ppu.weMaster; p_.winDrawState = ss.ppu.winDrawState & (win_draw_start | win_draw_started); p_.lastM0Time = p_.now - ss.ppu.lastM0Time; - p_.cgb = ss.ppu.isCgb; + p_.cgbDmg = !ss.ppu.notCgbDmg; loadSpriteList(p_, ss); if (m3loopState && videoCycles < 1l * lcd_vres * lcd_cycles_per_line && p_.xpos < xpos_end @@ -1766,6 +1772,7 @@ void PPU::loadState(SaveState const &ss, unsigned char const *const oamram) { void PPU::reset(unsigned char const *oamram, unsigned char const *vram, bool cgb) { p_.vram = vram; p_.cgb = cgb; + p_.cgbDmg = false; p_.spriteMapper.reset(oamram, cgb); } diff --git a/libgambatte/src/video/ppu.h b/libgambatte/src/video/ppu.h index 9534b02f..6c20391d 100644 --- a/libgambatte/src/video/ppu.h +++ b/libgambatte/src/video/ppu.h @@ -97,6 +97,7 @@ struct PPUPriv { unsigned char endx; bool cgb; + bool cgbDmg; bool weMaster; bool trueColors; unsigned speedupFlags; @@ -113,6 +114,7 @@ class PPU { unsigned long * bgPalette() { return p_.bgPalette; } bool cgb() const { return p_.cgb; } + bool cgbDmg() const { return p_.cgbDmg; } bool trueColors() const { return p_.trueColors; } void doLyCountEvent() { p_.lyCounter.doEvent(); } unsigned long doSpriteMapEvent(unsigned long time) { return p_.spriteMapper.doEvent(time); } @@ -131,6 +133,7 @@ class PPU { void oamChange(unsigned char const *oamram, unsigned long cc) { p_.spriteMapper.oamChange(oamram, cc); } unsigned long predictedNextXposTime(unsigned xpos) const; void reset(unsigned char const *oamram, unsigned char const *vram, bool cgb); + void setCgbDmg(bool enabled) { p_.cgbDmg = enabled; } void resetCc(unsigned long oldCc, unsigned long newCc); void saveState(SaveState &ss) const; void setFrameBuf(uint_least32_t *buf, std::ptrdiff_t pitch) { p_.framebuf.setBuf(buf, pitch); } @@ -144,7 +147,6 @@ class PPU { void speedChange(); unsigned long * spPalette() { return p_.spPalette; } void update(unsigned long cc); - void setCgb(bool cgb) { p_.cgb = cgb; } void setTrueColors(bool trueColors) { p_.trueColors = trueColors; } void setSpeedupFlags(unsigned flags) { p_.speedupFlags = flags; }