From 525871d6e440f13c2d8dad211c5f3c59c69716e3 Mon Sep 17 00:00:00 2001 From: goyuken Date: Wed, 11 Jun 2014 19:07:57 +0000 Subject: [PATCH] gb: cleanup some unused code --- libgambatte/src/cpu.cpp | 19 ------------------- libgambatte/src/cpu.h | 1 - libgambatte/src/interruptrequester.cpp | 6 ------ libgambatte/src/interruptrequester.h | 1 - libgambatte/src/mem/cartridge.cpp | 5 ----- libgambatte/src/mem/cartridge.h | 2 -- libgambatte/src/mem/rtc.cpp | 11 ----------- libgambatte/src/mem/rtc.h | 1 - libgambatte/src/memory.cpp | 22 ---------------------- libgambatte/src/memory.h | 1 - libgambatte/src/sound.cpp | 7 ------- libgambatte/src/sound.h | 1 - libgambatte/src/sound/channel1.cpp | 18 ------------------ libgambatte/src/sound/channel1.h | 2 -- libgambatte/src/sound/channel2.cpp | 9 --------- libgambatte/src/sound/channel2.h | 1 - libgambatte/src/sound/channel3.cpp | 12 ------------ libgambatte/src/sound/channel3.h | 1 - libgambatte/src/sound/channel4.cpp | 15 --------------- libgambatte/src/sound/channel4.h | 2 -- libgambatte/src/sound/duty_unit.cpp | 7 ------- libgambatte/src/sound/duty_unit.h | 1 - libgambatte/src/sound/envelope_unit.cpp | 5 ----- libgambatte/src/sound/envelope_unit.h | 1 - libgambatte/src/sound/length_counter.cpp | 5 ----- libgambatte/src/sound/length_counter.h | 1 - libgambatte/src/tima.cpp | 5 ----- libgambatte/src/tima.h | 1 - libgambatte/src/video.cpp | 10 ---------- libgambatte/src/video.h | 5 ----- libgambatte/src/video/lyc_irq.cpp | 4 ---- libgambatte/src/video/lyc_irq.h | 1 - libgambatte/src/video/ppu.cpp | 21 --------------------- libgambatte/src/video/ppu.h | 1 - libgambatte/src/video/sprite_mapper.h | 2 -- output/dll/libgambatte.dll | Bin 151040 -> 151040 bytes 36 files changed, 207 deletions(-) diff --git a/libgambatte/src/cpu.cpp b/libgambatte/src/cpu.cpp index 4a830ed411..9fc7c43ed1 100644 --- a/libgambatte/src/cpu.cpp +++ b/libgambatte/src/cpu.cpp @@ -89,25 +89,6 @@ void CPU::setStatePtrs(SaveState &state) { memory.setStatePtrs(state); } -void CPU::saveState(SaveState &state) { - cycleCounter_ = memory.saveState(state, cycleCounter_); - - calcHF(HF1, HF2); - - state.cpu.cycleCounter = cycleCounter_; - state.cpu.PC = PC_; - state.cpu.SP = SP; - state.cpu.A = A_; - state.cpu.B = B; - state.cpu.C = C; - state.cpu.D = D; - state.cpu.E = E; - state.cpu.F = F(); - state.cpu.H = H; - state.cpu.L = L; - state.cpu.skip = skip; -} - void CPU::loadState(const SaveState &state) { memory.loadState(state/*, cycleCounter_*/); diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 6b7fbd691d..55a72b6364 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -51,7 +51,6 @@ public: long runFor(unsigned long cycles); void setStatePtrs(SaveState &state); - void saveState(SaveState &state); void loadState(const SaveState &state); void loadSavedata(const char *data) { memory.loadSavedata(data); } diff --git a/libgambatte/src/interruptrequester.cpp b/libgambatte/src/interruptrequester.cpp index 32ab016da6..5ed7869c39 100644 --- a/libgambatte/src/interruptrequester.cpp +++ b/libgambatte/src/interruptrequester.cpp @@ -23,12 +23,6 @@ namespace gambatte { InterruptRequester::InterruptRequester() : minIntTime(0), ifreg_(0), iereg_(0) {} -void InterruptRequester::saveState(SaveState &state) const { - state.mem.minIntTime = minIntTime; - state.mem.IME = ime(); - state.mem.halted = halted(); -} - void InterruptRequester::loadState(const SaveState &state) { minIntTime = state.mem.minIntTime; ifreg_ = state.mem.ioamhram.get()[0x10F]; diff --git a/libgambatte/src/interruptrequester.h b/libgambatte/src/interruptrequester.h index 54a0acd7e2..c99efc73f6 100644 --- a/libgambatte/src/interruptrequester.h +++ b/libgambatte/src/interruptrequester.h @@ -57,7 +57,6 @@ class InterruptRequester { public: InterruptRequester(); - void saveState(SaveState &) const; void loadState(const SaveState &); void resetCc(unsigned long oldCc, unsigned long newCc); diff --git a/libgambatte/src/mem/cartridge.cpp b/libgambatte/src/mem/cartridge.cpp index 9f649a0b84..ac16d17262 100644 --- a/libgambatte/src/mem/cartridge.cpp +++ b/libgambatte/src/mem/cartridge.cpp @@ -502,11 +502,6 @@ void Cartridge::setStatePtrs(SaveState &state) { state.mem.wram.set(memptrs.wramdata(0), memptrs.wramdataend() - memptrs.wramdata(0)); } -void Cartridge::saveState(SaveState &state) const { - mbc->saveState(state.mem); - rtc.saveState(state); -} - void Cartridge::loadState(const SaveState &state) { rtc.loadState(state); mbc->loadState(state.mem); diff --git a/libgambatte/src/mem/cartridge.h b/libgambatte/src/mem/cartridge.h index 9de575f326..f6ea99bfa9 100644 --- a/libgambatte/src/mem/cartridge.h +++ b/libgambatte/src/mem/cartridge.h @@ -33,7 +33,6 @@ class Mbc { public: virtual ~Mbc() {} virtual void romWrite(unsigned P, unsigned data) = 0; - virtual void saveState(SaveState::Mem &ss) const = 0; virtual void loadState(const SaveState::Mem &ss) = 0; virtual bool isAddressWithinAreaRombankCanBeMappedTo(unsigned address, unsigned rombank) const = 0; @@ -52,7 +51,6 @@ class Cartridge { public: void setStatePtrs(SaveState &); - void saveState(SaveState &) const; void loadState(const SaveState &); bool loaded() const { return mbc.get(); } diff --git a/libgambatte/src/mem/rtc.cpp b/libgambatte/src/mem/rtc.cpp index 9e3f1c55dc..3fc1ed1a2e 100644 --- a/libgambatte/src/mem/rtc.cpp +++ b/libgambatte/src/mem/rtc.cpp @@ -90,17 +90,6 @@ void Rtc::doSwapActive() { } } -void Rtc::saveState(SaveState &state) const { - state.rtc.baseTime = baseTime; - state.rtc.haltTime = haltTime; - state.rtc.dataDh = dataDh; - state.rtc.dataDl = dataDl; - state.rtc.dataH = dataH; - state.rtc.dataM = dataM; - state.rtc.dataS = dataS; - state.rtc.lastLatchData = lastLatchData; -} - void Rtc::loadState(const SaveState &state) { baseTime = state.rtc.baseTime; haltTime = state.rtc.haltTime; diff --git a/libgambatte/src/mem/rtc.h b/libgambatte/src/mem/rtc.h index b71b4f88b4..00652a2181 100644 --- a/libgambatte/src/mem/rtc.h +++ b/libgambatte/src/mem/rtc.h @@ -68,7 +68,6 @@ public: lastLatchData = data; } - void saveState(SaveState &state) const; void loadState(const SaveState &state); void set(const bool enabled, unsigned bank) { diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index 1424f6c9f7..f4e26ce60f 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -54,28 +54,6 @@ void Memory::setStatePtrs(SaveState &state) { sound.setStatePtrs(state); } -unsigned long Memory::saveState(SaveState &state, unsigned long cycleCounter) { - cycleCounter = resetCounters(cycleCounter); - nontrivial_ff_read(0xFF05, cycleCounter); - nontrivial_ff_read(0xFF0F, cycleCounter); - nontrivial_ff_read(0xFF26, cycleCounter); - - state.mem.divLastUpdate = divLastUpdate; - state.mem.nextSerialtime = intreq.eventTime(SERIAL); - state.mem.unhaltTime = intreq.eventTime(UNHALT); - state.mem.lastOamDmaUpdate = lastOamDmaUpdate; - state.mem.dmaSource = dmaSource; - state.mem.dmaDestination = dmaDestination; - state.mem.oamDmaPos = oamDmaPos; - - intreq.saveState(state); - cart.saveState(state); - tima.saveState(state); - display.saveState(state); - sound.saveState(state); - - return cycleCounter; -} static inline int serialCntFrom(const unsigned long cyclesUntilDone, const bool cgbFast) { return cgbFast ? (cyclesUntilDone + 0xF) >> 4 : (cyclesUntilDone + 0x1FF) >> 9; diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index e83f521bfb..8cc3bfd615 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -87,7 +87,6 @@ public: const char * romTitle() const { return cart.romTitle(); } void setStatePtrs(SaveState &state); - unsigned long saveState(SaveState &state, unsigned long cc); void loadState(const SaveState &state/*, unsigned long oldCc*/); void loadSavedata(const char *data) { cart.loadSavedata(data); } int saveSavedataLength() {return cart.saveSavedataLength(); } diff --git a/libgambatte/src/sound.cpp b/libgambatte/src/sound.cpp index cf214486e3..be28da8e1d 100644 --- a/libgambatte/src/sound.cpp +++ b/libgambatte/src/sound.cpp @@ -70,13 +70,6 @@ void PSG::setStatePtrs(SaveState &state) { ch3.setStatePtrs(state); } -void PSG::saveState(SaveState &state) { - ch1.saveState(state); - ch2.saveState(state); - ch3.saveState(state); - ch4.saveState(state); -} - void PSG::loadState(const SaveState &state) { ch1.loadState(state); ch2.loadState(state); diff --git a/libgambatte/src/sound.h b/libgambatte/src/sound.h index 602d2986a0..0d39db788e 100644 --- a/libgambatte/src/sound.h +++ b/libgambatte/src/sound.h @@ -51,7 +51,6 @@ public: void init(bool cgb); void reset(); void setStatePtrs(SaveState &state); - void saveState(SaveState &state); void loadState(const SaveState &state); void generate_samples(unsigned long cycleCounter, unsigned doubleSpeed); diff --git a/libgambatte/src/sound/channel1.cpp b/libgambatte/src/sound/channel1.cpp index 7e1322d0b2..b99902f28e 100644 --- a/libgambatte/src/sound/channel1.cpp +++ b/libgambatte/src/sound/channel1.cpp @@ -90,13 +90,6 @@ void Channel1::SweepUnit::reset() { counter = COUNTER_DISABLED; } -void Channel1::SweepUnit::saveState(SaveState &state) const { - state.spu.ch1.sweep.counter = counter; - state.spu.ch1.sweep.shadow = shadow; - state.spu.ch1.sweep.nr0 = nr0; - state.spu.ch1.sweep.negging = negging; -} - void Channel1::SweepUnit::loadState(const SaveState &state) { counter = std::max(state.spu.ch1.sweep.counter, state.spu.cycleCounter); shadow = state.spu.ch1.sweep.shadow; @@ -202,17 +195,6 @@ void Channel1::init(const bool cgb) { lengthCounter.init(cgb); } -void Channel1::saveState(SaveState &state) { - sweepUnit.saveState(state); - dutyUnit.saveState(state.spu.ch1.duty, cycleCounter); - envelopeUnit.saveState(state.spu.ch1.env); - lengthCounter.saveState(state.spu.ch1.lcounter); - - state.spu.cycleCounter = cycleCounter; - state.spu.ch1.nr4 = nr4; - state.spu.ch1.master = master; -} - void Channel1::loadState(const SaveState &state) { sweepUnit.loadState(state); dutyUnit.loadState(state.spu.ch1.duty, state.mem.ioamhram.get()[0x111], state.spu.ch1.nr4, state.spu.cycleCounter); diff --git a/libgambatte/src/sound/channel1.h b/libgambatte/src/sound/channel1.h index d1afdefd51..3467547a58 100644 --- a/libgambatte/src/sound/channel1.h +++ b/libgambatte/src/sound/channel1.h @@ -47,7 +47,6 @@ class Channel1 { void nr0Change(unsigned newNr0); void nr4Init(unsigned long cycleCounter); void reset(); - void saveState(SaveState &state) const; void loadState(const SaveState &state); templatevoid SyncState(NewState *ns); @@ -88,7 +87,6 @@ public: void reset(); void init(bool cgb); - void saveState(SaveState &state); void loadState(const SaveState &state); templatevoid SyncState(NewState *ns); diff --git a/libgambatte/src/sound/channel2.cpp b/libgambatte/src/sound/channel2.cpp index 567a5c7102..78cb44fb07 100644 --- a/libgambatte/src/sound/channel2.cpp +++ b/libgambatte/src/sound/channel2.cpp @@ -100,15 +100,6 @@ void Channel2::init(const bool cgb) { lengthCounter.init(cgb); } -void Channel2::saveState(SaveState &state) { - dutyUnit.saveState(state.spu.ch2.duty, cycleCounter); - envelopeUnit.saveState(state.spu.ch2.env); - lengthCounter.saveState(state.spu.ch2.lcounter); - - state.spu.ch2.nr4 = nr4; - state.spu.ch2.master = master; -} - void Channel2::loadState(const SaveState &state) { dutyUnit.loadState(state.spu.ch2.duty, state.mem.ioamhram.get()[0x116], state.spu.ch2.nr4,state.spu.cycleCounter); envelopeUnit.loadState(state.spu.ch2.env, state.mem.ioamhram.get()[0x117], state.spu.cycleCounter); diff --git a/libgambatte/src/sound/channel2.h b/libgambatte/src/sound/channel2.h index bb2ecb659e..2f98309e6a 100644 --- a/libgambatte/src/sound/channel2.h +++ b/libgambatte/src/sound/channel2.h @@ -65,7 +65,6 @@ public: void reset(); void init(bool cgb); - void saveState(SaveState &state); void loadState(const SaveState &state); templatevoid SyncState(NewState *ns); diff --git a/libgambatte/src/sound/channel3.cpp b/libgambatte/src/sound/channel3.cpp index fe11399c3d..d4cf78414c 100644 --- a/libgambatte/src/sound/channel3.cpp +++ b/libgambatte/src/sound/channel3.cpp @@ -100,18 +100,6 @@ void Channel3::setStatePtrs(SaveState &state) { state.spu.ch3.waveRam.set(waveRam, sizeof waveRam); } -void Channel3::saveState(SaveState &state) const { - lengthCounter.saveState(state.spu.ch3.lcounter); - - state.spu.ch3.waveCounter = waveCounter; - state.spu.ch3.lastReadTime = lastReadTime; - state.spu.ch3.nr3 = nr3; - state.spu.ch3.nr4 = nr4; - state.spu.ch3.wavePos = wavePos; - state.spu.ch3.sampleBuf = sampleBuf; - state.spu.ch3.master = master; -} - void Channel3::loadState(const SaveState &state) { lengthCounter.loadState(state.spu.ch3.lcounter, state.spu.cycleCounter); diff --git a/libgambatte/src/sound/channel3.h b/libgambatte/src/sound/channel3.h index fe62d91aad..ae0ba2f64a 100644 --- a/libgambatte/src/sound/channel3.h +++ b/libgambatte/src/sound/channel3.h @@ -66,7 +66,6 @@ public: void reset(); void init(bool cgb); void setStatePtrs(SaveState &state); - void saveState(SaveState &state) const; void loadState(const SaveState &state); void setNr0(unsigned data); void setNr1(unsigned data) { lengthCounter.nr1Change(data, nr4, cycleCounter); } diff --git a/libgambatte/src/sound/channel4.cpp b/libgambatte/src/sound/channel4.cpp index 3fb6473868..f1b355adc7 100644 --- a/libgambatte/src/sound/channel4.cpp +++ b/libgambatte/src/sound/channel4.cpp @@ -150,12 +150,6 @@ void Channel4::Lfsr::resetCounters(const unsigned long oldCc) { SoundUnit::resetCounters(oldCc); } -void Channel4::Lfsr::saveState(SaveState &state, const unsigned long cc) { - updateBackupCounter(cc); - state.spu.ch4.lfsr.counter = backupCounter; - state.spu.ch4.lfsr.reg = reg; -} - void Channel4::Lfsr::loadState(const SaveState &state) { counter = backupCounter = std::max(state.spu.ch4.lfsr.counter, state.spu.cycleCounter); reg = state.spu.ch4.lfsr.reg; @@ -249,15 +243,6 @@ void Channel4::init(const bool cgb) { lengthCounter.init(cgb); } -void Channel4::saveState(SaveState &state) { - lfsr.saveState(state, cycleCounter); - envelopeUnit.saveState(state.spu.ch4.env); - lengthCounter.saveState(state.spu.ch4.lcounter); - - state.spu.ch4.nr4 = nr4; - state.spu.ch4.master = master; -} - void Channel4::loadState(const SaveState &state) { lfsr.loadState(state); envelopeUnit.loadState(state.spu.ch4.env, state.mem.ioamhram.get()[0x121], state.spu.cycleCounter); diff --git a/libgambatte/src/sound/channel4.h b/libgambatte/src/sound/channel4.h index fe8eb07f3d..6365ad682f 100644 --- a/libgambatte/src/sound/channel4.h +++ b/libgambatte/src/sound/channel4.h @@ -46,7 +46,6 @@ class Channel4 { void nr3Change(unsigned newNr3, unsigned long cc); void nr4Init(unsigned long cc); void reset(unsigned long cc); - void saveState(SaveState &state, const unsigned long cc); void loadState(const SaveState &state); void resetCounters(unsigned long oldCc); void disableMaster() { killCounter(); master = false; reg = 0x7FFF; } @@ -96,7 +95,6 @@ public: void reset(); void init(bool cgb); - void saveState(SaveState &state); void loadState(const SaveState &state); templatevoid SyncState(NewState *ns); diff --git a/libgambatte/src/sound/duty_unit.cpp b/libgambatte/src/sound/duty_unit.cpp index 130fcbcaea..2059239a75 100644 --- a/libgambatte/src/sound/duty_unit.cpp +++ b/libgambatte/src/sound/duty_unit.cpp @@ -112,13 +112,6 @@ void DutyUnit::reset() { setCounter(); } -void DutyUnit::saveState(SaveState::SPU::Duty &dstate, const unsigned long cc) { - updatePos(cc); - dstate.nextPosUpdate = nextPosUpdate; - dstate.nr3 = getFreq() & 0xFF; - dstate.pos = pos; -} - void DutyUnit::loadState(const SaveState::SPU::Duty &dstate, const unsigned nr1, const unsigned nr4, const unsigned long cc) { nextPosUpdate = std::max(dstate.nextPosUpdate, cc); pos = dstate.pos & 7; diff --git a/libgambatte/src/sound/duty_unit.h b/libgambatte/src/sound/duty_unit.h index de44de30a1..cdf4a64f32 100644 --- a/libgambatte/src/sound/duty_unit.h +++ b/libgambatte/src/sound/duty_unit.h @@ -46,7 +46,6 @@ public: void nr3Change(unsigned newNr3, unsigned long cc); void nr4Change(unsigned newNr4, unsigned long cc); void reset(); - void saveState(SaveState::SPU::Duty &dstate, unsigned long cc); void loadState(const SaveState::SPU::Duty &dstate, unsigned nr1, unsigned nr4, unsigned long cc); void resetCounters(unsigned long oldCc); void killCounter(); diff --git a/libgambatte/src/sound/envelope_unit.cpp b/libgambatte/src/sound/envelope_unit.cpp index 37a1af5578..f482bbf7a3 100644 --- a/libgambatte/src/sound/envelope_unit.cpp +++ b/libgambatte/src/sound/envelope_unit.cpp @@ -92,11 +92,6 @@ void EnvelopeUnit::reset() { counter = COUNTER_DISABLED; } -void EnvelopeUnit::saveState(SaveState::SPU::Env &estate) const { - estate.counter = counter; - estate.volume = volume; -} - void EnvelopeUnit::loadState(const SaveState::SPU::Env &estate, const unsigned nr2, const unsigned long cc) { counter = std::max(estate.counter, cc); volume = estate.volume; diff --git a/libgambatte/src/sound/envelope_unit.h b/libgambatte/src/sound/envelope_unit.h index d7d2eca0a0..68d6bdc54c 100644 --- a/libgambatte/src/sound/envelope_unit.h +++ b/libgambatte/src/sound/envelope_unit.h @@ -46,7 +46,6 @@ public: bool nr2Change(unsigned newNr2); bool nr4Init(unsigned long cycleCounter); void reset(); - void saveState(SaveState::SPU::Env &estate) const; void loadState(const SaveState::SPU::Env &estate, unsigned nr2, unsigned long cc); templatevoid SyncState(NewState *ns); diff --git a/libgambatte/src/sound/length_counter.cpp b/libgambatte/src/sound/length_counter.cpp index 2846c85ba8..cb3616a4ff 100644 --- a/libgambatte/src/sound/length_counter.cpp +++ b/libgambatte/src/sound/length_counter.cpp @@ -78,11 +78,6 @@ void LengthCounter::init(const bool cgb) { this->cgb = cgb; } -void LengthCounter::saveState(SaveState::SPU::LCounter &lstate) const { - lstate.counter = counter; - lstate.lengthCounter = lengthCounter; -} - void LengthCounter::loadState(const SaveState::SPU::LCounter &lstate, const unsigned long cc) { counter = std::max(lstate.counter, cc); lengthCounter = lstate.lengthCounter; diff --git a/libgambatte/src/sound/length_counter.h b/libgambatte/src/sound/length_counter.h index a50d643824..533606171a 100644 --- a/libgambatte/src/sound/length_counter.h +++ b/libgambatte/src/sound/length_counter.h @@ -40,7 +40,6 @@ public: void nr4Change(unsigned oldNr4, unsigned newNr4, unsigned long cc); // void reset(); void init(bool cgb); - void saveState(SaveState::SPU::LCounter &lstate) const; void loadState(const SaveState::SPU::LCounter &lstate, unsigned long cc); templatevoid SyncState(NewState *ns); diff --git a/libgambatte/src/tima.cpp b/libgambatte/src/tima.cpp index 5764afa6b8..c125bd57fb 100644 --- a/libgambatte/src/tima.cpp +++ b/libgambatte/src/tima.cpp @@ -31,11 +31,6 @@ tma_(0), tac_(0) {} -void Tima::saveState(SaveState &state) const { - state.mem.timaLastUpdate = lastUpdate_; - state.mem.tmatime = tmatime_; -} - void Tima::loadState(const SaveState &state, const TimaInterruptRequester timaIrq) { lastUpdate_ = state.mem.timaLastUpdate; tmatime_ = state.mem.tmatime; diff --git a/libgambatte/src/tima.h b/libgambatte/src/tima.h index aece83b286..4bb6c31d31 100644 --- a/libgambatte/src/tima.h +++ b/libgambatte/src/tima.h @@ -50,7 +50,6 @@ class Tima { public: Tima(); - void saveState(SaveState &) const; void loadState(const SaveState &, TimaInterruptRequester timaIrq); void resetCc(unsigned long oldCc, unsigned long newCc, TimaInterruptRequester timaIrq); diff --git a/libgambatte/src/video.cpp b/libgambatte/src/video.cpp index ace0705c7a..fe17b72310 100644 --- a/libgambatte/src/video.cpp +++ b/libgambatte/src/video.cpp @@ -105,16 +105,6 @@ void LCD::setStatePtrs(SaveState &state) { ppu.setStatePtrs(state); } -void LCD::saveState(SaveState &state) const { - state.mem.hdmaTransfer = hdmaIsEnabled(); - state.ppu.nextM0Irq = eventTimes_(MODE0_IRQ) - ppu.now(); - state.ppu.pendingLcdstatIrq = eventTimes_(ONESHOT_LCDSTATIRQ) != DISABLED_TIME; - - lycIrq.saveState(state); - m0Irq_.saveState(state); - ppu.saveState(state); -} - void LCD::loadState(const SaveState &state, const unsigned char *const oamram) { statReg = state.mem.ioamhram.get()[0x141]; m2IrqStatReg_ = statReg; diff --git a/libgambatte/src/video.h b/libgambatte/src/video.h index ffe14894e5..67c0856aed 100644 --- a/libgambatte/src/video.h +++ b/libgambatte/src/video.h @@ -71,10 +71,6 @@ public: lycReg_ = lycReg; } - void saveState(SaveState &state) const { - state.ppu.m0lyc = lycReg_; - } - void loadState(const SaveState &state) { lycReg_ = state.ppu.m0lyc; statReg_ = state.mem.ioamhram.get()[0x141]; @@ -174,7 +170,6 @@ public: LCD(const unsigned char *oamram, const unsigned char *vram_in, VideoInterruptRequester memEventRequester); void reset(const unsigned char *oamram, const unsigned char *vram, bool cgb); void setStatePtrs(SaveState &state); - void saveState(SaveState &state) const; void loadState(const SaveState &state, const unsigned char *oamram); void setDmgPaletteColor(unsigned palNum, unsigned colorNum, unsigned long rgb32); void setCgbPalette(unsigned *lut); diff --git a/libgambatte/src/video/lyc_irq.cpp b/libgambatte/src/video/lyc_irq.cpp index 5f3a212bb9..d9a138a3fd 100644 --- a/libgambatte/src/video/lyc_irq.cpp +++ b/libgambatte/src/video/lyc_irq.cpp @@ -85,10 +85,6 @@ void LycIrq::loadState(const SaveState &state) { statReg_ = statRegSrc_; } -void LycIrq::saveState(SaveState &state) const { - state.ppu.lyc = lycReg_; -} - void LycIrq::reschedule(const LyCounter & lyCounter, const unsigned long cc) { time_ = std::min(schedule(statReg_ , lycReg_ , lyCounter, cc), schedule(statRegSrc_, lycRegSrc_, lyCounter, cc)); diff --git a/libgambatte/src/video/lyc_irq.h b/libgambatte/src/video/lyc_irq.h index 96e0f7d8c2..19577a802a 100644 --- a/libgambatte/src/video/lyc_irq.h +++ b/libgambatte/src/video/lyc_irq.h @@ -41,7 +41,6 @@ public: void doEvent(unsigned char *ifreg, const LyCounter &lyCounter); unsigned lycReg() const { return lycRegSrc_; } void loadState(const SaveState &state); - void saveState(SaveState &state) const; unsigned long time() const { return time_; } void setCgb(const bool cgb) { cgb_ = cgb; } void lcdReset(); diff --git a/libgambatte/src/video/ppu.cpp b/libgambatte/src/video/ppu.cpp index cf32ebcb86..6813d58990 100644 --- a/libgambatte/src/video/ppu.cpp +++ b/libgambatte/src/video/ppu.cpp @@ -1486,27 +1486,6 @@ static void saveSpriteList(const PPUPriv &p, SaveState &ss) { ss.ppu.currentSprite = p.currentSprite; } -void PPU::saveState(SaveState &ss) const { - p_.spriteMapper.saveState(ss); - ss.ppu.videoCycles = p_.lcdc & 0x80 ? p_.lyCounter.frameCycles(p_.now) : 0; - ss.ppu.xpos = p_.xpos; - ss.ppu.endx = p_.endx; - ss.ppu.reg0 = p_.reg0; - ss.ppu.reg1 = p_.reg1; - ss.ppu.tileword = p_.tileword; - ss.ppu.ntileword = p_.ntileword; - ss.ppu.attrib = p_.attrib; - ss.ppu.nattrib = p_.nattrib; - ss.ppu.winDrawState = p_.winDrawState; - ss.ppu.winYPos = p_.winYPos; - ss.ppu.oldWy = p_.wy2; - ss.ppu.wscx = p_.wscx; - ss.ppu.weMaster = p_.weMaster; - saveSpriteList(p_, ss); - ss.ppu.state = p_.nextCallPtr->id; - ss.ppu.lastM0Time = p_.now - p_.lastM0Time; -} - namespace { template diff --git a/libgambatte/src/video/ppu.h b/libgambatte/src/video/ppu.h index 8152f83376..130e1ffd0a 100644 --- a/libgambatte/src/video/ppu.h +++ b/libgambatte/src/video/ppu.h @@ -118,7 +118,6 @@ public: unsigned long predictedNextXposTime(unsigned xpos) const; void reset(const unsigned char *oamram, const unsigned char *vram, bool cgb); void resetCc(unsigned long oldCc, unsigned long newCc); - void saveState(SaveState &ss) const; void setFrameBuf(uint_least32_t *buf, unsigned pitch) { p_.framebuf.setBuf(buf, pitch); } void setLcdc(unsigned lcdc, unsigned long cc); void setScx(const unsigned scx) { p_.scx = scx; } diff --git a/libgambatte/src/video/sprite_mapper.h b/libgambatte/src/video/sprite_mapper.h index defc39d5cf..09e269d769 100644 --- a/libgambatte/src/video/sprite_mapper.h +++ b/libgambatte/src/video/sprite_mapper.h @@ -55,7 +55,6 @@ class SpriteMapper { const unsigned char *spritePosBuf() const { return buf; } void setStatePtrs(SaveState &state); void enableDisplay(unsigned long cc); - void saveState(SaveState &state) const { state.ppu.enableDisplayM0Time = lu; } void loadState(const SaveState &ss, const unsigned char *oamram); bool inactivePeriodAfterDisplayEnable(const unsigned long cc) const { return cc < lu; } @@ -122,7 +121,6 @@ public: void setStatePtrs(SaveState &state) { oamReader.setStatePtrs(state); } void enableDisplay(unsigned long cc) { oamReader.enableDisplay(cc); } - void saveState(SaveState &state) const { oamReader.saveState(state); } void loadState(const SaveState &state, const unsigned char *const oamram) { oamReader.loadState(state, oamram); mapSprites(); } bool inactivePeriodAfterDisplayEnable(unsigned long cc) const { return oamReader.inactivePeriodAfterDisplayEnable(cc); } diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 4d15c97b7908b198d5ed6e871f27ea25ed3e809d..e893f84f8994a11008dd3ae5601cd65330ca9505 100644 GIT binary patch delta 13212 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 K&6~s*4F3br(rZHi