#ifndef NES_CART_H
#define NES_CART_H
#include "blargg_common.h"
#include "abstract_file.h"
class Nes_Cart {
typedef BOOST::uint8_t byte;
public:
Nes_Cart();
~Nes_Cart();
blargg_err_t load_ines( Auto_File_Reader );
static const char not_ines_file [];
blargg_err_t load_patched_ines( Auto_File_Reader, Auto_File_Reader ips_patch );
blargg_err_t apply_ips_to_prg( Auto_File_Reader ips_patch );
blargg_err_t apply_ips_to_chr( Auto_File_Reader ips_patch );
bool loaded() const { return prg_ != NULL; }
void clear();
bool has_battery_ram() const;
long prg_size() const { return prg_size_; }
long chr_size() const { return chr_size_; }
blargg_err_t resize_prg( long );
blargg_err_t resize_chr( long );
void set_mapper( int mapper_lsb, int mapper_msb );
unsigned mapper_data() const { return mapper; }
int mirroring() const { return mapper & 0x09; }
int mapper_code() const;
byte * prg() { return prg_; }
byte const* prg() const { return prg_; }
byte * chr() { return chr_; }
byte const* chr() const { return chr_; }
private:
enum { bank_size = 8 * 1024L };
byte* prg_;
byte* chr_;
long prg_size_;
long chr_size_;
unsigned mapper;
long round_to_bank_size( long n );
};
inline bool Nes_Cart::has_battery_ram() const { return mapper & 0x02; }
inline void Nes_Cart::set_mapper( int mapper_lsb, int mapper_msb )
{
mapper = mapper_msb * 0x100 + mapper_lsb;
}
inline int Nes_Cart::mapper_code() const { return ((mapper >> 8) & 0xf0) | ((mapper >> 4) & 0x0f); }
#endif