/*----------------------------------------------------------------------*/
/*                                                                      */
/*      NES Mapper                                                      */
/*                                                           Norix      */
/*                                               written     2001/02/05 */
/*                                               last modify ----/--/-- */
/*----------------------------------------------------------------------*/
#ifndef	__MAPPER_INCLUDED__
#define	__MAPPER_INCLUDED__

#define	WIN32_LEAN_AND_MEAN
#include <windows.h>

#include "DirectSound.h"

#include "typedef.h"
#include "macro.h"

// class prototype
class	NES;

// Mapper base class
class	Mapper
{
public:
	Mapper( NES* parent );
	virtual	~Mapper();

	// For Mapper
	// Reset
	virtual	void	Reset() = 0;

	// $8000-$FFFF Memory write
	virtual	void	Write( WORD addr, BYTE data ) {}

	// $8000-$FFFF Memory read
	virtual	BYTE	Read( WORD addr) {return CPU_MEM_BANK[addr>>13][addr&0x1FFF];}

	virtual	BOOL	ReadHigh( WORD addr, LPBYTE pdata ) { return FALSE; }

	// $4100-$7FFF Lower Memory read/write
	virtual	BYTE	ReadLow ( WORD addr );
	virtual	void	WriteLow( WORD addr, BYTE data );

	// $4018-$40FF Extention register read/write
	virtual	BYTE	ExRead ( WORD addr )	{ return 0x00; }
	virtual	void	ExWrite( WORD addr, BYTE data ) {}

	// Extension commands
	// For ExCmdRead command
	enum	EXCMDRD {
		EXCMDRD_NONE = 0,
		EXCMDRD_DISKACCESS,
	};
	// For ExCmdWrite command
	enum	EXCMDWR {
		EXCMDWR_NONE = 0,
		EXCMDWR_DISKINSERT,
		EXCMDWR_DISKEJECT,
	};

	virtual	void	WriteExPPU( WORD addr, BYTE data ) {}

	virtual	BYTE	ReadExAPU ( WORD addr )	{ return 0x00; }
	virtual	void	WriteExAPU( WORD addr, BYTE data ) {}

	virtual	BYTE	ExCmdRead ( EXCMDRD cmd )	{ return 0x00; }
	virtual	void	ExCmdWrite( EXCMDWR cmd, BYTE data ) {}

	// H sync/V sync/Clock sync
	virtual	void	HSync( INT scanline ) {}
	virtual	void	VSync() {}
	virtual	void	Clock( INT cycles ) {}

	// PPU address bus latch
	virtual	void	PPU_Latch( WORD addr ) {}

	// PPU Character latch
	virtual	void	PPU_ChrLatch( WORD addr ) {}

	// PPU Extension character/palette
	virtual	void	PPU_ExtLatchX( INT x ) {}
	virtual	void	PPU_ExtLatch( WORD addr, BYTE& chr_l, BYTE& chr_h, BYTE& attr ) {}

	//YuXing
	virtual	BYTE	PPU_ExtLatchSP() { return 0; }

	// For State save
	virtual	BOOL	IsStateSave() { return FALSE; }
	virtual	void	SaveState( LPBYTE p ) {}
	virtual	void	LoadState( LPBYTE p ) {}

protected:
	NES*	nes;

private:
};

// Create class instance
extern	Mapper*	CreateMapper( NES* parent, INT no,BOOL bUnif);

#endif

#ifndef _UNIF_H_
#define _UNIF_H_

struct BDINFO {
char boardName[30];
int  boardID;
} ;

typedef struct BDINFO BOARDINFO;

extern const BOARDINFO BoardInfo[];


