<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mupen64plus.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Richard42</id>
	<title>Mupen64Plus Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://mupen64plus.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Richard42"/>
	<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php/Special:Contributions/Richard42"/>
	<updated>2026-10-18T13:26:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Video_Extension&amp;diff=105</id>
		<title>Mupen64Plus v2.0 Core Video Extension</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Video_Extension&amp;diff=105"/>
		<updated>2022-08-06T02:58:10Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Mupen64Plus v2.0 Video Extension API =&lt;br /&gt;
&lt;br /&gt;
Most libmupen64plus functions return an &amp;lt;tt&amp;gt;m64p_error&amp;lt;/tt&amp;gt; return code, which is an enumerated type defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]].  Plugin code should check the return value of each call to a libmupen64plus function.&lt;br /&gt;
&lt;br /&gt;
All of these functions should only be called from within the video plugin; they should not be called from the front-end.&lt;br /&gt;
&lt;br /&gt;
== Startup/Shutdown Functions ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_Init(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|This function should be called before any other Video Extension functions.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function should be called from within the RomOpen() video plugin function call.  The default SDL implementation of this function simply calls SDL_InitSubSystem(SDL_INIT_VIDEO).  It does not open a rendering window or switch video modes.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_Quit(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function closes any open rendering window and shuts down the video system.  The default SDL implementation of this function calls SDL_QuitSubSystem(SDL_INIT_VIDEO).  This function should be called from within the RomClosed() video plugin function.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screen Handling Functions ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_ListFullscreenModes(m64p_2d_size *SizeArray, int *NumSizes)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SizeArray&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an array of &amp;lt;tt&amp;gt;m64p_2d_size&amp;lt;/tt&amp;gt; objects, defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;NumSizes&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an integer which contains the size of &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SizeArray&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; for input, and the number of size objects stored for output.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to enumerate the available resolutions for fullscreen video modes.  An array &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SizeArray&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is passed into the function, which is then filled (up to &amp;lt;tt&amp;gt;*&amp;#039;&amp;#039;&amp;#039;NumSizes&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; objects) with resolution sizes.  The number of sizes actually written is stored in the integer which is pointed to by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;NumSizes&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_ListFullscreenRates(m64p_2d_size Size, int *NumRates, int *Rates)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Size&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; &amp;lt;tt&amp;gt;m64p_2d_size&amp;lt;/tt&amp;gt; object, defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]] of the resolution you want to retrieve the fullscreen refresh rates from.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;NumRates&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an integer which contains the size of &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Rates&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; for input, and the number of size objects stored for output.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Rates&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an array of integers which will contain the refresh rates.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to enumerate the available refresh rates for a given resolution. An &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_2d_size&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; object is passed into the function, which will contain the resolution of the refresh rates you want to retrieve, an array &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Rates&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is passed into the function, which is then filled (up to &amp;lt;tt&amp;gt;*&amp;#039;&amp;#039;&amp;#039;NumRates&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; objects) with resolution sizes.  The number of sizes actually written is stored in the integer which is pointed to by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;NumSizes&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_SetVideoMode(int Width, int Height, int BitsPerPixel, m64p_video_mode ScreenMode, m64p_video_flags Flags)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Width&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Horizontal resolution in pixels of desired video window&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Height&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Vertical resolution in pixels of desired video window&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;BitsPerPixel&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pixel color resolution of desired video window.  This value must be 16, 24, or 32&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ScreenMode&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Either &amp;lt;tt&amp;gt;M64VIDEO_WINDOWED&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;M64VIDEO_FULLSCREEN&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Flags&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Logical-OR combination of flags which describes the video plugin&amp;#039;s capabilities.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function creates a rendering window or switches into a fullscreen video mode.  Any desired OpenGL attributes should be set before calling this function.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_SetVideoModeWithRate(int Width, int Height, int RefreshRate, int BitsPerPixel, m64p_video_mode ScreenMode, m64p_video_flags Flags)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Width&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Horizontal resolution in pixels of desired video window&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Height&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Vertical resolution in pixels of desired video window&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;RefreshRate&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Fullscreen refresh rate&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;BitsPerPixel&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pixel color resolution of desired video window.  This value must be 16, 24, or 32&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ScreenMode&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Either &amp;lt;tt&amp;gt;M64VIDEO_WINDOWED&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;M64VIDEO_FULLSCREEN&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Flags&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Logical-OR combination of flags which describes the video plugin&amp;#039;s capabilities.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function creates a rendering window or switches into a fullscreen video mode.  Any desired OpenGL attributes should be set before calling this function.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_SetCaption(const char *Title)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Title&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to a NULL-terminated string containing the desired title text of the emulator rendering window&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function sets the caption text of the emulator rendering window.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_ToggleFullScreen(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.  The rendering window should already be created.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function toggles between fullscreen and windowed rendering modes.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_ResizeWindow(int Width, int Height)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Width&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Horizontal resolution of resized window in pixels&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Height&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Vertical resolution of resized window in pixels&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.  The rendering window should already be created.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is called when the video plugin has resized its OpenGL output viewport in response to a ResizeVideoOutput() call, and requests that the window manager update the OpenGL rendering window size to match.  If a front-end application does not support resizable windows and never sets the M64CORE_VIDEO_SIZE core variable with the M64CMD_CORE_STATE_SET command, then this function should not be called.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Window Resizing===&lt;br /&gt;
The window resizing functionality is particularly complicated, so here is a high-level description of the events which make it happen:&lt;br /&gt;
&lt;br /&gt;
====Without video extension:====&lt;br /&gt;
# In VidExt_SetVideoMode(), check if M64VIDEOFLAG_SUPPORT_RESIZING is set&lt;br /&gt;
#* if True, create SDL window with RESIZABLE attribute&lt;br /&gt;
# Core receives SDL_RESIZE messages in SDL event loop&lt;br /&gt;
# If present, Core calls ResizeVideoOutput function in video plugin&lt;br /&gt;
# Video Plugin calls ResizeWindow function in Video Extension&lt;br /&gt;
#* Core calls SDL_SetVideoMode()&lt;br /&gt;
# Core emits M64CORE_VIDEO_SIZE state changed callback&lt;br /&gt;
&lt;br /&gt;
====With video extension:====&lt;br /&gt;
# in Front-end SetVideoMode() callback&lt;br /&gt;
#* if M64VIDEOFLAG_SUPPORT_RESIZING is set, create resizable window frame&lt;br /&gt;
# Front-end GUI gets window resize notification&lt;br /&gt;
# Front-end calls CoreDoCommand w/ M64CMD_CORE_STATE_SET, w/ M64CORE_VIDEO_SIZE&lt;br /&gt;
# If present, Core calls ResizeVideoOutput function in video plugin&lt;br /&gt;
# Video Plugin calls ResizeWindow function in Video Extension&lt;br /&gt;
# Core emits M64CORE_VIDEO_SIZE state changed callback&lt;br /&gt;
&lt;br /&gt;
In the Core Video Extension function ResizeWindow, the SDL function SetVideoMode() is called.  This function will destroy the current OpenGL context and create a new one.  For this reason, any video plugin which supports resizable windows must completely reset its OpenGL state including uploading any textures, FBOs, programs, etc after calling the VidExt_ResizeWindow function.&lt;br /&gt;
&lt;br /&gt;
== OpenGL Functions ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;void * VidExt_GL_GetProcAddress(const char* Proc)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Proc&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to a NULL-terminated string containing the name of the desired OpenGL extension function.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to get a pointer to an OpenGL extension function.  This is only necessary on the Windows platform, because the OpenGL implementation shipped with Windows only supports OpenGL version 1.1.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_GL_SetAttribute(m64p_GLattr Attr, int Value)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Attr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Enumerated type (defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]]) specifying which OpenGL attribute to set&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Value&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Value to set for the attribute&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.  The desired attributes should be set before calling &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;VidExt_SetVideoMode&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to set certain OpenGL attributes which must be specified before creating the rendering window with &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;VidExt_SetVideoMode&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_GL_GetAttribute(m64p_GLattr Attr, int *pValue)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Attr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Enumerated type (defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]]) specifying OpenGL attribute of which to get value&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;pValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to integer Value which will be set to attribute&amp;#039;s value&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function may be used to check that OpenGL attributes where successfully set to the rendering window after the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;VidExt_SetVideoMode&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function call.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error VidExt_GL_SwapBuffers(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.  The rendering window should already be created.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to swap the front/back buffers after rendering an output video frame.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;uint32_t VidExt_GL_GetDefaultFramebuffer(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The video extension must be initialized before calling this function.  The rendering window should already be created.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|On some platforms (for instance, iOS) the default framebuffer object depends on the surface being rendered to, and might be different from 0. This function should be called to retrieve the name of the default FBO. Calling this function may have performance implications and it should not be called every time the default FBO is bound.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_API_Versioning&amp;diff=104</id>
		<title>Mupen64Plus v2.0 API Versioning</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_API_Versioning&amp;diff=104"/>
		<updated>2022-08-06T02:56:08Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Mupen64Plus v2.0 API Versioning =&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
The Mupen64Plus API versioning scheme was invented to give a more friendly and less confusing experience for users as the various components evolve over time.  There are 6 basic components to the Mupen64Plus system, which may be independently built and installed:&lt;br /&gt;
&lt;br /&gt;
# The Front-end UI application&lt;br /&gt;
# The Core emulator library&lt;br /&gt;
# The Video plugin&lt;br /&gt;
# The Audio plugin&lt;br /&gt;
# The Input plugin&lt;br /&gt;
# The RSP plugin&lt;br /&gt;
&lt;br /&gt;
These components interact with each other in several different ways.  The design goal of the versioning scheme is to gracefully handle all situations in which two components support different versions of their common API (due to one component being newer than the other).  In particular, each pair of components sharing a common API must discover whether or not they are compatible with each other.  They must make this determination early enough in the startup process to inform the user of an incompatibility and gracefully exit the software if necessary without crashing.  There are 2 different decisions that pertain to the compatibility determination:&lt;br /&gt;
&lt;br /&gt;
# Major API version.  The various API version numbers are 32-bit.  The major version number is stored in the upper 16 bits, and the minor version number is in the lower 16 bits.  If two components have different major API version numbers, then they are definitely incompatible.&lt;br /&gt;
# Minor API version.  If two components with a common API have different minor version numbers, then the newer component may decide whether or not it can interact with the older component based upon the older component&amp;#039;s version number.  The newer component may optionally disable new features and still retain backwards compatibility, or it may refuse to operate with the older component.  This decision is left to the component author when new features are added.&lt;br /&gt;
&lt;br /&gt;
== Basic Design ==&lt;br /&gt;
&lt;br /&gt;
In mupen64plus-core/src/plugin/plugin.h, the following macros are defined:&lt;br /&gt;
&lt;br /&gt;
 #define RSP_API_MAJOR_VERSION   0x20000&lt;br /&gt;
 #define GFX_API_MAJOR_VERSION   0x20000&lt;br /&gt;
 #define AUDIO_API_MAJOR_VERSION 0x20000&lt;br /&gt;
 #define INPUT_API_MAJOR_VERSION 0x20000&lt;br /&gt;
&lt;br /&gt;
In mupen64plus-core/src/main/version.h, the following macros are defined:&lt;br /&gt;
&lt;br /&gt;
 #define FRONTEND_API_VERSION 0x020000&lt;br /&gt;
 #define CONFIG_API_VERSION   0x020000&lt;br /&gt;
 #define DEBUG_API_VERSION    0x020000&lt;br /&gt;
 #define VIDEXT_API_VERSION   0x020000&lt;br /&gt;
&lt;br /&gt;
# When the front-end application calls the CoreStartup() function, it passes it&amp;#039;s Core&amp;lt;--&amp;gt;Front-end API version to the core.  If the API major version numbers for the core and front-end don&amp;#039;t match, the core will return from this function with a failure code of M64ERR_INCOMPATIBLE.&lt;br /&gt;
# The Console-UI front-end also checks for API compatibility, during the AttachCoreLib() function call.  It is not strictly necessary for a front-end application to verify the API compatibility with the core, since the core will also check during CoreStartup().  However, by doing so, an updated front-end may detect a core library using a newer (but backwards-compatible) API, and enable some extra features as a result of the expanded API.&lt;br /&gt;
# At the time each plugin is attached to the core (during CoreAttachPlugin function call), the core checks the version number of the plugin API by calling the PluginGetVersion function.  If the major version number of the plugin&amp;#039;s reported API (APIVersion &amp;amp; 0xffff0000) does not match the corresponding version number for that plugin type in the core (defined in plugin.h), then the plugin is incompatible and cannot be attached to the core.  Currently the plugins have no way to request the major version number required for a particular plugin type in the core library.  &lt;br /&gt;
# The emulator core exports several different API groups which may be used by the front-end and plugin modules.  Currently, these groups are: Front-end, Config, Debug, and Video Extension. A front-end application or any plugin may call the CoreGetAPIVersions() function to retrieve the API version numbers for these groups.  Any plugin or front-end which can use any updated (not present in the original &amp;quot;2.0&amp;quot; API) functions in one of these groups should call the core&amp;#039;s CoreGetAPIVersions() function (during PluginStartup for a plugin or at core attach time for a front-end) to check the version # of the API supported by the core, and react accordingly.&lt;br /&gt;
# All front-ends and plugins should verify API version compatibility for the Config API.&lt;br /&gt;
&lt;br /&gt;
== Handling Future Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New feature added to a plugin library ===&lt;br /&gt;
If the feature is backwards-compatible with older cores, then plugin API minor version will be bumped.  Otherwise, major version number will be bumped.  If change is backwards-compatible, then newest core can test the plugin&amp;#039;s API version and only enable the feature if present.&lt;br /&gt;
&lt;br /&gt;
=== New feature added to Core&amp;lt;--&amp;gt;Front-end API ===&lt;br /&gt;
Typically this will happen when a new function or a new feature of an existing function is added to the core.  If the older front-ends will still be compatible with newer cores, then the minor version number of the front-end API will be bumped.  Otherwise the major version number will be bumped.  A newer front-end can check the version of the API supported by the core and choose whether to retain backwards-compatibility with older cores or refuse to interoperate.&lt;br /&gt;
&lt;br /&gt;
=== New feature added to Core Config API ===&lt;br /&gt;
If older plugins can still use the Core Config API with the new feature, then Config API minor version will be bumped.  Otherwise, major version number will be bumped.  Newer plugins should check the Core&amp;#039;s Config API version and maintain backwards compatibility with older cores if possible.&lt;br /&gt;
&lt;br /&gt;
=== New feature added to Core Debug API ===&lt;br /&gt;
If older front-ends can still use the Core Debug API with the new feature, then Debug API minor version number will be bumped.  Otherwise, major version number will be bumped.  Newer front-end applications should check the Core&amp;#039;s Debug API version and maintain backwards compatibility with older cores if possible.&lt;br /&gt;
&lt;br /&gt;
=== New feature added to Video Extension API ===&lt;br /&gt;
This is the most complicated interface, because it involves 3 components: the video plugin, the core, and the front-end application.  If older video plugins can still use the newer Video Extension API with the core, *and* newer front-end applications can work with older cores, then the Video Extension API minor version number will be bumped. Otherwise, the major version number will be bumped.  Newer video plugins can check the Core&amp;#039;s Video Extension API version and maintain backwards compatibility with older cores if possible, otherwise they can refuse and give a compatibility error.  Front-end applications (such as the default console-ui) which do not hook into the Video Extension do not need to check the Core&amp;#039;s Video Extension API version.  However, front-end applications which do hook into the Video Extension must check the API version.  If the Core and Front-end have different API major version numbers, then they are incompatible.  Also if the Core has a *newer* minor version than the front-end, then they are incompatible.  This is a unique restriction, and it must be checked and verified by the front-end; the Core has no way to check this.&lt;br /&gt;
&lt;br /&gt;
== Changelog ==&lt;br /&gt;
* Version 2.0.0 is the base for all APIs&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.0.1:&lt;br /&gt;
** added &amp;quot;m64p_command&amp;quot; type &amp;quot;M64CMD_CORE_STATE_SET&amp;quot;, handled by CoreDoCommand()&lt;br /&gt;
** added &amp;quot;m64p_core_param&amp;quot; type &amp;quot;M64CORE_SPEED_LIMITER&amp;quot;, handled by &amp;quot;M64CMD_CORE_STATE_QUERY&amp;quot; and &amp;quot;M64CMD_CORE_STATE_SET&amp;quot; commands&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.0.2:&lt;br /&gt;
** added &amp;quot;m64p_command&amp;quot; types:&lt;br /&gt;
*** M64CMD_GET_SCREEN_WIDTH&lt;br /&gt;
*** M64CMD_GET_SCREEN_HEIGHT&lt;br /&gt;
*** M64CMD_READ_SCREEN&lt;br /&gt;
*** M64CMD_VOLUME_UP&lt;br /&gt;
*** M64CMD_VOLUME_DOWN&lt;br /&gt;
*** M64CMD_VOLUME_GET_LEVEL&lt;br /&gt;
*** M64CMD_VOLUME_SET_LEVEL&lt;br /&gt;
*** M64CMD_VOLUME_MUTE&lt;br /&gt;
*** M64CMD_RESET&lt;br /&gt;
*** M64CMD_ADVANCE_FRAME&lt;br /&gt;
** extend command M64CMD_STATE_SAVE to support saving uncompressed PJ64 savestate files as well as zip compressed&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.0:&lt;br /&gt;
** removed &amp;quot;m64p_command&amp;quot; types:&lt;br /&gt;
*** M64CMD_GET_SCREEN_WIDTH&lt;br /&gt;
*** M64CMD_GET_SCREEN_HEIGHT&lt;br /&gt;
*** M64CMD_VOLUME_UP&lt;br /&gt;
*** M64CMD_VOLUME_DOWN&lt;br /&gt;
*** M64CMD_VOLUME_GET_LEVEL&lt;br /&gt;
*** M64CMD_VOLUME_SET_LEVEL&lt;br /&gt;
*** M64CMD_VOLUME_MUTE&lt;br /&gt;
** added new &amp;quot;m64p_core_param&amp;quot; types:&lt;br /&gt;
*** M64CORE_VIDEO_SIZE&lt;br /&gt;
*** M64CORE_AUDIO_VOLUME&lt;br /&gt;
*** M64CORE_AUDIO_MUTE&lt;br /&gt;
*** M64CORE_INPUT_GAMESHARK&lt;br /&gt;
*** M64CORE_STATE_LOADCOMPLETE&lt;br /&gt;
*** M64CORE_STATE_SAVECOMPLETE&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.1:&lt;br /&gt;
** Core command M64CMD_CORE_STATE_SET will now accept M64CORE_VIDEO_SIZE parameter&lt;br /&gt;
*** will call the video plugin function ResizeVideoOutput()&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.2:&lt;br /&gt;
** added &amp;quot;M64CMD_SET_MEDIA_LOADER&amp;quot; command to allow frontend to specify several media files (such as GB cartridge ROM and RAM files).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.0:&lt;br /&gt;
** add new function &amp;quot;ConfigSaveSection()&amp;quot; to save only a single config section to disk&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.2.0:&lt;br /&gt;
** add new function &amp;quot;ConfigHasUnsavedChanges()&amp;quot; to determine if a given Section (or all sections) of the Mupen64Plus Core configuration file has been modified since it was last saved or loaded.&lt;br /&gt;
** add new function &amp;quot;ConfigRevertChanges()&amp;quot; to revert changes previously made to one section of the configuration file, so that it will match with the configuration at the last time that it was loaded from or saved to disk.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.3.0:&lt;br /&gt;
** add new function &amp;quot;ConfigSetParameterHelp()&amp;quot; sets the value of one of the emulator&amp;#039;s configuration parameters.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.3.1:&lt;br /&gt;
** add new functions &amp;quot;ConfigExternalOpen()&amp;quot; &amp;quot;ConfigExternalClose()&amp;quot; &amp;quot;ConfigExternalGetParameter()&amp;quot; that allows plugins to leverage the core INI parser to read config files.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;DEBUG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.0.1:&lt;br /&gt;
** add new function &amp;quot;DebugBreakpointTriggeredBy()&amp;quot; which allows a front-end application to determine which memory address and action (read, write, execute) caused a breakpoint to fire.&lt;br /&gt;
** add new function &amp;quot;DebugVirtualToPhysical()&amp;quot; which allows a front-end application to find the physical address which corresponds to a given virtual address.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEO_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.0:&lt;br /&gt;
** video render callback function now takes a boolean (int) parameter, which specifies whether the video frame has been re-drawn since the last time the render callback was called. This allows us to take screenshots without the On-Screen-Display text&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEO_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.2.0:&lt;br /&gt;
** add (optional) ResizeVideoOutput function in video plugin.  If this function is not present in video plugin, then resizing the output video window will not work.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEXT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 3.0.0:&lt;br /&gt;
** add VidExt_ResizeWindow() function in video extension.  This function is called by the video plugin to notify the window manager (SDL if no video extension is registered by the front-end) that the OpenGL render window size should change.&lt;br /&gt;
** add m64p_video_flags parameter to the VidExt_SetVideoMode() function.  Currently the flags are only used to notify the window manager that resizing is supported by the video plugin, and it should create a resizable window if possible.  This may be extended in the future to support other features.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEXT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 3.1.0:&lt;br /&gt;
** add VidExt_GL_GetDefaultFramebuffer() function in video extension. This function should be called to get the name of the default FBO.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEXT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 3.2.0:&lt;br /&gt;
** add the VidExt_ListFullscreenRates and VidExt_SetVideoModeWithRate functions, which allow setting and getting the fullscreen refresh rate&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;INPUT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.0.1:&lt;br /&gt;
** add (optional) RenderCallback function to input plugin. This function is called by the core after rendering on screen text (OSD) and before the graphics plugin swaps the buffers. The purpose of this function is to enable the input plugin to draw on screen content, for example buttons in a touch input plugin. If this function is not present the core will ignore it and on screen rendering by the input plugin will be disabled.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;INPUT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.0:&lt;br /&gt;
** This is not an API change, but reflects an internal behavior change. On March 23, 2018, the SDL_PumpEvents() call was moved from being in the core to only being in the input plugin. After this point, newer builds of the core would not register keyboard input when used with older builds of the input plugin, which did not call SDL_PumpEvents. As such, core libraries with INPUT_API_VERSION of 2.1.0 will refuse to work with older input plugins.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.3:&lt;br /&gt;
** added &amp;quot;M64CMD_PIF_OPEN&amp;quot; command to allow using a binary PIF Boot ROM (instead of the included HLE implementation).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.4:&lt;br /&gt;
** added &amp;quot;M64CMD_ROM_SET_SETTINGS&amp;quot; command to allow setting ROM settings for the currently opened ROM until the ROM is closed.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.3.2:&lt;br /&gt;
** add ConfigOverrideUserPaths() function to allow front-ends to override user paths.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;INPUT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.1:&lt;br /&gt;
** add optional functions: SendVRUWord(), SetMicState(), ReadVRUResults(), ClearVRUWords(), SetVRUWordMask(). These functions add support for the VRU (Voice Recognition Unit). Also added a new int to the CONTROL struct: Type. Type can be CONT_TYPE_STANDARD (0) or CONT_TYPE_VRU (1).&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=CompilingFromGit&amp;diff=103</id>
		<title>CompilingFromGit</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=CompilingFromGit&amp;diff=103"/>
		<updated>2020-10-17T21:45:14Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Compiling Mupen64Plus from source code under Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Compiling Mupen64Plus from source code under Linux ==&lt;br /&gt;
&lt;br /&gt;
This guide is for people who want to play with the latest Mupen64Plus code under development, by grabbing the source code from our development repository and compiling it yourself.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
* Build environment (GCC, G++, GNU Make, nasm, pkg-config, etc)&lt;br /&gt;
* Git distributed SCM&lt;br /&gt;
* Development packages for dependencies&lt;br /&gt;
# SDL 1.2 or 2.0&lt;br /&gt;
# libpng&lt;br /&gt;
# FreeType 2&lt;br /&gt;
# zlib&lt;br /&gt;
# OpenGL (GL, glu)&lt;br /&gt;
# Boost (for glide64mk2 video plugin)&lt;br /&gt;
* Optional development packages for dependencies&lt;br /&gt;
# libsamplerate&lt;br /&gt;
# libspeexdsp&lt;br /&gt;
# liblircclient&lt;br /&gt;
&lt;br /&gt;
If you are using Ubuntu, Mint, Debian, or a derived Linux distribution, you may install the pre-requisite packages with this command:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo apt install build-essential libz-dev libpng-dev libsdl2-dev libfreetype-dev nasm libboost-dev libboost-filesystem-dev&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installing Git ===&lt;br /&gt;
&lt;br /&gt;
If you do not have git installed, launch your favorite application manager and search for &amp;#039;&amp;#039;&amp;#039;git&amp;#039;&amp;#039;&amp;#039;. If you are on Ubuntu or Debian this line will work in the console:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo apt-get install git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Checking out, building, and updating the source code ===&lt;br /&gt;
&lt;br /&gt;
Part of the re-design of our emulator has involved breaking it up from a single big package into 6 separate modules which must all be built separately.  In order to make this easier for developers, I have written a few simple shell scripts for checking out and building the code.  You make download an archive of the scripts here:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mupen64plus/mupen64plus-core/raw/master/tools/m64p_helper_scripts.tar.gz m64p_helper_scripts.tar.gz] (updated Dec 18, 2013)&lt;br /&gt;
&lt;br /&gt;
To check out, build, and run the new Mupen64Plus code, unzip these scripts into an empty directory and run:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;./m64p_get.sh &amp;amp;&amp;amp; ./m64p_build.sh &amp;amp;&amp;amp; ./m64p_test.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If, at a later time, you want to pull the latest changes and rebuild all of the code, you may do the following:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;./m64p_update.sh &amp;amp;&amp;amp; ./m64p_build.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The build script will create a &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; directory and place all of the necessary files there.  You can go into this directory and run the console front-end (named &amp;lt;code&amp;gt;mupen64plus&amp;lt;/code&amp;gt;) to run ROMs.&lt;br /&gt;
&lt;br /&gt;
=== Custom Builds ===&lt;br /&gt;
&lt;br /&gt;
The makefiles of the Mupen64Plus modules support many different compile-time options.  Some of these options are specific to a single module, while others are common to several modules.  You can build the modules individually, passing options to the makefile in the &amp;lt;code&amp;gt;projects/unix/&amp;lt;/code&amp;gt; folder of the module, or you can append options to the &amp;lt;code&amp;gt;./m64p_build.sh&amp;lt;/code&amp;gt; script and build all the modules with the same options.&lt;br /&gt;
&lt;br /&gt;
==== Common Options ====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    BITS=32       == build 32-bit binaries on 64-bit machine&lt;br /&gt;
    APIDIR=path   == path to find Mupen64Plus Core headers&lt;br /&gt;
    OPTFLAGS=flag == compiler optimization (default: -O3)&lt;br /&gt;
    PIC=(1|0)     == Force enable/disable of position independent code&lt;br /&gt;
  Install Options:&lt;br /&gt;
    PREFIX=path   == install/uninstall prefix (default: /usr/local)&lt;br /&gt;
    SHAREDIR=path == path to install shared data files (default: PREFIX/share/mupen64plus)&lt;br /&gt;
    LIBDIR=path   == library prefix (default: PREFIX/lib)&lt;br /&gt;
    PLUGINDIR=path == path to install plugin libraries (default: LIBDIR/mupen64plus)&lt;br /&gt;
    DESTDIR=path  == path to prepend to all installation paths (only for packagers)&lt;br /&gt;
  Debugging Options:&lt;br /&gt;
    DEBUG=1       == add debugging symbols&lt;br /&gt;
    V=1           == show verbose compiler output&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-Core Only ====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    LIRC=1        == enable LIRC support&lt;br /&gt;
    NO_ASM=1      == build without assembly (no dynamic recompiler or MMX/SSE code)&lt;br /&gt;
    SHAREDIR=path == extra path to search for shared data files&lt;br /&gt;
    OSD=(1|0)     == Enable/disable build of OpenGL On-screen display&lt;br /&gt;
    NEW_DYNAREC=1 == Replace dynamic recompiler with Ari64&amp;#039;s experimental dynarec&lt;br /&gt;
  Install Options:&lt;br /&gt;
    INCDIR=path   == path to install core header files (default: PREFIX/include/mupen64plus)&lt;br /&gt;
  Debugging Options:&lt;br /&gt;
    PROFILE=1     == build gprof instrumentation into binaries for profiling&lt;br /&gt;
    DEBUGGER=1    == build graphical debugger&lt;br /&gt;
    DBG_CORE=1    == print debugging info in r4300 core&lt;br /&gt;
    DBG_COUNT=1   == print R4300 instruction count totals (64-bit dynarec only)&lt;br /&gt;
    DBG_COMPARE=1 == enable core-synchronized r4300 debugging&lt;br /&gt;
    DBG_PROFILE=1 == dump profiling data for r4300 dynarec to data file&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-Audio-SDL Only ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    NO_OSS=1      == build without OSS; disables Open Sound System support&lt;br /&gt;
    NO_SRC=1      == build without libsamplerate; disables src-* high-quality audio resampling&lt;br /&gt;
    NO_SPEEX=1    == build without libspeexdsp; disables speex-* high-quality audio resampling&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-Input-SDL Only ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  Debugging Options:&lt;br /&gt;
    PLUGINDBG=1   == print extra debugging information while running&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-UI-Console Only ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    COREDIR=path   == default path to search for Mupen64Plus Core (must end with slash)&lt;br /&gt;
    PLUGINDIR=path == default path to search for plugins&lt;br /&gt;
    SHAREDIR=path  == default path to search for shared data files&lt;br /&gt;
    PIE=(1|0)      == Force enable/disable of position independent executables&lt;br /&gt;
  Install Options:&lt;br /&gt;
    BINDIR=path    == path to install mupen64plus binary (default: PREFIX/bin/)&lt;br /&gt;
    MANDIR=path    == path to install mupen64plus manual page (default: PREFIX/share/man)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-Video-Rice Only ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    NO_ASM=1      == build without inline assembly code (x86 MMX/SSE)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=CompilingFromGit&amp;diff=102</id>
		<title>CompilingFromGit</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=CompilingFromGit&amp;diff=102"/>
		<updated>2020-10-17T21:42:15Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Installing Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Compiling Mupen64Plus from source code under Linux ==&lt;br /&gt;
&lt;br /&gt;
This guide is for people who want to play with the latest Mupen64Plus code under development, by grabbing the source code from our development repository and compiling it yourself.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
* Build environment (GCC, G++, GNU Make, pkg-config, etc)&lt;br /&gt;
* Git distributed SCM&lt;br /&gt;
* Development packages for dependencies&lt;br /&gt;
# SDL 1.2 or 2.0&lt;br /&gt;
# libpng&lt;br /&gt;
# FreeType 2&lt;br /&gt;
# zlib&lt;br /&gt;
# OpenGL (GL, glu)&lt;br /&gt;
# Boost (for glide64mk2 video plugin)&lt;br /&gt;
* Optional development packages for dependencies&lt;br /&gt;
# libsamplerate&lt;br /&gt;
# libspeexdsp&lt;br /&gt;
# liblircclient&lt;br /&gt;
&lt;br /&gt;
=== Installing Git ===&lt;br /&gt;
&lt;br /&gt;
If you do not have git installed, launch your favorite application manager and search for &amp;#039;&amp;#039;&amp;#039;git&amp;#039;&amp;#039;&amp;#039;. If you are on Ubuntu or Debian this line will work in the console:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo apt-get install git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Checking out, building, and updating the source code ===&lt;br /&gt;
&lt;br /&gt;
Part of the re-design of our emulator has involved breaking it up from a single big package into 6 separate modules which must all be built separately.  In order to make this easier for developers, I have written a few simple shell scripts for checking out and building the code.  You make download an archive of the scripts here:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/mupen64plus/mupen64plus-core/raw/master/tools/m64p_helper_scripts.tar.gz m64p_helper_scripts.tar.gz] (updated Dec 18, 2013)&lt;br /&gt;
&lt;br /&gt;
To check out, build, and run the new Mupen64Plus code, unzip these scripts into an empty directory and run:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;./m64p_get.sh &amp;amp;&amp;amp; ./m64p_build.sh &amp;amp;&amp;amp; ./m64p_test.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If, at a later time, you want to pull the latest changes and rebuild all of the code, you may do the following:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;./m64p_update.sh &amp;amp;&amp;amp; ./m64p_build.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The build script will create a &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; directory and place all of the necessary files there.  You can go into this directory and run the console front-end (named &amp;lt;code&amp;gt;mupen64plus&amp;lt;/code&amp;gt;) to run ROMs.&lt;br /&gt;
&lt;br /&gt;
=== Custom Builds ===&lt;br /&gt;
&lt;br /&gt;
The makefiles of the Mupen64Plus modules support many different compile-time options.  Some of these options are specific to a single module, while others are common to several modules.  You can build the modules individually, passing options to the makefile in the &amp;lt;code&amp;gt;projects/unix/&amp;lt;/code&amp;gt; folder of the module, or you can append options to the &amp;lt;code&amp;gt;./m64p_build.sh&amp;lt;/code&amp;gt; script and build all the modules with the same options.&lt;br /&gt;
&lt;br /&gt;
==== Common Options ====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    BITS=32       == build 32-bit binaries on 64-bit machine&lt;br /&gt;
    APIDIR=path   == path to find Mupen64Plus Core headers&lt;br /&gt;
    OPTFLAGS=flag == compiler optimization (default: -O3)&lt;br /&gt;
    PIC=(1|0)     == Force enable/disable of position independent code&lt;br /&gt;
  Install Options:&lt;br /&gt;
    PREFIX=path   == install/uninstall prefix (default: /usr/local)&lt;br /&gt;
    SHAREDIR=path == path to install shared data files (default: PREFIX/share/mupen64plus)&lt;br /&gt;
    LIBDIR=path   == library prefix (default: PREFIX/lib)&lt;br /&gt;
    PLUGINDIR=path == path to install plugin libraries (default: LIBDIR/mupen64plus)&lt;br /&gt;
    DESTDIR=path  == path to prepend to all installation paths (only for packagers)&lt;br /&gt;
  Debugging Options:&lt;br /&gt;
    DEBUG=1       == add debugging symbols&lt;br /&gt;
    V=1           == show verbose compiler output&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-Core Only ====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    LIRC=1        == enable LIRC support&lt;br /&gt;
    NO_ASM=1      == build without assembly (no dynamic recompiler or MMX/SSE code)&lt;br /&gt;
    SHAREDIR=path == extra path to search for shared data files&lt;br /&gt;
    OSD=(1|0)     == Enable/disable build of OpenGL On-screen display&lt;br /&gt;
    NEW_DYNAREC=1 == Replace dynamic recompiler with Ari64&amp;#039;s experimental dynarec&lt;br /&gt;
  Install Options:&lt;br /&gt;
    INCDIR=path   == path to install core header files (default: PREFIX/include/mupen64plus)&lt;br /&gt;
  Debugging Options:&lt;br /&gt;
    PROFILE=1     == build gprof instrumentation into binaries for profiling&lt;br /&gt;
    DEBUGGER=1    == build graphical debugger&lt;br /&gt;
    DBG_CORE=1    == print debugging info in r4300 core&lt;br /&gt;
    DBG_COUNT=1   == print R4300 instruction count totals (64-bit dynarec only)&lt;br /&gt;
    DBG_COMPARE=1 == enable core-synchronized r4300 debugging&lt;br /&gt;
    DBG_PROFILE=1 == dump profiling data for r4300 dynarec to data file&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-Audio-SDL Only ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    NO_OSS=1      == build without OSS; disables Open Sound System support&lt;br /&gt;
    NO_SRC=1      == build without libsamplerate; disables src-* high-quality audio resampling&lt;br /&gt;
    NO_SPEEX=1    == build without libspeexdsp; disables speex-* high-quality audio resampling&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-Input-SDL Only ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  Debugging Options:&lt;br /&gt;
    PLUGINDBG=1   == print extra debugging information while running&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-UI-Console Only ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    COREDIR=path   == default path to search for Mupen64Plus Core (must end with slash)&lt;br /&gt;
    PLUGINDIR=path == default path to search for plugins&lt;br /&gt;
    SHAREDIR=path  == default path to search for shared data files&lt;br /&gt;
    PIE=(1|0)      == Force enable/disable of position independent executables&lt;br /&gt;
  Install Options:&lt;br /&gt;
    BINDIR=path    == path to install mupen64plus binary (default: PREFIX/bin/)&lt;br /&gt;
    MANDIR=path    == path to install mupen64plus manual page (default: PREFIX/share/man)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mupen64Plus-Video-Rice Only ====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  General Options:&lt;br /&gt;
    NO_ASM=1      == build without inline assembly code (x86 MMX/SSE)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_Plugin_Parameters&amp;diff=101</id>
		<title>Mupen64Plus Plugin Parameters</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_Plugin_Parameters&amp;diff=101"/>
		<updated>2020-10-07T04:22:59Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Input-SDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Plugin Parameters =&lt;br /&gt;
&lt;br /&gt;
These are standard parameters which are used by the Mupen64Plus plugins.  The behavior of the plugin library when these parameters are changed while the emulator is running is not defined here.  Some plugins will load the parameters when starting and store internal copies of the parameters for use during emulation.  Other plugins may read the value of the parameters while running.&lt;br /&gt;
&lt;br /&gt;
=== Audio-SDL ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|M64TYPE_FLOAT&lt;br /&gt;
|Mupen64Plus Audio SDL config parameter set version number.  Please don&amp;#039;t change.&lt;br /&gt;
|-&lt;br /&gt;
|DEFAULT_FREQUENCY&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Frequency which is used if rom doesn&amp;#039;t want to change it&lt;br /&gt;
|-&lt;br /&gt;
|SWAP_CHANNELS&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Swaps left and right channels&lt;br /&gt;
|-&lt;br /&gt;
|PRIMARY_BUFFER_SIZE&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Size of primary buffer in output samples. This is where audio is loaded after it&amp;#039;s extracted from n64&amp;#039;s memory.&lt;br /&gt;
|-&lt;br /&gt;
|PRIMARY_BUFFER_TARGET&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Fullness level target for Primary audio buffer, in equivalent output samples.&lt;br /&gt;
|-&lt;br /&gt;
|SECONDARY_BUFFER_SIZE&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Size of secondary buffer in samples. This is SDL&amp;#039;s hardware buffer.&lt;br /&gt;
|-&lt;br /&gt;
|RESAMPLE&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Audio resampling algorithm.  &amp;quot;trivial&amp;quot; for fastest, lowest-quality algorithm.  If compiled with SPEEX support, this can be &amp;quot;speex-fixed-0&amp;quot; to &amp;quot;speex-fixed-10&amp;quot;.  If compiled with libsrc support, this can be &amp;quot;src-sinc-best-quality&amp;quot;, &amp;quot;src-sinc-medium-quality&amp;quot;, &amp;quot;src-sinc-fastest&amp;quot;, &amp;quot;src-zero-order-hold&amp;quot;, or &amp;quot;src-linear&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|VOLUME_CONTROL_TYPE&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Volume control type: 1 = SDL (only affects Mupen64Plus output)  2 = OSS mixer (adjusts master PC volume)&lt;br /&gt;
|-&lt;br /&gt;
|VOLUME_ADJUST&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Percentage change each time the volume is increased or decreased&lt;br /&gt;
|-&lt;br /&gt;
|VOLUME_DEFAULT&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Default volume when a game is started.  Only used if VOLUME_CONTROL_TYPE is 1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Video-General ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Fullscreen&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Use fullscreen mode if True, or windowed mode if False&lt;br /&gt;
|-&lt;br /&gt;
|ScreenWidth&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Width of output window or fullscreen width&lt;br /&gt;
|-&lt;br /&gt;
|ScreenHeight&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Height of output window or fullscreen height&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Video-Rice ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|FrameBufferSetting&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Frame Buffer Emulation (0=ROM default, 1=disable)&lt;br /&gt;
|-&lt;br /&gt;
|FrameBufferWriteBackControl&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Frequency to write back the frame buffer (0=every frame, 1=every other frame, etc)&lt;br /&gt;
|-&lt;br /&gt;
|RenderToTexture&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Render-to-texture emulation (0=none, 1=ignore, 2=normal, 3=write back, 4=write back and reload)&lt;br /&gt;
|-&lt;br /&gt;
|ScreenUpdateSetting&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Control when the screen will be updated (0=ROM default, 1=VI origin update, 2=VI origin change, 3=CI change, 4=first CI change, 5=first primitive draw, 6=before screen clear, 7=after screen drawn)&lt;br /&gt;
|-&lt;br /&gt;
|NormalAlphaBlender&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Force to use normal alpha blender&lt;br /&gt;
|-&lt;br /&gt;
|FastTextureLoading&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Use a faster algorithm to speed up texture loading and CRC computation (may break hi-res texture loading)&lt;br /&gt;
|-&lt;br /&gt;
|AccurateTextureMapping&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Use different texture coordinate clamping code&lt;br /&gt;
|-&lt;br /&gt;
|InN64Resolution&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Force emulated frame buffers to be in N64 native resolution&lt;br /&gt;
|-&lt;br /&gt;
|SaveVRAM&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Try to reduce Video RAM usage (should never be used)&lt;br /&gt;
|-&lt;br /&gt;
|DoubleSizeForSmallTxtrBuf&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Enable this option to have better render-to-texture quality&lt;br /&gt;
|-&lt;br /&gt;
|DefaultCombinerDisable&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Force to use normal color combiner&lt;br /&gt;
|-&lt;br /&gt;
|EnableHacks&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Enable game-specific settings from INI file&lt;br /&gt;
|-&lt;br /&gt;
|EnableFog&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Enable or disable fog generation&lt;br /&gt;
|-&lt;br /&gt;
|WinFrameMode&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|If enabled, graphics will be drawn in WinFrame mode instead of solid and texture mode&lt;br /&gt;
|-&lt;br /&gt;
|FullTMEMEmulation&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|N64 Texture Memory Full Emulation (may fix some games, may break others)&lt;br /&gt;
|-&lt;br /&gt;
|OpenGLVertexClipper&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Enable vertex clipper for fog operations&lt;br /&gt;
|-&lt;br /&gt;
|EnableSSE&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Enable SSE optimizations for capable CPUs&lt;br /&gt;
|-&lt;br /&gt;
|EnableVertexShader&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Use GPU vertex shader&lt;br /&gt;
|-&lt;br /&gt;
|SkipFrame&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|If this option is enabled, the plugin will skip every other frame&lt;br /&gt;
|-&lt;br /&gt;
|TexRectOnly&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|If enabled, texture enhancement will be done only for TxtRect ucode&lt;br /&gt;
|-&lt;br /&gt;
|SmallTextureOnly&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|If enabled, texture enhancement will be done only for textures width+height&amp;lt;=128&lt;br /&gt;
|-&lt;br /&gt;
|LoadHiResTextures&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Enable hi-resolution texture file loading&lt;br /&gt;
|-&lt;br /&gt;
|LoadHiResCRCOnly&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Filter hi-resolution texture filenames based only on the CRC and ignore format+size tags (Glide64 compatibility)&lt;br /&gt;
|-&lt;br /&gt;
|DumpTexturesToFiles&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Enable texture dumping&lt;br /&gt;
|-&lt;br /&gt;
|ShowFPS&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Display On-screen FPS&lt;br /&gt;
|-&lt;br /&gt;
|FogMethod&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Enable, Disable or Force fog generation (0=Disable, 1=Enable n64 choose, 2=Force Fog)&lt;br /&gt;
|-&lt;br /&gt;
|Mipmapping&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Use Mipmapping? 0=no, 1=nearest, 2=bilinear, 3=trilinear&lt;br /&gt;
|-&lt;br /&gt;
|MultiSampling&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Enable/Disable MultiSampling (0=off, 2,4,8,16=quality)&lt;br /&gt;
|-&lt;br /&gt;
|TextureEnhancement&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Primary texture filter (0=None, 1=2X, 2=2XSAI, 3=HQ2X, 4=LQ2X, 5=HQ4X, 6=Sharpen, 7=Sharpen More, 8=External, 9=Mirrored)&lt;br /&gt;
|-&lt;br /&gt;
|TextureEnhancementControl&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Secondary texture filter (0 = none, 1-4 = filtered)&lt;br /&gt;
|-&lt;br /&gt;
|ForceTextureFilter&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Force to use texture filtering or not (0=auto: n64 choose, 1=force no filtering, 2=force filtering)&lt;br /&gt;
|-&lt;br /&gt;
|TextureQuality&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Color bit depth to use for textures (0=default, 1=32 bits, 2=16 bits&lt;br /&gt;
|-&lt;br /&gt;
|OpenGLDepthBufferSetting&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Z-buffer depth (only 16 or 32)&lt;br /&gt;
|-&lt;br /&gt;
|ColorQuality&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Color bit depth for rendering window (0=32 bits, 1=16 bits)&lt;br /&gt;
|-&lt;br /&gt;
|OpenGLRenderSetting&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|OpenGL rendering level to support (0=auto, 1=OGL_1.1, 2=OGL_1.2, 3=OGL_1.3, 4=OGL_1.4, 5=OGL_1.4_V2, 6=OGL_TNT2, 7=NVIDIA_OGL, 8=OGL_FRAGMENT_PROGRAM)&lt;br /&gt;
|-&lt;br /&gt;
|AnisotropicFiltering&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Enable/Disable Anisotropic Filtering for Mipmapping (0=no filtering, 2-16=quality). This is uneffective if EnableMipmapping is false. If the given value is to high to be supported by your graphic card, the value will be the highest value your graphic card can support. Better result with Trilinear filtering&lt;br /&gt;
|-&lt;br /&gt;
|ForcePolygonOffset&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|If true, use polygon offset values specified below (default=False).  This can be used to eliminate stitching artifacts in textures and shadows, which are typically only a problem in mobile/embedded platforms (e.g. Android), where chipsets are inconsistent in their implementation of glPolygonOffset.&lt;br /&gt;
|-&lt;br /&gt;
|PolygonOffsetFactor&lt;br /&gt;
|M64TYPE_FLOAT&lt;br /&gt;
|Specifies a scale factor that is used to create a variable depth offset for each polygon.  Ignored if ForcePolygonOffset is False, and typically only relevant for mobile/embedded platforms.  This value is typically equal to PolygonOffsetUnits, and is found through trial and error.  Mario&amp;#039;s shadow in Super Mario 64 is a good test case when tuning this value.  If the shadow flickers, use a larger magnitude for the float settings. Do not use a larger value than necessary to eliminate artifacts. As a guideline, typical values for mobile chipsets circa 2012-2014 are positive or negative values in the range 0.001 to 2.&lt;br /&gt;
|-&lt;br /&gt;
|PolygonOffsetUnits&lt;br /&gt;
|M64TYPE_FLOAT&lt;br /&gt;
|Is multiplied by an implementation-specific value to create a constant depth offset.  Ignored if ForcePolygonOffset is False, and typically only relevant for mobile/embedded platforms.  This value is typically equal to PolygonOffsetFactor, and is found through trial and error.  Mario&amp;#039;s shadow in Super Mario 64 is a good test case when tuning this value.  If the shadow flickers, use a larger magnitude for the float settings. Do not use a larger value than necessary to eliminate artifacts. As a guideline, typical values for mobile chipsets circa 2012-2014 are positive or negative values in the range 0.001 to 2.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Input-SDL ===&lt;br /&gt;
&lt;br /&gt;
The Mupen64Plus-Input-SDL plugin uses a separate config section for each simulated N64 controller.  The sections are named: &amp;lt;tt&amp;gt;Input-SDL-Control1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Input-SDL-Control2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Input-SDL-Control3&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;Input-SDL-Control4&amp;lt;/tt&amp;gt;.  The 4 sections all contain the same parameters.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;General-purpose Controller Configuration Parameters&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|version&lt;br /&gt;
|M64TYPE_FLOAT&lt;br /&gt;
|Mupen64Plus Input-SDL config parameter set version number.  Please don&amp;#039;t change.&lt;br /&gt;
|-&lt;br /&gt;
|mode&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Controller configuration mode: 0=Fully Manual, 1=Auto with named SDL Device, 2=Fully automatic&lt;br /&gt;
|-&lt;br /&gt;
|device&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Specifies which joystick is bound to this controller: -1=No joystick, 0 or more= SDL Joystick number&lt;br /&gt;
|-&lt;br /&gt;
|name&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|SDL joystick name (or Keyboard)&lt;br /&gt;
|-&lt;br /&gt;
|plugged&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Specifies whether this controller is &amp;#039;plugged in&amp;#039; to the simulated N64&lt;br /&gt;
|-&lt;br /&gt;
|plugin&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Specifies which type of expansion pak is in the controller: 1=None, 2=Mem pak, 5=Rumble pak&lt;br /&gt;
|-&lt;br /&gt;
|mouse&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|If True, then mouse buttons may be used with this controller, and mouse movement will map to X/Y analog stick&lt;br /&gt;
|-&lt;br /&gt;
|MouseSensitivity&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|The sensitivity coefficients for the mouse to move the N64 controller axis value from 0.  For X, Y axes.  Values must be positive.&lt;br /&gt;
|-&lt;br /&gt;
|AnalogDeadzone&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|The minimum absolute value of the SDL analog joystick axis to move the N64 controller axis value from 0.  For X, Y axes.&lt;br /&gt;
|-&lt;br /&gt;
|AnalogPeak&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|An absolute value of the SDL joystick axis &amp;gt;= AnalogPeak will saturate the N64 controller axis value (at 80).  For X, Y axes. For each axis, this must be greater than the corresponding AnalogDeadzone value&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Digital Controller Configuration&amp;lt;/b&amp;gt;&lt;br /&gt;
These parameters are used to bind input events with N64 Controller button presses.  There are 14 simulated buttons and 2 special buttons for switching between the Mem Pak and Rumble Pak expansion units.  Each configuration parameter is a string which specifies input events which will map to the given N64 button.  The configuration strings consist of zero or more input event words.  A list of available input event words is given here:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Input Event Word!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;key(&amp;amp;lt;keysym&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;keysym&amp;amp;gt; = SDLK_* key symbol enumerated type&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;button(&amp;amp;lt;num&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;num&amp;amp;gt; = SDL Joystick Button Number (0 or greater)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;axis(&amp;amp;lt;num&amp;amp;gt;&amp;amp;lt;dir&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;num&amp;amp;gt; = SDL Joystick Axis Number, &amp;amp;lt;dir&amp;amp;gt; = axis direction (+ = positive, - = negative)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;axis(&amp;amp;lt;num&amp;amp;gt;&amp;amp;lt;dir&amp;amp;gt;,&amp;amp;lt;deadzone&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;num&amp;amp;gt; = SDL Joystick Axis Number, &amp;amp;lt;dir&amp;amp;gt; = axis direction (+ = positive, - = negative), &amp;amp;lt;deadzone&amp;amp;gt; = minimum axis value (max 32767) to activate button; default 6000&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;hat(&amp;amp;lt;num&amp;amp;gt; &amp;amp;lt;dir&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;num&amp;amp;gt; = SDL Joystick Hat Number, &amp;amp;lt;dir&amp;amp;gt; = hat direction (Up, Down, Left, or Right)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;mouse(&amp;amp;lt;num&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;num&amp;amp;gt; = mouse button number (1 = left button, 2 = middle, 3 = right, etc)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|DPad R&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Right button on the D-pad&lt;br /&gt;
|-&lt;br /&gt;
|DPad L&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Left button on the D-pad&lt;br /&gt;
|-&lt;br /&gt;
|DPad D&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Down button on the D-pad&lt;br /&gt;
|-&lt;br /&gt;
|DPad U&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Up button on the D-pad&lt;br /&gt;
|-&lt;br /&gt;
|Start&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Start button&lt;br /&gt;
|-&lt;br /&gt;
|Z Trig&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Z trigger&lt;br /&gt;
|-&lt;br /&gt;
|B Button&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the &amp;quot;B&amp;quot; button&lt;br /&gt;
|-&lt;br /&gt;
|A Button&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the &amp;quot;A&amp;quot; button&lt;br /&gt;
|-&lt;br /&gt;
|C Button R&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Right &amp;quot;C&amp;quot; button&lt;br /&gt;
|-&lt;br /&gt;
|C Button L&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Left &amp;quot;C&amp;quot; button&lt;br /&gt;
|-&lt;br /&gt;
|C Button D&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Down &amp;quot;C&amp;quot; button&lt;br /&gt;
|-&lt;br /&gt;
|C Button U&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Up &amp;quot;C&amp;quot; button&lt;br /&gt;
|-&lt;br /&gt;
|R Trig&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Right trigger&lt;br /&gt;
|-&lt;br /&gt;
|L Trig&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Left trigger&lt;br /&gt;
|-&lt;br /&gt;
|Mempak switch&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for toggling the Memory Pak unit&lt;br /&gt;
|-&lt;br /&gt;
|Rumblepak switch&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for toggling the Rumble Pak unit&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Analog Controller Configuration&amp;lt;/b&amp;gt;&lt;br /&gt;
These parameters are used to bind input events with N64 Controller analog stick movements.  There are only 2 analog stick axes, X and Y.  Each configuration parameter is a string which specifies input events which will map to the given N64 controller axis movement.  The configuration strings consist of zero or more input event words.  A list of available input event words is given here:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Input Event Word!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;key(&amp;amp;lt;key_a&amp;amp;gt;,&amp;amp;lt;key_b&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;key_a&amp;amp;gt; = SDLK_* key symbol for up/left movement. &amp;amp;lt;key_b&amp;amp;gt; = SDLK_* key symbol for down/right movement.  The strength of these movements can be modulated with the Right-Shift and Right-Control keys.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;button(&amp;amp;lt;num_a&amp;amp;gt;,&amp;amp;lt;num_b&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;num_a&amp;amp;gt; = SDL Joystick Button Number for up/left movement. &amp;amp;lt;num_b&amp;amp;gt; = SDL Joystick Button Number for down/right movement.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;axis(&amp;amp;lt;num_a&amp;amp;gt;&amp;amp;lt;dir_a&amp;amp;gt;,&amp;amp;lt;num_b&amp;amp;gt;&amp;amp;lt;dir_b&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;num_a&amp;amp;gt; = SDL Joystick Axis Number for up/left movement, &amp;amp;lt;dir_a&amp;amp;gt; = axis direction for up/left movement (+ = positive, - = negative). &amp;amp;lt;num_b&amp;amp;gt; = SDL Joystick Axis Number for down/right movement, &amp;amp;lt;dir_b&amp;amp;gt; = axis direction for down/right movement.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;hat(&amp;amp;lt;num&amp;amp;gt; &amp;amp;lt;dir_a&amp;amp;gt; &amp;amp;lt;dir_b&amp;amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;amp;lt;num&amp;amp;gt; = SDL Joystick Hat Number, &amp;amp;lt;dir_a&amp;amp;gt; = hat direction for up/left movement (Up, Down, Left, or Right), &amp;amp;lt;dir_b&amp;amp;gt; = hat direction for right/down movement&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Y Axis&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the Y axis (up/down) of the analog stick&lt;br /&gt;
|-&lt;br /&gt;
|X Axis&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Input event string for mapping the X axis (left/right) of the analog stick&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Teclado_Mupen64Plus_Inukaze.png&amp;diff=100</id>
		<title>File:Teclado Mupen64Plus Inukaze.png</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Teclado_Mupen64Plus_Inukaze.png&amp;diff=100"/>
		<updated>2020-09-17T06:17:36Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Richard42 uploaded a new version of &amp;amp;quot;File:Teclado Mupen64Plus Inukaze.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SDL2 keycodes (Spanish)&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=KeyboardSetup&amp;diff=99</id>
		<title>KeyboardSetup</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=KeyboardSetup&amp;diff=99"/>
		<updated>2020-09-05T06:26:11Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===1. Default Key Commands In Emulator Core===&lt;br /&gt;
&lt;br /&gt;
The emulator core supports key commands for many functions.  The default key bindings are given below, but may be changed by editing the configuration file as described later in this document.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Key&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Escape || Quit the emulator&lt;br /&gt;
|-&lt;br /&gt;
|0-9 || Select virtual &amp;#039;slot&amp;#039; for save/load state (F5 and F7) commands&lt;br /&gt;
|-&lt;br /&gt;
|F5 || Save emulator state&lt;br /&gt;
|-&lt;br /&gt;
|F7 || Load emulator state&lt;br /&gt;
|-&lt;br /&gt;
|F9 || Reset emulator&lt;br /&gt;
|-&lt;br /&gt;
|F10 || slow down emulator by 5%&lt;br /&gt;
|-&lt;br /&gt;
|F11 || speed up emulator by 5%&lt;br /&gt;
|-&lt;br /&gt;
|F12 || take screenshot&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Enter || Toggle between windowed and fullscreen&lt;br /&gt;
|-&lt;br /&gt;
|p or P || Pause on/off&lt;br /&gt;
|-&lt;br /&gt;
|m or M || Mute/unmute sound&lt;br /&gt;
|-&lt;br /&gt;
|g or G || Press &amp;quot;Game Shark&amp;quot; button (only if cheats are enabled)&lt;br /&gt;
|-&lt;br /&gt;
|/ or ? || single frame advance while paused&lt;br /&gt;
|-&lt;br /&gt;
|F || Fast Forward (playback at 250% normal speed while F key is pressed)&lt;br /&gt;
|-&lt;br /&gt;
|[ || Decrease volume&lt;br /&gt;
|-&lt;br /&gt;
|] || Increase volume&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===2. Default Key Mappings for SDL-Input Plugin===&lt;br /&gt;
&lt;br /&gt;
The keys or joystick/mouse inputs which will be mapped to the N64 controller for playing the games are determined by the input plugin.  The SDL-Input plugin contains an auto-configuration function which will provide default joystick mappings for any recognized joystick.  If there is no supported joystick connected, the input plugin will enable a default keyboard control mapping, as given below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;N64 Controller Action&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Analog Pad || Arrow Keys (left, right, down, up)&lt;br /&gt;
|-&lt;br /&gt;
|C Up/Left/Down/Right || &amp;quot;I&amp;quot;, &amp;quot;J&amp;quot;, &amp;quot;K&amp;quot;, &amp;quot;L&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|DPad Up/Left/Down/Right || &amp;quot;W&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;D&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Z trigger || &amp;quot;z&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Left trigger || &amp;quot;x&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Right trigger || &amp;quot;c&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Start || &amp;quot;Enter&amp;quot; (&amp;quot;Return&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|A button || &amp;quot;left shift&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|B button || &amp;quot;left control&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Select Mempack || &amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Select Rumblepack || &amp;quot;.&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:keyboardMupen64Plus.png]]&lt;br /&gt;
&lt;br /&gt;
When using the keyboard, the analog stick is normally moved by its full range when you press an arrow key.  Sometimes you may need to make smaller moves.  In this case, you can move the analog stick more gently by holding down the Right Control key (for -50%) or Right Shift key (-25%), or both (-75%).&lt;br /&gt;
&lt;br /&gt;
===3. Configuration for Key Commands===&lt;br /&gt;
&lt;br /&gt;
You may set your own key bindings for the emulator core and input plugins, by editing the Mupen64Plus config file.  On Linux or OSX, this is located at &amp;lt;code&amp;gt;~/.config/mupen64plus/&amp;lt;/code&amp;gt;, and on Windows it is in the &amp;quot;Application Data&amp;quot; sub-folder of your user folder.  On Windows XP and prior, this is &amp;lt;code&amp;gt;C:\Documents and Settings\username\Application Data\Mupen64Plus\&amp;lt;/code&amp;gt;, while on Windows Visa and newer this is &amp;lt;code&amp;gt;C:\Users\username\AppData\Mupen64Plus&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
See http://www.libsdl.org/release/SDL-1.2.15/include/SDL_keysym.h for Key IDs.&lt;br /&gt;
&lt;br /&gt;
For documentation about the keyboard settings in this configuration file, refer to our Emuwiki site.  The [[Mupen64Plus_Core_Parameters|Core Parameters]] page gives the names of the config parameters to set up the Emulator Core key commands, while the [[Mupen64Plus_Plugin_Parameters#Input-SDL|Plugin Parameters]] page tells how to configure the controls for the input plugin.&lt;br /&gt;
&lt;br /&gt;
===4. SDL2 Keyboard configuration and layout (Spanish)===&lt;br /&gt;
&lt;br /&gt;
Emulador : Solo puedes asignarle una tecla a cada función.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Nombre de la Función&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Tecla&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Valor SDL&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Stop || ESC || &amp;quot;key(27)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Fullscreen || F6 || &amp;quot;key(287)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Save State || F5 || &amp;quot;key(286)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Load State || 288 || &amp;quot;key(F7)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Increment Slot || ¡ || &amp;quot;key(161)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Reset || F9 || &amp;quot;key(290)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Speed Down || F10 || &amp;quot;key(291)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Speed Up || F11 || &amp;quot;key(292)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Screenshot || F12 || &amp;quot;key(293)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Pause || P || &amp;quot;key(112)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Mute || M || &amp;quot;key(109)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Increase Volume || + || &amp;quot;key(43)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Decrease Volume || - || &amp;quot;key(45)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Fast Forward || F || &amp;quot;key(102)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Frame Advance || TAB || &amp;quot;key(9)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Gameshark || G || &amp;quot;key(103)&amp;quot;&lt;br /&gt;
|}		&lt;br /&gt;
&lt;br /&gt;
Control de N64 - Jugador 1 :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Nombre de la Función&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Tecla&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Valor SDL&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|DPad R || D || &amp;quot;key(100)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|DPad L || A || &amp;quot;key(97)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|DPad D || S || &amp;quot;key(115)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|DPad U || W || &amp;quot;key(119)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Start || ENTRAR || &amp;quot;key(13)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Z Trig || Z / Ratón Botón Izquierdo || &amp;quot;&amp;quot;key(122)&amp;quot;, mouse(1)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|B Button || CTRL IZQ / Ratón Botón Derecho || &amp;quot;&amp;quot;key(306)&amp;quot;, mouse(3)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|A Button || MAYUS DER || &amp;quot;key(304)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|C Button R || L || &amp;quot;key(108)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|C Button L || J || &amp;quot;key(106)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|C Button D || K || &amp;quot;key(107)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|C Button U || I || &amp;quot;key(105)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|R Trig || C || &amp;quot;key(99)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|L Trig || X || &amp;quot;key(120)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Mempak switch || , (COMA) || &amp;quot;key(44)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Rumblepak switch || . (PUNTO) || &amp;quot;key(46)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|X Axis || IZQUIERDA &amp;amp; DERECHA Analogos || &amp;quot;&amp;quot;key(276,275)&amp;quot;, axis(0-,0+)&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Y Axis || ARRIBA &amp;amp; ABAJO Análogos || &amp;quot;&amp;quot;key(273,274)&amp;quot;, axis(1-,1+)&amp;quot;&lt;br /&gt;
|}		&lt;br /&gt;
&lt;br /&gt;
[[File:Teclado_Mupen64Plus_Inukaze.png]]&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Teclado_Mupen64Plus_Inukaze.png&amp;diff=98</id>
		<title>File:Teclado Mupen64Plus Inukaze.png</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Teclado_Mupen64Plus_Inukaze.png&amp;diff=98"/>
		<updated>2020-09-05T06:15:47Z</updated>

		<summary type="html">&lt;p&gt;Richard42: SDL2 keycodes (Spanish)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SDL2 keycodes (Spanish)&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Config&amp;diff=97</id>
		<title>Mupen64Plus v2.0 Core Config</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Config&amp;diff=97"/>
		<updated>2020-06-28T18:24:17Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Mupen64Plus v2.0 Configuration API =&lt;br /&gt;
&lt;br /&gt;
Most libmupen64plus functions return an &amp;lt;tt&amp;gt;m64p_error&amp;lt;/tt&amp;gt; return code, which is an enumerated type defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]].  Front-end code should check the return value of each call to a libmupen64plus function.&lt;br /&gt;
&lt;br /&gt;
== Selector Functions ==&lt;br /&gt;
These functions are used by the front-end to discover the sections in the configuration file, open a section, discover parameters within a section, and find out if a section has been changed.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigListSections(void *context, void (*SectionListCallback)(void * context, const char * SectionName))&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;context&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Void pointer to be passed to the SectionListCallback function&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionListCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to function in front-end for receiving the name of every section in the Mupen64Plus Core configuration data.  This function will be called once for each section in the core configuration data structure, and then the ConfigListSections() function will return.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionListCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointer cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is called to enumerate the list of Sections in the Mupen64Plus Core configuration file.  It is expected that there will be a section named &amp;quot;Core&amp;quot; for core-specific configuration data, &amp;quot;Graphics&amp;quot; for common graphics options, and one section for each plugin library.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigOpenSection(const char *SectionName, m64p_handle *ConfigSectionHandle)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to open.  This name is case-insensitive.  If no section exists with the given name, a new one will be created with no parameters.  This name may consist of any ASCII characters between 32 and 127 except brackets &amp;quot;[]&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This is a handle (defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]]) which is required to be used for subsequent calls to core configuration functions to list, retrieve, or set configuration parameters.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to give a configuration section handle to the front-end which may be used to read or write configuration parameter values in a given section of the configuration file.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigListParameters(m64p_handle ConfigSectionHandle, void *context, void (*ParameterListCallback)(void * context, const char *ParamName, m64p_type ParamType))&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;context&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Void pointer to be passed to the ParameterListCallback function&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParameterListCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to function in front-end for receiving the name of every parameter in the given section of the Mupen64Plus Core configuration data.  This function will be called once for each parameter in the section, and then the ConfigListParameters() function will return.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParameterListCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is called to enumerate the list of Parameters in a given Section of the Mupen64Plus Core configuration file.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;int ConfigHasUnsavedChanges(const char *SectionName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to check for unsaved changes.  This name is case-insensitive.  If this pointer is NULL or points to an empty string, then all sections are checked.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&amp;lt;br /&amp;gt;&lt;br /&gt;
This function was added in the Config API version 2.2.0.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is called to determine if a given Section (or all sections) of the Mupen64Plus Core configuration file has been modified since it was last saved.  A return value of 0 means there are no unsaved changes, while a 1 will be returned if there are unsaved changes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modifier Functions ==&lt;br /&gt;
These functions are used for deleting parts of the configuration list or saving the configuration data to disk.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigDeleteSection(const char *SectionName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to delete.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except brackets &amp;quot;[]&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function deletes a section from the Mupen64Plus configuration data.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSaveFile(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function saves the Mupen64Plus configuration file to disk.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSaveSection(const char *SectionName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to save.  This name is case-insensitive.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The named section must exist in the current configuration.&amp;lt;br /&amp;gt;&lt;br /&gt;
This function was added in the Config API version 2.1.0.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function saves one section of the current Mupen64Plus configuration to disk, while leaving the other sections unmodified.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigRevertChanges(const char *SectionName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to modify.  This name is case-insensitive.  This pointer cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The named section must exist in the current configuration.&amp;lt;br /&amp;gt;&lt;br /&gt;
This function was added in the Config API version 2.2.0.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function reverts changes previously made to one section of the current Mupen64Plus configuration file, so that it will match with the configuration at the last time that it was loaded from or saved to disk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Generic Get/Set Functions ==&lt;br /&gt;
These functions should be used for reading or writing configuration values in most cases.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetParameter(m64p_handle ConfigSectionHandle, const char *ParamName, m64p_type ParamType, const void *ParamValue)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being set.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_type&amp;lt;/tt&amp;gt; value giving the type of the data object that &amp;#039;&amp;#039;&amp;#039;ParamValue&amp;#039;&amp;#039;&amp;#039; points to.  If this is different from the native data representation used by the core, it will be converted into the type used by the core.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to data object containing the value of the parameter to be set.&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function sets the value of one of the emulator&amp;#039;s configuration parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetParameterHelp(m64p_handle ConfigSectionHandle, const char *ParamName, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose help string is being set.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamHelp&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing some human-readable information about the usage of this parameter.  Can be NULL.&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function sets the help string of one of the emulator&amp;#039;s configuration parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigGetParameter(m64p_handle ConfigSectionHandle, const char *ParamName, m64p_type ParamType, void *ParamValue, int MaxSize)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being retrieved.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_type&amp;lt;/tt&amp;gt; value giving the type of the data object that &amp;#039;&amp;#039;&amp;#039;ParamValue&amp;#039;&amp;#039;&amp;#039; points to.  If this is different from the native data representation used by the core, it will be converted into the type given by &amp;#039;&amp;#039;&amp;#039;ParamType&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to data object to receive the value of the parameter being retrieved.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;MaxSize&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Size (in bytes) of the data object that &amp;#039;&amp;#039;&amp;#039;ParamValue&amp;#039;&amp;#039;&amp;#039; points to.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function retrieves the value of one of the emulator&amp;#039;s parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigExternalOpen(const char *FileName, m64p_handle *Handle)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|M64ERR_SUCCESS if the config file was successfully opened.&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;FileName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; The path to the config file.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Handle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; A pointer to a &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function. &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;FileName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function opens an external config file and reads the contents into memory.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigExternalClose(m64p_handle Handle)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|M64ERR_SUCCESS if the config file was successfully closed.&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Handle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; A &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; that was previously passed to ConfigExternalOpen().&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function. &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Handle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; should have already been passed to ConfigExternalOpen().&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function opens an external config file and reads the contents into memory.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigExternalGetParameter(m64p_handle Handle, const char *SectionName, const char *ParamName, char* ParamPtr, int ParamMaxLength)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|M64ERR_SUCCESS if ParamName was found and ParamPtr is populated with the result.&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Handle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; A &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; that was previously passed to ConfigExternalOpen().&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the section to retrieve the parameter from.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being retrieved.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An allocated char array that is at least as large as ParamMaxLength. The result, if found will be copied into this array.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamMaxLength&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; The maximum number of bytes to be copied into ParamPtr.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function. &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Handle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; should have already been passed to ConfigExternalOpen. The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL. ParamPtr must be a pre-allocated char array that is at least as large as ParamMaxLength.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This functions allows a plugin to leverage the built-in ini parser to read any cfg/ini file.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigGetParameterType(m64p_handle ConfigSectionHandle, const char *ParamName, m64p_type *ParamType)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to a NULL-terminated string containing the name of the parameter whose type is being retrieved.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an &amp;lt;tt&amp;gt;m64p_type&amp;lt;/tt&amp;gt; value to receive the type of the parameter indicated by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function retrieves the type of one of the emulator&amp;#039;s parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.  If there is no parameter with the given &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, the error &amp;lt;tt&amp;gt;M64ERR_INPUT_NOT_FOUND&amp;lt;/tt&amp;gt; will be returned.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetParameterHelp(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing usage information for the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; parameter.  May be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter for which usage information is being retrieved.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function retrieves the help information about one of the emulator&amp;#039;s parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Special Get/Set Functions ==&lt;br /&gt;
These parameterized Get/SetDefault functions are provided for simplifying the task of handling default values within a single module.  Each code module using the Core&amp;#039;s configuration API should set the default values for all configuration parameters used by that module during its Startup() function.  This allows the software to set up the default values automatically rather than storing them in a separate &amp;quot;default config file&amp;quot; which has proven problematic in the past.  This also solves the problem which occurs when an upgraded module contains a new config parameter not present in the previous release.&lt;br /&gt;
&lt;br /&gt;
The special Get functions return the configuration value directly rather than writing them through a pointer and returning an error code.  For this reason, these parameterized Get functions should only be used within a module which &amp;#039;owns&amp;#039; the configuration section and set up its default values in the Startup() function.  Because these functions cannot signal an error to the caller, a front-end should not use these functions to retrieve configuration values for the core or the plugins, unless the names of the parameters have been enumerated with &amp;lt;tt&amp;gt;ConfigListParameters&amp;lt;/tt&amp;gt; and are therefore guaranteed to exist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetDefaultInt(m64p_handle ConfigSectionHandle, const char *ParamName, int ParamValue, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetDefaultFloat(m64p_handle ConfigSectionHandle, const char *ParamName, float ParamValue, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetDefaultBool(m64p_handle ConfigSectionHandle, const char *ParamName, int ParamValue, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetDefaultString(m64p_handle ConfigSectionHandle, const char *ParamName, const char * ParamValue, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being set.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Integer or null-terminated string pointer containing the value of the parameter to be set.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamHelp&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing some human-readable information about the usage of this parameter.  Can be NULL.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to set the value of a configuration parameter if it is not already present in the configuration file.  This may happen if a new user runs the emulator, or an upgraded module uses a new parameter, or the user deletes his or her configuration file.  If a parameter named &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is already present in the given section of the configuration file, then no action will be taken and this function will return successfully.  Otherwise, a new parameter will be created its value will be assigned to &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigGetParamInt(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigGetParamFloat(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigGetParamBool(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char *&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigGetParamString(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being retrieved.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function retrieves the value of one of the emulator&amp;#039;s parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, and returns the value directly to the calling function.  If an errors occurs (such as if &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is invalid, or there is no configuration parameter named &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;), then an error will be sent to the front-end via the &amp;lt;tt&amp;gt;DebugCallback()&amp;lt;/tt&amp;gt; function, and either a 0 (zero) or an empty string will be returned.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OS-Abstraction Functions ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetSharedDataFilepath(const char *filename)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing a full directory path and filename to a given shared data file, or NULL if this file was not found.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|It is common for shared data files on Unix systems to be installed in different places on different systems.  Therefore, this core function is provided to allow a plugin to retrieve a full pathname to a given shared data file.  This type of file is intended to be shared among multiple users on a system, so it is likely to be read-only.  Examples of these types of files include: the .ini files for Rice Video and Glide64, the font and Mupen64Plus.ini files for the core, and the cheat code files for the front-end.  This function will first search in a directory given via the &amp;lt;tt&amp;gt;DataPath&amp;lt;/tt&amp;gt; parameter to the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;CoreStartup&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function, then in a directory given by the &amp;lt;tt&amp;gt;SharedDataPath&amp;lt;/tt&amp;gt; core configuration parameter, then in a directory which may be supplied at compile time through a Makefile or configure script option, and finally in some common system locations (such as /usr/share/mupen64plus and /usr/local/share/mupen64plus on Unix systems).&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetUserConfigPath(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing the directory path to user-specific configuration files.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function may be used by the plugins or front-end to get a path to the directory for storing user-specific configuration files.  This will be the directory where the configuration file &amp;quot;mupen64plus.cfg&amp;quot; is located.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetUserDataPath(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing the directory path to user-specific data files.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function may be used by the plugins or front-end to get a path to the directory for storing user-specific data files.  This may be used to store files such as screenshots, saved game states, or hi-res textures.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetUserCachePath(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing the directory path to user-specific caching data files.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function may be used by the plugins or front-end to get a path to the directory for storing user-specific caching data files.  Files in this directory may be deleted by the user to save space, so critical information should not be stored here.  This directory may be used to store files such as the ROM browser cache.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Netplay_Protocol&amp;diff=96</id>
		<title>Mupen64Plus v2.0 Core Netplay Protocol</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Netplay_Protocol&amp;diff=96"/>
		<updated>2020-06-28T18:21:12Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Created page with &amp;quot;Mupen64Plus v2.0 API  = Mupen64Plus Netplay Protocol =  The Mupen64Plus netplay protocol is based on a client/server architecture. It suppor...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Mupen64Plus Netplay Protocol =&lt;br /&gt;
&lt;br /&gt;
The Mupen64Plus netplay protocol is based on a client/server architecture. It supports syncing core settings and save files. It also supports raw input (tested with Raphnet input plugin).&lt;br /&gt;
TCP is used to deal with player registration, and syncing settings and saves.&lt;br /&gt;
UDP is used to transfer key input data.&lt;br /&gt;
Data is sent in Network Byte Order (Big Endian).&lt;br /&gt;
&lt;br /&gt;
The server is responsible for maintaining healthy buffers and also for detecting desyncs. The server is the source of truth for input data (for instance, when player 1 pushes &amp;quot;A&amp;quot;, it sends that information to the server via UDP. That &amp;quot;A&amp;quot; is not registered as input for player 1 until the client receives a packet from the server indicating what input frame to register that &amp;quot;A&amp;quot; in)&lt;br /&gt;
&lt;br /&gt;
== UDP Packet formats ==&lt;br /&gt;
* Request input for a player (sent by client):&lt;br /&gt;
** 12 bytes&lt;br /&gt;
** byte[0] = 2&lt;br /&gt;
** byte[1] = player number (this is the player we need key inputs for)&lt;br /&gt;
** byte[2-5] = client registration ID&lt;br /&gt;
** byte[6-9] = current event count&lt;br /&gt;
** byte[10] = whether client is a spectator&lt;br /&gt;
** byte[11] = local buffer size of the client&lt;br /&gt;
&lt;br /&gt;
* Key input data (sent by server):&lt;br /&gt;
** Variable length, payload cannot be larger than 512 bytes&lt;br /&gt;
** byte[0] = 1&lt;br /&gt;
** byte[1] = player number the key inputs pertain to&lt;br /&gt;
** byte[2] = current status. Bit 0 indicates whether the game has desynced (1 means desync). Bits 1-4 indicate whether a player has disconnected (for instance, if bit 2 is set, that means player 2 has disconnected). Bits 5-7 are currently unused.&lt;br /&gt;
** byte[3] = how far we lag behind the lead player&lt;br /&gt;
** byte[4] = number of events in this packet&lt;br /&gt;
** The following items will repeat/loop for the number of events in the packet&lt;br /&gt;
*** byte[5-8] = event count&lt;br /&gt;
*** byte[9-12] = key input data&lt;br /&gt;
*** byte[13] = current plugin&lt;br /&gt;
&lt;br /&gt;
* Key input data (sent by client):&lt;br /&gt;
** 11 bytes&lt;br /&gt;
** byte[0] = 0&lt;br /&gt;
** byte[1] = player number&lt;br /&gt;
** byte[2-5] = current event count&lt;br /&gt;
** byte[6-9] = key input data&lt;br /&gt;
** byte[10] = current plugin&lt;br /&gt;
&lt;br /&gt;
* Client sync data (sent by client):&lt;br /&gt;
** 133 bytes&lt;br /&gt;
** byte[0] = 4&lt;br /&gt;
** byte[1-4] = current VI count&lt;br /&gt;
** byte[5-132] = CP0 registers&lt;br /&gt;
&lt;br /&gt;
== TCP Packet formats ==&lt;br /&gt;
* Player disconnection notice (sent by client):&lt;br /&gt;
** 5 bytes&lt;br /&gt;
** byte[0] = 7&lt;br /&gt;
** byte[1-4] = client registration ID&lt;br /&gt;
&lt;br /&gt;
* Player registration request (sent by client):&lt;br /&gt;
** 8 bytes&lt;br /&gt;
** byte[0] = 5&lt;br /&gt;
** byte[1] = player the client is trying to register&lt;br /&gt;
** byte[2] = plugin for this player&lt;br /&gt;
** byte[3] = whether to use a raw input plugin&lt;br /&gt;
** byte[4-7] = client registration ID&lt;br /&gt;
&lt;br /&gt;
* Player registration response (sent by server):&lt;br /&gt;
** 2 bytes&lt;br /&gt;
** byte[0] = response (1 if registration was successful, 0 otherwise)&lt;br /&gt;
** byte[1] = local buffer target for the client&lt;br /&gt;
&lt;br /&gt;
* Send save file data (sent by client):&lt;br /&gt;
** Variable length&lt;br /&gt;
** byte[0] = 1&lt;br /&gt;
** byte[1 - next &amp;#039;\0&amp;#039;] = file name&lt;br /&gt;
** byte[4 bytes] = size of save file in bytes&lt;br /&gt;
** byte[size of file] = save file data&lt;br /&gt;
&lt;br /&gt;
* Request save file data (sent by client):&lt;br /&gt;
** Variable length&lt;br /&gt;
** byte[0] = 2&lt;br /&gt;
** byte[1 - next &amp;#039;\0&amp;#039;] = file name&lt;br /&gt;
&lt;br /&gt;
* Receive save file data (sent by server):&lt;br /&gt;
** Server responds with this data right after the above request&lt;br /&gt;
** Variable length&lt;br /&gt;
** byte[file size] = save file data&lt;br /&gt;
&lt;br /&gt;
* Send settings (sent by client):&lt;br /&gt;
** 21 bytes&lt;br /&gt;
** byte[0] = 3&lt;br /&gt;
** byte[1-4] = count_per_op&lt;br /&gt;
** byte[5-8] = disable_extra_mem&lt;br /&gt;
** byte[9-12] = si_dma_duration&lt;br /&gt;
** byte[13-16] = emumode&lt;br /&gt;
** byte[17-20] =  no_compiled_jump&lt;br /&gt;
&lt;br /&gt;
* Request settings (sent by client):&lt;br /&gt;
** 1 byte&lt;br /&gt;
** byte[0] = 4&lt;br /&gt;
&lt;br /&gt;
* Send settings (sent by server):&lt;br /&gt;
** Server responds with this data right after the above request&lt;br /&gt;
** 20 bytes&lt;br /&gt;
** byte[0-3] = count_per_op&lt;br /&gt;
** byte[4-7] = disable_extra_mem&lt;br /&gt;
** byte[8-11] = si_dma_duration&lt;br /&gt;
** byte[12-15] = emumode&lt;br /&gt;
** byte[16-19] = no_compiled_jump&lt;br /&gt;
&lt;br /&gt;
* Request player registration data (sent by client):&lt;br /&gt;
** 1 byte&lt;br /&gt;
** byte[0] = 6&lt;br /&gt;
&lt;br /&gt;
* Send player registration data (sent by server):&lt;br /&gt;
** 24 bytes&lt;br /&gt;
** The following bytes loop 4 times (once for each player)&lt;br /&gt;
*** byte[0-3] = player registration ID&lt;br /&gt;
*** byte[4] = player plugin&lt;br /&gt;
*** byte[5] = whether the player is using raw data input&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_API_v1.0&amp;diff=95</id>
		<title>Mupen64Plus v2.0 Core API v1.0</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_API_v1.0&amp;diff=95"/>
		<updated>2020-06-28T18:18:52Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please note: as of January 2011, this API is a work in progress.&amp;lt;br /&amp;gt;&lt;br /&gt;
The core Mupen64Plus v2.0 modules are complete, but work on GUI front-end applications is ongoing.&lt;br /&gt;
&lt;br /&gt;
To view the design proposal which preceded this API definition, go to [[Mupen64Plus v2.0 Design Proposal 3|Design Proposal 3]].&lt;br /&gt;
&lt;br /&gt;
== New Architecture ==&lt;br /&gt;
&lt;br /&gt;
Earlier versions of Mupen64Plus (and other plugin-based N64 emulators) used a single monolithic application (containing the emulator core) and four plugins.  The plugins were dynamically-loaded libraries, and the application used one plugin of each type: Video, Audio, Input, and RSP.  Each plugin and the application contained its own GUI code for user interface, and each plugin and the application were individually responsible for finding their own data files and finding, loading, parsing, and storing their own configuration data files.&lt;br /&gt;
&lt;br /&gt;
This was an acceptable architecture for emulators which were only designed to run on a single platform (such as Windows), but causes a lot of developer and user headaches when applied to a cross-platform emulator such as Mupen64Plus.  For this reason, we are re-designing the layout of the emulator to solve some of the problems caused by the old architecture.&lt;br /&gt;
&lt;br /&gt;
Under the new architecture, the old monolithic emulator application is split into two parts: a core emulator library and a main application, called the front-end.  The front-end is primarily responsible for the user interface.  All GUI code will be removed from the core and plugin libraries.  The primary function of the core library is to emulate the R4300 CPU and memory system, attaching the plugins to form a full N64 system emulator.  The core library also contains some utility functions which may be used by the front-end and plugins, such as a configuration parameter handler.&lt;br /&gt;
&lt;br /&gt;
== High-level Usage ==&lt;br /&gt;
&lt;br /&gt;
The expected sequence of operations which will be taken by the front-end application are as follows:&lt;br /&gt;
&lt;br /&gt;
# Load core library (libmupen64plus.so) and set function pointers&lt;br /&gt;
# Call &amp;lt;tt&amp;gt;CoreGetVersion&amp;lt;/tt&amp;gt;, check core version and capabilities&lt;br /&gt;
# Call &amp;lt;tt&amp;gt;CoreStartup&amp;lt;/tt&amp;gt; to initialize the core library&lt;br /&gt;
# Load front-end configuration from core config API or through own mechanism&lt;br /&gt;
# Find plugins, open dynamic libraries, call &amp;lt;tt&amp;gt;PluginStartup&amp;lt;/tt&amp;gt; for each&lt;br /&gt;
# Enter message loop for user interaction&lt;br /&gt;
# If user selects ROM and presses Play:&lt;br /&gt;
#* Load and de-compress the ROM&lt;br /&gt;
#* Use &amp;lt;tt&amp;gt;CoreDoCommand&amp;lt;/tt&amp;gt; to open the ROM&lt;br /&gt;
#* Call &amp;lt;tt&amp;gt;CoreAttachPlugin&amp;lt;/tt&amp;gt; to attach selected plugins to core&lt;br /&gt;
#* Use &amp;lt;tt&amp;gt;CoreDoCommand&amp;lt;/tt&amp;gt; to start emulation&lt;br /&gt;
#* When emulation is finished, call &amp;lt;tt&amp;gt;CoreDetachPlugin&amp;lt;/tt&amp;gt; on all plugins, then close the ROM&lt;br /&gt;
&lt;br /&gt;
== Versioning ==&lt;br /&gt;
=== [[Mupen64Plus v2.0 API Versioning|API Versioning Scheme]] ===&lt;br /&gt;
Since the Mupen64Plus emulator comprises 6 different software modules which can be mixed and matched (the front-end app, the core library, and 4 plugins), and the interfaces between these modules change over time, there are many hard-to-diagnose bugs which could show up due to incompatibilities between these different modules.  For this reason, we use a comprehensive versioning scheme which allows any 2 components to determine whether or not they are compatible, and to support forward and backward compatibility as necessary.  This scheme is described in detail in this document.&lt;br /&gt;
&lt;br /&gt;
== Core API ==&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Basic|Basic Core Functions]] ===&lt;br /&gt;
&lt;br /&gt;
These two functions (&amp;lt;tt&amp;gt;PluginGetVersion&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CoreErrorMessage&amp;lt;/tt&amp;gt;) are utility functions and may be called at any time (even before core startup).  These functions are used by both the front-end and the plugins.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Front-End|Front-End Functions]] ===&lt;br /&gt;
&lt;br /&gt;
There are several types of functions here, which are exported from the Core library to be used by the front-end.  There are &amp;#039;housekeeping&amp;#039; functions, for startup and shutdown, and attaching and detaching plugins.  There is also a Command API which is used for many simple functions such as loading, executing, or stopping a ROM.  Finally the Cheat API is here, for adding and removing cheat functions.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Video Extension|Video Extension API]] ===&lt;br /&gt;
&lt;br /&gt;
These functions are exported from the Core library for use by the video plugin.  These functions are used for high-level video setup tasks such as enumerating available screen resolutions, setting the video mode, window caption, OpenGL attributes, and fullscreen mode.  The video extension API allows for the abstraction of these functions away from the hard-coded SDL function calls currently in the video plugins, so that a front-end may override these functions and provide its own video API.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Debugger|Debugger Functions]] ===&lt;br /&gt;
&lt;br /&gt;
These are the debugger functions, which are also called only from the front-end.  Most of these functions will return with an error if the core library was not compiled with the debugger enabled.  A front-end may examine the &amp;lt;tt&amp;gt;Capabilities&amp;lt;/tt&amp;gt; value returned by the &amp;lt;tt&amp;gt;CoreGetVersion&amp;lt;/tt&amp;gt; function to determine if the core library was built with the debugger enabled.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Config|Configuration API]] ===&lt;br /&gt;
&lt;br /&gt;
These configuration functions are exported from the core library and are used by the core and the plugins to store all of their persistent configuration parameters.  The front-end application may also use these functions to store its configuration options, or it may use a different mechanism.  This section also contains two Operating System Abstraction functions.  These functions are used by the core, plugins, and the front-end to find full filepaths to shared data files and user-specific data files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plugin API ==&lt;br /&gt;
=== [[Mupen64Plus v2.0 Plugin API|Plugin API]] ===&lt;br /&gt;
&lt;br /&gt;
This section lists all of the functions which are exported by the plugins.  The front-end application should only use the &amp;lt;tt&amp;gt;PluginStartup&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;PluginShutdown&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;PluginGetVersion&amp;lt;/tt&amp;gt; functions.  All other functions will only be called from the core.&lt;br /&gt;
&lt;br /&gt;
== Netplay ==&lt;br /&gt;
&lt;br /&gt;
Starting with version 2.6, Mupen64Plus has support for playing games with multiple players over a network.  To support this, a few new command types were added to the CoreDoCommand function, as documented in [[Mupen64Plus v2.0 Core Front-End|front-end functions]]. The core handles the network I/O on its own, and the interface for handling netplay from the perspective of the front-end is very high level. The design of the netplay feature is such that a separate piece of server software (not part of Mupen64Plus) is also required. An example of such a server program is available [https://github.com/loganmc10/m64p-netplay-server here] from [https://github.com/loganmc10 loganmc10] on github. A description of the network protocol which is used for communication between the client emulators and the netplay server is available [[Mupen64Plus v2.0 Core Netplay Protocol|here]].&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Front-End&amp;diff=94</id>
		<title>Mupen64Plus v2.0 Core Front-End</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Front-End&amp;diff=94"/>
		<updated>2020-06-28T17:55:59Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Mupen64Plus v2.0 Core&amp;lt;--&amp;gt;Front-End API =&lt;br /&gt;
&lt;br /&gt;
Most libmupen64plus functions return an &amp;lt;tt&amp;gt;m64p_error&amp;lt;/tt&amp;gt; return code, which is an enumerated type defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]].  Front-end code should check the return value of each call to a libmupen64plus function.&lt;br /&gt;
&lt;br /&gt;
== Startup/Shutdown Functions ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreStartup(int APIVersion, const char *ConfigPath, const char *DataPath, void *Context, void (*DebugCallback)(void *Context, int level, const char *message), void *Context2, void (*StateCallback)(void *Context2, m64p_core_param ParamChanged, int NewValue))&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;APIVersion&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Integer containing the version number of the Core API used by the front-end.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigPath&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; File path to folder containing Mupen64Plus.cfg.  Can be NULL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;DataPath&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Folder to search first when looking for shared data files.  Can be NULL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Context&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer which will be passed back to the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;DebugCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.  Can be NULL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;DebugCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to function in front-end for receiving debug information and warnings from the core.  This function must be thread-safe.  Can be NULL.  The value of &amp;lt;tt&amp;gt;level&amp;lt;/tt&amp;gt; is 1 for an error, 2 for a warning, 3 for info, and 4 for verbose info.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Context2&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer which will be passed back to the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;StateCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.  Can be NULL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;StateCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to function in front-end for receiving core state change notifications.  This function must be thread-safe.  Can be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|This function must be called before any other libmupen64plus functions.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function initializes libmupen64plus for use by allocating memory, creating data structures, and loading the configuration file.  If &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigPath&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is NULL, libmupen64plus will search for the configuration file in its usual place (On Linux, in &amp;lt;tt&amp;gt;~/.config/mupen64plus/&amp;lt;/tt&amp;gt;).  This function may return &amp;lt;tt&amp;gt;M64ERR_INCOMPATIBLE&amp;lt;/tt&amp;gt; if older front-end is used with newer core.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreShutdown(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function saves the configuration file, then destroys data structures and releases memory allocated by the core library.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreAttachPlugin(m64p_plugin_type PluginType, m64p_dynlib_handle PluginLibHandle)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;PluginType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Enumerated type specifying the plugin type to attach to the core.  If this type of plugin is currently attached to the core, an error will be returned.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;PluginLibHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Dynamic library handle (defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]]) corresponding with the plugin object to attach.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|Both the core library and the plugin library must already be initialized with the &amp;lt;tt&amp;gt;CoreStartup()/PluginStartup()&amp;lt;/tt&amp;gt; functions, and a ROM must be open.  This function cannot be called while the emulator is running.  The plugins must be attached in the following order: Video, Audio, Input, RSP.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function attaches the given plugin to the emulator core.  There can only be one plugin of each type attached to the core at any given time.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreDetachPlugin(m64p_plugin_type PluginType)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;PluginType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Enumerated type specifying the plugin type to detach from the core.  If no plugin of this type is currently attached to the core, this function will exit with a return value of &amp;lt;tt&amp;gt;M64ERR_SUCCESS&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|Both the core library and the plugin library must already be initialized with the &amp;lt;tt&amp;gt;CoreStartup()/PluginStartup()&amp;lt;/tt&amp;gt; functions.  This function cannot be called while the emulator is running.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function detaches the given plugin from the emulator core, and re-attaches the &amp;#039;dummy&amp;#039; plugin functions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Command Functions ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreDoCommand(m64p_command Command, int ParamInt, void *ParamPtr)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Command&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Enumerated type specifying which command should be executed.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An integer value which may be used as an input to the command.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; A pointer which may be used as an input to the command.&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The core library must already be initialized with the &amp;lt;tt&amp;gt;CoreStartup()&amp;lt;/tt&amp;gt; function.  Each command may have its own requirements as well.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function sends a command to the emulator core.  A table of all commands is given below.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Command!!Function!!Input Parameters!!Requirements&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_ROM_OPEN&lt;br /&gt;
|This will cause the core to read in a binary ROM image provided by the front-end.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to the uncompressed ROM image in memory.&amp;lt;br /&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; The size in bytes of the ROM image.&lt;br /&gt;
|The emulator cannot be currently running.  A ROM image must not be currently opened.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_ROM_CLOSE&lt;br /&gt;
|This will close any currently open ROM.  The current cheat code list will also be deleted.&lt;br /&gt;
|N/A&lt;br /&gt;
|The emulator cannot be currently running.  A ROM image must have been previously opened.  There should be no plugins currently attached.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_ROM_GET_HEADER&lt;br /&gt;
|This will retrieve the header data of the currently open ROM.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to a &amp;lt;tt&amp;gt;rom_header&amp;lt;/tt&amp;gt; struct to receive the data.&amp;lt;br /&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; The size in bytes of the &amp;lt;tt&amp;gt;rom_header&amp;lt;/tt&amp;gt; struct.&lt;br /&gt;
|A ROM image must be open.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_ROM_GET_SETTINGS&lt;br /&gt;
|This will retrieve the settings data of the currently open ROM.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to a &amp;lt;tt&amp;gt;rom_settings&amp;lt;/tt&amp;gt; struct to receive the data.&amp;lt;br /&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; The size in bytes of the &amp;lt;tt&amp;gt;rom_settings&amp;lt;/tt&amp;gt; struct.&lt;br /&gt;
|A ROM image must be open.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_EXECUTE&lt;br /&gt;
|This command will start the emulator and begin executing the ROM image.  This function call will not return until the game has been stopped.&lt;br /&gt;
|N/A&lt;br /&gt;
|The emulator cannot be currently running.  A ROM image must have been previously opened.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_STOP&lt;br /&gt;
|This will stop the emulator, if it is currently running.&lt;br /&gt;
|N/A&lt;br /&gt;
|This command will execute asynchronously.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_PAUSE&lt;br /&gt;
|This command will pause the emulator if it is running.&lt;br /&gt;
|N/A&lt;br /&gt;
|This function will return a non-successful error code if the emulator is in the stopped state.  This command may execute asynchronously.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_RESUME&lt;br /&gt;
|This command will resume execution of the emulator if it is paused.&lt;br /&gt;
|N/A&lt;br /&gt;
|This function will return a non-successful error code if the emulator is in the stopped state.  This command may execute asynchronously.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_CORE_STATE_QUERY&lt;br /&gt;
|This command will query the emulator core for the value of a state parameter&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_core_param&amp;lt;/tt&amp;gt; enumerated type specifying the desired state variable&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an integer to receive the value of the requested state variable.&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_CORE_STATE_SET&lt;br /&gt;
|This command will set the value of a state parameter in the emulator core&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_core_param&amp;lt;/tt&amp;gt; enumerated type specifying the desired state variable&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an integer to containing the value of the requested state variable.&lt;br /&gt;
|The initial requirements vary depending upon the variable being set.  Setting some variables requires the emulator to be running.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_STATE_LOAD&lt;br /&gt;
|This command will attempt to load a saved state file.  If &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is not NULL, this function will load a state file from a full pathname specified by this pointer.  Otherwise (&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is NULL), it will load from the current slot.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Ignored&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to string containing state file path and name, or NULL&lt;br /&gt;
|The emulator must be currently running or paused.  This command will execute asynchronously.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_STATE_SAVE&lt;br /&gt;
|This command will save a state file.  If &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is not NULL, this function will save a state file to a full pathname specified by this pointer.  Otherwise (&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is NULL), it will save to the current slot.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This parameter will only be used if &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is not NULL. If 1, a Mupen64Plus state file will be saved.  If 2, a Project64 compressed state file will be saved. If 3, a Project64 uncompressed state file will be saved. &amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to string containing state file path and name, or NULL&amp;lt;br /&amp;gt;&lt;br /&gt;
|The emulator must be currently running or paused.  This command will execute asynchronously.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_STATE_SET_SLOT&lt;br /&gt;
|This command will set the currently selected save slot index&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Value to set for the current slot index.  Must be between 0 and 9&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Ignored&amp;lt;br /&amp;gt;&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_SEND_SDL_KEYDOWN&lt;br /&gt;
|This command will inject an SDL_KEYDOWN event into the emulator&amp;#039;s core event loop.  Keys not handled by the core will be passed to the input plugin.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Key value of the keypress event to inject, with SDLMod in the upper 16 bits and SDLKey in the lower 16 bits.&lt;br /&gt;
|The emulator must be currently running or paused.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_SEND_SDL_KEYUP&lt;br /&gt;
|This command will inject an SDL_KEYUP event into the emulator&amp;#039;s core event loop.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Key value of the keypress event to inject, with SDLMod in the upper 16 bits and SDLKey in the lower 16 bits.&lt;br /&gt;
|The emulator must be currently running or paused.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_SET_FRAME_CALLBACK&lt;br /&gt;
|This command either registers or removes (if &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is NULL) a frame callback function.  This function will be called after each video frame is rendered.  The front-end callback function may call the video plugin&amp;#039;s ReadScreen2() function to retrieve the frame if desired.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Can be either NULL or a &amp;lt;tt&amp;gt;m64p_frame_callback&amp;lt;/tt&amp;gt; object.&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_TAKE_NEXT_SCREENSHOT&lt;br /&gt;
|This will cause the core to save a screenshot at the next possible opportunity.&lt;br /&gt;
|N/A&lt;br /&gt;
|The emulator must be currently running or paused.  This command will execute asynchronously.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_READ_SCREEN&lt;br /&gt;
|This command will copy the current contents of the video display to the buffer pointer by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; 1 to copy the buffer that is currently displayed (front buffer), 0 to copy the buffer that is being drawn (back buffer).&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;A pointer to a buffer of at least width*height*3 bytes. The buffer will be filled with the current display. The format is RGB888 with the origin in the lower left corner.&lt;br /&gt;
|The emulator must be currently running or paused.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_RESET&lt;br /&gt;
|Reset the emulated machine.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; 0 to do a soft reset, 1 to do a hard reset.&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Ignored&lt;br /&gt;
|The emulator must be currently running or paused.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_ADVANCE_FRAME&lt;br /&gt;
|Advance one frame (the emulator will run until the next frame, then pause).&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Ignored&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Ignored&lt;br /&gt;
|The emulator must be currently running or paused.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_SET_MEDIA_LOADER&lt;br /&gt;
|This command allow frontends to register their media (such as GameBoy cartridge or 64DD disk) loading functions. These functions will be called appropriately by the core at startup and when a new media is inserted.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; must be sizeof(m64p_media_loader).&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; A pointer to the m64p_media_loader to register, cannot be NULL.&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_NETPLAY_INIT&lt;br /&gt;
|This command will initilize the netplay subsystem. It will also attempt to make an initial connection to the netplay server. Returns M64ERR_SYSTEM_FAIL on failure, M64ERR_SUCCESS on success.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This is the port number the netplay server is listening on.&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This is a string containing the IP or hostname of the netplay server.&lt;br /&gt;
|Emulator should be stopped.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_NETPLAY_CONTROL_PLAYER&lt;br /&gt;
|This function is used for the client to request control of certain players. This function can be called more than once if a client would like to control multiple players. Local controllers are assigned in order. Returns M64ERR_INPUT_ASSERT if the server rejects the request. If this function is never called, the client is assumed to be a spectator.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This is the player number (from 1-4) the client would like to control.&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This is a pointer to a uint32_t that contains a unique registration ID (for instance a random number) for the client. This number should be the same each time if this function is called multiple times. The registration ID cannot be 0.&lt;br /&gt;
|Emulator should be stopped. The input plugin should be started.&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_NETPLAY_GET_VERSION&lt;br /&gt;
|This function is used to check API and core versions, the server can use this information to make sure everyone is using the same version of the software. The function returns M64ERR_INCOMPATIBLE if the API versions don&amp;#039;t match, and M64ERR_SUCCESS if they do.&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamInt&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This is the Netplay API version that the frontend supports.&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ParamPtr&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This is a pointer to a uint32_t, the core fills this pointer with a core netplay version. This version number is incremented when changes are made to the core that would affect netplay sync.&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|M64CMD_NETPLAY_CLOSE&lt;br /&gt;
|Closes the netplay subsystem, as well as any connections to the netplay server.&lt;br /&gt;
|N/A&lt;br /&gt;
|None&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Core State Parameters ==&lt;br /&gt;
These core parameters may be read and/or written using the M64CMD_CORE_STATE_QUERY and M64CMD_CORE_STATE_SET commands.  The front-end application will receive a callback (via the &amp;lt;tt&amp;gt;StateCallback&amp;lt;/tt&amp;gt; function pointer given to the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;CoreStartup&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function) when these parameters change value.  This callback will be sent even if the function which caused the state change was called by the front-end application itself.  Not all of these parameters are readable or writable.  Each parameter&amp;#039;s value is held in a single 32-bit integer.  The meaning of this integer is given in the Parameter Encoding column. See the table below for details on these core parameters.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Name!!Readable!!Writable!!&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; Parameter Encoding!!Notes&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_EMU_STATE&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|&amp;lt;tt&amp;gt;enum m64p_emu_state&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;=Stopped, &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt;=Running, &amp;lt;tt&amp;gt;3&amp;lt;/tt&amp;gt;=Paused&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_VIDEO_MODE&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|&amp;lt;tt&amp;gt;enum m64p_video_mode&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;=None (video not running), &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt;=Windowed, &amp;lt;tt&amp;gt;3&amp;lt;/tt&amp;gt;=Fullscreen&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_SAVESTATE_SLOT&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|&lt;br /&gt;
|Valid values are 0 through 9.&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_SPEED_FACTOR&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|Emulator playback speed in percent&lt;br /&gt;
|Valid values are 1 to 1000.&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_SPEED_LIMITER&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; to enable speed limiter, or &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; to disable speed limiter.&lt;br /&gt;
|When speed limiter is disabled, emulator will run as fast as possible (useful for benchmarking).&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_VIDEO_SIZE&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|&amp;lt;tt&amp;gt;(ScreenWidth &amp;lt;&amp;lt; 16) + ScreenHeight&amp;lt;/tt&amp;gt;&lt;br /&gt;
|This parameter can only be read or written when the emulator is running or paused.  This parameter may be written by the front-end application in response to a window resizing event.  Upon receiving this command, the core will pass the new width and height to the ResizeVideoOutput function in the video plugin (video API v2.2.0).  If the video plugin supports resizing, it will update its viewport and then call the video extension function VidExt_ResizeWindow to update the window manager.&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_AUDIO_VOLUME&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|Volume level in percent, 0 - 100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_AUDIO_MUTE&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; if muted, otherwise &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_INPUT_GAMESHARK&lt;br /&gt;
|Yes&lt;br /&gt;
|Yes&lt;br /&gt;
|&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; when Gameshark button pressed, &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; when button released.&lt;br /&gt;
|Callback function will be invoked on both button press and release.&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_STATE_LOADCOMPLETE&lt;br /&gt;
|No&lt;br /&gt;
|No&lt;br /&gt;
|&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; if state loading was successful, &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; if state loading failed.&lt;br /&gt;
|This parameter cannot be read or written.  It is only used for callbacks, because the state load/save operations are asynchronous.&lt;br /&gt;
|-&lt;br /&gt;
|M64CORE_STATE_SAVECOMPLETE&lt;br /&gt;
|No&lt;br /&gt;
|No&lt;br /&gt;
|&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; if state saving was successful, &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; if state saving failed.&lt;br /&gt;
|This parameter cannot be read or written.  It is only used for callbacks, because the state load/save operations are asynchronous.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ROM Handling Functions ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreGetRomSettings(m64p_rom_settings *RomSettings, int RomSettingsLength, int Crc1, int Crc2)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;RomSettings&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to &amp;lt;tt&amp;gt;m64p_rom_settings&amp;lt;/tt&amp;gt; object to be filled in with data.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;RomSettingsLength&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Size of the object pointed to by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;RomSettings&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; in bytes.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Crc1&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; A 32-bit integer value containing the first CRC (taken from the ROM header) to identify the ROM.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Crc2&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; A 32-bit integer value containing the second CRC (taken from the ROM header) to identify the ROM.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The core library must already be initialized with the &amp;lt;tt&amp;gt;CoreStartup()&amp;lt;/tt&amp;gt; function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;RomSettings&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointer must not be NULL.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;RomSettingsLength&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; value must be greater than or equal to the size of the &amp;lt;tt&amp;gt;m64p_rom_settings&amp;lt;/tt&amp;gt; structure.  This function does not require any ROM image to be currently open.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function searches through the data in the &amp;lt;tt&amp;gt;Mupen64Plus.ini&amp;lt;/tt&amp;gt; file to find an entry which matches the given &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Crc1&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Crc2&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; hashes, and if found, fills in the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;RomSettings&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; structure with the data from the &amp;lt;tt&amp;gt;Mupen64Plus.ini&amp;lt;/tt&amp;gt; file.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Video Extension Functions ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreOverrideVidExt(m64p_video_extension_functions *VideoFunctionStruct);&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;VideoFunctionStruct&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to a structure (defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]]) containing pointers to the Front-end&amp;#039;s custom Video Extension functions to override the default SDL functions&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  This function cannot be called while the emulator is running.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function overrides the core&amp;#039;s internal SDL-based OpenGL functions which are called from the video plugin to perform various basic tasks like opening the video window, toggling between windowed and fullscreen modes, and swapping frame buffers after a frame has been rendered.  This override functionality allows a front-end to define its own video extension functions to be used instead of the SDL functions, such as for the purpose of embedding the emulator display window inside of a Qt GUI window.  If any of the function pointers in the structure are NULL, the override function will be disabled and the core&amp;#039;s internal SDL functions will be used.  The core library with a Video Extension API v3.0 expects the &amp;lt;tt&amp;gt;Functions&amp;lt;/tt&amp;gt; struct member to be equal to 11 or more.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cheat Functions ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreAddCheat(const char *CheatName, m64p_cheat_code *CodeList, int NumCodes)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;CheatName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to NULL-terminated string containing a unique name for this Cheat Function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;CodeList&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an array of &amp;lt;tt&amp;gt;m64p_cheat_code&amp;lt;/tt&amp;gt; objects.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;NumCodes&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Number of &amp;lt;tt&amp;gt;m64p_cheat_code&amp;lt;/tt&amp;gt; elements in the cheat code array.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  A ROM image must be currently opened.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function will add a Cheat Function to a list of currently active cheats which are applied to the open ROM, and set its state to Enabled.  This function may be called before a ROM begins execution or while a ROM is currently running.  Some cheat codes must be applied before the ROM begins executing, and may not work correctly if added after the ROM begins execution.  A Cheat Function consists of a list of one or more &amp;lt;tt&amp;gt;m64p_cheat_code&amp;lt;/tt&amp;gt; elements.  If a Cheat Function with the given &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;CheatName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; already exists, it will be removed and the new Cheat Function will be added in its place.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error CoreCheatEnabled(const char *CheatName, int Enabled)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;CheatName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to NULL-terminated string containing the name of an existing Cheat Function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Enabled&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Boolean value to which to set the enabled state of the specified Cheat Function.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  A ROM image must be currently opened.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function enables or disables a specified Cheat Function.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Config&amp;diff=93</id>
		<title>Mupen64Plus v2.0 Core Config</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Config&amp;diff=93"/>
		<updated>2020-06-28T17:48:31Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Generic Get/Set Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Mupen64Plus v2.0 Configuration API =&lt;br /&gt;
&lt;br /&gt;
Most libmupen64plus functions return an &amp;lt;tt&amp;gt;m64p_error&amp;lt;/tt&amp;gt; return code, which is an enumerated type defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]].  Front-end code should check the return value of each call to a libmupen64plus function.&lt;br /&gt;
&lt;br /&gt;
== Selector Functions ==&lt;br /&gt;
These functions are used by the front-end to discover the sections in the configuration file, open a section, discover parameters within a section, and find out if a section has been changed.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigListSections(void *context, void (*SectionListCallback)(void * context, const char * SectionName))&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;context&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Void pointer to be passed to the SectionListCallback function&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionListCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to function in front-end for receiving the name of every section in the Mupen64Plus Core configuration data.  This function will be called once for each section in the core configuration data structure, and then the ConfigListSections() function will return.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionListCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointer cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is called to enumerate the list of Sections in the Mupen64Plus Core configuration file.  It is expected that there will be a section named &amp;quot;Core&amp;quot; for core-specific configuration data, &amp;quot;Graphics&amp;quot; for common graphics options, and one section for each plugin library.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigOpenSection(const char *SectionName, m64p_handle *ConfigSectionHandle)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to open.  This name is case-insensitive.  If no section exists with the given name, a new one will be created with no parameters.  This name may consist of any ASCII characters between 32 and 127 except brackets &amp;quot;[]&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; This is a handle (defined in [[Mupen64Plus v2.0 headers#m64p_types.h|m64p_types.h]]) which is required to be used for subsequent calls to core configuration functions to list, retrieve, or set configuration parameters.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to give a configuration section handle to the front-end which may be used to read or write configuration parameter values in a given section of the configuration file.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigListParameters(m64p_handle ConfigSectionHandle, void *context, void (*ParameterListCallback)(void * context, const char *ParamName, m64p_type ParamType))&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;context&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Void pointer to be passed to the ParameterListCallback function&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParameterListCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to function in front-end for receiving the name of every parameter in the given section of the Mupen64Plus Core configuration data.  This function will be called once for each parameter in the section, and then the ConfigListParameters() function will return.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParameterListCallback&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is called to enumerate the list of Parameters in a given Section of the Mupen64Plus Core configuration file.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;int ConfigHasUnsavedChanges(const char *SectionName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to check for unsaved changes.  This name is case-insensitive.  If this pointer is NULL or points to an empty string, then all sections are checked.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&amp;lt;br /&amp;gt;&lt;br /&gt;
This function was added in the Config API version 2.2.0.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is called to determine if a given Section (or all sections) of the Mupen64Plus Core configuration file has been modified since it was last saved.  A return value of 0 means there are no unsaved changes, while a 1 will be returned if there are unsaved changes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Modifier Functions ==&lt;br /&gt;
These functions are used for deleting parts of the configuration list or saving the configuration data to disk.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigDeleteSection(const char *SectionName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to delete.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except brackets &amp;quot;[]&amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function deletes a section from the Mupen64Plus configuration data.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSaveFile(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function saves the Mupen64Plus configuration file to disk.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSaveSection(const char *SectionName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to save.  This name is case-insensitive.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The named section must exist in the current configuration.&amp;lt;br /&amp;gt;&lt;br /&gt;
This function was added in the Config API version 2.1.0.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function saves one section of the current Mupen64Plus configuration to disk, while leaving the other sections unmodified.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigRevertChanges(const char *SectionName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SectionName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Name of the Mupen64Plus configuration section to modify.  This name is case-insensitive.  This pointer cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The named section must exist in the current configuration.&amp;lt;br /&amp;gt;&lt;br /&gt;
This function was added in the Config API version 2.2.0.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function reverts changes previously made to one section of the current Mupen64Plus configuration file, so that it will match with the configuration at the last time that it was loaded from or saved to disk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Generic Get/Set Functions ==&lt;br /&gt;
These functions should be used for reading or writing configuration values in most cases.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetParameter(m64p_handle ConfigSectionHandle, const char *ParamName, m64p_type ParamType, const void *ParamValue)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being set.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_type&amp;lt;/tt&amp;gt; value giving the type of the data object that &amp;#039;&amp;#039;&amp;#039;ParamValue&amp;#039;&amp;#039;&amp;#039; points to.  If this is different from the native data representation used by the core, it will be converted into the type used by the core.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to data object containing the value of the parameter to be set.&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function sets the value of one of the emulator&amp;#039;s configuration parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetParameterHelp(m64p_handle ConfigSectionHandle, const char *ParamName, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose help string is being set.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamHelp&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing some human-readable information about the usage of this parameter.  Can be NULL.&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function sets the help string of one of the emulator&amp;#039;s configuration parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigGetParameter(m64p_handle ConfigSectionHandle, const char *ParamName, m64p_type ParamType, void *ParamValue, int MaxSize)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being retrieved.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_type&amp;lt;/tt&amp;gt; value giving the type of the data object that &amp;#039;&amp;#039;&amp;#039;ParamValue&amp;#039;&amp;#039;&amp;#039; points to.  If this is different from the native data representation used by the core, it will be converted into the type given by &amp;#039;&amp;#039;&amp;#039;ParamType&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to data object to receive the value of the parameter being retrieved.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;MaxSize&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Size (in bytes) of the data object that &amp;#039;&amp;#039;&amp;#039;ParamValue&amp;#039;&amp;#039;&amp;#039; points to.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function retrieves the value of one of the emulator&amp;#039;s parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigGetParameterType(m64p_handle ConfigSectionHandle, const char *ParamName, m64p_type *ParamType)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to a NULL-terminated string containing the name of the parameter whose type is being retrieved.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Pointer to an &amp;lt;tt&amp;gt;m64p_type&amp;lt;/tt&amp;gt; value to receive the type of the parameter indicated by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamType&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function retrieves the type of one of the emulator&amp;#039;s parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.  If there is no parameter with the given &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, the error &amp;lt;tt&amp;gt;M64ERR_INPUT_NOT_FOUND&amp;lt;/tt&amp;gt; will be returned.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetParameterHelp(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing usage information for the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; parameter.  May be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter for which usage information is being retrieved.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function retrieves the help information about one of the emulator&amp;#039;s parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Special Get/Set Functions ==&lt;br /&gt;
These parameterized Get/SetDefault functions are provided for simplifying the task of handling default values within a single module.  Each code module using the Core&amp;#039;s configuration API should set the default values for all configuration parameters used by that module during its Startup() function.  This allows the software to set up the default values automatically rather than storing them in a separate &amp;quot;default config file&amp;quot; which has proven problematic in the past.  This also solves the problem which occurs when an upgraded module contains a new config parameter not present in the previous release.&lt;br /&gt;
&lt;br /&gt;
The special Get functions return the configuration value directly rather than writing them through a pointer and returning an error code.  For this reason, these parameterized Get functions should only be used within a module which &amp;#039;owns&amp;#039; the configuration section and set up its default values in the Startup() function.  Because these functions cannot signal an error to the caller, a front-end should not use these functions to retrieve configuration values for the core or the plugins, unless the names of the parameters have been enumerated with &amp;lt;tt&amp;gt;ConfigListParameters&amp;lt;/tt&amp;gt; and are therefore guaranteed to exist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetDefaultInt(m64p_handle ConfigSectionHandle, const char *ParamName, int ParamValue, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetDefaultFloat(m64p_handle ConfigSectionHandle, const char *ParamName, float ParamValue, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetDefaultBool(m64p_handle ConfigSectionHandle, const char *ParamName, int ParamValue, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;m64p_error ConfigSetDefaultString(m64p_handle ConfigSectionHandle, const char *ParamName, const char * ParamValue, const char *ParamHelp)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being set.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; Integer or null-terminated string pointer containing the value of the parameter to be set.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamHelp&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing some human-readable information about the usage of this parameter.  Can be NULL.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function is used to set the value of a configuration parameter if it is not already present in the configuration file.  This may happen if a new user runs the emulator, or an upgraded module uses a new parameter, or the user deletes his or her configuration file.  If a parameter named &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is already present in the given section of the configuration file, then no action will be taken and this function will return successfully.  Otherwise, a new parameter will be created its value will be assigned to &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamValue&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigGetParamInt(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigGetParamFloat(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigGetParamBool(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char *&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigGetParamString(m64p_handle ConfigSectionHandle, const char *ParamName)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|Input Parameters&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; An &amp;lt;tt&amp;gt;m64p_handle&amp;lt;/tt&amp;gt; given by the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigOpenSection&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; NULL-terminated string containing the name of the parameter whose value is being retrieved.  This name is case-insensitive.  This name may consist of any ASCII characters between 32 and 127 except the equals and hash signs, and may not end in a space.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.  The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; pointers cannot be NULL.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function retrieves the value of one of the emulator&amp;#039;s parameters in the section which is represented by &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, and returns the value directly to the calling function.  If an errors occurs (such as if &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ConfigSectionHandle&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; is invalid, or there is no configuration parameter named &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;ParamName&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;), then an error will be sent to the front-end via the &amp;lt;tt&amp;gt;DebugCallback()&amp;lt;/tt&amp;gt; function, and either a 0 (zero) or an empty string will be returned.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OS-Abstraction Functions ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetSharedDataFilepath(const char *filename)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing a full directory path and filename to a given shared data file, or NULL if this file was not found.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|It is common for shared data files on Unix systems to be installed in different places on different systems.  Therefore, this core function is provided to allow a plugin to retrieve a full pathname to a given shared data file.  This type of file is intended to be shared among multiple users on a system, so it is likely to be read-only.  Examples of these types of files include: the .ini files for Rice Video and Glide64, the font and Mupen64Plus.ini files for the core, and the cheat code files for the front-end.  This function will first search in a directory given via the &amp;lt;tt&amp;gt;DataPath&amp;lt;/tt&amp;gt; parameter to the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;CoreStartup&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; function, then in a directory given by the &amp;lt;tt&amp;gt;SharedDataPath&amp;lt;/tt&amp;gt; core configuration parameter, then in a directory which may be supplied at compile time through a Makefile or configure script option, and finally in some common system locations (such as /usr/share/mupen64plus and /usr/local/share/mupen64plus on Unix systems).&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetUserConfigPath(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing the directory path to user-specific configuration files.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function may be used by the plugins or front-end to get a path to the directory for storing user-specific configuration files.  This will be the directory where the configuration file &amp;quot;mupen64plus.cfg&amp;quot; is located.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetUserDataPath(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing the directory path to user-specific data files.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function may be used by the plugins or front-end to get a path to the directory for storing user-specific data files.  This may be used to store files such as screenshots, saved game states, or hi-res textures.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Prototype&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;const char * ConfigGetUserCachePath(void)&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Return Value&lt;br /&gt;
|Pointer to a NULL-terminated string containing the directory path to user-specific caching data files.&lt;br /&gt;
|-&lt;br /&gt;
|Requirements&lt;br /&gt;
|The Mupen64Plus library must already be initialized before calling this function.&lt;br /&gt;
|-&lt;br /&gt;
|Usage&lt;br /&gt;
|This function may be used by the plugins or front-end to get a path to the directory for storing user-specific caching data files.  Files in this directory may be deleted by the user to save space, so critical information should not be stored here.  This directory may be used to store files such as the ROM browser cache.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Netplay&amp;diff=92</id>
		<title>Mupen64Plus v2.0 Core Netplay</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_Netplay&amp;diff=92"/>
		<updated>2020-06-28T17:45:28Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Mupen64Plus netplay protocol documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Mupen64Plus Netplay API =&lt;br /&gt;
&lt;br /&gt;
The Mupen64Plus netplay API is based on a client/server architecture. It supports syncing core settings and save files. It also supports raw input (tested with Raphnet input plugin).&lt;br /&gt;
TCP is used to deal with player registration, and syncing settings and saves.&lt;br /&gt;
UDP is used to transfer key input data.&lt;br /&gt;
Data is sent in Network Byte Order (Big Endian).&lt;br /&gt;
&lt;br /&gt;
The server is responsible for maintaining healthy buffers and also for detecting desyncs. The server is the source of truth for input data (for instance, when player 1 pushes &amp;quot;A&amp;quot;, it sends that information to the server via UDP. That &amp;quot;A&amp;quot; is not registered as input for player 1 until the client receives a packet from the server indicating what input frame to register that &amp;quot;A&amp;quot; in)&lt;br /&gt;
&lt;br /&gt;
== UDP Packet formats ==&lt;br /&gt;
* Request input for a player (sent by client):&lt;br /&gt;
** 12 bytes&lt;br /&gt;
** byte[0] = 2&lt;br /&gt;
** byte[1] = player number (this is the player we need key inputs for)&lt;br /&gt;
** byte[2-5] = client registration ID&lt;br /&gt;
** byte[6-9] = current event count&lt;br /&gt;
** byte[10] = whether client is a spectator&lt;br /&gt;
** byte[11] = local buffer size of the client&lt;br /&gt;
&lt;br /&gt;
* Key input data (sent by server):&lt;br /&gt;
** Variable length, payload cannot be larger than 512 bytes&lt;br /&gt;
** byte[0] = 1&lt;br /&gt;
** byte[1] = player number the key inputs pertain to&lt;br /&gt;
** byte[2] = current status. Bit 0 indicates whether the game has desynced (1 means desync). Bits 1-4 indicate whether a player has disconnected (for instance, if bit 2 is set, that means player 2 has disconnected). Bits 5-7 are currently unused.&lt;br /&gt;
** byte[3] = how far we lag behind the lead player&lt;br /&gt;
** byte[4] = number of events in this packet&lt;br /&gt;
** The following items will repeat/loop for the number of events in the packet&lt;br /&gt;
*** byte[5-8] = event count&lt;br /&gt;
*** byte[9-12] = key input data&lt;br /&gt;
*** byte[13] = current plugin&lt;br /&gt;
&lt;br /&gt;
* Key input data (sent by client):&lt;br /&gt;
** 11 bytes&lt;br /&gt;
** byte[0] = 0&lt;br /&gt;
** byte[1] = player number&lt;br /&gt;
** byte[2-5] = current event count&lt;br /&gt;
** byte[6-9] = key input data&lt;br /&gt;
** byte[10] = current plugin&lt;br /&gt;
&lt;br /&gt;
* Client sync data (sent by client):&lt;br /&gt;
** 133 bytes&lt;br /&gt;
** byte[0] = 4&lt;br /&gt;
** byte[1-4] = current VI count&lt;br /&gt;
** byte[5-132] = CP0 registers&lt;br /&gt;
&lt;br /&gt;
== TCP Packet formats ==&lt;br /&gt;
* Player disconnection notice (sent by client):&lt;br /&gt;
** 5 bytes&lt;br /&gt;
** byte[0] = 7&lt;br /&gt;
** byte[1-4] = client registration ID&lt;br /&gt;
&lt;br /&gt;
* Player registration request (sent by client):&lt;br /&gt;
** 8 bytes&lt;br /&gt;
** byte[0] = 5&lt;br /&gt;
** byte[1] = player the client is trying to register&lt;br /&gt;
** byte[2] = plugin for this player&lt;br /&gt;
** byte[3] = whether to use a raw input plugin&lt;br /&gt;
** byte[4-7] = client registration ID&lt;br /&gt;
&lt;br /&gt;
* Player registration response (sent by server):&lt;br /&gt;
** 2 bytes&lt;br /&gt;
** byte[0] = response (1 if registration was successful, 0 otherwise)&lt;br /&gt;
** byte[1] = local buffer target for the client&lt;br /&gt;
&lt;br /&gt;
* Send save file data (sent by client):&lt;br /&gt;
** Variable length&lt;br /&gt;
** byte[0] = 1&lt;br /&gt;
** byte[1 - next &amp;#039;\0&amp;#039;] = file name&lt;br /&gt;
** byte[4 bytes] = size of save file in bytes&lt;br /&gt;
** byte[size of file] = save file data&lt;br /&gt;
&lt;br /&gt;
* Request save file data (sent by client):&lt;br /&gt;
** Variable length&lt;br /&gt;
** byte[0] = 2&lt;br /&gt;
** byte[1 - next &amp;#039;\0&amp;#039;] = file name&lt;br /&gt;
&lt;br /&gt;
* Receive save file data (sent by server):&lt;br /&gt;
** Server responds with this data right after the above request&lt;br /&gt;
** Variable length&lt;br /&gt;
** byte[file size] = save file data&lt;br /&gt;
&lt;br /&gt;
* Send settings (sent by client):&lt;br /&gt;
** 21 bytes&lt;br /&gt;
** byte[0] = 3&lt;br /&gt;
** byte[1-4] = count_per_op&lt;br /&gt;
** byte[5-8] = disable_extra_mem&lt;br /&gt;
** byte[9-12] = si_dma_duration&lt;br /&gt;
** byte[13-16] = emumode&lt;br /&gt;
** byte[17-20] =  no_compiled_jump&lt;br /&gt;
&lt;br /&gt;
* Request settings (sent by client):&lt;br /&gt;
** 1 byte&lt;br /&gt;
** byte[0] = 4&lt;br /&gt;
&lt;br /&gt;
* Send settings (sent by server):&lt;br /&gt;
** Server responds with this data right after the above request&lt;br /&gt;
** 20 bytes&lt;br /&gt;
** byte[0-3] = count_per_op&lt;br /&gt;
** byte[4-7] = disable_extra_mem&lt;br /&gt;
** byte[8-11] = si_dma_duration&lt;br /&gt;
** byte[12-15] = emumode&lt;br /&gt;
** byte[16-19] = no_compiled_jump&lt;br /&gt;
&lt;br /&gt;
* Request player registration data (sent by client):&lt;br /&gt;
** 1 byte&lt;br /&gt;
** byte[0] = 6&lt;br /&gt;
&lt;br /&gt;
* Send player registration data (sent by server):&lt;br /&gt;
** 24 bytes&lt;br /&gt;
** The following bytes loop 4 times (once for each player)&lt;br /&gt;
*** byte[0-3] = player registration ID&lt;br /&gt;
*** byte[4] = player plugin&lt;br /&gt;
*** byte[5] = whether the player is using raw data input&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_API_v1.0&amp;diff=91</id>
		<title>Mupen64Plus v2.0 Core API v1.0</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_Core_API_v1.0&amp;diff=91"/>
		<updated>2020-06-28T17:44:39Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Core API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please note: as of January 2011, this API is a work in progress.&amp;lt;br /&amp;gt;&lt;br /&gt;
The core Mupen64Plus v2.0 modules are complete, but work on GUI front-end applications is ongoing.&lt;br /&gt;
&lt;br /&gt;
To view the design proposal which preceded this API definition, go to [[Mupen64Plus v2.0 Design Proposal 3|Design Proposal 3]].&lt;br /&gt;
&lt;br /&gt;
== New Architecture ==&lt;br /&gt;
&lt;br /&gt;
Earlier versions of Mupen64Plus (and other plugin-based N64 emulators) used a single monolithic application (containing the emulator core) and four plugins.  The plugins were dynamically-loaded libraries, and the application used one plugin of each type: Video, Audio, Input, and RSP.  Each plugin and the application contained its own GUI code for user interface, and each plugin and the application were individually responsible for finding their own data files and finding, loading, parsing, and storing their own configuration data files.&lt;br /&gt;
&lt;br /&gt;
This was an acceptable architecture for emulators which were only designed to run on a single platform (such as Windows), but causes a lot of developer and user headaches when applied to a cross-platform emulator such as Mupen64Plus.  For this reason, we are re-designing the layout of the emulator to solve some of the problems caused by the old architecture.&lt;br /&gt;
&lt;br /&gt;
Under the new architecture, the old monolithic emulator application is split into two parts: a core emulator library and a main application, called the front-end.  The front-end is primarily responsible for the user interface.  All GUI code will be removed from the core and plugin libraries.  The primary function of the core library is to emulate the R4300 CPU and memory system, attaching the plugins to form a full N64 system emulator.  The core library also contains some utility functions which may be used by the front-end and plugins, such as a configuration parameter handler.&lt;br /&gt;
&lt;br /&gt;
== High-level Usage ==&lt;br /&gt;
&lt;br /&gt;
The expected sequence of operations which will be taken by the front-end application are as follows:&lt;br /&gt;
&lt;br /&gt;
# Load core library (libmupen64plus.so) and set function pointers&lt;br /&gt;
# Call &amp;lt;tt&amp;gt;CoreGetVersion&amp;lt;/tt&amp;gt;, check core version and capabilities&lt;br /&gt;
# Call &amp;lt;tt&amp;gt;CoreStartup&amp;lt;/tt&amp;gt; to initialize the core library&lt;br /&gt;
# Load front-end configuration from core config API or through own mechanism&lt;br /&gt;
# Find plugins, open dynamic libraries, call &amp;lt;tt&amp;gt;PluginStartup&amp;lt;/tt&amp;gt; for each&lt;br /&gt;
# Enter message loop for user interaction&lt;br /&gt;
# If user selects ROM and presses Play:&lt;br /&gt;
#* Load and de-compress the ROM&lt;br /&gt;
#* Use &amp;lt;tt&amp;gt;CoreDoCommand&amp;lt;/tt&amp;gt; to open the ROM&lt;br /&gt;
#* Call &amp;lt;tt&amp;gt;CoreAttachPlugin&amp;lt;/tt&amp;gt; to attach selected plugins to core&lt;br /&gt;
#* Use &amp;lt;tt&amp;gt;CoreDoCommand&amp;lt;/tt&amp;gt; to start emulation&lt;br /&gt;
#* When emulation is finished, call &amp;lt;tt&amp;gt;CoreDetachPlugin&amp;lt;/tt&amp;gt; on all plugins, then close the ROM&lt;br /&gt;
&lt;br /&gt;
== Versioning ==&lt;br /&gt;
=== [[Mupen64Plus v2.0 API Versioning|API Versioning Scheme]] ===&lt;br /&gt;
Since the Mupen64Plus emulator comprises 6 different software modules which can be mixed and matched (the front-end app, the core library, and 4 plugins), and the interfaces between these modules change over time, there are many hard-to-diagnose bugs which could show up due to incompatibilities between these different modules.  For this reason, we use a comprehensive versioning scheme which allows any 2 components to determine whether or not they are compatible, and to support forward and backward compatibility as necessary.  This scheme is described in detail in this document.&lt;br /&gt;
&lt;br /&gt;
== Core API ==&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Basic|Basic Core Functions]] ===&lt;br /&gt;
&lt;br /&gt;
These two functions (&amp;lt;tt&amp;gt;PluginGetVersion&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CoreErrorMessage&amp;lt;/tt&amp;gt;) are utility functions and may be called at any time (even before core startup).  These functions are used by both the front-end and the plugins.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Front-End|Front-End Functions]] ===&lt;br /&gt;
&lt;br /&gt;
There are several types of functions here, which are exported from the Core library to be used by the front-end.  There are &amp;#039;housekeeping&amp;#039; functions, for startup and shutdown, and attaching and detaching plugins.  There is also a Command API which is used for many simple functions such as loading, executing, or stopping a ROM.  Finally the Cheat API is here, for adding and removing cheat functions.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Video Extension|Video Extension API]] ===&lt;br /&gt;
&lt;br /&gt;
These functions are exported from the Core library for use by the video plugin.  These functions are used for high-level video setup tasks such as enumerating available screen resolutions, setting the video mode, window caption, OpenGL attributes, and fullscreen mode.  The video extension API allows for the abstraction of these functions away from the hard-coded SDL function calls currently in the video plugins, so that a front-end may override these functions and provide its own video API.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Debugger|Debugger Functions]] ===&lt;br /&gt;
&lt;br /&gt;
These are the debugger functions, which are also called only from the front-end.  Most of these functions will return with an error if the core library was not compiled with the debugger enabled.  A front-end may examine the &amp;lt;tt&amp;gt;Capabilities&amp;lt;/tt&amp;gt; value returned by the &amp;lt;tt&amp;gt;CoreGetVersion&amp;lt;/tt&amp;gt; function to determine if the core library was built with the debugger enabled.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Config|Configuration API]] ===&lt;br /&gt;
&lt;br /&gt;
These configuration functions are exported from the core library and are used by the core and the plugins to store all of their persistent configuration parameters.  The front-end application may also use these functions to store its configuration options, or it may use a different mechanism.  This section also contains two Operating System Abstraction functions.  These functions are used by the core, plugins, and the front-end to find full filepaths to shared data files and user-specific data files.&lt;br /&gt;
&lt;br /&gt;
=== [[Mupen64Plus v2.0 Core Netplay|Netplay API]] ===&lt;br /&gt;
&lt;br /&gt;
== Plugin API ==&lt;br /&gt;
=== [[Mupen64Plus v2.0 Plugin API|Plugin API]] ===&lt;br /&gt;
&lt;br /&gt;
This section lists all of the functions which are exported by the plugins.  The front-end application should only use the &amp;lt;tt&amp;gt;PluginStartup&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;PluginShutdown&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;PluginGetVersion&amp;lt;/tt&amp;gt; functions.  All other functions will only be called from the core.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=UIConsoleUsage&amp;diff=90</id>
		<title>UIConsoleUsage</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=UIConsoleUsage&amp;diff=90"/>
		<updated>2019-03-23T16:26:16Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Cheats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Console Options==&lt;br /&gt;
&lt;br /&gt;
At startup, the mupen64plus program will look for a user configuration file called &amp;#039;mupen64plus.cfg&amp;#039; (see [[FileLocations]] for more informations).&lt;br /&gt;
&lt;br /&gt;
If this file does not exist, it will be created and default settings will be written. If desired, an alternate config directory can be specified using the --configdir commandline option.&lt;br /&gt;
&lt;br /&gt;
Run &amp;#039;mupen64plus --help&amp;#039; for a complete list of commandline options:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ mupen64plus --help&lt;br /&gt;
 Usage: mupen64plus [parameter(s)] rom&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
    --noosd               : disable onscreen display&lt;br /&gt;
    --osd                 : enable onscreen display&lt;br /&gt;
    --fullscreen          : use fullscreen display mode&lt;br /&gt;
    --windowed            : use windowed display mode&lt;br /&gt;
    --resolution (res)    : display resolution (640x480, 800x600, 1024x768, etc)&lt;br /&gt;
    --nospeedlimit        : disable core speed limiter (should be used with dummy audio plugin)&lt;br /&gt;
    --cheats (cheat-spec) : enable or list cheat codes for the given rom file&lt;br /&gt;
    --corelib (filepath)  : use core library (filepath) (can be only filename or full path)&lt;br /&gt;
    --configdir (dir)     : force configation directory to (dir); should contain mupen64plus.cfg&lt;br /&gt;
    --datadir (dir)       : search for shared data files (.ini files, languages, etc) in (dir)&lt;br /&gt;
    --debug               : launch console-based debugger (requires core lib built for debugging)&lt;br /&gt;
    --plugindir (dir)     : search for plugins in (dir)&lt;br /&gt;
    --sshotdir (dir)      : set screenshot directory to (dir)&lt;br /&gt;
    --gfx (plugin-spec)   : use gfx plugin given by (plugin-spec)&lt;br /&gt;
    --audio (plugin-spec) : use audio plugin given by (plugin-spec)&lt;br /&gt;
    --input (plugin-spec) : use input plugin given by (plugin-spec)&lt;br /&gt;
    --rsp (plugin-spec)   : use rsp plugin given by (plugin-spec)&lt;br /&gt;
    --emumode (mode)      : set emu mode to: 0=Pure Interpreter 1=Interpreter 2=DynaRec&lt;br /&gt;
    --testshots (list)    : take screenshots at frames given in comma-separated (list), then quit&lt;br /&gt;
    --set (param-spec)    : set a configuration variable, format: ParamSection[ParamName]=Value&lt;br /&gt;
    --gb-rom-{1,2,3,4}    : define GB cart rom to load inside transferpak {1,2,3,4}&amp;quot;&lt;br /&gt;
    --gb-ram-{1,2,3,4}    : define GB cart ram to load inside transferpak {1,2,3,4}&amp;quot;&lt;br /&gt;
    --core-compare-send   : use the Core Comparison debugging feature, in data sending mode&lt;br /&gt;
    --core-compare-recv   : use the Core Comparison debugging feature, in data receiving mode&lt;br /&gt;
    --nosaveoptions       : do not save the given command-line options in configuration file&lt;br /&gt;
    --verbose             : print lots of information&lt;br /&gt;
    --help                : see this help message&lt;br /&gt;
&lt;br /&gt;
(plugin-spec):&lt;br /&gt;
    (pluginname)          : filename (without path) of plugin to find in plugin directory&lt;br /&gt;
    (pluginpath)          : full path and filename of plugin&lt;br /&gt;
    &amp;#039;dummy&amp;#039;               : use dummy plugin&lt;br /&gt;
&lt;br /&gt;
(cheat-spec):&lt;br /&gt;
    &amp;#039;list&amp;#039;                : show all of the available cheat codes&lt;br /&gt;
    &amp;#039;all&amp;#039;                 : enable all of the available cheat codes&lt;br /&gt;
    (codelist)            : a comma-separated list of cheat code numbers to enable,&lt;br /&gt;
                            with dashes to use code variables (ex 1-2 to use cheat 1 option 2)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Cheats==&lt;br /&gt;
To list the available cheats in the rom:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mupen64plus --cheats list &amp;quot;/path/to/my/rom.v64&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If there are cheats in the rom, you will get (in the output console):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
UI-Console: 3 cheat code(s) found for ROM &amp;#039;MY ROM&amp;#039;&lt;br /&gt;
   0: [Enable All Levels] (This is needed to be able to Play all Levels of the Game)&lt;br /&gt;
   1: [Enable All Weapons] (This is needed to be able to Play with all Weapons of the Game)&lt;br /&gt;
   2: etc...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
All you have to do to use these cheats is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mupen64plus --cheats 0,1,2 &amp;quot;/path/to/my/rom.v64&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debugger==&lt;br /&gt;
===Setup===&lt;br /&gt;
&lt;br /&gt;
You must use a mupen64plus core library which was built with the DEBUGGER flag set.&lt;br /&gt;
&lt;br /&gt;
===Running===&lt;br /&gt;
&lt;br /&gt;
Use the --debug command-line option to enable the console debugger.&lt;br /&gt;
&lt;br /&gt;
The emulator mode should be set to &amp;quot;interpreter&amp;quot;, as the dynarec seems to cause&lt;br /&gt;
issues when interacting with the debugging API. This can be done with the R4300Emulator&lt;br /&gt;
config setting or with the --emumode flag.&lt;br /&gt;
&lt;br /&gt;
===Usage===&lt;br /&gt;
&lt;br /&gt;
Once the emulator boots, it will be paused by default. You will be presented&lt;br /&gt;
with a prompt as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(dbg) &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following commands can be entered:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
run&lt;br /&gt;
  Unpauses the game.&lt;br /&gt;
&lt;br /&gt;
pause&lt;br /&gt;
  Pauses the game.&lt;br /&gt;
&lt;br /&gt;
step &amp;lt;num-steps&amp;gt;&lt;br /&gt;
  When paused, instructs the emulator to make a single step, or a series of&lt;br /&gt;
  steps if num-steps is provided.&lt;br /&gt;
&lt;br /&gt;
regs&lt;br /&gt;
  Prints out general purpose register values.&lt;br /&gt;
&lt;br /&gt;
pc&lt;br /&gt;
  Print current value of Program Counter register&lt;br /&gt;
&lt;br /&gt;
pc-1&lt;br /&gt;
  Print previous value of Program Counter register&lt;br /&gt;
&lt;br /&gt;
asm&lt;br /&gt;
  Print assembly language instructions. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  asm                     Print one instruction at the Program Counter register&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt;              Print one instruction at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt;          Print &amp;lt;n&amp;gt; instructions starting at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt; &amp;lt;flags&amp;gt;  Print &amp;lt;n&amp;gt; instructions starting at &amp;lt;addr&amp;gt; with flags&lt;br /&gt;
    - If flags bit-3 is set (i.e. &amp;amp; 0x04): also print binary instruction data&lt;br /&gt;
    - If flags bit-2 is set: prefix each instruction with its memory address&lt;br /&gt;
    - If flags bit-1 is set: prefix each instruction with a counter from &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mem&lt;br /&gt;
  Print memory values. Several forms are supported:&lt;br /&gt;
  &lt;br /&gt;
  mem &amp;lt;addr&amp;gt;        Print one 32-bit word at &amp;lt;addr&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  mem /N &amp;lt;addr&amp;gt;     Print &amp;lt;N&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nb &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 8-bit bytes at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nh &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 16-bit half-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nw &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nd &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 64-bit double-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  mem /NxM &amp;lt;addr&amp;gt;   Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMb &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 8-bit bytes at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMh &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 16-bit half-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMw &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMd &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 64-bit double-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
write&lt;br /&gt;
  Write values to memory. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  write &amp;lt;addr&amp;gt; &amp;lt;value&amp;gt;    Write a (1) byte value to &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  write &amp;lt;addr&amp;gt; b &amp;lt;value&amp;gt;  Write a (1) byte value to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; h &amp;lt;value&amp;gt;  Write a half-word value (2 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; w &amp;lt;value&amp;gt;  Write a word value (4 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; d &amp;lt;value&amp;gt;  Write a double-word value (8 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
translate&lt;br /&gt;
  Translates virtual memory addresses to physical memory addresses. Memory&lt;br /&gt;
  read/write breakpoints must operate on physical addresses, in contrast to the&lt;br /&gt;
  memory read/write commands and execution breakpoints that operate on virtual&lt;br /&gt;
  addresses.&lt;br /&gt;
&lt;br /&gt;
  translate &amp;lt;virtual address&amp;gt;  Print the 32-bit physical address for the&lt;br /&gt;
                               provided &amp;lt;virtual address&amp;gt; argument.&lt;br /&gt;
&lt;br /&gt;
bp add&lt;br /&gt;
  Adds a breakpoint at a given address. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  bp add pc                  Add a breakpoint at the Program Counter, triggered&lt;br /&gt;
                             on EXEC, READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt;              Add a breakpoint at &amp;lt;addr&amp;gt;, triggered on EXEC,&lt;br /&gt;
                             READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt;          Add a breakpoint starting at &amp;lt;addr&amp;gt;, extending &amp;lt;n&amp;gt;&lt;br /&gt;
                             bytes, triggered on EXEC, READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt; &amp;lt;flags&amp;gt;  Add a breakpoint starting at &amp;lt;addr&amp;gt;, extending &amp;lt;n&amp;gt;&lt;br /&gt;
                             bytes, with specified trigger flags.&lt;br /&gt;
    - M64P_BKP_FLAG_READ = 0x02&lt;br /&gt;
    - M64P_BKP_FLAG_WRITE = 0x04&lt;br /&gt;
    - M64P_BKP_FLAG_EXEC = 0x08&lt;br /&gt;
&lt;br /&gt;
bp trig&lt;br /&gt;
  Prints the reason for the most recently activated breakpoint trigger. Memory&lt;br /&gt;
  read/write breakpoints will indicate the hit address.&lt;br /&gt;
&lt;br /&gt;
bp rm &amp;lt;addr|index&amp;gt;&lt;br /&gt;
  Removes a breakpoint by address or number.&lt;br /&gt;
&lt;br /&gt;
bp list&lt;br /&gt;
  Lists all breakpoints.&lt;br /&gt;
&lt;br /&gt;
exit|quit&lt;br /&gt;
  Stop emulator and quit debugger&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==64DD Support==&lt;br /&gt;
&lt;br /&gt;
Some compatibility with the 64DD disk drive unit has been implemented, but there&lt;br /&gt;
are a few small usability issues of which users should be aware.&lt;br /&gt;
&lt;br /&gt;
When using the 64DD, you need to pass a path to a cartridge rom, even if none is&lt;br /&gt;
strictly required.  The IPL boot rom will execute first and select the disk if&lt;br /&gt;
you have one inserted, or just show the boot menu otherwise.  We can remove this&lt;br /&gt;
requirement at a later time. For now all we need to remember is to use a Japanese&lt;br /&gt;
ROM (otherwise some region check will fail) with same features as the 64DD game&lt;br /&gt;
you want to play (think RumblePak, TransferPak, otherwise, they won&amp;#039;t be available).&lt;br /&gt;
&lt;br /&gt;
There is a sibling issue also with 64DD games in that there are no entries in the&lt;br /&gt;
game db (mupen64plus.ini) for them, and the core currently only relies on the cart&lt;br /&gt;
ROM loaded to fetch the ROM infos.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=UIConsoleUsage&amp;diff=89</id>
		<title>UIConsoleUsage</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=UIConsoleUsage&amp;diff=89"/>
		<updated>2019-03-23T16:24:37Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Console Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Console Options==&lt;br /&gt;
&lt;br /&gt;
At startup, the mupen64plus program will look for a user configuration file called &amp;#039;mupen64plus.cfg&amp;#039; (see [[FileLocations]] for more informations).&lt;br /&gt;
&lt;br /&gt;
If this file does not exist, it will be created and default settings will be written. If desired, an alternate config directory can be specified using the --configdir commandline option.&lt;br /&gt;
&lt;br /&gt;
Run &amp;#039;mupen64plus --help&amp;#039; for a complete list of commandline options:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ mupen64plus --help&lt;br /&gt;
 Usage: mupen64plus [parameter(s)] rom&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
    --noosd               : disable onscreen display&lt;br /&gt;
    --osd                 : enable onscreen display&lt;br /&gt;
    --fullscreen          : use fullscreen display mode&lt;br /&gt;
    --windowed            : use windowed display mode&lt;br /&gt;
    --resolution (res)    : display resolution (640x480, 800x600, 1024x768, etc)&lt;br /&gt;
    --nospeedlimit        : disable core speed limiter (should be used with dummy audio plugin)&lt;br /&gt;
    --cheats (cheat-spec) : enable or list cheat codes for the given rom file&lt;br /&gt;
    --corelib (filepath)  : use core library (filepath) (can be only filename or full path)&lt;br /&gt;
    --configdir (dir)     : force configation directory to (dir); should contain mupen64plus.cfg&lt;br /&gt;
    --datadir (dir)       : search for shared data files (.ini files, languages, etc) in (dir)&lt;br /&gt;
    --debug               : launch console-based debugger (requires core lib built for debugging)&lt;br /&gt;
    --plugindir (dir)     : search for plugins in (dir)&lt;br /&gt;
    --sshotdir (dir)      : set screenshot directory to (dir)&lt;br /&gt;
    --gfx (plugin-spec)   : use gfx plugin given by (plugin-spec)&lt;br /&gt;
    --audio (plugin-spec) : use audio plugin given by (plugin-spec)&lt;br /&gt;
    --input (plugin-spec) : use input plugin given by (plugin-spec)&lt;br /&gt;
    --rsp (plugin-spec)   : use rsp plugin given by (plugin-spec)&lt;br /&gt;
    --emumode (mode)      : set emu mode to: 0=Pure Interpreter 1=Interpreter 2=DynaRec&lt;br /&gt;
    --testshots (list)    : take screenshots at frames given in comma-separated (list), then quit&lt;br /&gt;
    --set (param-spec)    : set a configuration variable, format: ParamSection[ParamName]=Value&lt;br /&gt;
    --gb-rom-{1,2,3,4}    : define GB cart rom to load inside transferpak {1,2,3,4}&amp;quot;&lt;br /&gt;
    --gb-ram-{1,2,3,4}    : define GB cart ram to load inside transferpak {1,2,3,4}&amp;quot;&lt;br /&gt;
    --core-compare-send   : use the Core Comparison debugging feature, in data sending mode&lt;br /&gt;
    --core-compare-recv   : use the Core Comparison debugging feature, in data receiving mode&lt;br /&gt;
    --nosaveoptions       : do not save the given command-line options in configuration file&lt;br /&gt;
    --verbose             : print lots of information&lt;br /&gt;
    --help                : see this help message&lt;br /&gt;
&lt;br /&gt;
(plugin-spec):&lt;br /&gt;
    (pluginname)          : filename (without path) of plugin to find in plugin directory&lt;br /&gt;
    (pluginpath)          : full path and filename of plugin&lt;br /&gt;
    &amp;#039;dummy&amp;#039;               : use dummy plugin&lt;br /&gt;
&lt;br /&gt;
(cheat-spec):&lt;br /&gt;
    &amp;#039;list&amp;#039;                : show all of the available cheat codes&lt;br /&gt;
    &amp;#039;all&amp;#039;                 : enable all of the available cheat codes&lt;br /&gt;
    (codelist)            : a comma-separated list of cheat code numbers to enable,&lt;br /&gt;
                            with dashes to use code variables (ex 1-2 to use cheat 1 option 2)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Cheats==&lt;br /&gt;
To list the available cheats in the rom:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mupen64plus --cheats list &amp;quot;/path/to/my/rom.v64&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If there are cheats in the rom, you will get (in the output console):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
UI-Console: 3 cheat code(s) found for ROM &amp;#039;MY ROM&amp;#039;&lt;br /&gt;
   0: [Enable All Levels] (This is needed to be able to Play all Levels of the Game)&lt;br /&gt;
   1: [Enable All Weapons] (This is needed to be able to Play with all Weapons of the Game)&lt;br /&gt;
   2: etc...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
All you have to do to use this cheats is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mupen64plus --cheats 0,1,2 &amp;quot;/path/to/my/rom.v64&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debugger==&lt;br /&gt;
===Setup===&lt;br /&gt;
&lt;br /&gt;
You must use a mupen64plus core library which was built with the DEBUGGER flag set.&lt;br /&gt;
&lt;br /&gt;
===Running===&lt;br /&gt;
&lt;br /&gt;
Use the --debug command-line option to enable the console debugger.&lt;br /&gt;
&lt;br /&gt;
The emulator mode should be set to &amp;quot;interpreter&amp;quot;, as the dynarec seems to cause&lt;br /&gt;
issues when interacting with the debugging API. This can be done with the R4300Emulator&lt;br /&gt;
config setting or with the --emumode flag.&lt;br /&gt;
&lt;br /&gt;
===Usage===&lt;br /&gt;
&lt;br /&gt;
Once the emulator boots, it will be paused by default. You will be presented&lt;br /&gt;
with a prompt as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(dbg) &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following commands can be entered:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
run&lt;br /&gt;
  Unpauses the game.&lt;br /&gt;
&lt;br /&gt;
pause&lt;br /&gt;
  Pauses the game.&lt;br /&gt;
&lt;br /&gt;
step &amp;lt;num-steps&amp;gt;&lt;br /&gt;
  When paused, instructs the emulator to make a single step, or a series of&lt;br /&gt;
  steps if num-steps is provided.&lt;br /&gt;
&lt;br /&gt;
regs&lt;br /&gt;
  Prints out general purpose register values.&lt;br /&gt;
&lt;br /&gt;
pc&lt;br /&gt;
  Print current value of Program Counter register&lt;br /&gt;
&lt;br /&gt;
pc-1&lt;br /&gt;
  Print previous value of Program Counter register&lt;br /&gt;
&lt;br /&gt;
asm&lt;br /&gt;
  Print assembly language instructions. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  asm                     Print one instruction at the Program Counter register&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt;              Print one instruction at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt;          Print &amp;lt;n&amp;gt; instructions starting at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt; &amp;lt;flags&amp;gt;  Print &amp;lt;n&amp;gt; instructions starting at &amp;lt;addr&amp;gt; with flags&lt;br /&gt;
    - If flags bit-3 is set (i.e. &amp;amp; 0x04): also print binary instruction data&lt;br /&gt;
    - If flags bit-2 is set: prefix each instruction with its memory address&lt;br /&gt;
    - If flags bit-1 is set: prefix each instruction with a counter from &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mem&lt;br /&gt;
  Print memory values. Several forms are supported:&lt;br /&gt;
  &lt;br /&gt;
  mem &amp;lt;addr&amp;gt;        Print one 32-bit word at &amp;lt;addr&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  mem /N &amp;lt;addr&amp;gt;     Print &amp;lt;N&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nb &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 8-bit bytes at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nh &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 16-bit half-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nw &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nd &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 64-bit double-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  mem /NxM &amp;lt;addr&amp;gt;   Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMb &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 8-bit bytes at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMh &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 16-bit half-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMw &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMd &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 64-bit double-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
write&lt;br /&gt;
  Write values to memory. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  write &amp;lt;addr&amp;gt; &amp;lt;value&amp;gt;    Write a (1) byte value to &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  write &amp;lt;addr&amp;gt; b &amp;lt;value&amp;gt;  Write a (1) byte value to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; h &amp;lt;value&amp;gt;  Write a half-word value (2 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; w &amp;lt;value&amp;gt;  Write a word value (4 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; d &amp;lt;value&amp;gt;  Write a double-word value (8 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
translate&lt;br /&gt;
  Translates virtual memory addresses to physical memory addresses. Memory&lt;br /&gt;
  read/write breakpoints must operate on physical addresses, in contrast to the&lt;br /&gt;
  memory read/write commands and execution breakpoints that operate on virtual&lt;br /&gt;
  addresses.&lt;br /&gt;
&lt;br /&gt;
  translate &amp;lt;virtual address&amp;gt;  Print the 32-bit physical address for the&lt;br /&gt;
                               provided &amp;lt;virtual address&amp;gt; argument.&lt;br /&gt;
&lt;br /&gt;
bp add&lt;br /&gt;
  Adds a breakpoint at a given address. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  bp add pc                  Add a breakpoint at the Program Counter, triggered&lt;br /&gt;
                             on EXEC, READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt;              Add a breakpoint at &amp;lt;addr&amp;gt;, triggered on EXEC,&lt;br /&gt;
                             READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt;          Add a breakpoint starting at &amp;lt;addr&amp;gt;, extending &amp;lt;n&amp;gt;&lt;br /&gt;
                             bytes, triggered on EXEC, READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt; &amp;lt;flags&amp;gt;  Add a breakpoint starting at &amp;lt;addr&amp;gt;, extending &amp;lt;n&amp;gt;&lt;br /&gt;
                             bytes, with specified trigger flags.&lt;br /&gt;
    - M64P_BKP_FLAG_READ = 0x02&lt;br /&gt;
    - M64P_BKP_FLAG_WRITE = 0x04&lt;br /&gt;
    - M64P_BKP_FLAG_EXEC = 0x08&lt;br /&gt;
&lt;br /&gt;
bp trig&lt;br /&gt;
  Prints the reason for the most recently activated breakpoint trigger. Memory&lt;br /&gt;
  read/write breakpoints will indicate the hit address.&lt;br /&gt;
&lt;br /&gt;
bp rm &amp;lt;addr|index&amp;gt;&lt;br /&gt;
  Removes a breakpoint by address or number.&lt;br /&gt;
&lt;br /&gt;
bp list&lt;br /&gt;
  Lists all breakpoints.&lt;br /&gt;
&lt;br /&gt;
exit|quit&lt;br /&gt;
  Stop emulator and quit debugger&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==64DD Support==&lt;br /&gt;
&lt;br /&gt;
Some compatibility with the 64DD disk drive unit has been implemented, but there&lt;br /&gt;
are a few small usability issues of which users should be aware.&lt;br /&gt;
&lt;br /&gt;
When using the 64DD, you need to pass a path to a cartridge rom, even if none is&lt;br /&gt;
strictly required.  The IPL boot rom will execute first and select the disk if&lt;br /&gt;
you have one inserted, or just show the boot menu otherwise.  We can remove this&lt;br /&gt;
requirement at a later time. For now all we need to remember is to use a Japanese&lt;br /&gt;
ROM (otherwise some region check will fail) with same features as the 64DD game&lt;br /&gt;
you want to play (think RumblePak, TransferPak, otherwise, they won&amp;#039;t be available).&lt;br /&gt;
&lt;br /&gt;
There is a sibling issue also with 64DD games in that there are no entries in the&lt;br /&gt;
game db (mupen64plus.ini) for them, and the core currently only relies on the cart&lt;br /&gt;
ROM loaded to fetch the ROM infos.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=UIConsoleUsage&amp;diff=88</id>
		<title>UIConsoleUsage</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=UIConsoleUsage&amp;diff=88"/>
		<updated>2019-02-10T19:06:13Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Console Options==&lt;br /&gt;
&lt;br /&gt;
At startup, the mupen64plus program will look for a user configuration file called &amp;#039;mupen64plus.cfg&amp;#039; (see [[FileLocations]] for more informations).&lt;br /&gt;
&lt;br /&gt;
If this file does not exist, it will be created and default settings will be written. If desired, an alternate config directory can be specified using the --configdir commandline option.&lt;br /&gt;
&lt;br /&gt;
Run &amp;#039;mupen64plus --help&amp;#039; for a complete list of commandline options:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ mupen64plus --help&lt;br /&gt;
 Usage: mupen64plus [parameter(s)] rom&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
    --noosd               : disable onscreen display&lt;br /&gt;
    --osd                 : enable onscreen display&lt;br /&gt;
    --fullscreen          : use fullscreen display mode&lt;br /&gt;
    --windowed            : use windowed display mode&lt;br /&gt;
    --resolution (res)    : display resolution (640x480, 800x600, 1024x768, etc)&lt;br /&gt;
    --nospeedlimit        : disable core speed limiter (should be used with dummy audio plugin)&lt;br /&gt;
    --cheats (cheat-spec) : enable or list cheat codes for the given rom file&lt;br /&gt;
    --corelib (filepath)  : use core library (filepath) (can be only filename or full path)&lt;br /&gt;
    --configdir (dir)     : force configation directory to (dir); should contain mupen64plus.cfg&lt;br /&gt;
    --datadir (dir)       : search for shared data files (.ini files, languages, etc) in (dir)&lt;br /&gt;
    --debug               : launch console-based debugger (requires core lib built for debugging)&lt;br /&gt;
    --plugindir (dir)     : search for plugins in (dir)&lt;br /&gt;
    --sshotdir (dir)      : set screenshot directory to (dir)&lt;br /&gt;
    --gfx (plugin-spec)   : use gfx plugin given by (plugin-spec)&lt;br /&gt;
    --audio (plugin-spec) : use audio plugin given by (plugin-spec)&lt;br /&gt;
    --input (plugin-spec) : use input plugin given by (plugin-spec)&lt;br /&gt;
    --rsp (plugin-spec)   : use rsp plugin given by (plugin-spec)&lt;br /&gt;
    --emumode (mode)      : set emu mode to: 0=Pure Interpreter 1=Interpreter 2=DynaRec&lt;br /&gt;
    --testshots (list)    : take screenshots at frames given in comma-separated (list), then quit&lt;br /&gt;
    --set (param-spec)    : set a configuration variable, format: ParamSection[ParamName]=Value&lt;br /&gt;
    --gb-rom-{1,2,3,4}    : define GB cart rom to load inside transferpak {1,2,3,4}&amp;quot;&lt;br /&gt;
    --gb-ram-{1,2,3,4}    : define GB cart ram to load inside transferpak {1,2,3,4}&amp;quot;&lt;br /&gt;
    --core-compare-send   : use the Core Comparison debugging feature, in data sending mode&lt;br /&gt;
    --core-compare-recv   : use the Core Comparison debugging feature, in data receiving mode&lt;br /&gt;
    --nosaveoptions       : do not save the given command-line options in configuration file&lt;br /&gt;
    --verbose             : print lots of information&lt;br /&gt;
    --help                : see this help message&lt;br /&gt;
&lt;br /&gt;
(plugin-spec):&lt;br /&gt;
    (pluginname)          : filename (without path) of plugin to find in plugin directory&lt;br /&gt;
    (pluginpath)          : full path and filename of plugin&lt;br /&gt;
    &amp;#039;dummy&amp;#039;               : use dummy plugin&lt;br /&gt;
&lt;br /&gt;
(cheat-spec):&lt;br /&gt;
    &amp;#039;list&amp;#039;                : show all of the available cheat codes&lt;br /&gt;
    &amp;#039;all&amp;#039;                 : enable all of the available cheat codes&lt;br /&gt;
    (codelist)            : a comma-separated list of cheat code numbers to enable,&lt;br /&gt;
                            with dashes to use code variables (ex 1-2 to use cheat 1 option 2)&lt;br /&gt;
&lt;br /&gt;
==Cheats==&lt;br /&gt;
To list the available cheats in the rom:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mupen64plus --cheats list &amp;quot;/path/to/my/rom.v64&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If there are cheats in the rom, you will get (in the output console):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
UI-Console: 3 cheat code(s) found for ROM &amp;#039;MY ROM&amp;#039;&lt;br /&gt;
   0: [Enable All Levels] (This is needed to be able to Play all Levels of the Game)&lt;br /&gt;
   1: [Enable All Weapons] (This is needed to be able to Play with all Weapons of the Game)&lt;br /&gt;
   2: etc...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
All you have to do to use this cheats is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mupen64plus --cheats 0,1,2 &amp;quot;/path/to/my/rom.v64&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Debugger==&lt;br /&gt;
===Setup===&lt;br /&gt;
&lt;br /&gt;
You must use a mupen64plus core library which was built with the DEBUGGER flag set.&lt;br /&gt;
&lt;br /&gt;
===Running===&lt;br /&gt;
&lt;br /&gt;
Use the --debug command-line option to enable the console debugger.&lt;br /&gt;
&lt;br /&gt;
The emulator mode should be set to &amp;quot;interpreter&amp;quot;, as the dynarec seems to cause&lt;br /&gt;
issues when interacting with the debugging API. This can be done with the R4300Emulator&lt;br /&gt;
config setting or with the --emumode flag.&lt;br /&gt;
&lt;br /&gt;
===Usage===&lt;br /&gt;
&lt;br /&gt;
Once the emulator boots, it will be paused by default. You will be presented&lt;br /&gt;
with a prompt as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(dbg) &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following commands can be entered:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
run&lt;br /&gt;
  Unpauses the game.&lt;br /&gt;
&lt;br /&gt;
pause&lt;br /&gt;
  Pauses the game.&lt;br /&gt;
&lt;br /&gt;
step &amp;lt;num-steps&amp;gt;&lt;br /&gt;
  When paused, instructs the emulator to make a single step, or a series of&lt;br /&gt;
  steps if num-steps is provided.&lt;br /&gt;
&lt;br /&gt;
regs&lt;br /&gt;
  Prints out general purpose register values.&lt;br /&gt;
&lt;br /&gt;
pc&lt;br /&gt;
  Print current value of Program Counter register&lt;br /&gt;
&lt;br /&gt;
pc-1&lt;br /&gt;
  Print previous value of Program Counter register&lt;br /&gt;
&lt;br /&gt;
asm&lt;br /&gt;
  Print assembly language instructions. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  asm                     Print one instruction at the Program Counter register&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt;              Print one instruction at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt;          Print &amp;lt;n&amp;gt; instructions starting at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  asm &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt; &amp;lt;flags&amp;gt;  Print &amp;lt;n&amp;gt; instructions starting at &amp;lt;addr&amp;gt; with flags&lt;br /&gt;
    - If flags bit-3 is set (i.e. &amp;amp; 0x04): also print binary instruction data&lt;br /&gt;
    - If flags bit-2 is set: prefix each instruction with its memory address&lt;br /&gt;
    - If flags bit-1 is set: prefix each instruction with a counter from &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mem&lt;br /&gt;
  Print memory values. Several forms are supported:&lt;br /&gt;
  &lt;br /&gt;
  mem &amp;lt;addr&amp;gt;        Print one 32-bit word at &amp;lt;addr&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  mem /N &amp;lt;addr&amp;gt;     Print &amp;lt;N&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nb &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 8-bit bytes at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nh &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 16-bit half-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nw &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /Nd &amp;lt;addr&amp;gt;    Print &amp;lt;N&amp;gt; 64-bit double-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  mem /NxM &amp;lt;addr&amp;gt;   Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMb &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 8-bit bytes at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMh &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 16-bit half-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMw &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 32-bit words at &amp;lt;addr&amp;gt;&lt;br /&gt;
  mem /NxMd &amp;lt;addr&amp;gt;  Print &amp;lt;N&amp;gt; rows of &amp;lt;M&amp;gt; 64-bit double-words at &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
write&lt;br /&gt;
  Write values to memory. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  write &amp;lt;addr&amp;gt; &amp;lt;value&amp;gt;    Write a (1) byte value to &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  write &amp;lt;addr&amp;gt; b &amp;lt;value&amp;gt;  Write a (1) byte value to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; h &amp;lt;value&amp;gt;  Write a half-word value (2 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; w &amp;lt;value&amp;gt;  Write a word value (4 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
  write &amp;lt;addr&amp;gt; d &amp;lt;value&amp;gt;  Write a double-word value (8 bytes) to &amp;lt;addr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
translate&lt;br /&gt;
  Translates virtual memory addresses to physical memory addresses. Memory&lt;br /&gt;
  read/write breakpoints must operate on physical addresses, in contrast to the&lt;br /&gt;
  memory read/write commands and execution breakpoints that operate on virtual&lt;br /&gt;
  addresses.&lt;br /&gt;
&lt;br /&gt;
  translate &amp;lt;virtual address&amp;gt;  Print the 32-bit physical address for the&lt;br /&gt;
                               provided &amp;lt;virtual address&amp;gt; argument.&lt;br /&gt;
&lt;br /&gt;
bp add&lt;br /&gt;
  Adds a breakpoint at a given address. Several forms are supported:&lt;br /&gt;
&lt;br /&gt;
  bp add pc                  Add a breakpoint at the Program Counter, triggered&lt;br /&gt;
                             on EXEC, READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt;              Add a breakpoint at &amp;lt;addr&amp;gt;, triggered on EXEC,&lt;br /&gt;
                             READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt;          Add a breakpoint starting at &amp;lt;addr&amp;gt;, extending &amp;lt;n&amp;gt;&lt;br /&gt;
                             bytes, triggered on EXEC, READ, and WRITE.&lt;br /&gt;
&lt;br /&gt;
  bp add &amp;lt;addr&amp;gt; &amp;lt;n&amp;gt; &amp;lt;flags&amp;gt;  Add a breakpoint starting at &amp;lt;addr&amp;gt;, extending &amp;lt;n&amp;gt;&lt;br /&gt;
                             bytes, with specified trigger flags.&lt;br /&gt;
    - M64P_BKP_FLAG_READ = 0x02&lt;br /&gt;
    - M64P_BKP_FLAG_WRITE = 0x04&lt;br /&gt;
    - M64P_BKP_FLAG_EXEC = 0x08&lt;br /&gt;
&lt;br /&gt;
bp trig&lt;br /&gt;
  Prints the reason for the most recently activated breakpoint trigger. Memory&lt;br /&gt;
  read/write breakpoints will indicate the hit address.&lt;br /&gt;
&lt;br /&gt;
bp rm &amp;lt;addr|index&amp;gt;&lt;br /&gt;
  Removes a breakpoint by address or number.&lt;br /&gt;
&lt;br /&gt;
bp list&lt;br /&gt;
  Lists all breakpoints.&lt;br /&gt;
&lt;br /&gt;
exit|quit&lt;br /&gt;
  Stop emulator and quit debugger&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==64DD Support==&lt;br /&gt;
&lt;br /&gt;
Some compatibility with the 64DD disk drive unit has been implemented, but there&lt;br /&gt;
are a few small usability issues of which users should be aware.&lt;br /&gt;
&lt;br /&gt;
When using the 64DD, you need to pass a path to a cartridge rom, even if none is&lt;br /&gt;
strictly required.  The IPL boot rom will execute first and select the disk if&lt;br /&gt;
you have one inserted, or just show the boot menu otherwise.  We can remove this&lt;br /&gt;
requirement at a later time. For now all we need to remember is to use a Japanese&lt;br /&gt;
ROM (otherwise some region check will fail) with same features as the 64DD game&lt;br /&gt;
you want to play (think RumblePak, TransferPak, otherwise, they won&amp;#039;t be available).&lt;br /&gt;
&lt;br /&gt;
There is a sibling issue also with 64DD games in that there are no entries in the&lt;br /&gt;
game db (mupen64plus.ini) for them, and the core currently only relies on the cart&lt;br /&gt;
ROM loaded to fetch the ROM infos.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_API_Versioning&amp;diff=87</id>
		<title>Mupen64Plus v2.0 API Versioning</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_v2.0_API_Versioning&amp;diff=87"/>
		<updated>2018-11-04T03:34:11Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Mupen64Plus v2.0 API Versioning =&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
The Mupen64Plus API versioning scheme was invented to give a more friendly and less confusing experience for users as the various components evolve over time.  There are 6 basic components to the Mupen64Plus system, which may be independently built and installed:&lt;br /&gt;
&lt;br /&gt;
# The Front-end UI application&lt;br /&gt;
# The Core emulator library&lt;br /&gt;
# The Video plugin&lt;br /&gt;
# The Audio plugin&lt;br /&gt;
# The Input plugin&lt;br /&gt;
# The RSP plugin&lt;br /&gt;
&lt;br /&gt;
These components interact with each other in several different ways.  The design goal of the versioning scheme is to gracefully handle all situations in which two components support different versions of their common API (due to one component being newer than the other).  In particular, each pair of components sharing a common API must discover whether or not they are compatible with each other.  They must make this determination early enough in the startup process to inform the user of an incompatibility and gracefully exit the software if necessary without crashing.  There are 2 different decisions that pertain to the compatibility determination:&lt;br /&gt;
&lt;br /&gt;
# Major API version.  The various API version numbers are 32-bit.  The major version number is stored in the upper 16 bits, and the minor version number is in the lower 16 bits.  If two components have different major API version numbers, then they are definitely incompatible.&lt;br /&gt;
# Minor API version.  If two components with a common API have different minor version numbers, then the newer component may decide whether or not it can interact with the older component based upon the older component&amp;#039;s version number.  The newer component may optionally disable new features and still retain backwards compatibility, or it may refuse to operate with the older component.  This decision is left to the component author when new features are added.&lt;br /&gt;
&lt;br /&gt;
== Basic Design ==&lt;br /&gt;
&lt;br /&gt;
In mupen64plus-core/src/plugin/plugin.h, the following macros are defined:&lt;br /&gt;
&lt;br /&gt;
 #define RSP_API_MAJOR_VERSION   0x20000&lt;br /&gt;
 #define GFX_API_MAJOR_VERSION   0x20000&lt;br /&gt;
 #define AUDIO_API_MAJOR_VERSION 0x20000&lt;br /&gt;
 #define INPUT_API_MAJOR_VERSION 0x20000&lt;br /&gt;
&lt;br /&gt;
In mupen64plus-core/src/main/version.h, the following macros are defined:&lt;br /&gt;
&lt;br /&gt;
 #define FRONTEND_API_VERSION 0x020000&lt;br /&gt;
 #define CONFIG_API_VERSION   0x020000&lt;br /&gt;
 #define DEBUG_API_VERSION    0x020000&lt;br /&gt;
 #define VIDEXT_API_VERSION   0x020000&lt;br /&gt;
&lt;br /&gt;
# When the front-end application calls the CoreStartup() function, it passes it&amp;#039;s Core&amp;lt;--&amp;gt;Front-end API version to the core.  If the API major version numbers for the core and front-end don&amp;#039;t match, the core will return from this function with a failure code of M64ERR_INCOMPATIBLE.&lt;br /&gt;
# The Console-UI front-end also checks for API compatibility, during the AttachCoreLib() function call.  It is not strictly necessary for a front-end application to verify the API compatibility with the core, since the core will also check during CoreStartup().  However, by doing so, an updated front-end may detect a core library using a newer (but backwards-compatible) API, and enable some extra features as a result of the expanded API.&lt;br /&gt;
# At the time each plugin is attached to the core (during CoreAttachPlugin function call), the core checks the version number of the plugin API by calling the PluginGetVersion function.  If the major version number of the plugin&amp;#039;s reported API (APIVersion &amp;amp; 0xffff0000) does not match the corresponding version number for that plugin type in the core (defined in plugin.h), then the plugin is incompatible and cannot be attached to the core.  Currently the plugins have no way to request the major version number required for a particular plugin type in the core library.  &lt;br /&gt;
# The emulator core exports several different API groups which may be used by the front-end and plugin modules.  Currently, these groups are: Front-end, Config, Debug, and Video Extension. A front-end application or any plugin may call the CoreGetAPIVersions() function to retrieve the API version numbers for these groups.  Any plugin or front-end which can use any updated (not present in the original &amp;quot;2.0&amp;quot; API) functions in one of these groups should call the core&amp;#039;s CoreGetAPIVersions() function (during PluginStartup for a plugin or at core attach time for a front-end) to check the version # of the API supported by the core, and react accordingly.&lt;br /&gt;
# All front-ends and plugins should verify API version compatibility for the Config API.&lt;br /&gt;
&lt;br /&gt;
== Handling Future Changes ==&lt;br /&gt;
&lt;br /&gt;
=== New feature added to a plugin library ===&lt;br /&gt;
If the feature is backwards-compatible with older cores, then plugin API minor version will be bumped.  Otherwise, major version number will be bumped.  If change is backwards-compatible, then newest core can test the plugin&amp;#039;s API version and only enable the feature if present.&lt;br /&gt;
&lt;br /&gt;
=== New feature added to Core&amp;lt;--&amp;gt;Front-end API ===&lt;br /&gt;
Typically this will happen when a new function or a new feature of an existing function is added to the core.  If the older front-ends will still be compatible with newer cores, then the minor version number of the front-end API will be bumped.  Otherwise the major version number will be bumped.  A newer front-end can check the version of the API supported by the core and choose whether to retain backwards-compatibility with older cores or refuse to interoperate.&lt;br /&gt;
&lt;br /&gt;
=== New feature added to Core Config API ===&lt;br /&gt;
If older plugins can still use the Core Config API with the new feature, then Config API minor version will be bumped.  Otherwise, major version number will be bumped.  Newer plugins should check the Core&amp;#039;s Config API version and maintain backwards compatibility with older cores if possible.&lt;br /&gt;
&lt;br /&gt;
=== New feature added to Core Debug API ===&lt;br /&gt;
If older front-ends can still use the Core Debug API with the new feature, then Debug API minor version number will be bumped.  Otherwise, major version number will be bumped.  Newer front-end applications should check the Core&amp;#039;s Debug API version and maintain backwards compatibility with older cores if possible.&lt;br /&gt;
&lt;br /&gt;
=== New feature added to Video Extension API ===&lt;br /&gt;
This is the most complicated interface, because it involves 3 components: the video plugin, the core, and the front-end application.  If older video plugins can still use the newer Video Extension API with the core, *and* newer front-end applications can work with older cores, then the Video Extension API minor version number will be bumped. Otherwise, the major version number will be bumped.  Newer video plugins can check the Core&amp;#039;s Video Extension API version and maintain backwards compatibility with older cores if possible, otherwise they can refuse and give a compatibility error.  Front-end applications (such as the default console-ui) which do not hook into the Video Extension do not need to check the Core&amp;#039;s Video Extension API version.  However, front-end applications which do hook into the Video Extension must check the API version.  If the Core and Front-end have different API major version numbers, then they are incompatible.  Also if the Core has a *newer* minor version than the front-end, then they are incompatible.  This is a unique restriction, and it must be checked and verified by the front-end; the Core has no way to check this.&lt;br /&gt;
&lt;br /&gt;
== Changelog ==&lt;br /&gt;
* Version 2.0.0 is the base for all APIs&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.0.1:&lt;br /&gt;
** added &amp;quot;m64p_command&amp;quot; type &amp;quot;M64CMD_CORE_STATE_SET&amp;quot;, handled by CoreDoCommand()&lt;br /&gt;
** added &amp;quot;m64p_core_param&amp;quot; type &amp;quot;M64CORE_SPEED_LIMITER&amp;quot;, handled by &amp;quot;M64CMD_CORE_STATE_QUERY&amp;quot; and &amp;quot;M64CMD_CORE_STATE_SET&amp;quot; commands&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.0.2:&lt;br /&gt;
** added &amp;quot;m64p_command&amp;quot; types:&lt;br /&gt;
*** M64CMD_GET_SCREEN_WIDTH&lt;br /&gt;
*** M64CMD_GET_SCREEN_HEIGHT&lt;br /&gt;
*** M64CMD_READ_SCREEN&lt;br /&gt;
*** M64CMD_VOLUME_UP&lt;br /&gt;
*** M64CMD_VOLUME_DOWN&lt;br /&gt;
*** M64CMD_VOLUME_GET_LEVEL&lt;br /&gt;
*** M64CMD_VOLUME_SET_LEVEL&lt;br /&gt;
*** M64CMD_VOLUME_MUTE&lt;br /&gt;
*** M64CMD_RESET&lt;br /&gt;
*** M64CMD_ADVANCE_FRAME&lt;br /&gt;
** extend command M64CMD_STATE_SAVE to support saving uncompressed PJ64 savestate files as well as zip compressed&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.0:&lt;br /&gt;
** removed &amp;quot;m64p_command&amp;quot; types:&lt;br /&gt;
*** M64CMD_GET_SCREEN_WIDTH&lt;br /&gt;
*** M64CMD_GET_SCREEN_HEIGHT&lt;br /&gt;
*** M64CMD_VOLUME_UP&lt;br /&gt;
*** M64CMD_VOLUME_DOWN&lt;br /&gt;
*** M64CMD_VOLUME_GET_LEVEL&lt;br /&gt;
*** M64CMD_VOLUME_SET_LEVEL&lt;br /&gt;
*** M64CMD_VOLUME_MUTE&lt;br /&gt;
** added new &amp;quot;m64p_core_param&amp;quot; types:&lt;br /&gt;
*** M64CORE_VIDEO_SIZE&lt;br /&gt;
*** M64CORE_AUDIO_VOLUME&lt;br /&gt;
*** M64CORE_AUDIO_MUTE&lt;br /&gt;
*** M64CORE_INPUT_GAMESHARK&lt;br /&gt;
*** M64CORE_STATE_LOADCOMPLETE&lt;br /&gt;
*** M64CORE_STATE_SAVECOMPLETE&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.1:&lt;br /&gt;
** Core command M64CMD_CORE_STATE_SET will now accept M64CORE_VIDEO_SIZE parameter&lt;br /&gt;
*** will call the video plugin function ResizeVideoOutput()&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FRONTEND_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.2:&lt;br /&gt;
** added &amp;quot;M64CMD_SET_MEDIA_LOADER&amp;quot; command to allow frontend to specify several media files (such as GB cartridge ROM and RAM files).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.0:&lt;br /&gt;
** add new function &amp;quot;ConfigSaveSection()&amp;quot; to save only a single config section to disk&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.2.0:&lt;br /&gt;
** add new function &amp;quot;ConfigHasUnsavedChanges()&amp;quot; to determine if a given Section (or all sections) of the Mupen64Plus Core configuration file has been modified since it was last saved or loaded.&lt;br /&gt;
** add new function &amp;quot;ConfigRevertChanges()&amp;quot; to revert changes previously made to one section of the configuration file, so that it will match with the configuration at the last time that it was loaded from or saved to disk.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.3.0:&lt;br /&gt;
** add new function &amp;quot;ConfigSetParameterHelp()&amp;quot; sets the value of one of the emulator&amp;#039;s configuration parameters.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CONFIG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.3.1:&lt;br /&gt;
** add new functions &amp;quot;ConfigExternalOpen()&amp;quot; &amp;quot;ConfigExternalClose()&amp;quot; &amp;quot;ConfigExternalGetParameter()&amp;quot; that allows plugins to leverage the core INI parser to read config files.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;DEBUG_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.0.1:&lt;br /&gt;
** add new function &amp;quot;DebugBreakpointTriggeredBy()&amp;quot; which allows a front-end application to determine which memory address and action (read, write, execute) caused a breakpoint to fire.&lt;br /&gt;
** add new function &amp;quot;DebugVirtualToPhysical()&amp;quot; which allows a front-end application to find the physical address which corresponds to a given virtual address.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEO_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.1.0:&lt;br /&gt;
** video render callback function now takes a boolean (int) parameter, which specifies whether the video frame has been re-drawn since the last time the render callback was called. This allows us to take screenshots without the On-Screen-Display text&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEO_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.2.0:&lt;br /&gt;
** add (optional) ResizeVideoOutput function in video plugin.  If this function is not present in video plugin, then resizing the output video window will not work.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEXT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 3.0.0:&lt;br /&gt;
** add VidExt_ResizeWindow() function in video extension.  This function is called by the video plugin to notify the window manager (SDL if no video extension is registered by the front-end) that the OpenGL render window size should change.&lt;br /&gt;
** add m64p_video_flags parameter to the VidExt_SetVideoMode() function.  Currently the flags are only used to notify the window manager that resizing is supported by the video plugin, and it should create a resizable window if possible.  This may be extended in the future to support other features.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;VIDEXT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 3.1.0:&lt;br /&gt;
** add VidExt_GL_GetDefaultFramebuffer() function in video extension. This function should be called to get the name of the default FBO.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;INPUT_API_VERSION&amp;#039;&amp;#039;&amp;#039; version 2.0.1:&lt;br /&gt;
** add (optional) RenderCallback function to input plugin. This function is called by the core after rendering on screen text (OSD) and before the graphics plugin swaps the buffers. The purpose of this function is to enable the input plugin to draw on screen content, for example buttons in a touch input plugin. If this function is not present the core will ignore it and on screen rendering by the input plugin will be disabled.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=FileLocations&amp;diff=86</id>
		<title>FileLocations</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=FileLocations&amp;diff=86"/>
		<updated>2018-01-25T06:19:29Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Where the heck are the files? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Where the heck are the files? ==&lt;br /&gt;
&lt;br /&gt;
Due to the flexibility of Mupen64Plus and its cross-platform design, they could be just about anywhere!  The quick-reference tables below gives the most likely locations for some common files. The remainder this wiki page gives the full details of where they could be.&lt;br /&gt;
&lt;br /&gt;
==== OSX/MacOS (Mupen64Plus 2.5.1 and earlier) ====&lt;br /&gt;
==== Linux ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;File Type&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Path&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Config file || &amp;lt;code&amp;gt;~/.config/mupen64plus/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Screenshots || &amp;lt;code&amp;gt;~/.local/share/mupen64plus/screenshot/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Save states || &amp;lt;code&amp;gt;~/.local/share/mupen64plus/save/&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== OSX/MacOS (Mupen64Plus 2.6 and later) ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;File Type&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Path&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Config file || &amp;lt;code&amp;gt;~/Library/Application Support/Mupen64plus/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Screenshots || &amp;lt;code&amp;gt;~/Library/Application Support/Mupen64plus/screenshot/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Save states || &amp;lt;code&amp;gt;~/Library/Application Support/Mupen64plus/save/&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Windows XP and Earlier ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;File Type&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Path&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Config file || &amp;lt;code&amp;gt;C:\Documents and Settings\your_user_name\Application Data\Mupen64Plus\&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Screenshots || &amp;lt;code&amp;gt;C:\Documents and Settings\your_user_name\Application Data\Mupen64Plus\screenshot\&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Save states || &amp;lt;code&amp;gt;C:\Documents and Settings\your_user_name\Application Data\Mupen64Plus\save\&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Windows Vista and Newer ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;File Type&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Path&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Config file || &amp;lt;code&amp;gt;C:\Users\your_user_name\AppData\Roaming\Mupen64Plus\&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Screenshots || &amp;lt;code&amp;gt;C:\Users\your_user_name\AppData\Roaming\Mupen64Plus\screenshot\&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Save states || &amp;lt;code&amp;gt;C:\Users\your_user_name\AppData\Roaming\Mupen64Plus\save\&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Front-End Specific Files ===&lt;br /&gt;
&lt;br /&gt;
The front-end User Interface is responsible for finding the core libraries and plugins for startup.  Each front-end may have its own method for finding these libraries.  The Mupen64Plus-UI-Console front-end looks for these libraries in the following places, in order:&lt;br /&gt;
&lt;br /&gt;
==== Core Library ====&lt;br /&gt;
# Path given by &amp;lt;code&amp;gt;--corelib&amp;lt;/code&amp;gt; option&lt;br /&gt;
# Path given at compile time with &amp;lt;code&amp;gt;COREDIR&amp;lt;/code&amp;gt; macro&lt;br /&gt;
# (MacOS-only, Mupen64Plus 2.6 and newer) Frameworks path within the app bundle&lt;br /&gt;
# No path at all (allows the Operating System to search for the shared library)&lt;br /&gt;
# Current directory&lt;br /&gt;
&lt;br /&gt;
==== Plugin Libraries====&lt;br /&gt;
The Mupen64Plus-UI-Console front-end looks through several directories in search of valid Mupen64Plus plugins.  When it finds a directory containing plugins, it populates a list with all of the plugins found.  Then, when loading plugins it only uses plugins from this list (found in one directory), unless the user specifies full plugin paths on the command line with the &amp;lt;code&amp;gt;--gfx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--audio&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--rsp&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;--input&amp;lt;/code&amp;gt; options.  The order in which directories are searched is:&lt;br /&gt;
&lt;br /&gt;
# Path given by &amp;lt;code&amp;gt;--plugindir&amp;lt;/code&amp;gt; option&lt;br /&gt;
# Path given by &amp;#039;&amp;#039;&amp;#039;PluginDir&amp;#039;&amp;#039;&amp;#039; parameter in Mupen64Plus config file&lt;br /&gt;
# (MacOS-only, Mupen64Plus 2.6 and newer) Frameworks folder within the app bundle&lt;br /&gt;
# (Unix-only) Path given at compile-time with &amp;lt;code&amp;gt;PLUGINDIR&amp;lt;/code&amp;gt; macro&lt;br /&gt;
# (Unix-only) &amp;lt;code&amp;gt;/usr/local/lib/mupen64plus&amp;lt;/code&amp;gt;&lt;br /&gt;
# (Unix-only) &amp;lt;code&amp;gt;/usr/lib/mupen64plus&amp;lt;/code&amp;gt;&lt;br /&gt;
# Current Directory&lt;br /&gt;
&lt;br /&gt;
=== Core-specific Files ===&lt;br /&gt;
&lt;br /&gt;
These are files which are read and written by the core emulator.&lt;br /&gt;
&lt;br /&gt;
==== Screenshots ====&lt;br /&gt;
# Path given by &amp;lt;code&amp;gt;--sshotdir&amp;lt;/code&amp;gt; option (if using Mupen64Plus-UI-Console)&lt;br /&gt;
# Path given by &amp;#039;&amp;#039;&amp;#039;ScreenshotPath&amp;#039;&amp;#039;&amp;#039; parameter in Mupen64Plus config file&lt;br /&gt;
# &amp;#039;&amp;#039;User_Data&amp;#039;&amp;#039;/screenshot/ (see OS-specific sections below)&lt;br /&gt;
&lt;br /&gt;
==== Save states ====&lt;br /&gt;
# &amp;#039;&amp;#039;User_Data&amp;#039;&amp;#039;/save/ (see OS-specific sections below)&lt;br /&gt;
&lt;br /&gt;
=== Unix-specific Search Paths ===&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;Shared_Data&amp;#039;&amp;#039; search paths work in the following way: each time a shared data file needs is requested (such as an .ini file, or font file), the emulator core looks through all of the &amp;#039;&amp;#039;Shared_Data&amp;#039;&amp;#039; paths in order to find the file.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Shared_Data&amp;#039;&amp;#039;:&lt;br /&gt;
# Path given by &amp;lt;code&amp;gt;--datadir&amp;lt;/code&amp;gt; option (if using Mupen64Plus-UI-Console)&lt;br /&gt;
# Path given by &amp;#039;&amp;#039;&amp;#039;SharedDataPath&amp;#039;&amp;#039;&amp;#039; parameter in Mupen64Plus config file&lt;br /&gt;
# (MacOS-only, Mupen64Plus 2.6 and newer) Resources folder within the app bundle&lt;br /&gt;
# Path given at compile-time with &amp;lt;code&amp;gt;SHAREDIR&amp;lt;/code&amp;gt; macro&lt;br /&gt;
# (Linux-only) &amp;lt;code&amp;gt;/usr/local/share/mupen64plus&amp;lt;/code&amp;gt;&lt;br /&gt;
# (Linux-only) &amp;lt;code&amp;gt;/usr/share/mupen64plus&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;./&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On MacOS (with Mupen64Plus 2.6 and newer), the User Data and User Config directories are set to &amp;lt;code&amp;gt;~/Library/Application Support/Mupen64Plus/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Under Linux, the &amp;#039;&amp;#039;User_Data&amp;#039;&amp;#039; and &amp;#039;&amp;#039;User_Config&amp;#039;&amp;#039; search paths work in the following way: at startup time, the emulator core looks through the list of directories to find one that exists.  The first one found is used to read/write all &amp;#039;&amp;#039;User_Data&amp;#039;&amp;#039; or &amp;#039;&amp;#039;User_Config&amp;#039;&amp;#039; files, or if none exists, then the last one in the list is created.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;User_Data&amp;#039;&amp;#039;:&lt;br /&gt;
# &amp;lt;code&amp;gt;$XDG_DATA_HOME/mupen64plus/&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;$HOME/.local/share/mupen64plus/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;User_Config&amp;#039;&amp;#039;:&lt;br /&gt;
# Path given by &amp;lt;code&amp;gt;--configdir&amp;lt;/code&amp;gt; option (if using Mupen64Plus-UI-Console)&lt;br /&gt;
# &amp;lt;code&amp;gt;$XDG_CONFIG_HOME/mupen64plus/&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;$HOME/.config/mupen64plus/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Windows-specific Search Paths ===&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;Shared_Data&amp;#039;&amp;#039; search paths work in the following way: each time a shared data file needs is requested (such as an .ini file, or font file), the emulator core looks through all of the &amp;#039;&amp;#039;Shared_Data&amp;#039;&amp;#039; paths in order to find the file.&lt;br /&gt;
&lt;br /&gt;
On Windows versions prior to Vista, the &amp;lt;code&amp;gt;$CSIDL_APPDATA&amp;lt;/code&amp;gt; path is usually: &amp;lt;code&amp;gt;C:\Documents and Settings\your_user_name\Application Data&amp;lt;/code&amp;gt;.  On later versions of Windows, this path is usually: &amp;lt;code&amp;gt;C:\Users\your_user_name\AppData\Roaming&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Shared_Data&amp;#039;&amp;#039;:&lt;br /&gt;
# Path given by &amp;lt;code&amp;gt;--datadir&amp;lt;/code&amp;gt; option (if using Mupen64Plus-UI-Console)&lt;br /&gt;
# Path given by &amp;#039;&amp;#039;&amp;#039;SharedDataPath&amp;#039;&amp;#039;&amp;#039; parameter in Mupen64Plus config file&lt;br /&gt;
# &amp;lt;code&amp;gt;$CSIDL_APPDATA\Mupen64Plus\&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On Windows, the &amp;#039;&amp;#039;User_Data&amp;#039;&amp;#039; and &amp;#039;&amp;#039;User_Config&amp;#039;&amp;#039; directories are the same.  These search paths work in the following way: at startup time, the emulator core looks through the list of directories to find one that exists.  The first one found is used to read/write all &amp;#039;&amp;#039;User_Data&amp;#039;&amp;#039; or &amp;#039;&amp;#039;User_Config&amp;#039;&amp;#039; files, or if none exists, then the last one in the list is created.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;User_Data&amp;#039;&amp;#039;:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;User_Config&amp;#039;&amp;#039;:&lt;br /&gt;
# Path given by &amp;lt;code&amp;gt;--configdir&amp;lt;/code&amp;gt; option (if using Mupen64Plus-UI-Console)&lt;br /&gt;
# &amp;lt;code&amp;gt;$CSIDL_APPDATA\Mupen64Plus\&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_Core_Parameters&amp;diff=63</id>
		<title>Mupen64Plus Core Parameters</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus_Core_Parameters&amp;diff=63"/>
		<updated>2015-10-04T22:55:55Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Mupen64Plus v2.0 Core API v1.0|Mupen64Plus v2.0 API]]&lt;br /&gt;
&lt;br /&gt;
= Core Parameters =&lt;br /&gt;
&lt;br /&gt;
These are standard parameters which are used by the Mupen64Plus Core library.  They are stored in a configuration section called &amp;quot;Core&amp;quot; and may be altered by the front-end in order to adjust the behaviour of the emulator.  These may be adjusted at any time and the effect of the change should occur immediately.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|M64TYPE_FLOAT&lt;br /&gt;
|Mupen64Plus Core config parameter set version number.  Please don&amp;#039;t change.&lt;br /&gt;
|-&lt;br /&gt;
|OnScreenDisplay&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Draw on-screen display if True, otherwise don&amp;#039;t draw OSD&lt;br /&gt;
|-&lt;br /&gt;
|R4300Emulator&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Use Pure Interpreter if 0, Cached Interpreter if 1, or Dynamic Recompiler if 2 or more&lt;br /&gt;
|-&lt;br /&gt;
|NoCompiledJump&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Disable compiled jump commands in dynamic recompiler (should be set to False)&lt;br /&gt;
|-&lt;br /&gt;
|DisableExtraMem&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Disable 4MB expansion RAM pack.  May be necessary for some games.&lt;br /&gt;
|-&lt;br /&gt;
|AutoStateSlotIncrement&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Increment the save state slot after each save operation.&lt;br /&gt;
|-&lt;br /&gt;
|EnableDebugger&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Activate the R4300 debugger when ROM execution begins, if core was built with Debugger support.&lt;br /&gt;
|-&lt;br /&gt;
|CurrentStateSlot&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Save state slot (0-9) to use when saving/loading the emulator state&lt;br /&gt;
|-&lt;br /&gt;
|ScreenshotPath&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Path to directory where screenshots are saved.  If this is blank, the default value of &amp;quot;&amp;lt;tt&amp;gt;GetConfigUserDataPath()&amp;lt;/tt&amp;gt;&amp;quot;/screenshot will be used.&lt;br /&gt;
|-&lt;br /&gt;
|SaveStatePath&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Path to directory where emulator save states (snapshots) are saved.  If this is blank, the default value of &amp;quot;&amp;lt;tt&amp;gt;GetConfigUserDataPath()&amp;lt;/tt&amp;gt;&amp;quot;/save will be used.&lt;br /&gt;
|-&lt;br /&gt;
|SaveSRAMPath&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Path to directory where SRAM/EEPROM data (in-game saves) are stored.  If this is blank, the default value of &amp;quot;&amp;lt;tt&amp;gt;GetConfigUserDataPath()&amp;lt;/tt&amp;gt;&amp;quot;/save will be used.&lt;br /&gt;
|-&lt;br /&gt;
|SharedDataPath&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Path to a directory to search when looking for shared data files in the &amp;lt;tt&amp;gt;ConfigGetSharedDataFilepath()&amp;lt;/tt&amp;gt; function.&lt;br /&gt;
|-&lt;br /&gt;
|CountPerOp&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|Force number of cycles per emulated instruction when set greater than 0.&lt;br /&gt;
|-&lt;br /&gt;
|DelaySI&lt;br /&gt;
|M64TYPE_BOOL&lt;br /&gt;
|Delay interrupt after DMA SI read/write.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These configuration parameters are used in the Core&amp;#039;s event loop to detect keyboard and joystick commands.  They are stored in a configuration section called &amp;quot;CoreEvents&amp;quot; and may be altered by the front-end in order to adjust the behaviour of the emulator.  These may be adjusted at any time and the effect of the change should occur immediately.  The Keysym value stored is actually &amp;lt;tt&amp;gt;(SDLMod &amp;lt;&amp;lt; 16) || SDLKey&amp;lt;/tt&amp;gt;, so that keypresses with modifiers like shift, control, or alt may be used.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Stop&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for stopping the emulator&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Fullscreen&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for switching between fullscreen/windowed modes&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Save State&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for saving the emulator state&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Load State&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for loading the emulator state&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Increment Slot&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for advancing the save state slot&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Reset&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for resetting the emulator&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Speed Down&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for slowing down the emulator&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Speed Up&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for speeding up the emulator&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Screenshot&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for taking a screenshot&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Pause&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for pausing the emulator&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Mute&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for muting/unmuting the sound&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Increase Volume&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for increasing the volume&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Decrease Volume&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for decreasing the volume&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Fast Forward&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for temporarily going really fast&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Frame Advance&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for advancing by one frame when paused&lt;br /&gt;
|-&lt;br /&gt;
|Kbd Mapping Gameshark&lt;br /&gt;
|M64TYPE_INT&lt;br /&gt;
|SDL keysym for pressing the game shark button&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These configuration parameters are used in the Core&amp;#039;s event loop to detect joystick commands.&lt;br /&gt;
&lt;br /&gt;
The command strings use a simple format described here. Note that you cannot have any spaces in the command string.  For commands activated by pressing a joystick axis, the format is &amp;quot;J&amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;+&amp;quot; or &amp;quot;J&amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;-&amp;quot;, where &amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039; is the SDL joystick number (must be between 0 and 9) and &amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039; is the axis number.  For the last character, &amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039; represents movement in the positive direction, while &amp;#039;&amp;#039;&amp;#039;-&amp;#039;&amp;#039;&amp;#039; represents movement in the negative direction.  For commands activated by pressing a button, the format is &amp;quot;J&amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;&amp;quot;, where &amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039; is the SDL joystick number (must be between 0 and 9) and &amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039; is the button number.  For commands activated by pressing a &amp;#039;&amp;#039;hat&amp;#039;&amp;#039; (a directional switch) on the joystick, the format is &amp;quot;J&amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;H&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;V&amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;&amp;quot;, where &amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039; is the SDL joystick number (must be between 0 and 9), &amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039; is the hat number, and &amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039; is the hat value.  The hat value corresponds with the SDL_HAT_ enumerated types: Up is 1, Right is 2, Down is 4, and Left is 8.  For diagonal directions, these values may be &amp;#039;&amp;#039;or&amp;#039;&amp;#039;d together.&lt;br /&gt;
&lt;br /&gt;
After the 2.5 release, several new features were added to these Joystick Mapping command strings.  You can now specify more than one joystick action which will activate a given command.  To specify several actions, use a comma-separated string containing multiple action phrases as given above (&amp;quot;J&amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;+&amp;quot; or &amp;quot;J&amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;&amp;quot; or &amp;quot;J&amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;H&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;V&amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;&amp;quot;).  Make sure there are no spaces in your command string.  Another new feature is that the &amp;quot;*&amp;quot; character can be used as a wildcard in the &amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039; joystick number field in order to activate this command for any joystick.  Finally, you can also use a hotkey specifier to require that two distinct joystick actions must be pressed simultaneously in order to activate a command.  The format for the hoykey feature is like &amp;quot;J&amp;#039;&amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Action&amp;#039;&amp;#039;/&amp;#039;&amp;#039;Action&amp;#039;&amp;#039;&amp;quot; where &amp;#039;&amp;#039;Action&amp;#039;&amp;#039; is either &amp;quot;A&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;+&amp;quot;, &amp;quot;A&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;-&amp;quot;, &amp;quot;B&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;&amp;quot;, or &amp;quot;H&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;V&amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s an example of a joystick command parameter which uses all three of these new features:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Joy Mapping Stop = &amp;quot;J0B6,J*B9,J1B5/A0-&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this joystick event string, the emulator will shut down when joystick 0 button 6 is pressed, or when button 9 is pressed on any joystick, or when button 5 is pressed on joystick 1 at the same time as axis 0 is moved left.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
!Parameter Name!!Type!!Usage&lt;br /&gt;
|-&lt;br /&gt;
|Version&lt;br /&gt;
|M64TYPE_FLOAT&lt;br /&gt;
|Mupen64Plus CoreEvents config parameter set version number.  Please don&amp;#039;t change.&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Stop&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for stopping the emulator&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Fullscreen&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for switching between fullscreen/windowed modes&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Save State&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for saving the emulator state&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Load State&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for loading the emulator state&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Increment Slot&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for advancing the save state slot&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Screenshot&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for taking a screenshot&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Pause&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for pausing or resuming the emulator&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Mute&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for muting/unmuting the sound&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Increase Volume&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for increasing the volume&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Decrease Volume&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for decreasing the volume&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Fast Forward&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for temporarily going really fast&lt;br /&gt;
|-&lt;br /&gt;
|Joy Mapping Gameshark&lt;br /&gt;
|M64TYPE_STRING&lt;br /&gt;
|Joystick event string for pressing the game shark button&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=ThirdPartyPlugins&amp;diff=62</id>
		<title>ThirdPartyPlugins</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=ThirdPartyPlugins&amp;diff=62"/>
		<updated>2015-09-19T15:05:28Z</updated>

		<summary type="html">&lt;p&gt;Richard42: /* Launchers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This page has been created to list all of the third-party plugins and front-end applications for mupen64plus, in order to facilitate research. It&amp;#039;s aim is to be a central place to find the different available plugins.&lt;br /&gt;
&lt;br /&gt;
If you have made a plugin for mupen64plus which is not in this section, please contact dorian.fevrier with a link of the web site, so that it may be added to this list.&lt;br /&gt;
&lt;br /&gt;
== Official Plugins ==&lt;br /&gt;
&lt;br /&gt;
Mupen64Plus has 5 of its own official plugins: mupen64plus-input-sdl, mupen64plus-audio-sdl, mupen64plus-rsp-hle, mupen64plus-video-rice, and mupen64plus-video-glide64mk2. If you have a problem with one of them, you should report it via [http://code.google.com/p/mupen64plus/issues/list the issues list]. &lt;br /&gt;
&lt;br /&gt;
== Third-Party Front-end and Launcher Applications ==&lt;br /&gt;
&lt;br /&gt;
Front-ends are applications which use the Mupen64Plus core emulator and compatible plugins, and present a user-interface.  The only front-end included with the core Mupen64Plus bundle is a command-line only program.  Third-party front-ends are developed and maintained outside of the main Mupen64Plus project but are compatible with Mupen64Plus 2.0.  They are supported &amp;#039;&amp;#039;&amp;#039;by their authors&amp;#039;&amp;#039;&amp;#039;. If you have a problem with one of them, the best thing to do is to contact directly the author, who is the best placed person to answer you.&lt;br /&gt;
&lt;br /&gt;
=== Front-End Applications under active development ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Application Name&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|[http://m64py.sourceforge.net/ m64py] || Python-based GUI Front-end using PyQt&lt;br /&gt;
|-&lt;br /&gt;
|[http://openemu.org/ OpenEmu] || OSX application which includes many different emulators. ([https://github.com/OpenEmu/OpenEmu Development Site])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Front-end Applications not under active development ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Application Name&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.mudlord.info/emulators/ winmupen] || Windows-specific GUI Front-end&lt;br /&gt;
|-&lt;br /&gt;
|[http://bitbucket.org/auria/wxmupen64plus/wiki/Home wxMupen64Plus] || A frontend with full support for configuration (mostly tested on OSX at this point)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.emutalk.net/showthread.php?t=50438 Gtk64] || GUI Front-end based on the object oriented GTKmm library&lt;br /&gt;
|-&lt;br /&gt;
|[http://sourceforge.net/userapps/mediawiki/vknecht/index.php?title=CuteMupen CuteMupen] || GUI front-end using Qt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Launchers ===&lt;br /&gt;
The difference between a full Front-End application and a Launcher application is that a Front-End application links directly with the Mupen64Plus libraries and can integrate very closely with the emulator to provide features like GUI emulator controls, an integrated video window, and graphical debugger.  A Launcher application does not link directly with the Mupen64Plus libraries, but uses the &amp;quot;mupen64plus-ui-console&amp;quot; command-line application to run the emulator.  This type of application is easier to develop, but cannot provide the more advanced features.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/dh4/mupen64plus-qt Mupen64Plus-Qt] || Cross-platform launcher based on CEN64-Qt&lt;br /&gt;
|-&lt;br /&gt;
|[http://sjtrny.com/mupenlaunch/ MupenLaunch] || Nice-looking Mac OSX Launcher written in Objective C&lt;br /&gt;
|-&lt;br /&gt;
|[http://mupen64plus.googlecode.com/svn/wiki/Mupen64Loader.bat Mupen64Loader.bat] || Windows batch file (tested on XP) from Supernatendo on 2010-05-11. This script simplifies the use of the Mupen64Plus console UI for Windows XP users.&lt;br /&gt;
|-&lt;br /&gt;
|[http://speedofmac.com/speedofmac_mp64+_launcher.html SpeedofMac MP64+ GUI] || Launcher application for Mac OSX written with AppleScript and Perl&lt;br /&gt;
|-&lt;br /&gt;
|[http://forums.ngemu.com/emulation-news-submissions/131998-new-mupen64plus-v1-99-3-release-february-2010-windows-also.html#post1803213 MupenGUI C#] || Windows-only launcher/config application&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Third-Party Plugins ==&lt;br /&gt;
&lt;br /&gt;
Third party plugins are plugins which are not part of the main bundle you can find here. The only way to use these are to download (and sometimes compile) them yourself.&lt;br /&gt;
&lt;br /&gt;
They are supported &amp;#039;&amp;#039;&amp;#039;by their authors&amp;#039;&amp;#039;&amp;#039;. If you have a problem with one of them, the best thing to do is to contact directly the author, who is the best placed person to answer you.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Plugin Name&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-video-arachnoid/ mupen64plus-video-arachnoid] || Video plugin for Mupen64Plus v2.0, based on the Arachnoid plugin for Project64.&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-rsp-z64/ mupen64plus-rsp-z64] || Low-level RSP processor plugin for the Mupen64Plus v2.0 project. This is based on Ziggy&amp;#039;s Z64 plugin. || &lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-video-z64/ mupen64plus-video-z64] || Low-level RDP plugin for the Mupen64Plus v2.0 project. This is based on Ziggy&amp;#039;s Z64 plugin. || &lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-video-glide64/ mupen64plus-video-glide64] || Video plugin for Mupen64Plus v2.0, based on the Glide64 plugin from Mupen64Plus 1.5.&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-rsp-cxd4/ mupen64plus-rsp-cxd4] || Low-level RSP processor plugin for the Mupen64Plus v2.0 project. This is based on Iconoclast/Batcat/cxd4s&amp;#039;s rsp plugin.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=MediaWiki:Loginprompt&amp;diff=61</id>
		<title>MediaWiki:Loginprompt</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=MediaWiki:Loginprompt&amp;diff=61"/>
		<updated>2015-08-09T15:00:41Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Created page with &amp;quot;To prevent abuse, the Mupen64Plus wiki is only editable by project members.  Contact Richard42 if you would like to get an account with permissions to edit this wiki.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To prevent abuse, the Mupen64Plus wiki is only editable by project members.  Contact Richard42 if you would like to get an account with permissions to edit this wiki.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=MainPage&amp;diff=60</id>
		<title>MainPage</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=MainPage&amp;diff=60"/>
		<updated>2015-07-26T23:04:53Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Created page with &amp;quot;http://mupen64plus.googlecode.com/svn/wiki/Mupen64Plus-splash.jpg  &amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039; is a cross-platform plugin-based N64 emulator which is capable of accurately playing many...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://mupen64plus.googlecode.com/svn/wiki/Mupen64Plus-splash.jpg&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039; is a cross-platform plugin-based N64 emulator which is capable of accurately playing many games.  Included are four &amp;#039;&amp;#039;MIPS R4300&amp;#039;&amp;#039; CPU emulators, with dynamic recompilers for 32-bit x86 and 64-bit amd64 systems, and necessary plugins for audio, graphical rendering (RDP), signal co-processor (RSP), and input.  There is 1 included OpenGL video plugin, called RiceVideo.  There are 3 other excellent video plugins being maintained by [http://bitbucket.org/wahrhaft/ wahrhaft], called Arachnoid, Glide64, and Z64.&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
 * Dynamic recompilers for 32-bit (x86) and 64-bit (amd64) machines&lt;br /&gt;
 * Two OpenGL video plugins, with [HighResolutionTextures Hi-resolution texture] support&lt;br /&gt;
 * [LIRC LIRC] Infrared remote control support&lt;br /&gt;
 * [RumbleSupport Rumble Pak] support (Linux only)&lt;br /&gt;
 * Cheat system with gameshark code support&lt;br /&gt;
 * Speed adjustment with smooth sound output&lt;br /&gt;
 * Shared library interface for integration into other systems (front-ends)&lt;br /&gt;
 * Command-line Front-end application&lt;br /&gt;
&lt;br /&gt;
=News=&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;April 26, 2015&amp;#039;&amp;#039;&amp;#039;: I am happy to announce the availability of the latest release of Mupen64Plus!  You can download it from GitHub, via the &amp;quot;v2.5 Release Downloads&amp;quot; link on the left.  Check out the release message in this [http://www.emutalk.net/threads/55485-Mupen64Plus-v2-5-Mupen-s-Last-Stand-%28on-Google-Code%29 emutalk thread] for more information.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;March 12, 2015&amp;#039;&amp;#039;&amp;#039;: Google has announced the shutdown of the Google Code hosting service.  Sadly, we will have to move our Mupen64Plus site off of here to a different host.  We&amp;#039;ll post our plans here once we decide where to move the site.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;February 3, 2015&amp;#039;&amp;#039;&amp;#039;: I apologize for such a long period with no new releases.  There have actually been many many changes since the last release.  Development effort has picked up significantly in the past half year or so, and we now have quite a few very smart and dedicated programmers who are improving Mupen64Plus in different areas. I promise there will be a new release this year.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Releases=&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mupen64Plus v2.5&amp;#039;&amp;#039;&amp;#039; is now available for all supported operating systems.  You can download it from the &amp;quot;v2.5 Release Downloads&amp;quot; link on the left.&lt;br /&gt;
&lt;br /&gt;
For detailed information about the differences between each release, check out the [[ReleasePage|Release Notes Page]]&lt;br /&gt;
&lt;br /&gt;
=Documentation=&lt;br /&gt;
&lt;br /&gt;
==For Users==&lt;br /&gt;
[[KeyboardSetup|Keyboard]] - Default keyboard setup &amp;amp; configuration&amp;lt;br&amp;gt;&lt;br /&gt;
[[ControllerSetup|Joysticks]] - How to set up your joystick if it is not auto-detected&amp;lt;br&amp;gt;&lt;br /&gt;
[[UIConsoleUsage|UI-Console]] - Mupen64Plus command-line UI usage&amp;lt;br&amp;gt;&lt;br /&gt;
[[FileLocations|File Locations]] - Places where Mupen64Plus installs and/or searches for various files&amp;lt;br&amp;gt;&lt;br /&gt;
[[RumbleSupport|Rumble]] - Instructions for setting up force-feedback (Linux only)&amp;lt;br&amp;gt;&lt;br /&gt;
[[HighResolutionTextures|Hi-res textures]] - Instructions for using hi-resolution texture packs with Rice Video&amp;lt;br&amp;gt;&lt;br /&gt;
[[ThirdPartyPlugins|Third Party Front-ends and Plugins]] - List of additional Front-ends (user interfaces) and plugins, compatible with Mupen64Plus 2.0 but not part of the bundle distributed here&amp;lt;br&amp;gt;&lt;br /&gt;
[[GameCompatibility|Games]] - Compatibility and game notes&amp;lt;br&amp;gt;&lt;br /&gt;
[[Screenshots]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== For Developers==&lt;br /&gt;
[[Mupen64Plus_v2.0_Core_API_v1.0|Mupen64Plus 2.0 API]] - Full documentation of the new API between plugins, the emulator core, and the front-end application&amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/mupen64plus Mupen64Plus source code] - Link to Git repository containing the Mupen64plus modules - the emulator core, 10 plugins, command-line user interface program, Win32 build dependencies and test ROM source code.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can download, build, and test the latest source code from our Git repository.  For Linux users, instructions can be found at the [[CompilingFromGit]] wiki page.  For Windows users, instructions can be found at the [[CompilingOnWindows]] wiki page.  For Apple OSX users, instructions are at the [[MacOSXInstructions]] page.&lt;br /&gt;
&lt;br /&gt;
=Questions  / Problems / Bugs=&lt;br /&gt;
If you have questions, you may post them in the [http://groups.google.com/group/mupen64plus Mupen64Plus Google Group].  To report a problem or a bug, you may post a message on the google group, or use the Issue Tracker above to file a bug report.&lt;br /&gt;
&lt;br /&gt;
We also have an IRC channel where many of the developers and fans hang out.  If you would like to stop by with a question or to say hi, it&amp;#039;s #mupen64plus at irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
=Developers, Developers, Developers!=&lt;br /&gt;
&lt;br /&gt;
For those who are not Mupen64Plus project members but would like to submit a patch, please post it in the [http://groups.google.com/group/mupen64plus Mupen64Plus Google Group].  For those who would like to join the project, please send an email to the project owner, which is given at the top of this page, on the right.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=UIConsoleUsage&amp;diff=59</id>
		<title>UIConsoleUsage</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=UIConsoleUsage&amp;diff=59"/>
		<updated>2015-07-26T22:45:47Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Instructions for using the Mupen64Plus-UI-Console front-end application&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Console Options==&lt;br /&gt;
&lt;br /&gt;
At startup, the mupen64plus program will look for a user configuration file called &amp;#039;mupen64plus.cfg&amp;#039; (see [[FileLocations]] for more informations).&lt;br /&gt;
&lt;br /&gt;
If this file does not exist, it will be created and default settings will be written. If desired, an alternate config directory can be specified using the --configdir commandline option.&lt;br /&gt;
&lt;br /&gt;
Run &amp;#039;mupen64plus --help&amp;#039; for a complete list of commandline options:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ mupen64plus --help&lt;br /&gt;
 Usage: mupen64plus [parameter(s)] rom&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
    --noosd               : disable onscreen display&lt;br /&gt;
    --osd                 : enable onscreen display&lt;br /&gt;
    --fullscreen          : use fullscreen display mode&lt;br /&gt;
    --windowed            : use windowed display mode&lt;br /&gt;
    --resolution (res)    : display resolution (640x480, 800x600, 1024x768, etc)&lt;br /&gt;
    --nospeedlimit        : disable core speed limiter (should be used with dummy audio plugin)&lt;br /&gt;
    --cheats (cheat-spec) : enable or list cheat codes for the given rom file&lt;br /&gt;
    --corelib (filepath)  : use core library (filepath) (can be only filename or full path)&lt;br /&gt;
    --configdir (dir)     : force configation directory to (dir); should contain mupen64plus.cfg&lt;br /&gt;
    --datadir (dir)       : search for shared data files (.ini files, languages, etc) in (dir)&lt;br /&gt;
    --plugindir (dir)     : search for plugins in (dir)&lt;br /&gt;
    --sshotdir (dir)      : set screenshot directory to (dir)&lt;br /&gt;
    --gfx (plugin-spec)   : use gfx plugin given by (plugin-spec)&lt;br /&gt;
    --audio (plugin-spec) : use audio plugin given by (plugin-spec)&lt;br /&gt;
    --input (plugin-spec) : use input plugin given by (plugin-spec)&lt;br /&gt;
    --rsp (plugin-spec)   : use rsp plugin given by (plugin-spec)&lt;br /&gt;
    --emumode (mode)      : set emu mode to: 0=Pure Interpreter 1=Interpreter 2=DynaRec&lt;br /&gt;
    --testshots (list)    : take screenshots at frames given in comma-separated (list), then quit&lt;br /&gt;
    --set (param-spec)    : set a configuration variable, format: ParamSection[ParamName]=Value&lt;br /&gt;
    --core-compare-send   : use the Core Comparison debugging feature, in data sending mode&lt;br /&gt;
    --core-compare-recv   : use the Core Comparison debugging feature, in data receiving mode&lt;br /&gt;
    --nosaveoptions       : do not save the given command-line options in configuration file&lt;br /&gt;
    --verbose             : print lots of information&lt;br /&gt;
    --help                : see this help message&lt;br /&gt;
&lt;br /&gt;
(plugin-spec):&lt;br /&gt;
    (pluginname)          : filename (without path) of plugin to find in plugin directory&lt;br /&gt;
    (pluginpath)          : full path and filename of plugin&lt;br /&gt;
    &amp;#039;dummy&amp;#039;               : use dummy plugin&lt;br /&gt;
&lt;br /&gt;
(cheat-spec):&lt;br /&gt;
    &amp;#039;list&amp;#039;                : show all of the available cheat codes&lt;br /&gt;
    &amp;#039;all&amp;#039;                 : enable all of the available cheat codes&lt;br /&gt;
    (codelist)            : a comma-separated list of cheat code numbers to enable,&lt;br /&gt;
                            with dashes to use code variables (ex 1-2 to use cheat 1 option 2)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
===Cheats===&lt;br /&gt;
To list the available cheats in the rom:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mupen64plus --cheats list &amp;quot;/path/to/my/rom.v64&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If there are cheats in the rom, you will get (in the output console):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
UI-Console: 3 cheat code(s) found for ROM &amp;#039;MY ROM&amp;#039;&lt;br /&gt;
   0: [Enable All Levels] (This is needed to be able to Play all Levels of the Game)&lt;br /&gt;
   1: [Enable All Weapons] (This is needed to be able to Play with all Weapons of the Game)&lt;br /&gt;
   2: etc...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
All you have to do to use this cheats is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mupen64plus --cheats 0,1,2 &amp;quot;/path/to/my/rom.v64&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=ThirdPartyPlugins&amp;diff=58</id>
		<title>ThirdPartyPlugins</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=ThirdPartyPlugins&amp;diff=58"/>
		<updated>2015-07-26T22:44:01Z</updated>

		<summary type="html">&lt;p&gt;Richard42: List of third party plugins and front-end applications for mupen64plus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This page has been created to list all of the third-party plugins and front-end applications for mupen64plus, in order to facilitate research. It&amp;#039;s aim is to be a central place to find the different available plugins.&lt;br /&gt;
&lt;br /&gt;
If you have made a plugin for mupen64plus which is not in this section, please contact dorian.fevrier with a link of the web site, so that it may be added to this list.&lt;br /&gt;
&lt;br /&gt;
== Official Plugins ==&lt;br /&gt;
&lt;br /&gt;
Mupen64Plus has 5 of its own official plugins: mupen64plus-input-sdl, mupen64plus-audio-sdl, mupen64plus-rsp-hle, mupen64plus-video-rice, and mupen64plus-video-glide64mk2. If you have a problem with one of them, you should report it via [http://code.google.com/p/mupen64plus/issues/list the issues list]. &lt;br /&gt;
&lt;br /&gt;
== Third-Party Front-end and Launcher Applications ==&lt;br /&gt;
&lt;br /&gt;
Front-ends are applications which use the Mupen64Plus core emulator and compatible plugins, and present a user-interface.  The only front-end included with the core Mupen64Plus bundle is a command-line only program.  Third-party front-ends are developed and maintained outside of the main Mupen64Plus project but are compatible with Mupen64Plus 2.0.  They are supported &amp;#039;&amp;#039;&amp;#039;by their authors&amp;#039;&amp;#039;&amp;#039;. If you have a problem with one of them, the best thing to do is to contact directly the author, who is the best placed person to answer you.&lt;br /&gt;
&lt;br /&gt;
=== Front-End Applications under active development ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Application Name&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|[http://m64py.sourceforge.net/ m64py] || Python-based GUI Front-end using PyQt&lt;br /&gt;
|-&lt;br /&gt;
|[http://openemu.org/ OpenEmu] || OSX application which includes many different emulators. ([https://github.com/OpenEmu/OpenEmu Development Site])&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Front-end Applications not under active development ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Application Name&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.mudlord.info/emulators/ winmupen] || Windows-specific GUI Front-end&lt;br /&gt;
|-&lt;br /&gt;
|[http://bitbucket.org/auria/wxmupen64plus/wiki/Home wxMupen64Plus] || A frontend with full support for configuration (mostly tested on OSX at this point)&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.emutalk.net/showthread.php?t=50438 Gtk64] || GUI Front-end based on the object oriented GTKmm library&lt;br /&gt;
|-&lt;br /&gt;
|[http://sourceforge.net/userapps/mediawiki/vknecht/index.php?title=CuteMupen CuteMupen] || GUI front-end using Qt&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Launchers ===&lt;br /&gt;
The difference between a full Front-End application and a Launcher application is that a Front-End application links directly with the Mupen64Plus libraries and can integrate very closely with the emulator to provide features like GUI emulator controls, an integrated video window, and graphical debugger.  A Launcher application does not link directly with the Mupen64Plus libraries, but uses the &amp;quot;mupen64plus-ui-console&amp;quot; command-line application to run the emulator.  This type of application is easier to develop, but cannot provide the more advanced features.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.emutalk.net/threads/54976-Mupen64Plus-Qt Mupen64Plus-Qt] || Cross-platform launcher based on CEN64-Qt&lt;br /&gt;
|-&lt;br /&gt;
|[http://sjtrny.com/mupenlaunch/ MupenLaunch] || Nice-looking Mac OSX Launcher written in Objective C&lt;br /&gt;
|-&lt;br /&gt;
|[http://mupen64plus.googlecode.com/svn/wiki/Mupen64Loader.bat Mupen64Loader.bat] || Windows batch file (tested on XP) from Supernatendo on 2010-05-11. This script simplifies the use of the Mupen64Plus console UI for Windows XP users.&lt;br /&gt;
|-&lt;br /&gt;
|[http://speedofmac.com/speedofmac_mp64+_launcher.html SpeedofMac MP64+ GUI] || Launcher application for Mac OSX written with AppleScript and Perl&lt;br /&gt;
|-&lt;br /&gt;
|[http://forums.ngemu.com/emulation-news-submissions/131998-new-mupen64plus-v1-99-3-release-february-2010-windows-also.html#post1803213 MupenGUI C#] || Windows-only launcher/config application&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Third-Party Plugins ==&lt;br /&gt;
&lt;br /&gt;
Third party plugins are plugins which are not part of the main bundle you can find here. The only way to use these are to download (and sometimes compile) them yourself.&lt;br /&gt;
&lt;br /&gt;
They are supported &amp;#039;&amp;#039;&amp;#039;by their authors&amp;#039;&amp;#039;&amp;#039;. If you have a problem with one of them, the best thing to do is to contact directly the author, who is the best placed person to answer you.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Plugin Name&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-video-arachnoid/ mupen64plus-video-arachnoid] || Video plugin for Mupen64Plus v2.0, based on the Arachnoid plugin for Project64.&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-rsp-z64/ mupen64plus-rsp-z64] || Low-level RSP processor plugin for the Mupen64Plus v2.0 project. This is based on Ziggy&amp;#039;s Z64 plugin. || &lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-video-z64/ mupen64plus-video-z64] || Low-level RDP plugin for the Mupen64Plus v2.0 project. This is based on Ziggy&amp;#039;s Z64 plugin. || &lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-video-glide64/ mupen64plus-video-glide64] || Video plugin for Mupen64Plus v2.0, based on the Glide64 plugin from Mupen64Plus 1.5.&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/mupen64plus/mupen64plus-rsp-cxd4/ mupen64plus-rsp-cxd4] || Low-level RSP processor plugin for the Mupen64Plus v2.0 project. This is based on Iconoclast/Batcat/cxd4s&amp;#039;s rsp plugin.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=SoftResetNotes&amp;diff=57</id>
		<title>SoftResetNotes</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=SoftResetNotes&amp;diff=57"/>
		<updated>2015-07-26T22:39:50Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Developer notes on soft reset feature&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Details ===&lt;br /&gt;
&lt;br /&gt;
5.2.6 Non Maskable Interrupt (NMI) Exception&lt;br /&gt;
A non maskable interrupt exception occurs when the NMI signal is asserted to the processor. Unlike all other interrupts, this exception is not maskable. An NMI occurs only at instruction boundaries, so does not do any reset or other hardware initialization. The state of the cache, memory, and other processor state is consistent and all registers are preserved, with the following exceptions:&lt;br /&gt;
* The BEV, TS, SR, NMI, and ERL ﬁelds of theStatus register are initialized to a speciﬁed state.&lt;br /&gt;
* TheErrorEPC register is loaded with restart PC, as described inTable 5-5.&lt;br /&gt;
* PC is loaded with16#BFC0 0000.&lt;br /&gt;
&amp;#039;&amp;#039;Cause&amp;#039;&amp;#039; Register ExcCode Value: None&lt;br /&gt;
Additional State Saved: None&lt;br /&gt;
Entry Vector Used: Reset 16#BFC0 0000&lt;br /&gt;
&lt;br /&gt;
Operation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
   StatusBEV &amp;lt;-- 1&lt;br /&gt;
   StatusTS &amp;lt;-- 0&lt;br /&gt;
   StatusSR &amp;lt;-- 0&lt;br /&gt;
   StatusNMI &amp;lt;-- 1&lt;br /&gt;
   StatusERL &amp;lt;-- 1&lt;br /&gt;
   if InstructionInBranchDelaySlot then&lt;br /&gt;
      ErrorEPC &amp;lt;-- restartPC # PC of branch/jump&lt;br /&gt;
   else&lt;br /&gt;
      ErrorEPC &amp;lt;-- restartPC # PC of instruction&lt;br /&gt;
   endif&lt;br /&gt;
PC &amp;lt;-- 16#BFC0 0000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== From assemblergames.com ===&lt;br /&gt;
&lt;br /&gt;
Marshallh [http://www.assemblergames.com/forums/showthread.php?p=477806 wrote]:&lt;br /&gt;
&lt;br /&gt;
On boot, the PIF inside the n64 starts sending a very, very long sequence of random numbers to the CIC. The PIF is always reading the response back (this is a continuous process while the N64 is turned on).&lt;br /&gt;
&lt;br /&gt;
Once the PIF is happy with the values it&amp;#039;s getting back, it releases NMI on the R4300. This causes an NMI interrupt on the cpu, and causes it to start executing code from the memory location 0xBFC00000. Because all the memory is accessed through the RCP, this small segment of memory is mapped to a small almost 2k chunk of ROM in the PIF called PIF-rom.&lt;br /&gt;
&lt;br /&gt;
The code in there is r4300 executable code. The actual boot process is pretty convoluted, that&amp;#039;s another time. But about halfway through the sequence of boot programs, the R4300 reads from PIF ram (small 64byte area) and this contains values used in the calculation of the CIC seed. (6102 seed is 0x3f)&lt;br /&gt;
&lt;br /&gt;
The way a game determines whether it&amp;#039;s running on a PAL or NTSC console is simple - it&amp;#039;s hardcoded in the PIF rom.&lt;br /&gt;
&lt;br /&gt;
If you have a logic analyzer and some tools you can put probes on the lines that go from the PIF to the RCP and catch all the contents of the pif ROM as it&amp;#039;s read. This is the only way to get access to it, because after the boot process you will read all 0&amp;#039;s from where the PIFrom used to be mapped.&lt;br /&gt;
&lt;br /&gt;
Once you have it dumped you can look for the instruction that loads the register s4 (something like li s4, 0x01) and change it to 0x0 for PAL, and 0x1 for NTSC.&lt;br /&gt;
&lt;br /&gt;
You can also use a boot emulator to do all this, but it means you have to have a way of running your own code. The boot emulator basically runs a version of PIFrom that is hacked to skip the security checks, and you patch in whatever values you want (you can fake different CICs and regions this way)&lt;br /&gt;
&lt;br /&gt;
The CIC seed is also used to checksum the bootcode in the first 4k of game ROM, and to also checksum the first 1MB transferred to make sure the cart interface is reliable.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Screenshots&amp;diff=56</id>
		<title>Screenshots</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Screenshots&amp;diff=56"/>
		<updated>2015-07-26T22:37:47Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Mupen64Plus Screenshots&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=== Paper Mario ===&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot-01-PaperMario.png]]&lt;br /&gt;
[[File:Screenshot-02-PaperMario.png]]&lt;br /&gt;
&lt;br /&gt;
=== Hi-res Mario 64 ===&lt;br /&gt;
&lt;br /&gt;
http://i32.tinypic.com/2saldmg.png&lt;br /&gt;
http://i30.tinypic.com/t5fw37.png&lt;br /&gt;
&lt;br /&gt;
=== Hi-res Zelda Ocarina of Time ===&lt;br /&gt;
&lt;br /&gt;
This is a cel-shaded pack, by Djipi.&lt;br /&gt;
&lt;br /&gt;
[[File:Zelda-OOT-01.jpg]]&lt;br /&gt;
[[File:Zelda-OOT-02.jpg]]&lt;br /&gt;
[[File:Zelda-OOT-03.jpg]]&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Zelda-OOT-03.jpg&amp;diff=55</id>
		<title>File:Zelda-OOT-03.jpg</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Zelda-OOT-03.jpg&amp;diff=55"/>
		<updated>2015-07-26T22:31:10Z</updated>

		<summary type="html">&lt;p&gt;Richard42: zelda screenshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;zelda screenshot&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Zelda-OOT-02.jpg&amp;diff=54</id>
		<title>File:Zelda-OOT-02.jpg</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Zelda-OOT-02.jpg&amp;diff=54"/>
		<updated>2015-07-26T22:30:59Z</updated>

		<summary type="html">&lt;p&gt;Richard42: zelda screenshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;zelda screenshot&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Zelda-OOT-01.jpg&amp;diff=53</id>
		<title>File:Zelda-OOT-01.jpg</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Zelda-OOT-01.jpg&amp;diff=53"/>
		<updated>2015-07-26T22:30:47Z</updated>

		<summary type="html">&lt;p&gt;Richard42: zelda screenshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;zelda screenshot&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Screenshot-02-PaperMario.png&amp;diff=52</id>
		<title>File:Screenshot-02-PaperMario.png</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Screenshot-02-PaperMario.png&amp;diff=52"/>
		<updated>2015-07-26T22:30:26Z</updated>

		<summary type="html">&lt;p&gt;Richard42: paper mario screenshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;paper mario screenshot&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Screenshot-01-PaperMario.png&amp;diff=51</id>
		<title>File:Screenshot-01-PaperMario.png</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Screenshot-01-PaperMario.png&amp;diff=51"/>
		<updated>2015-07-26T22:30:12Z</updated>

		<summary type="html">&lt;p&gt;Richard42: paper mario screenshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;paper mario screenshot&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Mupen64Plus-splash.jpg&amp;diff=50</id>
		<title>File:Mupen64Plus-splash.jpg</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Mupen64Plus-splash.jpg&amp;diff=50"/>
		<updated>2015-07-26T22:29:43Z</updated>

		<summary type="html">&lt;p&gt;Richard42: splash pic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;splash pic&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Mupen64Plus-02.jpg&amp;diff=49</id>
		<title>File:Mupen64Plus-02.jpg</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Mupen64Plus-02.jpg&amp;diff=49"/>
		<updated>2015-07-26T22:29:15Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Richard42 uploaded a new version of &amp;amp;quot;File:Mupen64Plus-02.jpg&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;rom browser screenshot&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:Mupen64Plus-02.jpg&amp;diff=48</id>
		<title>File:Mupen64Plus-02.jpg</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:Mupen64Plus-02.jpg&amp;diff=48"/>
		<updated>2015-07-26T22:28:49Z</updated>

		<summary type="html">&lt;p&gt;Richard42: rom browser screenshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;rom browser screenshot&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=RumbleSupport&amp;diff=47</id>
		<title>RumbleSupport</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=RumbleSupport&amp;diff=47"/>
		<updated>2015-07-26T22:13:25Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Notes on using Rumble Pak support with Mupen64Plus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The first official Mupen64Plus release which includes support for the Rumble Pak feature is v1.4.  This feature has been tested and is known to work with Logitech Rumble Pad 2 wireless controllers.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
In order to use the Rumble Pak feature in Mupen64Plus, you must have the HID Force Feedback module enabled in your kernel, and you must have the proper HID force feedback driver for your gamepad also enabled in your kernel.  The easiest way to test your system for compatibility is to run the emulator from a console and launch a game to get diagnostic messages from the emulator.  Look in the printed information for this line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[blight&amp;#039;s SDL input plugin]: version 0.0.10 initialized.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Just prior to this line, there should be some messages regarding the rumble pak feature.  The meanings of the various messages are given below:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[blight&amp;#039;s SDL input plugin]: Couldn&amp;#039;t find input event for rumble support.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This suggests that your kernel does not have the required support for the rumble feature&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[blight&amp;#039;s SDL input plugin]: Couldn&amp;#039;t open device file &amp;#039;/dev/input/eventX&amp;#039; for rumble support.&amp;lt;/code&amp;gt; (X is a number)&lt;br /&gt;
&lt;br /&gt;
This is usually caused by restrictive permissions.  It is easy to set the correct permissions on this device file.  You can do this by entering &amp;quot;sudo chmod 666 /dev/input/eventX&amp;quot; where X is the number given in the error message.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[blight&amp;#039;s SDL input plugin]: Linux kernel communication failed for force feedback (rumble)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This error message can occur when your kernel does not have support for HID Force Feedback built into it or as a module.  You must rebuild your kernel to include support for both HID force feedback and the correct driver for your gamepad.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[blight&amp;#039;s SDL input plugin]: No rumble supported on N64 joystick #1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This could be caused by lack of kernel support or by using a joystick which does not support force feedback&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[blight&amp;#039;s SDL input plugin]: Rumble activated on N64 joystick #1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rumble is working and enabled&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The Blight Input configuration dialog allows the user to configure the default pak to be plugged-in at game start time (this can be either Mem Pak, Rumble Pak, or None).  It also allows the user to assign controller buttons to two switches, called &amp;quot;Mempak Switch&amp;quot; and &amp;quot;Rumblepak Switch&amp;quot;.  When these buttons are pressed, it will swap in a &amp;quot;virtual memory pak&amp;quot; or a &amp;quot;virtual rumble pak&amp;quot; in the selected controller.  There will also be tactile feedback given when switching paks - plugging in a memory pak will give a weak rumble, while plugging in a rumble pak will give a strong rumble.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=RomCacheSystem&amp;diff=46</id>
		<title>RomCacheSystem</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=RomCacheSystem&amp;diff=46"/>
		<updated>2015-07-26T22:12:13Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Design document for Rom Cache System (RCS)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Rom Cache System (RCS) Concept ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objective:&amp;#039;&amp;#039;&amp;#039; Create a system that passively retrieves/loads information about the Rom Browser, and current ROM being played.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Operations:&amp;#039;&amp;#039;&amp;#039; Start the RCS when Mupen64Plus is executed. If -–nogui is specified then do not worry about the Rom Browser operations.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;The RCS will be responsible for the following tasks:&amp;#039;&amp;#039;&lt;br /&gt;
* Caching the MD5, Filename, Good Name (from database), and OS Timestamp (for checking if a file has changed) of each of the entries in the Rom Browser. This file will be external and will be loaded when the GUI version boots up to speed up the Rom Browser creation.&lt;br /&gt;
* Reading a ROM database that contains meta information about each ROM. This file will be external and replace mupen64plus.ini&lt;br /&gt;
* Sending a notification to the Rom Browser to update the list with new information when the initial caching is going on.&lt;br /&gt;
* Storing global information about the current ROM being played.&lt;br /&gt;
&lt;br /&gt;
=== Other Information ===&lt;br /&gt;
&lt;br /&gt;
When creating the Rom List, it would not be proper to display ROMs that have not been initially cached. Once they have been cached with the MD5, Good Name lookup, and Filename they should be displayed onto the Rom Browser.&lt;br /&gt;
&lt;br /&gt;
The process of caching should not be redundant and should only occur if the cache file does not exist, or the Refresh is selected. In the case that Refresh is selected, the files should be checked against the already cached files to speed up performance. Any files that are not existing anymore should be removed from the cache file.&lt;br /&gt;
&lt;br /&gt;
The caching thread should be halted when the user starts a ROM, and should resume caching as if the Rom Browser has been refreshed. It should be continued when the user stops the ROM.&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
&lt;br /&gt;
Since there is a bulk list of ROMS, we want our list to be cross referencing itself. Please look at the following flags that will be included:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[MD5]&lt;br /&gt;
CRC=CRC&lt;br /&gt;
GoodName=STRING&lt;br /&gt;
Compatible=STRING&lt;br /&gt;
ExpansionPack=1/0&lt;br /&gt;
SoftHack=CODE0001 CODE, CODE0002 CODE&lt;br /&gt;
Reference=MD5&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A lot of this should be self explanatory, however just for note... if a reference is used, the ROM will inherit the referenced MD5 properties, and then they can be modified as needed. If you feel like something should be added to the database please feel free to comment in the appropriate discussion so it gets noted.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=RomBrowserColumns&amp;diff=45</id>
		<title>RomBrowserColumns</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=RomBrowserColumns&amp;diff=45"/>
		<updated>2015-07-26T22:11:04Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Useful information about the meaning of each column in the ROM browser&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Country&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The release country code for commercial ROMs and N64 tools. Usually this is an indication of the default language and / or target audience for a game. Homebrew programs may use a region code or simply identify as Demos. Additionally, prelease versions of commercial ROMs are flagged as Betas.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;GoodName&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GoodN64 is a database of nearly all known N64 ROMs created by Cowering (www.allgoodthings.us). Mupen64Plus uses these names to distinguish ROMs as the file may be misnamed. Each ROM is assigned a unique Good Name on the following criteria:&lt;br /&gt;
&lt;br /&gt;
Release country code for commercial ROMs:&lt;br /&gt;
* (JU) USA/Japan&lt;br /&gt;
* (G) Germany&lt;br /&gt;
* (U) USA&lt;br /&gt;
* (F) France&lt;br /&gt;
* (I) Italy&lt;br /&gt;
* (J) Japan&lt;br /&gt;
* (S) Spain&lt;br /&gt;
* (A) Australia&lt;br /&gt;
* (E) Europe&lt;br /&gt;
* or (PD) Public Domain for homebrew.&lt;br /&gt;
&lt;br /&gt;
Additionally, each name has at least one of the following codes:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[!]&amp;lt;/code&amp;gt; - Verified Good Dump - If these ROMs don&amp;#039;t work, it is an emulation bug.&lt;br /&gt;
* &amp;lt;code&amp;gt;[a#]&amp;lt;/code&amp;gt; - Alternative - An alternate working version of a ROM. &lt;br /&gt;
* &amp;lt;code&amp;gt;(M#)&amp;lt;/code&amp;gt; - Multilanguage - Official support for # of languages.&lt;br /&gt;
* &amp;lt;code&amp;gt;[o#]&amp;lt;/code&amp;gt; - Overdumped - An overdumped ROM image has more data than is actually in the cart. Besides wasting space, the ROM should be okay.&lt;br /&gt;
&lt;br /&gt;
The following codes indicate that the ROM was modified or hacked in some manner. Mupen64Plus will issue a warning when trying to load one of these ROMs, although many should work fine.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[T?]&amp;lt;/code&amp;gt; - Translation - Unlike multilanguage support from (M#) ROMs, these translations were made by hackers to allow access of games to a broader audience. As performing such a translation involves manipulating large amounts of ROM data, it is possible unintended bugs were introduced. &amp;lt;code&amp;gt;[T+?&amp;lt;/code&amp;gt; indicates a newer translation, while &amp;lt;code&amp;gt;[T-?&amp;lt;/code&amp;gt; indicates an older release. If a translation doesn&amp;#039;t work, you might want to obtain a newer version.&lt;br /&gt;
* &amp;lt;code&amp;gt;[t#]&amp;lt;/code&amp;gt; - Trained - A trainer is special code which executes before the game is begun. It allows you to access cheats from a menu.&lt;br /&gt;
* &amp;lt;code&amp;gt;[h#]&amp;lt;/code&amp;gt; - Hacked - A general hacked ROM. Hacks range from changed headers to allow running in different regions, release group intros, or just some kind of cheating or funny hack.&lt;br /&gt;
* &amp;lt;code&amp;gt;[b#]&amp;lt;/code&amp;gt; - Bad Dump - A released bad dump, either due to a faulty dumping or corruption on upload.&lt;br /&gt;
* &amp;lt;code&amp;gt;[f#]&amp;lt;/code&amp;gt; - Fixed - A ROM has been altered in some way so that it might run better, usually from the perspective of using a hardware copier.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mupen64Plus uses a 0-5 star ranking system to give a rough indication of how well a given ROM works with the emulator. Additionally this can be viewed as the probably the ROM will work for a given system.&lt;br /&gt;
&lt;br /&gt;
0 stars - Unknown / Critical Issues - The ROM doesn&amp;#039;t load or crashes the emulator. Definitely won&amp;#039;t work.&lt;br /&gt;
&lt;br /&gt;
1 star - Severe Issues - The ROM loads, but is unplayable. This is usually due to one of the following: no input, no audio, or no video with any plugin combination. Probably won&amp;#039;t work.&lt;br /&gt;
&lt;br /&gt;
2 stars - Moderate Issues - Playable with one plugin combination on some systems. Might work.&lt;br /&gt;
&lt;br /&gt;
3 stars - Mild Issues - Playable with multiple plugins but sometimes with severe artifacts. Will likely work.&lt;br /&gt;
&lt;br /&gt;
4 stars - Minor Issues - Only minor artifacts with all plugins. Should work.&lt;br /&gt;
&lt;br /&gt;
5 stars - Perfect - No known issues. Will definitely work.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;User Comments&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mupen64Plus gives users the ability to enter short (256 byte) comments to label or classify ROMs without having to rename the files. Some possible uses are to track game progress while playing a number of ROMs, rank ROMs based on preference, or make notes of emulation issues for helping with development.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;File Name&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The file name or full path of the ROM.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;MD5 Hash&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The md5sum of the ROM data. Used to differentiate ROMs.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CRC1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The first 4 bytes of the ROM&amp;#039;s identifying CRC code, located in the header of the N64 ROM format. This is largely for legacy purposes as ROMs used to be differentiated by CRC. However, as it is possible for the header to be corrupt and / or many different ROMs to share the same CRC, MD5 hashes of the entire ROM file are now used instead. Many cheat codes and video plugins still reference this information, so it is useful for the end user.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CRC2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The second 4 bytes of the ROM&amp;#039;s identifying CRC code, located in the header of the N64 ROM format. This is largely for legacy purposes as ROMs used to be differentiated by CRC. However, as it is possible for the header to be corrupt and / or many different ROMs to share the same CRC, MD5 hashes of the entire ROM file are now used instead. Many cheat codes and video plugins still reference this information, so it is useful for the end user.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Internal Name&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A 20 byte SHIFT_JIS identifying string located in the header of the N64 ROM format. This is largely for informational purposes, though some video plugins may use this name for things like hi-res textures.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Save Type&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The native save format of a given ROM. N64 cartridges had a number of different internal save options. These include 4KB or 16KB of Eeprom, 32KB of battery backed SRAM, or 256KB of Flash RAM. Additionally, many N64 games used an external Controller Pack for game saves. The official version of this was 256KB of battery backed SRAM, although 3rd party models often had much more. This information is used by the emulator in the booting process.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Players&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The number of players 0-4 supported by the ROM. 0 Player ROMs are generally homebrew laminations or other Demos.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Size&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The size of the uncompressed ROM. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Compression&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A number of different ROM compression formats are supported including Gzip, Bzip2, LZMA stream, Zip, and 7zip. Zip and 7zip are archive formats, and Mupen64Plus supports having multiple ROMs in a single image.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Image Type&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
N64 ROMs come in three types: .z64 (native) images, .v64 (byteswapped) image, and .n64 (wordswapped). The names are mainly historical and refer to original backup units used to dump the ROMs. Mupen64Plus can take any image type, but other emulators might not. Also, all MD5s are of the native .z64 image.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CIC Chip&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The Boot CIC is a security chip that exists in Nintendo64 cartridges that the ROM uses to boot. It is designed for copy protection. Most ROMs only access this information at boot, but others (notably those produced by Rare) access it at other points during gameplay. This is provided largely for informational purposes as Mupen64Plus successfully emulates all known CICs. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rumble&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Does the ROM support a rumble pack on a real N64? If Yes, it should be possible to get rumble through emulation.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=MacOSXInstructions&amp;diff=44</id>
		<title>MacOSXInstructions</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=MacOSXInstructions&amp;diff=44"/>
		<updated>2015-07-26T22:02:48Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Here are some basic usage instructions to compile Mupen64Plus on Intel Macintosh computers with OSX (this is for developers. If you are a user, please just download the binary from the downloads page or, if you want a front-end, look at http://bitbucket.org/auria/wxmupen64plus/wiki/Home ).  As of October, 2011, all of the Mupen64Plus software will compile and run correctly. Please be aware that Mupen64Plus does not currently run on older PowerPC based Macintosh computers.&lt;br /&gt;
&lt;br /&gt;
Please note that these instructions are meant as guidelines for people who know what they&amp;#039;re doing. If you don&amp;#039;t have much experience building stuff from source, I would recommend that you wait for binary packages instead.&lt;br /&gt;
&lt;br /&gt;
Choose your mupen version :&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mupen64plus 1.99.x and 2.x ==&lt;br /&gt;
&lt;br /&gt;
* Install developer tools (Xcode) from the DVD that came with your Mac.&lt;br /&gt;
&lt;br /&gt;
* Get the code from the various modules using mercurial as on any other platform (or just download a source code archive)&lt;br /&gt;
Get the dependencies just like you&amp;#039;d do for mupen64plus 1.x (except maybe GTK/Qt since there is no GUI frontend yet for mupen 2)&lt;br /&gt;
&lt;br /&gt;
* Install pkg-config if you don&amp;#039;t already have it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create this file, called &amp;#039;&amp;#039;&amp;#039;zlib.pc&amp;#039;&amp;#039;&amp;#039;, in /usr/local/lib/pkgconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
prefix=/usr&lt;br /&gt;
exec_prefix=${prefix}&lt;br /&gt;
libdir=${exec_prefix}/lib&lt;br /&gt;
includedir=${prefix}/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Name: zlib&lt;br /&gt;
Version: 1.1.3&lt;br /&gt;
Description: zlib&lt;br /&gt;
Requires: &lt;br /&gt;
Libs: -L${libdir} -lz&lt;br /&gt;
Cflags: -I${includedir}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create this file, called &amp;#039;&amp;#039;&amp;#039;gl.pc&amp;#039;&amp;#039;&amp;#039;, in /usr/local/lib/pkgconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
prefix=/usr&lt;br /&gt;
exec_prefix=${prefix}&lt;br /&gt;
libdir=${exec_prefix}/lib&lt;br /&gt;
includedir=${prefix}/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Name: gl&lt;br /&gt;
Version: 2.0&lt;br /&gt;
Description: OpenGL&lt;br /&gt;
Requires: &lt;br /&gt;
Libs: -framework OpenGL&lt;br /&gt;
Cflags: -I${includedir}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create this file, called &amp;#039;&amp;#039;&amp;#039;glu.pc&amp;#039;&amp;#039;&amp;#039;, in /usr/local/lib/pkgconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
prefix=/usr&lt;br /&gt;
exec_prefix=${prefix}&lt;br /&gt;
libdir=${exec_prefix}/lib&lt;br /&gt;
includedir=${prefix}/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Name: glu&lt;br /&gt;
Version: 2.0&lt;br /&gt;
Description: glu&lt;br /&gt;
Requires: &lt;br /&gt;
Libs: &lt;br /&gt;
Cflags: -I${includedir}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A script to build (32 bits, compatible with 10.6/10.5 and maybe 10.4) looks like :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
PWD = `pwd`&lt;br /&gt;
export CC=&amp;quot;gcc-4.0&amp;quot;&lt;br /&gt;
export CXX=&amp;quot;g++-4.0&amp;quot;&lt;br /&gt;
export LD=&amp;quot;g++-4.0&amp;quot;&lt;br /&gt;
APIDIR=$PWD/mupen64plus-core/src/api&lt;br /&gt;
export MACOSX_DEPLOYMENT_TARGET=10.4&lt;br /&gt;
export SDK_ROOT=/Developer/SDKs/MacOSX10.5.sdk&lt;br /&gt;
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig&lt;br /&gt;
&lt;br /&gt;
APP_BUNDLE=./mupen64plus.app/Contents&lt;br /&gt;
&lt;br /&gt;
export CFLAGS=&amp;quot;-g&amp;quot;&lt;br /&gt;
export CXXFLAGS=&amp;quot;-g&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;== Core ==&amp;quot;&lt;br /&gt;
cd mupen64plus-core/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-core/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;== RSP-HLE ==&amp;quot;&lt;br /&gt;
cd mupen64plus-rsp-hle/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-rsp-hle/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== SDL Audio ==&amp;quot;&lt;br /&gt;
cd mupen64plus-audio-sdl/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-audio-sdl/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== SDL Input ==&amp;quot;&lt;br /&gt;
cd mupen64plus-input-sdl/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-input-sdl/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Rice ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-rice/projects/unix&lt;br /&gt;
make all CC=&amp;quot;g++-4.0&amp;quot; C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; V=1 BITS=32 PIC=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-rice/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Arachnoid ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-arachnoid/projects/unix&lt;br /&gt;
make all C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-arachnoid/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Glide ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-glide64/projects/unix&lt;br /&gt;
make all C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-glide64/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Glide Napalm ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-glide-napalm/Glitch64&lt;br /&gt;
make -f Makefile.gcc OSX_ARCH=i386 EXT_INC=&amp;quot;../../mupen64plus-core/src/api -I./inc&amp;quot;&lt;br /&gt;
cd ../src&lt;br /&gt;
make -f Makefile.nowx-gcc all C_INCLUDE_PATH=&amp;quot;/usr/local/include:../../mupen64plus-core/src/api&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include:../../mupen64plus-core/src/api&amp;quot; OSX_ARCH=i386&lt;br /&gt;
cd ../..&lt;br /&gt;
cp -f mupen64plus-video-glide-napalm/src/lib/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
cp -f mupen64plus-video-glide-napalm/src/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Console ==&amp;quot;&lt;br /&gt;
cd mupen64plus-ui-console/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-ui-console/projects/unix/mupen64plus .&lt;br /&gt;
&lt;br /&gt;
mkdir -p $APP_BUNDLE/MacOS/&lt;br /&gt;
cp -f mupen64plus $APP_BUNDLE/MacOS/mupen64plus&lt;br /&gt;
cp -f &amp;#039;&amp;#039;&amp;#039;.dylib $APP_BUNDLE/MacOS/.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build 64-bits, use something like that instead (tested on 1.6) :&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#!/bin/sh&lt;br /&gt;
PWD = `pwd`&lt;br /&gt;
&lt;br /&gt;
APIDIR=$PWD/mupen64plus-core/src/api&lt;br /&gt;
export LD=&amp;quot;g++&amp;quot;&lt;br /&gt;
&lt;br /&gt;
APP_BUNDLE=./mupen64plus.app/Contents&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;== Core ==&amp;quot;&lt;br /&gt;
cd mupen64plus-core/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-core/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;== RSP-HLE ==&amp;quot;&lt;br /&gt;
cd mupen64plus-rsp-hle/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS LD=&amp;quot;g++&amp;quot;&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-rsp-hle/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== SDL Audio ==&amp;quot;&lt;br /&gt;
cd mupen64plus-audio-sdl/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-audio-sdl/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== SDL Input ==&amp;quot;&lt;br /&gt;
cd mupen64plus-input-sdl/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-input-sdl/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Rice ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-rice/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR NO-ASM=1 C_INCLUDE_PATH=/usr/local/include ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-rice/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Arachnoid ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-arachnoid/projects/unix&lt;br /&gt;
make all C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-arachnoid/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Glide ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-glide64/projects/unix&lt;br /&gt;
make all C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-glide64/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Console ==&amp;quot;&lt;br /&gt;
cd mupen64plus-ui-console/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-ui-console/projects/unix/mupen64plus .&lt;br /&gt;
&lt;br /&gt;
mkdir -p $APP_BUNDLE/MacOS/&lt;br /&gt;
cp -f mupen64plus $APP_BUNDLE/MacOS/mupen64plus&lt;br /&gt;
cp -f *.dylib $APP_BUNDLE/MacOS/.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Macports users, you will need to add flags like this to the end of many of the &amp;#039;&amp;#039;make&amp;#039;&amp;#039; commands above :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LIBRARY_PATH=/opt/local/lib&lt;br /&gt;
C_INCLUDE_PATH=&amp;quot;/opt/local/include/libpng12&amp;quot;&lt;br /&gt;
CPLUS_INCLUDE_PATH=&amp;quot;/opt/local/include/libpng12&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And a script to bundle may look like :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#!/bin/sh&lt;br /&gt;
APP_CONTENTS=&amp;quot;./mupen64plus.app/Contents&amp;quot;&lt;br /&gt;
&lt;br /&gt;
FIX_LIST=&amp;quot;-x $APP_CONTENTS/MacOS/mupen64plus \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/libmupen64plus.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-audio-sdl.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-input-sdl.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-rsp-hle.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-video-rice.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-video-arachnoid.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-video-glide64.dylib&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dylibbundler -od -b $FIX_LIST -d $APP_CONTENTS/libs/&lt;br /&gt;
&lt;br /&gt;
rm -rf $APP_CONTENTS/Resources&lt;br /&gt;
mkdir -p $APP_CONTENTS/Resources&lt;br /&gt;
cp ./mupen64plus-video-rice/data/* $APP_CONTENTS/Resources&lt;br /&gt;
cp ./mupen64plus-video-glide64/data/* $APP_CONTENTS/Resources&lt;br /&gt;
cp ./mupen64plus-core/data/* $APP_CONTENTS/Resources&lt;br /&gt;
cp ./mupen64plus-input-sdl/data/*  $APP_CONTENTS/Resources&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this script requires [http://macdylibbundler.sourceforge.net/ macdylibbundler] to be installed.&lt;br /&gt;
&lt;br /&gt;
Currently this only runs from the terminal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mupen64plus 1.x ==&lt;br /&gt;
&lt;br /&gt;
===Developer tools===&lt;br /&gt;
Install developer tools (Xcode) from the DVD that came with your Mac.&lt;br /&gt;
&lt;br /&gt;
===GETTING MUPEN64PLUS===&lt;br /&gt;
You can simply download a source archive from the mupen64plus website; you can also use SVN. SVN example :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mkdir mupen64plus&lt;br /&gt;
cd mupen64plus&lt;br /&gt;
svn co svn://fascination.homelinux.net:7684/mupen64plus/trunk --username mupen64 --password Dyson5632-kart&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DEPENDENCIES===&lt;br /&gt;
* Mupen can be built with either GTK+ or Qt. It is expected that in the future the Qt version will work better, but until then the GTK+ version is easier to get to run. Install GTK+ from http://www.gtk-osx.org/. (If you like using macports, beware : GTK as installed from macports &amp;#039;&amp;#039;will&amp;#039;&amp;#039; work on your computer, but you won&amp;#039;t be able to package a distributable dmg. The installer from the website mentionned is much more handy for this)&lt;br /&gt;
 &lt;br /&gt;
* Other dependencies can be installed either from source or from macports.&lt;br /&gt;
&lt;br /&gt;
====(A) THE SOURCE CODE WAY====&lt;br /&gt;
You will need SDL, SDL_ttf and its subdependencies (Freetype, fontconfig), and libpng.&lt;br /&gt;
Find them with [http://www.google.com Google] and install them with the usual&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo make install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====(B) THE MACPORTS WAY====&lt;br /&gt;
* Install macports from [http://www.macports.org/install.php macports.org]&lt;br /&gt;
* Open terminal (under Hard Drive, Applications, Utilities, Terminal). Type in the following commands.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo port install libsdl_ttf libpng&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since macports installs librairies in a non-standard prefix, you will need to help the makefiles find librairies installed from macports. You can simply export LDFLAGS=-L/opt/local/lib or, more conveniently, change it on a more permanent basis by editing &amp;#039;&amp;#039;&amp;#039;pre.mk&amp;#039;&amp;#039;&amp;#039; in the mupen source - then locate the lines that read&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
OS = OSX&lt;br /&gt;
LDFLAGS += -liconv -lpng&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and make the second one&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LDFLAGS += -L/opt/local/lib -liconv -lpng&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===BUILDING MUPEN64PLUS===&lt;br /&gt;
We&amp;#039;ll first set some environment variables to help mupen find GTK+. Also make sure sdl-config is in your PATH.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
export PKG_CONFIG_PATH=/Library/Frameworks/Gtk.framework/Resources/dev/lib/pkgconfig&lt;br /&gt;
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/Library/Frameworks/GLib.framework/Resources/dev/lib/pkgconfig&lt;br /&gt;
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/Library/Frameworks/Cairo.framework/Resources/dev/lib/pkgconfig &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Then cross your fingers, it&amp;#039;s time to build!&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /path/to/mupen/trunk&lt;br /&gt;
make all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, for a debug build:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
make DBGSYM=1 all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RUNNING===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd mupen64plus/trunk/&lt;br /&gt;
./mupen64plus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To run no gui mode :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# simplest :&lt;br /&gt;
./mupen64plus --nogui &amp;lt;rom-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# pass some settings&lt;br /&gt;
./mupen64plus --nogui --gfx plugins/glN64.so --audio plugins/jttl_audio.so --input plugins/blight_input.so --rsp plugins/mupen64_hle_rsp_azimer.so --emumode 1 &amp;lt;rom-path&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be aware that input may not work if you launch ROMs in GUI mode.&lt;br /&gt;
&lt;br /&gt;
===PACKAGING MUPEN64PLUS===&lt;br /&gt;
If all you wanted is to play with Mupen64Plus, this section won&amp;#039;t apply to you; but we want to share the fun with others, don&amp;#039;t we? From now on, I&amp;#039;ll concentrate on how to build a package you can send to others.&lt;br /&gt;
&lt;br /&gt;
Start by installing mupen :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ./install.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will first need an &amp;#039;&amp;#039;&amp;#039;Info.plist&amp;#039;&amp;#039;&amp;#039; file, sample here :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple Computer//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dict&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleDevelopmentRegion&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;English&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleInfoDictionaryVersion&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;6.0&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundlePackageType&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;APPL&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CSResourcesFileMapped&amp;lt;/key&amp;gt;  &amp;lt;true/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleExecutable&amp;lt;/key&amp;gt;  &amp;lt;string&amp;gt;launcher&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleName&amp;lt;/key&amp;gt;        &amp;lt;string&amp;gt;Mupen64Plus&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleIconFile&amp;lt;/key&amp;gt;    &amp;lt;string&amp;gt;mupen64plus.icns&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleVersion&amp;lt;/key&amp;gt;     &amp;lt;string&amp;gt;1.5&amp;lt;/string&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleDocumentTypes&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;array&amp;gt;&lt;br /&gt;
		&amp;lt;dict&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;CFBundleTypeExtensions&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;array&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;n64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;N64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;z64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;V64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;v64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;V64&amp;lt;/string&amp;gt;&lt;br /&gt;
			&amp;lt;/array&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;CFBundleTypeIconFile&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;string&amp;gt;mupen64cart.icns&amp;lt;/string&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;CFBundleTypeName&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;string&amp;gt;N64 Rom&amp;lt;/string&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;CFBundleTypeRole&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;string&amp;gt;Editor&amp;lt;/string&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;LSIsAppleDefaultForType&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;true/&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;LSTypeIsPackage&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;false/&amp;gt;&lt;br /&gt;
		&amp;lt;/dict&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
	&amp;lt;/array&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/dict&amp;gt;&lt;br /&gt;
&amp;lt;/plist&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
(note that the executable name in this Info.plist file is &amp;#039;&amp;#039;launcher&amp;#039;&amp;#039; - I&amp;#039;ll explain why below)&lt;br /&gt;
&lt;br /&gt;
You will also need icons for mupen and ROMs : mupen64plus.icns, mupen64cart.icns&lt;br /&gt;
&lt;br /&gt;
Then you can build the application bundle by using a simple shell script :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
INSTALL_PREFIX=&amp;quot;/usr/local&amp;quot;&lt;br /&gt;
APP_CONTENTS=&amp;quot;./Mupen64Plus.app/Contents&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;* Removing any existing installation&amp;quot;&lt;br /&gt;
rm -rf ./Mupen64Plus.app&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;* Creating skeleton&amp;quot;&lt;br /&gt;
mkdir -p $APP_CONTENTS/Resources&lt;br /&gt;
mkdir $APP_CONTENTS/MacOS&lt;br /&gt;
cp Info.plist $APP_CONTENTS/Info.plist&lt;br /&gt;
cp mupen64plus.icns $APP_CONTENTS/Resources/mupen64plus.icns&lt;br /&gt;
cp mupen64cart.icns $APP_CONTENTS/Resources/mupen64cart.icns&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;* Copying executable&amp;quot;&lt;br /&gt;
cp $INSTALL_PREFIX/bin/mupen64plus $APP_CONTENTS/MacOS/mupen64plus&lt;br /&gt;
#cp ./launcher $APP_CONTENTS/MacOS/launcher&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;* Copying data files&amp;quot;&lt;br /&gt;
cp -r $INSTALL_PREFIX/share/mupen64plus/ $APP_CONTENTS/Resources/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can then make this bundle distributable by blessing it with [http://macdylibbundler.sourceforge.net DylibBundler]. First install DylibBundler by following the instructions inside. Then run this small script :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
APP_CONTENTS=&amp;quot;./Mupen64Plus.app/Contents&amp;quot;&lt;br /&gt;
&lt;br /&gt;
FIX_LIST=&amp;quot;-x $APP_CONTENTS/MacOS/mupen64plus \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/blight_input.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/dummyaudio.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/dummyvideo.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/glide64.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/glN64.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/jttl_audio.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/mupen64_hle_rsp_azimer.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/mupen64_input.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/ricevideo.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
dylibbundler -od -b $FIX_LIST -d $APP_CONTENTS/libs/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voila it&amp;#039;s ready! Well actually, it should be in theory... In practice there is a bug on mac : when using both SDL and GTK+ at the same time, both grab the event loop and conflict with each other. The result of this is that ROMs cannot be launched from the GTK GUI, they can only be run in &amp;#039;&amp;#039;nogui&amp;#039;&amp;#039; mode. The GTK interface however still remains necessary to configure mupen. Until this issue gets fixed properly, I work around it by placing a second executable in the bundle called &amp;#039;&amp;#039;launcher&amp;#039;&amp;#039; (see the bundling script above, there is a commented out line that does this). This executable can then act as a bridge to either open the GTK GUI and configure mupen, either launch a ROM in nogui mode.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; MacLauncher&lt;br /&gt;
&lt;br /&gt;
With this launcher as main executable, you should finally have a distributable executable!&lt;br /&gt;
&lt;br /&gt;
To be continued...&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=ReleasePage&amp;diff=43</id>
		<title>ReleasePage</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=ReleasePage&amp;diff=43"/>
		<updated>2015-07-26T22:02:30Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Mupen64Plus Release Notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
===Mupen64Plus v2.5 - April 26, 2015===&lt;br /&gt;
====All Modules====&lt;br /&gt;
* Move from bitbucket (Mercurial) to GitHub&lt;br /&gt;
* Travis CI integration with GitHub for continuous automated build regression testing&lt;br /&gt;
* New: MS Visual Studio 2013 project files&lt;br /&gt;
* Finish integration with SDL2.0, and build against SDL2 by default&lt;br /&gt;
====Audio-SDL Plugin====&lt;br /&gt;
* Add audioresource support for integration with Linux-based Nemo Mobile OS&lt;br /&gt;
====Console-UI Front End Application====&lt;br /&gt;
* Update man page document&lt;br /&gt;
* Add application desktop file and icons&lt;br /&gt;
* New option: load savestate immediately on emulator startup&lt;br /&gt;
* Compile-time flag to support building ui-console as a library (used by Android frontend)&lt;br /&gt;
====Core Emulator Library====&lt;br /&gt;
* Game-specific fixes: Banjo Tooie, Zelda Ocarina of Time, DK64, Hydro Thunder, others&lt;br /&gt;
* Game-specific override for # of clock cycles per cpu instruction&lt;br /&gt;
* New Dynarec: Speed improvements, accuracy fixes, build support for MSVC&lt;br /&gt;
* Cheat fixes for WWF No Mercy, Bomberman Hero, Super Mario 64, and Pokemon Stadium (E)&lt;br /&gt;
* Major R4300 CPU core refactoring in many subsystems to improve code organization&lt;br /&gt;
* Rewrite speed limiter code to improve performance and audio synchronization&lt;br /&gt;
* Separate the logic of the Pure Interpreter from the Cached Interpreter&lt;br /&gt;
* Regression test improvements&lt;br /&gt;
* Support for building against OpenGL ES&lt;br /&gt;
* Build system improvements for ARM / Raspberry Pi&lt;br /&gt;
====Input-SDL Plugin====&lt;br /&gt;
* SDL2: use SDL1.2 keysyms in the mupen64plus.cfg file Input section for consistency&lt;br /&gt;
* SDL2: use prioritization to decide among multiple matching auto-config sections (for XInput)&lt;br /&gt;
* New auto-config sections for: Wiimote Classic, Wii U Gamecube / Pro, MS SideWinder GamePad Pro, 17 others&lt;br /&gt;
* When Mouse=True but pointer is un-grabbed, fall back to joystick settings for analog x/y&lt;br /&gt;
* New feature: prevent mouse/trackpad auto-centering behavior by pressing left-Windows key&lt;br /&gt;
====Video-Glide64mk2 Plugin====&lt;br /&gt;
* Fix colors in compressed fxt1 textures by importing mesa code&lt;br /&gt;
* Replace patented S3TC algorithm with compatible S2TC&lt;br /&gt;
* Enable the dump_cache to allow loading of dat files&lt;br /&gt;
* Bugfix: work around problem in OSD callback whereby core code doesn&amp;#039;t re-activate shader&lt;br /&gt;
* Bugfix: Resident Evil II hang&lt;br /&gt;
* Allow user override of game-specific settings via mupen64plus.cfg&lt;br /&gt;
* New feature: option to enable full-scene antialiasing&lt;br /&gt;
* Code cleanup to remove dead section of code&lt;br /&gt;
* Add OpenGL ES support (2.0)&lt;br /&gt;
* Add config option to force polygon offset values (fixes artifacts on certains games / renderers)&lt;br /&gt;
* Fix broken C version of MulMatricesC&lt;br /&gt;
* New optional frameskip feature, which drops frames instead of rendering if game is going slow&lt;br /&gt;
* Fix texture pack read failure on some 64-bit platforms&lt;br /&gt;
* Correct N64 ROM header analysis for PAL/NTSC detection&lt;br /&gt;
* Bugfix: use memmove() instead of memcpy() for overlapping buffers&lt;br /&gt;
* Win32: don&amp;#039;t set gamma table because it breaks monitor calibration&lt;br /&gt;
====Video-Rice Plugin====&lt;br /&gt;
* Game-specific hack-fix to show last heart and map arrows in Zelda OoT &amp;amp; MM.&lt;br /&gt;
* Lots of code cleanup, removal of deprecated code, and simplifications&lt;br /&gt;
* Modernize OpenGL interfaces, remove code for supporting old opengl versions&lt;br /&gt;
* Graphics fixes for: Fog, RDP InsertMatrix command&lt;br /&gt;
* Fix for INI file loading under Windows&lt;br /&gt;
* Minor OpenGL ES fixes&lt;br /&gt;
* Add config option to force polygon offset values (fixes artifacts on certains games / renderers)&lt;br /&gt;
* Bugfix: crash if RiceVideoLinux.ini not found&lt;br /&gt;
====RSP-HLE Plugin====&lt;br /&gt;
* Game-specific fixes: Bottom of the 9th, IndianaJones, BattleForNaboo, Conkers Bad Fur Day&lt;br /&gt;
* Support for MusyX microcodes&lt;br /&gt;
* Improve audio microcode identification&lt;br /&gt;
* Huge quantity of code cleanups and refactoring to improve organization&lt;br /&gt;
* Add support for additional audio commands: #16, POLEF, RESAMPLE_ZOH&lt;br /&gt;
* Multiple bugfixes in audio processing code&lt;br /&gt;
* Bugfix: microcode detection could sometimes fail after reset&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v2.0 - July 4, 2013===&lt;br /&gt;
====All Modules====&lt;br /&gt;
* New: MS Visual Studio 2012 project files&lt;br /&gt;
* Makefiles: support for ARM, PPC, and MINGW architectures&lt;br /&gt;
* Makefiles: support for cross-compiling (MXE win32 builds under Unix)&lt;br /&gt;
* Support (building from source) for new SDL 2.0 library&lt;br /&gt;
====Audio-SDL Plugin====&lt;br /&gt;
* Add support for resampling with speexdsp library&lt;br /&gt;
* Add more resampling quality options&lt;br /&gt;
* Bugfix: Don&amp;#039;t assume OSS is installed in all linux systems.&lt;br /&gt;
* Make SDL volume handling the default, since OSS is no longer included in the kernel.&lt;br /&gt;
* Minor refactoring of volume handling code.&lt;br /&gt;
====Console-UI Front End Application====&lt;br /&gt;
* Only build system changes&lt;br /&gt;
====Core Emulator Library====&lt;br /&gt;
* Fixes for various games (DK64, Zelda, Blast Corps)&lt;br /&gt;
* Add Ari64&amp;#039;s dynamic recompiler for x86 (32-bit) and ARM&lt;br /&gt;
* Improved PJ64 savestate loading&lt;br /&gt;
* Support video window resizing (with help from video plugin and front-end application)&lt;br /&gt;
* Auto-detect savestate type (!Mupen64Plus or PJ64) when loading from a slot&lt;br /&gt;
* Many various code cleanups in core from casualjames&lt;br /&gt;
* Debugger code cleanup&lt;br /&gt;
====Input-SDL Plugin====&lt;br /&gt;
* Re-write auto-configuration logic to be more user friendly.  Add new &amp;#039;mode&amp;#039; parameter.&lt;br /&gt;
* Support for 6 new joysticks&lt;br /&gt;
* Work-around for buggy xboxdrv which results in no rumble&lt;br /&gt;
* Bugfix: crash when rumble used with controller #4&lt;br /&gt;
====Video-Glide64mk2 Plugin====&lt;br /&gt;
* Brand new video plugin which has been ported to Mupen64Plus&lt;br /&gt;
====Video-Rice Plugin====&lt;br /&gt;
* Support for resizable video window&lt;br /&gt;
* Add support to build and run with OpenGL ES 2.0&lt;br /&gt;
* Improve hi-resolution texture loading support&lt;br /&gt;
* Fix texture CRC calculation for non-x86 (or NO_ASM) platforms&lt;br /&gt;
====RSP-HLE Plugin====&lt;br /&gt;
* Add support for MusyX ucode detection&lt;br /&gt;
* Support JPEG decoding used in Pokemon Stadium Japan&lt;br /&gt;
* Lots of refactoring to clean up code&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v1.99.5 - March 10, 2012===&lt;br /&gt;
====Audio-SDL Plugin====&lt;br /&gt;
* added version number to SDL-audio plugin config parameters, to support future changes&lt;br /&gt;
* updated audio plugin for new Mupen64plus 2.0 API versioning scheme&lt;br /&gt;
* makefile fixes and improvements&lt;br /&gt;
====Console-UI Front End Application====&lt;br /&gt;
* New option to disable internal core speed limiter (for benchmarking)&lt;br /&gt;
* Updated Console-UI front-end for new Mupen64plus 2.0 API versioning&lt;br /&gt;
* Added config version number for UI-Console section&lt;br /&gt;
* makefile fixes and improvements&lt;br /&gt;
====Core Emulator Library====&lt;br /&gt;
* New feature: support for N64 internal real-time clock&lt;br /&gt;
* use X-Scale&amp;#039;s PIF-CIC algorithm instead of the hard-coded challenge-response pairs&lt;br /&gt;
* New config parameter for path to save SRAM/EEPROM/MPK files, so they can be separated from emulator snapshots&lt;br /&gt;
* updated core for new Mupen64plus 2.0 API versioning scheme&lt;br /&gt;
* split core configuration data into 2 sections: Core and CoreEvents. Added version numbers and upgrade handling to both&lt;br /&gt;
* Accurately emulate the RSP DMA operation (from Bobby Smiles)&lt;br /&gt;
* bugfix: #290 - OnScreenDisplay text is sometimes captured in screenshots&lt;br /&gt;
* bugfix: when the front-end specifies an override for the configuration directory, always use this path, so that we don&amp;#039;t load the config from there and then save it back to the default user path&lt;br /&gt;
* bugfix: #468 - On-screen-display problem under OSX&lt;br /&gt;
* bugfix: Use option SaveStatePath from config file&lt;br /&gt;
* bugfix: don&amp;#039;t call SDL_Quit() until the core library is being unloaded.  fixes some front-end use cases&lt;br /&gt;
* bugfix: #410 - segfault in dma_pi_write()--&amp;gt;strlen() if /home/username/.local/share/mupen64plus/ owned by root&lt;br /&gt;
* bugfix: for Interpreter cores, use proper math functions for ceil/floor/round/trunc instead of x87 rounding modes&lt;br /&gt;
* many makefile fixes and improvements&lt;br /&gt;
====Input-SDL Plugin====&lt;br /&gt;
* Improved input setup behavior (auto-config) to make some use cases more friendly&lt;br /&gt;
* Updated input plugin for new Mupen64plus 2.0 API versioning scheme&lt;br /&gt;
* Added version number to SDL Input plugin parameters&lt;br /&gt;
* Add new parameter for mouse sensitivity, handle mouse movement differently so mouse is easier to use as controller&lt;br /&gt;
* New auto-configuration for controllers:&lt;br /&gt;
** raphnet technologies GC/N64 usb converter&lt;br /&gt;
** Logitech Chillstream Controller&lt;br /&gt;
** Jess Tech Colour Rumble&lt;br /&gt;
** Xbox 360 linux userspace driver&lt;br /&gt;
** Generic X-Box pad&lt;br /&gt;
** Saitek P2900 Wireless Pad&lt;br /&gt;
** Jess Tech USB 4-Axis 12-Button Gamepad&lt;br /&gt;
* bugfix: #392 - when switching between rumble pak and memory pak, simulate removing the pack, waiting 1 second, then inserting the new one&lt;br /&gt;
* bugfix: #424 - problem with USB devices supporting multiple controllers per device&lt;br /&gt;
* bugfix: #409 - PS3 controller not auto-detected in Gentoo when connected via bluetooth&lt;br /&gt;
* bugfix: correctly handle USB devices with multiple game pads, from Peter Helbing&lt;br /&gt;
* makefile fixes and improvements&lt;br /&gt;
====Rice Video Plugin====&lt;br /&gt;
* Hires texture loading: support for 8-bit PNG images&lt;br /&gt;
* New config option for forcing vertical sync&lt;br /&gt;
* Check OpenGL attributes after creating video window and report any that failed to set&lt;br /&gt;
* Updated video plugin for new Mupen64plus 2.0 API versioning scheme&lt;br /&gt;
* Update to Video API version 2.1.0.&lt;br /&gt;
* Bugfix: hi-res textures: Scale highres textures by precalculated scaleShift exponent&lt;br /&gt;
* Bugfix: dont call CoreVideo_Init() inside of the InitializeGFX() function. This will fix some front-end use cases&lt;br /&gt;
* Bugfix: Fix z coordinate in 3d line rendering&lt;br /&gt;
* Bugfix: double infinite loop in GetValidTmemInfoIndex&lt;br /&gt;
* Bugfix: Perfect Dark randomly crashes due to divide-by-zero error&lt;br /&gt;
* Bugfix: crash in loading Celda 2009 hi-res texture pack for Zelda Ocarina of Time&lt;br /&gt;
* makefile fixes, improvements, and code cleanups&lt;br /&gt;
====RSP-HLE Plugin====&lt;br /&gt;
* Handle JPEG decompression, used in Ogre Battle 64 and Pokemon Stadium&lt;br /&gt;
* updated RSP plugin for new Mupen64plus 2.0 API versioning scheme&lt;br /&gt;
* bugfix: #102 - Missing backgrounds in Ogre Battle 64&lt;br /&gt;
* many makefile fixes and improvements&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v1.99.4 - November 22, 2010===&lt;br /&gt;
====Console-UI Front End Application====&lt;br /&gt;
* add some parameter checking for --emumode option&lt;br /&gt;
* new cheat file format from spinout182&lt;br /&gt;
* makefile fixes and improvements&lt;br /&gt;
====Core Emulator Library====&lt;br /&gt;
* Added some type checking to ConfigGetParameter() function, and a new error type&lt;br /&gt;
* Bugfix: avoid segfault in the video extension code if SDL initialization fails (because video plugin fails)&lt;br /&gt;
* Added new CoreGetRomSettings() function for front-ends&lt;br /&gt;
* Allow to run dynarec in hardware DEP protected windows&lt;br /&gt;
* Allow core .cfg parser to accept strings without quotes around them&lt;br /&gt;
* API change: use new ReadScreen2() video plugin function&lt;br /&gt;
* New re-entrant R4300 disassembler, from tty68k/zzt32, a man who loves MIPS processors&lt;br /&gt;
* makefile fixes and improvements, code cleanups&lt;br /&gt;
====Audio-SDL Plugin====&lt;br /&gt;
* Bugfix: Plugin should write default config values at startup time&lt;br /&gt;
* Bugfix: fixed fast-forward for banjo-kazooie and other games which was broken due to limitation in basic resampling algorithm&lt;br /&gt;
* makefile fixes and improvements&lt;br /&gt;
====Input-SDL Plugin====&lt;br /&gt;
* Bugfix: Do configuration during PluginStart(), so GUI will see defaults (auto-configured) the first time it is run&lt;br /&gt;
* Move axis value reducers to right shift and right ctrl, to avoid conflict with A/B buttons&lt;br /&gt;
* New feature: extra deadzone parameter in axis() config parameter clause when mapping an analog joystick axis to an N64 button&lt;br /&gt;
* many new joystick auto-configurations&lt;br /&gt;
* makefile fixes and improvements&lt;br /&gt;
====Rice Video Plugin====&lt;br /&gt;
* new feature: anisotropic filtering&lt;br /&gt;
* new feature: trilinear filtering&lt;br /&gt;
* new feature: mipmaps&lt;br /&gt;
* cleaned up FindScaleFactor function based upon r45 of the 1964 repo&lt;br /&gt;
* bugfix: buffer overrun (and crash) when reading vendor string info on some opengl implementations&lt;br /&gt;
* API change for reading the video buffer: new interface is more flexible and avoids some potential problems&lt;br /&gt;
* support for anti-aliasing (GL_MULTISAMPLE)&lt;br /&gt;
* makefile fixes, improvements, and code cleanups&lt;br /&gt;
====RSP-HLE Plugin====&lt;br /&gt;
* merged all big-endian fixes from mupen64gc project&lt;br /&gt;
* makefile fixes and improvements&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v1.99.3 - February 13, 2010===&lt;br /&gt;
====Console-UI Front End Application====&lt;br /&gt;
* New feature: command-line option --set for setting arbitrary configuration variables&lt;br /&gt;
* updated MAN page for all the changes made in the 2.0 re-architecture&lt;br /&gt;
====Core Emulator Library====&lt;br /&gt;
* New feature: configuration function ConfigGetParameterType()&lt;br /&gt;
* New feature: up to 1000 screenshots per ROM are allowed&lt;br /&gt;
* New feature: support for Gameshark 3.3 patch codes&lt;br /&gt;
* Bugfix: Use Dynarec by default when core supports it.  If dynarec is selected but unavailable, fall back to cached interpreter&lt;br /&gt;
* Bugfix: screenshot directory handling code used unix-specific path separators; now is platform-independent&lt;br /&gt;
* Bugfix: #313 - 64-bit inline assembly code in r4300/x86_64/rjump.c needs to have underscores before the symbols names in OSX&lt;br /&gt;
* Bugfix: old bug in the core - hang if a ROM &amp;#039;&amp;#039;&amp;#039;without&amp;#039;&amp;#039;&amp;#039; a 16kb EEPROM type is loaded after a ROM &amp;#039;&amp;#039;&amp;#039;with&amp;#039;&amp;#039;&amp;#039; a 16kb EEPROM type&lt;br /&gt;
* Bugfix: rumble feature caused memory corruption&lt;br /&gt;
* Bugfix: Problem with zilmar API: the plugin RomOpen() functions had no way of returning errors to the core, causing crashes&lt;br /&gt;
* Replaced api documentation .tar.gz file with the mediawiki text&lt;br /&gt;
* Build script improvements:&lt;br /&gt;
* new feature: m64p_update.sh script can take an input argument to update to a tag or revision&lt;br /&gt;
* new feature: added bash script for building source packages of individual modules&lt;br /&gt;
====Audio-SDL Plugin====&lt;br /&gt;
* sync with core/plugin API change for RomOpen()&lt;br /&gt;
* bugfix: logical error in previous audio refactoring causing slowdown/lockup on loading savestate or re-initializing audio&lt;br /&gt;
====Input-SDL Plugin====&lt;br /&gt;
* New feature: auto-configuration uses an .ini file instead of hard-coding the controllers in the source code&lt;br /&gt;
* New controller auto-configurations:&lt;br /&gt;
* Original X-Box (and compatible clones)&lt;br /&gt;
* HuiJia USB GamePad&lt;br /&gt;
* USB Human(2p) Interface Device&lt;br /&gt;
* sync with core/plugin API change for RomOpen()&lt;br /&gt;
* Bugfix: controller pak was fixed at startup, switching b/w mempak and rumblepak did not work&lt;br /&gt;
* Bugfix: Xbox 360 and PS3 controllers need slightly different names under OSX&lt;br /&gt;
====Rice Video Plugin====&lt;br /&gt;
* sync with core/plugin API change for RomOpen()&lt;br /&gt;
* Changed default ScreenUpdateSetting to 1 for Linux, and 4 for Windows&lt;br /&gt;
* use custom opengl extension function pointer typedefs, to avoid compilation errors with some drivers including hosed gl.h headers&lt;br /&gt;
* merged some changes from Tillin9 commits in r1142-rice-video-gtk-refactor branch, to be more lenient in hi-res texture loading&lt;br /&gt;
* bugfix: hi-res textures did not work in Windows&lt;br /&gt;
* bugfix: #329: remove some deprecated types and a function call to prevent build errors with libpng 1.4&lt;br /&gt;
* bugfix: fixed mirroring bugs in Rice Video hi-resolution texture loading, based on Tillin9 rev 1337 in r1142-rice-video-gtk-refactor branch&lt;br /&gt;
* bugfix: in ConvertImage.cpp none of the 4-bit conversion functions could handle 1-pixel wide textures&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v1.99.2 - January 6, 2010===&lt;br /&gt;
====Console-UI Front End Application====&lt;br /&gt;
* new feature: added MSVC8 project/solution files, minor refactoring for VC compatibility&lt;br /&gt;
====Core Emulator Library====&lt;br /&gt;
* doc: added tarball of emuwiki api documentation from 2010-01-06 for backup purposes&lt;br /&gt;
* clean-up: removed almost all of the ifdef WIN32 statements&lt;br /&gt;
* bugfix: stop spamming console with &amp;quot;Core: couldn&amp;#039;t open memory pack file &amp;#039;...&amp;#039; for reading&amp;quot; messages&lt;br /&gt;
* bugfix: stop spamming console with &amp;quot;Core: couldn&amp;#039;t open eeprom file &amp;#039;...&amp;#039; for reading&amp;quot; messages&lt;br /&gt;
* new feature: MSVC8 project file for mupen64plus-core, refactored code for VC8 compatibility&lt;br /&gt;
====Audio-SDL Plugin====&lt;br /&gt;
* new feature: Completely re-wrote buffering/synchronization code:&lt;br /&gt;
* Buffer parameters now work as advertised and all use the same units&lt;br /&gt;
* Bugfix: previous defaults and algorithm behavior caused audio choppiness on slower PCs&lt;br /&gt;
* Bugfix: maximum speed was previously limited to low value by constraints from primary buffer size&lt;br /&gt;
* bugfix: SDL volume control will always be used on systems without OSS support&lt;br /&gt;
* new feature: added MSVC8 project file, minor code refactoring to build in Windows&lt;br /&gt;
====Input-SDL Plugin====&lt;br /&gt;
* new feature: added MSVC8 project file, minor code refactoring for VC compatibility&lt;br /&gt;
* added auto-configuration for:&lt;br /&gt;
* Xbox 360 Wireless Receiver&lt;br /&gt;
* PS3 controller&lt;br /&gt;
* Jess Tech Dual Analog Pad&lt;br /&gt;
====RSP-HLE Plugin====&lt;br /&gt;
* New feature: added MSVC8 project file for RSP-HLE plugin, fixed a few minor incompatibilities&lt;br /&gt;
====Rice Video Plugin====&lt;br /&gt;
* bugfix: fix fragment program combiner for Intel drivers in Win32, by ensuring that program does not allocate unused temp vars or call TEX commands for texture units that are not enabled&lt;br /&gt;
* new feature: compile-time option for opengl debugging by calling glGetError after each opengl command (except inside of glBegin/glEnd)&lt;br /&gt;
* portability: use ALIGN() for aligned data member declarations in header files as well as the definitions in CPP files&lt;br /&gt;
* portability: refactor opengl code to use &amp;lt;code&amp;gt;VidExt_GL_GetProc()&amp;lt;/code&amp;gt; for all opengl functions newer than v1.1, so that this will work in Windows&lt;br /&gt;
* portability: Abstracted directory-handling code with new &amp;lt;code&amp;gt;osal_files&amp;lt;/code&amp;gt; source code&lt;br /&gt;
* portability: replaced unix &amp;lt;code&amp;gt;gettimeofday()&amp;lt;/code&amp;gt; function calls with &amp;lt;code&amp;gt;SDL_GetTicks()&amp;lt;/code&amp;gt;&lt;br /&gt;
* new feature: added MSVC8 project file, fixed minor incompatibilities with VC compiler&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v1.99.1 - December 14, 2009===&lt;br /&gt;
====Console-UI Front End Application====&lt;br /&gt;
* Brand new Console-based front-end for Mupen64Plus 2.0&lt;br /&gt;
* New feature: R4300 Core Comparison for debugging&lt;br /&gt;
* New feature: Cheat code support from command-line&lt;br /&gt;
====Core Emulator Library====&lt;br /&gt;
New 2.0 architecture advantages:&lt;br /&gt;
* Simplified emulator Core, making it much more portable&lt;br /&gt;
* Removed all GUI code from plugins, making them simpler and more portable&lt;br /&gt;
* User interface development is not tied to Core emulator releases&lt;br /&gt;
* All messages from core/plugins can be filtered and shown in GUI instead of only on console&lt;br /&gt;
* Video Extension allows Front-end to override some video functions, ie to support embedded render window&lt;br /&gt;
* Startup in Fullscreen mode, instead of always starting in windowed mode and switching to FS after few seconds&lt;br /&gt;
* video resolution can be given via command-line parameter&lt;br /&gt;
* all configuration options for core and plugins are in a single config file, can be configured with a single GUI&lt;br /&gt;
* dummy plugins are automatically used if plugin loading fails for any reason&lt;br /&gt;
* core and plugins all use the same conventions for where to put data/config files&lt;br /&gt;
Mupen64Plus core:&lt;br /&gt;
* New feature: cheat code support&lt;br /&gt;
* New feature: Keyboard shortcuts for Core commands are now user-configurable&lt;br /&gt;
* New feature: can load/save PJ64 state files&lt;br /&gt;
* Major code cleanup, refactored build system to separate source and object files&lt;br /&gt;
* Removed many dependencies to simplify porting to other platforms&lt;br /&gt;
* Moved all of the SDL event-related stuff into a new source file eventloop.c&lt;br /&gt;
* Use XDG directory convention for file locations on Unix&lt;br /&gt;
* bugfix: frame advance feature should advance every frame, instead of every vertical interrupt (every field)&lt;br /&gt;
* bugfix: allow diagonal hat movements for core joystick commands&lt;br /&gt;
* bugfix: modified SDL event loop joystick code so that gameshark button press is captured, and joystick commands that are level-triggered instead of edge-triggered (such as fast foward) can be accommodated&lt;br /&gt;
* bugfix: fixed the outstanding SDL event issues by re-writing the code which handles the joystick-event-driven core commands.  Now the axis-based commands use hysteresis and there is a single global event function for determining if the gameshark button is pressed&lt;br /&gt;
* bugfix: OSD crash after pause-stop-start-pause of emulator&lt;br /&gt;
* bugfix: Set video width and status, aiDacrate during savestate load&lt;br /&gt;
* bugfix: in pure interpreter, Dont allow to override r0 register&lt;br /&gt;
* bugfix #52: PJ64 load state patch from olejl77&lt;br /&gt;
* bugfix #268: use aligned malloc and mprotect to set executable status for dynarec emitted code&lt;br /&gt;
* bugfix #51: Floating Point Register data was not correctly converted when switching between 32-bit (MIPS-I) mode and 64-bit (MIPS III). New code more closely emulates behavior of r4300 hardware.  Fixes collision problems in Banjo-Tooie&lt;br /&gt;
* bugfix #272: rounding mode for x86 FPU not being set correctly in interpreter and pure interpreter cores&lt;br /&gt;
* bugfix: many games need different ScreenUpdateSetting to work properly with Rice Video&lt;br /&gt;
====Audio-SDL Plugin====&lt;br /&gt;
* Converted to new Mupen64Plus 2.0 API&lt;br /&gt;
* Code cleanup to remove non-standard data types&lt;br /&gt;
* Refactored build system to separate source and object files&lt;br /&gt;
* bugfix #269: jttl_audio segfaults on exit due to incorrectly ordered shutdown code&lt;br /&gt;
====Input-SDL Plugin====&lt;br /&gt;
* New feature: Joystick/Keyboard auto-configuration&lt;br /&gt;
* New feature: deadzone and peak analog joystick values are now configurable&lt;br /&gt;
* Converted to new Mupen64Plus 2.0 API&lt;br /&gt;
* Refactored build system to separate source and object files&lt;br /&gt;
* Major code cleanup: mouse movement and analog axis code was terrible, removed non-standard data types&lt;br /&gt;
* Improved debug messages&lt;br /&gt;
* bugfix: mapping the X/Y analog sticks to keypresses didnt work&lt;br /&gt;
* bugfix: LeftCtrl-!LeftAlt key command when mouse is enabled to now toggles between grabbing and releasing the mouse pointer&lt;br /&gt;
====RSP-HLE Plugin====&lt;br /&gt;
* Converted to new Mupen64Plus 2.0 API&lt;br /&gt;
* Refactored build system to separate source and object files&lt;br /&gt;
* Refactored all code to remove win32-specific things, unnecessary functions, and clean up&lt;br /&gt;
====Rice Video Plugin====&lt;br /&gt;
* Converted to new Mupen64Plus 2.0 API&lt;br /&gt;
* Major code cleanup, removed all non-standard data types&lt;br /&gt;
* Refactored build system to separate source and object files&lt;br /&gt;
* added NO_ASM build option&lt;br /&gt;
* removed some unused configuration parameters&lt;br /&gt;
* bugfix: handle fullscreen video mode properly: start up in this mode instead of always starting in windowed and needing the core to switch to fullscreen&lt;br /&gt;
* bugfix #209: setjmp/longjmp fixes in the BMP writer and PNG reader&lt;br /&gt;
* bugfix: eliminated duplicate &amp;#039;Found ROM ...&amp;#039; messages&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v1.5 - January 4th, 2009===&lt;br /&gt;
====Major New Features====&lt;br /&gt;
* Support for Macintosh OSX platform with Intel CPUs&lt;br /&gt;
* Qt4 GUI by slougi, Tillin9, and others&lt;br /&gt;
* Rom Cache System (r636, others), by Tillin9, Okaygo, and Hasone.&lt;br /&gt;
====Minor New Features====&lt;br /&gt;
* r1235: Debugger: memory breakpoint speedup&lt;br /&gt;
* r1170-1178,1181: QT GUI: translations for English, Norwegian, German, and Dutch&lt;br /&gt;
* r1155: Use configurable key commands for special emulator functions&lt;br /&gt;
* r1134: got our own custom test ROM, courtesy of Marshallh&lt;br /&gt;
* r1046: debugger: new r4300 disassembler from ZZT32&lt;br /&gt;
* r829: jttl_audio: added GTK GUI configuration dialog&lt;br /&gt;
* r793: soft reset (hit F9)&lt;br /&gt;
* r782: jttl_audio: both SDL-based and OSS-based volume control methods are now supported&lt;br /&gt;
* r765: added savestate conversion tool to be able to load pre-v1.5 savestate files&lt;br /&gt;
* r711: 7-zip support&lt;br /&gt;
* r692: Multi-file Zip support&lt;br /&gt;
* r667: GTK GUI: user-configurable columns in ROM browser&lt;br /&gt;
* r659: LZMA archive support&lt;br /&gt;
* r638: BZip2 archive support&lt;br /&gt;
* r629,634: LIRC - added support for speedup, slowdown, pause, and frame advance&lt;br /&gt;
====Updates====&lt;br /&gt;
* r1007,1032: GTK GUI improvements&lt;br /&gt;
* r970, 1019: use SDL threading support instead of pthreads&lt;br /&gt;
* r935,938,940: Gtk GUI updates for core and Jttl&lt;br /&gt;
* r642,655-657,663,664,747,759,761-763,768-770,774,775,780,781,783,786,787,825,828,931: mupen64plus.ini updates: Good Names, stars, EEPROM types, players, rumble support&lt;br /&gt;
====Bugfixes====&lt;br /&gt;
* r1247: rsp_hle: memory overwrite bug with Zelda:OOT&lt;br /&gt;
* r1234: out of bound array bug in memory access function handlers&lt;br /&gt;
* r1222,1223,1228,1229: Debugger fixes&lt;br /&gt;
* r1183: Blight Input: sometimes the axis direction would flip&lt;br /&gt;
* r1133: Added stop rumble to load savestate, fixes issue 165&lt;br /&gt;
* r1077: GTK GUI bugfixes&lt;br /&gt;
* r1063: rice video: crash in MMX/SSE checking functions&lt;br /&gt;
* r800: logical error in strcpy loop in util.c&lt;br /&gt;
* r798: small bugfixes in blight_input: 1. only save config file after running config dialog, not every time DLL is closed.  2. If rumble is not available on a controller, don&amp;#039;t allow user to switch between rumble and mempack.  3. If rumble is selected in config file but not available on a controller, select mempack instead.&lt;br /&gt;
* r789: 3 glN64 bugfixes (segfaults on a 64-bit system in Perfect Dark): prevent clamp values from being negative, handle TMEM wrap-arounds from wacky height/line values in texture cache load and texture CRC functions&lt;br /&gt;
* r788: rice video: add checks for uint32 height/width parameters which can be negative, causing segfault on 64-bit systems&lt;br /&gt;
* r784: 64-bit problem causing GUI crashes - gotta save/restore all the callee-saved registers around the dynarec&lt;br /&gt;
* r758: fixed some savestate problems&lt;br /&gt;
* r748: Fixed 64-bit dynarec crash in genj_idle() and genjal_idle()&lt;br /&gt;
* r715: Bugfixes thanks to Valgrind. Two using strcpy with source and destination overlay, i.e. strcpy(p,p+1)&lt;br /&gt;
* r700: set ScreenUpdateSetting=1 in rice video ini file for Conkers BFD&lt;br /&gt;
* r694: require bash shell scripting for install.sh&lt;br /&gt;
* r686: fixed OSD crash bug after running a game, disabling OSD, then running another game&lt;br /&gt;
* r684: OGLFT measuring functions were taking a huge chunk of CPU time.  Refactored code to measure only once and store the line size and the message sizes instead of re-measuring all the time.  This eliminated nearly all of the OSD overhead on my PC&lt;br /&gt;
* r681: Refactored OGLFT to do color setting outside of glyph compiling, so the OSD fading doesnt force bitmaps to be continually recreated with calls to renderGlyph.  Seems to have cut the excessive cpu usage of the OSD about by half&lt;br /&gt;
* r680: removed many unused classes from OGLFT font library code&lt;br /&gt;
* r676: bugfix in my BYTESWAP macros&lt;br /&gt;
* r674: Removed glide64/Tmem_nasm.asm source file and the project dependency on nasm/yasm assemblers&lt;br /&gt;
* r673: removed inline assembly sections in rdp_loadblock and rdp_loadtile, including their dependency on functions in Tmem_nasm.asm.  Replaced with new C code.  This fixes a segfault on some 64-bit source builds&lt;br /&gt;
* r669: string function causing crash on 64-bit linux&lt;br /&gt;
* r667: issue #88 - added basic view menu in GTK GUI&lt;br /&gt;
* r628,633: Small patch to get glide64.so to compile with O3 optimizations&lt;br /&gt;
* r622: Fixed segfault in Glide64 as per issue 113&lt;br /&gt;
* r619: fix LIRC build to integrate w/ new screenshot mechanism&lt;br /&gt;
* r608: another couple of memory leak fixes from Tub, in main/config.c&lt;br /&gt;
* r605: fix from Tub for free() bug in main/util.c/list_delete()&lt;br /&gt;
* r587: issue #111: close screenshot file after saving&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v1.4 - June 14, 2008===&lt;br /&gt;
* New feature: graphical debugger for R4300 core&lt;br /&gt;
* New feature: On Screen Display&lt;br /&gt;
* New feature: KDE4 GUI (experimental)&lt;br /&gt;
* New feature: cheat system with Gameshark codes&lt;br /&gt;
* New feature: search/filter box in GTK GUI&lt;br /&gt;
* New feature: single frame advance&lt;br /&gt;
* New feature: adjust emulator playback speed up or down in 5% increments&lt;br /&gt;
* New feature: Rumble Pak support with force feedback&lt;br /&gt;
* New feature: Map emulator functions (fullscreen, stop emulation, etc) to joystick buttons or axis movements.&lt;br /&gt;
* New feature: Volume up/down&lt;br /&gt;
* Blight Input: Individually configure each direction of X and Y axis, which allows inverting the axis&lt;br /&gt;
* JTTL_Audio: libsamplerate support for high quality audio resampling&lt;br /&gt;
* GTK GUI: Removed second status bar which was not used&lt;br /&gt;
* GTK GUI: Implemented accelerator keys&lt;br /&gt;
* GTK GUI: Replaced custom directory browser with GTK file chooser&lt;br /&gt;
* GTK GUI: numerous small changes and fixes&lt;br /&gt;
* Added Mupen64Plus &amp;#039;man&amp;#039; (manual) page&lt;br /&gt;
* Removed mupen64_audio plugin, as it was unnecessary and mostly broken&lt;br /&gt;
* Added NoMemoryExpansion parameter to emulate 4MB console; fixes some games&lt;br /&gt;
* Overhaul of rom handling functions; numerous small fixes&lt;br /&gt;
* Bugfix: Removed NoAudioDelay core option to resolve issue #48&lt;br /&gt;
* Bugfix: check for stopped state in dynarec jump function, to fix unresponsive emulator when game gets stuck in loop&lt;br /&gt;
* Bugfix: GTK GUI: #6 - if a ROM is selected in the ROM browser and &amp;#039;play&amp;#039; is pressed, emulation will start&lt;br /&gt;
* Bugfix: GTK GUI: #62 - ROM browser column sorting works&lt;br /&gt;
* Bugfix: Rice Video: Support hi-res textures with different scale factors for X and Y&lt;br /&gt;
* Bugfix: Blight Input: don&amp;#039;t use 100% CPU in configuration dialog&lt;br /&gt;
&lt;br /&gt;
----------------------------------------&lt;br /&gt;
&lt;br /&gt;
===Mupen64Plus v1.3 - March 29th, 2008===&lt;br /&gt;
* New feature: Glide64 video plugin for 32-bit and 64-bit, renamed project Mupen64Plus&lt;br /&gt;
* New feature: Combine mupen64 and mupen64_nogui into a single binary&lt;br /&gt;
* New feature: ability to change icon size&lt;br /&gt;
* New feature: support different directories for install (plugins, icons, etc) and config (save games, config files)&lt;br /&gt;
* New feature: support for creating/using ~/.mupen64plus dir for storing user data&lt;br /&gt;
* New feature: support for installation via &amp;quot;make install&amp;quot; or &amp;quot;./install.sh&amp;quot;&lt;br /&gt;
* New feature: support for plugins given via command line option in GUI mode&lt;br /&gt;
* New feature: config dialog checkbox to toggle &amp;quot;noask&amp;quot; setting&lt;br /&gt;
* New feauter: pause/continue functionality with LIRC&lt;br /&gt;
* Removed messagebox utility and replaced it with cleaner alert_message/confirm_message calls&lt;br /&gt;
* GTK GUI: Set parent window for all popups so WM will center popup windows over the main gui window&lt;br /&gt;
* Added README file with information about usage of Mupen64Plus and plugins&lt;br /&gt;
* Removed mupen64_soft_gfx, as it didn&amp;#039;t work&lt;br /&gt;
* Removed Win32 code from RSP HLE plugin, &lt;br /&gt;
* Change fullscreen hotkey to Alt+Enter&lt;br /&gt;
* Only plugin filenames (not paths) are stored in the mupen64plus.conf file&lt;br /&gt;
* Modified pre.mk and glide64 makefile to auto-select yasm or nasm&lt;br /&gt;
* Bugfix: Rice Video: Make configuration during gameplay possible again&lt;br /&gt;
* Bugfix: many compiler warnings and errors in Glide64&lt;br /&gt;
* Bugfix: segfault in Goldeneye and Perfect Dark for 64-bit dynarec&lt;br /&gt;
* Bugfix: 64-bit dynarec bug in genld()&lt;br /&gt;
* Bugfix: buffer overflow allocating temp strings for basename/dirname&lt;br /&gt;
* Bugfix: GTK GUI: Exiting via File -&amp;gt; Exit wasn&amp;#039;t writing out config file to disk&lt;br /&gt;
* Bugfix: GTK GUI: &amp;quot;About&amp;quot; menu does not pop up while emulation is running&lt;br /&gt;
* Bugfix: Glide64: Refactored a bunch of inline asm code with potential bugs&lt;br /&gt;
* Bugfix: Added plugin error checking before emulator is started&lt;br /&gt;
* Bugfix: Logo not loading in &amp;quot;about&amp;quot; window&lt;br /&gt;
* Bugfix: Segfault in plugin_scan_directory()&lt;br /&gt;
* Bugfix: ROM pause/continue while playing&lt;br /&gt;
* Bugfix: Too many dialog windows when loading a bad dump or hacked rom&lt;br /&gt;
* Bugfix: Closing emulation window now stops emulator&lt;br /&gt;
* Bugfix: Rice Video: config dialog bug, now it displays proper resolution&lt;br /&gt;
* Bugfix: GTK GUI: &amp;quot;Toolbar Style&amp;quot; now works&lt;br /&gt;
* Bugfix: Glide64: changed inline asm label syntax, for compatibility with gcc 4.3.0&lt;br /&gt;
* Bugfix: Many other minor bug fixes, GTK warnings fixes, translation corrections, etc&lt;br /&gt;
&lt;br /&gt;
----------------------------------------&lt;br /&gt;
&lt;br /&gt;
===Mupen64-amd64 v1.2 - February 10th, 2008===&lt;br /&gt;
* New feature: Dynamic Recompiler for 64-bit&lt;br /&gt;
* New feature: New ROM Browser for Mupen64 GUI build&lt;br /&gt;
* New feature: LIRC remote control integration for NOGUI build&lt;br /&gt;
* Added r4300 instruction counting capability to 64-bit Dynarec&lt;br /&gt;
* Added r4300 profile data output for 32-bit and 64-bit dynamic recompilers&lt;br /&gt;
* TLB Optimization / bugfix&lt;br /&gt;
* Revised makefiles to support PPC builds&lt;br /&gt;
* Bugfix: memory leaks in mupenIniApi.c&lt;br /&gt;
* Bugfix: corrupted filenames being saved to disk for mupen64.ini&lt;br /&gt;
* Bugfix: crash in jttl_audio&lt;br /&gt;
* Bugfix: crash when running game from gui after first time&lt;br /&gt;
* Bugfix: spurious noise blip when running game from gui after first time&lt;br /&gt;
&lt;br /&gt;
----------------------------------------&lt;br /&gt;
&lt;br /&gt;
===Mupen64-amd64 v1.1 - December 9th, 2007===&lt;br /&gt;
* New icons for GTK GUI&lt;br /&gt;
* Removed GTK 1.2 GUI build; GTK 2.0 is required now&lt;br /&gt;
* Added file pointer checking for frwite() calls and error logging&lt;br /&gt;
* Added scrolling to the the rom list widget&lt;br /&gt;
* Added main/version.h file to store Mupen64-amd64 package version&lt;br /&gt;
* Print joystick numbers along with names in blight input to tell multiple devices apart&lt;br /&gt;
* Merged okaygo&amp;#039;s TLB hack for Goldeneye from Mupen64++&lt;br /&gt;
* Rework GTK GUI config dialog; fixed bugs in ROM directory list&lt;br /&gt;
* Bugfix: segfault from playing same game twice in a row from GUI&lt;br /&gt;
* Bugfix: segfault from fwrite() failure in dma_pi_read in memory/dma.c&lt;br /&gt;
* Bugfix: exit properly instead of segfault after dyna_stop is called&lt;br /&gt;
* Bugfix: blight input: &amp;lt;code&amp;gt;SDL_PumpEvents&amp;lt;/code&amp;gt; must be called from thread which initialized SDL video mode&lt;br /&gt;
* Bugfix: blight_input: joystick handling caused glitch in config dialog&lt;br /&gt;
* Bugfix: makefile: 32-bit CFLAGS must be used when doing 32-bit build on 64-bit machine&lt;br /&gt;
* Bugfix: Added makefile to root folder for building releases&lt;br /&gt;
&lt;br /&gt;
----------------------------------------&lt;br /&gt;
&lt;br /&gt;
===Mupen64-amd64 v1.0 - November 12th, 2007===&lt;br /&gt;
* Forked from Mupen64 v0.5&lt;br /&gt;
* Ported to 64-bit architecture by NMN/!SirRichard42&lt;br /&gt;
* Fixed texture cache problem in glN64&lt;br /&gt;
* Print more information during plugin loading process&lt;br /&gt;
* Added blight input config file for logitech dual-action style controllers&lt;br /&gt;
* Added SDL_GL_SWAP_CONTROL attribute in glN64 to prevent tearing&lt;br /&gt;
* Changed glVoids to voids due to strange compilation bug that occurs on certain systems&lt;br /&gt;
* Totally refactored makefiles; now plugins are built as sub-modules&lt;br /&gt;
* Better logging for r4300 core selection, disallow Dynamic Recompilation for 64-bit builds at compile time&lt;br /&gt;
* Set execstack attribute for all mupen64 binaries, to prevent segfault when Dynamic Recompilation is used&lt;br /&gt;
* Lots of code cleanup&lt;br /&gt;
* Removed &amp;#039;multi-user&amp;#039; mode of operation&lt;br /&gt;
* Removed &amp;#039;configure&amp;#039; script and config.h file&lt;br /&gt;
* Refactored plugin loading code in &amp;#039;&amp;#039;&amp;#039;nogui&amp;#039;&amp;#039;&amp;#039; build, much more user-friendly now&lt;br /&gt;
* Added comments and SDL shutdown code to main.c&lt;br /&gt;
* Bugfix: fixed memory leaks in plugin.c&lt;br /&gt;
* Bugfix: strcpy in main/gui_gtk/config.c should not copy overlapping strings&lt;br /&gt;
* Bugfix: blight audio: only close down audio and timer sub-systems when exiting&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=42</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=42"/>
		<updated>2015-07-26T22:00:24Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Created page with &amp;quot;/* CSS placed here will be applied to all skins */ /*  * Allow limiting of which header levels are shown in a TOC;  * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to  *...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
/*&lt;br /&gt;
 * Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
 * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
 * showing ==headings== and ===headings=== but no further.&lt;br /&gt;
 * Used in [[Template:TOC]]&lt;br /&gt;
 */&lt;br /&gt;
.toclimit-2 .toclevel-1 ul,&lt;br /&gt;
.toclimit-3 .toclevel-2 ul,&lt;br /&gt;
.toclimit-4 .toclevel-3 ul,&lt;br /&gt;
.toclimit-5 .toclevel-4 ul,&lt;br /&gt;
.toclimit-6 .toclevel-5 ul,&lt;br /&gt;
.toclimit-7 .toclevel-6 ul {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=README&amp;diff=41</id>
		<title>README</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=README&amp;diff=41"/>
		<updated>2015-07-26T21:48:42Z</updated>

		<summary type="html">&lt;p&gt;Richard42: How to build, install, and use Mupen64Plus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
This README document reflects the instructions for using the latest Mupen64Plus code, which may be unreleased, so if you are using a released version of Mupen64Plus, the most accurate instructions are in the README file included with your release package.&lt;br /&gt;
&lt;br /&gt;
Mupen64Plus is based off of mupen64, originally created by Hacktarux. The Mupen64Plus package contains the mupen64 emulator program (renamed mupen64plus) plus graphics, sound, input, and RSP plugins.&lt;br /&gt;
&lt;br /&gt;
===Requirements and Pre-requisites===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Binary Package Requirements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* GTK2 libraries (currently hard plugin dependence even with GUI=NONE)&lt;br /&gt;
* SDL 1.2&lt;br /&gt;
* SDL_ttf&lt;br /&gt;
* libpng&lt;br /&gt;
* freetype 2&lt;br /&gt;
* zlib&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source Build Requirements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In addition to the binary libraries, the following packages are required if you build Mupen64Plus from source:&lt;br /&gt;
&lt;br /&gt;
* GNU C and C++ compiler, libraries, and headers&lt;br /&gt;
* GNU make&lt;br /&gt;
* Development packages for all the libraries above&lt;br /&gt;
&lt;br /&gt;
Most of these pre-requisites are installed by default, but some are more uncommon. Here is an example for adding the &amp;#039;SDL_ttf&amp;#039; development packages on Fedora systems:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  # yum install SDL_ttf SDL_ttf-devel&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
And on Debian systems:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  # apt-get install libsdl-ttf2.0-0 libsdl-ttf2.0-dev&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are also a number of packages required for specific options:&lt;br /&gt;
&lt;br /&gt;
* libsamplerate (aka Secret Rabbit Code for higher quality audio)&lt;br /&gt;
* binutils-dev (dis-asm.h for debugger)&lt;br /&gt;
* Qt4 libraries and headers (for Qt4 GUI)&lt;br /&gt;
&lt;br /&gt;
===Building From Source===&lt;br /&gt;
&lt;br /&gt;
If you downloaded the binary distribution of Mupen64Plus, skip to the Installation section.  Otherwise, you will need both the libraries and development packages (header files) for the prerequisites listed above.&lt;br /&gt;
&lt;br /&gt;
Once you have all prerequisites installed, you can build the source distribution by unzipping and cd&amp;#039;ing into the source directory, then build using make: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ unzip Mupen64Plus-x-y-z-src.zip&lt;br /&gt;
 $ cd Mupen64Plus-x-y-z-src&lt;br /&gt;
 $ make all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Type &amp;#039;make&amp;#039; by itself to view all available build options:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ make&lt;br /&gt;
 Mupen64Plus makefile. &lt;br /&gt;
   Targets:&lt;br /&gt;
     all           == Build Mupen64Plus and all plugins&lt;br /&gt;
     clean         == remove object files&lt;br /&gt;
     rebuild       == clean and re-build all&lt;br /&gt;
     install       == Install Mupen64Plus and all plugins&lt;br /&gt;
     uninstall     == Uninstall Mupen64Plus and all plugins&lt;br /&gt;
   Options:&lt;br /&gt;
     BITS=32       == build 32-bit binaries on 64-bit machine&lt;br /&gt;
     VCR=1         == enable video recording&lt;br /&gt;
     LIRC=1        == enable LIRC support&lt;br /&gt;
     NO_RESAMP=1   == disable libsamplerate support in jttl_audio&lt;br /&gt;
     NO_ASM=1      == build without assembly (no dynamic recompiler or MMX/SSE code)&lt;br /&gt;
     GUI=NONE      == build without GUI support&lt;br /&gt;
     GUI=GTK2      == build with GTK2 GUI support (default)&lt;br /&gt;
     GUI=QT4       == build with QT4 GUI support&lt;br /&gt;
   Install Options:&lt;br /&gt;
     PREFIX=path   == install/uninstall prefix (default: /usr/local/)&lt;br /&gt;
     SHAREDIR=path == path to install shared data (default: PREFIX/share/mupen64plus/)&lt;br /&gt;
     BINDIR=path   == path to install mupen64plus binary (default: PREFIX/bin/)&lt;br /&gt;
     LIBDIR=path   == path to install plugin libs (default: SHAREDIR/plugins/)&lt;br /&gt;
     MANDIR=path   == path to install manual files (default: PREFIX/man/man1/)&lt;br /&gt;
   Debugging Options:&lt;br /&gt;
     PROFILE=1     == build gprof instrumentation into binaries for profiling&lt;br /&gt;
     DBGSYM=1      == add debugging symbols to binaries&lt;br /&gt;
     DBG=1         == build graphical debugger&lt;br /&gt;
     DBG_CORE=1    == print debugging info in r4300 core&lt;br /&gt;
     DBG_COUNT=1   == print R4300 instruction count totals (64-bit dynarec only)&lt;br /&gt;
     DBG_COMPARE=1 == enable core-synchronized r4300 debugging&lt;br /&gt;
     DBG_PROFILE=1 == dump profiling data for r4300 dynarec to data file&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: If you want to build a nogui-only version of the Mupen64Plus core (without gtk+ dependencies), pass the GUI=NONE option to make, like this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ make GUI=NONE all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Binary Distribution&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
To install the binary distribution of Mupen64Plus, su to root and run the provided install.sh script:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ su&lt;br /&gt;
 # ./install.sh&lt;br /&gt;
 # exit&lt;br /&gt;
 $&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The install script will copy the executable to /usr/local/bin and a directory called /usr/local/share/mupen64plus will be created to hold plugins and other files used by mupen64plus.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Source Distribution&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
After building mupen64plus and all plugins, su to root and type &amp;#039;make install&amp;#039; to install Mupen64Plus. The install process will copy the executable to $PREFIX/bin and a directory called $PREFIX/share/mupen64plus will be created to hold plugins and other files used by mupen64plus. By default, PREFIX is set to /usr/local. This can be changed by passing the PREFIX option to &amp;#039;make&amp;#039; during the installation.  For example, to install mupen64plus to /usr, do this:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ make all&lt;br /&gt;
 $ su&lt;br /&gt;
 # make PREFIX=/usr install&lt;br /&gt;
 # exit&lt;br /&gt;
 $&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Custom Installation Paths&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You may customize the installation of the Mupen64Plus program by using the options for the install.sh script:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
usage: install.sh [PREFIX] [SHAREDIR] [BINDIR] [LIBDIR] [MANDIR]&lt;br /&gt;
	PREFIX   - installation directories prefix (default: /usr/local)&lt;br /&gt;
	SHAREDIR - path to Mupen64Plus shared data files (default: $PREFIX/share/mupen64plus)&lt;br /&gt;
	BINDIR   - path to Mupen64Plus binary program files (default: $PREFIX/bin)&lt;br /&gt;
	LIBDIR   - path to Mupen64Plus plugin files (default: $SHAREDIR/plugins)&lt;br /&gt;
	MANDIR   - path to manual files (default: $PREFIX/man/man1)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You must pass the same options to the uninstall.sh script when uninstalling in order to remove all of the Mupen64Plus files.&lt;br /&gt;
&lt;br /&gt;
You should install the Mupen64Plus plugins (libraries) in their own folder.  If you install them in a common directory such as /usr/lib and then later uninstall them with &amp;quot;sudo uninstall.sh LIBDIR=/usr/lib&amp;quot;, it will delete all system libraries.&lt;br /&gt;
&lt;br /&gt;
If you install with SHAREDIR in a place other than /usr/local/share/mupen64plus or /usr/share/mupen64plus, and BINDIR is not the same as SHAREDIR, then users will have to run Mupen64Plus with the --installdir= option, otherwise they will get an error.  The mupen64plus executable looks in up to 5 different directories in order to find the Shared Data Directory.  The order in which the directories are searched is:&lt;br /&gt;
&lt;br /&gt;
# directory specified on command line with --installdir&lt;br /&gt;
# same directory as the mupen64plus binary&lt;br /&gt;
# /usr/local/share/mupen64plus&lt;br /&gt;
# /usr/share/mupen64plus&lt;br /&gt;
# current working directory&lt;br /&gt;
&lt;br /&gt;
If you choose to install the plugins in a non-standard location (someplace other than $SHAREDIR/plugins), then you must set the PluginDirectory parameter in the mupen64plus.conf config file to the directory path in which the plugins have been installed.&lt;br /&gt;
&lt;br /&gt;
===Multi-user Support===&lt;br /&gt;
&lt;br /&gt;
As of version 1.3, Mupen64Plus now has support for multi-user environments.&lt;br /&gt;
&lt;br /&gt;
The mupen64plus program will look for user configuration files in a .mupen64plus directory in the user&amp;#039;s home directory. If the directory does not exist, it will be created and a default mupen64plus.conf file will be written to that directory. If desired, an alternate config directory can be specified using the --configdir commandline option.&lt;br /&gt;
&lt;br /&gt;
By default, the mupen64plus program will look for plugins, icons, and language translation files in the install directory $PREFIX/share/mupen64plus (see Installation section for details). If this directory does not exist, mupen64plus will try to use the current working directory. An alternate installation directory can be specified using the --installdir commandline option.&lt;br /&gt;
&lt;br /&gt;
Run &amp;#039;mupen64plus --help&amp;#039; for a complete list of commandline options:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ mupen64plus --help&lt;br /&gt;
 Usage: mupen64plus [parameter(s)] rom&lt;br /&gt;
&lt;br /&gt;
 Parameters:&lt;br /&gt;
         --nogui                 : do not display GUI&lt;br /&gt;
         --fullscreen            : turn fullscreen mode on&lt;br /&gt;
         --noosd                 : disable onscreen display.&lt;br /&gt;
         --gfx (path)            : use gfx plugin given by (path)&lt;br /&gt;
         --audio (path)          : use audio plugin given by (path)&lt;br /&gt;
         --input (path)          : use input plugin given by (path)&lt;br /&gt;
         --rsp (path)            : use rsp plugin given by (path)&lt;br /&gt;
         --emumode (number)      : set emu mode to: 0=Interpreter 1=DynaRec 2=Pure Interpreter&lt;br /&gt;
         --sshotdir (dir)        : set screenshot directory to (dir)&lt;br /&gt;
         --configdir (dir)       : force config dir (must contain mupen64plus.conf)&lt;br /&gt;
         --installdir (dir)      : force install dir (place to look for plugins, icons, lang, etc)&lt;br /&gt;
         --noask                 : dont ask to force load on bad dumps&lt;br /&gt;
         --testshots (list)      : take screenshots at frames given in comma-separated list, then quit&lt;br /&gt;
         -h, --help              : see this help message&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Key Commands In Emulator===&lt;br /&gt;
&lt;br /&gt;
The keys or joystick/mouse inputs which will be mapped to the N64 controller for playing the games are determined by the input plugin.  The emulator core also supports several key commands, which are fixed and cannot be changed.  They are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Key&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Escape || Quit the emulator&lt;br /&gt;
|-&lt;br /&gt;
|0-9 || Select virtual &amp;#039;slot&amp;#039; for save/load state (F5 and F7) commands&lt;br /&gt;
|-&lt;br /&gt;
|F5 || Save emulator state&lt;br /&gt;
|-&lt;br /&gt;
|F7 || Load emulator state&lt;br /&gt;
|-&lt;br /&gt;
|F9 || Reset emulator&lt;br /&gt;
|-&lt;br /&gt;
|F10 || slow down emulator by 5%&lt;br /&gt;
|-&lt;br /&gt;
|F11 || speed up emulator by 5%&lt;br /&gt;
|-&lt;br /&gt;
|F12 || take screenshot&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Enter || Toggle between windowed and fullscreen&lt;br /&gt;
|-&lt;br /&gt;
|p or P || Pause on/off&lt;br /&gt;
|-&lt;br /&gt;
|m or M || Mute/unmute sound&lt;br /&gt;
|-&lt;br /&gt;
|g or G || Press &amp;quot;Game Shark&amp;quot; button (only if cheats are enabled)&lt;br /&gt;
|-&lt;br /&gt;
|/ or ? || single frame advance while paused&lt;br /&gt;
|-&lt;br /&gt;
|F || Fast Forward (playback at 250% normal speed while F key is pressed)&lt;br /&gt;
|-&lt;br /&gt;
|[ || Decrease volume&lt;br /&gt;
|-&lt;br /&gt;
|] || Increase volume&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Default Key Mappings for SDL-Input Plugin===&lt;br /&gt;
&lt;br /&gt;
The keys or joystick/mouse inputs which will be mapped to the N64 controller for playing the games are determined by the input plugin.  The SDL-Input plugin contains an auto-configuration function which will provide default joystick mappings for any recognized joystick.  If there is no supported joystick connected, the input plugin will enable a default keyboard control mapping, as given below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;N64 Controller Action&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Analog Pad || Arrow Keys (left, right, down, up)&lt;br /&gt;
|-&lt;br /&gt;
|C Up/Left/Down/Right || &amp;quot;I&amp;quot;, &amp;quot;J&amp;quot;, &amp;quot;K&amp;quot;, &amp;quot;L&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|DPad Up/Left/Down/Right || &amp;quot;W&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;D&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Z trigger || &amp;quot;z&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Left trigger || &amp;quot;x&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Right trigger || &amp;quot;c&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Start || &amp;quot;Enter&amp;quot; (&amp;quot;Return&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|A button || &amp;quot;left shift&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|B button || &amp;quot;left control&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Select Mempack || &amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Select Rumblepack || &amp;quot;.&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Known Issues===&lt;br /&gt;
&lt;br /&gt;
As of March 2008, the RiceVideoLinux plugin causes artifacts when fog is enabled in most games with the open source drivers for ATI Radeon graphics adapters. If you are using the open source Radeon driver, you should set the &amp;quot;!EnableFog&amp;quot; value in RiceVideo.cfg to 0.&lt;br /&gt;
&lt;br /&gt;
When using RiceVideoLinux, there are quite a few games which show an artifact whereby some or all of the polygons on the screen will disappear every few frames, revealing the underlying background color.  This problem is usually caused by the wrong screen update setting.  If you edit the ini file at: ~/.mupen64plus/RiceVideoLinux.ini, search for the section with the game&amp;#039;s name, and add &amp;quot;ScreenUpdateSetting=1&amp;quot; to the bottom.  This usually fixes the flashing artifacts.  Please file an issue report here with the game&amp;#039;s name and MD5 hash value if you find a game which exhibits this problem and works correctly after the .ini file update.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=Mupen64Plus&amp;diff=40</id>
		<title>Mupen64Plus</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=Mupen64Plus&amp;diff=40"/>
		<updated>2015-07-26T21:44:11Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Background Information About Mupen64Plus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039;, Originally &amp;#039;&amp;#039;&amp;#039;Mupen64-64bit&amp;#039;&amp;#039;&amp;#039;, created by Richard42, is a fork of &amp;#039;&amp;#039;&amp;#039;Mupen64&amp;#039;&amp;#039;&amp;#039;, An N64 emulator created by Hacktarux. &amp;#039;&amp;#039;&amp;#039;Mupen64-64bit&amp;#039;&amp;#039;&amp;#039; was started sometime after the first release of a quick attempt to port &amp;#039;&amp;#039;&amp;#039;Mupen64&amp;#039;&amp;#039;&amp;#039; to x86_64/AMD64/EM64T was released.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039; is Open Source, as it is required as a derivative of the GPLv2 software, &amp;#039;&amp;#039;&amp;#039;Mupen64&amp;#039;&amp;#039;&amp;#039; . All source code to all plug-ins are redistributed under the license they were originally redistributed under. The latest snapshot of source is publicly available via offsite SVN under a special user (Who&amp;#039;s information is listed on the Project Homepage.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
On October 10th, 2007, A branch off of &amp;#039;&amp;#039;&amp;#039;Mupen64&amp;#039;&amp;#039;&amp;#039; was presented to the public as &amp;#039;&amp;#039;&amp;#039;Mupen 64bit&amp;#039;&amp;#039;&amp;#039; [[http://emutalk.net/showthread.php?t=42243 Go→]].  First released by nmn, it contained a buggy version of glN64, JTTL&amp;#039;s Audio Plug-in, A broken release of Blight&amp;#039;s SDL Input plug-in, And the original &amp;#039;&amp;#039;&amp;#039;&amp;#039;r4300&amp;#039;&amp;#039;&amp;#039;&amp;#039; emulation minus dynamic recompiling. (No attempt to port it was made as of the original release) On October 14th, 2007, Richard42 had decided to help on the project. On October 21st, 2007, the original port was finally dumped and the project gained a new name, &amp;#039;&amp;#039;&amp;#039;Mupen64-64bit&amp;#039;&amp;#039;&amp;#039;. Essentially, It was a new project, being started from the vanilla Mupen64 0.5 source code. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mupen64-64bit&amp;#039;&amp;#039;&amp;#039; was soon renamed &amp;#039;&amp;#039;&amp;#039;Mupen64-amd64&amp;#039;&amp;#039;&amp;#039;. During this next period many of the fork&amp;#039;s most important achievements were made. A Dynamic Recompiler was developed, Many of the largest bugs were fixed, and the emulator&amp;#039;s GUI was renovated.&lt;br /&gt;
&lt;br /&gt;
After a while, it became clear that the name &amp;#039;&amp;#039;&amp;#039;Mupen64-amd64&amp;#039;&amp;#039;&amp;#039; was giving the impression that the emulator did not support 32-bit Intel x86 processors. Finally, It was decided to rename the project to &amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039;, and the project gained a homepage at Google Code, where it sits today.&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
&lt;br /&gt;
Although the original goals of the initial project were only to port the emulator to 64-bit Intel and fix bugs, not long after Richard42 arrived, it was decided that the project should also aim to improve the quality of &amp;#039;&amp;#039;&amp;#039;Mupen64&amp;#039;&amp;#039;&amp;#039;. Currently, the project has deviated off of the original &amp;#039;&amp;#039;&amp;#039;Mupen64&amp;#039;&amp;#039;&amp;#039; quite much. The main differences are:&lt;br /&gt;
&lt;br /&gt;
* New Makefile, supporting PPC (broken as of now) and x86 targets for 64-bit and 32-bit.&lt;br /&gt;
* New GTK code, with much less deprecated GTK functions and widgets&lt;br /&gt;
* A Qt4 GUI&lt;br /&gt;
* A port of Rice Video, with countless fixes and renovations&lt;br /&gt;
* A port of Glide64 Wonder Plus&lt;br /&gt;
* Improvements to glN64&lt;br /&gt;
* 64-bit Dynamic Recompiler&lt;br /&gt;
* A brand new Windows port using GTK&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Currently, &amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039; only compiles under Intel processors on the Linux platform (Other UNIX like Operating Systems should work as long as you have GNU Make and GCC for compilation). Simply use &amp;quot;make all&amp;quot; to compile the emulator, provided all prerequisites are properly installed and working.&lt;br /&gt;
&lt;br /&gt;
An effort to port &amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039; to Microsoft Windows is under way. Fixes to the build system that will allow users of PowerPC Linux to run &amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039; should be released soon.&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
&lt;br /&gt;
Currently, &amp;#039;&amp;#039;&amp;#039;Mupen64Plus&amp;#039;&amp;#039;&amp;#039; has 10 Plug-ins. 4 Video plug-ins, 3 audio plug-ins, 2 input plug-ins and 1 RSP plug-in.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Video:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* glN64&lt;br /&gt;
* No Video&lt;br /&gt;
* Glide64 Wonder Plus&lt;br /&gt;
* Rice&amp;#039;s Video Plugin (With mudlord&amp;#039;s extensions)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Audio:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Mupen64 Audio Plugin (May become obsolete)&lt;br /&gt;
* No Audio&lt;br /&gt;
* JttL&amp;#039;s SDL Audio&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Mupen64 Basic Input Plugin&lt;br /&gt;
* Blight&amp;#039;s SDL Input Plugin&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;RSP:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Hacktarux/Azimer HLE RSP Plugin&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=MacOSXInstructions&amp;diff=39</id>
		<title>MacOSXInstructions</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=MacOSXInstructions&amp;diff=39"/>
		<updated>2015-07-26T21:36:31Z</updated>

		<summary type="html">&lt;p&gt;Richard42: How to install and run Mupen64Plus on Intel Macintosh computers with OSX&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Here are some basic usage instructions to compile Mupen64Plus on Intel Macintosh computers with OSX (this is for developers. If you are a user, please just download the binary from the downloads page or, if you want a front-end, look at http://bitbucket.org/auria/wxmupen64plus/wiki/Home ).  As of October, 2011, all of the Mupen64Plus software will compile and run correctly. Please be aware that Mupen64Plus does not currently run on older PowerPC based Macintosh computers.&lt;br /&gt;
&lt;br /&gt;
Please note that these instructions are meant as guidelines for people who know what they&amp;#039;re doing. If you don&amp;#039;t have much experience building stuff from source, I would recommend that you wait for binary packages instead.&lt;br /&gt;
&lt;br /&gt;
Choose your mupen version :&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-1&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mupen64plus 1.99.x and 2.x ==&lt;br /&gt;
&lt;br /&gt;
* Install developer tools (Xcode) from the DVD that came with your Mac.&lt;br /&gt;
&lt;br /&gt;
* Get the code from the various modules using mercurial as on any other platform (or just download a source code archive)&lt;br /&gt;
Get the dependencies just like you&amp;#039;d do for mupen64plus 1.x (except maybe GTK/Qt since there is no GUI frontend yet for mupen 2)&lt;br /&gt;
&lt;br /&gt;
* Install pkg-config if you don&amp;#039;t already have it&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create this file, called &amp;#039;&amp;#039;&amp;#039;zlib.pc&amp;#039;&amp;#039;&amp;#039;, in /usr/local/lib/pkgconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
prefix=/usr&lt;br /&gt;
exec_prefix=${prefix}&lt;br /&gt;
libdir=${exec_prefix}/lib&lt;br /&gt;
includedir=${prefix}/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Name: zlib&lt;br /&gt;
Version: 1.1.3&lt;br /&gt;
Description: zlib&lt;br /&gt;
Requires: &lt;br /&gt;
Libs: -L${libdir} -lz&lt;br /&gt;
Cflags: -I${includedir}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create this file, called &amp;#039;&amp;#039;&amp;#039;gl.pc&amp;#039;&amp;#039;&amp;#039;, in /usr/local/lib/pkgconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
prefix=/usr&lt;br /&gt;
exec_prefix=${prefix}&lt;br /&gt;
libdir=${exec_prefix}/lib&lt;br /&gt;
includedir=${prefix}/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Name: gl&lt;br /&gt;
Version: 2.0&lt;br /&gt;
Description: OpenGL&lt;br /&gt;
Requires: &lt;br /&gt;
Libs: -framework OpenGL&lt;br /&gt;
Cflags: -I${includedir}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create this file, called &amp;#039;&amp;#039;&amp;#039;glu.pc&amp;#039;&amp;#039;&amp;#039;, in /usr/local/lib/pkgconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
prefix=/usr&lt;br /&gt;
exec_prefix=${prefix}&lt;br /&gt;
libdir=${exec_prefix}/lib&lt;br /&gt;
includedir=${prefix}/include&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Name: glu&lt;br /&gt;
Version: 2.0&lt;br /&gt;
Description: glu&lt;br /&gt;
Requires: &lt;br /&gt;
Libs: &lt;br /&gt;
Cflags: -I${includedir}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A script to build (32 bits, compatible with 10.6/10.5 and maybe 10.4) looks like :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
PWD = `pwd`&lt;br /&gt;
export CC=&amp;quot;gcc-4.0&amp;quot;&lt;br /&gt;
export CXX=&amp;quot;g++-4.0&amp;quot;&lt;br /&gt;
export LD=&amp;quot;g++-4.0&amp;quot;&lt;br /&gt;
APIDIR=$PWD/mupen64plus-core/src/api&lt;br /&gt;
export MACOSX_DEPLOYMENT_TARGET=10.4&lt;br /&gt;
export SDK_ROOT=/Developer/SDKs/MacOSX10.5.sdk&lt;br /&gt;
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig&lt;br /&gt;
&lt;br /&gt;
APP_BUNDLE=./mupen64plus.app/Contents&lt;br /&gt;
&lt;br /&gt;
export CFLAGS=&amp;quot;-g&amp;quot;&lt;br /&gt;
export CXXFLAGS=&amp;quot;-g&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;== Core ==&amp;quot;&lt;br /&gt;
cd mupen64plus-core/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-core/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;== RSP-HLE ==&amp;quot;&lt;br /&gt;
cd mupen64plus-rsp-hle/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-rsp-hle/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== SDL Audio ==&amp;quot;&lt;br /&gt;
cd mupen64plus-audio-sdl/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-audio-sdl/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== SDL Input ==&amp;quot;&lt;br /&gt;
cd mupen64plus-input-sdl/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-input-sdl/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Rice ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-rice/projects/unix&lt;br /&gt;
make all CC=&amp;quot;g++-4.0&amp;quot; C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; V=1 BITS=32 PIC=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-rice/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Arachnoid ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-arachnoid/projects/unix&lt;br /&gt;
make all C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-arachnoid/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Glide ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-glide64/projects/unix&lt;br /&gt;
make all C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-glide64/projects/unix/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Glide Napalm ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-glide-napalm/Glitch64&lt;br /&gt;
make -f Makefile.gcc OSX_ARCH=i386 EXT_INC=&amp;quot;../../mupen64plus-core/src/api -I./inc&amp;quot;&lt;br /&gt;
cd ../src&lt;br /&gt;
make -f Makefile.nowx-gcc all C_INCLUDE_PATH=&amp;quot;/usr/local/include:../../mupen64plus-core/src/api&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include:../../mupen64plus-core/src/api&amp;quot; OSX_ARCH=i386&lt;br /&gt;
cd ../..&lt;br /&gt;
cp -f mupen64plus-video-glide-napalm/src/lib/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
cp -f mupen64plus-video-glide-napalm/src/&amp;#039;&amp;#039;&amp;#039;.dylib .&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Console ==&amp;quot;&lt;br /&gt;
cd mupen64plus-ui-console/projects/unix&lt;br /&gt;
make all V=1&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-ui-console/projects/unix/mupen64plus .&lt;br /&gt;
&lt;br /&gt;
mkdir -p $APP_BUNDLE/MacOS/&lt;br /&gt;
cp -f mupen64plus $APP_BUNDLE/MacOS/mupen64plus&lt;br /&gt;
cp -f &amp;#039;&amp;#039;&amp;#039;.dylib $APP_BUNDLE/MacOS/.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To build 64-bits, use something like that instead (tested on 1.6) :&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#!/bin/sh&lt;br /&gt;
PWD = `pwd`&lt;br /&gt;
&lt;br /&gt;
APIDIR=$PWD/mupen64plus-core/src/api&lt;br /&gt;
export LD=&amp;quot;g++&amp;quot;&lt;br /&gt;
&lt;br /&gt;
APP_BUNDLE=./mupen64plus.app/Contents&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;== Core ==&amp;quot;&lt;br /&gt;
cd mupen64plus-core/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-core/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;== RSP-HLE ==&amp;quot;&lt;br /&gt;
cd mupen64plus-rsp-hle/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS LD=&amp;quot;g++&amp;quot;&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-rsp-hle/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== SDL Audio ==&amp;quot;&lt;br /&gt;
cd mupen64plus-audio-sdl/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-audio-sdl/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== SDL Input ==&amp;quot;&lt;br /&gt;
cd mupen64plus-input-sdl/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-input-sdl/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Rice ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-rice/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR NO-ASM=1 C_INCLUDE_PATH=/usr/local/include ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-rice/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Arachnoid ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-arachnoid/projects/unix&lt;br /&gt;
make all C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-arachnoid/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Glide ==&amp;quot;&lt;br /&gt;
cd mupen64plus-video-glide64/projects/unix&lt;br /&gt;
make all C_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; CPLUS_INCLUDE_PATH=&amp;quot;/usr/local/include&amp;quot; ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-video-glide64/projects/unix/*.dylib .&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;quot;&lt;br /&gt;
echo &amp;quot;== Console ==&amp;quot;&lt;br /&gt;
cd mupen64plus-ui-console/projects/unix&lt;br /&gt;
make all APIDIR=$APIDIR ARCH_DETECTED=64BITS&lt;br /&gt;
cd ../../..&lt;br /&gt;
cp -f mupen64plus-ui-console/projects/unix/mupen64plus .&lt;br /&gt;
&lt;br /&gt;
mkdir -p $APP_BUNDLE/MacOS/&lt;br /&gt;
cp -f mupen64plus $APP_BUNDLE/MacOS/mupen64plus&lt;br /&gt;
cp -f *.dylib $APP_BUNDLE/MacOS/.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Macports users, you will need to add flags like this to the end of many of the &amp;#039;&amp;#039;make&amp;#039;&amp;#039; commands above :&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LIBRARY_PATH=/opt/local/lib&lt;br /&gt;
C_INCLUDE_PATH=&amp;quot;/opt/local/include/libpng12&amp;quot;&lt;br /&gt;
CPLUS_INCLUDE_PATH=&amp;quot;/opt/local/include/libpng12&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And a script to bundle may look like :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
#!/bin/sh&lt;br /&gt;
APP_CONTENTS=&amp;quot;./mupen64plus.app/Contents&amp;quot;&lt;br /&gt;
&lt;br /&gt;
FIX_LIST=&amp;quot;-x $APP_CONTENTS/MacOS/mupen64plus \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/libmupen64plus.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-audio-sdl.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-input-sdl.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-rsp-hle.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-video-rice.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-video-arachnoid.dylib \&lt;br /&gt;
-x $APP_CONTENTS/MacOS/mupen64plus-video-glide64.dylib&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dylibbundler -od -b $FIX_LIST -d $APP_CONTENTS/libs/&lt;br /&gt;
&lt;br /&gt;
rm -rf $APP_CONTENTS/Resources&lt;br /&gt;
mkdir -p $APP_CONTENTS/Resources&lt;br /&gt;
cp ./mupen64plus-video-rice/data/* $APP_CONTENTS/Resources&lt;br /&gt;
cp ./mupen64plus-video-glide64/data/* $APP_CONTENTS/Resources&lt;br /&gt;
cp ./mupen64plus-core/data/* $APP_CONTENTS/Resources&lt;br /&gt;
cp ./mupen64plus-input-sdl/data/*  $APP_CONTENTS/Resources&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this script requires [http://macdylibbundler.sourceforge.net/ macdylibbundler] to be installed.&lt;br /&gt;
&lt;br /&gt;
Currently this only runs from the terminal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mupen64plus 1.x ==&lt;br /&gt;
&lt;br /&gt;
===Developer tools===&lt;br /&gt;
Install developer tools (Xcode) from the DVD that came with your Mac.&lt;br /&gt;
&lt;br /&gt;
===GETTING MUPEN64PLUS===&lt;br /&gt;
You can simply download a source archive from the mupen64plus website; you can also use SVN. SVN example :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
mkdir mupen64plus&lt;br /&gt;
cd mupen64plus&lt;br /&gt;
svn co svn://fascination.homelinux.net:7684/mupen64plus/trunk --username mupen64 --password Dyson5632-kart&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DEPENDENCIES===&lt;br /&gt;
* Mupen can be built with either GTK+ or Qt. It is expected that in the future the Qt version will work better, but until then the GTK+ version is easier to get to run. Install GTK+ from http://www.gtk-osx.org/. (If you like using macports, beware : GTK as installed from macports &amp;#039;&amp;#039;will&amp;#039;&amp;#039; work on your computer, but you won&amp;#039;t be able to package a distributable dmg. The installer from the website mentionned is much more handy for this)&lt;br /&gt;
 &lt;br /&gt;
* Other dependencies can be installed either from source or from macports.&lt;br /&gt;
&lt;br /&gt;
====(A) THE SOURCE CODE WAY====&lt;br /&gt;
You will need SDL, SDL_ttf and its subdependencies (Freetype, fontconfig), and libpng.&lt;br /&gt;
Find them with [http://www.google.com Google] and install them with the usual&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
sudo make install&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====(B) THE MACPORTS WAY====&lt;br /&gt;
* Install macports from [http://www.macports.org/install.php macports.org]&lt;br /&gt;
* Open terminal (under Hard Drive, Applications, Utilities, Terminal). Type in the following commands.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo port install libsdl_ttf libpng&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since macports installs librairies in a non-standard prefix, you will need to help the makefiles find librairies installed from macports. You can simply export LDFLAGS=-L/opt/local/lib or, more conveniently, change it on a more permanent basis by editing &amp;#039;&amp;#039;&amp;#039;pre.mk&amp;#039;&amp;#039;&amp;#039; in the mupen source - then locate the lines that read&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
OS = OSX&lt;br /&gt;
LDFLAGS += -liconv -lpng&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and make the second one&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LDFLAGS += -L/opt/local/lib -liconv -lpng&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===BUILDING MUPEN64PLUS===&lt;br /&gt;
We&amp;#039;ll first set some environment variables to help mupen find GTK+. Also make sure sdl-config is in your PATH.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
export PKG_CONFIG_PATH=/Library/Frameworks/Gtk.framework/Resources/dev/lib/pkgconfig&lt;br /&gt;
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/Library/Frameworks/GLib.framework/Resources/dev/lib/pkgconfig&lt;br /&gt;
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/Library/Frameworks/Cairo.framework/Resources/dev/lib/pkgconfig &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Then cross your fingers, it&amp;#039;s time to build!&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd /path/to/mupen/trunk&lt;br /&gt;
make all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, for a debug build:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
make DBGSYM=1 all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RUNNING===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd mupen64plus/trunk/&lt;br /&gt;
./mupen64plus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To run no gui mode :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# simplest :&lt;br /&gt;
./mupen64plus --nogui &amp;lt;rom-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# pass some settings&lt;br /&gt;
./mupen64plus --nogui --gfx plugins/glN64.so --audio plugins/jttl_audio.so --input plugins/blight_input.so --rsp plugins/mupen64_hle_rsp_azimer.so --emumode 1 &amp;lt;rom-path&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be aware that input may not work if you launch ROMs in GUI mode.&lt;br /&gt;
&lt;br /&gt;
===PACKAGING MUPEN64PLUS===&lt;br /&gt;
If all you wanted is to play with Mupen64Plus, this section won&amp;#039;t apply to you; but we want to share the fun with others, don&amp;#039;t we? From now on, I&amp;#039;ll concentrate on how to build a package you can send to others.&lt;br /&gt;
&lt;br /&gt;
Start by installing mupen :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sudo ./install.sh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will first need an &amp;#039;&amp;#039;&amp;#039;Info.plist&amp;#039;&amp;#039;&amp;#039; file, sample here :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple Computer//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dict&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleDevelopmentRegion&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;English&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleInfoDictionaryVersion&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;6.0&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundlePackageType&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;APPL&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CSResourcesFileMapped&amp;lt;/key&amp;gt;  &amp;lt;true/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleExecutable&amp;lt;/key&amp;gt;  &amp;lt;string&amp;gt;launcher&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleName&amp;lt;/key&amp;gt;        &amp;lt;string&amp;gt;Mupen64Plus&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleIconFile&amp;lt;/key&amp;gt;    &amp;lt;string&amp;gt;mupen64plus.icns&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleVersion&amp;lt;/key&amp;gt;     &amp;lt;string&amp;gt;1.5&amp;lt;/string&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	&amp;lt;key&amp;gt;CFBundleDocumentTypes&amp;lt;/key&amp;gt;&lt;br /&gt;
	&amp;lt;array&amp;gt;&lt;br /&gt;
		&amp;lt;dict&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;CFBundleTypeExtensions&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;array&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;n64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;N64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;z64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;V64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;v64&amp;lt;/string&amp;gt;&lt;br /&gt;
				&amp;lt;string&amp;gt;V64&amp;lt;/string&amp;gt;&lt;br /&gt;
			&amp;lt;/array&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;CFBundleTypeIconFile&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;string&amp;gt;mupen64cart.icns&amp;lt;/string&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;CFBundleTypeName&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;string&amp;gt;N64 Rom&amp;lt;/string&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;CFBundleTypeRole&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;string&amp;gt;Editor&amp;lt;/string&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;LSIsAppleDefaultForType&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;true/&amp;gt;&lt;br /&gt;
			&amp;lt;key&amp;gt;LSTypeIsPackage&amp;lt;/key&amp;gt;&lt;br /&gt;
			&amp;lt;false/&amp;gt;&lt;br /&gt;
		&amp;lt;/dict&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
	&amp;lt;/array&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/dict&amp;gt;&lt;br /&gt;
&amp;lt;/plist&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
(note that the executable name in this Info.plist file is &amp;#039;&amp;#039;launcher&amp;#039;&amp;#039; - I&amp;#039;ll explain why below)&lt;br /&gt;
&lt;br /&gt;
You will also need icons for mupen and ROMs : mupen64plus.icns, mupen64cart.icns&lt;br /&gt;
&lt;br /&gt;
Then you can build the application bundle by using a simple shell script :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
INSTALL_PREFIX=&amp;quot;/usr/local&amp;quot;&lt;br /&gt;
APP_CONTENTS=&amp;quot;./Mupen64Plus.app/Contents&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;* Removing any existing installation&amp;quot;&lt;br /&gt;
rm -rf ./Mupen64Plus.app&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;* Creating skeleton&amp;quot;&lt;br /&gt;
mkdir -p $APP_CONTENTS/Resources&lt;br /&gt;
mkdir $APP_CONTENTS/MacOS&lt;br /&gt;
cp Info.plist $APP_CONTENTS/Info.plist&lt;br /&gt;
cp mupen64plus.icns $APP_CONTENTS/Resources/mupen64plus.icns&lt;br /&gt;
cp mupen64cart.icns $APP_CONTENTS/Resources/mupen64cart.icns&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;* Copying executable&amp;quot;&lt;br /&gt;
cp $INSTALL_PREFIX/bin/mupen64plus $APP_CONTENTS/MacOS/mupen64plus&lt;br /&gt;
#cp ./launcher $APP_CONTENTS/MacOS/launcher&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;* Copying data files&amp;quot;&lt;br /&gt;
cp -r $INSTALL_PREFIX/share/mupen64plus/ $APP_CONTENTS/Resources/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can then make this bundle distributable by blessing it with [http://macdylibbundler.sourceforge.net DylibBundler]. First install DylibBundler by following the instructions inside. Then run this small script :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
APP_CONTENTS=&amp;quot;./Mupen64Plus.app/Contents&amp;quot;&lt;br /&gt;
&lt;br /&gt;
FIX_LIST=&amp;quot;-x $APP_CONTENTS/MacOS/mupen64plus \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/blight_input.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/dummyaudio.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/dummyvideo.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/glide64.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/glN64.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/jttl_audio.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/mupen64_hle_rsp_azimer.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/mupen64_input.so \&lt;br /&gt;
-x $APP_CONTENTS/Resources/plugins/ricevideo.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
dylibbundler -od -b $FIX_LIST -d $APP_CONTENTS/libs/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voila it&amp;#039;s ready! Well actually, it should be in theory... In practice there is a bug on mac : when using both SDL and GTK+ at the same time, both grab the event loop and conflict with each other. The result of this is that ROMs cannot be launched from the GTK GUI, they can only be run in &amp;#039;&amp;#039;nogui&amp;#039;&amp;#039; mode. The GTK interface however still remains necessary to configure mupen. Until this issue gets fixed properly, I work around it by placing a second executable in the bundle called &amp;#039;&amp;#039;launcher&amp;#039;&amp;#039; (see the bundling script above, there is a commented out line that does this). This executable can then act as a bridge to either open the GTK GUI and configure mupen, either launch a ROM in nogui mode.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt; MacLauncher&lt;br /&gt;
&lt;br /&gt;
With this launcher as main executable, you should finally have a distributable executable!&lt;br /&gt;
&lt;br /&gt;
To be continued...&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=LIRC&amp;diff=38</id>
		<title>LIRC</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=LIRC&amp;diff=38"/>
		<updated>2015-07-26T21:07:37Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Enabling LIRC support in Mupen64Plus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Mupen64Plus includes support for [http://www.lirc.org Linux Infrared Remote Control] (LIRC). This can be used to send commands to Mupen64Plus using a remote control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Building with LIRC support ==&lt;br /&gt;
&lt;br /&gt;
To build Mupen64Plus with LIRC support, download and unzip the source code, and pass &amp;quot;LIRC=1&amp;quot; to make. See the [[README]] for full details on build/installation of Mupen64Plus.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 $ make LIRC=1 all&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuring LIRC Commands ==&lt;br /&gt;
&lt;br /&gt;
LIRC uses a config file to define mappings between buttons on your remote control (as defined in lircd.conf) and the commands you want to send to Mupen64Plus. Mupen64Plus expects the LIRC config to be in a file called .lircrc in the user&amp;#039;s home directory.&lt;br /&gt;
&lt;br /&gt;
The LIRC config file contains a block for each button mapping. Here is an example block:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
begin&lt;br /&gt;
   prog = mupen64plus&lt;br /&gt;
   button = Back/Exit&lt;br /&gt;
   config = quit&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This maps the &amp;quot;Back/Exit&amp;quot; button on the remote control to the &amp;quot;quit&amp;quot; mupen64plus command.&lt;br /&gt;
&lt;br /&gt;
You can also use the &amp;quot;repeat&amp;quot; keyword to have LIRC repeatedly send a command while you&amp;#039;re holding down a button on the remote control. Here is an example block:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
begin&lt;br /&gt;
   prog = mupen64plus&lt;br /&gt;
   button = Vol+&lt;br /&gt;
   repeat = 1&lt;br /&gt;
   config = vol+&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This maps the &amp;quot;Vol+&amp;quot; button on the remote control to the &amp;quot;vol+&amp;quot; mupen64plus command. The repeat line means that LIRC will repeatedly send the &amp;quot;vol+&amp;quot; command as long as the remote control button is held down. Increasing the repeat number decreases how often the command will be sent to mupen64plus.&lt;br /&gt;
&lt;br /&gt;
=== Supported Commands ===&lt;br /&gt;
&lt;br /&gt;
The following table lists the Mupen64Plus commands that can be mapped to remote control buttons in your LIRC config file:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Config String&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|0-9 || Set current statesave slot to given slot number.&lt;br /&gt;
|-&lt;br /&gt;
|save || Save game state to currently selected statesave slot.&lt;br /&gt;
|-&lt;br /&gt;
|load || Load game statesave from currently selected statesave slot.&lt;br /&gt;
|-&lt;br /&gt;
|pause || Pause/continue emulation.&lt;br /&gt;
|-&lt;br /&gt;
|quit || Stop Emulation.&lt;br /&gt;
|-&lt;br /&gt;
|fullscreen || Toggle fullscreen mode.&lt;br /&gt;
|-&lt;br /&gt;
|screenshot || Take a screenshot.&lt;br /&gt;
|-&lt;br /&gt;
|vol+ || Increase volume by 2%. &amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; svn only, not available in v1.3&lt;br /&gt;
|-&lt;br /&gt;
|vol- || Decrease volume by 2% &amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; svn only, not available in v1.3&lt;br /&gt;
|-&lt;br /&gt;
|mute || Mute/unmute volume &amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; svn only, not available in v1.3&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=KeyboardSetup&amp;diff=37</id>
		<title>KeyboardSetup</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=KeyboardSetup&amp;diff=37"/>
		<updated>2015-07-26T21:05:02Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Default key bindings for Mupen64Plus emulator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===1. Default Key Commands In Emulator Core===&lt;br /&gt;
&lt;br /&gt;
The emulator core supports key commands for many functions.  The default key bindings are given below, but may be changed by editing the configuration file as described later in this document.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Key&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Escape || Quit the emulator&lt;br /&gt;
|-&lt;br /&gt;
|0-9 || Select virtual &amp;#039;slot&amp;#039; for save/load state (F5 and F7) commands&lt;br /&gt;
|-&lt;br /&gt;
|F5 || Save emulator state&lt;br /&gt;
|-&lt;br /&gt;
|F7 || Load emulator state&lt;br /&gt;
|-&lt;br /&gt;
|F9 || Reset emulator&lt;br /&gt;
|-&lt;br /&gt;
|F10 || slow down emulator by 5%&lt;br /&gt;
|-&lt;br /&gt;
|F11 || speed up emulator by 5%&lt;br /&gt;
|-&lt;br /&gt;
|F12 || take screenshot&lt;br /&gt;
|-&lt;br /&gt;
|Alt-Enter || Toggle between windowed and fullscreen&lt;br /&gt;
|-&lt;br /&gt;
|p or P || Pause on/off&lt;br /&gt;
|-&lt;br /&gt;
|m or M || Mute/unmute sound&lt;br /&gt;
|-&lt;br /&gt;
|g or G || Press &amp;quot;Game Shark&amp;quot; button (only if cheats are enabled)&lt;br /&gt;
|-&lt;br /&gt;
|/ or ? || single frame advance while paused&lt;br /&gt;
|-&lt;br /&gt;
|F || Fast Forward (playback at 250% normal speed while F key is pressed)&lt;br /&gt;
|-&lt;br /&gt;
|[ || Decrease volume&lt;br /&gt;
|-&lt;br /&gt;
|] || Increase volume&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===2. Default Key Mappings for SDL-Input Plugin===&lt;br /&gt;
&lt;br /&gt;
The keys or joystick/mouse inputs which will be mapped to the N64 controller for playing the games are determined by the input plugin.  The SDL-Input plugin contains an auto-configuration function which will provide default joystick mappings for any recognized joystick.  If there is no supported joystick connected, the input plugin will enable a default keyboard control mapping, as given below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;N64 Controller Action&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Keys&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|Analog Pad || Arrow Keys (left, right, down, up)&lt;br /&gt;
|-&lt;br /&gt;
|C Up/Left/Down/Right || &amp;quot;I&amp;quot;, &amp;quot;J&amp;quot;, &amp;quot;K&amp;quot;, &amp;quot;L&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|DPad Up/Left/Down/Right || &amp;quot;W&amp;quot;, &amp;quot;A&amp;quot;, &amp;quot;S&amp;quot;, &amp;quot;D&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Z trigger || &amp;quot;z&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Left trigger || &amp;quot;x&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Right trigger || &amp;quot;c&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Start || &amp;quot;Enter&amp;quot; (&amp;quot;Return&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|A button || &amp;quot;left shift&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|B button || &amp;quot;left control&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Select Mempack || &amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Select Rumblepack || &amp;quot;.&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:keyboardMupen64Plus.png]]&lt;br /&gt;
&lt;br /&gt;
When using the keyboard, the analog stick is normally moved by its full range when you press an arrow key.  Sometimes you may need to make smaller moves.  In this case, you can move the analog stick more gently by holding down the Right Control key (for -50%) or Right Shift key (-25%), or both (-75%).&lt;br /&gt;
&lt;br /&gt;
===3. Configuration for Key Commands===&lt;br /&gt;
&lt;br /&gt;
You may set your own key bindings for the emulator core and input plugins, by editing the Mupen64Plus config file.  On Linux or OSX, this is located at &amp;lt;code&amp;gt;~/.config/mupen64plus/&amp;lt;/code&amp;gt;, and on Windows it is in the &amp;quot;Application Data&amp;quot; sub-folder of your user folder.  On Windows XP and prior, this is &amp;lt;code&amp;gt;C:\Documents and Settings\username\Application Data\Mupen64Plus\&amp;lt;/code&amp;gt;, while on Windows Visa and newer this is &amp;lt;code&amp;gt;C:\Users\username\AppData\Mupen64Plus&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
See http://www.libsdl.org/release/SDL-1.2.15/include/SDL_keysym.h for Key IDs.&lt;br /&gt;
&lt;br /&gt;
For documentation about the keyboard settings in this configuration file, refer to our Emuwiki site.  The [[Mupen64Plus_Core_Parameters|Core Parameters]] page gives the names of the config parameters to set up the Emulator Core key commands, while the [[Mupen64Plus_Plugin_Parameters#Input-SDL|Plugin Parameters]] page tells how to configure the controls for the input plugin.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=File:KeyboardMupen64Plus.png&amp;diff=36</id>
		<title>File:KeyboardMupen64Plus.png</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=File:KeyboardMupen64Plus.png&amp;diff=36"/>
		<updated>2015-07-26T20:14:18Z</updated>

		<summary type="html">&lt;p&gt;Richard42: keyboard layout image&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;keyboard layout image&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=InputPluginUsage&amp;diff=35</id>
		<title>InputPluginUsage</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=InputPluginUsage&amp;diff=35"/>
		<updated>2015-07-26T17:45:34Z</updated>

		<summary type="html">&lt;p&gt;Richard42: Supported use cases for Autoconfiguration with Mupen64Plus-Input-SDL plugin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=== Use Cases ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Use case #1 scenario&amp;#039;&amp;#039;&amp;#039;: First-time user of Mupen64Plus, has no configuration file.&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Desired Behavior&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
*** Automatically detect and configure any supported joysticks, assigning them in sequence to controllers.&lt;br /&gt;
*** Skip any unsupported joysticks without leaving unconfigured controllers.&lt;br /&gt;
*** If no SDL joysticks are found, configure the keyboard/mouse.&lt;br /&gt;
*** Fill in (blank) settings for all 4 controllers (for GUI front-ends)&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;How to configure&amp;#039;&amp;#039;&amp;#039;: Automatic.&lt;br /&gt;
*** If no configuration is found for a controller (or version is out of date), it will automatically be set to mode 2 (fully automatic), and saved.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Use case #2 scenario&amp;#039;&amp;#039;&amp;#039;: User changes controllers often (configuration file is present)&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Desired Behavior&amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*** Automatically detect and configure any joysticks plugged in&lt;br /&gt;
*** Skip any unsupported joysticks without leaving unconfigured controllers.&lt;br /&gt;
*** If no SDL joysticks are found, configure the keyboard/mouse.&lt;br /&gt;
*** Don&amp;#039;t stick to old input settings in configuration file when a different joystick is used&lt;br /&gt;
*** User should be able to modify the auto-configured settings (edit InputAutoConfig.ini)&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;How to configure&amp;#039;&amp;#039;&amp;#039;: Automatic&lt;br /&gt;
*** User should set all controllers to mode 2 (fully auto) in this scenario, and edit his controller preferences in the InputAutoConfig.ini file.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Use case #3 scenario&amp;#039;&amp;#039;&amp;#039;: User switches between keyboard and joystick&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Desired Behavior&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
*** If joystick is plugged in, then set up according to configuration file (if it matches), or auto-config&lt;br /&gt;
*** If no SDL joysticks are found, configure the keyboard/mouse.&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;How to configure&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
*** User should set all controllers to mode 2 (fully auto) in this scenario, and edit his controller preferences in the InputAutoConfig.ini file.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Use case #4 scenario&amp;#039;&amp;#039;&amp;#039;: Developer wants to create a specific input configuration for testing purposes: no controllers, only a controller in port 2, etc.&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;How to configure&amp;#039;&amp;#039;&amp;#039;: Set all controller &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; parameters to 0, set other configuration parameters as necessary.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Use case #5 scenario&amp;#039;&amp;#039;&amp;#039;: A user wants has several different controllers plugged in, and wants to set a specific one (which may not be SDL joystick 0) to be N64 controller 0.  The user also wants the configuration to be automatic (doesn&amp;#039;t want to have to set up the joystick manually).&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;How to configure&amp;#039;&amp;#039;&amp;#039;: Set controller #1 &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; parameter to 1, and set the SDL joystick name of your desired main controller in to the &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; parameter.&lt;br /&gt;
&lt;br /&gt;
=== Design Changes ===&lt;br /&gt;
* changes relative to Hg rev 173:725bc6d288ae&lt;br /&gt;
* Changes to &amp;lt;code&amp;gt;[Input-SDL-Control*]&amp;lt;/code&amp;gt; sections&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; changes from 1 to 2&lt;br /&gt;
*** Add parameter &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: 0 = Fully Manual, 1 = Automatic with named SDL device, 2 = Fully Automatic.  GUI front-ends should make all of the controller&amp;#039;s other parameters read-only when the mode is set to 2, and should make all parameters except &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; read-only when the mode is set to 1.&lt;br /&gt;
*** For the &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;device&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; parameter, remove the &amp;lt;code&amp;gt;-2&amp;lt;/code&amp;gt; option (keyboard input should automatically work for any N64 controller which maps keys), and change the semantic of the &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; option to mean &amp;quot;No SDL joystick&amp;quot; instead of &amp;quot;Auto-config&amp;quot;.  For modes 1 and 2, this parameter will be set by the input plugin.  The user can only set this parameter for mode 0.&lt;br /&gt;
*** For the &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; parameter: Similar to previous usage, but mode-dependent: For mode 0, name of joystick/keyboard which was last used (set by plugin). For mode 1, name of desired joystick/keyboard to use for this controller (set by user).  For mode 2, ignored.&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
	<entry>
		<id>https://mupen64plus.org/wiki/index.php?title=HighResolutionTextures&amp;diff=34</id>
		<title>HighResolutionTextures</title>
		<link rel="alternate" type="text/html" href="https://mupen64plus.org/wiki/index.php?title=HighResolutionTextures&amp;diff=34"/>
		<updated>2015-07-26T06:32:29Z</updated>

		<summary type="html">&lt;p&gt;Richard42: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Mupen64Plus&amp;#039;s Rice Video plugin supports a very nice feature which allows the user to replace all of the original textures used for 3D rendering in a game with high-resolution replacement textures drawn by graphic artists.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
=== Enable Hi-Res Texture Loading in Rice Video ===&lt;br /&gt;
&lt;br /&gt;
In order to begin using the hi-resolution texture feature, you must enable it by editing the Mupen64Plus config file.  One option is to find the file and edit it directly with a text editor.  On Linux or OSX, this is located at &amp;lt;code&amp;gt;~/.config/mupen64plus/&amp;lt;/code&amp;gt;, and on Windows it is in the &amp;quot;Application Data&amp;quot; sub-folder of your user folder. On Windows XP and prior, this is &amp;lt;code&amp;gt;C:\Documents and Settings\&amp;lt;username&amp;gt;\Application Data\Mupen64Plus\&amp;lt;/code&amp;gt;, while on Windows Vista and newer this is &amp;lt;code&amp;gt;C:\Users\&amp;lt;username&amp;gt;\AppData\Mupen64Plus&amp;lt;/code&amp;gt;.  You should find a section in this file labeled &amp;lt;code&amp;gt;[Video-Rice]&amp;lt;/code&amp;gt;, and within this section is a parameter called &amp;lt;code&amp;gt;LoadHiResTextures&amp;lt;/code&amp;gt;.  Set this to True to enable searching for and loading high-resolution textures.&lt;br /&gt;
&lt;br /&gt;
Another option to enable this feature is to use the &amp;lt;code&amp;gt;--set&amp;lt;/code&amp;gt; option with the Mupen64Plus command-line user interface.  To do this, run a game with a command similar to this: &amp;lt;code&amp;gt;./mupen64plus --set Video-Rice[LoadHiResTextures]=True --saveoptions m64p_test_rom.v64&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installing Hi-Res Texture Files ===&lt;br /&gt;
&lt;br /&gt;
To install a high-resolution texture pack for a game, all that you need to do is unzip the archive and put the extracted directory full of images into the right place.  On Linux and OSX, this is usually &amp;lt;code&amp;gt;/home/&amp;lt;username&amp;gt;/.local/share/mupen64plus/hires_texture&amp;lt;/code&amp;gt;.  On Windows it is in the &amp;quot;Application Data&amp;quot; sub-folder of your user folder. On Windows XP and prior, this is &amp;lt;code&amp;gt;C:\Documents and Settings\&amp;lt;username&amp;gt;\Application Data\Mupen64Plus\hires_texture&amp;lt;/code&amp;gt;, while on Windows Vista and newer this is &amp;lt;code&amp;gt;C:\Users\&amp;lt;username&amp;gt;\AppData\Mupen64Plus\hires_texture&amp;lt;/code&amp;gt;.  If this directory doesn&amp;#039;t exist, create it and copy the hi-res texture directory inside.&lt;br /&gt;
&lt;br /&gt;
The folder containing hi-res textures must be named exactly the same as the ROM&amp;#039;s name in the header of the ROM file.  Usually this name is short with all capital letters, like &amp;quot;MARIOKART64&amp;quot; or &amp;quot;SMASH BROTHERS&amp;quot;.  The command-line UI prints out this ROM name when running a game, right after the Goodname and before the MD5.&lt;br /&gt;
&lt;br /&gt;
=== Running ===&lt;br /&gt;
&lt;br /&gt;
After setup, just run the game as usual.  If using the command-line UI, you should see a line printed out which says:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Video: Texture loading option is enabled. Finding all hires textures&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Richard42</name></author>
	</entry>
</feed>