/********************************************************************************** Common Controller plugin spec, version #1.1 maintained by zilmar (zilmar@emulation64.com) All questions or suggestions should go through the emutalk plugin forum. http://www.emutalk.net/cgi-bin/ikonboard/ikonboard.cgi?s=3bd272222f66ffff;act=SF;f=20 **********************************************************************************/ #ifndef _CONTR_H_INCLUDED__ #define _CONTR_H_INCLUDED__ #if defined(__cplusplus) extern "C" { #endif /* Note: BOOL, BYTE, WORD, DWORD, TRUE, FALSE are defined in windows.h */ #define PLUGIN_TYPE_CONTROLLER 4 #ifndef SPECS_VERSION #define SPECS_VERSION 0x0101 #endif /*** Conteroller plugin's ****/ #define PLUGIN_NONE 1 #define PLUGIN_MEMPAK 2 // not implemeted for non raw data #define PLUGIN_RUMBLE_PAK 3 // not implemeted for non raw data #define PLUGIN_TRANSFER_PAK 4 // the controller plugin is passed in raw data #define PLUGIN_RAW 5 /********************************************************************************* Note about Conteroller plugin's: the rumble pak needs a function for the force feed back joystick and tranfer pak probaly needs a function for the plugin to be able to select the GB rom and eeprom... maybe this should be done by the emu instead of the plugin, but I think it probaly should be done by the plugin. I will see about adding these functions in the next spec **********************************************************************************/ #define EXPORT __declspec(dllexport) #define CALL _cdecl /***** Structures *****/ typedef struct { WORD Version; /* Should be set to 0x0101 */ WORD Type; /* Set to PLUGIN_TYPE_CONTROLLER */ char Name[100]; /* Name of the DLL */ BOOL Reserved1; BOOL Reserved2; } PLUGIN_INFO; typedef struct { BOOL Present; BOOL RawData; int Plugin; } CONTROL; typedef union { DWORD Value; struct { unsigned R_DPAD : 1; unsigned L_DPAD : 1; unsigned D_DPAD : 1; unsigned U_DPAD : 1; unsigned START_BUTTON : 1; unsigned Z_TRIG : 1; unsigned B_BUTTON : 1; unsigned A_BUTTON : 1; unsigned R_CBUTTON : 1; unsigned L_CBUTTON : 1; unsigned D_CBUTTON : 1; unsigned U_CBUTTON : 1; unsigned R_TRIG : 1; unsigned L_TRIG : 1; unsigned Reserved1 : 1; unsigned Reserved2 : 1; signed Y_AXIS : 8; signed X_AXIS : 8; }; } BUTTONS; typedef struct { HWND hMainWindow; HINSTANCE hinst; BOOL MemoryBswaped; // If this is set to TRUE, then the memory has been pre // bswap on a dword (32 bits) boundry, only effects header. // eg. the first 8 bytes are stored like this: // 4 3 2 1 8 7 6 5 BYTE * HEADER; // This is the rom header (first 40h bytes of the rom) CONTROL *Controls; // A pointer to an array of 4 controllers .. eg: // CONTROL Controls[4]; } CONTROL_INFO; /****************************************************************** Function: CloseDLL Purpose: This function is called when the emulator is closing down allowing the dll to de-initialise. input: none output: none *******************************************************************/ EXPORT void CALL CloseDLL(void); /****************************************************************** Function: ControllerCommand Purpose: To process the raw data that has just been sent to a specific controller. input: - Controller Number (0 to 3) and -1 signalling end of processing the pif ram. - Pointer of data to be processed. output: none note: This function is only needed if the DLL is allowing raw data, or the plugin is set to raw the data that is being processed looks like this: initilize controller: 01 03 00 FF FF FF read controller: 01 04 01 FF FF FF FF *******************************************************************/ EXPORT void CALL ControllerCommand(int Control, BYTE * Command); /****************************************************************** Function: DllAbout Purpose: This function is optional function that is provided to give further information about the DLL. input: a handle to the window that calls this function output: none *******************************************************************/ EXPORT void CALL DllAbout(HWND hParent); /****************************************************************** Function: DllConfig Purpose: This function is optional function that is provided to allow the user to configure the dll input: a handle to the window that calls this function output: none *******************************************************************/ EXPORT void CALL DllConfig(HWND hParent); /****************************************************************** Function: DllTest Purpose: This function is optional function that is provided to allow the user to test the dll input: a handle to the window that calls this function output: none *******************************************************************/ EXPORT void CALL DllTest(HWND hParent); /****************************************************************** Function: GetDllInfo Purpose: This function allows the emulator to gather information about the dll by filling in the PluginInfo structure. input: a pointer to a PLUGIN_INFO stucture that needs to be filled by the function. (see def above) output: none *******************************************************************/ EXPORT void CALL GetDllInfo(PLUGIN_INFO * PluginInfo); /****************************************************************** Function: GetKeys Purpose: To get the current state of the controllers buttons. input: - Controller Number (0 to 3) - A pointer to a BUTTONS structure to be filled with the controller state. output: none *******************************************************************/ EXPORT void CALL GetKeys(int Control, BUTTONS * Keys); /****************************************************************** Function: InitiateControllers Purpose: This function initialises how each of the controllers should be handled. input: - The handle to the main window. - A controller structure that needs to be filled for the emulator to know how to handle each controller. output: none *******************************************************************/ #if (SPECS_VERSION < 0x0101) EXPORT void CALL InitiateControllers(void * hMainWindow, CONTROL Controls[4]); #elif (SPECS_VERSION == 0x0101) EXPORT void CALL InitiateControllers(CONTROL_INFO ControlInfo); /* Typo in the official specs, but it works! */ #else EXPORT void CALL InitiateControllers(CONTROL_INFO * ControlInfo); #endif /****************************************************************** Function: ReadController Purpose: To process the raw data in the pif ram that is about to be read. input: - Controller Number (0 to 3) and -1 signalling end of processing the pif ram. - Pointer of data to be processed. output: none note: This function is only needed if the DLL is allowing raw data. *******************************************************************/ EXPORT void CALL ReadController(int Control, BYTE * Command); /****************************************************************** Function: RomClosed Purpose: This function is called when a rom is closed. input: none output: none *******************************************************************/ EXPORT void CALL RomClosed(void); /****************************************************************** Function: RomOpen Purpose: This function is called when a rom is open. (from the emulation thread) input: none output: none *******************************************************************/ EXPORT void CALL RomOpen(void); /****************************************************************** Function: WM_KeyDown Purpose: To pass the WM_KeyDown message from the emulator to the plugin. input: wParam and lParam of the WM_KEYDOWN message. output: none *******************************************************************/ EXPORT void CALL WM_KeyDown(WPARAM wParam, LPARAM lParam); /****************************************************************** Function: WM_KeyUp Purpose: To pass the WM_KEYUP message from the emulator to the plugin. input: wParam and lParam of the WM_KEYDOWN message. output: none *******************************************************************/ EXPORT void CALL WM_KeyUp(WPARAM wParam, LPARAM lParam); #if defined(__cplusplus) } #endif #endif