diff --git a/readme.txt b/readme.txt index 8f1ccfd..5619f13 100644 --- a/readme.txt +++ b/readme.txt @@ -17,6 +17,7 @@ SNES9x GX and Genesis Plus GX projects. * Wiimote, Nunchuk, Classic, and Gamecube controller support * 1-2 Player Support +* RAM and State saving * Custom controller configurations * SD, USB, DVD, SMB, GC Memory Card, and Zip support * NES Compatibility Based on v0.98.12 @@ -27,6 +28,16 @@ SNES9x GX and Genesis Plus GX projects. |0Oื๘oท UPDATE HISTORY ทo๘ืO0| `จ•จจจจจ จจจจจจจจจจจจจจจจ จจจจจจจจจจจจจจจ จจจจจจจจจจจจจจจจจจจจ จจจจจจจจจจจจจ' +[What's New 2.0.1] +* Zapper support! Turn this on in the Controller Settings - most games + require you to have the Zapper on Port 2. Thanks go to aksommerville whose + previous work on the Zapper helped, and michniewski's cursor code +* RAM game save support! Now you can save your games just like the NES did. + By default game saves are saved/loaded automatically. This can be changed + in the Preferences menu +* Start/Select reversed mapping fixed for Wii controllers +* Small bug fixes / improvements / tweaks + [What's New 2.0.0] * Complete rewrite based on code from SNES9x GX and Genesis Plus GX diff --git a/source/fceultra/ines.c b/source/fceultra/ines.c index 39ddf63..b627ae5 100644 --- a/source/fceultra/ines.c +++ b/source/fceultra/ines.c @@ -1,7 +1,7 @@ /* FCE Ultra - NES/Famicom Emulator * * Copyright notice for this file: - * Copyright (C) 1998 BERO + * Copyright (C) 1998 BERO * Copyright (C) 2002 Xodnizel * * This program is free software; you can redistribute it and/or modify @@ -46,7 +46,7 @@ static uint8 *trainerpoo=0; static uint8 *ROM=NULL; static uint8 *VROM=NULL; -static CartInfo iNESCart; +CartInfo iNESCart; uint8 iNESMirroring; uint16 iNESCHRBankList[8]; @@ -66,7 +66,7 @@ int MapperNo = 0; iNES_HEADER head; -/* MapperReset() is called when the NES is reset(with the reset button). +/* MapperReset() is called when the NES is reset(with the reset button). Mapperxxx_init is called when the NES has been powered on. */ @@ -212,7 +212,7 @@ static void SetInput(void) } struct CHINF { - uint32 crc32; + uint32 crc32; int32 mapper; int32 mirror; }; @@ -230,7 +230,7 @@ static void CheckHInfo(void) { 0x498c10dc463cfe95LL, /* Battle Fleet */ 0x6917ffcaca2d8466LL, /* Famista '90 */ - + 0xd63dcc68c2b20adcLL, /* Final Fantasy J */ 0x012df596e2b31174LL, /* Final Fantasy 1+2 */ 0xf6b359a720549ecdLL, /* Final Fantasy 2 */ @@ -268,7 +268,7 @@ static void CheckHInfo(void) 0x94b9484862a26cbaLL, /* Legend of Zelda */ 0x04a31647de80fdabLL, /* "" */ - + 0x9aa1dc16c05e7de5LL, /* Startropics */ 0x1b084107d0878bd0LL, /* Startropics 2*/ @@ -332,7 +332,7 @@ static void CheckHInfo(void) {0xf518dd58,7,8}, /* Captain Skyhawk */ {0x7ccb12a3,43,-1}, /* SMB2j */ {0x6f12afc5,235,-1}, /* Golden Game 150-in-1 */ - {0xccc03440,156,-1}, + {0xccc03440,156,-1}, {0xc9ee15a7,3,-1}, /* 3 is probably best. 41 WILL NOT WORK. */ {0x3e1271d5,79,1}, /* Tiles of Fate */ @@ -360,7 +360,7 @@ static void CheckHInfo(void) {0x932ff06e,34,1}, /* Classic Concentration */ {0x4c7c1af3,34,1}, /* Caesar's Palace */ {0x9ea1dc76,2,0}, /* Rainbow Islands */ - + {0x9eefb4b4,4,8}, /* Pachi Slot Adventure 2 */ {0x5337f73c,4,8}, /* Niji no Silk Road */ {0x7474ac92,4,8}, /* Kabuki: Quantum Fighter */ @@ -536,7 +536,7 @@ static void CheckHInfo(void) /* Four-screen mirroring implicitly set. */ if(MapperNo==99) - Mirroring=2; + Mirroring=2; if(tofix) { @@ -550,7 +550,7 @@ static void CheckHInfo(void) sprintf(gigastr+strlen(gigastr),"Mirroring should be set to \"%s\". ",mstr[Mirroring&3]); } if(tofix&4) - strcat(gigastr,"The battery-backed bit should be set. "); + strcat(gigastr,"The battery-backed bit should be set. "); if(tofix&8) strcat(gigastr,"This game should not have any CHR ROM. "); strcat(gigastr,"\n"); @@ -614,8 +614,8 @@ int iNESLoad(const char *name, FCEUFILE *fp) if(!(ROM=(uint8 *)FCEU_malloc(ROM_size<<14))) return 0; - - if (VROM_size) + + if (VROM_size) if(!(VROM=(uint8 *)FCEU_malloc(VROM_size<<13))) { free(ROM); @@ -641,7 +641,7 @@ int iNESLoad(const char *name, FCEUFILE *fp) if(VROM_size) FCEU_fread(VROM,0x2000,head.VROM_size,fp); - md5_starts(&md5); + md5_starts(&md5); md5_update(&md5,ROM,ROM_size<<14); iNESGameCRC32=CalcCRC32(0,ROM,ROM_size<<14); @@ -662,7 +662,7 @@ int iNESLoad(const char *name, FCEUFILE *fp) { int x; FCEU_printf(" ROM MD5: 0x"); - for(x=0;x<16;x++) + for(x=0;x<16;x++) FCEU_printf("%02x",iNESCart.MD5[x]); FCEU_printf("\n"); } @@ -679,7 +679,7 @@ int iNESLoad(const char *name, FCEUFILE *fp) for(x=0;x<8;x++) { partialmd5 |= (uint64)iNESCart.MD5[7-x] << (x*8); - } + } FCEU_VSUniCheck(partialmd5, &MapperNo, &Mirroring); } @@ -695,7 +695,7 @@ int iNESLoad(const char *name, FCEUFILE *fp) SetupCartMirroring(2+(Mirroring&1),1,0); else SetupCartMirroring(Mirroring&1,(Mirroring&4)>>2,0); - + iNESCart.battery=(head.ROM_type&2)?1:0; iNESCart.mirror=Mirroring; @@ -733,7 +733,7 @@ void FASTAPASS(2) VRAM_BANK1(uint32 A, uint8 V) CHRBankList[(A)>>10]=V; VPage[(A)>>10]=&CHRRAM[V<<10]-(A); } - + void FASTAPASS(2) VRAM_BANK4(uint32 A, uint32 V) { V&=1; @@ -749,7 +749,7 @@ void FASTAPASS(2) VROM_BANK1(uint32 A,uint32 V) setchr1(A,V); CHRBankList[(A)>>10]=V; } - + void FASTAPASS(2) VROM_BANK2(uint32 A,uint32 V) { setchr2(A,V); @@ -785,16 +785,16 @@ void FASTAPASS(2) ROM_BANK8(uint32 A, uint32 V) if(A>=0x8000) PRGBankList[((A-0x8000)>>13)]=V; } - + void FASTAPASS(2) ROM_BANK16(uint32 A, uint32 V) { setprg16(A,V); - if(A>=0x8000) + if(A>=0x8000) { PRGBankList[((A-0x8000)>>13)]=V<<1; PRGBankList[((A-0x8000)>>13)+1]=(V<<1)+1; } -} +} void FASTAPASS(1) ROM_BANK32(uint32 V) { @@ -834,7 +834,7 @@ static void NONE_init(void) ROM_BANK16(0x8000,0); ROM_BANK16(0xC000,~0); - if(VROM_size) + if(VROM_size) VROM_BANK8(0); else setvram8(CHRRAM); @@ -901,14 +901,14 @@ void (*MapStateRestore)(int version); void iNESStateRestore(int version) { int x; - + if(!MapperNo) return; for(x=0;x<4;x++) setprg8(0x8000+x*8192,PRGBankList[x]); if(VROM_size) - for(x=0;x<8;x++) + for(x=0;x<8;x++) setchr1(0x400*x,CHRBankList[x]); if(0) switch(Mirroring) @@ -963,7 +963,7 @@ static void iNESPower(void) if(head.ROM_type&8) AddExState(ExtraNTARAM, 2048, 0, "EXNR"); - /* Exclude some mappers whose emulation code handle save state stuff + /* Exclude some mappers whose emulation code handle save state stuff themselves. */ if(type && type!=13 && type!=96) { @@ -976,7 +976,7 @@ static void iNESPower(void) for(x=0;x<8;x++) { char tak[8]; - sprintf(tak,"CBL%d",x); + sprintf(tak,"CBL%d",x); AddExState(&CHRBankList[x], 2, 1,tak); } } @@ -990,7 +990,7 @@ static void iNESPower(void) typedef struct { - int number; + int number; void (*init)(CartInfo *); } BMAPPING; @@ -1017,8 +1017,8 @@ static BMAPPING bmap[] = { {116, Mapper116_Init}, {118, Mapper118_Init}, {119, Mapper119_Init}, /* Has CHR ROM and CHR RAM by default. Hmm. */ - {155, Mapper155_Init}, - {164, Mapper164_Init}, + {155, Mapper155_Init}, + {164, Mapper164_Init}, {187, Mapper187_Init}, {206, Mapper206_Init}, {208, Mapper208_Init}, @@ -1068,8 +1068,8 @@ static BMAPPING bmap[] = { {242, Mapper242_init}, //252.c {252, Mapper252_Init}, - - + + {0,0} }; @@ -1109,10 +1109,10 @@ int iNESMemLoad(char *nesrom) { struct md5_context md5; int memoffs = 0; - + memcpy(&head, nesrom, 16); memoffs+=16; - + if(memcmp(&head,"NES\x1a",4)) return 0; @@ -1157,8 +1157,8 @@ int iNESMemLoad(char *nesrom) if(!(ROM=(uint8 *)FCEU_malloc(ROM_size<<14))) return 0; - - if (VROM_size) + + if (VROM_size) if(!(VROM=(uint8 *)FCEU_malloc(VROM_size<<13))) { free(ROM); @@ -1184,14 +1184,14 @@ int iNESMemLoad(char *nesrom) //FCEU_fread(ROM,0x4000,head.ROM_size,fp); memcpy(ROM, &nesrom[memoffs], head.ROM_size * 0x4000); memoffs += ( head.ROM_size * 0x4000 ); - + if(VROM_size){ //FCEU_fread(VROM,0x2000,head.VROM_size,fp); memcpy(VROM, &nesrom[memoffs], 0x2000 * head.VROM_size); memoffs += ( head.VROM_size * 0x2000 ); } - md5_starts(&md5); + md5_starts(&md5); md5_update(&md5,ROM,ROM_size<<14); iNESGameCRC32=CalcCRC32(0,ROM,ROM_size<<14); @@ -1217,7 +1217,7 @@ int iNESMemLoad(char *nesrom) for(x=0;x<8;x++) { partialmd5 |= (uint64)iNESCart.MD5[7-x] << (x*8); - } + } FCEU_VSUniCheck(partialmd5, &MapperNo, &Mirroring); } @@ -1234,7 +1234,7 @@ int iNESMemLoad(char *nesrom) SetupCartMirroring(2+(Mirroring&1),1,0); else SetupCartMirroring(Mirroring&1,(Mirroring&4)>>2,0); - + iNESCart.battery=(head.ROM_type&2)?1:0; iNESCart.mirror=Mirroring; diff --git a/source/fceultra/nesrom.s b/source/fceultra/nesrom.s deleted file mode 100644 index 8144292..0000000 --- a/source/fceultra/nesrom.s +++ /dev/null @@ -1,7 +0,0 @@ -.rodata -.globl nesrom -nesromsize: .long 1048592 -.balign 32 -nesrom: -.incbin "../source/fceultra/rom/ROM.NES" - diff --git a/source/ngc/fceuconfig.c b/source/ngc/fceuconfig.c index 3716126..c9da648 100644 --- a/source/ngc/fceuconfig.c +++ b/source/ngc/fceuconfig.c @@ -34,8 +34,8 @@ DefaultSettings () sprintf (GCSettings.LoadFolder,"fceugx/roms"); // Path to game files sprintf (GCSettings.SaveFolder,"fceugx/saves"); // Path to save files sprintf (GCSettings.CheatFolder,"fceugx/cheats"); // Path to cheat files - GCSettings.AutoLoad = 0; - GCSettings.AutoSave = 0; + GCSettings.AutoLoad = 1; // Auto Load RAM + GCSettings.AutoSave = 1; // Auto Save RAM // default SMB settings strncpy (GCSettings.smbip, "192.168.0.1", 15); // IP Address of share server diff --git a/source/ngc/fceuconfig.h b/source/ngc/fceuconfig.h index 20705dc..69cf64a 100644 --- a/source/ngc/fceuconfig.h +++ b/source/ngc/fceuconfig.h @@ -15,8 +15,8 @@ void DefaultSettings (); -#define VERSIONNUM "2.0.0" -#define VERSIONSTR "FCEUGX 2.0.0" +#define VERSIONNUM "2.0.1" +#define VERSIONSTR "FCE Ultra GX 2.0.1" #define NOTSILENT 0 #define SILENT 1 diff --git a/source/ngc/fceugc.c b/source/ngc/fceugc.c index 1833e23..e422505 100644 --- a/source/ngc/fceugc.c +++ b/source/ngc/fceugc.c @@ -36,32 +36,10 @@ extern bool romLoaded; bool isWii; -/* Some timing-related variables. */ -static int fullscreen=0; -static int genie=0; - -static volatile int nofocus=0; -static volatile int userpause=0; - -#define SO_FORCE8BIT 1 -#define SO_SECONDARY 2 -#define SO_GFOCUS 4 -#define SO_D16VOL 8 - -#define GOO_DISABLESS 1 /* Disable screen saver when game is loaded. */ -#define GOO_CONFIRMEXIT 2 /* Confirmation before exiting. */ -#define GOO_POWERRESET 4 /* Confirm on power/reset. */ - -static int soundvolume=100; -static int soundquality=0; -static int soundo; - uint8 *xbsave=NULL; -int eoptions=EO_BGRUN | EO_FORCEISCALE; extern int cleanSFMDATA(); extern void ResetNES(void); -long long basetime; void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count); @@ -103,12 +81,10 @@ int main(int argc, char *argv[]) } FCEUI_SetVidSystem(0); // 0 - NTSC, 1 - PAL - genie&=1; - FCEUI_SetGameGenie(genie); - fullscreen&=1; - soundo&=1; - FCEUI_SetSoundVolume(soundvolume); - FCEUI_SetSoundQuality(soundquality); + + FCEUI_SetGameGenie(0); // 0 - OFF, 1 - ON + FCEUI_SetSoundVolume(100); // 0-100 + FCEUI_SetSoundQuality(1); // 0 - low, 1 - high cleanSFMDATA(); GCMemROM(); @@ -188,4 +164,10 @@ void FCEUD_NetworkClose(void) void FCEUD_NetplayText(uint8 *text) { } - +/* +void FCEUI_SaveExtraDataUnderBase(int a); +If "a" is nonzero, save extra non-volatile game data(battery-backed +RAM) under FCE Ultra's base directory. Otherwise, the behavior is +to save it under the same directory the game is located in(this is +the default behavior). +*/ diff --git a/source/ngc/fceuload.c b/source/ngc/fceuload.c index 5e11972..6ecaaab 100644 --- a/source/ngc/fceuload.c +++ b/source/ngc/fceuload.c @@ -60,7 +60,7 @@ int GCMemROM() /*** Set internal sound information ***/ FCEUI_Sound(SAMPLERATE); - FCEUI_SetSoundQuality(0); + FCEUI_SetSoundQuality(1); FCEUI_SetSoundVolume(100); FCEUI_SetLowPass(0); diff --git a/source/ngc/fceuram.c b/source/ngc/fceuram.c new file mode 100644 index 0000000..d53e4ae --- /dev/null +++ b/source/ngc/fceuram.c @@ -0,0 +1,171 @@ +/**************************************************************************** + * FCE Ultra 0.98.12 + * Nintendo Wii/Gamecube Port + * + * Tantric September 2008 + * + * fceustate.c + * + * Memory Based Load/Save RAM Manager + * + * These are the battery-backed RAM (save data) routines, brought together + * as GCxxxxx + * The original file I/O is replaced with Memory Read/Writes to the + * savebuffer below + ****************************************************************************/ + +#include +#include +#include +#include +#include + +#include "types.h" + +#include "fceu.h" +#include "ppu.h" + +#include "cart.h" +#include "memory.h" +#include "x6502.h" + +#include "general.h" + +#include "fceuconfig.h" +#include "intl.h" +#include "menudraw.h" +#include "filesel.h" +#include "memcardop.h" +#include "fileop.h" +#include "smbop.h" + +extern u32 iNESGameCRC32; +extern CartInfo iNESCart; + +extern unsigned char savebuffer[SAVEBUFFERSIZE]; +extern char romFilename[]; + +int NGCFCEU_GameSave(CartInfo *LocalHWInfo, int operation) +{ + int size = 0; + if(LocalHWInfo->battery && LocalHWInfo->SaveGame[0]) + { + int x; + + for(x=0;x<4;x++) + { + if(LocalHWInfo->SaveGame[x]) + { + if(operation == 0) // save to file + { + memcpy(savebuffer, LocalHWInfo->SaveGame[x], LocalHWInfo->SaveGameLen[x]); + } + else // load from file + { + memcpy(LocalHWInfo->SaveGame[x], savebuffer, LocalHWInfo->SaveGameLen[x]); + } + size += LocalHWInfo->SaveGameLen[x]; + } + } + } + return size; +} + +bool SaveRAM (int method, bool silent) +{ + ShowAction ((char*) "Saving..."); + + if(method == METHOD_AUTO) + method = autoSaveMethod(); + + bool retval = false; + char filepath[1024]; + int datasize; + int offset = 0; + + datasize = NGCFCEU_GameSave(&iNESCart, 0); // save game save to savebuffer + + if ( datasize ) + { + if(method == METHOD_SD || method == METHOD_USB) + { + if(ChangeFATInterface(method, NOTSILENT)) + { + sprintf (filepath, "%s/%s/%s.sav", ROOTFATDIR, GCSettings.SaveFolder, romFilename); + offset = SaveBufferToFAT (filepath, datasize, silent); + } + } + else if(method == METHOD_SMB) + { + sprintf (filepath, "%s/%s.sav", GCSettings.SaveFolder, romFilename); + offset = SaveBufferToSMB (filepath, datasize, silent); + } + else if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB) + { + sprintf (filepath, "%08x.sav", iNESGameCRC32); + + if(method == METHOD_MC_SLOTA) + offset = SaveBufferToMC (savebuffer, CARD_SLOTA, filepath, datasize, silent); + else + offset = SaveBufferToMC (savebuffer, CARD_SLOTB, filepath, datasize, silent); + } + + if (offset > 0) + { + if ( !silent ) + WaitPrompt((char *)"Save successful"); + retval = true; + } + } + else + { + if ( !silent ) + WaitPrompt((char *)"No data to save!"); + } + return retval; +} + +bool LoadRAM (int method, bool silent) +{ + ShowAction ((char*) "Loading..."); + + if(method == METHOD_AUTO) + method = autoSaveMethod(); // we use 'Save' because we need R/W + + char filepath[1024]; + int offset = 0; + + if(method == METHOD_SD || method == METHOD_USB) + { + ChangeFATInterface(method, NOTSILENT); + sprintf (filepath, "%s/%s/%s.sav", ROOTFATDIR, GCSettings.SaveFolder, romFilename); + offset = LoadBufferFromFAT (filepath, silent); + } + else if(method == METHOD_SMB) + { + sprintf (filepath, "%s/%s.sav", GCSettings.SaveFolder, romFilename); + offset = LoadSaveBufferFromSMB (filepath, silent); + } + else if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB) + { + sprintf (filepath, "%08x.sav", iNESGameCRC32); + + if(method == METHOD_MC_SLOTA) + offset = LoadBufferFromMC (savebuffer, CARD_SLOTA, filepath, silent); + else + offset = LoadBufferFromMC (savebuffer, CARD_SLOTB, filepath, silent); + } + + if (offset > 0) + { + NGCFCEU_GameSave(&iNESCart, 1); // load game save from savebuffer + ResetNES(); + return 1; + } + + // if we reached here, nothing was done! + if(!silent) + WaitPrompt ((char*) "Save file not found"); + + return 0; +} diff --git a/source/ngc/fceuram.h b/source/ngc/fceuram.h new file mode 100644 index 0000000..af44dc1 --- /dev/null +++ b/source/ngc/fceuram.h @@ -0,0 +1,13 @@ +/**************************************************************************** + * FCE Ultra 0.98.12 + * Nintendo Wii/Gamecube Port + * + * Tantric September 2008 + * + * fceuram.h + * + * Memory Based Load/Save RAM Manager + ****************************************************************************/ + +bool SaveRAM (int method, bool silent); +bool LoadRAM (int method, bool silent); diff --git a/source/ngc/fceustate.c b/source/ngc/fceustate.c index bdd63aa..f626148 100644 --- a/source/ngc/fceustate.c +++ b/source/ngc/fceustate.c @@ -325,7 +325,7 @@ bool LoadState (int method, bool silent) ShowAction ((char*) "Loading..."); if(method == METHOD_AUTO) - method = autoSaveMethod(); // we use 'Save' because SRAM needs R/W + method = autoSaveMethod(); // we use 'Save' because we need R/W char filepath[1024]; int offset = 0; diff --git a/source/ngc/menu.c b/source/ngc/menu.c index bca3f7d..a288a76 100644 --- a/source/ngc/menu.c +++ b/source/ngc/menu.c @@ -34,6 +34,7 @@ #include "fceustate.h" #include "gcvideo.h" #include "preferences.h" +#include "fceuram.h" extern int GCMemROM(); extern void ResetNES(void); @@ -78,9 +79,13 @@ LoadManager () if(!GCMemROM()) // ROM was not valid return 0; - // load the state + // load the RAM if (GCSettings.AutoLoad == 1) + LoadRAM(GCSettings.SaveMethod, SILENT); + else LoadState(GCSettings.SaveMethod, SILENT); + + ResetNES(); } return loadROM; @@ -276,10 +281,13 @@ PreferencesMenu () prefmenu[3][0] = '\0'; if (GCSettings.AutoLoad == 0) sprintf (prefmenu[4],"Auto Load OFF"); - else if (GCSettings.AutoLoad == 1) sprintf (prefmenu[4],"Auto Load ON"); + else if (GCSettings.AutoLoad == 1) sprintf (prefmenu[4],"Auto Load RAM"); + else if (GCSettings.AutoLoad == 2) sprintf (prefmenu[4],"Auto Load STATE"); if (GCSettings.AutoSave == 0) sprintf (prefmenu[5],"Auto Save OFF"); - else if (GCSettings.AutoSave == 1) sprintf (prefmenu[5],"Auto Save ON"); + else if (GCSettings.AutoSave == 1) sprintf (prefmenu[5],"Auto Save RAM"); + else if (GCSettings.AutoSave == 2) sprintf (prefmenu[5],"Auto Save STATE"); + else if (GCSettings.AutoSave == 3) sprintf (prefmenu[5],"Auto Save BOTH"); sprintf (prefmenu[6], "Verify MC Saves %s", GCSettings.VerifySaves == true ? " ON" : "OFF"); @@ -304,13 +312,13 @@ PreferencesMenu () case 4: GCSettings.AutoLoad ++; - if (GCSettings.AutoLoad > 1) + if (GCSettings.AutoLoad > 2) GCSettings.AutoLoad = 0; break; case 5: GCSettings.AutoSave ++; - if (GCSettings.AutoSave > 1) + if (GCSettings.AutoSave > 3) GCSettings.AutoSave = 0; break; @@ -339,11 +347,12 @@ PreferencesMenu () int GameMenu () { - int gamemenuCount = 6; + int gamemenuCount = 8; char gamemenu[][50] = { "Return to Game", "Reset Game", "ROM Information", + "Load RAM", "Save RAM", "Load State", "Save State", "Back to Main Menu" }; @@ -355,12 +364,21 @@ GameMenu () while (quit == 0) { - // disable state saving/loading if AUTO is on - - if (GCSettings.AutoLoad == 1) // Auto Load State + // disable RAM/STATE saving/loading if AUTO is on + if (GCSettings.AutoLoad == 1) // Auto Load RAM gamemenu[3][0] = '\0'; - if (GCSettings.AutoSave == 1) // Auto Save State + else if (GCSettings.AutoLoad == 2) // Auto Load STATE + gamemenu[5][0] = '\0'; + + if (GCSettings.AutoSave == 1) // Auto Save RAM gamemenu[4][0] = '\0'; + else if (GCSettings.AutoSave == 2) // Auto Save STATE + gamemenu[6][0] = '\0'; + else if (GCSettings.AutoSave == 3) // Auto Save BOTH + { + gamemenu[4][0] = '\0'; + gamemenu[6][0] = '\0'; + } ret = RunMenu (gamemenu, gamemenuCount, (char*)"Game Menu", 20, -1); @@ -380,16 +398,24 @@ GameMenu () WaitButtonA (); break; - case 3: // Load State + case 3: // Load RAM + quit = retval = LoadRAM(GCSettings.SaveMethod, NOTSILENT); + break; + + case 4: // Save RAM + SaveRAM(GCSettings.SaveMethod, NOTSILENT); + break; + + case 5: // Load State quit = retval = LoadState(GCSettings.SaveMethod, NOTSILENT); break; - case 4: // Save State + case 6: // Save State SaveState(GCSettings.SaveMethod, NOTSILENT); break; case -1: // Button B - case 5: // Return to previous menu + case 7: // Return to previous menu retval = 0; quit = 1; break; diff --git a/source/ngc/menudraw.c b/source/ngc/menudraw.c index 69163fe..be471ea 100644 --- a/source/ngc/menudraw.c +++ b/source/ngc/menudraw.c @@ -20,6 +20,7 @@ #include #include FT_FREETYPE_H +#include "fceuconfig.h" #include "gcvideo.h" #include "menudraw.h" #include "filesel.h" @@ -421,7 +422,7 @@ DrawMenu (char items[][50], char *title, int maxitems, int selected, int fontsiz } setfontsize (12); - DrawText (510, screenheight - 40, (char *)"FCEUGX 2.0.0"); + DrawText (510, screenheight - 40, VERSIONSTR); // Draw menu items diff --git a/source/ngc/nesrom.s b/source/ngc/nesrom.s new file mode 100644 index 0000000..cf3722e --- /dev/null +++ b/source/ngc/nesrom.s @@ -0,0 +1,7 @@ +.rodata +.globl nesrom +nesromsize: .long 1048592 +.balign 32 +nesrom: +.incbin "../source/ngc/rom/ROM.NES" + diff --git a/source/fceultra/rom/ROM.NES b/source/ngc/rom/ROM.NES similarity index 100% rename from source/fceultra/rom/ROM.NES rename to source/ngc/rom/ROM.NES diff --git a/source/fceultra/sz/7zAlloc.c b/source/sz/7zAlloc.c similarity index 100% rename from source/fceultra/sz/7zAlloc.c rename to source/sz/7zAlloc.c diff --git a/source/fceultra/sz/7zAlloc.h b/source/sz/7zAlloc.h similarity index 100% rename from source/fceultra/sz/7zAlloc.h rename to source/sz/7zAlloc.h diff --git a/source/fceultra/sz/7zBuffer.c b/source/sz/7zBuffer.c similarity index 100% rename from source/fceultra/sz/7zBuffer.c rename to source/sz/7zBuffer.c diff --git a/source/fceultra/sz/7zBuffer.h b/source/sz/7zBuffer.h similarity index 100% rename from source/fceultra/sz/7zBuffer.h rename to source/sz/7zBuffer.h diff --git a/source/fceultra/sz/7zCrc.c b/source/sz/7zCrc.c similarity index 100% rename from source/fceultra/sz/7zCrc.c rename to source/sz/7zCrc.c diff --git a/source/fceultra/sz/7zCrc.h b/source/sz/7zCrc.h similarity index 100% rename from source/fceultra/sz/7zCrc.h rename to source/sz/7zCrc.h diff --git a/source/fceultra/sz/7zDecode.c b/source/sz/7zDecode.c similarity index 100% rename from source/fceultra/sz/7zDecode.c rename to source/sz/7zDecode.c diff --git a/source/fceultra/sz/7zDecode.h b/source/sz/7zDecode.h similarity index 100% rename from source/fceultra/sz/7zDecode.h rename to source/sz/7zDecode.h diff --git a/source/fceultra/sz/7zExtract.c b/source/sz/7zExtract.c similarity index 100% rename from source/fceultra/sz/7zExtract.c rename to source/sz/7zExtract.c diff --git a/source/fceultra/sz/7zExtract.h b/source/sz/7zExtract.h similarity index 100% rename from source/fceultra/sz/7zExtract.h rename to source/sz/7zExtract.h diff --git a/source/fceultra/sz/7zHeader.c b/source/sz/7zHeader.c similarity index 100% rename from source/fceultra/sz/7zHeader.c rename to source/sz/7zHeader.c diff --git a/source/fceultra/sz/7zHeader.h b/source/sz/7zHeader.h similarity index 100% rename from source/fceultra/sz/7zHeader.h rename to source/sz/7zHeader.h diff --git a/source/fceultra/sz/7zIn.c b/source/sz/7zIn.c similarity index 100% rename from source/fceultra/sz/7zIn.c rename to source/sz/7zIn.c diff --git a/source/fceultra/sz/7zIn.h b/source/sz/7zIn.h similarity index 100% rename from source/fceultra/sz/7zIn.h rename to source/sz/7zIn.h diff --git a/source/fceultra/sz/7zItem.c b/source/sz/7zItem.c similarity index 100% rename from source/fceultra/sz/7zItem.c rename to source/sz/7zItem.c diff --git a/source/fceultra/sz/7zItem.h b/source/sz/7zItem.h similarity index 100% rename from source/fceultra/sz/7zItem.h rename to source/sz/7zItem.h diff --git a/source/fceultra/sz/7zMethodID.c b/source/sz/7zMethodID.c similarity index 100% rename from source/fceultra/sz/7zMethodID.c rename to source/sz/7zMethodID.c diff --git a/source/fceultra/sz/7zMethodID.h b/source/sz/7zMethodID.h similarity index 100% rename from source/fceultra/sz/7zMethodID.h rename to source/sz/7zMethodID.h diff --git a/source/fceultra/sz/7zTypes.h b/source/sz/7zTypes.h similarity index 100% rename from source/fceultra/sz/7zTypes.h rename to source/sz/7zTypes.h diff --git a/source/fceultra/sz/LzmaDecode.c b/source/sz/LzmaDecode.c similarity index 100% rename from source/fceultra/sz/LzmaDecode.c rename to source/sz/LzmaDecode.c diff --git a/source/fceultra/sz/LzmaDecode.h b/source/sz/LzmaDecode.h similarity index 100% rename from source/fceultra/sz/LzmaDecode.h rename to source/sz/LzmaDecode.h diff --git a/source/fceultra/sz/LzmaTypes.h b/source/sz/LzmaTypes.h similarity index 100% rename from source/fceultra/sz/LzmaTypes.h rename to source/sz/LzmaTypes.h