1 //////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // Nestopia - NES/Famicom emulator written in C++ 4 // 5 // Copyright (C) 2003-2008 Martin Freij 6 // 7 // This file is part of Nestopia. 8 // 9 // Nestopia is free software; you can redistribute it and/or modify 10 // it under the terms of the GNU General Public License as published by 11 // the Free Software Foundation; either version 2 of the License, or 12 // (at your option) any later version. 13 // 14 // Nestopia is distributed in the hope that it will be useful, 15 // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU General Public License for more details. 18 // 19 // You should have received a copy of the GNU General Public License 20 // along with Nestopia; if not, write to the Free Software 21 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 // 23 //////////////////////////////////////////////////////////////////////////////////////// 24 25 #ifndef NST_PATCHER_H 26 #define NST_PATCHER_H 27 28 #ifdef NST_PRAGMA_ONCE 29 #pragma once 30 #endif 31 32 #include <iosfwd> 33 34 namespace Nes 35 { 36 namespace Core 37 { 38 class Ips; 39 class Ups; 40 41 class Patcher 42 { 43 public: 44 45 explicit Patcher(bool=false); 46 ~Patcher(); 47 48 enum Type 49 { 50 IPS, 51 UPS 52 }; 53 54 struct Block 55 { 56 const byte* data; 57 dword size; 58 }; 59 60 Result Load(std::istream&); 61 Result Load(std::istream&,std::istream&); 62 Result Test(std::istream&) const; 63 Result Test(const byte*,dword) const; 64 Result Test(const Block*,uint) const; 65 Result Save(std::ostream&) const; 66 Result Create(Type,const byte*,const byte*,dword); 67 bool Patch(const byte*,byte*,dword,dword=0) const; 68 void Destroy(); 69 bool Empty() const; 70 71 private: 72 73 Ips* ips; 74 Ups* ups; 75 const bool bypassChecksum; 76 77 public: 78 79 template<dword N> Test(const Block (& blocks)[N])80 Result Test(const Block (&blocks)[N]) 81 { 82 NST_COMPILE_ASSERT( N > 0 ); 83 return Test( blocks, N ); 84 } 85 }; 86 } 87 } 88 89 #endif 90