Files
vbagx/source/ngc/vba.cpp
dborth 2d9b7ef1f9 [1.0.8 - April 4, 2009]
* "Match Wii Game" controls option! Games that have a Wii equivalent can be
  played using the controls for that Wii game. For example all Zelda games
  can be played with Twilight Princess controls. See the Instructions section
  below for important details.
* Rotation/Tilt sensor games all work
* Solar sensors (Boktai 1/2/3)
* Rumble (except for games that rely on Gameboy Player)
* Keyboard
* PAL support, finally!
* New scaling options, choose how much stretching you want
* Colourised games now partially work but still have distortion
* "Corvette" no longer has a screwed up palette (but still crashes)
* Triggers net reconnection on SMB failure
* Source code refactored, and project file added
* Instructions section added to this readme file
2009-04-10 03:16:28 +00:00

304 lines
6.4 KiB
C++

/****************************************************************************
* Visual Boy Advance GX
*
* Tantric September 2008
*
* vba.cpp
*
* This file controls overall program flow. Most things start and end here!
***************************************************************************/
#include <gccore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ogcsys.h>
#include <unistd.h>
#include <wiiuse/wpad.h>
#ifdef HW_RVL
extern "C" {
#include <di/di.h>
}
#endif
#include "gba/Sound.h"
#include "vba.h"
#include "vbasupport.h"
#include "preferences.h"
#include "audio.h"
#include "dvd.h"
#include "networkop.h"
#include "fileop.h"
#include "menu.h"
#include "menudraw.h"
#include "input.h"
#include "video.h"
#include "vbaconfig.h"
#include "wiiusbsupport.h"
extern bool ROMLoaded;
extern int emulating;
bool InMenu = true;
int ConfigRequested = 0;
int ShutdownRequested = 0;
int ResetRequested = 0;
char appPath[1024];
/****************************************************************************
* Shutdown / Reboot / Exit
***************************************************************************/
static void ExitCleanup()
{
#ifdef HW_RVL
ShutoffRumble();
StopWiiKeyboard();
#endif
LWP_SuspendThread (devicethread);
UnmountAllFAT();
CloseShare();
#ifdef HW_RVL
DI_Close();
#endif
}
#ifdef HW_DOL
#define PSOSDLOADID 0x7c6000a6
int *psoid = (int *) 0x80001800;
void (*PSOReload) () = (void (*)()) 0x80001800;
#endif
void Reboot()
{
ExitCleanup();
#ifdef HW_RVL
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
#else
#define SOFTRESET_ADR ((volatile u32*)0xCC003024)
*SOFTRESET_ADR = 0x00000000;
#endif
}
void ExitToLoader()
{
ExitCleanup();
// Exit to Loader
#ifdef HW_RVL
exit(0);
#else // gamecube
if (psoid[0] == PSOSDLOADID)
PSOReload();
#endif
}
#ifdef HW_RVL
void ShutdownCB()
{
ConfigRequested = 1;
ShutdownRequested = 1;
}
void ResetCB()
{
ResetRequested = 1;
}
void ShutdownWii()
{
ExitCleanup();
SYS_ResetSystem(SYS_POWEROFF, 0, 0);
}
#endif
#ifdef HW_DOL
/****************************************************************************
* ipl_set_config
* lowlevel Qoob Modchip disable
***************************************************************************/
static void ipl_set_config(unsigned char c)
{
volatile unsigned long* exi = (volatile unsigned long*)0xCC006800;
unsigned long val,addr;
addr=0xc0000000;
val = c << 24;
exi[0] = ((((exi[0]) & 0x405) | 256) | 48); //select IPL
//write addr of IPL
exi[0 * 5 + 4] = addr;
exi[0 * 5 + 3] = ((4 - 1) << 4) | (1 << 2) | 1;
while (exi[0 * 5 + 3] & 1);
//write the ipl we want to send
exi[0 * 5 + 4] = val;
exi[0 * 5 + 3] = ((4 - 1) << 4) | (1 << 2) | 1;
while (exi[0 * 5 + 3] & 1);
exi[0] &= 0x405; //deselect IPL
}
#endif
static void CreateAppPath(char origpath[])
{
#ifdef HW_DOL
snprintf(appPath, 1024, GCSettings.SaveFolder);
#else
char path[1024];
strcpy(path, origpath); // make a copy so we don't mess up original
char * loc;
int pos = -1;
loc = strrchr(path,'/');
if (loc != NULL)
*loc = 0; // strip file name
loc = strchr(path,'/'); // looking for / from fat:/
if (loc != NULL)
pos = loc - path + 1;
if(pos >= 0 && pos < 1024)
sprintf(appPath, &(path[pos]));
#endif
}
/****************************************************************************
* main
*
* Program entry
****************************************************************************/
int main(int argc, char *argv[])
{
#ifdef HW_DOL
ipl_set_config(6); // disable Qoob modchip
#endif
#ifdef HW_RVL
DI_Close();
DI_Init(); // first
#endif
InitDeviceThread();
VIDEO_Init();
PAD_Init();
#ifdef HW_RVL
WPAD_Init();
#endif
InitialiseVideo();
ResetVideo_Menu (); // change to menu video mode
#ifdef HW_RVL
// read wiimote accelerometer and IR data
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
WPAD_SetVRes(WPAD_CHAN_ALL,640,480);
// Wii Power/Reset buttons
WPAD_SetPowerButtonCallback((WPADShutdownCallback)ShutdownCB);
SYS_SetPowerCallback(ShutdownCB);
SYS_SetResetCallback(ResetCB);
#endif
// Initialise freetype font system
if (FT_Init ())
{
printf ("Cannot initialise font subsystem!\n");
while (1);
}
// Initialize libFAT for SD and USB
MountAllFAT();
// Initialize DVD subsystem (GameCube only)
#ifdef HW_DOL
DVD_Init ();
#endif
// Check if DVD drive belongs to a Wii
SetDVDDriveType();
InitialiseSound();
InitialisePalette();
// Set defaults
DefaultSettings ();
// store path app was loaded from
sprintf(appPath, "vbagx");
if(argc > 0 && argv[0] != NULL)
CreateAppPath(argv[0]);
StartWiiKeyboardMouse();
int selectedMenu = -1;
// Load preferences
if(!LoadPrefs())
{
WaitPrompt("Preferences reset - check settings!");
selectedMenu = 2; // change to preferences menu
}
while(1) // main loop
{
InMenu = true;
#ifdef HW_RVL
if(ShutdownRequested)
ShutdownWii();
#endif
// go back to checking if devices were inserted/removed
// since we're entering the menu
LWP_ResumeThread (devicethread);
MainMenu(selectedMenu);
selectedMenu = 3; // return to game menu from now on
// stop checking if devices were removed/inserted
// since we're starting emulation again
LWP_SuspendThread (devicethread);
ResetVideo_Emu();
InMenu = false;
while (emulating) // emulation loop
{
emulator.emuMain(emulator.emuCount);
if(ResetRequested)
{
emulator.emuReset(); // reset game
ResetRequested = 0;
}
if(ConfigRequested)
{
InMenu = true;
ShutoffRumble();
StopAudio();
ResetVideo_Menu (); // change to menu video mode
if (GCSettings.AutoSave == 1)
{
SaveBatteryOrState(GCSettings.SaveMethod, FILE_SRAM, SILENT); // save battery
}
else if (GCSettings.AutoSave == 2)
{
SaveBatteryOrState(GCSettings.SaveMethod, FILE_SNAPSHOT, SILENT); // save state
}
else if(GCSettings.AutoSave == 3)
{
SaveBatteryOrState(GCSettings.SaveMethod, FILE_SRAM, SILENT); // save battery
SaveBatteryOrState(GCSettings.SaveMethod, FILE_SNAPSHOT, SILENT); // save state
}
// save zoom level
SavePrefs(SILENT);
ConfigRequested = 0;
break;
}
}
}
}