fceugx/source/ngc/fceuload.cpp

162 lines
3.4 KiB
C++
Raw Normal View History

2008-09-02 03:57:21 +02:00
/****************************************************************************
* FCE Ultra 0.98.12
* Nintendo Wii/Gamecube Port
*
2009-03-28 18:23:08 +01:00
* Tantric 2008-2009
2008-09-02 03:57:21 +02:00
*
* fceload.c
*
* NES Memory Load Game
*
* This performs the functions of LoadGame and iNESLoad from a single module
* Helper function for GameCube injected ROMS
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
2009-02-07 01:57:39 +01:00
#include <malloc.h>
2008-09-02 03:57:21 +02:00
extern "C" {
2008-09-02 03:57:21 +02:00
#include "types.h"
#include "git.h"
#include "driver.h"
#include "palette.h"
#include "fceu.h"
#include "sound.h"
#include "file.h"
2008-09-02 03:57:21 +02:00
extern int FDSLoad(const char *name, FCEUFILE *fp);
extern int iNESLoad(const char *name, FCEUFILE *fp);
extern int UNIFLoad(const char *name, FCEUFILE *fp);
extern int NSFLoad(FCEUFILE *fp);
extern uint8 FDSBIOS[8192];
}
#include "fceugx.h"
#include "gcaudio.h"
2008-09-02 03:57:21 +02:00
#include "common.h"
#include "pad.h"
2009-03-28 18:23:08 +01:00
#include "menu.h"
#include "fileop.h"
2009-03-28 18:23:08 +01:00
#include "filebrowser.h"
2008-09-02 03:57:21 +02:00
bool romLoaded = false;
extern FCEUGI *FCEUGameInfo;
#define SAMPLERATE 48000
FCEUFILE *fceufp = NULL;
MEMWRAP *fceumem = NULL;
unsigned char * fceuFileData = NULL;
static void MakeFCEUFile(char * membuffer, int length)
2008-09-02 03:57:21 +02:00
{
if(fceufp != NULL)
{
free(fceuFileData);
free(fceumem);
free(fceufp);
fceuFileData = NULL;
fceumem = NULL;
fceufp = NULL;
}
2009-02-07 01:57:39 +01:00
fceufp =(FCEUFILE *)memalign(32,sizeof(FCEUFILE));
fceufp->type=3;
2009-02-07 01:57:39 +01:00
fceumem = (MEMWRAP *)memalign(32,sizeof(MEMWRAP));
fceumem->location=0;
fceumem->size=length;
2009-02-07 01:57:39 +01:00
fceuFileData = (unsigned char *)memalign(32,length);
memcpy(fceuFileData, membuffer, length);
fceumem->data=fceuFileData;
fceufp->fp = fceumem;
}
2008-10-02 07:28:01 +02:00
int GCMemROM(int method, int size)
{
2009-03-28 18:23:08 +01:00
ResetGameLoaded();
2008-09-02 03:57:21 +02:00
2009-03-28 18:23:08 +01:00
/*** Allocate and clear GameInfo ***/
2008-09-02 03:57:21 +02:00
2009-03-28 18:23:08 +01:00
FCEUGameInfo = (FCEUGI *) memalign(32, sizeof(FCEUGI));
memset(FCEUGameInfo, 0, sizeof(FCEUGI));
2008-09-02 03:57:21 +02:00
2009-03-28 18:23:08 +01:00
/*** Set some default values ***/
FCEUGameInfo->soundchan = 1;
FCEUGameInfo->soundrate = SAMPLERATE;
FCEUGameInfo->name = 0;
FCEUGameInfo->type = GIT_CART;
FCEUGameInfo->vidsys = GIV_USER;
FCEUGameInfo->input[0] = FCEUGameInfo->input[1] = -1;
FCEUGameInfo->inputfc = -1;
FCEUGameInfo->cspecial = 0;
2008-09-02 03:57:21 +02:00
2009-03-28 18:23:08 +01:00
/*** Set internal sound information ***/
FCEUI_Sound(SAMPLERATE);
FCEUI_SetSoundVolume(100); // 0-100
FCEUI_SetLowPass(0);
2008-09-02 03:57:21 +02:00
2009-03-28 18:23:08 +01:00
MakeFCEUFile((char *) nesrom, size);
2009-03-28 18:23:08 +01:00
nesGameType = 0;
2009-03-28 18:23:08 +01:00
if (iNESLoad(NULL, fceufp))
nesGameType = 1;
2009-03-28 18:23:08 +01:00
else if (UNIFLoad(NULL, fceufp))
nesGameType = 2;
2009-03-28 18:23:08 +01:00
else if (NSFLoad(fceufp))
nesGameType = 3;
else
{
// read FDS BIOS into FDSBIOS - should be 8192 bytes
2009-03-28 18:23:08 +01:00
if (FDSBIOS[1] == 0)
{
int biosSize = 0;
2009-03-28 18:23:08 +01:00
char * tmpbuffer = (char *) memalign(32, 64 * 1024);
char filepath[1024];
2009-03-28 18:23:08 +01:00
if (MakeFilePath(filepath, FILE_FDSBIOS, method))
{
2009-03-28 18:23:08 +01:00
biosSize = LoadFile(tmpbuffer, filepath, 0, method, SILENT);
}
2009-03-28 18:23:08 +01:00
if (biosSize == 8192)
{
memcpy(FDSBIOS, tmpbuffer, 8192);
}
else
{
2009-03-28 18:23:08 +01:00
if (biosSize > 0)
ErrorPrompt("FDS BIOS file is invalid!");
2008-10-03 07:24:51 +02:00
return 0; // BIOS not loaded, do not load game
}
free(tmpbuffer);
}
// load game
2009-03-28 18:23:08 +01:00
if (FDSLoad(NULL, fceufp))
nesGameType = 4;
}
2009-03-28 18:23:08 +01:00
if (nesGameType > 0)
{
FCEU_ResetVidSys();
PowerNES();
FCEU_ResetPalette();
FCEU_ResetMessages(); // Save state, status messages, etc.
SetSoundVariables();
ResetAudio();
romLoaded = true;
return 1;
}
else
{
ErrorPrompt("Invalid game file!");
romLoaded = false;
return 0;
}
2008-09-02 03:57:21 +02:00
}