From 6fb0c7a7a53e1eba7a0f5dc5b1ade312a0d76119 Mon Sep 17 00:00:00 2001 From: Toad King Date: Thu, 14 Jun 2012 03:21:06 -0400 Subject: initial pocketsnes commit --- src/menu.c | 2385 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2385 insertions(+) create mode 100644 src/menu.c (limited to 'src/menu.c') diff --git a/src/menu.c b/src/menu.c new file mode 100644 index 0000000..1908323 --- /dev/null +++ b/src/menu.c @@ -0,0 +1,2385 @@ +#include "menu.h" +#include "theme.h" +#include "config.h" +#include "screenshot.h" +#include "graphics.h" +#include "png.h" + +#define MENU_AREA_Y_START 50 +#define MENU_AREA_Y_END 227 + +#define PPU_IGNORE_FIXEDCOLCHANGES (1<<0) +#define PPU_IGNORE_WINDOW (1<<1) +#define PPU_IGNORE_ADDSUB (1<<2) +#define PPU_IGNORE_PALWRITE (1<<3) +#define GFX_IGNORE_OBJ (1<<4) +#define GFX_IGNORE_BG0 (1<<5) +#define GFX_IGNORE_BG1 (1<<6) +#define GFX_IGNORE_BG2 (1<<7) +#define GFX_IGNORE_BG3 (1<<8) + +char romDir[MAX_PATH+1]; +char snesRomDir[MAX_PATH+1]; + +#define ROM_SELECTOR_DEFAULT_FOCUS 3 + +DIRDATA dir; + +#if defined (__GP2X__) +unsigned short cpuSpeedLookup[46]={ + 10,20, 30, 40, 50, + 60,70, 80, 90,100, + 110,120,130,144,150, + 160,170,180,190,200, + 210,220,230,240,250, + 255,260,265,270,275, + 280,285,290,295,300, + 305,310,315,320,325, + 330,335,340,345,350, + 355}; +#endif + +#if defined (__WIZ__) +unsigned short cpuSpeedLookup[46]={ + 200,250, 300, 350, 400, + 450,500, 520, 540,560, + 580,590,600,610,620, + 630,640,650,660,670, + 680,690,700,710,720, + 730,740,750,760,770, + 780,790,800,810,820, + 830,840,850,860,870, + 875,880,885,890,895, + 900}; +#endif + +extern volatile int timer; +static int menutileXscroll=0; +static int menutileYscroll=0; +static int headerDone[4]; // variable that records if header graphics have been rendered or not +int quickSavePresent=0; +struct ROM_LIST_RECORD +{ + char filename[MAX_PATH+1]; + char type; +}; + +static struct ROM_LIST_RECORD romList[MAX_ROMS]; +struct SNES_MENU_OPTIONS snesMenuOptions; + +static int romCount; +char currentRomFilename[MAX_PATH+1]=""; +int currFB=0; +int prevFB=0; +int currentEmuMode=EMU_MODE_SNES; + +char currentWorkingDir[MAX_PATH+1]; +char snesOptionsDir[MAX_PATH+1]; +char snesSramDir[MAX_PATH+1]; +char snesSaveStateDir[MAX_PATH+1]; +#if defined(__WIZ__) +float soundRates[3]={22050.0,32000.0,44100.0}; +#else +float soundRates[5]={8000.0,11025.0,16000.0,22050.0,44100.0}; +#endif +char menutext[256][50]; + +struct SAVE_STATE saveState[10]; // holds the filenames for the savestate and "inuse" flags +char saveStateName[MAX_PATH+MAX_PATH+2]; // holds the last filename to be scanned for save states + +// a few vars for persistent file selector +int lastSelected = -1; +int defaultDir; + +unsigned char gammaConv[32*29]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 0, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 29, 30, 31, + 0, 3, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 30, 31, + 0, 4, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30, 30, 31, + 0, 6, 8, 10, 11, 12, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, + 0, 7, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, + 0, 8, 10, 12, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 31, 31, + 0, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, + 0, 10, 12, 14, 16, 17, 18, 19, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, + 0, 11, 13, 15, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, + 0, 12, 14, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, + 0, 12, 15, 17, 18, 19, 20, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, + 0, 13, 16, 17, 19, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, + 0, 14, 16, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, + 0, 14, 17, 18, 20, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, + 0, 15, 17, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, + 0, 16, 18, 19, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, + 0, 16, 18, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, + 0, 17, 19, 20, 21, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, + 0, 17, 19, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, + 0, 17, 20, 21, 22, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, + 0, 18, 20, 21, 22, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, + 0, 18, 20, 22, 23, 23, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, + 0, 19, 21, 22, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, + 0, 19, 21, 22, 23, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, + 0, 19, 21, 22, 23, 24, 25, 25, 26, 26, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, + 0, 20, 22, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, + 0, 20, 22, 23, 24, 24, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, + 0, 20, 22, 23, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31}; + + +void InitMenu(void) { + +} + +void UpdateMenuGraphicsGamma(void) +{ + unsigned int currPix=0; + unsigned short pixel=0; + unsigned char R,G,B; + for(currPix=0;currPix<15360;currPix++) + { + // md 0000 bbb0 ggg0 rrr0 + // gp rrrr rggg ggbb bbbi + pixel=menuHeaderOrig[currPix]; + R=(pixel>>11)&0x1F; // 0000 0RRR - 3 bits Red + G=(pixel>>6)&0x1F; + B=(pixel>>1)&0x1F; + + // Do gamma correction + R=gammaConv[R+(0<<5)]; + G=gammaConv[G+(0<<5)]; + B=gammaConv[B+(0<<5)]; + + pixel=MENU_RGB(R,G,B); + menuHeader[currPix]=pixel; + } + for(currPix=0;currPix<5120;currPix++) + { + // md 0000 bbb0 ggg0 rrr0 + // gp rrrr rggg ggbb bbbi + pixel=highLightBarOrig[currPix]; + R=(pixel>>11)&0x1F; // 0000 0RRR - 3 bits Red + G=(pixel>>6)&0x1F; + B=(pixel>>1)&0x1F; + + // Do gamma correction + R=gammaConv[R+(0<<5)]; + G=gammaConv[G+(0<<5)]; + B=gammaConv[B+(0<<5)]; + + pixel=MENU_RGB(R,G,B); + highLightBar[currPix]=pixel; + + } + + for(currPix=0;currPix<(MENU_TILE_WIDTH*MENU_TILE_HEIGHT);currPix++) + { + // md 0000 bbb0 ggg0 rrr0 + // gp rrrr rggg ggbb bbbi + pixel=menuTileOrig[currPix]; + R=(pixel>>11)&0x1F; // 0000 0RRR - 3 bits Red + G=(pixel>>6)&0x1F; + B=(pixel>>1)&0x1F; + + // Do gamma correction + R=gammaConv[R+(0<<5)]; + G=gammaConv[G+(0<<5)]; + B=gammaConv[B+(0<<5)]; + + pixel=MENU_RGB(R,G,B); + menuTile[currPix]=pixel; + + } +} + +void SnesDefaultMenuOptions(void) +{ + // no options file loaded, so set to defaults + snesMenuOptions.menuVer=SNES_OPTIONS_VER; + snesMenuOptions.frameSkip=0; + snesMenuOptions.soundOn = 1; + snesMenuOptions.volume=100; + memset(snesMenuOptions.padConfig,0xFF,sizeof(snesMenuOptions.padConfig)); + snesMenuOptions.showFps=1; + snesMenuOptions.gamma=0; + snesMenuOptions.asmspc700=1; + snesMenuOptions.SpeedHacks=1; +#if defined(__WIZ__) + snesMenuOptions.soundRate=0; + snesMenuOptions.cpuSpeed=8; +#else + snesMenuOptions.soundRate=2; + snesMenuOptions.cpuSpeed=19; +#endif + snesMenuOptions.loadOnInit = 0; + snesMenuOptions.delayedRasterFX = 1; +} + +static void ShowMessage(char *text, int showMessage) { + if (showMessage) { + gp_setClipping(0, 0, 310, 239); + PrintBar(prevFB,240-16); + gp_drawString(40,228,strlen(text),text,tTextColorFocus,framebuffer16[prevFB]); + } +} + +int LoadMenuOptions(char *path, char *filename, char *ext, char *optionsmem, int maxsize, int showMessage) +{ + char fullFilename[MAX_PATH+MAX_PATH+1]; + char _filename[MAX_PATH+1]; + char _ext[MAX_PATH+1]; + FILE *stream; + int size=0; + char text[50]; + + ShowMessage("Loading...", showMessage); + + SplitFilename(filename, _filename, _ext); + sprintf(fullFilename,"%s%s%s.%s",path,DIR_SEP,_filename,ext); + stream=fopen(fullFilename,"rb"); + if(stream) + { + // File exists do try to load it + fseek(stream,0,SEEK_END); + size=ftell(stream); + if (size>maxsize) size=maxsize; + fseek(stream,0,SEEK_SET); + fread(optionsmem, 1, size, stream); + fclose(stream); + return(0); + } + else + { + return(1); + } +} + +int SaveMenuOptions(char *path, char *filename, char *ext, char *optionsmem, int maxsize, int showMessage) +{ + char fullFilename[MAX_PATH+MAX_PATH+1]; + char _filename[MAX_PATH+1]; + char _ext[MAX_PATH+1]; + FILE *stream; + char text[50]; + + ShowMessage("Saving...", showMessage); + + SplitFilename(filename, _filename, _ext); + sprintf(fullFilename,"%s%s%s.%s",path,DIR_SEP,_filename,ext); + stream=fopen(fullFilename,"wb"); + if(stream) + { + fwrite(optionsmem, 1, maxsize, stream); + fclose(stream); + sync(); + return(0); + } + else + { + return(1); + } +} + +int DeleteMenuOptions(char *path, char *filename, char *ext, int showMessage) +{ + char fullFilename[MAX_PATH+MAX_PATH+1]; + char _filename[MAX_PATH+1]; + char _ext[MAX_PATH+1]; + char text[50]; + + ShowMessage("Deleting...", showMessage); + + SplitFilename(filename, _filename, _ext); + sprintf(fullFilename,"%s%s%s.%s",path,DIR_SEP,_filename,ext); + remove(fullFilename); + sync(); + return(0); +} + +#ifdef __GIZ__ +void sync(void) +{ +} +#endif + +static void WaitForButtonsUp(void) +{ + int i=0,j=0,z=0; + + for(i=0;i<100;i++) + { + while(1) + { + InputUpdate(0); + z=0; + for (j=0;j<32;j++) + { + if (Inp.held[j]) z=1; + } + if (z==0) break; + } + } +} + +void MenuPause() +{ + int i=0,j=0,z=0; + // wait for keys to be released + for(i=0;i<100;i++) // deal with keybounce by checking a few times + { + while(1) + { + InputUpdate(0); + z=0; + for (j=0;j<32;j++) + { + if (Inp.held[j]) z=1; + } + if (z==0) break; + } + } + + for(i=0;i<100;i++) // deal with keybounce by checking a few times + { + while(1) + { + InputUpdate(0); + z=0; + for (j=0;j<32;j++) + { + if (Inp.held[j]) z=1; + } + if (z==1) break; + } + } +} +#if defined (__GP2X__) || defined(__WIZ__) +void MenuFlip() +{ + prevFB=currFB; + gp_setFramebuffer(currFB,1); + currFB++; + currFB&=3; +} +#endif +#if defined (__GIZ__) +void MenuFlip() +{ + prevFB=currFB=0; + gp_setFramebuffer(currFB,0); +} +#endif +void SplitFilename(char *wholeFilename, char *filename, char *ext) +{ + int len=strlen(wholeFilename); + int i=0,y=-1; + + ext[0]=0; + filename[0]=0; + //Check given string is not null + if (len<=0) + { + return; + } + y=-1; + for(i=len-2;i>0;i--) + { + if (wholeFilename[i]=='.') + { + y=i; + break; + } + } + + if (y>=0) + { + memcpy(filename,wholeFilename,y); + filename[y]=0; // change "." to zero to end string + memcpy(ext,wholeFilename+y+1,len-(y+1)); + //ext[len-(y+1)+1]=0; + ext[len-(y+1)]=0; + } + else + { + strcpy(filename,wholeFilename); + } +} + +//Ensures all directory seperators are valid for system +void CheckDirSep(char *path) +{ + int i=0; + char dirSepBad[2]={DIR_SEP_BAD}; + char dirSep[2]={DIR_SEP}; + for(i=0;i39)len=39; + gp_drawString(8,50,len,message1,tTextColorItem,framebuffer16[currFB]); + len=strlen(message2); + if(len>39)len=39; + gp_drawString(8,60,len,message2,tTextColorItem,framebuffer16[currFB]); + len=strlen(message3); + if(len>39)len=39; + gp_drawString(8,70,len,message3,tTextColorItem,framebuffer16[currFB]); + switch(mode) + { + case 0: // yes no input + if(select==0) + { + PrintBar(currFB, 120-4); + gp_drawString(8,120,3,"YES",tTextColorFocus,framebuffer16[currFB]); + gp_drawString(8,140,2,"NO",tTextColorItem,framebuffer16[currFB]); + } + else + { + PrintBar(currFB, 140-4); + gp_drawString(8,120,3,"YES",tTextColorItem,framebuffer16[currFB]); + gp_drawString(8,140,2,"NO",tTextColorFocus,framebuffer16[currFB]); + + } + break; + } + MenuFlip(); + } + return(subaction); +} + +static +int deleterom(int romindex) +{ + char text[MAX_PATH+1]; + char fullfilename[MAX_PATH+MAX_PATH+1]; + int x; + FILE *stream=NULL; + + PrintTile(currFB); + PrintTitle(currFB); + MenuFlip(); + + sprintf(text,"Deleting Rom.."); + gp_drawString(8,50,strlen(text),text,tTextColorItem,framebuffer16[prevFB]); + + sprintf(text,"%s",romList[romindex].filename); + x=strlen(text); + if(x>40) x=40; + gp_drawString(0,60,x,text,tTextColorItem,framebuffer16[prevFB]); + + sprintf(fullfilename,"%s%s%s",romDir,DIR_SEP,romList[romindex].filename); + remove(fullfilename); + sync(); + + sprintf(text,"Updating Rom List.."); + gp_drawString(8,70,strlen(text),text,tTextColorItem,framebuffer16[prevFB]); + for(x=romindex;xw, tBmpBackground->h - MENU_AREA_Y_START + 1); + } else { + + x2=menutileXscroll; + y2=(menutileYscroll*MENU_TILE_WIDTH); + graphics1 = menuTile+y2; + for (y=0; y<(240-48); y++) + { + for (x=0; x<320; x++) + { + *framebuffer1++ = graphics1[x2]; + x2++; + x2&=(MENU_TILE_WIDTH-1); + } + y2+=MENU_TILE_WIDTH; + y2&=((MENU_TILE_HEIGHT*MENU_TILE_WIDTH)-1); + graphics1=menuTile+y2; + } + + tileCounter++; + if (tileCounter > 5) + { + tileCounter=0; + menutileXscroll++; + if(menutileXscroll>=MENU_TILE_WIDTH) menutileXscroll=0; + + menutileYscroll++; + if(menutileYscroll>=MENU_TILE_HEIGHT) menutileYscroll=0; + } + } + return; +} + +void PrintTitle(int flip) +{ + unsigned int x,y; + char text[] = DRSNES_VERSION; + //If header already drawn for this layer exit + if (headerDone[flip]) return; + + if (isThemeActive() != 0) { + gDrawBitmap16((unsigned short *)framebuffer16[flip], 0, 0, tBmpBackground, 0, 0, tBmpBackground->w, MENU_AREA_Y_START); + } else { + unsigned short *framebuffer = (unsigned short*)framebuffer16[flip]; + unsigned short *graphics = (unsigned short*)menuHeader; + + for (y=0; y<48; y++) + { + for (x=0; x<320; x++) + { + *framebuffer++ = *graphics++; + } + } + } + + //sprintf(text,"%s",DRSNES_VERSION); + gp_drawString(175,15,strlen(text),text,tTextColorVersion,framebuffer16[flip]); + headerDone[currFB] = 1; +} + +void PrintBar(int flip, unsigned int givenY) +{ + if (isThemeActive()) { + gBlendBitmap16((unsigned short *)framebuffer16[flip], 0, givenY, tBmpBar, 0, 0, tBmpBar->w, tBmpBar->h); + } else { + unsigned int *framebuffer1 = NULL; + unsigned int *graphics1 = (unsigned int *)highLightBar; + unsigned int x,y; + + framebuffer1 = (unsigned int*)framebuffer16[flip]+(givenY*160); + for (y=0; y<16; y++) + { + for (x=0; x<160; x++) + { + *framebuffer1++ = *graphics1++; + } + } + } +} + +static int StringCompare(char *string1, char *string2) +{ + int i=0; + char c1=0,c2=0; + while(1) + { + c1=string1[i]; + c2=string2[i]; + // check for string end + + if ((c1 == 0) && (c2 == 0)) return 0; + if (c1 == 0) return 1; + if (c2 == 0) return -1; + + if ((c1 >= 0x61)&&(c1<=0x7A)) c1-=0x20; + if ((c2 >= 0x61)&&(c2<=0x7A)) c2-=0x20; + if (c1>c2) + return 1; + else if (c1d_name[0] != '.') + { +#if defined(__GP2X__) || defined(__WIZ__) + if (de->d_type == 4) // Directory +#endif +#ifdef __GIZ__ + sprintf(dirCheck,"%s%s%s",romDir,DIR_SEP,de->d_name); + CharToWChar(wc, dirCheck); + hTest=FindFirstFileW(wc, &fileInfo); + if (fileInfo.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) +#endif + { + + for (i=ROM_SELECTOR_DEFAULT_FOCUS+1;i<=(romCount+1);i++) + { + if (romList[i].filename[0] == 0) // string is empty so shove new value in + { + strcpy(romList[i].filename,de->d_name); + romList[i].type=FILE_TYPE_DIRECTORY;//de->d_type; + break; + } + else + { + if ((StringCompare(romList[i].filename,de->d_name) > 0) || + (romList[i].type != FILE_TYPE_DIRECTORY)) + { + // new entry is lower than current string so move all entries up one and insert + // new value in + for (j=romCount;j>=i;j--) + { + strcpy(romList[j+1].filename,romList[j].filename); + romList[j+1].type=romList[j].type; + } + strcpy(romList[i].filename,de->d_name); + romList[i].type=FILE_TYPE_DIRECTORY;//de->d_type; + break; + } + } + } + dirCount++; + romCount++; + } + else // File + { + // only interested in Zip and SMC files + SplitFilename(de->d_name,_filename,_ext); + if ((StringCompare(_ext,"zip") == 0) || + (StringCompare(_ext,"smc") == 0) || + (StringCompare(_ext,"sfc") == 0)) + { + for (i=ROM_SELECTOR_DEFAULT_FOCUS+1+dirCount;i<=(romCount+1);i++) + { + if (romList[i].filename[0] == 0) // string is empty so shove new value in + { + strcpy(romList[i].filename,de->d_name); + romList[i].type=FILE_TYPE_FILE;//de->d_type; + break; + } + else + { + if (StringCompare(romList[i].filename,de->d_name) > 0) + { + // new entry is lower than current string so move all entries up one and insert + // new value in + for (j=romCount;j>=i;j--) + { + strcpy(romList[j+1].filename,romList[j].filename); + romList[j+1].type=romList[j].type; + } + strcpy(romList[i].filename,de->d_name); + romList[i].type=FILE_TYPE_FILE;//de->d_type; + break; + } + } + } + romCount++; + } + } + + + if (romCount > MAX_ROMS) + { + PrintTile(currFB); + PrintTitle(currFB); + sprintf(text,"Max rom limit exceeded! %d max",MAX_ROMS); + gp_drawString(8,120,strlen(text),text,tTextColorItem,framebuffer16[currFB]); + sprintf(text,"Please reduce number of roms"); + gp_drawString(8,130,strlen(text),text,tTextColorItem,framebuffer16[currFB]); + MenuFlip(); + MenuPause(); + break; + } + } + } + closedir(d); + + getConfigValue(CONFIG_LASTLOADED, ll, sizeof(ll)); + if (strstr(ll, romDir)) { // where loaded in current dir + llf = strrchr(ll, '/'); + if (!llf) { + ll[0] = '\0'; + llf = ll; + } else llf++; + + for(i = 4; i < romCount; i++) { + if ((romList[i].type == FILE_TYPE_FILE) && + (strncmp(romList[i].filename, llf, strlen(romList[i].filename)) == 0)) { + lastSelected = i; + } + } + } + } + else + { + PrintTile(currFB); + PrintTitle(currFB); + sprintf(text,"Failed to open directory!"); + gp_drawString(8,120,strlen(text),text,tTextColorItem,framebuffer16[currFB]); + MenuFlip(); + MenuPause(); + } + + + + return romCount; +} + +int FileSelect(int mode) +{ + char text[256]; + int romname_length; + int action=0; + int smooth=0; + unsigned short color=0; + int i=0; + int focus=ROM_SELECTOR_DEFAULT_FOCUS; + int menuExit=0; + int scanstart=0,scanend=0; + char dirSep[2]={DIR_SEP}; + char dirSepBad[2]={DIR_SEP_BAD}; + + //int x = lastSelected; + int txt_dir; + int txt_offset; + int frame; + +#define TIME_TO_SCREENSHOT (20 * 1) +#define RESET_SCREENSHOT_COUNTER \ + timeToScreenshot = TIME_TO_SCREENSHOT;\ + if (bmpScreenshot) {\ + gDestroyBitmap(bmpScreenshot); \ + bmpScreenshot = NULL; \ + }\ + noScreenshot = 0; + + int timeToScreenshot; + int noScreenshot; + int xScreenshot; + gBITMAP *bmpScreenshot = NULL; + + FileScan(); +#define RESET_NAME_SCROLL \ + txt_dir = 1; \ + txt_offset = -1; + + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + + if (lastSelected >= 0) focus = lastSelected; + if (focus>romCount-1) focus = ROM_SELECTOR_DEFAULT_FOCUS; + smooth=focus<<8; + + while (menuExit==0) + { + InputUpdate(0); + + // Change which rom is focused on: + if (Inp.repeat[INP_BUTTON_UP]) + { + focus--; // Up + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + } + if (Inp.repeat[INP_BUTTON_DOWN]) + { + focus++; // Down + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + } + + if (Inp.held[INP_BUTTON_MENU_CANCEL]==1 ) {action=0; menuExit=1;} + + if (Inp.repeat[INP_BUTTON_LEFT] || Inp.repeat[INP_BUTTON_RIGHT] ) + { + if (Inp.repeat[INP_BUTTON_LEFT]) + { + focus-=12; + smooth=(focus<<8)-1; + } + else if (Inp.repeat[INP_BUTTON_RIGHT]) + { + focus+=12; + smooth=(focus<<8)-1; + } + + if (focus>romCount-1) + { + focus=romCount-1; + smooth=(focus<<8)-1; + } + else if (focus<0) + { + focus=0; + smooth=(focus<<8)-1; + } + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + } + + if (focus>romCount-1) + { + focus=0; + smooth=(focus<<8)-1; + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + } + else if (focus<0) + { + focus=romCount-1; + smooth=(focus<<8)-1; + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + } + //if (defaultDir) lastSelected = focus; + if (Inp.held[INP_BUTTON_MENU_SELECT]==1) + { + switch(focus) + { + case 0: //Save default directory + SaveMenuOptions(snesOptionsDir, DEFAULT_ROM_DIR_FILENAME, DEFAULT_ROM_DIR_EXT, romDir, strlen(romDir),1); + strcpy(snesRomDir,romDir); + break; + + case 1: //Return to menu + action=0; + menuExit=1; + break; + + case 2: //Goto Parent Directory + // up a directory + //Remove a directory from RomPath and rescan + //Code below will never let you go further up than \SD Card\ on the Gizmondo + //This is by design. + for(i=strlen(romDir)-1;i>0;i--) // don't want to change first char in screen + { + if((romDir[i] == dirSep[0]) || (romDir[i] == dirSepBad[0])) + { + romDir[i] = 0; + break; + } + } + FileScan(); + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + focus=ROM_SELECTOR_DEFAULT_FOCUS; // default menu to non menu item + // just to stop directory scan being started + smooth=focus<<8; + memset(&headerDone,0,sizeof(headerDone)); //clear header + break; + + case ROM_SELECTOR_DEFAULT_FOCUS: //blank space - do nothing + break; + + default: + // normal file or dir selected + if (romList[focus].type == FILE_TYPE_DIRECTORY) + { + //Just check we are not in root dir as this will always have + //a trailing directory seperater which screws with things + sprintf(romDir,"%s%s%s",romDir,DIR_SEP,romList[focus].filename); + FileScan(); + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + focus=ROM_SELECTOR_DEFAULT_FOCUS; // default menu to non menu item + // just to stop directory scan being started + smooth=focus<<8; + } + else + { + // user has selected a rom, so load it + sprintf(currentRomFilename,romList[focus].filename); + quickSavePresent=0; // reset any quick saves + action=1; + menuExit=1; + } + break; + } + } + + if (Inp.held[INP_BUTTON_MENU_DELETE]==1) + { + if(focus>ROM_SELECTOR_DEFAULT_FOCUS) + { + //delete current rom + if (romList[focus].type != FILE_TYPE_DIRECTORY) + { + sprintf(text,"%s",romList[focus].filename); + + if(MenuMessageBox("Are you sure you want to delete",text,"",0)==0) + { + deleterom(focus); + RESET_NAME_SCROLL + RESET_SCREENSHOT_COUNTER + } + } + } + } + #define MAX_WIDTH (39 * 8) + + if (timeToScreenshot) timeToScreenshot--; + else if ((!bmpScreenshot) && (focus > ROM_SELECTOR_DEFAULT_FOCUS) && (!noScreenshot)) { + char png_fn[1024]; + char *ext; + gBITMAP *b; + // Compose focused filename + screenshots dir + snprintf(png_fn, sizeof(png_fn), "%s/%s", getScreenShotsDir(), romList[focus].filename); + // set file ext to .png + ext = strrchr(png_fn, '.'); + if (!ext) ext = &png_fn[strlen(png_fn)]; + strcpy(ext, ".png"); + // load screenshot + b = load_png(png_fn, NULL); + if (!b) noScreenshot = 1; + else { + unsigned int sh, sw; + sh = MENU_AREA_Y_END - MENU_AREA_Y_START - 2 + 1; + sw = (sh * b->w)/ b->h; + bmpScreenshot = gStretchBitmap(b, sw, sh); + gDestroyBitmap(b); + if (!bmpScreenshot) noScreenshot = 1; + else xScreenshot = SCREEN_WIDTH - 2; + } + } + + // Draw screen: + PrintTile(currFB); + PrintTitle(currFB); + sprintf(text,"%s:%s",mode?"Select Rom":"Delete Rom",romDir); + gp_setClipping(0, 0, 319, 239); + gp_drawString(6,35,strlen(text)>=40?39:strlen(text),text,tTextColorTitle,framebuffer16[currFB]); + //gp_setClipping(8, MENU_AREA_Y_START, 8 + MAX_WIDTH, MENU_AREA_Y_END); + + // Draw focused file's screenshot + if (bmpScreenshot) { + //unsigned int sh, sw; + //sh = MENU_AREA_Y_END - MENU_AREA_Y_START - 2 + 1; + //sw = (sh * bmpScreenshot->w)/ bmpScreenshot->h; + //gDrawScaledBitmap16(framebuffer16[currFB], xScreenshot, MENU_AREA_Y_START + 1, bmpScreenshot, sw, sh); + //if (xScreenshot > (SCREEN_WIDTH - sw - 4)) xScreenshot -= 2; + gDrawBitmap16(framebuffer16[currFB], xScreenshot, MENU_AREA_Y_START + 1, bmpScreenshot, 0, 0, bmpScreenshot->w, bmpScreenshot->h); + if (xScreenshot > (SCREEN_WIDTH - bmpScreenshot->w - 4)) xScreenshot -= 8; + } + + smooth=smooth*7+(focus<<8); smooth>>=3; + + scanstart=focus-15; + if (scanstart<0) scanstart=0; + scanend = focus+15; + if (scanend>romCount) scanend=romCount; + + for (i=scanstart;i>4); + x=8; + y+=112; + if (y<= (MENU_AREA_Y_START - 8) || y>=232) continue; + + gp_setClipping(8, MENU_AREA_Y_START, 8 + MAX_WIDTH, MENU_AREA_Y_END); + romname_length=strlen(romList[i].filename); + if (i==focus) + { + color=tTextColorFocus; + PrintBar(currFB,y-4); + if ((romname_length * 8) > MAX_WIDTH) { // let's scroll romname if length is bigger than screen width + if (frame == 0) txt_offset += txt_dir; // one of each 4 frames + if (txt_offset == 1) {txt_offset = 0; txt_dir = -1;} + if ((romname_length * 8 + txt_offset) < MAX_WIDTH) txt_dir = 1; + offset = txt_offset; + } + } + else + { + color=tTextColorItem; + if (bmpScreenshot) gp_setClipping(8, MENU_AREA_Y_START, xScreenshot - 1, MENU_AREA_Y_END); + } + + // Draw Directory icon if current entry is a directory + if(romList[i].type == FILE_TYPE_DIRECTORY) + { + gp_drawString(x-8,y,1,"+",color,framebuffer16[currFB]); + } + + gp_drawString(x + offset, y, romname_length,romList[i].filename,color,framebuffer16[currFB]); + } + gp_setClipping(0, 0, 319, 239); + frame = (frame + 1) & 3; + MenuFlip(); + } + + gDestroyBitmap(bmpScreenshot); + return action; +} + +static void ScanSaveStates(char *romname) +{ + FILE *stream; + int i=0; + char savename[MAX_PATH+1]; + char filename[MAX_PATH+1]; + char ext[MAX_PATH+1]; + + if(!strcmp(romname,saveStateName)) return; // is current save state rom so exit + + SplitFilename(romname,filename,ext); + + sprintf(savename,"%s.%s",filename,SAVESTATE_EXT); + + for(i=0;i<10;i++) + { + /* + need to build a save state filename + all saves are held in current working directory (snesSaveStateDir) + save filename has following format + shortname(minus file ext) + SV + saveno ( 0 to 9 ) + */ + sprintf(saveState[i].filename,"%s%d",savename,i); + sprintf(saveState[i].fullFilename,"%s%s%s",snesSaveStateDir,DIR_SEP,saveState[i].filename); + stream=(FILE*)fopen(saveState[i].fullFilename,"rb"); + if(stream) + { + // we have a savestate + saveState[i].inUse = 1; + fclose(stream); + } + else + { + // no save state + saveState[i].inUse = 0; + } + } + strcpy(saveStateName,romname); // save the last scanned romname +} + +void LoadStateFile(char *filename) +{ + S9xUnfreezeGame(filename); +} + +static void SaveStateFile(char *filename) +{ + S9xFreezeGame(filename); + sync(); +} + +static int SaveStateSelect(int mode) +{ + char text[128]; + int action=11; + int saveno=0; + + if(currentRomFilename[0]==0) + { + // no rom loaded + // display error message and exit + return(0); + } + + memset(&headerDone,0,sizeof(headerDone)); + ScanSaveStates(currentRomFilename); + + while (action!=0&&action!=100) + { + InputUpdate(0); + if(Inp.held[INP_BUTTON_UP]==1) {saveno--; action=1;} + if(Inp.held[INP_BUTTON_DOWN]==1) {saveno++; action=1;} + if(saveno<-1) saveno=9; + if(saveno>9) saveno=-1; + + if(Inp.held[INP_BUTTON_MENU_CANCEL]==1) action=0; // exit + else if((Inp.held[INP_BUTTON_MENU_SELECT]==1)&&(saveno==-1)) action=0; // exit + else if((Inp.held[INP_BUTTON_MENU_SELECT]==1)&&(mode==0)&&((action==2)||(action==5))) action=6; // pre-save mode + else if((Inp.held[INP_BUTTON_MENU_SELECT]==1)&&(mode==1)&&(action==5)) action=8; // pre-load mode + else if((Inp.held[INP_BUTTON_MENU_SELECT]==1)&&(mode==2)&&(action==5)) + { + if(MenuMessageBox("Are you sure you want to delete","this save?","",0)==0) action=13; //delete slot with no preview + } + //else if((Inp.held[INP_BUTTON_R]==1)&&(action==12)) action=3; // preview slot mode + else if((Inp.held[INP_BUTTON_MENU_SELECT]==1)&&(mode==1)&&(action==12)) action=8; //load slot with no preview + else if((Inp.held[INP_BUTTON_MENU_SELECT]==1)&&(mode==0)&&(action==12)) action=6; //save slot with no preview + else if((Inp.held[INP_BUTTON_MENU_SELECT]==1)&&(mode==2)&&(action==12)) + { + if(MenuMessageBox("Are you sure you want to delete","this save?","",0)==0) action=13; //delete slot with no preview + } + + PrintTile(currFB); + PrintTitle(currFB); + if(mode==SAVESTATE_MODE_SAVE) gp_drawString(6,35,10,"Save State",tTextColorTitle,framebuffer16[currFB]); + if(mode==SAVESTATE_MODE_LOAD) gp_drawString(6,35,10,"Load State",tTextColorTitle,framebuffer16[currFB]); + if(mode==SAVESTATE_MODE_DELETE) gp_drawString(6,35,12,"Delete State",tTextColorTitle,framebuffer16[currFB]); + sprintf(text,"Press UP and DOWN to change save slot"); + gp_drawString(12,230,strlen(text),text,(unsigned short)MENU_RGB(31,15,5),framebuffer16[currFB]); + + if(saveno==-1) + { + if(action!=10&&action!=0) + { + action=10; + } + } + else + { + PrintBar(currFB,60-4); + sprintf(text,"SLOT %d",saveno); + gp_drawString(136,60,strlen(text),text,tTextColorItem,framebuffer16[currFB]); + } + + switch(action) + { + case 1: + //gp_drawString(112,145,14,"Checking....",tTextColorItem,framebuffer16[currFB]); + break; + case 2: + gp_drawString(144,145,4,"FREE",tTextColorItem,framebuffer16[currFB]); + break; + case 3: + gp_drawString(104,145,14,"Previewing....",tTextColorItem,framebuffer16[currFB]); + break; + case 4: + gp_drawString(88,145,18,"Previewing....fail",tTextColorItem,framebuffer16[currFB]); + break; + case 5: + gp_drawString(112,145,17, "Not gonna happen!",tTextColorItem,framebuffer16[currFB]); + if(mode==1) gp_drawString((320-(strlen(MENU_TEXT_LOAD_SAVESTATE)<<3))>>1,210,strlen(MENU_TEXT_LOAD_SAVESTATE), MENU_TEXT_LOAD_SAVESTATE,tTextColorItem,framebuffer16[currFB]); + else if(mode==0) gp_drawString((320-(strlen(MENU_TEXT_OVERWRITE_SAVESTATE)<<3))>>1,210,strlen(MENU_TEXT_OVERWRITE_SAVESTATE), MENU_TEXT_OVERWRITE_SAVESTATE,tTextColorItem,framebuffer16[currFB]); + else if(mode==2) gp_drawString((320-(strlen(MENU_TEXT_DELETE_SAVESTATE)<<3))>>1,210,strlen(MENU_TEXT_DELETE_SAVESTATE), MENU_TEXT_DELETE_SAVESTATE,tTextColorItem,framebuffer16[currFB]); + break; + case 6: + gp_drawString(124,145,9,"Saving...",tTextColorItem,framebuffer16[currFB]); + break; + case 7: + gp_drawString(124,145,14,"Saving...Fail!",tTextColorItem,framebuffer16[currFB]); + break; + case 8: + gp_drawString(116,145,11,"loading....",tTextColorItem,framebuffer16[currFB]); + break; + case 9: + gp_drawString(116,145,15,"loading....Fail",tTextColorItem,framebuffer16[currFB]); + break; + case 10: + + PrintBar(currFB,145-4); + gp_drawString(104,145,14,"Return To Menu",tTextColorItem,framebuffer16[currFB]); + break; + case 12: + gp_drawString(124,145,9,"Slot used",tTextColorItem,framebuffer16[currFB]); + //gp_drawString((320-(strlen(MENU_TEXT_PREVIEW_SAVESTATE)<<3))>>1,165,strlen(MENU_TEXT_PREVIEW_SAVESTATE),MENU_TEXT_PREVIEW_SAVESTATE,tTextColorItem,framebuffer16[currFB]); + if(mode==1) gp_drawString((320-(strlen(MENU_TEXT_LOAD_SAVESTATE)<<3))>>1,175,strlen(MENU_TEXT_LOAD_SAVESTATE), MENU_TEXT_LOAD_SAVESTATE,tTextColorItem,framebuffer16[currFB]); + else if(mode==0) gp_drawString((320-(strlen(MENU_TEXT_OVERWRITE_SAVESTATE)<<3))>>1,175,strlen(MENU_TEXT_OVERWRITE_SAVESTATE), MENU_TEXT_OVERWRITE_SAVESTATE,tTextColorItem,framebuffer16[currFB]); + else if(mode==2) gp_drawString((320-(strlen(MENU_TEXT_DELETE_SAVESTATE)<<3))>>1,175,strlen(MENU_TEXT_DELETE_SAVESTATE), MENU_TEXT_DELETE_SAVESTATE,tTextColorItem,framebuffer16[currFB]); + break; + case 13: + gp_drawString(116,145,11,"Deleting....",tTextColorItem,framebuffer16[currFB]); + break; + } + + MenuFlip(); + + switch(action) + { + case 1: + if(saveState[saveno].inUse) + { + action=12; + } + else + { + action=2; + } + break; + case 3: + gp_setCpuspeed(MENU_FAST_CPU_SPEED); + LoadStateFile(saveState[saveno].fullFilename); + gp_setCpuspeed(MENU_CPU_SPEED); + action=5; + break; + case 6: + gp_setCpuspeed(MENU_FAST_CPU_SPEED); + SaveStateFile(saveState[saveno].fullFilename); + gp_setCpuspeed(MENU_CPU_SPEED); + saveState[saveno].inUse=1; + action=1; + break; + case 7: + action=1; + break; + case 8: + LoadStateFile(saveState[saveno].fullFilename); + action=100; // loaded ok so exit + break; + case 9: + action=1; + break; + case 11: + action=1; + break; + case 13: + remove(saveState[saveno].fullFilename); + sync(); + saveState[saveno].inUse = 0; + action=1; + break; + } + } + memset(&headerDone,0,sizeof(headerDone)); + return(action); +} + +static +void RenderMenu(char *menuName, int menuCount, int menuSmooth, int menufocus) +{ + int i=0; + char text[50]; + unsigned short color=0; + PrintTile(currFB); + PrintTitle(currFB); + + gp_setClipping(0, 0, 319, 239); + gp_drawString(6,35,strlen(menuName),menuName,tTextColorTitle,framebuffer16[currFB]); + gp_setClipping(8, MENU_AREA_Y_START, SCREEN_WIDTH - 8, MENU_AREA_Y_END); + + // RRRRRGGGGGBBBBBI gp32 color format + for (i=0;i>4); + x=8; + y+=112; + + if (y<= (MENU_AREA_Y_START - 8) || y>=232) continue; + + if (i==menufocus) + { + color=tTextColorFocus; + PrintBar(currFB,y-4); + } + else + { + color=tTextColorItem; + } + + sprintf(text,"%s",menutext[i]); + gp_drawString(x,y,strlen(text),text,color,framebuffer16[currFB]); + } + gp_setClipping(0, 0, 319, 239); +} + +static +int LoadRomMenu(void) +{ + int menuExit=0,menuCount=LOAD_ROM_MENU_COUNT,menufocus=0,menuSmooth=0; + int action=0; + int subaction=0; + + memset(&headerDone,0,sizeof(headerDone)); + strcpy(romDir,snesRomDir); + subaction=FileSelect(0); + memset(&headerDone,0,sizeof(headerDone)); + if(subaction) + { + action=EVENT_LOAD_SNES_ROM; + menuExit=1; + } + + return action; +} + +static +int SaveStateMenu(void) +{ + int menuExit=0,menuCount=SAVESTATE_MENU_COUNT,menufocus=0,menuSmooth=0; + int action=0; + int subaction=0; + + memset(&headerDone,0,sizeof(headerDone)); + + //Update + sprintf(menutext[SAVESTATE_MENU_LOAD],"Load State"); + sprintf(menutext[SAVESTATE_MENU_SAVE],"Save State"); + sprintf(menutext[SAVESTATE_MENU_DELETE],"Delete State"); + sprintf(menutext[SAVESTATE_MENU_RETURN],"Back"); + + while (!menuExit) + { + InputUpdate(0); + + // Change which rom is focused on: + if (Inp.repeat[INP_BUTTON_UP]) menufocus--; // Up + if (Inp.repeat[INP_BUTTON_DOWN]) menufocus++; // Down + + if (Inp.held[INP_BUTTON_MENU_CANCEL]==1 ) menuExit=1; + + if (menufocus>menuCount-1) + { + menufocus=0; + menuSmooth=(menufocus<<8)-1; + } + else if (menufocus<0) + { + menufocus=menuCount-1; + menuSmooth=(menufocus<<8)-1; + } + + if (Inp.held[INP_BUTTON_MENU_SELECT]==1) + { + switch(menufocus) + { + case SAVESTATE_MENU_LOAD: + subaction=SaveStateSelect(SAVESTATE_MODE_LOAD); + if(subaction==100) + { + menuExit=1; + action=100; + } + break; + case SAVESTATE_MENU_SAVE: + SaveStateSelect(SAVESTATE_MODE_SAVE); + break; + case SAVESTATE_MENU_DELETE: + SaveStateSelect(SAVESTATE_MODE_DELETE); + break; + case SAVESTATE_MENU_RETURN: + menuExit=1; + break; + } + } + // Draw screen: + menuSmooth=menuSmooth*7+(menufocus<<8); menuSmooth>>=3; + RenderMenu("Save States", menuCount,menuSmooth,menufocus); + MenuFlip(); + + } + + return action; +} + +static +int SramMenu(void) +{ + int menuExit=0,menuCount=SRAM_MENU_COUNT,menufocus=0,menuSmooth=0; + int action=0; + int subaction=0; + char *srammem=NULL; + + + memset(&headerDone,0,sizeof(headerDone)); + + //Update + sprintf(menutext[SRAM_MENU_LOAD],"Load SRAM"); + sprintf(menutext[SRAM_MENU_SAVE],"Save SRAM"); + sprintf(menutext[SRAM_MENU_DELETE],"Delete SRAM"); + sprintf(menutext[SRAM_MENU_RETURN],"Back"); + + while (!menuExit) + { + InputUpdate(0); + + // Change which rom is focused on: + if (Inp.repeat[INP_BUTTON_UP]) menufocus--; // Up + if (Inp.repeat[INP_BUTTON_DOWN]) menufocus++; // Down + + if (Inp.held[INP_BUTTON_MENU_CANCEL]==1 ) menuExit=1; + + if (menufocus>menuCount-1) + { + menufocus=0; + menuSmooth=(menufocus<<8)-1; + } + else if (menufocus<0) + { + menufocus=menuCount-1; + menuSmooth=(menufocus<<8)-1; + } + + if (Inp.held[INP_BUTTON_MENU_SELECT]==1) + { + switch(menufocus) + { + case SRAM_MENU_LOAD: + //LoadSram(snesSramDir,currentRomFilename,SRAM_FILE_EXT,(char*)&sram); + break; + case SRAM_MENU_SAVE: + //SaveSram(snesSramDir,currentRomFilename,SRAM_FILE_EXT,(char*)&sram); + break; + case SRAM_MENU_DELETE: + //DeleteSram(snesSramDir,currentRomFilename,SRAM_FILE_EXT); + break; + case SRAM_MENU_RETURN: + menuExit=1; + break; + } + } + // Draw screen: + menuSmooth=menuSmooth*7+(menufocus<<8); menuSmooth>>=3; + RenderMenu("SRAM", menuCount,menuSmooth,menufocus); + MenuFlip(); + + } + + return action; +} + +static +void SNESOptionsUpdateText(int menu_index) +{ + switch(menu_index) + { + case SNES_MENU_SOUND: + switch(snesMenuOptions.soundOn) + { + case 0: + sprintf(menutext[SNES_MENU_SOUND],"Sound: OFF"); + break; + case 1: + sprintf(menutext[SNES_MENU_SOUND],"Sound: ON"); + break; + } + break; + + case SNES_MENU_SOUND_RATE: + if (snesMenuOptions.stereo) + sprintf(menutext[SNES_MENU_SOUND_RATE],"Sound Rate: %d stereo",(unsigned int)soundRates[snesMenuOptions.soundRate]); + else + sprintf(menutext[SNES_MENU_SOUND_RATE],"Sound Rate: %d mono",(unsigned int)soundRates[snesMenuOptions.soundRate]); + break; +#if defined(__GP2X__) || defined(__WIZ__) + case SNES_MENU_CPUSPEED: + sprintf(menutext[SNES_MENU_CPUSPEED],"Cpu Speed: %d",(unsigned int)cpuSpeedLookup[snesMenuOptions.cpuSpeed]); + break; +#endif + case SNES_MENU_SOUND_VOL: + sprintf(menutext[SNES_MENU_SOUND_VOL],"Volume: %d",snesMenuOptions.volume); + break; + + case SNES_MENU_FRAMESKIP: + switch(snesMenuOptions.frameSkip) + { + case 0: + sprintf(menutext[SNES_MENU_FRAMESKIP],"Frameskip: AUTO"); + break; + default: + sprintf(menutext[SNES_MENU_FRAMESKIP],"Frameskip: %d",snesMenuOptions.frameSkip-1); + break; + } + break; + + case SNES_MENU_REGION: + switch(snesMenuOptions.region) + { + case 0: + sprintf(menutext[SNES_MENU_REGION],"Region: AUTO"); + break; + case 1: + sprintf(menutext[SNES_MENU_REGION],"Region: NTSC"); + break; + case 2: + sprintf(menutext[SNES_MENU_REGION],"Region: PAL"); + break; + } + break; + + case SNES_MENU_FPS: + switch(snesMenuOptions.showFps) + { + case 0: + sprintf(menutext[SNES_MENU_FPS],"Show FPS: OFF"); + break; + case 1: + sprintf(menutext[SNES_MENU_FPS],"Show FPS: ON"); + break; + } + break; +#if defined(__GP2X__) + case SNES_MENU_GAMMA: + sprintf(menutext[SNES_MENU_GAMMA],"Brightness: %d",snesMenuOptions.gamma+100); + break; +#endif + case SNES_MENU_TRANSPARENCY: + switch(snesMenuOptions.transparency) + { + case 0: + sprintf(menutext[SNES_MENU_TRANSPARENCY],"Transparencies: OFF"); + break; + case 1: + sprintf(menutext[SNES_MENU_TRANSPARENCY],"Transparencies: ON"); + break; + } + break; + + case SNES_MENU_LOAD_GLOBAL: + sprintf(menutext[SNES_MENU_LOAD_GLOBAL],"Load Global Settings"); + break; + + case SNES_MENU_SAVE_GLOBAL: + sprintf(menutext[SNES_MENU_SAVE_GLOBAL],"Save Global Settings"); + break; + + case SNES_MENU_DELETE_GLOBAL: + sprintf(menutext[SNES_MENU_DELETE_GLOBAL],"Delete Global Settings"); + break; + + case SNES_MENU_LOAD_CURRENT: + sprintf(menutext[SNES_MENU_LOAD_CURRENT],"Load Settings For Current Game"); + break; + + case SNES_MENU_SAVE_CURRENT: + sprintf(menutext[SNES_MENU_SAVE_CURRENT],"Save Settings For Current Game"); + break; + + case SNES_MENU_DELETE_CURRENT: + sprintf(menutext[SNES_MENU_DELETE_CURRENT],"Delete Settings For Current Game"); + break; + + case SNES_MENU_SET_ROMDIR: + sprintf(menutext[SNES_MENU_SET_ROMDIR],"Save Current Rom Directory"); + break; + + case SNES_MENU_CLEAR_ROMDIR: + sprintf(menutext[SNES_MENU_CLEAR_ROMDIR],"Reset Default Rom Directory"); + break; + + case SNES_MENU_RETURN: + sprintf(menutext[SNES_MENU_RETURN],"Back"); + break; +#if defined(__GP2X__) || defined(__WIZ__) + case SNES_MENU_RENDER_MODE: + switch(snesMenuOptions.renderMode) + { + case RENDER_MODE_UNSCALED: + sprintf(menutext[SNES_MENU_RENDER_MODE],"Render Mode: Unscaled"); + break; + case RENDER_MODE_SCALED: + sprintf(menutext[SNES_MENU_RENDER_MODE],"Render Mode: Scaled"); + break; + case RENDER_MODE_HORIZONTAL_SCALED: + sprintf(menutext[SNES_MENU_RENDER_MODE],"Render Mode: Horizontal Scaled"); + break; + default: + sprintf(menutext[SNES_MENU_RENDER_MODE],"Render Mode: Unscaled"); + break; + } + break; + case SNES_MENU_ACTION_BUTTONS: + switch(snesMenuOptions.actionButtons) + { + case 0: + sprintf(menutext[SNES_MENU_ACTION_BUTTONS],"Action Buttons: Normal"); + break; + case 1: + sprintf(menutext[SNES_MENU_ACTION_BUTTONS],"Action Buttons: Swapped"); + break; + } + break; +#endif + case SNES_MENU_AUTO_SAVE_SRAM: + switch(snesMenuOptions.autoSram) + { + case 0: + sprintf(menutext[SNES_MENU_AUTO_SAVE_SRAM],"Saving SRAM: Manual"); + break; + case 1: + sprintf(menutext[SNES_MENU_AUTO_SAVE_SRAM],"Saving SRAM: Automatic"); + break; + case 2: + sprintf(menutext[SNES_MENU_AUTO_SAVE_SRAM],"Saving SRAM: Manual + indicator"); + break; + } + break; + case SNES_MENU_EMULATION_TYPE: + switch(snesMenuOptions.asmspc700) + { + case 0: + sprintf(menutext[SNES_MENU_EMULATION_TYPE],"Emulation (Reset Required): Compatible"); + break; + case 1: + sprintf(menutext[SNES_MENU_EMULATION_TYPE],"Emulation (Reset Required): Fast"); + break; + } + break; + case SNES_MENU_LOAD_ROM_ON_INIT: + switch(snesMenuOptions.loadOnInit) + { + case 0: + sprintf(menutext[SNES_MENU_LOAD_ROM_ON_INIT],"Load last played ROM at startup: OFF"); + break; + case 1: + sprintf(menutext[SNES_MENU_LOAD_ROM_ON_INIT],"Load last played ROM at startup: ON"); + break; + } + break; + case SNES_MENU_ADVANCED_HACKS: + sprintf(menutext[SNES_MENU_ADVANCED_HACKS],"Advanced hacks"); + break; + } +} + +static +void SNESHacksUpdateText(int menu_index) +{ + switch(menu_index) + { + case HACKS_MENU_SNESADVANCE_DAT: + if (snesMenuOptions.SpeedHacks) + sprintf(menutext[HACKS_MENU_SNESADVANCE_DAT],"Apply snesadvance.dat on ROM load: ON"); + else + sprintf(menutext[HACKS_MENU_SNESADVANCE_DAT],"Apply snesadvance.dat on ROM load: OFF"); + break; + case HACKS_MENU_AUDIO: + if(snesMenuOptions.soundHack) + sprintf(menutext[HACKS_MENU_AUDIO],"Audio Performance hack: ON"); + else + sprintf(menutext[HACKS_MENU_AUDIO],"Audio Performance hack: OFF"); + break; +#ifdef __OLD_RASTER_FX__ + case HACKS_MENU_DELAYED_RASTER_FX: + sprintf(menutext[HACKS_MENU_DELAYED_RASTER_FX], "Delayed Raster FX: %s", snesMenuOptions.delayedRasterFX ? "ON" : "OFF"); + break; +#endif + case HACKS_MENU_PALETTE: + if(snesMenuOptions.graphHacks & PPU_IGNORE_PALWRITE) + sprintf(menutext[HACKS_MENU_PALETTE],"Ignore Palette writes: ON"); + else + sprintf(menutext[HACKS_MENU_PALETTE],"Ignore Palette writes: OFF"); + break; + case HACKS_MENU_FIXEDCOL: + if(snesMenuOptions.graphHacks & PPU_IGNORE_FIXEDCOLCHANGES) + sprintf(menutext[HACKS_MENU_FIXEDCOL],"Ignore Fixed Colour: ON"); + else + sprintf(menutext[HACKS_MENU_FIXEDCOL],"Ignore Fixed Colour: OFF"); + break; + case HACKS_MENU_WINDOW: + if(snesMenuOptions.graphHacks & PPU_IGNORE_WINDOW) + sprintf(menutext[HACKS_MENU_WINDOW],"Ignore Windows clipping: ON"); + else + sprintf(menutext[HACKS_MENU_WINDOW],"Ignore Windows clipping: OFF"); + break; + case HACKS_MENU_ADDSUB: + if(snesMenuOptions.graphHacks & PPU_IGNORE_ADDSUB) + sprintf(menutext[HACKS_MENU_ADDSUB],"Ignore Add/Sub modes: ON"); + else + sprintf(menutext[HACKS_MENU_ADDSUB],"Ignore Add/Sub modes: OFF"); + break; + case HACKS_MENU_OBJ: + if(snesMenuOptions.graphHacks & GFX_IGNORE_OBJ) + sprintf(menutext[HACKS_MENU_OBJ],"Ignore objects layer: ON"); + else + sprintf(menutext[HACKS_MENU_OBJ],"Ignore objects layer: OFF"); + break; + case HACKS_MENU_BG0: + if(snesMenuOptions.graphHacks & GFX_IGNORE_BG0) + sprintf(menutext[HACKS_MENU_BG0],"Ignore background layer 0: ON"); + else + sprintf(menutext[HACKS_MENU_BG0],"Ignore background layer 0: OFF"); + break; + case HACKS_MENU_BG1: + if(snesMenuOptions.graphHacks & GFX_IGNORE_BG1) + sprintf(menutext[HACKS_MENU_BG1],"Ignore background layer 1: ON"); + else + sprintf(menutext[HACKS_MENU_BG1],"Ignore background layer 1: OFF"); + break; + case HACKS_MENU_BG2: + if(snesMenuOptions.graphHacks & GFX_IGNORE_BG2) + sprintf(menutext[HACKS_MENU_BG2],"Ignore background layer 2: ON"); + else + sprintf(menutext[HACKS_MENU_BG2],"Ignore background layer 2: OFF"); + break; + case HACKS_MENU_BG3: + if(snesMenuOptions.graphHacks & GFX_IGNORE_BG3) + sprintf(menutext[HACKS_MENU_BG3],"Ignore background layer 3: ON"); + else + sprintf(menutext[HACKS_MENU_BG3],"Ignore background layer 3: OFF"); + break; + case HACKS_MENU_RETURN: + sprintf(menutext[HACKS_MENU_RETURN],"Back"); + break; + + + } +} + +static +void SNESHacksUpdateText_All() +{ + SNESHacksUpdateText(HACKS_MENU_AUDIO); + SNESHacksUpdateText(HACKS_MENU_SNESADVANCE_DAT); +#ifdef __OLD_RASTER_FX__ + SNESHacksUpdateText(HACKS_MENU_DELAYED_RASTER_FX); +#endif + SNESHacksUpdateText(HACKS_MENU_PALETTE); + SNESHacksUpdateText(HACKS_MENU_FIXEDCOL); + SNESHacksUpdateText(HACKS_MENU_WINDOW); + SNESHacksUpdateText(HACKS_MENU_ADDSUB); + SNESHacksUpdateText(HACKS_MENU_OBJ); + SNESHacksUpdateText(HACKS_MENU_BG0); + SNESHacksUpdateText(HACKS_MENU_BG1); + SNESHacksUpdateText(HACKS_MENU_BG2); + SNESHacksUpdateText(HACKS_MENU_BG3); + SNESHacksUpdateText(HACKS_MENU_RETURN); +} + +static +int SNESHacksMenu(void) +{ + int menuExit=0,menuCount=HACKS_MENU_COUNT,menufocus=0,menuSmooth=0; + int action=0; + int subaction=0; + + memset(&headerDone,0,sizeof(headerDone)); + + //Update all items + SNESHacksUpdateText_All(); + + while (!menuExit) + { + InputUpdate(0); + + // Change which rom is focused on: + if (Inp.repeat[INP_BUTTON_UP]) menufocus--; // Up + if (Inp.repeat[INP_BUTTON_DOWN]) menufocus++; // Down + + if (Inp.held[INP_BUTTON_MENU_CANCEL]==1 ) menuExit=1; + + if (menufocus>menuCount-1) + { + menufocus=0; + menuSmooth=(menufocus<<8)-1; + } + else if (menufocus<0) + { + menufocus=menuCount-1; + menuSmooth=(menufocus<<8)-1; + + } + + if (Inp.held[INP_BUTTON_LEFT]==1|| + Inp.held[INP_BUTTON_RIGHT]==1|| + Inp.repeat[INP_BUTTON_LEFT]|| + Inp.repeat[INP_BUTTON_RIGHT]) + { + switch(menufocus) + { + case HACKS_MENU_SNESADVANCE_DAT: + snesMenuOptions.SpeedHacks^=1; + SNESHacksUpdateText(HACKS_MENU_SNESADVANCE_DAT); + break; + case HACKS_MENU_AUDIO: + snesMenuOptions.soundHack^=1; + SNESHacksUpdateText(HACKS_MENU_AUDIO); + break; +#ifdef __OLD_RASTER_FX__ + case HACKS_MENU_DELAYED_RASTER_FX: + snesMenuOptions.delayedRasterFX ^= 1; + SNESHacksUpdateText(HACKS_MENU_DELAYED_RASTER_FX); + break; +#endif + case HACKS_MENU_PALETTE: + if (snesMenuOptions.graphHacks & PPU_IGNORE_PALWRITE) + snesMenuOptions.graphHacks &= ~PPU_IGNORE_PALWRITE; + else + snesMenuOptions.graphHacks |= PPU_IGNORE_PALWRITE; + SNESHacksUpdateText(HACKS_MENU_PALETTE); + break; + case HACKS_MENU_FIXEDCOL: + if (snesMenuOptions.graphHacks & PPU_IGNORE_FIXEDCOLCHANGES) + snesMenuOptions.graphHacks &= ~PPU_IGNORE_FIXEDCOLCHANGES; + else + snesMenuOptions.graphHacks |= PPU_IGNORE_FIXEDCOLCHANGES; + SNESHacksUpdateText(HACKS_MENU_FIXEDCOL); + break; + case HACKS_MENU_WINDOW: + if (snesMenuOptions.graphHacks & PPU_IGNORE_WINDOW) + snesMenuOptions.graphHacks &= ~PPU_IGNORE_WINDOW; + else + snesMenuOptions.graphHacks |= PPU_IGNORE_WINDOW; + SNESHacksUpdateText(HACKS_MENU_WINDOW); + break; + case HACKS_MENU_ADDSUB: + if (snesMenuOptions.graphHacks & PPU_IGNORE_ADDSUB) + snesMenuOptions.graphHacks &= ~PPU_IGNORE_ADDSUB; + else + snesMenuOptions.graphHacks |= PPU_IGNORE_ADDSUB; + SNESHacksUpdateText(HACKS_MENU_ADDSUB); + + break; + case HACKS_MENU_OBJ: + if (snesMenuOptions.graphHacks & GFX_IGNORE_OBJ) + snesMenuOptions.graphHacks &= ~GFX_IGNORE_OBJ; + else + snesMenuOptions.graphHacks |= GFX_IGNORE_OBJ; + SNESHacksUpdateText(HACKS_MENU_OBJ); + break; + case HACKS_MENU_BG0: + if (snesMenuOptions.graphHacks & GFX_IGNORE_BG0) + snesMenuOptions.graphHacks &= ~GFX_IGNORE_BG0; + else + snesMenuOptions.graphHacks |= GFX_IGNORE_BG0; + SNESHacksUpdateText(HACKS_MENU_BG0); + break; + case HACKS_MENU_BG1: + if (snesMenuOptions.graphHacks & GFX_IGNORE_BG1) + snesMenuOptions.graphHacks &= ~GFX_IGNORE_BG1; + else + snesMenuOptions.graphHacks |= GFX_IGNORE_BG1; + SNESHacksUpdateText(HACKS_MENU_BG1); + break; + case HACKS_MENU_BG2: + if (snesMenuOptions.graphHacks & GFX_IGNORE_BG2) + snesMenuOptions.graphHacks &= ~GFX_IGNORE_BG2; + else + snesMenuOptions.graphHacks |= GFX_IGNORE_BG2; + SNESHacksUpdateText(HACKS_MENU_BG2); + break; + case HACKS_MENU_BG3: + if (snesMenuOptions.graphHacks & GFX_IGNORE_BG3) + snesMenuOptions.graphHacks &= ~GFX_IGNORE_BG3; + else + snesMenuOptions.graphHacks |= GFX_IGNORE_BG3; + SNESHacksUpdateText(HACKS_MENU_BG3); + break; + } + } + if (Inp.held[INP_BUTTON_MENU_SELECT]==1) + { + switch(menufocus) + { + case HACKS_MENU_RETURN: + menuExit=1; + break; + } + } + // Draw screen: + menuSmooth=menuSmooth*7+(menufocus<<8); menuSmooth>>=3; + RenderMenu("SNES Advanced Hacks", menuCount,menuSmooth,menufocus); + MenuFlip(); + + } + + return action; +} + +static +void SNESOptionsUpdateText_All() +{ + SNESOptionsUpdateText(SNES_MENU_SOUND); + SNESOptionsUpdateText(SNES_MENU_SOUND_RATE); + SNESOptionsUpdateText(SNES_MENU_SOUND_VOL); + SNESOptionsUpdateText(SNES_MENU_FRAMESKIP); + SNESOptionsUpdateText(SNES_MENU_REGION); + SNESOptionsUpdateText(SNES_MENU_FPS); + SNESOptionsUpdateText(SNES_MENU_TRANSPARENCY); + SNESOptionsUpdateText(SNES_MENU_LOAD_GLOBAL); + SNESOptionsUpdateText(SNES_MENU_SAVE_GLOBAL); + SNESOptionsUpdateText(SNES_MENU_DELETE_GLOBAL); + SNESOptionsUpdateText(SNES_MENU_LOAD_CURRENT); + SNESOptionsUpdateText(SNES_MENU_SAVE_CURRENT); + SNESOptionsUpdateText(SNES_MENU_DELETE_CURRENT); + SNESOptionsUpdateText(SNES_MENU_SET_ROMDIR); + SNESOptionsUpdateText(SNES_MENU_CLEAR_ROMDIR); + SNESOptionsUpdateText(SNES_MENU_RETURN); +#if defined(__GP2X__) || defined(__WIZ__) + SNESOptionsUpdateText(SNES_MENU_RENDER_MODE); + SNESOptionsUpdateText(SNES_MENU_CPUSPEED); + SNESOptionsUpdateText(SNES_MENU_ACTION_BUTTONS); +#endif +#if defined(__GP2X__) + SNESOptionsUpdateText(SNES_MENU_GAMMA); +#endif + SNESOptionsUpdateText(SNES_MENU_EMULATION_TYPE); + SNESOptionsUpdateText(SNES_MENU_AUTO_SAVE_SRAM); + SNESOptionsUpdateText(SNES_MENU_LOAD_ROM_ON_INIT); + SNESOptionsUpdateText(SNES_MENU_ADVANCED_HACKS); +} + +static +int SNESOptionsMenu(void) +{ + int menuExit=0,menuCount=SNES_MENU_COUNT,menufocus=0,menuSmooth=0; + int action=0; + int subaction=0; + + memset(&headerDone,0,sizeof(headerDone)); + + //Update all items + SNESOptionsUpdateText_All(); + + while (!menuExit) + { + InputUpdate(0); + + // Change which rom is focused on: + if (Inp.repeat[INP_BUTTON_UP]) menufocus--; // Up + if (Inp.repeat[INP_BUTTON_DOWN]) menufocus++; // Down + + if (Inp.held[INP_BUTTON_MENU_CANCEL]==1 ) menuExit=1; + + if (menufocus>menuCount-1) + { + menufocus=0; + menuSmooth=(menufocus<<8)-1; + } + else if (menufocus<0) + { + menufocus=menuCount-1; + menuSmooth=(menufocus<<8)-1; + } + + if (Inp.held[INP_BUTTON_LEFT]==1|| + Inp.held[INP_BUTTON_RIGHT]==1|| + Inp.repeat[INP_BUTTON_LEFT]|| + Inp.repeat[INP_BUTTON_RIGHT]) + { + switch(menufocus) + { + case SNES_MENU_SOUND: + snesMenuOptions.soundOn^=1; + SNESOptionsUpdateText(SNES_MENU_SOUND); + break; + case SNES_MENU_SOUND_RATE: + if (Inp.held[INP_BUTTON_RIGHT]==1||Inp.repeat[INP_BUTTON_RIGHT]) + { + if (!snesMenuOptions.stereo) + snesMenuOptions.stereo = 1; + else + { + snesMenuOptions.soundRate++; + snesMenuOptions.stereo = 0; + } +#if defined(__WIZ__) + if(snesMenuOptions.soundRate>2) snesMenuOptions.soundRate=0; +#else + if(snesMenuOptions.soundRate>4) snesMenuOptions.soundRate=0; +#endif + } + else + { + if (snesMenuOptions.stereo) + snesMenuOptions.stereo = 0; + else + { + snesMenuOptions.soundRate--; + snesMenuOptions.stereo = 1; + } +#if defined(__WIZ__) + if(snesMenuOptions.soundRate>2) snesMenuOptions.soundRate=2; +#else + if(snesMenuOptions.soundRate>4) snesMenuOptions.soundRate=4; +#endif + } + SNESOptionsUpdateText(SNES_MENU_SOUND_RATE); + break; + case SNES_MENU_SOUND_VOL: + if (Inp.held[INP_BUTTON_RIGHT]==1||Inp.repeat[INP_BUTTON_RIGHT]) + { + snesMenuOptions.volume+=1; + if(snesMenuOptions.volume>100) snesMenuOptions.volume=0; + } + else + { + snesMenuOptions.volume-=1; + if(snesMenuOptions.volume>100) snesMenuOptions.volume=100; + } + SNESOptionsUpdateText(SNES_MENU_SOUND_VOL); + break; +#if defined(__GP2X__) || defined(__WIZ__) + case SNES_MENU_CPUSPEED: + if (Inp.held[INP_BUTTON_RIGHT]==1||Inp.repeat[INP_BUTTON_RIGHT]) + { + snesMenuOptions.cpuSpeed++; + if(snesMenuOptions.cpuSpeed>45) snesMenuOptions.cpuSpeed=0; + } + else + { + snesMenuOptions.cpuSpeed--; + if(snesMenuOptions.cpuSpeed>45) snesMenuOptions.cpuSpeed=45; + } + SNESOptionsUpdateText(SNES_MENU_CPUSPEED); + break; +#endif + case SNES_MENU_FRAMESKIP: + if (Inp.held[INP_BUTTON_RIGHT]==1||Inp.repeat[INP_BUTTON_RIGHT]) + { + snesMenuOptions.frameSkip++; + if(snesMenuOptions.frameSkip>6) snesMenuOptions.frameSkip=0; + } + else + { + snesMenuOptions.frameSkip--; + if(snesMenuOptions.frameSkip>6) snesMenuOptions.frameSkip=6; + } + SNESOptionsUpdateText(SNES_MENU_FRAMESKIP); + break; + case SNES_MENU_REGION: + if (Inp.held[INP_BUTTON_RIGHT]==1||Inp.repeat[INP_BUTTON_RIGHT]) + { + snesMenuOptions.region++; + if(snesMenuOptions.region>2) snesMenuOptions.region=0; + } + else + { + snesMenuOptions.region--; + if(snesMenuOptions.region>2) snesMenuOptions.region=2; + } + SNESOptionsUpdateText(SNES_MENU_REGION); + break; + case SNES_MENU_FPS: + snesMenuOptions.showFps^=1; + SNESOptionsUpdateText(SNES_MENU_FPS); + break; +#if defined(__GP2X__) + case SNES_MENU_GAMMA: + if (Inp.held[INP_BUTTON_RIGHT]==1||Inp.repeat[INP_BUTTON_RIGHT]) + { + snesMenuOptions.gamma++; + if(snesMenuOptions.gamma>100) snesMenuOptions.gamma=100; + } + else + { + snesMenuOptions.gamma--; + if(snesMenuOptions.gamma<-100) snesMenuOptions.gamma=-100; + } + set_gamma(snesMenuOptions.gamma+100); + SNESOptionsUpdateText(SNES_MENU_GAMMA); + break; +#endif +#if defined(__GP2X__) || defined(__WIZ__) + case SNES_MENU_ACTION_BUTTONS: + snesMenuOptions.actionButtons^=1; + SNESOptionsUpdateText(SNES_MENU_ACTION_BUTTONS); + break; +#endif + case SNES_MENU_TRANSPARENCY: + snesMenuOptions.transparency^=1; + SNESOptionsUpdateText(SNES_MENU_TRANSPARENCY); + break; +#if defined(__GP2X__) || defined(__WIZ__) + case SNES_MENU_RENDER_MODE: + if (Inp.held[INP_BUTTON_RIGHT]==1||Inp.repeat[INP_BUTTON_RIGHT]) + { + snesMenuOptions.renderMode++; + if (snesMenuOptions.renderMode > RENDER_MODE_HORIZONTAL_SCALED) + snesMenuOptions.renderMode = RENDER_MODE_UNSCALED; + } + else + { + snesMenuOptions.renderMode--; + if (snesMenuOptions.renderMode > RENDER_MODE_HORIZONTAL_SCALED) + snesMenuOptions.renderMode = RENDER_MODE_HORIZONTAL_SCALED; + } + SNESOptionsUpdateText(SNES_MENU_RENDER_MODE); + break; +#endif + case SNES_MENU_AUTO_SAVE_SRAM: + //snesMenuOptions.autoSram^=1; + if ((++snesMenuOptions.autoSram) > 2) snesMenuOptions.autoSram = 0; + SNESOptionsUpdateText(SNES_MENU_AUTO_SAVE_SRAM); + break; + case SNES_MENU_EMULATION_TYPE: + snesMenuOptions.asmspc700^=1; + SNESOptionsUpdateText(SNES_MENU_EMULATION_TYPE); + break; + case SNES_MENU_LOAD_ROM_ON_INIT: + snesMenuOptions.loadOnInit ^= 1; + SNESOptionsUpdateText(SNES_MENU_LOAD_ROM_ON_INIT); + break; + + } + } + if (Inp.held[INP_BUTTON_MENU_SELECT]==1) + { + switch(menufocus) + { + case SNES_MENU_ADVANCED_HACKS: + memset(&headerDone,0,sizeof(headerDone)); + subaction = SNESHacksMenu(); + memset(&headerDone,0,sizeof(headerDone)); + SNESOptionsUpdateText_All(); + break; + case SNES_MENU_LOAD_GLOBAL: + LoadMenuOptions(snesOptionsDir, MENU_OPTIONS_FILENAME, MENU_OPTIONS_EXT, (char*)&snesMenuOptions, sizeof(snesMenuOptions),1); + SNESOptionsUpdateText_All(); + break; + case SNES_MENU_SAVE_GLOBAL: + SaveMenuOptions(snesOptionsDir, MENU_OPTIONS_FILENAME, MENU_OPTIONS_EXT, (char*)&snesMenuOptions, sizeof(snesMenuOptions),1); + break; + case SNES_MENU_DELETE_GLOBAL: + DeleteMenuOptions(snesOptionsDir,MENU_OPTIONS_FILENAME,MENU_OPTIONS_EXT,1); + break; + case SNES_MENU_LOAD_CURRENT: + if(currentRomFilename[0]!=0) + { + LoadMenuOptions(snesOptionsDir, currentRomFilename, MENU_OPTIONS_EXT, (char*)&snesMenuOptions, sizeof(snesMenuOptions),1); + SNESOptionsUpdateText_All(); + } + break; + case SNES_MENU_SAVE_CURRENT: + if(currentRomFilename[0]!=0) + { + SaveMenuOptions(snesOptionsDir, currentRomFilename, MENU_OPTIONS_EXT, (char*)&snesMenuOptions, sizeof(snesMenuOptions),1); + } + break; + case SNES_MENU_DELETE_CURRENT: + if(currentRomFilename[0]!=0) + { + DeleteMenuOptions(snesOptionsDir, currentRomFilename, MENU_OPTIONS_EXT,1); + } + break; + case SNES_MENU_SET_ROMDIR: + SaveMenuOptions(snesOptionsDir, DEFAULT_ROM_DIR_FILENAME, DEFAULT_ROM_DIR_EXT, romDir, strlen(romDir),1); + strcpy(snesRomDir,romDir); + break; + case SNES_MENU_CLEAR_ROMDIR: + DeleteMenuOptions(snesOptionsDir, DEFAULT_ROM_DIR_FILENAME, DEFAULT_ROM_DIR_EXT,1); + strcpy(snesRomDir,currentWorkingDir); + break; + case SNES_MENU_RETURN: + menuExit=1; + break; + } + } + // Draw screen: + menuSmooth=menuSmooth*7+(menufocus<<8); menuSmooth>>=3; + RenderMenu("SNES Options", menuCount,menuSmooth,menufocus); + MenuFlip(); + + } + + return action; +} + +static int screenshotSaved; +static void MainMenuUpdateText(void) +{ + sprintf(menutext[MAIN_MENU_ROM_SELECT],"Select Rom"); + sprintf(menutext[MAIN_MENU_MANAGE_SAVE_STATE],"Manage Save States"); + sprintf(menutext[MAIN_MENU_SAVE_SRAM],"Save SRAM"); + if (!screenshotSaved) sprintf(menutext[MAIN_MENU_SAVE_SCREENSHOT],"Save Screenshot"); + else sprintf(menutext[MAIN_MENU_SAVE_SCREENSHOT],"[Screenshot already saved]"); + sprintf(menutext[MAIN_MENU_SNES_OPTIONS],"SNES Options"); + sprintf(menutext[MAIN_MENU_RESET_GAME],"Reset Game"); + sprintf(menutext[MAIN_MENU_EXIT_APP],"Exit Application"); + sprintf(menutext[MAIN_MENU_RETURN],"Return To Game"); +} + + +int MainMenu(int prevaction) +{ + int menuExit=0,menuCount=MAIN_MENU_COUNT,menufocus=0,menuSmooth=0; + int action=prevaction; + int subaction=0; + screenshotSaved = 0; + + gp_setCpuspeed(MENU_CPU_SPEED); + + gp_initGraphics(16,currFB,1); + gp_clearFramebuffer16((unsigned short*)framebuffer16[currFB],0x0); + MenuFlip(); +#if !defined(__WIZ__) + gp_video_RGB_setscaling(320,240); +#endif + + memset(&headerDone,0,sizeof(headerDone)); + MainMenuUpdateText(); + + while (!menuExit) + { + InputUpdate(0); + + // Change which rom is focused on: + if (Inp.repeat[INP_BUTTON_UP]) menufocus--; // Up + if (Inp.repeat[INP_BUTTON_DOWN]) menufocus++; // Down + + if (Inp.held[INP_BUTTON_MENU_CANCEL]==1 ) + { + if(currentRomFilename[0]!=0) + { + menuExit=1; + } + } + + if (menufocus>menuCount-1) + { + menufocus=0; + menuSmooth=(menufocus<<8)-1; + } + else if (menufocus<0) + { + menufocus=menuCount-1; + menuSmooth=(menufocus<<8)-1; + } + + if (Inp.held[INP_BUTTON_MENU_SELECT]==1) + { + switch(menufocus) + { + case MAIN_MENU_ROM_SELECT: + memset(&headerDone,0,sizeof(headerDone)); + subaction=LoadRomMenu(); + memset(&headerDone,0,sizeof(headerDone)); + if(subaction) + { + action=subaction; + menuExit=1; + } + MainMenuUpdateText(); + break; + + case MAIN_MENU_MANAGE_SAVE_STATE: + if(currentRomFilename[0]!=0) + { + memset(&headerDone,0,sizeof(headerDone)); + subaction=SaveStateMenu(); + if (subaction==100) + { + menuExit=1; + } + memset(&headerDone,0,sizeof(headerDone)); + } + MainMenuUpdateText(); + break; + case MAIN_MENU_SAVE_SRAM: + if(currentRomFilename[0]!=0) + { + S9xSaveSRAM(); + } + break; + case MAIN_MENU_SNES_OPTIONS: + + memset(&headerDone,0,sizeof(headerDone)); + subaction=SNESOptionsMenu(); + memset(&headerDone,0,sizeof(headerDone)); + MainMenuUpdateText(); + break; + case MAIN_MENU_SAVE_SCREENSHOT: + if (!screenshotSaved) { + ShowMessage("Saving screenshot...", 1); + if (saveScreenShot() == 0) { + screenshotSaved = 1; + MainMenuUpdateText(); + } + } + break; + case MAIN_MENU_RESET_GAME : + if(currentRomFilename[0]!=0) + { + switch(currentEmuMode) + { + case EMU_MODE_SNES: + action=EVENT_RESET_SNES_ROM; + menuExit=1; + break; + } + } + break; + case MAIN_MENU_RETURN: + if(currentRomFilename[0]!=0) + { + menuExit=1; + } + break; + case MAIN_MENU_EXIT_APP: + action=EVENT_EXIT_APP; + menuExit=1; + break; + } + } + // Draw screen: + menuSmooth=menuSmooth*7+(menufocus<<8); menuSmooth>>=3; + RenderMenu("Main Menu", menuCount,menuSmooth,menufocus); + MenuFlip(); + + + } + + WaitForButtonsUp(); + + return action; +} + + + -- cgit v1.2.3