From 5710282ac6edf9edf8c4910ce53b6b0685d84ba3 Mon Sep 17 00:00:00 2001 From: goyuken Date: Sun, 11 May 2014 15:40:02 +0000 Subject: [PATCH] gambatte: eliminate some unused code --- .../Consoles/Nintendo/Gameboy/Gambatte.cs | 32 -- .../Consoles/Nintendo/Gameboy/LibGambatte.cs | 27 - libgambatte/include/gambatte.h | 13 - libgambatte/libgambatte.vcxproj | 2 - libgambatte/libgambatte.vcxproj.filters | 6 - libgambatte/src/cinterface.cpp | 30 -- libgambatte/src/gambatte.cpp | 32 -- libgambatte/src/initstate.h | Bin 1569 -> 1568 bytes libgambatte/src/statesaver.cpp | 478 ------------------ libgambatte/src/statesaver.h | 44 -- output/dll/libgambatte.dll | Bin 188416 -> 151040 bytes 11 files changed, 664 deletions(-) delete mode 100644 libgambatte/src/statesaver.cpp delete mode 100644 libgambatte/src/statesaver.h diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 53d5050542..b4f13e3f90 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -438,38 +438,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy throw new Exception("gambatte_newstateload() returned false"); } - /// - /// handles the core-portion of savestating - /// - /// private binary data corresponding to a savestate - byte[] SaveCoreBinary() - { - uint nlen = 0; - IntPtr ndata = IntPtr.Zero; - - if (!LibGambatte.gambatte_savestate(GambatteState, ref ndata, ref nlen)) - throw new Exception("Gambatte failed to save the savestate!"); - - if (nlen == 0) - throw new Exception("Gambatte returned a 0-length savestate?"); - - byte[] data = new byte[nlen]; - System.Runtime.InteropServices.Marshal.Copy(ndata, data, 0, (int)nlen); - LibGambatte.gambatte_savestate_destroy(ndata); - - return data; - } - - /// - /// handles the core portion of loadstating - /// - /// private binary data previously returned from SaveCoreBinary() - void LoadCoreBinary(byte[] data) - { - if (!LibGambatte.gambatte_loadstate(GambatteState, data, (uint)data.Length)) - throw new Exception("Gambatte failed to load the savestate!"); - } - public void SaveStateText(System.IO.TextWriter writer) { var temp = SaveStateBinary(); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs index 0412969116..78302aee1f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -271,33 +271,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int gambatte_savesavedatalength(IntPtr core); - /// - /// Saves emulator state to a byte array - /// - /// opaque state pointer - /// private savestate data returned by the core - /// the length of the data in bytes - /// success - [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern bool gambatte_savestate(IntPtr core, ref IntPtr data, ref uint len); - - /// - /// destroy data returned by gambatte_savestate() to avoid memory leaks - /// - /// pointer from gambatte_savestate() - [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern void gambatte_savestate_destroy(IntPtr data); - - /// - /// Loads emulator state from a byte array - /// - /// opaque state pointer - /// savestate data - /// length of the savestate data in bytes - /// success - [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern bool gambatte_loadstate(IntPtr core, byte[] data, uint len); - /// /// new savestate method /// diff --git a/libgambatte/include/gambatte.h b/libgambatte/include/gambatte.h index 1aaea2333d..8652739799 100644 --- a/libgambatte/include/gambatte.h +++ b/libgambatte/include/gambatte.h @@ -107,19 +107,6 @@ public: // 0 = vram, 1 = rom, 2 = wram, 3 = cartram, 4 = oam, 5 = hram bool getMemoryArea(int which, unsigned char **data, int *length); - /** Saves emulator state to the file given by 'filepath'. - * - * @param videoBuf 160x144 RGB32 (native endian) video frame buffer or 0. Used for saving a thumbnail. - * @param pitch distance in number of pixels (not bytes) from the start of one line to the next in videoBuf. - * @return success - */ - bool saveState(std::ostream &file); - - /** Loads emulator state from the file given by 'filepath'. - * @return success - */ - bool loadState(std::istream &file); - /** ROM header title of currently loaded ROM image. */ const std::string romTitle() const; diff --git a/libgambatte/libgambatte.vcxproj b/libgambatte/libgambatte.vcxproj index f87ce0bcba..434d1c23c3 100644 --- a/libgambatte/libgambatte.vcxproj +++ b/libgambatte/libgambatte.vcxproj @@ -115,7 +115,6 @@ - @@ -144,7 +143,6 @@ - diff --git a/libgambatte/libgambatte.vcxproj.filters b/libgambatte/libgambatte.vcxproj.filters index 52ac8d5a4d..5571702c18 100644 --- a/libgambatte/libgambatte.vcxproj.filters +++ b/libgambatte/libgambatte.vcxproj.filters @@ -21,9 +21,6 @@ Header Files - - Header Files - Header Files @@ -140,9 +137,6 @@ Source Files - - Source Files - Source Files diff --git a/libgambatte/src/cinterface.cpp b/libgambatte/src/cinterface.cpp index 8df32e33fb..f5c0987a29 100644 --- a/libgambatte/src/cinterface.cpp +++ b/libgambatte/src/cinterface.cpp @@ -144,36 +144,6 @@ GBEXPORT int gambatte_savesavedatalength(void *core) return g->saveSavedataLength(); } -GBEXPORT int gambatte_savestate(void *core, char **data, unsigned *len) -{ - GB *g = (GB *) core; - - std::ostringstream os = std::ostringstream(std::ios_base::binary | std::ios_base::out); - if (!g->saveState(os)) - return 0; - - os.flush(); - std::string s = os.str(); - char *ret = (char *) std::malloc(s.length()); - std::memcpy(ret, s.data(), s.length()); - *len = s.length(); - *data = ret; - return 1; -} - -GBEXPORT void gambatte_savestate_destroy(char *data) -{ - std::free(data); -} - -GBEXPORT int gambatte_loadstate(void *core, const char *data, unsigned len) -{ - GB *g = (GB *) core; - // msvc allows using an Rvalue directly where an Lvalue is need, which is kind of cool and sort of makes sense, but no - std::istringstream iss(std::string(data, len), std::ios_base::binary | std::ios_base::in); - return g->loadState(iss); -} - GBEXPORT long gambatte_newstatelen(void *core) { GB *g = (GB *) core; diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index 46b3973c92..7fbe2c8647 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -19,7 +19,6 @@ #include "gambatte.h" #include "cpu.h" #include "savestate.h" -#include "statesaver.h" #include "initstate.h" #include #include @@ -195,37 +194,6 @@ void GB::setCgbPalette(unsigned *lut) { p_->cpu.setCgbPalette(lut); } -bool GB::loadState(std::istream &file) { - if (p_->cpu.loaded()) { - // p_->cpu.saveSavedata(); - - SaveState state; - p_->cpu.setStatePtrs(state); - - if (StateSaver::loadState(state, file)) { - p_->cpu.loadState(state); - file.read((char *)p_->vbuff, 160 * 144 * 4); // yes, sloppy - return true; - } - } - - return false; -} - -bool GB::saveState(std::ostream &file) { - if (p_->cpu.loaded()) { - SaveState state; - p_->cpu.setStatePtrs(state); - p_->cpu.saveState(state); - bool ret = StateSaver::saveState(state, file); - if (ret) - file.write((const char *)p_->vbuff, 160 * 144 * 4); // yes, sloppy - return ret; - } - - return false; -} - const std::string GB::romTitle() const { if (p_->cpu.loaded()) { char title[0x11]; diff --git a/libgambatte/src/initstate.h b/libgambatte/src/initstate.h index aa33d90a919ab00cd03dfb47be666856ec2d8731..8d8ed5aaf6ab1ea58493beff8629931cc5f6d113 100644 GIT binary patch delta 19 bcmZ3;vw&wp5o7VhjVhDRv9NEP-^2<4O5+E4 delta 20 ccmZ3$vyf*(5fel4#EmMG8(7#k&TC=?081waD*ylh diff --git a/libgambatte/src/statesaver.cpp b/libgambatte/src/statesaver.cpp deleted file mode 100644 index d8c3131a13..0000000000 --- a/libgambatte/src/statesaver.cpp +++ /dev/null @@ -1,478 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Sindre Aamås * - * aamas@stud.ntnu.no * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2 as * - * published by the Free Software Foundation. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License version 2 for more details. * - * * - * You should have received a copy of the GNU General Public License * - * version 2 along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -#include "statesaver.h" -#include "savestate.h" -#include "array.h" -#include -#include -#include -#include -#include - -namespace { - -using namespace gambatte; - -enum AsciiChar { - NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS, TAB, LF, VT, FF, CR, SO, SI, - DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM, SUB, ESC, FS, GS, RS, US, - SP, XCL, QOT, HSH, DLR, PRC, AMP, APO, LPA, RPA, AST, PLU, COM, HYP, STP, DIV, - NO0, NO1, NO2, NO3, NO4, NO5, NO6, NO7, NO8, NO9, CLN, SCL, LT, EQL, GT, QTN, - AT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, - P, Q, R, S, T, U, V, W, X, Y, Z, LBX, BSL, RBX, CAT, UND, - ACN, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, - p, q, r, s, t, u, v, w, x, y, z, LBR, BAR, RBR, TLD, DEL -}; - -struct Saver { - const char *label; - void (*save)(std::ostream &file, const SaveState &state); - void (*load)(std::istream &file, SaveState &state); - unsigned char labelsize; -}; - -static inline bool operator<(const Saver &l, const Saver &r) { - return std::strcmp(l.label, r.label) < 0; -} - -static void put24(std::ostream &file, const unsigned long data) { - file.put(data >> 16 & 0xFF); - file.put(data >> 8 & 0xFF); - file.put(data & 0xFF); -} - -static void put32(std::ostream &file, const unsigned long data) { - file.put(data >> 24 & 0xFF); - file.put(data >> 16 & 0xFF); - file.put(data >> 8 & 0xFF); - file.put(data & 0xFF); -} - -static void write(std::ostream &file, const unsigned char data) { - static const char inf[] = { 0x00, 0x00, 0x01 }; - - file.write(inf, sizeof(inf)); - file.put(data & 0xFF); -} - -static void write(std::ostream &file, const unsigned short data) { - static const char inf[] = { 0x00, 0x00, 0x02 }; - - file.write(inf, sizeof(inf)); - file.put(data >> 8 & 0xFF); - file.put(data & 0xFF); -} - -static void write(std::ostream &file, const unsigned long data) { - static const char inf[] = { 0x00, 0x00, 0x04 }; - - file.write(inf, sizeof(inf)); - put32(file, data); -} - -static inline void write(std::ostream &file, const bool data) { - write(file, static_cast(data)); -} - -static void write(std::ostream &file, const unsigned char *data, const unsigned long sz) { - put24(file, sz); - file.write(reinterpret_cast(data), sz); -} - -static void write(std::ostream &file, const bool *data, const unsigned long sz) { - put24(file, sz); - - for (unsigned long i = 0; i < sz; ++i) - file.put(data[i]); -} - -static unsigned long get24(std::istream &file) { - unsigned long tmp = file.get() & 0xFF; - - tmp = tmp << 8 | (file.get() & 0xFF); - - return tmp << 8 | (file.get() & 0xFF); -} - -static unsigned long read(std::istream &file) { - unsigned long size = get24(file); - - if (size > 4) { - file.ignore(size - 4); - size = 4; - } - - unsigned long out = 0; - - switch (size) { - case 4: out = (out | (file.get() & 0xFF)) << 8; - case 3: out = (out | (file.get() & 0xFF)) << 8; - case 2: out = (out | (file.get() & 0xFF)) << 8; - case 1: out = out | (file.get() & 0xFF); - } - - return out; -} - -static inline void read(std::istream &file, unsigned char &data) { - data = read(file) & 0xFF; -} - -static inline void read(std::istream &file, unsigned short &data) { - data = read(file) & 0xFFFF; -} - -static inline void read(std::istream &file, unsigned long &data) { - data = read(file); -} - -static inline void read(std::istream &file, bool &data) { - data = read(file); -} - -static void read(std::istream &file, unsigned char *data, unsigned long sz) { - const unsigned long size = get24(file); - - if (size < sz) - sz = size; - - file.read(reinterpret_cast(data), sz); - file.ignore(size - sz); - - if (static_cast(0x100)) { - for (unsigned long i = 0; i < sz; ++i) - data[i] &= 0xFF; - } -} - -static void read(std::istream &file, bool *data, unsigned long sz) { - const unsigned long size = get24(file); - - if (size < sz) - sz = size; - - for (unsigned long i = 0; i < sz; ++i) - data[i] = file.get(); - - file.ignore(size - sz); -} - -} // anon namespace - -namespace gambatte { - -class SaverList { -public: - typedef std::vector list_t; - typedef list_t::const_iterator const_iterator; - -private: - list_t list; - unsigned char maxLabelsize_; - -public: - SaverList(); - const_iterator begin() const { return list.begin(); } - const_iterator end() const { return list.end(); } - unsigned maxLabelsize() const { return maxLabelsize_; } -}; - -static void pushSaver(SaverList::list_t &list, const char *label, - void (*save)(std::ostream &file, const SaveState &state), - void (*load)(std::istream &file, SaveState &state), unsigned labelsize) { - const Saver saver = { label, save, load, labelsize }; - list.push_back(saver); -} - -SaverList::SaverList() { -#define ADD(arg) do { \ - struct Func { \ - static void save(std::ostream &file, const SaveState &state) { write(file, state.arg); } \ - static void load(std::istream &file, SaveState &state) { read(file, state.arg); } \ - }; \ - \ - pushSaver(list, label, Func::save, Func::load, sizeof label); \ -} while (0) - -#define ADDPTR(arg) do { \ - struct Func { \ - static void save(std::ostream &file, const SaveState &state) { write(file, state.arg.get(), state.arg.getSz()); } \ - static void load(std::istream &file, SaveState &state) { read(file, state.arg.ptr, state.arg.getSz()); } \ - }; \ - \ - pushSaver(list, label, Func::save, Func::load, sizeof label); \ -} while (0) - -#define ADDARRAY(arg) do { \ - struct Func { \ - static void save(std::ostream &file, const SaveState &state) { write(file, state.arg, sizeof(state.arg)); } \ - static void load(std::istream &file, SaveState &state) { read(file, state.arg, sizeof(state.arg)); } \ - }; \ - \ - pushSaver(list, label, Func::save, Func::load, sizeof label); \ -} while (0) - - { static const char label[] = { c,c, NUL }; ADD(cpu.cycleCounter); } - { static const char label[] = { p,c, NUL }; ADD(cpu.PC); } - { static const char label[] = { s,p, NUL }; ADD(cpu.SP); } - { static const char label[] = { a, NUL }; ADD(cpu.A); } - { static const char label[] = { b, NUL }; ADD(cpu.B); } - { static const char label[] = { c, NUL }; ADD(cpu.C); } - { static const char label[] = { d, NUL }; ADD(cpu.D); } - { static const char label[] = { e, NUL }; ADD(cpu.E); } - { static const char label[] = { f, NUL }; ADD(cpu.F); } - { static const char label[] = { h, NUL }; ADD(cpu.H); } - { static const char label[] = { l, NUL }; ADD(cpu.L); } - { static const char label[] = { s,k,i,p, NUL }; ADD(cpu.skip); } - { static const char label[] = { h,a,l,t, NUL }; ADD(mem.halted); } - { static const char label[] = { v,r,a,m, NUL }; ADDPTR(mem.vram); } - { static const char label[] = { s,r,a,m, NUL }; ADDPTR(mem.sram); } - { static const char label[] = { w,r,a,m, NUL }; ADDPTR(mem.wram); } - { static const char label[] = { h,r,a,m, NUL }; ADDPTR(mem.ioamhram); } - { static const char label[] = { l,d,i,v,u,p, NUL }; ADD(mem.divLastUpdate); } - { static const char label[] = { l,t,i,m,a,u,p, NUL }; ADD(mem.timaLastUpdate); } - { static const char label[] = { t,m,a,t,i,m,e, NUL }; ADD(mem.tmatime); } - { static const char label[] = { s,e,r,i,a,l,t, NUL }; ADD(mem.nextSerialtime); } - { static const char label[] = { l,o,d,m,a,u,p, NUL }; ADD(mem.lastOamDmaUpdate); } - { static const char label[] = { m,i,n,i,n,t,t, NUL }; ADD(mem.minIntTime); } - { static const char label[] = { u,n,h,a,l,t,t, NUL }; ADD(mem.unhaltTime); } - { static const char label[] = { r,o,m,b,a,n,k, NUL }; ADD(mem.rombank); } - { static const char label[] = { d,m,a,s,r,c, NUL }; ADD(mem.dmaSource); } - { static const char label[] = { d,m,a,d,s,t, NUL }; ADD(mem.dmaDestination); } - { static const char label[] = { r,a,m,b,a,n,k, NUL }; ADD(mem.rambank); } - { static const char label[] = { o,d,m,a,p,o,s, NUL }; ADD(mem.oamDmaPos); } - { static const char label[] = { i,m,e, NUL }; ADD(mem.IME); } - { static const char label[] = { s,r,a,m,o,n, NUL }; ADD(mem.enableRam); } - { static const char label[] = { r,a,m,b,m,o,d, NUL }; ADD(mem.rambankMode); } - { static const char label[] = { h,d,m,a, NUL }; ADD(mem.hdmaTransfer); } - { static const char label[] = { b,g,p, NUL }; ADDPTR(ppu.bgpData); } - { static const char label[] = { o,b,j,p, NUL }; ADDPTR(ppu.objpData); } - { static const char label[] = { s,p,o,s,b,u,f, NUL }; ADDPTR(ppu.oamReaderBuf); } - { static const char label[] = { s,p,s,z,b,u,f, NUL }; ADDPTR(ppu.oamReaderSzbuf); } - { static const char label[] = { s,p,a,t,t,r, NUL }; ADDARRAY(ppu.spAttribList); } - { static const char label[] = { s,p,b,y,t,e,NO0, NUL }; ADDARRAY(ppu.spByte0List); } - { static const char label[] = { s,p,b,y,t,e,NO1, NUL }; ADDARRAY(ppu.spByte1List); } - { static const char label[] = { v,c,y,c,l,e,s, NUL }; ADD(ppu.videoCycles); } - { static const char label[] = { e,d,M,NO0,t,i,m, NUL }; ADD(ppu.enableDisplayM0Time); } - { static const char label[] = { m,NO0,t,i,m,e, NUL }; ADD(ppu.lastM0Time); } - { static const char label[] = { n,m,NO0,i,r,q, NUL }; ADD(ppu.nextM0Irq); } - { static const char label[] = { b,g,t,w, NUL }; ADD(ppu.tileword); } - { static const char label[] = { b,g,n,t,w, NUL }; ADD(ppu.ntileword); } - { static const char label[] = { w,i,n,y,p,o,s, NUL }; ADD(ppu.winYPos); } - { static const char label[] = { x,p,o,s, NUL }; ADD(ppu.xpos); } - { static const char label[] = { e,n,d,x, NUL }; ADD(ppu.endx); } - { static const char label[] = { p,p,u,r,NO0, NUL }; ADD(ppu.reg0); } - { static const char label[] = { p,p,u,r,NO1, NUL }; ADD(ppu.reg1); } - { static const char label[] = { b,g,a,t,r,b, NUL }; ADD(ppu.attrib); } - { static const char label[] = { b,g,n,a,t,r,b, NUL }; ADD(ppu.nattrib); } - { static const char label[] = { p,p,u,s,t,a,t, NUL }; ADD(ppu.state); } - { static const char label[] = { n,s,p,r,i,t,e, NUL }; ADD(ppu.nextSprite); } - { static const char label[] = { c,s,p,r,i,t,e, NUL }; ADD(ppu.currentSprite); } - { static const char label[] = { l,y,c, NUL }; ADD(ppu.lyc); } - { static const char label[] = { m,NO0,l,y,c, NUL }; ADD(ppu.m0lyc); } - { static const char label[] = { o,l,d,w,y, NUL }; ADD(ppu.oldWy); } - { static const char label[] = { w,i,n,d,r,a,w, NUL }; ADD(ppu.winDrawState); } - { static const char label[] = { w,s,c,x, NUL }; ADD(ppu.wscx); } - { static const char label[] = { w,e,m,a,s,t,r, NUL }; ADD(ppu.weMaster); } - { static const char label[] = { l,c,d,s,i,r,q, NUL }; ADD(ppu.pendingLcdstatIrq); } - { static const char label[] = { s,p,u,c,n,t,r, NUL }; ADD(spu.cycleCounter); } - { static const char label[] = { s,w,p,c,n,t,r, NUL }; ADD(spu.ch1.sweep.counter); } - { static const char label[] = { s,w,p,s,h,d,w, NUL }; ADD(spu.ch1.sweep.shadow); } - { static const char label[] = { s,w,p,n,e,g, NUL }; ADD(spu.ch1.sweep.negging); } - { static const char label[] = { d,u,t,NO1,c,t,r, NUL }; ADD(spu.ch1.duty.nextPosUpdate); } - { static const char label[] = { d,u,t,NO1,p,o,s, NUL }; ADD(spu.ch1.duty.pos); } - { static const char label[] = { e,n,v,NO1,c,t,r, NUL }; ADD(spu.ch1.env.counter); } - { static const char label[] = { e,n,v,NO1,v,o,l, NUL }; ADD(spu.ch1.env.volume); } - { static const char label[] = { l,e,n,NO1,c,t,r, NUL }; ADD(spu.ch1.lcounter.counter); } - { static const char label[] = { l,e,n,NO1,v,a,l, NUL }; ADD(spu.ch1.lcounter.lengthCounter); } - { static const char label[] = { n,r,NO1,NO0, NUL }; ADD(spu.ch1.sweep.nr0); } - { static const char label[] = { n,r,NO1,NO3, NUL }; ADD(spu.ch1.duty.nr3); } - { static const char label[] = { n,r,NO1,NO4, NUL }; ADD(spu.ch1.nr4); } - { static const char label[] = { c,NO1,m,a,s,t,r, NUL }; ADD(spu.ch1.master); } - { static const char label[] = { d,u,t,NO2,c,t,r, NUL }; ADD(spu.ch2.duty.nextPosUpdate); } - { static const char label[] = { d,u,t,NO2,p,o,s, NUL }; ADD(spu.ch2.duty.pos); } - { static const char label[] = { e,n,v,NO2,c,t,r, NUL }; ADD(spu.ch2.env.counter); } - { static const char label[] = { e,n,v,NO2,v,o,l, NUL }; ADD(spu.ch2.env.volume); } - { static const char label[] = { l,e,n,NO2,c,t,r, NUL }; ADD(spu.ch2.lcounter.counter); } - { static const char label[] = { l,e,n,NO2,v,a,l, NUL }; ADD(spu.ch2.lcounter.lengthCounter); } - { static const char label[] = { n,r,NO2,NO3, NUL }; ADD(spu.ch2.duty.nr3); } - { static const char label[] = { n,r,NO2,NO4, NUL }; ADD(spu.ch2.nr4); } - { static const char label[] = { c,NO2,m,a,s,t,r, NUL }; ADD(spu.ch2.master); } - { static const char label[] = { w,a,v,e,r,a,m, NUL }; ADDPTR(spu.ch3.waveRam); } - { static const char label[] = { l,e,n,NO3,c,t,r, NUL }; ADD(spu.ch3.lcounter.counter); } - { static const char label[] = { l,e,n,NO3,v,a,l, NUL }; ADD(spu.ch3.lcounter.lengthCounter); } - { static const char label[] = { w,a,v,e,c,t,r, NUL }; ADD(spu.ch3.waveCounter); } - { static const char label[] = { l,w,a,v,r,d,t, NUL }; ADD(spu.ch3.lastReadTime); } - { static const char label[] = { w,a,v,e,p,o,s, NUL }; ADD(spu.ch3.wavePos); } - { static const char label[] = { w,a,v,s,m,p,l, NUL }; ADD(spu.ch3.sampleBuf); } - { static const char label[] = { n,r,NO3,NO3, NUL }; ADD(spu.ch3.nr3); } - { static const char label[] = { n,r,NO3,NO4, NUL }; ADD(spu.ch3.nr4); } - { static const char label[] = { c,NO3,m,a,s,t,r, NUL }; ADD(spu.ch3.master); } - { static const char label[] = { l,f,s,r,c,t,r, NUL }; ADD(spu.ch4.lfsr.counter); } - { static const char label[] = { l,f,s,r,r,e,g, NUL }; ADD(spu.ch4.lfsr.reg); } - { static const char label[] = { e,n,v,NO4,c,t,r, NUL }; ADD(spu.ch4.env.counter); } - { static const char label[] = { e,n,v,NO4,v,o,l, NUL }; ADD(spu.ch4.env.volume); } - { static const char label[] = { l,e,n,NO4,c,t,r, NUL }; ADD(spu.ch4.lcounter.counter); } - { static const char label[] = { l,e,n,NO4,v,a,l, NUL }; ADD(spu.ch4.lcounter.lengthCounter); } - { static const char label[] = { n,r,NO4,NO4, NUL }; ADD(spu.ch4.nr4); } - { static const char label[] = { c,NO4,m,a,s,t,r, NUL }; ADD(spu.ch4.master); } - { static const char label[] = { r,t,c,b,a,s,e, NUL }; ADD(rtc.baseTime); } - { static const char label[] = { r,t,c,h,a,l,t, NUL }; ADD(rtc.haltTime); } - { static const char label[] = { r,t,c,d,h, NUL }; ADD(rtc.dataDh); } - { static const char label[] = { r,t,c,d,l, NUL }; ADD(rtc.dataDl); } - { static const char label[] = { r,t,c,h, NUL }; ADD(rtc.dataH); } - { static const char label[] = { r,t,c,m, NUL }; ADD(rtc.dataM); } - { static const char label[] = { r,t,c,s, NUL }; ADD(rtc.dataS); } - { static const char label[] = { r,t,c,l,l,d, NUL }; ADD(rtc.lastLatchData); } - -#undef ADD -#undef ADDPTR -#undef ADDARRAY - - list.resize(list.size()); - std::sort(list.begin(), list.end()); - - maxLabelsize_ = 0; - - for (std::size_t i = 0; i < list.size(); ++i) { - if (list[i].labelsize > maxLabelsize_) - maxLabelsize_ = list[i].labelsize; - } -} - -} - -namespace { - -struct PxlSum { unsigned long rb, g; }; - -static void addPxlPairs(PxlSum *const sum, const uint_least32_t *const p) { - sum[0].rb += (p[0] & 0xFF00FF) + (p[3] & 0xFF00FF); - sum[0].g += (p[0] & 0x00FF00) + (p[3] & 0x00FF00); - sum[1].rb += (p[1] & 0xFF00FF) + (p[2] & 0xFF00FF); - sum[1].g += (p[1] & 0x00FF00) + (p[2] & 0x00FF00); -} - -static void blendPxlPairs(PxlSum *const dst, const PxlSum *const sums) { - dst->rb = sums[1].rb * 8 + (sums[0].rb - sums[1].rb) * 3; - dst->g = sums[1].g * 8 + (sums[0].g - sums[1].g ) * 3; -} - -static void writeSnapShot(std::ostream &file, const uint_least32_t *pixels, const int pitch) { - put24(file, pixels ? StateSaver::SS_WIDTH * StateSaver::SS_HEIGHT * sizeof(uint_least32_t) : 0); - - if (pixels) { - uint_least32_t buf[StateSaver::SS_WIDTH]; - - for (unsigned h = StateSaver::SS_HEIGHT; h--;) { - for (unsigned x = 0; x < StateSaver::SS_WIDTH; ++x) { - const uint_least32_t *const p = pixels + x * StateSaver::SS_DIV; - PxlSum pxlsum[4] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} }; - - addPxlPairs(pxlsum , p ); - addPxlPairs(pxlsum + 2, p + pitch ); - addPxlPairs(pxlsum + 2, p + pitch * 2); - addPxlPairs(pxlsum , p + pitch * 3); - - blendPxlPairs(pxlsum , pxlsum ); - blendPxlPairs(pxlsum + 1, pxlsum + 2); - - blendPxlPairs(pxlsum , pxlsum ); - - buf[x] = ((pxlsum[0].rb & 0xFF00FF00U) | (pxlsum[0].g & 0x00FF0000U)) >> 8; - } - - file.write(reinterpret_cast(buf), sizeof(buf)); - pixels += pitch * StateSaver::SS_DIV; - } - } -} - -static SaverList list; - -} // anon namespace - -namespace gambatte { - -bool StateSaver::saveState(const SaveState &state, std::ostream &file) { - //std::ostream file(filename.c_str(), std::ios_base::binary); - - if (file.fail()) - return false; - - //{ static const char ver[] = { 0, 1 }; file.write(ver, sizeof(ver)); } - // bump version as the screenshot is being removed - { static const char ver[] = { 0, 2 }; file.write(ver, sizeof(ver)); } - - //writeSnapShot(file, videoBuf, pitch); - - for (SaverList::const_iterator it = list.begin(); it != list.end(); ++it) { - file.write(it->label, it->labelsize); - (*it->save)(file, state); - } - - return !file.fail(); -} - -bool StateSaver::loadState(SaveState &state, std::istream &file) { - //std::istream file(filename.c_str(), std::ios_base::binary); - - if (file.fail() || file.get() != 0) - return false; - - int minor = file.get(); - if (minor == 1) { // skip over screenshot - file.ignore(); - file.ignore(get24(file)); - } - else if (minor == 2) { // no screenshot - } - else - return false; - - const Array labelbuf(list.maxLabelsize()); - const Saver labelbufSaver = { labelbuf, 0, 0, list.maxLabelsize() }; - - SaverList::const_iterator done = list.begin(); - - while (file.good() && done != list.end()) { - file.getline(labelbuf, list.maxLabelsize(), NUL); - - SaverList::const_iterator it = done; - - if (std::strcmp(labelbuf, it->label)) { - it = std::lower_bound(it + 1, list.end(), labelbufSaver); - - if (it == list.end() || std::strcmp(labelbuf, it->label)) { - file.ignore(get24(file)); - continue; - } - } else - ++done; - - (*it->load)(file, state); - } - - state.cpu.cycleCounter &= 0x7FFFFFFF; - state.spu.cycleCounter &= 0x7FFFFFFF; - - return true; -} - -} diff --git a/libgambatte/src/statesaver.h b/libgambatte/src/statesaver.h deleted file mode 100644 index 46f2817603..0000000000 --- a/libgambatte/src/statesaver.h +++ /dev/null @@ -1,44 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Sindre Aamås * - * aamas@stud.ntnu.no * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2 as * - * published by the Free Software Foundation. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License version 2 for more details. * - * * - * You should have received a copy of the GNU General Public License * - * version 2 along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - ***************************************************************************/ -#ifndef STATESAVER_H -#define STATESAVER_H - -#include "gbint.h" -#include - -namespace gambatte { - -struct SaveState; - -class StateSaver { - StateSaver(); - -public: - enum { SS_SHIFT = 2 }; - enum { SS_DIV = 1 << 2 }; - enum { SS_WIDTH = 160 >> SS_SHIFT }; - enum { SS_HEIGHT = 144 >> SS_SHIFT }; - - static bool saveState(const SaveState &state, std::ostream &file); - static bool loadState(SaveState &state, std::istream &file); -}; - -} - -#endif diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 30a1066e82a2c1d3bf4fe8b159306b688b15d524..f9e2cf48cf43d1238e5cbecf1b10a61b774ef940 100644 GIT binary patch delta 34738 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 JawOM>`+wJv+z$W%