void MemPtrs::reset(const unsigned rombanks, const unsigned rambanks, const unsigned wrambanks) { delete []memchunk_; memchunk_len = 0x4000 + rombanks * 0x4000ul + 0x4000 + rambanks * 0x2000ul + wrambanks * 0x1000ul + 0x4000; memchunk_ = new unsigned char[memchunk_len]; romdata_[0] = romdata(); rambankdata_ = romdata_[0] + rombanks * 0x4000ul + 0x4000; wramdata_[0] = rambankdata_ + rambanks * 0x2000ul; wramdataend_ = wramdata_[0] + wrambanks * 0x1000ul; std::memset(rdisabledRamw(), 0xFF, 0x2000); oamDmaSrc_ = OAM_DMA_SRC_OFF; rmem_[0x3] = rmem_[0x2] = rmem_[0x1] = rmem_[0x0] = romdata_[0]; rmem_[0xC] = wmem_[0xC] = wramdata_[0] - 0xC000; rmem_[0xE] = wmem_[0xE] = wramdata_[0] - 0xE000; setRombank(1); setRambank(0, 0); setVrambank(0); setWrambank(1); // we save only the ram areas memchunk_saveoffs = vramdata() - memchunk_; memchunk_savelen = wramdataend() - memchunk_ - memchunk_saveoffs; }
void MemPtrs::reset(unsigned const rombanks, unsigned const rambanks, unsigned const wrambanks) { delete []memchunk_; memchunk_ = new unsigned char[ 0x4000 + rombanks * 0x4000ul + 0x4000 + rambanks * 0x2000ul + wrambanks * 0x1000ul + 0x4000]; romdata_[0] = romdata(); rambankdata_ = romdata_[0] + rombanks * 0x4000ul + 0x4000; wramdata_[0] = rambankdata_ + rambanks * 0x2000ul; wramdataend_ = wramdata_[0] + wrambanks * 0x1000ul; std::memset(rdisabledRamw(), 0xFF, 0x2000); oamDmaSrc_ = oam_dma_src_off; rmem_[0x3] = rmem_[0x2] = rmem_[0x1] = rmem_[0x0] = romdata_[0]; rmem_[0xC] = wmem_[0xC] = wramdata_[0] - 0xC000; rmem_[0xE] = wmem_[0xE] = wramdata_[0] - 0xE000; setRombank(1); setRambank(0, 0); setVrambank(0); setWrambank(1); }
void MemPtrs::setRambank(unsigned const flags, unsigned const rambank) { unsigned char *srambankptr = 0; if (!(flags & rtc_en)) { srambankptr = rambankdata() != rambankdataend() ? rambankdata_ + rambank * 0x2000ul - 0xA000 : wdisabledRam() - 0xA000; } rsrambankptr_ = (flags & read_en) && srambankptr != wdisabledRam() - 0xA000 ? srambankptr : rdisabledRamw() - 0xA000; wsrambankptr_ = flags & write_en ? srambankptr : wdisabledRam() - 0xA000; rmem_[0xB] = rmem_[0xA] = rsrambankptr_; wmem_[0xB] = wmem_[0xA] = wsrambankptr_; disconnectOamDmaAreas(); }
void MemPtrs::setRambank(const unsigned flags, const unsigned rambank) { unsigned char *const srambankptr = flags & RTC_EN ? 0 : (rambankdata() != rambankdataend() ? rambankdata_ + rambank * 0x2000ul - 0xA000 : wdisabledRam() - 0xA000); rsrambankptr_ = (flags & READ_EN) && srambankptr != wdisabledRam() - 0xA000 ? srambankptr : rdisabledRamw() - 0xA000; wsrambankptr_ = flags & WRITE_EN ? srambankptr : wdisabledRam() - 0xA000; rmem_[0xB] = rmem_[0xA] = rsrambankptr_; wmem_[0xB] = wmem_[0xA] = wsrambankptr_; disconnectOamDmaAreas(); }