Genesis-Plus-GX/source/gx/main.c

324 lines
7.3 KiB
C
Raw Normal View History

2008-08-07 14:26:07 +02:00
/****************************************************************************
* main.c
2008-08-07 14:26:07 +02:00
*
2008-12-11 18:38:29 +01:00
* Genesis Plus GX main
*
* code by Softdev (2006), Eke-Eke (2007,2008)
2008-08-07 14:26:07 +02:00
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2008-12-11 18:38:29 +01:00
*
2008-08-07 14:26:07 +02:00
***************************************************************************/
2008-12-11 18:38:29 +01:00
2008-08-07 14:26:07 +02:00
#include "shared.h"
#include "font.h"
#include "menu.h"
2008-08-07 14:26:07 +02:00
#include "history.h"
#include "aram.h"
2008-08-19 19:15:08 +02:00
#include "dvd.h"
2008-08-07 14:26:07 +02:00
2008-12-10 19:16:30 +01:00
#include <fat.h>
#ifdef HW_RVL
#include <wiiuse/wpad.h>
#include <di/di.h>
#endif
#ifdef HW_RVL
/* Power Button callback */
u8 Shutdown = 0;
static void Power_Off(void)
{
Shutdown = 1;
ConfigRequested = 1;
}
#endif
u8 *Bg_music_ogg = NULL;
u32 Bg_music_ogg_size = 0;;
2008-08-07 14:26:07 +02:00
/***************************************************************************
2008-12-12 16:38:04 +01:00
* Genesis Plus Virtual Machine
2008-08-07 14:26:07 +02:00
*
***************************************************************************/
static void load_bios(void)
2008-08-07 14:26:07 +02:00
{
2008-12-10 19:16:30 +01:00
char pathname[MAXPATHLEN];
2008-08-07 14:26:07 +02:00
/* reset BIOS found flag */
config.bios_enabled &= ~2;
2008-12-12 16:38:04 +01:00
/* open BIOS file */
2008-12-11 18:38:29 +01:00
sprintf (pathname, "%s/BIOS.bin",DEFAULT_PATH);
2008-12-10 19:16:30 +01:00
FILE *fp = fopen(pathname, "rb");
2008-08-07 14:26:07 +02:00
if (fp == NULL) return;
/* read file */
fread(bios_rom, 1, 0x800, fp);
fclose(fp);
/* update BIOS flags */
config.bios_enabled |= 2;
2008-08-19 19:15:08 +02:00
if (config.bios_enabled == 3)
{
/* initialize system */
system_init ();
audio_init(48000);
}
2008-08-07 14:26:07 +02:00
}
static void init_machine(void)
2008-08-07 14:26:07 +02:00
{
/* Allocate cart_rom here ( 10 MBytes ) */
cart_rom = memalign(32, MAXROMSIZE);
if (!cart_rom)
{
WaitPrompt("Failed to allocate ROM buffer... Rebooting");
free(texturemem);
FONT_Shutdown();
#ifdef HW_RVL
DI_Close();
#endif
#ifdef HW_RVL
SYS_ResetSystem(SYS_RESTART,0,0);
#else
SYS_ResetSystem(SYS_HOTRESET,0,0);
#endif
}
2008-08-07 14:26:07 +02:00
2008-12-12 16:38:04 +01:00
/* BIOS support */
load_bios();
2008-08-07 14:26:07 +02:00
/* allocate global work bitmap */
memset (&bitmap, 0, sizeof (bitmap));
2008-12-12 16:38:04 +01:00
bitmap.width = 720;
2008-08-07 14:26:07 +02:00
bitmap.height = 576;
bitmap.depth = 16;
bitmap.granularity = 2;
bitmap.pitch = bitmap.width * bitmap.granularity;
bitmap.viewport.w = 256;
bitmap.viewport.h = 224;
bitmap.viewport.x = 0;
bitmap.viewport.y = 0;
2008-12-04 20:32:22 +01:00
bitmap.data = texturemem;
2008-08-07 14:26:07 +02:00
/* default system */
input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_GAMEPAD;
}
/**************************************************
Load a new rom and performs some initialization
***************************************************/
void reloadrom (int size, char *name)
2008-08-07 14:26:07 +02:00
{
genromsize = size;
load_rom(name); /* Load ROM */
2008-12-17 18:18:07 +01:00
system_init (); /* Initialize System */
audio_init(48000); /* Audio System initialization */
ClearGGCodes (); /* Clear Game Genie patches */
system_reset (); /* System Power ON */
2008-08-07 14:26:07 +02:00
}
/**************************************************
Shutdown everything properly
***************************************************/
void shutdown(void)
{
/* system shutdown */
memfile_autosave(-1,config.state_auto);
system_shutdown();
audio_shutdown();
free(cart_rom);
free(texturemem);
if (Bg_music_ogg) free(Bg_music_ogg);
FONT_Shutdown();
VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK);
VIDEO_Flush();
VIDEO_WaitVSync();
#ifdef HW_RVL
DI_Close();
#endif
}
2008-08-07 14:26:07 +02:00
/***************************************************************************
* M A I N
*
***************************************************************************/
u8 fat_enabled = 0;
u32 frameticker = 0;
2008-08-07 14:26:07 +02:00
int main (int argc, char *argv[])
{
2008-08-19 19:15:08 +02:00
#ifdef HW_RVL
/* initialize DVD Mode */
DI_Close();
2008-08-19 19:15:08 +02:00
DI_Init();
#endif
uint32 RenderedFrames = 0;
uint32 TotalFrames = 0;
uint32 FramesPerSecond = 0;
/* initialize harwdare */
gx_video_init();
gx_input_init();
gx_audio_init();
/* initialize font */
if (!FONT_Init())
{
WaitPrompt("Failed to allocate ROM buffer... Rebooting");
free(texturemem);
#ifdef HW_RVL
DI_Close();
#endif
#ifdef HW_RVL
SYS_ResetSystem(SYS_RESTART,0,0);
#else
SYS_ResetSystem(SYS_HOTRESET,0,0);
#endif
}
2008-08-07 14:26:07 +02:00
#ifdef HW_DOL
/* initialize GC DVD interface */
2008-08-07 14:26:07 +02:00
DVD_Init ();
dvd_drive_detect();
#endif
#ifdef HW_RVL
/* Power button callback */
SYS_SetPowerCallback(Power_Off);
#endif
/* initialize FAT Interface */
if (fatInitDefault())
2008-10-26 19:32:32 +01:00
{
2008-12-10 19:16:30 +01:00
fat_enabled = 1;
#ifdef HW_RVL
fatEnableReadAhead ("sd", 6, 64);
fatEnableReadAhead ("usb", 6, 64);
#else
fatEnableReadAhead ("carda", 6, 64);
fatEnableReadAhead ("cardb", 6, 64);
#endif
2008-10-26 19:32:32 +01:00
}
/* background music */
char fname[MAXPATHLEN];
sprintf(fname,"%s/Bg_music.ogg",DEFAULT_PATH);
FILE *f = fopen(fname,"rb");
if (f)
{
struct stat filestat;
stat(fname, &filestat);
Bg_music_ogg_size = filestat.st_size;
Bg_music_ogg = memalign(32,Bg_music_ogg_size);
if (Bg_music_ogg) fread(Bg_music_ogg,1,Bg_music_ogg_size,f);
fclose(f);
}
/* default config */
legal();
config_setDefault();
2008-08-07 14:26:07 +02:00
config_load();
/* restore recent files list */
history_setDefault();
2008-08-07 14:26:07 +02:00
history_load();
/* initialize Virtual Machine */
2008-08-07 14:26:07 +02:00
init_machine ();
2009-01-09 18:11:42 +01:00
/* run any injected rom */
2008-08-07 14:26:07 +02:00
if (genromsize)
{
ARAMFetch((char *)cart_rom, (void *)0x8000, genromsize);
reloadrom (genromsize,"INJECT.bin");
gx_video_start();
gx_audio_start();
frameticker = 1;
}
else
{
/* show menu first */
ConfigRequested = 1;
2008-08-07 14:26:07 +02:00
}
2009-01-09 18:11:42 +01:00
/* main emulation loop */
2008-08-07 14:26:07 +02:00
while (1)
{
/* check for menu request */
if (ConfigRequested)
{
/* stop audio & video */
gx_video_stop();
gx_audio_stop();
/* go to menu */
MainMenu ();
ConfigRequested = 0;
/* reset framecounts */
RenderedFrames = 0;
TotalFrames = 0;
FramesPerSecond = vdp_rate;
/* start audio & video */
gx_video_start();
gx_audio_start();
/* reset framesync */
frameticker = 1;
}
2009-01-13 18:00:37 +01:00
if (frameticker > 1)
{
/* skip frame */
frameticker-=2;
2009-01-13 18:00:37 +01:00
system_frame (1);
/* update audio only */
gx_audio_update();
2009-01-13 18:00:37 +01:00
}
else
{
/* framesync */
while (frameticker < 1) usleep(1);
frameticker--;
2009-01-13 18:00:37 +01:00
/* render frame */
2009-01-13 18:00:37 +01:00
system_frame (0);
/* update video & audio */
gx_video_update();
gx_audio_update();
RenderedFrames++;
2009-01-13 18:00:37 +01:00
}
/* update framecounts */
TotalFrames++;
if (TotalFrames == vdp_rate)
{
FramesPerSecond = RenderedFrames;
RenderedFrames = 0;
TotalFrames = 0;
}
2008-08-07 14:26:07 +02:00
}
2008-08-07 14:26:07 +02:00
return 0;
}