#ifndef __MEMORY_H__
#define __MEMORY_H__
#include "cartmem.hpp"
#include "eeprom.hpp"
#include <stdint.h>
#include <string>
#include <istream>
#include <ostream>
namespace AMeteor
{
class Memory
{
public :
static const uint32_t CART_SAVE_TIME = 16*1024*1024;
enum CartType
{
CTYPE_UNKNOWN,
CTYPE_EEPROM512,
CTYPE_EEPROM8192,
CTYPE_FLASH64,
CTYPE_FLASH128,
CTYPE_SRAM
};
enum CartError
{
CERR_NO_ERROR,
CERR_NOT_FOUND,
CERR_FAIL
};
Memory ();
~Memory ();
uint8_t GetCartType () const
{
return m_carttype;
}
void SetCartTypeFromSize (uint32_t size);
void SetCartType (uint8_t type);
void Reset (uint32_t params = ~0);
void ClearWbram ();
void ClearWcram ();
void ClearPalette ();
void ClearVram ();
void ClearOam ();
void SoftReset ();
bool LoadBios (const char* filename);
void LoadBios (const uint8_t* data, uint32_t size);
void UnloadBios ()
{
if (m_brom)
{
delete [] m_brom;
m_brom = NULL;
}
}
bool LoadRom (const char* filename);
void LoadRom (const uint8_t* data, uint32_t size);
bool LoadCart (const uint8_t* data, uint32_t size);
bool SaveCart (uint8_t** data, uint32_t* size);
void SaveCartDestroy(uint8_t* data);
#ifdef __LIBRETRO__
bool LoadCartInferred ();
#endif
bool HasCart () const
{
return m_cart;
}
void DeleteCart();
bool HasBios () const
{
return m_brom;
}
uint8_t GetCycles16NoSeq (uint32_t add, uint32_t count);
uint8_t GetCycles16Seq (uint32_t add, uint32_t count);
uint8_t GetCycles32NoSeq (uint32_t add, uint32_t count);
uint8_t GetCycles32Seq (uint32_t add, uint32_t count);
void UpdateWaitStates (uint16_t waitcnt);
uint8_t* GetRealAddress(uint32_t add, uint8_t size = 0);
bool SaveState (std::ostream& stream);
bool LoadState (std::istream& stream);
uint8_t Peek8 (uint32_t add);
uint8_t Read8 (uint32_t add);
uint16_t Read16 (uint32_t add);
uint32_t Read32 (uint32_t add);
void Write8 (uint32_t add, uint8_t val);
void Write16 (uint32_t add, uint16_t val);
void Write32 (uint32_t add, uint32_t val);
void WriteEepromDma (uint32_t src, uint16_t size);
void TimeEvent ();
uint8_t* GetMemoryArea(int which);
private :
uint8_t m_memtime[0xF];
uint8_t m_memtimeseq[0x3];
uint8_t* m_brom;
uint8_t* m_wbram;
uint8_t* m_wcram;
uint8_t* m_pram;
uint8_t* m_vram;
uint8_t* m_oram;
uint8_t* m_rom;
uint8_t m_carttype;
CartMem* m_cart;
uint8_t ReadCart (uint16_t add);
void WriteCart (uint16_t add, uint8_t val);
};
}
#endif