void Memory::updateSerial(const unsigned long cc) { if (!LINKCABLE) { if (intreq.eventTime(SERIAL) != DISABLED_TIME) { if (intreq.eventTime(SERIAL) <= cc) { ioamhram[0x101] = (((ioamhram[0x101] + 1) << serialCnt) - 1) & 0xFF; ioamhram[0x102] &= 0x7F; intreq.setEventTime<SERIAL>(DISABLED_TIME); intreq.flagIrq(8); } else { const int targetCnt = serialCntFrom(intreq.eventTime(SERIAL) - cc, ioamhram[0x102] & isCgb() * 2); ioamhram[0x101] = (((ioamhram[0x101] + 1) << (serialCnt - targetCnt)) - 1) & 0xFF; serialCnt = targetCnt; } } } else { if (intreq.eventTime(SERIAL) != DISABLED_TIME) { if (intreq.eventTime(SERIAL) <= cc) { linkClockTrigger = true; intreq.setEventTime<SERIAL>(DISABLED_TIME); if (linkCallback) linkCallback(); } } } }
void Memory::updateSerial(unsigned long const cc) { if (intreq_.eventTime(intevent_serial) != disabled_time) { if (intreq_.eventTime(intevent_serial) <= cc) { ioamhram_[0x101] = (((ioamhram_[0x101] + 1) << serialCnt_) - 1) & 0xFF; ioamhram_[0x102] &= 0x7F; intreq_.setEventTime<intevent_serial>(disabled_time); intreq_.flagIrq(8); } else { int const targetCnt = serialCntFrom(intreq_.eventTime(intevent_serial) - cc, ioamhram_[0x102] & isCgb() * 2); ioamhram_[0x101] = (((ioamhram_[0x101] + 1) << (serialCnt_ - targetCnt)) - 1) & 0xFF; serialCnt_ = targetCnt; } } }
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); }