cscope.out
tags
*.swp
+drivers/common/revision.h
all: fceu
-gpfce.gpe: fceu
- cp fceu $@
-
include zlib/Makefile
-OBJDRIVER = drivers/gp2x_test/minimal.o drivers/gp2x_test/throttle.o \
- ${G}gp2x.o ${G}main.o ${G}gp2x-sound.o ${G}gp2x-video.o \
- ${G}usbjoy.o ${G}menu.o \
- ${L}fonts.o ${L}readpng.o ${L}linux/plat.o \
+OBJDRIVER = drivers/sdl/sdl.o drivers/sdl/minimal.o drivers/sdl/throttle.o \
+ ${G}gp2x-sound.o ${G}gp2x-video.o ${G}usbjoy.o \
+ ${L}fonts.o ${L}readpng.o ${L}input.o ${L}in_sdl.o ${L}linux/plat.o \
+ ${C}main.o ${C}menu.o \
${C}cheat.o ${C}config.o ${C}args.o ${C}vidblit.o ${C}unix-netplay.o \
${UNZIPOBJS} \
ppu.o movie.o fceu098.o ppu098.o
-LDRIVER += -lm -lz -lpng `sdl-config --libs`
+LDRIVER += -lm -lz -lpng `sdl-config --libs`
OBJDRIVER += x6502.o
include Makefile.base
+${C}menu.o: ${C}revision.h
${B}main.o: ${B}main.c ${B}main.h ${B}usage.h ${B}input.c
${B}gp2x.o: ${B}gp2x.c ${B}gp2x.h ${B}rev.h
${B}throttle.o: ${B}throttle.c ${B}main.h ${B}throttle.h
ppu.o: ppu.c ppu.h
-${B}rev.h: FORCE
- @if [ -f $@ ]; then prevrev=`cat $@`; else prevrev="00"; fi; \
- if [ "`which svn`" != "" ]; then \
- rev=`svn update|tail -n 1|sed 's/.*\ \(.*\)\./\1/g'|sed "s/'//g"`; \
- fi; \
- if [ "$$rev" = "" ]; then rev="0"; fi; \
- if [ "$$rev" != "$$prevrev" ]; then \
- echo "$$rev" > $@; \
- fi
-
+${C}revision.h: FORCE
+ @(git describe || echo) | sed -e 's/.*/#define REV "\0"/' > $@_
+ @diff -q $@_ $@ > /dev/null 2>&1 || cp $@_ $@
+ @rm $@_
.PHONY: FORCE
include Makefile.common
int InitSound(void);
void WriteSound(int16 *Buffer, int Count);
+void StartSound(void);
void KillSound(void);
void SilenceSound(int s);
#include "../../input.h"
#include "../../svga.h"
#include "../../video.h"
-#include "usbjoy.h"
+#include "../libpicofe/input.h"
+#include "input.h"
/* UsrInputType[] is user-specified. InputType[] is current
(game loading can override user settings)
prev_snd_on = !!soundvolume;
}
+ platform_set_volume(soundvolume);
+
// draw on screen :D
- gp2x_sound_volume(soundvolume, soundvolume);
int meterval=soundvolume/5;
for (soundvolIndex = 0; soundvolIndex < 20; soundvolIndex++)
{
acts &= acts ^ prev_emu_acts;
prev_emu_acts = actsc;
- if (acts & (3 << 30))
+ if (acts & (EACT_SAVE_STATE | EACT_LOAD_STATE))
{
- unsigned long keys;
int do_it = 1;
- if (acts & (1 << 30))
+ int need_confirm = 0;
+ const char *nm;
+ char tmp[64];
+ int keys, len;
+
+ if (acts & EACT_LOAD_STATE)
{
if (Settings.sstate_confirm & 2)
{
- FCEU_DispMessage("LOAD STATE? (Y=yes, X=no)");
- FCEU_PutImage();
- FCEUD_Update(XBuf+8,NULL,0);
- while( !((keys = gp2x_joystick_read(1)) & (GP2X_X|GP2X_Y)) ) usleep(50*1024);
- if (keys & GP2X_X) do_it = 0;
- FCEU_CancelDispMessage();
+ need_confirm = 1;
}
- if (do_it) FCEUI_LoadState();
}
else
{
if (Settings.sstate_confirm & 1)
{
char *fname = FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0);
- FILE *st=fopen(fname,"rb");
+ FILE *st = fopen(fname, "rb");
free(fname);
if (st)
{
fclose(st);
- FCEU_DispMessage("OVERWRITE SAVE? (Y=yes, X=no)");
- FCEU_PutImage();
- FCEUD_Update(XBuf+8,NULL,0);
- while( !((keys = gp2x_joystick_read(1)) & (GP2X_X|GP2X_Y)) ) usleep(50*1024);
- if (keys & GP2X_X) do_it = 0;
- FCEU_CancelDispMessage();
+ need_confirm = 1;
}
}
- if (do_it) FCEUI_SaveState();
}
+
+ if (need_confirm) {
+ strcpy(tmp, (acts & EACT_LOAD_STATE) ?
+ "LOAD STATE?" : "OVERWRITE SAVE?");
+ len = strlen(tmp);
+ nm = in_get_key_name(-1, -PBTN_MA3);
+ snprintf(tmp + len, sizeof(tmp) - len, "(%s=yes, ", nm);
+ len = strlen(tmp);
+ nm = in_get_key_name(-1, -PBTN_MBACK);
+ snprintf(tmp + len, sizeof(tmp) - len, "%s=no)", nm);
+
+ FCEU_DispMessage(tmp);
+ FCEU_PutImage();
+ FCEUD_Update(XBuf+8, NULL, 0);
+
+ in_set_config_int(0, IN_CFG_BLOCKING, 1);
+ while (in_menu_wait_any(NULL, 50) & (PBTN_MA3|PBTN_MBACK))
+ ;
+ while ( !((keys = in_menu_wait_any(NULL, 50)) & (PBTN_MA3|PBTN_MBACK)) )
+ ;
+ if (keys & PBTN_MBACK)
+ do_it = 0;
+ while (in_menu_wait_any(NULL, 50) & (PBTN_MA3|PBTN_MBACK))
+ ;
+ in_set_config_int(0, IN_CFG_BLOCKING, 0);
+
+ FCEU_CancelDispMessage();
+ }
+ if (do_it) {
+ if (acts & EACT_LOAD_STATE)
+ FCEUI_LoadState();
+ else
+ FCEUI_SaveState();
+ }
+
RefreshThrottleFPS();
}
- else if (acts & (3 << 28)) // state slot next/prev
+ else if (acts & (EACT_NEXT_SLOT|EACT_PREV_SLOT))
{
FILE *st;
char *fname;
- CurrentState += (acts & (1 << 29)) ? 1 : -1;
+ CurrentState += (acts & EACT_NEXT_SLOT) ? 1 : -1;
if (CurrentState > 9) CurrentState = 0;
if (CurrentState < 0) CurrentState = 9;
FCEU_DispMessage("[%s] State Slot %i", st ? "USED" : "FREE", CurrentState);
if (st) fclose(st);
}
- else if (acts & (1 << 27)) // FDS insert/eject
+ else if (acts & EACT_FDS_INSERT)
{
if(FCEUGameInfo.type == GIT_FDS)
FCEU_DoSimpleCommand(FCEUNPCMD_FDSINSERT);
}
- else if (acts & (1 << 26)) // FDS select
+ else if (acts & EACT_FDS_SELECT)
{
if(FCEUGameInfo.type == GIT_FDS)
FCEU_DoSimpleCommand(FCEUNPCMD_FDSSELECT);
}
- else if (acts & (1 << 25)) // VS Unisystem insert coin
+ else if (acts & EACT_INSERT_COIN)
{
if(FCEUGameInfo.type == GIT_VSUNI)
FCEU_DoSimpleCommand(FCEUNPCMD_VSUNICOIN);
}
-#define down(b) (keys & GP2X_##b)
-static void do_fake_mouse(unsigned long keys)
+static void do_fake_mouse(uint32 acts)
{
static int x=256/2, y=240/2;
int speed = 3;
- if (down(A)) speed = 1;
- if (down(Y)) speed = 5;
+ if (acts & NKEY_B_TURBO) speed = 1;
+ if (acts & NKEY_A_TURBO) speed = 5;
- if (down(LEFT))
+ if (acts & NKEY_LEFT)
{
x -= speed;
if (x < 0) x = 0;
}
- else if (down(RIGHT))
+ else if (acts & NKEY_RIGHT)
{
x += speed;
if (x > 255) x = 255;
}
- if (down(UP))
+ if (acts & NKEY_UP)
{
y -= speed;
if (y < 0) y = 0;
}
- else if (down(DOWN))
+ else if (acts & NKEY_DOWN)
{
y += speed;
if (y > 239) y = 239;
MouseData[0] = x;
MouseData[1] = y;
MouseData[2] = 0;
- if (down(B)) MouseData[2] |= 1;
- if (down(X)) MouseData[2] |= 2;
+ if (acts & NKEY_A) MouseData[2] |= 1;
+ if (acts & NKEY_B) MouseData[2] |= 2;
}
{
static int volpushed_frames = 0;
static int turbo_rate_cnt_a[2] = {0,0}, turbo_rate_cnt_b[2] = {0,0};
- unsigned long keys = gp2x_joystick_read(0);
- uint32 all_acts[2] = {0,0};
- int i;
+ uint32 all_acts[2], emu_acts;
+ int actions[IN_BINDTYPE_COUNT] = { 0, };
- if ((down(VOL_DOWN) && down(VOL_UP)) || (keys & (GP2X_L|GP2X_START)) == (GP2X_L|GP2X_START))
+ in_update(actions);
+ all_acts[0] = actions[IN_BINDTYPE_PLAYER12];
+ all_acts[1] = actions[IN_BINDTYPE_PLAYER12] >> 16;
+ emu_acts = actions[IN_BINDTYPE_EMU];
+
+ if (emu_acts & EACT_ENTER_MENU)
{
Exit = 1;
return;
}
- else if (down(VOL_UP))
+ else if (emu_acts & EACT_VOLUME_UP)
{
/* wait for at least 10 updates, because user may be just trying to enter menu */
if (volpushed_frames++ > 10 && (volpushed_frames&1)) {
setsoundvol(soundvol);
}
}
- else if (down(VOL_DOWN))
+ else if (emu_acts & EACT_VOLUME_DOWN)
{
if (volpushed_frames++ > 10 && (volpushed_frames&1)) {
soundvol-=1;
if (InputType[1] != SI_GAMEPAD)
{
/* try to feed fake mouse there */
- do_fake_mouse(keys);
- }
-
- for (i = 0; i < 32; i++)
- {
- if (keys & (1 << i))
- {
- uint32 acts, u = 32;
- acts = Settings.KeyBinds[i];
- if (!acts) continue;
- if ((1 << i) & combo_keys)
- {
- // combo key detected, try to find if other is pressed
- for (u = i+1; u < 32; u++)
- {
- if ((keys & (1 << u)) && (Settings.KeyBinds[u] & acts))
- {
- keys &= ~(1 << u);
- acts &= Settings.KeyBinds[u];
- break;
- }
- }
- }
- if (u != 32) acts &= combo_acts; // other combo key pressed
- else acts &= ~combo_acts;
- all_acts[(acts>>16)&1] |= acts;
- }
- }
-
- // add joy inputs
- if (num_of_joys > 0)
- {
- int joy;
- gp2x_usbjoy_update();
- for (joy = 0; joy < num_of_joys; joy++) {
- int keys = gp2x_usbjoy_check2(joy);
- for (i = 0; i < 32; i++) {
- if (keys & (1 << i)) {
- int acts = Settings.JoyBinds[joy][i];
- all_acts[(acts>>16)&1] |= acts;
- }
- }
- }
+ do_fake_mouse(all_acts[0]);
}
// player 1
JSreturn |= all_acts[0] & 0xff;
- if (all_acts[0] & 0x100) { // A turbo
+ if (all_acts[0] & NKEY_A_TURBO) {
turbo_rate_cnt_a[0] += Settings.turbo_rate_add;
JSreturn |= (turbo_rate_cnt_a[0] >> 24) & 1;
}
- if (all_acts[0] & 0x200) { // B turbo
+ if (all_acts[0] & NKEY_B_TURBO) {
turbo_rate_cnt_b[0] += Settings.turbo_rate_add;
JSreturn |= (turbo_rate_cnt_b[0] >> 23) & 2;
}
// player 2
JSreturn |= (all_acts[1] & 0xff) << 16;
- if (all_acts[1] & 0x100) { // A turbo
+ if (all_acts[1] & NKEY_A_TURBO) {
turbo_rate_cnt_a[1] += Settings.turbo_rate_add;
JSreturn |= (turbo_rate_cnt_a[1] >> 8) & 0x10000;
}
- if (all_acts[1] & 0x200) { // B turbo
+ if (all_acts[1] & NKEY_B_TURBO) {
turbo_rate_cnt_b[1] += Settings.turbo_rate_add;
JSreturn |= (turbo_rate_cnt_b[1] >> 7) & 0x20000;
}
- do_emu_acts(all_acts[0]|all_acts[1]);
+ do_emu_acts(emu_acts);
}
--- /dev/null
+enum nkeys_bits {
+ NKEYB_A = 0,
+ NKEYB_B,
+ NKEYB_SELECT,
+ NKEYB_START,
+ NKEYB_UP,
+ NKEYB_DOWN,
+ NKEYB_LEFT,
+ NKEYB_RIGHT,
+ NKEYB_A_TURBO,
+ NKEYB_B_TURBO,
+};
+
+enum nkeys {
+ NKEY_A = 1 << NKEYB_A,
+ NKEY_B = 1 << NKEYB_B,
+ NKEY_SELECT = 1 << NKEYB_SELECT,
+ NKEY_START = 1 << NKEYB_START,
+ NKEY_UP = 1 << NKEYB_UP,
+ NKEY_DOWN = 1 << NKEYB_DOWN,
+ NKEY_LEFT = 1 << NKEYB_LEFT,
+ NKEY_RIGHT = 1 << NKEYB_RIGHT,
+ NKEY_A_TURBO = 1 << NKEYB_A_TURBO,
+ NKEY_B_TURBO = 1 << NKEYB_B_TURBO,
+};
+
+enum emu_actions_bits {
+ EACTB_SAVE_STATE = 31,
+ EACTB_LOAD_STATE = 30,
+ EACTB_NEXT_SLOT = 29,
+ EACTB_PREV_SLOT = 28,
+ EACTB_FDS_INSERT = 27,
+ EACTB_FDS_SELECT = 26,
+ EACTB_INSERT_COIN = 25,
+ EACTB_ENTER_MENU = 24,
+ EACTB_VOLUME_UP = 23,
+ EACTB_VOLUME_DOWN = 22,
+};
+
+enum emu_actions {
+ EACT_SAVE_STATE = 1 << EACTB_SAVE_STATE,
+ EACT_LOAD_STATE = 1 << EACTB_LOAD_STATE,
+ EACT_NEXT_SLOT = 1 << EACTB_NEXT_SLOT,
+ EACT_PREV_SLOT = 1 << EACTB_PREV_SLOT,
+ EACT_FDS_INSERT = 1 << EACTB_FDS_INSERT,
+ EACT_FDS_SELECT = 1 << EACTB_FDS_SELECT,
+ EACT_INSERT_COIN = 1 << EACTB_INSERT_COIN,
+ EACT_ENTER_MENU = 1 << EACTB_ENTER_MENU,
+ EACT_VOLUME_UP = 1 << EACTB_VOLUME_UP,
+ EACT_VOLUME_DOWN = 1 << EACTB_VOLUME_DOWN,
+};
+
#include <stdio.h>
#include <stdlib.h>
-#include "../common/main.h"
-#include "minimal.h"
+#include "main.h"
#include "throttle.h"
+#include "config.h"
+#include "args.h"
+#include "unixdsp.h"
+#include "cheat.h"
+#include "dface.h"
+#include "platform.h"
#include "menu.h"
-#include "gp2x.h"
-
-#include "../common/config.h"
-#include "../common/args.h"
-#include "../common/unixdsp.h"
-#include "../common/cheat.h"
+#include "settings.h"
#include "../../fce.h"
#include "../../cart.h"
-#include "dface.h"
+// these are now here to try to make compatible configs
+// between different versions of the emu
+DSETTINGS Settings;
+CFGSTRUCT DriverConfig[]={
+ AC(Settings.turbo_rate_add),
+ AC(Settings.sound_rate),
+ AC(Settings.showfps),
+ AC(Settings.scaling),
+ AC(Settings.frameskip),
+ AC(Settings.sstate_confirm),
+ AC(Settings.region_force),
+ AC(Settings.cpuclock),
+ AC(Settings.mmuhack),
+ AC(Settings.ramtimings),
+ AC(Settings.gamma),
+ AC(Settings.perfect_vsync),
+ AC(Settings.accurate_mode),
+ ENDCFGSTRUCT
+};
void CleanSurface(void);
// internals
-extern char lastLoadedGameName[2048];
extern uint8 Exit; // exit emu loop flag
extern int FSkip;
void CloseGame(void);
static char *inputa[2]={0,0};
static char *fcexp=0;
static int docheckie[4];
+#ifdef NETWORK
+ static int docheckie2[2]={0,0};
+#endif
static ARGPSTRUCT FCEUArgs[]={
{"-soundvol",0,&soundvol,0},
{"-noautowrite",0,&eoptions,0x8000|EO_NOAUTOWRITE},
{"-slstart",0,&srendlinev[0],0},{"-slend",0,&erendlinev[0],0},
{"-slstartp",0,&srendlinev[1],0},{"-slendp",0,&erendlinev[1],0},
- {0,(void *)DriverArgs,0,0},
- {0,0,0,0}
+ {"-sound",0,&Settings.sound_rate,0},
+ {"-showfps",0,&Settings.showfps,0},
+ #ifdef NETWORK
+ {"-connect",&docheckie2[0],&netplayhost,0x4001},
+ {"-server",&docheckie2[1],0,0},
+ {"-netport",0,&Port,0},
+ #endif
+ {0,(void *)DriverArgs,0,0},
+ {0,0,0,0}
};
memset(docheckie,0,sizeof(docheckie));
FCEUI_SetRenderedLines(srendlinev[0],erendlinev[0],srendlinev[1],erendlinev[1]);
FCEUI_SetSoundVolume(80);
+ #ifdef NETWORK
+ if(docheckie2[0])
+ netplay=2;
+ else if(docheckie2[1])
+ netplay=1;
+
+ if(netplay)
+ FCEUI_SetNetworkPlay(netplay);
+ #endif
DoDriverArgs();
if(fcexp)
#include "usage.h"
-int CLImain(int argc, char *argv[])
+int main(int argc, char *argv[])
{
int last_arg_parsed, ret;
/* TODO if(argc<=1)
return 1;
}*/
+ platform_init();
if(!DriverInitialize())
{
return 1;
GetBaseDirectory(BaseDirectory);
FCEUI_SetBaseDirectory(BaseDirectory);
lastLoadedGameName[0] = 0;
+ menu_init();
+ in_init();
CreateDirs();
LoadConfig(NULL);
last_arg_parsed=DoArgs(argc-1,&argv[1]);
- gp2x_opt_setup();
+ platform_late_init();
+ in_probe();
+
LoadLLGN();
FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue);
if(cpalette)
else
{
switch(LoadGameLastError) {
- default: strcpy(menuErrorMsg, "failed to load ROM"); break;
- case 2: strcpy(menuErrorMsg, "Can't find a ROM for ips/movie"); break;
- case 10: strcpy(menuErrorMsg, "FDS BIOS ROM is missing, read docs"); break;
- case 11: strcpy(menuErrorMsg, "Error reading auxillary FDS file"); break;
+ default: menu_update_msg("failed to load ROM"); break;
+ case 2: menu_update_msg("Can't find a ROM for ips/movie"); break;
+ case 10: menu_update_msg("FDS BIOS ROM is missing, read docs"); break;
+ case 11: menu_update_msg("Error reading auxillary FDS file"); break;
}
}
}
if(Exit || !fceugi)
{
int ret;
- ret = gp2x_menu_do();
+ ret = menu_loop();
if (ret == 1) break; // exit emu
if (ret == 2) { // reload ROM
Exit = 0;
}
}
- gp2x_opt_update();
PrepareOtherInput();
FCEUI_GetCurrentVidSystem(&srendline,&erendline);
- gp2x_video_changemode(Settings.scaling == 3 ? 15 : 8);
- switch (Settings.scaling & 3) {
- case 0: gp2x_video_set_offs(0); gp2x_video_RGB_setscaling(320, 240); break;
- case 1: gp2x_video_set_offs(32); gp2x_video_RGB_setscaling(256, 240); break;
- case 2: gp2x_video_set_offs(32+srendline*320); gp2x_video_RGB_setscaling(256, erendline-srendline); break;
- case 3: gp2x_video_set_offs(32); gp2x_video_RGB_setscaling(320, 240); break;
- }
+ platform_apply_config();
CleanSurface();
- gp2x_start_sound(Settings.sound_rate, 16, 0);
+ StartSound();
RefreshThrottleFPS();
FCEUI_Emulate();
}
SaveLLGN();
FCEUI_Kill();
DriverKill();
- return 0;
+ platform_finish();
+ return 0;
}
static int DriverInitialize(void)
if (Exit) FSkip=0;
}
+
#define EO_NOAUTOWRITE 256
extern int srendline,erendline,srendlinev[2],erendlinev[2];
extern int NoWaiting;
+extern int soundvol;
extern FCEUGI *fceugi;
--- /dev/null
+/*
+ * (C) Gražvydas "notaz" Ignotas, 2010-2011
+ *
+ * This work is licensed under the terms of any of these licenses
+ * (at your option):
+ * - GNU GPL, version 2 or later.
+ * - GNU LGPL, version 2.1 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include "main.h"
+#include "menu.h"
+#include "input.h"
+#include "settings.h"
+#include "config.h"
+#include "args.h"
+#include "dface.h"
+#include "../libpicofe/plat.h"
+#include "../libpicofe/input.h"
+#include "../../state.h"
+#include "../../general.h"
+#include "../../input.h"
+#include "../../palette.h"
+#include "revision.h"
+
+#define array_size(x) (sizeof(x) / sizeof(x[0]))
+
+#define state_slot CurrentState
+extern uint8 Exit;
+
+typedef enum
+{
+ MA_NONE = 1,
+ MA_CTRL_PLAYER1,
+ MA_CTRL_PLAYER2,
+ MA_CTRL_EMU,
+ MA_CTRL_DEADZONE,
+ MA_OPT_SAVECFG,
+ MA_OPT_SAVECFG_GAME,
+ MA_CTRL_DEV_FIRST,
+ MA_CTRL_DEV_NEXT,
+ MA_OPT_NTSC_COLOR,
+ MA_OPT_NTSC_TINT,
+ MA_OPT_NTSC_HUE,
+ MA_OPT_SREND_N,
+ MA_OPT_EREND_N,
+ MA_OPT_SREND_P,
+ MA_OPT_EREND_P,
+ MA_OPT_CLIP,
+ MA_OPT_NO8LIM,
+ MA_OPT_GG,
+ MA_OPT_SHOWFPS,
+ MA_OPT_FSKIP,
+ MA_OPT_RENDERER,
+ MA_OPT_SOUNDON,
+ MA_OPT_SOUNDRATE,
+ MA_OPT_REGION,
+ MA_OPT_TURBO,
+ MA_OPT_SSTATE,
+ MA_OPT_SSLOT,
+ MA_OPT_GAMMA,
+ MA_MAIN_RESUME_GAME,
+ MA_MAIN_SAVE_STATE,
+ MA_MAIN_LOAD_STATE,
+ MA_MAIN_RESET_GAME,
+ MA_MAIN_LOAD_ROM,
+ MA_MAIN_CHEATS,
+ MA_MAIN_CREDITS,
+ MA_MAIN_EXIT,
+} menu_id;
+
+void emu_make_path(char *buff, const char *end, int size)
+{
+ int pos, end_len;
+
+ end_len = strlen(end);
+ pos = plat_get_root_dir(buff, size);
+ strncpy(buff + pos, end, size - pos);
+ buff[size - 1] = 0;
+ if (pos + end_len > size - 1)
+ printf("Warning: path truncated: %s\n", buff);
+}
+
+static int emu_check_save_file(int slot, int *time)
+{
+ struct stat status;
+ char *fname;
+ FILE *st;
+ int retval = 0;
+ int ret;
+
+ fname = FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0);
+ st = fopen(fname,"rb");
+ if (st == NULL)
+ goto out;
+ fclose(st);
+
+ retval = 1;
+ if (time == NULL)
+ goto out;
+
+ ret = stat(fname, &status);
+ if (ret != 0)
+ goto out;
+
+ if (status.st_mtime < 1347000000)
+ goto out; // probably bad rtc like on some Caanoos
+
+ *time = status.st_mtime;
+
+out:
+ free(fname);
+ return retval;
+}
+
+static int emu_save_load_game(int load, int unused)
+{
+ if (load)
+ FCEUI_LoadState();
+ else
+ FCEUI_SaveState();
+
+ return 0;
+}
+
+// rrrr rggg gggb bbbb
+static unsigned short fname2color(const char *fname)
+{
+ static const char *rom_exts[] = { ".zip", ".nes", ".fds", ".unf",
+ ".nez", ".unif" };
+ static const char *other_exts[] = { ".nsf", ".ips", ".fcm" };
+ const char *ext = strrchr(fname, '.');
+ int i;
+
+ if (ext == NULL)
+ return 0xffff;
+ for (i = 0; i < array_size(rom_exts); i++)
+ if (strcasecmp(ext, rom_exts[i]) == 0)
+ return 0xbdff;
+ for (i = 0; i < array_size(other_exts); i++)
+ if (strcasecmp(ext, other_exts[i]) == 0)
+ return 0xaff5;
+ return 0xffff;
+}
+
+static const char *filter_exts[] = {
+ ".txt", ".srm", ".pnd"
+};
+
+#define MENU_ALIGN_LEFT
+#ifdef __ARM_ARCH_7A__ // assume hires device
+#define MENU_X2 1
+#else
+#define MENU_X2 0
+#endif
+
+#include "../libpicofe/menu.c"
+
+static void draw_savestate_bg(int slot)
+{
+}
+
+static void debug_menu_loop(void)
+{
+}
+
+// ------------ patch/gg menu ------------
+
+extern void *cheats;
+static int cheat_count, cheat_start, cheat_pos;
+
+static int countcallb(char *name, uint32 a, uint8 v, int compare, int s, int type, void *data)
+{
+ cheat_count++;
+ return 1;
+}
+
+static int clistcallb(char *name, uint32 a, uint8 v, int compare, int s, int type, void *data)
+{
+ int pos;
+
+ pos = cheat_start + cheat_pos;
+ cheat_pos++;
+ if (pos < 0) return 1;
+ if (pos >= g_menuscreen_h / me_sfont_h) return 0;
+
+ smalltext_out16(14, pos * me_sfont_h, s ? "ON " : "OFF", 0xffff);
+ smalltext_out16(14 + me_sfont_w*4, pos * me_sfont_h, type ? "S" : "R", 0xffff);
+ smalltext_out16(14 + me_sfont_w*6, pos * me_sfont_h, name, 0xffff);
+
+ return 1;
+}
+
+static void draw_patchlist(int sel)
+{
+ int pos, max_cnt;
+
+ menu_draw_begin(1, 1);
+
+ max_cnt = g_menuscreen_h / me_sfont_h;
+ cheat_start = max_cnt / 2 - sel;
+ cheat_pos = 0;
+ FCEUI_ListCheats(clistcallb, 0);
+
+ pos = cheat_start + cheat_pos;
+ if (pos < max_cnt)
+ smalltext_out16(14, pos * me_sfont_h, "done", 0xffff);
+
+ text_out16(5, max_cnt / 2 * me_sfont_h, ">");
+ menu_draw_end();
+}
+
+void patches_menu_loop(void)
+{
+ static int menu_sel = 0;
+ int inp;
+
+ cheat_count = 0;
+ FCEUI_ListCheats(countcallb, 0);
+
+ for (;;)
+ {
+ draw_patchlist(menu_sel);
+ inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_L|PBTN_R
+ |PBTN_MOK|PBTN_MBACK, NULL, 33);
+ if (inp & PBTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = cheat_count; }
+ if (inp & PBTN_DOWN) { menu_sel++; if (menu_sel > cheat_count) menu_sel = 0; }
+ if (inp &(PBTN_LEFT|PBTN_L)) { menu_sel-=10; if (menu_sel < 0) menu_sel = 0; }
+ if (inp &(PBTN_RIGHT|PBTN_R)) { menu_sel+=10; if (menu_sel > cheat_count) menu_sel = cheat_count; }
+ if (inp & PBTN_MOK) { // action
+ if (menu_sel < cheat_count)
+ FCEUI_ToggleCheat(menu_sel);
+ else break;
+ }
+ if (inp & PBTN_MBACK)
+ break;
+ }
+}
+
+// -------------- key config --------------
+
+// b_turbo,a_turbo RLDU SEBA
+me_bind_action me_ctrl_actions[] =
+{
+ { "UP ", NKEY_UP },
+ { "DOWN ", NKEY_DOWN },
+ { "LEFT ", NKEY_LEFT },
+ { "RIGHT ", NKEY_RIGHT },
+ { "A ", NKEY_A },
+ { "B ", NKEY_B },
+ { "A TURBO", NKEY_A_TURBO },
+ { "B TURBO", NKEY_B_TURBO },
+ { "START ", NKEY_START },
+ { "SELECT ", NKEY_SELECT },
+ { NULL, 0 }
+};
+
+me_bind_action emuctrl_actions[] =
+{
+ { "Save State ", EACT_SAVE_STATE },
+ { "Load State ", EACT_LOAD_STATE },
+ { "Next State Slot ", EACT_NEXT_SLOT },
+ { "Prev State Slot ", EACT_PREV_SLOT },
+ { "FDS Insert/Eject ", EACT_FDS_INSERT },
+ { "FDS Select Disk ", EACT_FDS_SELECT },
+ { "VSUni Insert Coin", EACT_INSERT_COIN },
+ { "Enter Menu ", EACT_ENTER_MENU },
+ { NULL, 0 }
+};
+
+static int key_config_loop_wrap(int id, int keys)
+{
+ switch (id) {
+ case MA_CTRL_PLAYER1:
+ key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 0);
+ break;
+ case MA_CTRL_PLAYER2:
+ key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 1);
+ break;
+ case MA_CTRL_EMU:
+ key_config_loop(emuctrl_actions, array_size(emuctrl_actions) - 1, -1);
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+static const char *mgn_dev_name(int id, int *offs)
+{
+ const char *name = NULL;
+ static int it = 0;
+
+ if (id == MA_CTRL_DEV_FIRST)
+ it = 0;
+
+ for (; it < IN_MAX_DEVS; it++) {
+ name = in_get_dev_name(it, 1, 1);
+ if (name != NULL)
+ break;
+ }
+
+ it++;
+ return name;
+}
+
+static const char *mgn_saveloadcfg(int id, int *offs)
+{
+ return "";
+}
+
+static void config_commit(void);
+
+static int mh_savecfg(int id, int keys)
+{
+ const char *fname = NULL;
+ if (id == MA_OPT_SAVECFG_GAME)
+ fname = lastLoadedGameName;
+
+ config_commit();
+ if (SaveConfig(fname) == 0)
+ menu_update_msg("config saved");
+ else
+ menu_update_msg("failed to write config");
+
+ return 1;
+}
+
+static int mh_input_rescan(int id, int keys)
+{
+ //menu_sync_config();
+ in_probe();
+ menu_update_msg("rescan complete.");
+
+ return 0;
+}
+
+static menu_entry e_menu_keyconfig[] =
+{
+ mee_handler_id("Player 1", MA_CTRL_PLAYER1, key_config_loop_wrap),
+ mee_handler_id("Player 2", MA_CTRL_PLAYER2, key_config_loop_wrap),
+ mee_handler_id("Emulator controls", MA_CTRL_EMU, key_config_loop_wrap),
+ mee_label (""),
+// mee_range ("Analog deadzone", MA_CTRL_DEADZONE, analog_deadzone, 1, 99),
+ mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg),
+ mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg),
+ mee_handler ("Rescan devices:", mh_input_rescan),
+ mee_label (""),
+ mee_label_mk (MA_CTRL_DEV_FIRST, mgn_dev_name),
+ mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
+ mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
+ mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
+ mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
+ mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
+ mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
+ mee_end,
+};
+
+static int menu_loop_keyconfig(int id, int keys)
+{
+ static int sel = 0;
+
+ me_loop(e_menu_keyconfig, &sel);
+ return 0;
+}
+
+// --------- FCEU options ----------
+
+extern int ntsccol,ntschue,ntsctint;
+extern int srendlinev[2];
+extern int erendlinev[2];
+extern int eoptions;
+extern char *cpalette;
+extern void LoadCPalette(void);
+
+static menu_entry e_menu_fceu_options[] =
+{
+ //gp2x_text_out15(tl_x, y, "Custom palette: %s", cpal);
+ mee_onoff ("NTSC Color Emulation", MA_OPT_NTSC_COLOR, ntsccol, 1),
+ mee_range (" Tint (default: 56)", MA_OPT_NTSC_TINT, ntsctint, 0, 128),
+ mee_range (" Hue (default: 72)", MA_OPT_NTSC_HUE, ntschue, 0, 128),
+ mee_range ("First visible line (NTSC)", MA_OPT_SREND_N, srendlinev[0], 0, 239),
+ mee_range ("Last visible line (NTSC)", MA_OPT_EREND_N, erendlinev[0], 0, 239),
+ mee_range ("First visible line (PAL)", MA_OPT_SREND_P, srendlinev[1], 0, 239),
+ mee_range ("Last visible line (PAL)", MA_OPT_EREND_P, erendlinev[1], 0, 239),
+ mee_onoff ("Clip 8 left/right columns", MA_OPT_CLIP, eoptions, EO_CLIPSIDES),
+ mee_onoff ("Disable 8 sprite limit", MA_OPT_NO8LIM, eoptions, EO_NO8LIM),
+ mee_onoff ("Enable authentic GameGenie",MA_OPT_GG, eoptions, EO_GG),
+ mee_end,
+};
+
+static int menu_loop_fceu_options(int id, int keys)
+{
+ static int sel = 0;
+ int i;
+
+ FCEUI_GetNTSCTH(&ntsctint, &ntschue);
+
+ me_loop(e_menu_fceu_options, &sel);
+
+ for(i = 0; i < 2; i++)
+ {
+ if (srendlinev[i] < 0 || srendlinev[i] > 239)
+ srendlinev[i] = 0;
+ if (erendlinev[i] < srendlinev[i] || erendlinev[i] > 239)
+ erendlinev[i] = 239;
+ }
+ FCEUI_SetNTSCTH(ntsccol, ntsctint, ntschue);
+ FCEUI_SetRenderedLines(srendlinev[0],erendlinev[0],srendlinev[1],erendlinev[1]);
+ FCEUI_DisableSpriteLimitation(eoptions&EO_NO8LIM);
+ FCEUI_SetGameGenie(eoptions&EO_GG);
+ //if (cpalette) LoadCPalette();
+ //else
+ FCEUI_SetPaletteArray(0); // set to default
+ FCEU_ResetPalette();
+
+ return 0;
+}
+
+// -------------- options --------------
+
+static const char *men_frameskip[] = { "Auto", "0", "1", "2", "3", "4", NULL };
+static const char *men_rates[] = { "8000", "11025", "16000", "22050", "44100", NULL };
+static const int men_rates_i[] = { 8000 , 11025 , 16000 , 22050 , 44100 };
+static const char *men_region[] = { "Auto", "NTSC", "PAL", NULL };
+static const char *men_sstate[] = { "OFF", "writes", "loads", "both", NULL };
+static const char h_renderer[] = "ROM reload required for this\n"
+ "setting to take effect";
+
+static int sndrate_i;
+static int sndon;
+static int turbo_i;
+
+static void config_commit(void)
+{
+ Settings.sound_rate = men_rates_i[sndrate_i];
+ soundvol = sndon ? 0 : 50;
+ Settings.turbo_rate_add = (turbo_i * 2 << 24) / 60 + 1;
+
+ if (Settings.region_force)
+ FCEUI_SetVidSystem(Settings.region_force - 1);
+}
+
+static menu_entry e_menu_options[] =
+{
+ mee_onoff ("Show FPS", MA_OPT_SHOWFPS, Settings.showfps, 1),
+ mee_enum ("Frameskip", MA_OPT_FSKIP, Settings.frameskip, men_frameskip),
+ mee_onoff_h ("Accurate renderer (slow)",MA_OPT_RENDERER, Settings.accurate_mode, 1, h_renderer),
+ mee_onoff ("Enable sound", MA_OPT_SOUNDON, sndon, 1),
+ mee_enum ("Sound Rate", MA_OPT_SOUNDRATE, sndrate_i, men_rates),
+ mee_enum ("Region", MA_OPT_REGION, Settings.region_force, men_region),
+ mee_range ("Turbo rate (Hz)", MA_OPT_TURBO, turbo_i, 1, 30),
+ mee_enum ("Confirm savestate", MA_OPT_SSTATE, Settings.sstate_confirm, men_sstate),
+ mee_range ("Save slot", MA_OPT_SSLOT, CurrentState, 0, 9),
+ mee_range ("Gamma correction", MA_OPT_GAMMA, Settings.gamma, 0, 300),
+ mee_handler ("[FCE Ultra options]", menu_loop_fceu_options),
+ mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg),
+ mee_cust_nosave("Save cfg for loaded game",MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg),
+ mee_end,
+};
+
+static int menu_loop_options(int id, int keys)
+{
+ static int sel = 0;
+ int oldrate;
+ int i;
+
+ oldrate = Settings.sound_rate;
+ for (i = 0; i < array_size(men_rates_i); i++) {
+ if (Settings.sound_rate == men_rates_i[i]) {
+ sndrate_i = i;
+ break;
+ }
+ }
+ sndon = soundvol != 0;
+ turbo_i = (Settings.turbo_rate_add * 60 / 2) >> 24;
+
+ me_loop(e_menu_options, &sel);
+
+ config_commit();
+ if (oldrate != Settings.sound_rate)
+ InitSound();
+
+ return 0;
+}
+
+// -------------- root menu --------------
+
+static const char credits_text[] =
+ "GPFCE " REV "\n"
+ "(c) notaz, 2007,2012\n\n"
+ "Based on FCE Ultra versions\n"
+ "0.81 and 0.98.1x\n\n"
+ " - Credits -\n"
+ "Bero: FCE\n"
+ "Xodnizel: FCE Ultra\n"
+ "FCA author: 6502 core\n";
+
+static void draw_frame_credits(void)
+{
+ smalltext_out16(4, 1, "build: " __DATE__ " " __TIME__ " " REV, 0xe7fc);
+}
+
+static int romsel_run(void)
+{
+ const char *fname;
+
+ fname = menu_loop_romsel(lastLoadedGameName, sizeof(lastLoadedGameName));
+ if (fname == NULL)
+ return -1;
+
+ printf("selected file: %s\n", fname);
+ //keys_load_all(cfg);
+
+ strcpy(lastLoadedGameName, rom_fname_reload);
+ return 0;
+}
+
+static int menu_loop_ret;
+
+static int main_menu_handler(int id, int keys)
+{
+ switch (id)
+ {
+ case MA_MAIN_RESUME_GAME:
+ if (fceugi)
+ return 1;
+ break;
+ case MA_MAIN_SAVE_STATE:
+ if (fceugi) {
+ Exit = 0;
+ return menu_loop_savestate(0);
+ }
+ break;
+ case MA_MAIN_LOAD_STATE:
+ if (fceugi) {
+ Exit = 0;
+ return menu_loop_savestate(1);
+ }
+ break;
+ case MA_MAIN_RESET_GAME:
+ if (fceugi) {
+ FCEU_DoSimpleCommand(FCEUNPCMD_RESET);
+ Exit = 0;
+ return 0;
+ }
+ break;
+ case MA_MAIN_LOAD_ROM:
+ if (romsel_run() == 0) {
+ menu_loop_ret = 2;
+ return 1;
+ }
+ break;
+ case MA_MAIN_CREDITS:
+ draw_menu_message(credits_text, draw_frame_credits);
+ in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70);
+ break;
+ case MA_MAIN_EXIT:
+ menu_loop_ret = 1;
+ return 1;
+ default:
+ lprintf("%s: something unknown selected\n", __FUNCTION__);
+ break;
+ }
+
+ return 0;
+}
+
+static menu_entry e_menu_main[] =
+{
+ mee_handler_id("Resume game", MA_MAIN_RESUME_GAME, main_menu_handler),
+ mee_handler_id("Save State", MA_MAIN_SAVE_STATE, main_menu_handler),
+ mee_handler_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler),
+ mee_handler_id("Reset game", MA_MAIN_RESET_GAME, main_menu_handler),
+ mee_handler_id("Load ROM", MA_MAIN_LOAD_ROM, main_menu_handler),
+ mee_handler ("Options", menu_loop_options),
+ mee_handler ("Controls", menu_loop_keyconfig),
+ mee_handler_id("Cheats", MA_MAIN_CHEATS, main_menu_handler),
+ mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler),
+ mee_handler_id("Exit", MA_MAIN_EXIT, main_menu_handler),
+ mee_end,
+};
+
+// ----------------------------
+
+int menu_loop(void)
+{
+ static int sel = 0;
+
+ menu_loop_ret = 0;
+
+ me_enable(e_menu_main, MA_MAIN_RESUME_GAME, fceugi != NULL);
+ me_enable(e_menu_main, MA_MAIN_SAVE_STATE, fceugi != NULL);
+ me_enable(e_menu_main, MA_MAIN_LOAD_STATE, fceugi != NULL);
+ me_enable(e_menu_main, MA_MAIN_RESET_GAME, fceugi != NULL);
+ me_enable(e_menu_main, MA_MAIN_CHEATS, fceugi && cheats);
+
+ plat_video_menu_enter(fceugi != NULL);
+ in_set_config_int(0, IN_CFG_BLOCKING, 1);
+
+ do {
+ me_loop_d(e_menu_main, &sel, NULL, NULL);
+ } while (!fceugi && menu_loop_ret == 0);
+
+ /* wait until menu, ok, back is released */
+ while (in_menu_wait_any(NULL, 50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK))
+ ;
+
+ in_set_config_int(0, IN_CFG_BLOCKING, 0);
+ plat_video_menu_leave();
+
+ return menu_loop_ret;
+}
+
+void menu_init(void)
+{
+ char buff[256];
+
+ g_border_style = 1;
+ menu_init_base();
+
+ //menu_load_config(0);
+
+ g_menubg_src_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1);
+ g_menubg_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1);
+ if (g_menubg_src_ptr == NULL || g_menubg_ptr == NULL) {
+ fprintf(stderr, "OOM\n");
+ exit(1);
+ }
+
+ emu_make_path(buff, "skin/background.png", sizeof(buff));
+ readpng(g_menubg_src_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h);
+}
+
+void menu_update_msg(const char *msg)
+{
+ strncpy(menu_error_msg, msg, sizeof(menu_error_msg));
+ menu_error_msg[sizeof(menu_error_msg) - 1] = 0;
+
+ menu_error_time = plat_get_ticks_ms();
+ lprintf("msg: %s\n", menu_error_msg);
+}
+
--- /dev/null
+void menu_init(void);
+int menu_loop(void);
+void menu_update_msg(const char *msg);
--- /dev/null
+void platform_init(void);
+void platform_late_init(void);
+void platform_apply_config(void);
+void platform_set_volume(int val); // 0-100
+void platform_finish(void);
-#define GP2X_PORT_VERSION "0.4"
-
typedef struct {
- // gp2x specific
- int KeyBinds[32];
- int JoyBinds[4][32];
int turbo_rate_add; // 8.24 int
int sound_rate; // in Hz
int showfps;
- int scaling; // unscaled=0, hw_hor, hw_hor_vert, sw_hor
int frameskip; // -1 ~ auto, >=0 ~ count
int sstate_confirm;
int region_force; // 0 ~ off, 1 ~ NTSC, 2 ~ PAL
+ int gamma;
+ int accurate_mode;
+ // gp2x specific
+ int KeyBinds[32];
+ int JoyBinds[4][32];
+ int scaling; // unscaled=0, hw_hor, hw_hor_vert, sw_hor
int cpuclock;
int mmuhack;
int ramtimings;
- int gamma;
int perfect_vsync;
- int accurate_mode;
} DSETTINGS;
extern DSETTINGS Settings;
-void gp2x_opt_setup(void);
-void gp2x_opt_update(void);
-
printf("\nUsage is as follows:\n%s <options> filename\n\n",prog);
puts("Options:");
puts(DriverUsage);
-puts("-cpalette x Load a custom global palette from file x.\n\
+puts(
+"-sound x Sound.\n\
+ 0 = Disabled.\n\
+ Otherwise, x = playback rate.\n\
+-showfps x Display fps counter if x is nonzero\n\
+-cpalette x Load a custom global palette from file x.\n\
-ntsccol x Emulate an NTSC's TV's colors.\n\
0 = Disabled.\n\
1 = Enabled.\n\
#include <stdio.h>
#include "../../driver.h"
-#include "gp2x.h"
+#include "../common/settings.h"
+#include "../common/throttle.h"
#include "minimal.h"
-#include "throttle.h"
extern int soundvol;
return 1024;
}
+void StartSound(void)
+{
+ gp2x_start_sound(Settings.sound_rate, 16, 0);
+}
+
int KillSound(void)
{
//FCEUI_Sound(0);
#include "../../video.h"
#include "../common/main.h"
-#include "gp2x.h"
+#include "../common/settings.h"
#include "minimal.h"
#include "../libpicofe/fonts.h"
#include "asmutils.h"
#include "../../driver.h"
#include "../common/config.h"
#include "../common/args.h"
-#include "gp2x.h"
+#include "../common/platform.h"
+#include "../common/settings.h"
+#include "../common/revision.h"
#include "gp2x-video.h"
#ifdef NETWORK
#include "unix-netplay.h"
#include "cpuctrl.h"
#include "squidgehack.h"
-int GP2X_PORT_REV =
-#include "rev.h"
-;
-
extern uint8 PAL;
-int CLImain(int argc, char *argv[]);
-
-DSETTINGS Settings;
-CFGSTRUCT DriverConfig[]={
- ACA(Settings.KeyBinds),
- ACA(Settings.JoyBinds),
- AC(Settings.turbo_rate_add),
- AC(Settings.sound_rate),
- AC(Settings.showfps),
- AC(Settings.scaling),
- AC(Settings.frameskip),
- AC(Settings.sstate_confirm),
- AC(Settings.region_force),
- AC(Settings.cpuclock),
- AC(Settings.mmuhack),
- AC(Settings.ramtimings),
- AC(Settings.gamma),
- AC(Settings.perfect_vsync),
- AC(Settings.accurate_mode),
- ENDCFGSTRUCT
-};
-
-
char *DriverUsage=
-"-joyx y Use joystick y as virtual joystick x.\n\
--sound x Sound.\n\
- 0 = Disabled.\n\
- Otherwise, x = playback rate.\n\
--showfps x Display fps counter if x is nonzero\n\
--mmuhack x Enable squidge's MMU hack if x is nonzero (GP2X).\n\
+"-mmuhack x Enable squidge's MMU hack if x is nonzero (GP2X).\n\
-ramtimings x Enable RAM overclocking if x is nonzero (GP2X).\n\
-"
-#ifdef NETWORK
-"-connect s Connect to server 's' for TCP/IP network play.\n\
--server Be a host/server for TCP/IP network play.\n\
--netport x Use TCP/IP port x for network play."
-#endif
-;
+";
-#ifdef NETWORK
-static int docheckie[2]={0,0};
-#endif
ARGPSTRUCT DriverArgs[]={
- {"-sound",0,&Settings.sound_rate,0},
- {"-showfps",0,&Settings.showfps,0},
{"-mmuhack",0,&Settings.mmuhack,0},
{"-ramtimings",0,&Settings.ramtimings,0},
{"-menu",0,&ext_menu,0x4001},
{"-menustate",0,&ext_state,0x4001},
- #ifdef NETWORK
- {"-connect",&docheckie[0],&netplayhost,0x4001},
- {"-server",&docheckie[1],0,0},
- {"-netport",0,&Port,0},
- #endif
{0,0,0,0}
};
-
-
void GetBaseDirectory(char *BaseDirectory)
{
strcpy(BaseDirectory, "fceultra");
void DoDriverArgs(void)
{
- #ifdef NETWORK
- if(docheckie[0])
- netplay=2;
- else if(docheckie[1])
- netplay=1;
-
- if(netplay)
- FCEUI_SetNetworkPlay(netplay);
- #endif
}
-char **g_argv;
int mmuhack_status = 0;
-// TODO: cleanup
-int main(int argc, char *argv[])
+void platform_init(void)
{
- int ret;
- g_argv = argv;
-
- printf("Starting GPFCE - Port version " GP2X_PORT_VERSION " r%i (" __DATE__ ")\n", GP2X_PORT_REV);
+ printf("Starting GPFCE " REV " (" __DATE__ ")\n");
puts("Based on FCE Ultra "VERSION_STRING" and 0.98.1x versions");
puts("Original port by Zheng Zhu");
puts("Menu/optimization/misc work by notaz\n");
cpuctrl_init();
SetDefaults();
+}
- ret = CLImain(argc,argv);
-
+void platform_finish(void)
+{
// unscale the screen, in case it is bad.
gp2x_video_RGB_setscaling(320, 240);
return(ret?0:-1);
}
+void platform_set_volume(int val) // 0-100
+{
+ platform_set_volume(val, val);
+}
/* optional GP2X stuff to be done after config is loaded */
-void gp2x_opt_setup(void)
+void platform_late_init(void)
{
if (Settings.mmuhack) {
int ret = mmuhack();
}
}
-void gp2x_opt_update(void)
+void platform_apply_config(void)
{
static int prev_cpuclock = 200, prev_gamma = 100, prev_vsync = 0, prev_pal = 0;
if (Settings.cpuclock != 0 && Settings.cpuclock != prev_cpuclock)
}
prev_vsync = Settings.perfect_vsync;
}
+
+ gp2x_video_changemode(Settings.scaling == 3 ? 15 : 8);
+ switch (Settings.scaling & 3) {
+ case 0: gp2x_video_set_offs(0); gp2x_video_RGB_setscaling(320, 240); break;
+ case 1: gp2x_video_set_offs(32); gp2x_video_RGB_setscaling(256, 240); break;
+ case 2: gp2x_video_set_offs(32+srendline*320); gp2x_video_RGB_setscaling(256, erendline-srendline); break;
+ case 3: gp2x_video_set_offs(32); gp2x_video_RGB_setscaling(320, 240); break;
+ }
}
#include <sys/time.h>
+#include "../common/settings.h"
#include "main.h"
-#include "gp2x.h"
#include "minimal.h"
#include "throttle.h"
--- /dev/null
+#include <SDL.h>
+#include "../common/platform.h"
+#include "../common/args.h"
+#include "../common/settings.h"
+#include "../common/input.h"
+#include "../libpicofe/menu.h"
+#include "../libpicofe/input.h"
+#include "../libpicofe/in_sdl.h"
+
+static const struct in_default_bind in_sdl_defbinds[] = {
+ { SDLK_UP, IN_BINDTYPE_PLAYER12, NKEYB_UP },
+ { SDLK_DOWN, IN_BINDTYPE_PLAYER12, NKEYB_DOWN },
+ { SDLK_LEFT, IN_BINDTYPE_PLAYER12, NKEYB_LEFT },
+ { SDLK_RIGHT, IN_BINDTYPE_PLAYER12, NKEYB_RIGHT },
+ { SDLK_z, IN_BINDTYPE_PLAYER12, NKEYB_B },
+ { SDLK_x, IN_BINDTYPE_PLAYER12, NKEYB_A },
+ { SDLK_a, IN_BINDTYPE_PLAYER12, NKEYB_B_TURBO },
+ { SDLK_s, IN_BINDTYPE_PLAYER12, NKEYB_A_TURBO },
+ { SDLK_ESCAPE, IN_BINDTYPE_EMU, EACTB_ENTER_MENU },
+ { 0, 0, 0 }
+};
+
+SDL_Surface *screen;
+
+void platform_init(void)
+{
+ memset(&Settings, 0, sizeof(Settings));
+ Settings.frameskip = -1; // auto
+ Settings.sound_rate = 44100;
+ Settings.turbo_rate_add = (8*2 << 24) / 60 + 1; // 8Hz turbofire
+ Settings.gamma = 100;
+ Settings.sstate_confirm = 1;
+
+ g_menuscreen_w = 320;
+ g_menuscreen_h = 240;
+
+ // tmp
+ {
+ extern void gp2x_init();
+ gp2x_init();
+ }
+}
+
+void platform_late_init(void)
+{
+ in_sdl_init(in_sdl_defbinds);
+}
+
+void platform_apply_config(void)
+{
+}
+
+void platform_set_volume(int val)
+{
+}
+
+void platform_finish(void)
+{
+}
+
+void plat_video_menu_enter(int is_rom_loaded)
+{
+ screen = SDL_SetVideoMode(320, 240, 16, 0);
+}
+
+void plat_video_menu_begin(void)
+{
+ g_menuscreen_ptr = screen->pixels;
+}
+
+void plat_video_menu_end(void)
+{
+ SDL_Flip(screen);
+}
+
+void plat_video_menu_leave(void)
+{
+}
+
+char *DriverUsage="";
+
+ARGPSTRUCT DriverArgs[]={
+ {0,0,0,0}
+};
+
+void DoDriverArgs(void)
+{
+}
+
+void GetBaseDirectory(char *BaseDirectory)
+{
+ strcpy(BaseDirectory, "fceultra");
+}
#include <unistd.h>
#include "../common/main.h"
-#include "../gp2x/gp2x.h"
-#include "../gp2x/throttle.h"
+#include "../common/throttle.h"
+#include "../common/settings.h"
extern uint8 PAL;
void FCEUI_ResetNES(void);
void FCEUI_PowerNES(void);
+extern char lastLoadedGameName [2048];