diff --git a/libretro.h b/libretro.h new file mode 100755 index 0000000000..1dcf765e49 --- /dev/null +++ b/libretro.h @@ -0,0 +1,207 @@ +#ifndef LIBRETRO_H__ +#define LIBRETRO_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#else +#include +#endif + +#define RETRO_API_VERSION 1 + +#define RETRO_DEVICE_MASK 0xff +#define RETRO_DEVICE_NONE 0 +#define RETRO_DEVICE_JOYPAD 1 +#define RETRO_DEVICE_MOUSE 2 +#define RETRO_DEVICE_KEYBOARD 3 +#define RETRO_DEVICE_LIGHTGUN 4 + +#define RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE ((1 << 8) | RETRO_DEVICE_LIGHTGUN) +#define RETRO_DEVICE_LIGHTGUN_JUSTIFIER ((2 << 8) | RETRO_DEVICE_LIGHTGUN) +#define RETRO_DEVICE_LIGHTGUN_JUSTIFIERS ((3 << 8) | RETRO_DEVICE_LIGHTGUN) + +#define RETRO_DEVICE_ID_JOYPAD_B 0 +#define RETRO_DEVICE_ID_JOYPAD_Y 1 +#define RETRO_DEVICE_ID_JOYPAD_SELECT 2 +#define RETRO_DEVICE_ID_JOYPAD_START 3 +#define RETRO_DEVICE_ID_JOYPAD_UP 4 +#define RETRO_DEVICE_ID_JOYPAD_DOWN 5 +#define RETRO_DEVICE_ID_JOYPAD_LEFT 6 +#define RETRO_DEVICE_ID_JOYPAD_RIGHT 7 +#define RETRO_DEVICE_ID_JOYPAD_A 8 +#define RETRO_DEVICE_ID_JOYPAD_X 9 +#define RETRO_DEVICE_ID_JOYPAD_L 10 +#define RETRO_DEVICE_ID_JOYPAD_R 11 + +#define RETRO_DEVICE_ID_MOUSE_X 0 +#define RETRO_DEVICE_ID_MOUSE_Y 1 +#define RETRO_DEVICE_ID_MOUSE_LEFT 2 +#define RETRO_DEVICE_ID_MOUSE_RIGHT 3 + +#define RETRO_DEVICE_ID_LIGHTGUN_X 0 +#define RETRO_DEVICE_ID_LIGHTGUN_Y 1 +#define RETRO_DEVICE_ID_LIGHTGUN_TRIGGER 2 +#define RETRO_DEVICE_ID_LIGHTGUN_CURSOR 3 +#define RETRO_DEVICE_ID_LIGHTGUN_TURBO 4 +#define RETRO_DEVICE_ID_LIGHTGUN_PAUSE 5 + +#define RETRO_REGION_NTSC 0 +#define RETRO_REGION_PAL 1 + +#define RETRO_MEMORY_SAVE_RAM 0 +#define RETRO_MEMORY_RTC 1 +#define RETRO_MEMORY_SYSTEM_RAM 2 + +#define RETRO_MEMORY_SNES_BSX_RAM 0x100 +#define RETRO_MEMORY_SNES_BSX_PRAM 0x101 +#define RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM 0x102 +#define RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM 0x103 +#define RETRO_MEMORY_SNES_GAME_BOY_RAM 0x104 +#define RETRO_MEMORY_SNES_GAME_BOY_RTC 0x105 + +#define RETRO_GAME_TYPE_BSX 0x100 +#define RETRO_GAME_TYPE_BSX_SLOTTED 0x101 +#define RETRO_GAME_TYPE_SUFAMI_TURBO 0x102 +#define RETRO_GAME_TYPE_SUPER_GAME_BOY 0x103 + + +// Environment commands. +#define RETRO_ENVIRONMENT_SET_GEOMETRY 1 // const struct retro_geometry * -- + // Window geometry information for the system/game. + // +#define RETRO_ENVIRONMENT_SET_TIMING 2 // const struct retro_system_timing * -- + // Set exact timings of the system. Used primarily for video recording. + // +#define RETRO_ENVIRONMENT_SET_ROTATION 3 // const unsigned * -- + // Sets screen rotation of graphics. + // Is only implemented if rotation can be accelerated by hardware. + // Valid values are 0, 1, 2, 3, which rotates screen by 0, 90, 180, 270 degrees + // counter-clockwise respectively. + // +#define RETRO_ENVIRONMENT_GET_OVERSCAN 4 // bool * -- + // Boolean value whether or not the implementation should use overscan. + // +#define RETRO_ENVIRONMENT_GET_CAN_DUPE 5 // bool * -- + // Boolean value whether or not SSNES supports frame duping, + // passing NULL to video frame callback. + // + // +#define RETRO_ENVIRONMENT_GET_VARIABLE 6 // struct retro_variable * -- + // Interface to aquire user-defined information from environment + // that cannot feasibly be supported in a multi-system way. + // Mostly used for obscure, + // specific features that the user can tap into when neseccary. + // +#define RETRO_ENVIRONMENT_SET_VARIABLES 7 // const struct retro_variable * -- + // Allows an implementation to signal the environment + // which variables it might want to check for later using GET_VARIABLE. + // 'data' points to an array of retro_variable structs terminated by a { NULL, NULL } element. + // retro_variable::value should contain a human readable description of the key. + // +#define RETRO_ENVIRONMENT_SET_MESSAGE 8 // const struct retro_message * -- + // Sets a message to be displayed in implementation-specific manner for a certain amount of 'frames'. + +struct retro_message +{ + const char *msg; + unsigned frames; +}; + +struct retro_system_info +{ + const char *library_name; + const char *library_version; + const char *valid_extensions; + bool need_fullpath; +}; + +struct retro_variable +{ + const char *key; // Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE. + // If NULL, obtains the complete environment string if more complex parsing is necessary. + // The environment string is formatted as key-value pairs delimited by semicolons as so: + // "key1=value1;key2=value2;..." + const char *value; // Value to be obtained. If key does not exist, it is set to NULL. +}; + +struct retro_game_geometry +{ + unsigned base_width; // Nominal video width of system. + unsigned base_height; // Nominal video height of system. + unsigned max_width; // Maximum possible width of system. + unsigned max_height; // Maximum possible height of system. +}; + +struct retro_game_info +{ + const char *path; + const void *game_data; + size_t game_size; + const char *game_meta; +}; + +struct retro_system_timing +{ + double fps; + double sample_rate; +}; + +typedef bool (*retro_environment_t)(unsigned cmd, void *data); +typedef void (*retro_video_refresh_t)(const void *data, unsigned width, unsigned height, size_t pitch); +typedef void (*retro_audio_sample_t)(int16_t left, int16_t right); +typedef size_t (*retro_audio_sample_batch_t)(const int16_t *data, size_t frames); + +typedef void (*retro_input_poll_t)(void); +typedef int16_t (*retro_input_state_t)(unsigned port, unsigned device, unsigned index, unsigned id); + +unsigned retro_api_version(void); + +void retro_get_system_info(struct retro_system_info *info); + +void retro_set_environment(retro_environment_t); +void retro_set_video_refresh(retro_video_refresh_t); +void retro_set_audio_sample(retro_audio_sample_t); +void retro_set_audio_sample_batch(retro_audio_sample_batch_t); +void retro_set_input_poll(retro_input_poll_t); +void retro_set_input_state(retro_input_state_t); + +void retro_set_controller_port_device(unsigned port, unsigned device); + +void retro_init(void); +void retro_deinit(void); + +void retro_reset(void); +void retro_run(void); + +size_t retro_serialize_size(void); +bool retro_serialize(void *data, size_t size); +bool retro_unserialize(const void *data, size_t size); + +void retro_cheat_reset(void); +void retro_cheat_set(unsigned index, bool enabled, const char *code); + +bool retro_load_game(const char *game_path, + const void *game_data, size_t game_size, + const char *game_meta +); + +bool retro_load_game_special( + unsigned game_type, + const struct retro_game_info *info, size_t num_info +); + +void retro_unload_game(void); + +unsigned retro_get_region(void); + +void *retro_get_memory_data(unsigned id); +size_t retro_get_memory_size(unsigned id); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libsnes.hpp b/libsnes.hpp deleted file mode 100755 index 5a2a96ba0c..0000000000 --- a/libsnes.hpp +++ /dev/null @@ -1,247 +0,0 @@ -#ifndef LIBSNES_HPP -#define LIBSNES_HPP - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define SNES_PORT_1 0 -#define SNES_PORT_2 1 - -#define SNES_DEVICE_NONE 0 -#define SNES_DEVICE_JOYPAD 1 -#define SNES_DEVICE_MULTITAP 2 -#define SNES_DEVICE_MOUSE 3 -#define SNES_DEVICE_SUPER_SCOPE 4 -#define SNES_DEVICE_JUSTIFIER 5 -#define SNES_DEVICE_JUSTIFIERS 6 - -#define SNES_DEVICE_ID_JOYPAD_B 0 -#define SNES_DEVICE_ID_JOYPAD_Y 1 -#define SNES_DEVICE_ID_JOYPAD_SELECT 2 -#define SNES_DEVICE_ID_JOYPAD_START 3 -#define SNES_DEVICE_ID_JOYPAD_UP 4 -#define SNES_DEVICE_ID_JOYPAD_DOWN 5 -#define SNES_DEVICE_ID_JOYPAD_LEFT 6 -#define SNES_DEVICE_ID_JOYPAD_RIGHT 7 -#define SNES_DEVICE_ID_JOYPAD_A 8 -#define SNES_DEVICE_ID_JOYPAD_X 9 -#define SNES_DEVICE_ID_JOYPAD_L 10 -#define SNES_DEVICE_ID_JOYPAD_R 11 - -#define SNES_DEVICE_ID_MOUSE_X 0 -#define SNES_DEVICE_ID_MOUSE_Y 1 -#define SNES_DEVICE_ID_MOUSE_LEFT 2 -#define SNES_DEVICE_ID_MOUSE_RIGHT 3 - -#define SNES_DEVICE_ID_SUPER_SCOPE_X 0 -#define SNES_DEVICE_ID_SUPER_SCOPE_Y 1 -#define SNES_DEVICE_ID_SUPER_SCOPE_TRIGGER 2 -#define SNES_DEVICE_ID_SUPER_SCOPE_CURSOR 3 -#define SNES_DEVICE_ID_SUPER_SCOPE_TURBO 4 -#define SNES_DEVICE_ID_SUPER_SCOPE_PAUSE 5 - -#define SNES_DEVICE_ID_JUSTIFIER_X 0 -#define SNES_DEVICE_ID_JUSTIFIER_Y 1 -#define SNES_DEVICE_ID_JUSTIFIER_TRIGGER 2 -#define SNES_DEVICE_ID_JUSTIFIER_START 3 - -#define SNES_REGION_NTSC 0 -#define SNES_REGION_PAL 1 - -#define SNES_MEMORY_CARTRIDGE_RAM 0 -#define SNES_MEMORY_CARTRIDGE_RTC 1 -#define SNES_MEMORY_BSX_RAM 2 -#define SNES_MEMORY_BSX_PRAM 3 -#define SNES_MEMORY_SUFAMI_TURBO_A_RAM 4 -#define SNES_MEMORY_SUFAMI_TURBO_B_RAM 5 -#define SNES_MEMORY_GAME_BOY_RAM 6 -#define SNES_MEMORY_GAME_BOY_RTC 7 - -#define SNES_MEMORY_WRAM 100 -#define SNES_MEMORY_APURAM 101 -#define SNES_MEMORY_VRAM 102 -#define SNES_MEMORY_OAM 103 -#define SNES_MEMORY_CGRAM 104 - -// SSNES extension. Not required to be implemented for a working implementation. -#define SNES_ENVIRONMENT_GET_FULLPATH 0 // const char ** -- - // Full path of game loaded. - // -#define SNES_ENVIRONMENT_SET_GEOMETRY 1 // const struct snes_geometry * -- - // Window geometry information for the system/game. - // -#define SNES_ENVIRONMENT_SET_PITCH 2 // const unsigned * -- - // Pitch of game image. - // -#define SNES_ENVIRONMENT_GET_OVERSCAN 3 // bool * -- - // Boolean value whether or not the implementation should use overscan. - // -#define SNES_ENVIRONMENT_SET_TIMING 4 // const struct snes_system_timing * -- - // Set exact timings of the system. Used primarily for video recording. - // -#define SNES_ENVIRONMENT_GET_CAN_DUPE 5 // bool * -- - // Boolean value whether or not SSNES supports frame duping, - // passing NULL to video frame callback. - // - // -#define SNES_ENVIRONMENT_SET_NEED_FULLPATH 6 // const bool * -- - // Boolean value telling if implementation needs a valid fullpath to be able to run. - // If this is the case, SSNES will not open the rom directly, - // and pass NULL to rom data. - // Implementation must then use SNES_ENVIRONMENT_GET_FULLPATH. - // This is useful for implementations with very large roms, - // which are impractical to load fully into RAM. - // -#define SNES_ENVIRONMENT_GET_CAN_REWIND 7 // bool * -- - // Boolean value telling if SSNES is able to rewind. - // Some implementations might need to take extra precautions - // to allow this as smoothly as possible. - // -#define SNES_ENVIRONMENT_GET_VARIABLE 8 // struct snes_variable * -- - // Interface to aquire user-defined information from environment - // that cannot feasibly be supported in a multi-system way. - // Mostly used for obscure, - // specific features that the user can tap into when neseccary. - // -#define SNES_ENVIRONMENT_SET_VARIABLES 9 // const struct snes_variable * -- - // Allows an implementation to signal the environment - // which variables it might want to check for later using GET_VARIABLE. - // 'data' points to an array of snes_variable structs terminated by a { NULL, NULL } element. - // snes_variable::value should contain a human readable description of the key. - // -#define SNES_ENVIRONMENT_SET_BATCH_LOAD 10 // const bool * -- - // If true, the implementation will load several roms in batch. - // This means the rom must be provided exactly as is, i.e. it cannot be extracted. - // If supported, this must be called directly when snes_set_environment() is called. - // (Used on consoles). - // -#define SNES_ENVIRONMENT_SET_ROM_FORMATS 11 // const char * -- - // Sets rom extensions the core generally supports. - // If supported, this must be called directly when snes_set_environment() is called. - // Formats are delimited with '|', i.e. "foo|bar|baz". - // (Used on consoles). - // -#define SNES_ENVIRONMENT_SET_MESSAGE 12 // const struct snes_message * -- - // Sets a message to be displayed in implementation-specific manner for a certain amount of 'frames'. - // -#define SNES_ENVIRONMENT_GET_AUDIO_BATCH_CB 13 // snes_audio_sample_batch_t * -- - // Retrieves callback to a more optimized audio callback. - // -#define SNES_ENVIRONMENT_SET_ROTATION 14 // const unsigned * -- - // Sets screen rotation of graphics. - // Is only implemented if rotation can be accelerated by hardware. - // Valid values are 0, 1, 2, 3, which rotates screen by 0, 90, 180, 270 degrees - // counter-clockwise respectively. - // -#define SNES_ENVIRONMENT_SET_CORE_VERSION 15 // const char * -- - // Sets version of core as a human readable string. - -struct snes_message -{ - const char *msg; - unsigned frames; -}; - -struct snes_variable -{ - const char *key; // Variable to query in SNES_ENVIRONMENT_GET_VARIABLE. - // If NULL, obtains the complete environment string if more complex parsing is necessary. - // The environment string is formatted as key-value pairs delimited by semicolons as so: - // "key1=value1;key2=value2;..." - const char *value; // Value to be obtained. If key does not exist, it is set to NULL. -}; - -struct snes_geometry -{ - unsigned base_width; // Nominal video width of system. - unsigned base_height; // Nominal video height of system. - unsigned max_width; // Maximum possible width of system. - unsigned max_height; // Maximum possible height of system. -}; - -struct snes_system_timing -{ - double fps; - double sample_rate; -}; - -typedef bool (*snes_environment_t)(unsigned cmd, void *data); - -// Must be called before calling snes_init(). -void snes_set_environment(snes_environment_t); -//// - -typedef void (*snes_video_refresh_t)(const uint16_t *data, unsigned width, unsigned height); -typedef void (*snes_audio_sample_t)(uint16_t left, uint16_t right); - -// Performance extension. Retrieved from environ callback. -typedef unsigned (*snes_audio_sample_batch_t)(const int16_t *data, unsigned frames); - -typedef void (*snes_input_poll_t)(void); -typedef int16_t (*snes_input_state_t)(bool port, unsigned device, unsigned index, unsigned id); - -unsigned snes_library_revision_major(void); -unsigned snes_library_revision_minor(void); - -const char *snes_library_id(void); - -void snes_set_video_refresh(snes_video_refresh_t); -void snes_set_audio_sample(snes_audio_sample_t); -void snes_set_input_poll(snes_input_poll_t); -void snes_set_input_state(snes_input_state_t); - -void snes_set_controller_port_device(bool port, unsigned device); -void snes_set_cartridge_basename(const char *basename); - -void snes_init(void); -void snes_term(void); -void snes_power(void); -void snes_reset(void); -void snes_run(void); - -unsigned snes_serialize_size(void); -bool snes_serialize(uint8_t *data, unsigned size); -bool snes_unserialize(const uint8_t *data, unsigned size); - -void snes_cheat_reset(void); -void snes_cheat_set(unsigned index, bool enabled, const char *code); - -bool snes_load_cartridge_normal( - const char *rom_xml, const uint8_t *rom_data, unsigned rom_size -); - -bool snes_load_cartridge_bsx_slotted( - const char *rom_xml, const uint8_t *rom_data, unsigned rom_size, - const char *bsx_xml, const uint8_t *bsx_data, unsigned bsx_size -); - -bool snes_load_cartridge_bsx( - const char *rom_xml, const uint8_t *rom_data, unsigned rom_size, - const char *bsx_xml, const uint8_t *bsx_data, unsigned bsx_size -); - -bool snes_load_cartridge_sufami_turbo( - const char *rom_xml, const uint8_t *rom_data, unsigned rom_size, - const char *sta_xml, const uint8_t *sta_data, unsigned sta_size, - const char *stb_xml, const uint8_t *stb_data, unsigned stb_size -); - -bool snes_load_cartridge_super_game_boy( - const char *rom_xml, const uint8_t *rom_data, unsigned rom_size, - const char *dmg_xml, const uint8_t *dmg_data, unsigned dmg_size -); - -void snes_unload_cartridge(void); - -bool snes_get_region(void); -uint8_t* snes_get_memory_data(unsigned id); -unsigned snes_get_memory_size(unsigned id); - -#ifdef __cplusplus -} -#endif - -#endif