// **************************************************************************
// **************************************************************************
// **************************************************************************
// **                                                                      **
// ** MEMPAK.H                                                      MODULE **
// **                                                                      **
// ** Functions for saving to cartridge/mempak.                            **
// **                                                                      **
// ** Last modified : 05 Feb 1997 by John Brandwood                        **
// **                                                                      **
// **************************************************************************
// **************************************************************************
// **************************************************************************

#ifndef __MEMPAK_h
#define __MEMPAK_h

#ifndef __LFPTYPES_h
 #include "lfptypes.h"
#endif


#include "flash.h"	// Flash Rom backup

//  other flash Rom equates

//  flash ROM has 8 sectors of 128 pages each (each page is 128 bytes) = 128K bytes of Flash ROM


#define MAX_WRITABLE_PAGE_NUM	0x3fd	// 3fe & 3ff reversed for Nintendo
#define FR_TOTAL_PAGES			1024
#define FR_PAGE_SIZE_BYTES		128
#define FR_PAGE_SIZE_SHIFT		  7		//  /128 == >>7
#define FR_PAGES_PER_SECTOR		128	// each sector is 16K bytes 

#define FR_TOTAL_SIZE		( FR_PAGE_SIZE_BYTES * FR_TOTAL_PAGES)	// 128K bytes
#define FR_SECTOR_SIZE		( FR_PAGE_SIZE_BYTES * FR_PAGES_PER_SECTOR)	// 16K bytes per sector
#define FR_PAGE_SIZE			FR_PAGE_SIZE_BYTES	


#define	MEMPAK_HEADER_LENGTH	32

// WARNING -  erasing done by sectors(not pages) only  (or total erase)
//  .. so be sure our 3 components are in different sectors!!!

#define	CUSTOM_USERS_FLASH_PAGE_NUM	(0 * FR_PAGES_PER_SECTOR) // ~ 7 pages (with 20 users)
#define	PREFERENCES_FLASH_PAGE_NUM	(1 * FR_PAGES_PER_SECTOR)	// 1 page (24 bytes)
#define GAME_DATA_FLASH_PAGE_NUM	(4 * FR_PAGES_PER_SECTOR)	// 227 pages ~ 32K bytes(2 sectors)
// following is written only once - used as flag to see if other data was corrupted
// ( if user pulled out gamepak during writting)
#define	FIRST_TIME_DATA_FLASH_PAGE_NUM	(2 * FR_PAGES_PER_SECTOR)	// 1 page (24 bytes)

//
// GLOBAL DATA STRUCTURES AND DEFINITIONS
//

//
// GLOBAL VARIABLES
//

extern	SB                  sb___gSaveDisabled;
extern	SB                  sb___gNeedToSave;
extern	SB                  sb___gWantToSave;
extern	SB                  sb___gMemPakState;

extern	SB                  sb___gRumbleInserted;

//
// GLOBAL DATA
//

//
// GLOBAL FUNCTION PROTOTYPES
//

extern	int                 ProcMemPakSave          (void);

int InitFlashRom(void);
int WriteFlashRom(int startpage, int numpages, char * databuffer);
int ReadFlashRom(int startpage, int numpages, char * databuffer);


extern int		FRPageNum;	
extern u32		status_buf[];


extern OSMesgQueue	n_dmaMessageQ;
extern OSMesg		dmaMessageBuf;
extern OSIoMesg    dmaIOMessageBuf;


//
// End Of __MEMPAK_h
//

#endif



// **************************************************************************
// **************************************************************************
// **************************************************************************
//	END OF MEMPAK.H
// **************************************************************************
// **************************************************************************
// **************************************************************************

