#pragma once

#include "Card.h"
#include "CmdLine.h"

class SNESMAXCard : public Card
{
public:
	SNESMAXCard(UINT slot) :
		Card(CT_SNESMAX, slot)
	{
		m_buttonIndex = 0;
		m_controller1Buttons = 0;
		m_controller2Buttons = 0;

		m_altControllerType[0] = g_cmdLine.snesMaxAltControllerType[0];
		m_altControllerType[1] = g_cmdLine.snesMaxAltControllerType[1];
	}
	virtual ~SNESMAXCard(void) {}

	virtual void Destroy(void) {}
	virtual void Reset(const bool powerCycle) {}
	virtual void Update(const ULONG nExecutedCycles) {}

	virtual void InitializeIO(LPBYTE pCxRomPeripheral);

	static BYTE __stdcall IORead(WORD pc, WORD addr, BYTE bWrite, BYTE value, ULONG nExecutedCycles);
	static BYTE __stdcall IOWrite(WORD pc, WORD addr, BYTE bWrite, BYTE value, ULONG nExecutedCycles);

	static const std::string& GetSnapshotCardName(void);
	virtual void SaveSnapshot(YamlSaveHelper& yamlSaveHelper);
	virtual bool LoadSnapshot(YamlLoadHelper& yamlLoadHelper, UINT version);

	static bool ParseControllerMappingFile(UINT joyNum, const char* pathname, std::string& errorMsg);

private:
	UINT GetControllerButtons(UINT joyNum, JOYINFOEX& infoEx, bool altControllerType);

	enum Button { B, Y, SELECT, START, U, D, L, R, A, X, LB, RB, UNUSED1, UNUSED2, UNUSED3, UNUSED4, NUM_BUTTONS, UNUSED };

	UINT m_buttonIndex;
	UINT m_controller1Buttons;
	UINT m_controller2Buttons;

	static const UINT m_mainControllerButtons[NUM_BUTTONS];
	bool m_altControllerType[2];
	static UINT m_altControllerButtons[2][NUM_BUTTONS];
};