enum BoardID
{
	// NROM
	STD_NROM =256              ,
	// AxROM
	STD_AMROM                  ,
	STD_ANROM                  ,
	STD_AN1ROM                 ,
	STD_AOROM                  ,
	// BxROM
	STD_BNROM                  ,
	// CxROM
	STD_CNROM                  ,
	STD_CXROM                  ,
	STD_CPROM                  ,
	// DxROM
	STD_DEROM                  ,
	STD_DE1ROM                 ,
	STD_DRROM                  ,
	// ExROM
	STD_ELROM                  ,
	STD_EKROM                  ,
	STD_ETROM                  ,
	STD_EWROM                  ,
	STD_EXROM_0                ,
	STD_EXROM_1                ,
	STD_EXROM_2                ,
	STD_EXROM_3                ,
	STD_EXROM_4                ,
	STD_EXROM_5                ,
	// FxROM
	STD_FJROM                  ,
	STD_FKROM                  ,
	// GxROM
	STD_GNROM                  ,
	// MxROM
	STD_MHROM                  ,
	// HxROM
	STD_HKROM                  ,
	// JxROM
	STD_JLROM                  ,
	STD_JSROM                  ,
	// NxROM
	STD_NTBROM                 ,
	// PxROM
	STD_PNROM                  ,
	STD_PNROM_PC10             ,
	STD_PEEOROM                ,
	// SxROM
	STD_SAROM                  ,
	STD_SBROM                  ,
	STD_SCROM                  ,
	STD_SEROM                  ,
	STD_SFROM                  ,
	STD_SGROM                  ,
	STD_SHROM                  ,
	STD_SJROM                  ,
	STD_SKROM                  ,
	STD_SLROM                  ,
	STD_SNROM                  ,
	STD_SOROM                  ,
	STD_SUROM                  ,
	STD_SXROM                  ,
	// TxROM
	STD_TEROM                  ,
	STD_TBROM                  ,
	STD_TFROM                  ,
	STD_TGROM                  ,
	STD_TKROM                  ,
	STD_TKSROM                 ,
	STD_TLROM                  ,
	STD_TLSROM                 ,
	STD_TNROM                  ,
	STD_TQROM                  ,
	STD_TR1ROM                 ,
	STD_TSROM                  ,
	STD_TVROM                  ,
	// UxROM
	STD_UNROM                  ,
	STD_UN1ROM                 ,
	STD_UOROM                  ,
	STD_UXROM                  ,
	// Discrete Logic
	DISCRETE_74_377            ,
	DISCRETE_74_139_74         ,
	DISCRETE_74_161_138        ,
	DISCRETE_74_161_161_32_A   ,
	DISCRETE_74_161_161_32_B   ,
	// Other
	CUSTOM_B4                  ,
	CUSTOM_BTR                 ,
	CUSTOM_EVENT               ,
	CUSTOM_FFE3                ,
	CUSTOM_FFE4                ,
	CUSTOM_FFE8                ,
	CUSTOM_FB02                ,
	CUSTOM_FB04                ,
	CUSTOM_RUMBLESTATION       ,
	CUSTOM_QJ                  ,
	CUSTOM_VSSYSTEM_0          ,
	CUSTOM_VSSYSTEM_1          ,
	CUSTOM_WH                  ,
	CUSTOM_X79B                ,
	CUSTOM_ZZ                  ,
	// Active Enterprises
	AE_STD                     ,
	// AGCI
	AGCI_50282                 ,
	// AVE
	AVE_NINA001                ,
	AVE_NINA002                ,
	AVE_NINA03                 ,
	AVE_NINA06                 ,
	AVE_NINA07                 ,
	AVE_MB_91                  ,
	AVE_D1012                  ,
	// Bandai
	BANDAI_FCG1                ,
	BANDAI_FCG2                ,
	BANDAI_BAJUMP2             ,
	BANDAI_LZ93D50_24C01       ,
	BANDAI_LZ93D50_24C02       ,
	BANDAI_DATACH              ,
	BANDAI_KARAOKESTUDIO       ,
	BANDAI_AEROBICSSTUDIO      ,
	BANDAI_OEKAKIDS            ,
	// Bensheng
	BENSHENG_BS5               ,
	// Bootleg multicarts
	BMC_110IN1                 ,
	BMC_150IN1                 ,
	BMC_15IN1                  ,
	BMC_1200IN1                ,
	BMC_20IN1                  ,
	BMC_21IN1                  ,
	BMC_22GAMES                ,
	BMC_31IN1                  ,
	BMC_35IN1                  ,
	BMC_36IN1                  ,
	BMC_64IN1                  ,
	BMC_72IN1                  ,
	BMC_76IN1                  ,
	BMC_8157                   ,
	BMC_9999999IN1             ,
	BMC_A65AS                  ,
	BMC_BALLGAMES_11IN1        ,
	BMC_CTC65                  ,
	BMC_DRAGONBOLLPARTY        ,
	BMC_FAMILY_4646B           ,
	BMC_FK23C                 ,
	BMC_GAME_800IN1            ,
	BMC_GOLDEN_190IN1          ,
	BMC_GOLDENGAME_150IN1      ,
	BMC_GOLDENGAME_260IN1      ,
	BMC_GKA                    ,
	BMC_GKB                    ,
	BMC_GOLDENCARD_6IN1        ,
	BMC_HERO                   ,
	BMC_MARIOPARTY_7IN1        ,
	BMC_NOVELDIAMOND           ,
	BMC_CH001                  ,
	BMC_POWERJOY_84IN1         ,
	BMC_RESETBASED_4IN1        ,
	BMC_SUPER_24IN1            ,
	BMC_SUPER_22GAMES          ,
	BMC_SUPER_40IN1            ,
	BMC_SUPER_42IN1            ,
	BMC_SUPER_700IN1           ,
	BMC_SUPERBIG_7IN1          ,
	BMC_SUPERGUN_20IN1         ,
	BMC_SUPERHIK_4IN1          ,
	BMC_SUPERHIK_300IN1        ,
	BMC_SUPERVISION_16IN1      ,
	BMC_T262                   ,
	BMC_VRC4                   ,
	BMC_VT5201                 ,
	BMC_Y2K_64IN1              ,
	// Bootlegs
	BTL_2708                   ,
	BTL_6035052                ,
	BTL_AISENSHINICOL          ,
	BTL_AX5705                 ,
	BTL_DRAGONNINJA            ,
	BTL_GENIUSMERIOBROS        ,
	BTL_MARIOBABY              ,
	BTL_PIKACHUY2K             ,
	BTL_SHUIGUANPIPE           ,
	BTL_SMB2_A                 ,
	BTL_SMB2_B                 ,
	BTL_SMB2_C                 ,
	BTL_SMB3                   ,
	BTL_SUPERBROS11            ,
	BTL_T230                   ,
	BTL_TOBIDASEDAISAKUSEN     ,
	// Camerica
	CAMERICA_BF9093            ,
	CAMERICA_BF9096            ,
	CAMERICA_BF9097            ,
	CAMERICA_BF909X            ,
	CAMERICA_ALGNV11           ,
	CAMERICA_ALGQV11           ,
	CAMERICA_GOLDENFIVE        ,
	// Caltron
	CALTRON_6IN1               ,
	// C&E
	CNE_SHLZ                   ,
	CNE_DECATHLON              ,
	CNE_PSB                    ,
	// Cony
	CONY_STD                   ,
	// Dreamtech
	DREAMTECH_01               ,
	// Fujiya
	FUJIYA_STD                 ,
	// Fukutake
	FUKUTAKE_SBX               ,
	// Future Media
	FUTUREMEDIA_STD            ,
	// Gouder
	GOUDER_37017               ,
	// Henggedianzi
	HENGEDIANZI_STD            ,
	HENGEDIANZI_XJZB           ,
	// HES
	HES_STD                    ,
	// Hosenkan
	HOSENKAN_STD               ,
	// Irem
	IREM_G101A_0               ,
	IREM_G101A_1               ,
	IREM_G101B_0               ,
	IREM_G101B_1               ,
	IREM_H3001                 ,
	IREM_LROG017               ,
	IREM_HOLYDIVER             ,
	IREM_KAIKETSU              ,
	// Jaleco
	JALECO_JF01                ,
	JALECO_JF02                ,
	JALECO_JF03                ,
	JALECO_JF04                ,
	JALECO_JF05                ,
	JALECO_JF06                ,
	JALECO_JF07                ,
	JALECO_JF08                ,
	JALECO_JF09                ,
	JALECO_JF10                ,
	JALECO_JF11                ,
	JALECO_JF12                ,
	JALECO_JF13                ,
	JALECO_JF14                ,
	JALECO_JF15                ,
	JALECO_JF16                ,
	JALECO_JF17                ,
	JALECO_JF18                ,
	JALECO_JF19                ,
	JALECO_JF20                ,
	JALECO_JF21                ,
	JALECO_JF22                ,
	JALECO_JF23                ,
	JALECO_JF24                ,
	JALECO_JF25                ,
	JALECO_JF26                ,
	JALECO_JF27                ,
	JALECO_JF28                ,
	JALECO_JF29                ,
	JALECO_JF30                ,
	JALECO_JF31                ,
	JALECO_JF32                ,
	JALECO_JF33                ,
	JALECO_JF34                ,
	JALECO_JF35                ,
	JALECO_JF36                ,
	JALECO_JF37                ,
	JALECO_JF38                ,
	JALECO_JF39                ,
	JALECO_JF40                ,
	JALECO_JF41                ,
	JALECO_SS88006             ,
	// J.Y.Company
	JYCOMPANY_TYPE_A           ,
	JYCOMPANY_TYPE_B           ,
	JYCOMPANY_TYPE_C           ,
	// Kaiser
	KAISER_KS202               ,
	KAISER_KS7022              ,
	KAISER_KS7032              ,
	KAISER_KS7058              ,
	// Kasing
	KASING_STD                 ,
	// K
	KAY_H2288                  ,
	KAY_PANDAPRINCE            ,
	// Konami
	KONAMI_VRC1                ,
	KONAMI_VRC2                ,
	KONAMI_VRC3                ,
	KONAMI_VRC4_0              ,
	KONAMI_VRC4_1              ,
	KONAMI_VRC4_2              ,
	KONAMI_VRC6_0              ,
	KONAMI_VRC6_1              ,
	KONAMI_VRC7_0              ,
	KONAMI_VRC7_1              ,
	KONAMI_VSSYSTEM            ,
	// Magic Series
	MAGICSERIES_MAGICDRAGON    ,
	// Namcot
	NAMCOT_3433                ,
	NAMCOT_3443                ,
	NAMCOT_3446                ,
	NAMCOT_3425                ,
	NAMCOT_34XX                ,
	NAMCOT_163_0               ,
	NAMCOT_163_1               ,
	NAMCOT_163_S_0             ,
	NAMCOT_163_S_1             ,
	// Nitra
	NITRA_TDA                  ,
	// NTDEC
	NTDEC_N715062              ,
	NTDEC_ASDER_0              ,
	NTDEC_ASDER_1              ,
	NTDEC_FIGHTINGHERO         ,
	// Nanjing
	NANJING_STD                ,
	// Nihon Bussan
	NIHON_UNROM_M5             ,
	// Open Corp
	OPENCORP_DAOU306           ,
	// RCM
	RCM_GS2004                 ,
	RCM_GS2013                 ,
	RCM_GS2015                 ,
	RCM_TETRISFAMILY           ,
	// Rex Soft
	REXSOFT_DBZ5               ,
	REXSOFT_SL1632             ,
	// Sachen
	SACHEN_8259A               ,
	SACHEN_8259B               ,
	SACHEN_8259C               ,
	SACHEN_8259D               ,
	SACHEN_TCA01               ,
	SACHEN_TCU01               ,
	SACHEN_TCU02               ,
	SACHEN_SA0036              ,
	SACHEN_SA0037              ,
	SACHEN_SA0161M             ,
	SACHEN_SA72007             ,
	SACHEN_SA72008             ,
	SACHEN_74_374A             ,
	SACHEN_74_374B             ,
	SACHEN_STREETHEROES        ,
	// Someri Team
	SOMERITEAM_SL12            ,
	// Subor
	SUBOR_TYPE0                ,
	SUBOR_TYPE1                ,
	SUBOR_STUDYNGAME           ,
	// Sunsoft
	SUNSOFT_1                  ,
	SUNSOFT_2A                 ,
	SUNSOFT_2B                 ,
	SUNSOFT_3                  ,
	SUNSOFT_4_0                ,
	SUNSOFT_4_1                ,
	SUNSOFT_5B_0               ,
	SUNSOFT_5B_1               ,
	SUNSOFT_DCS                ,
	SUNSOFT_FME7_0             ,
	SUNSOFT_FME7_1             ,
	// Super Game
	SUPERGAME_LIONKING         ,
	SUPERGAME_BOOGERMAN        ,
	SUPERGAME_MK3E             ,
	SUPERGAME_POCAHONTAS2      ,
	// Taito
	TAITO_TC0190FMC            ,
	TAITO_TC0190FMC_PAL16R4    ,
	TAITO_X1005                ,
	TAITO_X1017                ,
	// Tengen
	TENGEN_800002              ,
	TENGEN_800004              ,
	TENGEN_800008              ,
	TENGEN_800030              ,
	TENGEN_800032              ,
	TENGEN_800037              ,
	TENGEN_800042              ,
	// TXC
	TXC_22211A                 ,
	TXC_22211B                 ,
	TXC_22211C                 ,
	TXC_MXMDHTWO               ,
	TXC_POLICEMAN              ,
	TXC_TW                     ,
	// Unlicensed
	UNL_A9746                  ,
	UNL_CC21                   ,
	UNL_EDU2000                ,
	UNL_KINGOFFIGHTERS96       ,
	UNL_KINGOFFIGHTERS97       ,
	UNL_MORTALKOMBAT2          ,
	UNL_N625092                ,
	UNL_SUPERFIGHTER3          ,
	UNL_TF1201                 ,
	UNL_WORLDHERO              ,
	UNL_AXROM                  ,
	UNL_BXROM                  ,
	UNL_CXROM                  ,
	UNL_GXROM                  ,
	UNL_NROM                   ,
	UNL_UXROM                  ,
	UNL_TRXROM                 ,
	UNL_XZY                    ,
	// Waixing
	WAIXING_PS2_0              ,
	WAIXING_PS2_1              ,
	WAIXING_TYPE_A             ,
	WAIXING_TYPE_B             ,
	WAIXING_TYPE_C             ,
	WAIXING_TYPE_D             ,
	WAIXING_TYPE_E             ,
	WAIXING_TYPE_F             ,
	WAIXING_TYPE_G             ,
	WAIXING_TYPE_H             ,
	WAIXING_TYPE_I             ,
	WAIXING_TYPE_J             ,
	WAIXING_FFV_0              ,
	WAIXING_FFV_1              ,
	WAIXING_SH2_0              ,
	WAIXING_SH2_1              ,
	WAIXING_SGZLZ              ,
	WAIXING_ZS                 ,
	WAIXING_DQVII              ,
	WAIXING_SGZ                ,
	WAIXING_SECURITY_0         ,
	WAIXING_SECURITY_1         ,
	// Whirlwind
	WHIRLWIND_2706             ,
	// Unknown
	NROM_256_CN		   ,
	// ÐÂ¼Ó
	SUBOR_999,
	SMART_GENIUS,
	FK23CA,
	BMC_FK23CA,
	FK23C,
	CHINA_ER_SAN2,
	UNL_SA_9602B,
	City_Fighter_IV,
	COOLBOY,
	Dragon_Fighter,
	UNL_YOKO,
	OneBus,
	UNL_82112C,
	MGC_002,
	FF3_CN,
	UNL_KS7010,
	UNL_158B,
	UNL_KS7030,
	UNL_TH2131_1,
	UNL_831128C,
	BMC_LB12IN1,
	BOARD_MAX
};

  
int NES_ROM_get_unifBoardID(char *unif_board);

#endif
