void Memory::loadState(SaveState const &state) { psg_.loadState(state); lcd_.loadState(state, state.mem.oamDmaPos < 0xA0 ? cart_.rdisabledRam() : ioamhram_); tima_.loadState(state, TimaInterruptRequester(intreq_)); cart_.loadState(state); intreq_.loadState(state); divLastUpdate_ = state.mem.divLastUpdate; intreq_.setEventTime<intevent_serial>(state.mem.nextSerialtime > state.cpu.cycleCounter ? state.mem.nextSerialtime : state.cpu.cycleCounter); intreq_.setEventTime<intevent_unhalt>(state.mem.unhaltTime); lastOamDmaUpdate_ = state.mem.lastOamDmaUpdate; dmaSource_ = state.mem.dmaSource; dmaDestination_ = state.mem.dmaDestination; oamDmaPos_ = state.mem.oamDmaPos; serialCnt_ = intreq_.eventTime(intevent_serial) != disabled_time ? serialCntFrom(intreq_.eventTime(intevent_serial) - state.cpu.cycleCounter, ioamhram_[0x102] & isCgb() * 2) : 8; cart_.setVrambank(ioamhram_[0x14F] & isCgb()); cart_.setOamDmaSrc(oam_dma_src_off); cart_.setWrambank(isCgb() && (ioamhram_[0x170] & 0x07) ? ioamhram_[0x170] & 0x07 : 1); if (lastOamDmaUpdate_ != disabled_time) { oamDmaInitSetup(); unsigned oamEventPos = oamDmaPos_ < 0xA0 ? 0xA0 : 0x100; intreq_.setEventTime<intevent_oam>( lastOamDmaUpdate_ + (oamEventPos - oamDmaPos_) * 4); } intreq_.setEventTime<intevent_blit>(ioamhram_[0x140] & lcdc_en ? lcd_.nextMode1IrqTime() : state.cpu.cycleCounter); blanklcd_ = false; if (!isCgb()) std::memset(cart_.vramdata() + 0x2000, 0, 0x2000); }
void Memory::loadState(const SaveState &state) { biosMode = state.mem.biosMode; cgbSwitching = state.mem.cgbSwitching; agbMode = state.mem.agbMode; gbIsCgb_ = state.mem.gbIsCgb; sound.loadState(state); display.loadState(state, state.mem.oamDmaPos < 0xA0 ? cart.rdisabledRam() : ioamhram); tima.loadState(state, TimaInterruptRequester(intreq)); cart.loadState(state); intreq.loadState(state); divLastUpdate = state.mem.divLastUpdate; intreq.setEventTime<SERIAL>(state.mem.nextSerialtime > state.cpu.cycleCounter ? state.mem.nextSerialtime : state.cpu.cycleCounter); intreq.setEventTime<UNHALT>(state.mem.unhaltTime); lastOamDmaUpdate = state.mem.lastOamDmaUpdate; dmaSource = state.mem.dmaSource; dmaDestination = state.mem.dmaDestination; oamDmaPos = state.mem.oamDmaPos; serialCnt = intreq.eventTime(SERIAL) != DISABLED_TIME ? serialCntFrom(intreq.eventTime(SERIAL) - state.cpu.cycleCounter, ioamhram[0x102] & isCgb() * 2) : 8; cart.setVrambank(ioamhram[0x14F] & isCgb()); cart.setOamDmaSrc(OAM_DMA_SRC_OFF); cart.setWrambank(isCgb() && (ioamhram[0x170] & 0x07) ? ioamhram[0x170] & 0x07 : 1); if (lastOamDmaUpdate != DISABLED_TIME) { oamDmaInitSetup(); const unsigned oamEventPos = oamDmaPos < 0xA0 ? 0xA0 : 0x100; intreq.setEventTime<OAM>(lastOamDmaUpdate + (oamEventPos - oamDmaPos) * 4); } intreq.setEventTime<BLIT>((ioamhram[0x140] & 0x80) ? display.nextMode1IrqTime() : state.cpu.cycleCounter); blanklcd = false; if (!isCgb()) std::memset(cart.vramdata() + 0x2000, 0, 0x2000); }