fceux/documentation/porting.txt

290 lines
9.9 KiB
Plaintext

FCE Ultra Porting Guide
Updated: October 4, 2003
*Incomplete*
***Driver-supplied functions:
These functions will only be called after the driver code calls
FCEUI_LoadGame() or FCEUI_Emulate().
void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count);
Called by FCE Ultra on every emulated frame. This function should
perform the following three things(in any order):
1.
Update the data pointed to by the pointers passed to
FCEUI_SetInput() and FCEUI_SetInputFC().
2.
Copy contents of XBuf over to video memory(or whatever needs to be
done to make the contents of XBuf visible on screen).
Each line is 256 pixels(and bytes) in width, and there can be 240
lines. The pitch for each line is 272 bytes.
XBuf will be 0 if the symbol FRAMESKIP is defined and this frame
was skipped.
3.
Write the contents of "Buffer" to the sound device. "Count" is the
number of samples to write. Only the lower 16-bits of each
sample are used, so each 32-bit sample in "Buffer" can be converted to
signed 16-bit by dropping the upper 16 bits.
When sound was disabled for the frame, "Count" will be 0.
void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b);
Set palette entry "index" to specified RGB values(value: min=0, max=255).
void FCEUD_GetPalette(uint8 index, uint8 *r, uint8 *g, uint8 *b);
Get palette entry "index" data.
void FCEUD_PrintError(char *s);
Print/Display an error message string pointed to by "s".
void FCEUD_Message(char *s);
Display a status message string.
int FCEUD_NetworkConnect(void);
Initialize a network connection. Return 0 if an error occurs.
int FCEUD_GetDataFromClients(uint8 *data);
/* Sends 5 bytes of data to all clients. */
int FCEUD_SendDataToClients(uint8 *data);
/* Sends 1 byte of data to server, and maybe a command. */
int FCEUD_SendDataToServer(uint8 v, uint8 cmd);
/* Gets 5 bytes of data from the server. This function must block. */
int FCEUD_GetDataFromServer(uint8 *data);
void FCEUD_NetworkClose(void);
Close the network connection.
***FCE Ultra functions(called by the driver code):
The FCEUI_* functions may only be called before FCEUI_Emulate() is
called or after it returns and before it is called again, or after the
following functions are called and before they return:
FCEUD_Update();
Calling the FCEUI_* functions at any other time may result in
undefined behavior.
void FCEUI_SetInput(int port, int type, void *ptr, int attrib);
"port" can be either 0 or 1, and corresponds to the physical
ports on the front of a NES.
"type" may be:
SI_NONE - No input on this port.
SI_GAMEPAD - Standard NES gamepad
SI_ZAPPER - "Zapper" light gun.
SI_POWERPAD - Power-pad mat.
SI_ARKANOID - Arkanoid controller.
void FCEUI_SetInputFC(int type, void *ptr, int attrib);
Special Famicom devices.
"type" may be:
SIFC_NONE - No input here.
SIFC_ARKANOID - Arkanoid controller.
SIFC_SHADOW - "Space Shadow" gun.
SIFC_4PLAYER - Famicom 4-player adapter
SIFC_FKB - Family Keyboard
void FCEUI_DisableFourScore(int s);
Disables four-score emulation if s is nonzero.
void FCEUI_SetSnapName(int a);
0 to order screen snapshots numerically(0.png), 1 to order them file
base-numerically(smb3-0.png).
void FCEUI_DisableSpriteLimitation(int a);
Disables the 8-sprite-per-scanline limitation of the NES if "a"
is nonzero. The default behavior is the limitation is enabled.
void FCEUI_SaveExtraDataUnderBase(int a);
If "a" is nonzero, save extra non-volatile game data(battery-backed
RAM) under FCE Ultra's base directory. Otherwise, the behavior is
to save it under the same directory the game is located in(this is
the default behavior).
FCEUGI *FCEUI_LoadGame(char *name);
Loads a new file. "name" is the full path of the file to load.
Returns 0 on failure, or a pointer to data type "FCEUGI":
See file "git.h" for more details on this structure.
int FCEUI_Initialize(void);
Allocates and initializes memory. Should only be called once, before
any calls to other FCEU functions.
void FCEUI_SetBaseDirectory(void);
Specifies the base FCE Ultra directory. This should be called
immediately after FCEUI_Initialize() and any time afterwards.
void FCEUI_SetDirOverride(int which, char *n);
FCEUIOD_CHEATS - Cheats
FCEUIOD_MISC - Miscellaneous stuff(custom game palettes)
FCEUIOD_NV - Non-volatile game data(battery backed RAM)
FCEUIOD_SNAPS - Screen snapshots
FCEUIOD_STATE - Save states
void FCEUI_Emulate(void);
Enters the emulation loop. This loop will be exited when FCEUI_CloseGame()
is called. This function obviously shouldn't be called if FCEUI_LoadGame()
wasn't called or FCEUI_CloseGame() was called after FCEUI_LoadGame().
void FCEUI_CloseGame(void);
Closes the loaded game and frees all memory used to load it.
Also causes FCEUI_Emulate() to return.
void FCEUI_ResetNES(void);
void FCEUI_PowerNES(void);
void FCEUI_SetRenderedLines(int ntscf, int ntscl, int palf, int pall);
Sets the first(minimum is 0) and last(NOT the last scanline plus one;
maximum is 239) scanlines of background data to draw, for both NTSC
emulation mode and PAL emulation mode.
Defaults are as if this function were called with the variables set
up as follows:
ntscf=8, ntscl=231, palf=0, pall=239
void FCEUI_SetNetworkPlay(int type);
Sets status of network play according to "type". If type is 0,
then network play is disabled. If type is 1, then we are server.
If type is 2, then we are a client.
void FCEUI_SelectState(int w);
Selects the state "slot" to save to and load from.
void FCEUI_SaveState(void);
Saves the current virtual NES state from the "slot" selected by
FCEUI_SelectState().
void FCEUI_LoadState(void);
Loads the current virtual NES state from the "slot" selected by
FCEUI_SelectState().
void FCEUI_SaveSnapshot(void);
Saves a screen snapshot.
void FCEUI_DispMessage(char *msg);
Displays a short, one-line message using FCE Ultra's built-in
functions and ASCII font data.
int32 FCEUI_GetDesiredFPS(void);
Returns the desired FPS based on whether NTSC or PAL emulation is
enabled, shifted left by 24 bits(this is necessary because the real
FPS value is not a whole integer). This function should only be
necessary if sound emulation is disabled.
int FCEUI_GetCurrentVidSystem(int *slstart, int *slend);
Convenience function(not strictly necessary, but reduces excessive code
duplication); returns currently emulated video system
(0=NTSC, 1=PAL). It will also set the variables pointed to by slstart
and slend to the first and last scanlines to be rendered, respectively,
if slstart and slend are not 0.
void FCEUI_GetNTSCTH(int *tint, int *hue);
void FCEUI_SetNTSCTH(int n, int tint, int hue);
int FCEUI_AddCheat(char *name, uint16 addr, uint8 val);
Adds a RAM cheat with the specified name to patch the address "addr"
with the value "val".
int FCEUI_DelCheat(uint32 which);
Deletes the specified(by number) cheat.
void FCEUI_ListCheats(void (*callb)(char *name, uint16 a, uint8 v));
Causes FCE Ultra to go through the list of all cheats loaded for
the current game and call callb() for each cheat with the cheat
information.
int FCEUI_GetCheat(uint32 which, char **name, int32 *a, int32 *v, int *s);
Gets information on the cheat referenced by "which".
int FCEUI_SetCheat(uint32 which, char *name, int32 a, int32 v, int s);
Sets information for the cheat referenced by "which".
void FCEUI_CheatSearchBegin(void);
Begins the cheat search process. Current RAM values are copied
to a buffer to later be processed by the other cheat search functions.
void FCEUI_CheatSearchEnd(int type, int v1, int v2);
Searches the buffer using the search method specified by "type"
and the parameters "v1" and "v2".
int32 FCEUI_CheatSearchGetCount(void);
Returns the number of matches from the cheat search.
void FCEUI_CheatSearchGet(void (*callb)(uint16 a, int last, int current));
void FCEUI_CheatSearchGetRange(int first, int last, void (*callb)(uint16 a, int last, int current));
Like FCEUI_CheatSearchGet(), but you can specify the first and last
matches to get.
void FCEUI_CheatSearchShowExcluded(void);
Undos any exclusions of valid addresses done by FCEUI_CheatSearchEnd().
void FCEUI_CheatSearchSetCurrentAsOriginal(void);
Copies the current values in RAM into the cheat search buffer.
void FCEUI_MemDump(uint16 a, int32 len, void (*callb)(uint16 a, uint8 v));
Callback to dump memory.
void FCEUI_DumpMem(char *fname, uint32 start, uint32 end);
Dump memory to filename fname.
void FCEUI_MemPoke(uint16 a, uint8 v, int hl);
Write a byte to specified address. Set hl to 1 to attempt to store
it to ROM("high-level" write).
void FCEUI_NMI(void);
Triggers(queues) an NMI.
void FCEUI_IRQ(void);
Triggers(queues) an IRQ.
void FCEUI_Disassemble(uint16 a, int (*callb)(uint16 a, char *s));
Text disassembly.
void FCEUI_GetIVectors(uint16 *reset, uint16 *irq, uint16 *nmi);
Get current interrupt vectors.
***Recognized defined symbols:
The following defined symbols affect the way FCE Ultra is compiled:
C80x86
- Include 80x86 inline assembly in AT&T syntax, if available. Also
use special 80x86-specific C constructs if the compiler is compatible.
FRAMESKIP
- Include frame skipping code.
NETWORK
- Include network play code.
FPS
- Compile code that prints out a number when FCE Ultra exits
that represents the average fps.
ZLIB
- Compile support for compressed PKZIP-style files AND gzip compressed
files. "unzip.c" will need to be compiled and linked in by you if
this is defined(it's in the zlib subdirectory).
LSB_FIRST
- Compile code to expect that variables that are greater than 8 bits
in size are stored Least Significant Byte First in memory.
PSS_STYLE x
- Sets the path separator style to the integer 'x'. Valid styles are:
1: Only "/" - For UNIX platforms.
2: Both "/" and "\" - For Windows and MSDOS platforms.
3: Only "\" - For ???.
4: Only ":" - For Apple IIs ^_^.