mirror of
https://github.com/emu-russia/pureikyubu.git
synced 2025-04-02 10:42:15 -04:00
148 lines
4.6 KiB
C
148 lines
4.6 KiB
C
#pragma once
|
|
|
|
/* Memcard ids by number of blocks */
|
|
#define MEMCARD_ID_64 (0x0004)
|
|
#define MEMCARD_ID_128 (0x0008)
|
|
#define MEMCARD_ID_256 (0x0010)
|
|
#define MEMCARD_ID_512 (0x0020)
|
|
#define MEMCARD_ID_1024 (0x0040)
|
|
#define MEMCARD_ID_2048 (0x0080)
|
|
|
|
/* Memcard ids by number of usable blocks */
|
|
#define MEMCARD_ID_59 MEMCARD_ID_64
|
|
#define MEMCARD_ID_123 MEMCARD_ID_128
|
|
#define MEMCARD_ID_251 MEMCARD_ID_256
|
|
#define MEMCARD_ID_507 MEMCARD_ID_512
|
|
#define MEMCARD_ID_1019 MEMCARD_ID_1024
|
|
#define MEMCARD_ID_2043 MEMCARD_ID_2048
|
|
|
|
#define MEMCARD_ERASEBYTE 0x00
|
|
//#define MEMCARD_ERASEBYTE 0xFF
|
|
|
|
#define MEMCARD_STATUS_BUSY 0x80 // PROGRAM or ERASE OPERATION
|
|
#define MEMCARD_STATUS_ARRAYTOBUFFER 0x40
|
|
#define MEMCARD_STATUS_SLEEP 0x20
|
|
#define MEMCARD_STATUS_ERASEERROR 0x10
|
|
#define MEMCARD_STATUS_PROGRAMEERROR 0x08
|
|
#define MEMCARD_STATUS_READY 0x01 // ?????
|
|
|
|
#define MEMCARD_SLOTA 0
|
|
#define MEMCARD_SLOTB 1
|
|
|
|
/* Execution flags for commands */
|
|
#define MCImmRead (1 << 0)
|
|
#define MCImmWrite (1 << 1)
|
|
#define MCDmaRead (1 << 2)
|
|
#define MCDmaWrite (1 << 3)
|
|
|
|
/* structure of a memcard buffer */
|
|
struct Memcard {
|
|
wchar_t filename[0x1000]; // filename where the memcard data is stores
|
|
FILE * file; // pointer to that file
|
|
uint32_t size; // size of the memcard in bytes
|
|
uint8_t * data; // pointer to the memcard raw data (stored in little endian order)
|
|
bool connected; // indicates if the memcard is actually 'connected', meaning all data in the structure is valid
|
|
uint16_t ID; // manufacturer and device code
|
|
uint8_t status; // current status
|
|
|
|
// Command Reader
|
|
uint8_t Command;
|
|
int databytes;
|
|
int dummybytes;
|
|
uint32_t executionFlags;
|
|
void (*procedure)(Memcard *);
|
|
int databytesread;
|
|
int dummybytesread;
|
|
uint32_t commandData;
|
|
bool ready;
|
|
EXIRegs * exi;
|
|
};
|
|
|
|
struct MCCommand {
|
|
int databytes;
|
|
int dummybytes;
|
|
uint32_t executionFlags;
|
|
void (*procedure)(Memcard *);
|
|
uint8_t Command;
|
|
};
|
|
|
|
#define Memcard_BlockSize 8192
|
|
#define Memcard_BlockSize_log2 13 // just to make shifts instead of mult. or div.
|
|
#define Memcard_SectorSize 512
|
|
#define Memcard_SectorSize_log2 9 // just to make shifts instead of mult. or div.
|
|
#define Memcard_PageSize 128
|
|
#define Memcard_PageSize_log2 7 // just to make shifts instead of mult. or div.
|
|
|
|
|
|
/* definition of valid sizes for a memcard in bytes */
|
|
#define Num_Memcard_ValidSizes 6
|
|
extern const uint32_t Memcard_ValidSizes[Num_Memcard_ValidSizes];
|
|
|
|
/* defines if the memcard should be tried to connect, (not if the memcard is actually connected!!) */
|
|
extern bool Memcard_Connected[2];
|
|
|
|
/*
|
|
* if SyncSave is TRUE, all write operations on the memcard will be instantaneusly saved to disk
|
|
* if not, the memcard will only be saved to disk when it is disconnected
|
|
*/
|
|
extern bool SyncSave;
|
|
|
|
/* Memcards vars */
|
|
extern Memcard memcard[2];
|
|
|
|
/* defines if the Memcard system has been opened */
|
|
extern bool MCOpened;
|
|
|
|
/***************************************************************/
|
|
|
|
void MCTransfer () ;
|
|
|
|
/*
|
|
* Checks if the memcard is connected.
|
|
*/
|
|
bool MCIsConnected(int cardnum);
|
|
|
|
/*
|
|
* Creates a new memcard file
|
|
* memcard_id should be one of the following:
|
|
* MEMCARD_ID_64 (0x0004)
|
|
* MEMCARD_ID_128 (0x0008)
|
|
* MEMCARD_ID_256 (0x0010)
|
|
* MEMCARD_ID_512 (0x0020)
|
|
* MEMCARD_ID_1024 (0x0040)
|
|
* MEMCARD_ID_2048 (0x0080)
|
|
*/
|
|
bool MCCreateMemcardFile(const wchar_t *path, uint16_t memcard_id);
|
|
|
|
/*
|
|
* Sets the memcard to use the specified file. If the memcard is connected,
|
|
* it will be first disconnected (to ensure that changes are saved)
|
|
* if param connect is TRUE, then the memcard will be connected to the new file
|
|
*/
|
|
void MCUseFile(int cardnum, const wchar_t *path, bool connect);
|
|
|
|
/*
|
|
* Starts the memcard system and loads the saved settings.
|
|
* If no settings are found, default memcards are created.
|
|
* Then both memcards are connected (based on settings)
|
|
*/
|
|
void MCOpen (HWConfig* config);
|
|
|
|
/*
|
|
* Disconnects both Memcard. Closes the memcard system and saves the current settings
|
|
*/
|
|
void MCClose ();
|
|
|
|
/*
|
|
* Connects the choosen memcard
|
|
*
|
|
* cardnum = -1 for both (based on the Memcard_Connected setting)
|
|
*/
|
|
bool MCConnect (int cardnum = -1);
|
|
|
|
/*
|
|
* Saves the data from the memcard to disk and disconnects the choosen memcard
|
|
*
|
|
* cardnum = -1 for both
|
|
*/
|
|
bool MCDisconnect (int cardnum = -1);
|