//////////////////////////////////////////////////////////////////////////
// Mapper005  Nintendo MMC5                                             //
//////////////////////////////////////////////////////////////////////////
class	Mapper005 : public Mapper
{
public:
	Mapper005( NES* parent ) : Mapper(parent) {}

	void	Reset();

	BYTE	ReadLow ( WORD addr );
	void	WriteLow( WORD addr, BYTE data );
	void	Write( WORD addr, BYTE data );

	void	HSync( INT scanline );

	void	PPU_ExtLatchX( INT x );
	void	PPU_ExtLatch( WORD addr, BYTE& chr_l, BYTE& chr_h, BYTE& attr );

	// For state save
	BOOL	IsStateSave() { return TRUE; }
	void	SaveState( LPBYTE p );
	void	LoadState( LPBYTE p );

protected:
	BYTE	sram_size;

	BYTE	prg_size;		// $5100
	BYTE	chr_size;		// $5101
	BYTE	sram_we_a, sram_we_b;	// $5102-$5103
	BYTE	graphic_mode;		// $5104
	BYTE	nametable_mode;		// $5105
	BYTE	nametable_type[4];	// $5105 use

	BYTE	sram_page;		// $5113

	BYTE	fill_chr, fill_pal;	// $5106-$5107
	BYTE	split_control;		// $5200
	BYTE	split_scroll;		// $5201
	BYTE	split_page;		// $5202

	BYTE	split_x;
	WORD	split_addr;
	WORD	split_yofs;

	BYTE	chr_type;
	BYTE	chr_mode;		// $5120-$512B use
	BYTE	chr_page[2][8];		// $5120-$512B
	LPBYTE	BG_MEM_BANK[8];		// BGパターン用バンク
	BYTE	BG_MEM_PAGE[8];

	BYTE	irq_status;		// $5204(R)
	BYTE	irq_enable;		// $5204(W)
	BYTE	irq_line;		// $5203
	BYTE	irq_scanline;
	BYTE	irq_clear;		// HSyncで使用
	BYTE	irq_type;

	BYTE	mult_a, mult_b;		// $5205-$5206

private:
	void	SetBank_CPU( WORD addr, BYTE data );
	void	SetBank_SRAM( BYTE page, BYTE data );
	void	SetBank_PPU();
};
