snes9x/memmap.h
2023-03-15 14:57:55 -05:00

225 lines
5.4 KiB
C++

/*****************************************************************************\
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
This file is licensed under the Snes9x License.
For further information, consult the LICENSE file in the root directory.
\*****************************************************************************/
#ifndef _MEMMAP_H_
#define _MEMMAP_H_
#define MEMMAP_BLOCK_SIZE (0x1000)
#define MEMMAP_NUM_BLOCKS (0x1000000 / MEMMAP_BLOCK_SIZE)
#define MEMMAP_SHIFT (12)
#define MEMMAP_MASK (MEMMAP_BLOCK_SIZE - 1)
#include <string>
struct CMemory
{
enum
{ MAX_ROM_SIZE = 0xC00000 };
enum file_formats
{ FILE_ZIP, FILE_JMA, FILE_DEFAULT };
enum
{ NOPE, YEAH, BIGFIRST, SMALLFIRST };
enum
{ MAP_TYPE_I_O, MAP_TYPE_ROM, MAP_TYPE_RAM };
enum
{
MAP_CPU,
MAP_PPU,
MAP_LOROM_SRAM,
MAP_LOROM_SRAM_B,
MAP_HIROM_SRAM,
MAP_DSP,
MAP_SA1RAM,
MAP_BWRAM,
MAP_BWRAM_BITMAP,
MAP_BWRAM_BITMAP2,
MAP_SPC7110_ROM,
MAP_SPC7110_DRAM,
MAP_RONLY_SRAM,
MAP_C4,
MAP_OBC_RAM,
MAP_SETA_DSP,
MAP_SETA_RISC,
MAP_BSX,
MAP_NONE,
MAP_LAST
};
uint8 NSRTHeader[32];
int32 HeaderCount;
uint8 RAM[0x20000];
uint8 ROMStorage[MAX_ROM_SIZE + 0x200 + 0x8000];
uint8 *ROM;
uint8 SRAM[0x80000];
uint8 VRAM[0x10000];
uint8 *FillRAM;
uint8 *BWRAM;
uint8 *C4RAM;
uint8 *OBC1RAM;
uint8 *BSRAM;
uint8 *BIOSROM;
uint8 *Map[MEMMAP_NUM_BLOCKS];
uint8 *WriteMap[MEMMAP_NUM_BLOCKS];
uint8 BlockIsRAM[MEMMAP_NUM_BLOCKS];
uint8 BlockIsROM[MEMMAP_NUM_BLOCKS];
uint8 ExtendedFormat;
std::string ROMFilename;
char ROMName[ROM_NAME_LEN];
char ROMId[5];
int32 CompanyId;
uint8 ROMRegion;
uint8 ROMSpeed;
uint8 ROMType;
uint8 ROMSize;
uint32 ROMChecksum;
uint32 ROMComplementChecksum;
uint32 ROMCRC32;
unsigned char ROMSHA256[32];
int32 ROMFramesPerSecond;
bool8 HiROM;
bool8 LoROM;
uint8 SRAMSize;
uint32 SRAMMask;
uint32 CalculatedSize;
uint32 CalculatedChecksum;
// ports can assign this to perform some custom action upon loading a ROM (such as adjusting controls)
void (*PostRomInitFunc) (void);
bool8 Init (void);
void Deinit (void);
int ScoreHiROM (bool8, int32 romoff = 0);
int ScoreLoROM (bool8, int32 romoff = 0);
int First512BytesCountZeroes() const;
uint32 HeaderRemove (uint32, uint8 *);
uint32 FileLoader (uint8 *, const char *, uint32);
uint32 MemLoader (uint8 *, const char*, uint32);
bool8 LoadROMMem (const uint8 *, uint32);
bool8 LoadROM (const char *);
bool8 LoadROMInt (int32);
bool8 LoadMultiCartMem (const uint8 *, uint32, const uint8 *, uint32, const uint8 *, uint32);
bool8 LoadMultiCart (const char *, const char *);
bool8 LoadMultiCartInt ();
bool8 LoadSufamiTurbo ();
bool8 LoadBSCart ();
bool8 LoadGNEXT ();
bool8 LoadSRAM (const char *);
bool8 SaveSRAM (const char *);
void ClearSRAM (bool8 onlyNonSavedSRAM = 0);
bool8 LoadSRTC (void);
bool8 SaveSRTC (void);
bool8 SaveMPAK (const char *);
void ParseSNESHeader (uint8 *);
void InitROM (void);
uint32 map_mirror (uint32, uint32);
void map_lorom (uint32, uint32, uint32, uint32, uint32);
void map_hirom (uint32, uint32, uint32, uint32, uint32);
void map_lorom_offset (uint32, uint32, uint32, uint32, uint32, uint32);
void map_hirom_offset (uint32, uint32, uint32, uint32, uint32, uint32);
void map_space (uint32, uint32, uint32, uint32, uint8 *);
void map_index (uint32, uint32, uint32, uint32, int, int);
void map_System (void);
void map_WRAM (void);
void map_LoROMSRAM (void);
void map_HiROMSRAM (void);
void map_DSP (void);
void map_C4 (void);
void map_OBC1 (void);
void map_SetaRISC (void);
void map_SetaDSP (void);
void map_WriteProtectROM (void);
void Map_Initialize (void);
void Map_LoROMMap (void);
void Map_NoMAD1LoROMMap (void);
void Map_JumboLoROMMap (void);
void Map_ROM24MBSLoROMMap (void);
void Map_SRAM512KLoROMMap (void);
void Map_SufamiTurboLoROMMap (void);
void Map_SufamiTurboPseudoLoROMMap (void);
void Map_SuperFXLoROMMap (void);
void Map_SetaDSPLoROMMap (void);
void Map_SDD1LoROMMap (void);
void Map_SA1LoROMMap (void);
void Map_BSSA1LoROMMap (void);
void Map_HiROMMap (void);
void Map_ExtendedHiROMMap (void);
void Map_SPC7110HiROMMap (void);
void Map_BSCartLoROMMap(uint8);
void Map_BSCartHiROMMap(void);
uint16 checksum_calc_sum (uint8 *, uint32);
uint16 checksum_mirror_sum (uint8 *, uint32 &, uint32 mask = 0x800000);
void Checksum_Calculate (void);
bool8 match_na (const char *);
bool8 match_nn (const char *);
bool8 match_nc (const char *);
bool8 match_id (const char *);
void ApplyROMFixes (void);
std::string SafeString(std::string s, bool allow_jis = false);
void CheckForAnyPatch (const char *, bool8, int32 &);
void MakeRomInfoText (char *);
const char * MapType (void);
const char * StaticRAMSize (void);
const char * Size (void);
const char * Revision (void);
const char * KartContents (void);
const char * Country (void);
const char * PublishingCompany (void);
};
struct SMulti
{
int cartType;
int32 cartSizeA, cartSizeB;
int32 sramSizeA, sramSizeB;
uint32 sramMaskA, sramMaskB;
uint32 cartOffsetA, cartOffsetB;
uint8 *sramA, *sramB;
char fileNameA[PATH_MAX + 1], fileNameB[PATH_MAX + 1];
};
extern CMemory Memory;
extern SMulti Multi;
inline bool S9xInterlaceField()
{
return (Memory.FillRAM[0x213F] & 0x80) >> 7;
}
void S9xAutoSaveSRAM (void);
bool8 LoadZip(const char *, uint32 *, uint8 *);
enum s9xwrap_t
{
WRAP_NONE,
WRAP_BANK,
WRAP_PAGE
};
enum s9xwriteorder_t
{
WRITE_01,
WRITE_10
};
#include "getset.h"
#endif