mirror of
https://github.com/ApacheThunder/GBA-Exploader.git
synced 2025-06-18 11:35:38 -04:00
Initial EZFlash Omega Support.
* There are some bugs with saving still but games appear to be working for PSRam mode on Omega. NorFlash mode is not planned due to difference in how Omega uses NorFlash.
This commit is contained in:
parent
7ce405acac
commit
99ed31e3e7
2
Makefile
2
Makefile
@ -9,7 +9,7 @@ export TARGET := GBA_ExpLoader
|
||||
export TOPDIR := $(CURDIR)
|
||||
|
||||
export VERSION_MAJOR := 0
|
||||
export VERSION_MINOR := 62
|
||||
export VERSION_MINOR := 63
|
||||
export VERSTRING := $(VERSION_MAJOR).$(VERSION_MINOR)
|
||||
|
||||
# GMAE_ICON is the image used to create the game icon, leave blank to use default rule
|
||||
|
@ -46,15 +46,25 @@ typedef bool BOOL ;
|
||||
|
||||
//下面是访问震动卡的函数
|
||||
#define FlashBase 0x08000000
|
||||
#define _Ez5PsRAM 0x08000000
|
||||
#define PSRAMBase_S98 0x08800000
|
||||
#define FlashBase_S98 0x09000000
|
||||
#define _Ez5PsRAM 0x08000000
|
||||
#define SAVE_sram_base 0x0E000000
|
||||
void OpenNorWrite();
|
||||
void CloseNorWrite();
|
||||
void SetRompage(u16 page);
|
||||
void SetRompage(u16 page);
|
||||
void SetRampage(u16 page);
|
||||
void OpenRamWrite();
|
||||
void SetSDControl(u16 control);
|
||||
void Set_AUTO_save(u16 mode);
|
||||
u16 Read_S71NOR_ID(); // For Reading EZFlash Omega ID
|
||||
u16 Read_S98NOR_ID(); // For Reading EZFlash Omega ID
|
||||
void SetPSRampage(u16 page); // EZFlash Omega uses this instead of regular SetRamPage
|
||||
void Set_RTC_status(u16 status); // EZFlash Omega RTC thingy
|
||||
u16 Read_SET_info(u32 offset);
|
||||
void OpenRamWrite();
|
||||
void CloseRamWrite();
|
||||
void SetSerialMode();
|
||||
uint32 ReadNorFlashID();
|
||||
void SetSerialMode();
|
||||
uint32 ReadNorFlashID();
|
||||
void chip_reset();
|
||||
void Block_EraseIntel(u32 blockAdd);
|
||||
void Block_Erase(u32 blockAdd);
|
||||
@ -64,7 +74,9 @@ typedef bool BOOL ;
|
||||
void WriteSram(uint32 address, u8* data , uint32 size );
|
||||
void ReadSram(uint32 address, u8* data , uint32 size );
|
||||
void SetShake(u16 data);
|
||||
void Omega_Bank_Switching(u8 bank);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -16,8 +16,13 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define NOR_info_offset 0x7A0000
|
||||
#define SET_info_offset 0x7B0000
|
||||
|
||||
static u32 ID = 0x227E2218;
|
||||
|
||||
u16 gl_ingame_RTC_open_status = 0;
|
||||
|
||||
static bool checkForSuperCard() {
|
||||
_SC_changeMode(SC_MODE_RAM); // Try again with SuperCard
|
||||
// _SC_changeMode16(0x1510);
|
||||
@ -68,6 +73,67 @@ void SetRompage(u16 page) {
|
||||
*(vu16*)0x9fc0000 = 0x1500;
|
||||
}
|
||||
|
||||
|
||||
// EZ Flash Omega only
|
||||
void SetSDControl(u16 control) {
|
||||
*(u16 *)0x9fe0000 = 0xd200;
|
||||
*(u16 *)0x8000000 = 0x1500;
|
||||
*(u16 *)0x8020000 = 0xd200;
|
||||
*(u16 *)0x8040000 = 0x1500;
|
||||
*(u16 *)0x9400000 = control;
|
||||
*(u16 *)0x9fc0000 = 0x1500;
|
||||
}
|
||||
|
||||
void Set_AUTO_save(u16 mode) {
|
||||
*(u16*)0x9fe0000 = 0xd200;
|
||||
*(u16*)0x8000000 = 0x1500;
|
||||
*(u16*)0x8020000 = 0xd200;
|
||||
*(u16*)0x8040000 = 0x1500;
|
||||
*(u16*)0x96C0000 = mode;
|
||||
*(u16*)0x9fc0000 = 0x1500;
|
||||
}
|
||||
|
||||
u16 Read_S71NOR_ID() {
|
||||
*((vu16*)(FlashBase)) = 0xF0;
|
||||
*((vu16*)(FlashBase+0x555*2)) = 0xAA;
|
||||
*((vu16*)(FlashBase+0x2AA*2)) = 0x55;
|
||||
*((vu16*)(FlashBase+0x555*2)) = 0x90;
|
||||
u16 ID1 = *((vu16*)(FlashBase+0xE*2));
|
||||
*((vu16*)(FlashBase)) = 0xF0;
|
||||
return ID1;
|
||||
}
|
||||
|
||||
u16 Read_S98NOR_ID() {
|
||||
*((vu16*)(FlashBase_S98)) = 0xF0;
|
||||
*((vu16*)(FlashBase_S98+0x555*2)) = 0xAA;
|
||||
*((vu16*)(FlashBase_S98+0x2AA*2)) = 0x55;
|
||||
*((vu16*)(FlashBase_S98+0x555*2)) = 0x90;
|
||||
return *((vu16*)(FlashBase_S98+0xE*2));
|
||||
}
|
||||
|
||||
// EZFlash Omega uses this
|
||||
void SetPSRampage(u16 page) {
|
||||
*(vu16*)0x9fe0000 = 0xd200;
|
||||
*(vu16*)0x8000000 = 0x1500;
|
||||
*(vu16*)0x8020000 = 0xd200;
|
||||
*(vu16*)0x8040000 = 0x1500;
|
||||
*(vu16*)0x9860000 = page; //C3
|
||||
*(vu16*)0x9fc0000 = 0x1500;
|
||||
}
|
||||
|
||||
u16 Read_SET_info(u32 offset) { return *((vu16 *)(FlashBase+SET_info_offset+offset*2)); }
|
||||
|
||||
// EZFlash Omega RTC thingy
|
||||
void Set_RTC_status(u16 status) {
|
||||
*(u16*)0x9fe0000 = 0xd200;
|
||||
*(u16*)0x8000000 = 0x1500;
|
||||
*(u16*)0x8020000 = 0xd200;
|
||||
*(u16*)0x8040000 = 0x1500;
|
||||
*(u16*)0x96A0000 = status;
|
||||
*(u16*)0x9fc0000 = 0x1500;
|
||||
}
|
||||
|
||||
|
||||
void SetRampage(u16 page) {
|
||||
*(vu16*)0x9fe0000 = 0xd200;
|
||||
*(vu16*)0x8000000 = 0x1500;
|
||||
@ -116,11 +182,26 @@ u32 ReadNorFlashID() {
|
||||
id1 = *((vu16*)(FlashBase+0x2));
|
||||
id2 = *((vu16*)(FlashBase+0x2002));
|
||||
|
||||
/*FILE *testFile = fopen("/gbacardID.bin", "wb");
|
||||
if (testFile) {
|
||||
fwrite((void*)(FlashBase+0x2), 2, 1, testFile);
|
||||
fwrite((void*)(FlashBase+0x2002), 2, 1, testFile);
|
||||
fclose(testFile);
|
||||
}*/
|
||||
|
||||
|
||||
if ((id1 != 0x227E) || (id2 != 0x227E)) {
|
||||
if (checkForSuperCard()) {
|
||||
ID = 0x227E2202;
|
||||
return 0x227E0000;
|
||||
}
|
||||
// Check For EZ Flash Omega
|
||||
SetRompage(0x8002);
|
||||
id1 = Read_S98NOR_ID();
|
||||
if ((id1 == 0x223D)) {
|
||||
ID = 0x227EEA00;
|
||||
return 0x227EEA00;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -149,7 +230,10 @@ u32 ReadNorFlashID() {
|
||||
}
|
||||
|
||||
void chip_reset() {
|
||||
if(ID == 0x89168916) {
|
||||
if (ID == 0x227EEA00) {
|
||||
*((vu16*)(FlashBase_S98)) = 0xF0;
|
||||
return;
|
||||
} else if(ID == 0x89168916) {
|
||||
*((vu16*)(FlashBase+0)) = 0x50;
|
||||
*((vu16*)(FlashBase+0x1000*2)) = 0x50;
|
||||
*((vu16*)(FlashBase+0)) = 0xFF;
|
||||
@ -403,8 +487,8 @@ void WriteNorFlashINTEL(u32 address,u8 *buffer,u32 size) {
|
||||
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0xFF;
|
||||
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1))) = 0xE8;
|
||||
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0xE8;
|
||||
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1))) = 0x70;
|
||||
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0x70;
|
||||
// *((vu16*)(FlashBase+mapaddress+(loopwrite>>1))) = 0x70;
|
||||
// *((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0x70;
|
||||
v1=v2=0;
|
||||
while((v1!= 0x80) || (v2 != 0x80)) {
|
||||
v1 = *((vu16 *)(FlashBase+mapaddress+(loopwrite>>1)));
|
||||
@ -487,6 +571,13 @@ void WriteNorFlash(u32 address,u8 *buffer,u32 size) {
|
||||
}
|
||||
}
|
||||
|
||||
void Omega_Bank_Switching(u8 bank) {
|
||||
*((vu8 *)(SAVE_sram_base+0x5555)) = 0xAA ;
|
||||
*((vu8 *)(SAVE_sram_base+0x2AAA)) = 0x55 ;
|
||||
*((vu8 *)(SAVE_sram_base+0x5555)) = 0xB0 ;
|
||||
*((vu8 *)(SAVE_sram_base+0x0000)) = bank ;
|
||||
}
|
||||
|
||||
void WriteSram(uint32 address, u8* data , uint32 size ) {
|
||||
uint32 i ;
|
||||
for(i=0;i<size;i++)*(u8*)(address+i)=data[i];
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "gba_patch.h"
|
||||
#include "GBA_ini.h"
|
||||
#include "dscard.h"
|
||||
|
||||
#define PATCH_VER 5
|
||||
|
||||
@ -20,6 +21,7 @@ u32 PatchAddr[28];
|
||||
u8 *RemainPtr;
|
||||
u32 RemainByte;
|
||||
|
||||
extern bool isOmega;
|
||||
|
||||
static int _type_chk(u32 *pbuf, u32 c, u32 ofs) {
|
||||
switch(pbuf[c]) {
|
||||
@ -889,8 +891,7 @@ u32 gba_check(FILE *gbaFile, u32 size, u8 *buf, u32 bufsize) {
|
||||
|
||||
// if(SaveType != 0)
|
||||
// return(SaveSize);
|
||||
if(PatchVer == PATCH_VER)
|
||||
return(SaveSize);
|
||||
if(PatchVer == PATCH_VER)return(SaveSize);
|
||||
|
||||
dsp_bar(3, -1);
|
||||
|
||||
@ -1728,7 +1729,21 @@ void gba_patch_Ram(u32 exp, char *name, int cart) {
|
||||
fmini = 124;
|
||||
|
||||
for(i = 1; i < PatchCnt; i++) {
|
||||
|
||||
buf = (u8*)(exp + PatchAddr[i]);
|
||||
|
||||
|
||||
// EZ Flash Omega and it's silly mapping schemes.... :P
|
||||
if (isOmega) {
|
||||
if ((exp + PatchAddr[i]) > 0x09000000 && (exp + PatchAddr[i]) < 0x09800000) {
|
||||
SetPSRampage(0x1000);
|
||||
} else if ((exp + PatchAddr[i]) > 0x0A000000 && (exp + PatchAddr[i]) < 0x0A800000) {
|
||||
SetPSRampage(0x2000);
|
||||
} else if ((exp + PatchAddr[i]) > 0x0B000000 && (exp + PatchAddr[i]) < 0x0B800000) {
|
||||
SetPSRampage(0x3000);
|
||||
}
|
||||
}
|
||||
|
||||
switch(SaveType) {
|
||||
case 2: // EEPROM
|
||||
if(PatchType[i] == 0x21)_patch_ram(buf, ofs, patch_eeprom_1, sizeof(patch_eeprom_1));
|
||||
@ -1939,6 +1954,7 @@ void gba_patch_Ram(u32 exp, char *name, int cart) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isOmega)SetPSRampage(0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -45,6 +45,7 @@
|
||||
|
||||
#define USE_SRAM_NOR 16 // 0x0A010000-0A02FFFF
|
||||
|
||||
#define USE_SRAM_PSR_Omega 160
|
||||
#define USE_SRAM_PSR 50 // 0x0A032000-0A051FFF
|
||||
#define USE_SRAM_PSR_EZ4 16 // 0x0A010000-0A02FFFF
|
||||
#define USE_SRAM_PSR_EWN 8 // 0x0A000000-0A01FFFF
|
||||
@ -77,8 +78,11 @@ static u32 savesize;
|
||||
int carttype = 0;
|
||||
bool isSuperCard = false;
|
||||
bool is3in1Plus = false;
|
||||
bool isOmega = false;
|
||||
|
||||
extern int save_sel(int mod, char *name);
|
||||
extern u16 gl_ingame_RTC_open_status;
|
||||
extern void SetSDControl(u16 control);
|
||||
|
||||
char const *Rudolph = "GBA ExpLoader by Rudolph (LocalCode v0.1)";
|
||||
|
||||
@ -384,6 +388,8 @@ int check_M3() {
|
||||
|
||||
|
||||
void _RamPG() {
|
||||
if (isSuperCard)return;
|
||||
if (isOmega)return;
|
||||
switch (carttype) {
|
||||
case 3:
|
||||
SetRampage(USE_SRAM_PG_EZ4);
|
||||
@ -403,6 +409,8 @@ void _RamPG() {
|
||||
}
|
||||
|
||||
void _RamSave(int bnk) {
|
||||
if (isSuperCard)return;
|
||||
if (isOmega)return;
|
||||
switch (carttype) {
|
||||
case 3:
|
||||
SetRampage(USE_SRAM_PSR_EZ4 + bnk * 16);
|
||||
@ -412,12 +420,20 @@ void _RamSave(int bnk) {
|
||||
return;
|
||||
}
|
||||
|
||||
if((carttype >= 4) && !isSuperCard) {
|
||||
if(carttype >= 4) {
|
||||
SetEWINRam(USE_SRAM_PSR_EWN + bnk);
|
||||
return;
|
||||
}
|
||||
|
||||
if(GBAmode == 0) { SetRampage(USE_SRAM_PSR + bnk * 16); } else { SetRampage(USE_SRAM_NOR + bnk * 16); }
|
||||
if(GBAmode == 0) {
|
||||
if (isOmega) {
|
||||
SetRampage(bnk * 16);
|
||||
} else {
|
||||
SetRampage(USE_SRAM_PSR + bnk * 16);
|
||||
}
|
||||
} else {
|
||||
SetRampage(USE_SRAM_NOR + bnk * 16);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -442,26 +458,41 @@ int checkFlashID() {
|
||||
carttype = 6; // M3/G6
|
||||
is3in1Plus = false;
|
||||
isSuperCard = false;
|
||||
isOmega = false;
|
||||
return carttype;
|
||||
}
|
||||
ewin = check_EWIN();
|
||||
if(ewin > 0)carttype = (3 + ewin); // EWIN
|
||||
is3in1Plus = false;
|
||||
isSuperCard = false;
|
||||
isOmega = false;
|
||||
return carttype;
|
||||
case 0x227E2218: carttype = 1; return carttype; // 3in1
|
||||
case 0x227E2202: carttype = 2; return carttype; // New3in1
|
||||
case 0x89168916: // 3in1 Plus
|
||||
is3in1Plus = true;
|
||||
isSuperCard = false;
|
||||
isOmega = false;
|
||||
carttype = 1;
|
||||
return carttype;
|
||||
case 0x227E2220: carttype = 3; return carttype; // EZ4
|
||||
case 0x227EEA00: // EZFlash Omega
|
||||
carttype = 1;
|
||||
is3in1Plus = false;
|
||||
isSuperCard = false;
|
||||
isOmega = true;
|
||||
SetSDControl(0);
|
||||
Set_RTC_status(1);
|
||||
gl_ingame_RTC_open_status = Read_SET_info(13);
|
||||
if( (gl_ingame_RTC_open_status != 0x0) && (gl_ingame_RTC_open_status != 0x1))gl_ingame_RTC_open_status = 0x1;
|
||||
Omega_Bank_Switching(0);
|
||||
Set_AUTO_save(0);
|
||||
return carttype;
|
||||
case 0x227E0000: // SuperCard
|
||||
carttype = 6;
|
||||
is3in1Plus = false;
|
||||
isSuperCard = true;
|
||||
return carttype;
|
||||
case 0x89168916: // 3in1 Plus
|
||||
is3in1Plus = true;
|
||||
isSuperCard = false;
|
||||
carttype = 1;
|
||||
return carttype;
|
||||
default: return 0; // Unsupported/Unimplemented Cart ID
|
||||
}
|
||||
}
|
||||
@ -489,12 +520,12 @@ int checkSRAM(char *name) {
|
||||
if(ctrl.sign[i] != Rudolph[i])break;
|
||||
}
|
||||
|
||||
if((carttype < 4) && !isSuperCard)OpenNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)OpenNorWrite();
|
||||
|
||||
if(Rudolph[i] != 0) {
|
||||
strcpy((char *)ctrl.sign, Rudolph);
|
||||
ctrl_set();
|
||||
if((carttype < 4) && !isSuperCard)CloseNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite();
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -513,11 +544,11 @@ int checkSRAM(char *name) {
|
||||
savesize = 0x10000;
|
||||
ctrl.save_siz[GBAmode] = savesize;
|
||||
ctrl_set();
|
||||
if((carttype < 4) && !isSuperCard)CloseNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite();
|
||||
return false;
|
||||
}
|
||||
|
||||
if((carttype < 4) && !isSuperCard)CloseNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -641,30 +672,27 @@ void writeSramToFile(char *savename) {
|
||||
|
||||
ctrl.save_flg[GBAmode] = 0xFF;
|
||||
|
||||
if((carttype < 4) && !isSuperCard)OpenNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite();
|
||||
|
||||
ctrl_set();
|
||||
|
||||
if((carttype < 4) && !isSuperCard)CloseNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite();
|
||||
}
|
||||
|
||||
// void _WritePSram(uint32 address, u8* data , uint32 size);
|
||||
|
||||
void SRAMdump(int cmd) {
|
||||
FILE *dmp;
|
||||
FILE *dmp;
|
||||
int i;
|
||||
int mx;
|
||||
char name[256];
|
||||
char name[256];
|
||||
|
||||
mx = 8;
|
||||
if(carttype == 4)
|
||||
mx = 4;
|
||||
if(carttype == 5)
|
||||
mx = 2;
|
||||
if(carttype == 6)
|
||||
mx = 16;
|
||||
|
||||
|
||||
|
||||
switch (carttype) {
|
||||
case 4: mx = 4; break;
|
||||
case 5: mx = 2; break;
|
||||
case 6: mx = 16; break;
|
||||
}
|
||||
|
||||
sprintf(name, "%s/SRAM.BIN", ini.save_dir);
|
||||
if(cmd == 0) {
|
||||
dmp = fopen(name, "wb");
|
||||
@ -672,19 +700,19 @@ void SRAMdump(int cmd) {
|
||||
if(carttype == 6) {
|
||||
SetM3Ram(i);
|
||||
} else {
|
||||
if((carttype >= 4) && !isSuperCard) {
|
||||
SetEWINRam(8 + i);
|
||||
if((carttype >= 4) && !isSuperCard) {
|
||||
SetEWINRam(8 + i);
|
||||
} else {
|
||||
if (isOmega && (i > 4))Omega_Bank_Switching(0x01);
|
||||
SetRampage(i * 16);
|
||||
}
|
||||
}
|
||||
ReadSram(SRAM_ADDR, rwbuf, USE_SRAM / 2);
|
||||
if(dmp != NULL)
|
||||
fwrite(rwbuf, 1, USE_SRAM / 2, dmp);
|
||||
if(dmp != NULL)fwrite(rwbuf, 1, USE_SRAM / 2, dmp);
|
||||
}
|
||||
} else {
|
||||
dmp = fopen(name, "rb");
|
||||
if((carttype < 4) && !isSuperCard)OpenNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite();
|
||||
|
||||
for(i = 0; i < mx; i++) {
|
||||
memset(rwbuf, 0, USE_SRAM / 2);
|
||||
@ -696,15 +724,17 @@ void SRAMdump(int cmd) {
|
||||
if((carttype >= 4) && !isSuperCard) {
|
||||
SetEWINRam(8 + i);
|
||||
} else {
|
||||
if (isOmega && (i > 4))Omega_Bank_Switching(0x01);
|
||||
SetRampage(i * 16);
|
||||
}
|
||||
}
|
||||
WriteSram(SRAM_ADDR, rwbuf, USE_SRAM / 2);
|
||||
}
|
||||
|
||||
if((carttype < 4) && !isSuperCard)CloseNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite();
|
||||
}
|
||||
fclose(dmp);
|
||||
if (isOmega)Omega_Bank_Switching(0);
|
||||
_RamSave(0);
|
||||
}
|
||||
|
||||
@ -712,14 +742,14 @@ void blankSRAM(char *savename) {
|
||||
|
||||
memset(rwbuf, 0xFF, USE_SRAM / 2);
|
||||
|
||||
if((carttype < 4) && !isSuperCard)OpenNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite();
|
||||
|
||||
_RamSave(0);
|
||||
WriteSram(SRAM_ADDR, rwbuf, USE_SRAM / 2);
|
||||
|
||||
// if(carttype != 5) {
|
||||
_RamSave(1);
|
||||
WriteSram(SRAM_ADDR, rwbuf, USE_SRAM / 2);
|
||||
_RamSave(1);
|
||||
WriteSram(SRAM_ADDR, rwbuf, USE_SRAM / 2);
|
||||
// }
|
||||
|
||||
ctrl.save_siz[GBAmode] = savesize;
|
||||
@ -728,7 +758,7 @@ void blankSRAM(char *savename) {
|
||||
strcpy((char *)ctrl.sav_nam[GBAmode], savename);
|
||||
ctrl_set();
|
||||
|
||||
if((carttype < 4) && !isSuperCard)CloseNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite();
|
||||
}
|
||||
|
||||
void writeSramFromFile(char *savename) {
|
||||
@ -747,7 +777,7 @@ void writeSramFromFile(char *savename) {
|
||||
}
|
||||
|
||||
|
||||
if((carttype < 4) && !isSuperCard)OpenNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite();
|
||||
|
||||
ctrl.save_siz[GBAmode] = savesize;
|
||||
ctrl.save_flg[GBAmode] = 0x00;
|
||||
@ -764,16 +794,16 @@ void writeSramFromFile(char *savename) {
|
||||
WriteSram(SRAM_ADDR, rwbuf, USE_SRAM / 2);
|
||||
|
||||
// if(carttype != 5) {
|
||||
if(savesize > USE_SRAM / 2) {
|
||||
_RamSave(1);
|
||||
memset(rwbuf, 0xFF, USE_SRAM / 2);
|
||||
fread(rwbuf, 1, USE_SRAM / 2, saver);
|
||||
WriteSram(SRAM_ADDR, rwbuf, USE_SRAM / 2);
|
||||
_RamSave(0);
|
||||
}
|
||||
if(savesize > USE_SRAM / 2) {
|
||||
_RamSave(1);
|
||||
memset(rwbuf, 0xFF, USE_SRAM / 2);
|
||||
fread(rwbuf, 1, USE_SRAM / 2, saver);
|
||||
WriteSram(SRAM_ADDR, rwbuf, USE_SRAM / 2);
|
||||
_RamSave(0);
|
||||
}
|
||||
// }
|
||||
|
||||
if((carttype < 4) && !isSuperCard)CloseNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite();
|
||||
|
||||
fclose(saver);
|
||||
}
|
||||
@ -787,13 +817,13 @@ void _ReadPSram(uint32 address, u8* data , uint32 size) {
|
||||
for(i = 0; i < size / 2; i++)pData[i] = sData[i];
|
||||
}
|
||||
|
||||
void _WritePSram(uint32 address, u8* data , uint32 size) {
|
||||
/*void _WritePSram(uint32 address, u8* data , uint32 size) {
|
||||
u32 i;
|
||||
u16* sData = (u16*)data;
|
||||
u16* pData = (u16*)address;
|
||||
|
||||
for(i = 0; i < size / 2; i++)pData[i] = sData[i];
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
extern void turn_off(int cmd);
|
||||
@ -816,7 +846,7 @@ int writeFileToNor(int sel) {
|
||||
if(fs[sel].filesize > fsz)return 1;
|
||||
|
||||
if(!checkSRAM(savName)) {
|
||||
err_cnf(4, 5);
|
||||
err_cnf(4, 5);
|
||||
} else {
|
||||
if(save_sel(1, savName) >= 0)writeSramToFile(savName);
|
||||
}
|
||||
@ -877,8 +907,8 @@ int writeFileToNor(int sel) {
|
||||
|
||||
dsp_bar(1, 100);
|
||||
fclose(gbaFile);
|
||||
|
||||
if (is3in1Plus)chip_reset();
|
||||
|
||||
// if (is3in1Plus)chip_reset();
|
||||
|
||||
CloseNorWrite();
|
||||
|
||||
@ -886,7 +916,7 @@ int writeFileToNor(int sel) {
|
||||
if(cmd >= 0) { writeSramFromFile(savName); } else { blankSRAM(savName); }
|
||||
|
||||
dsp_bar(-1, 100);
|
||||
// SetRampage(USE_SRAM_NOR);
|
||||
// SetRampage(USE_SRAM_NOR);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -899,20 +929,21 @@ int writeFileToRam(int sel) {
|
||||
u32 fsz;
|
||||
int cmd;
|
||||
bool gba;
|
||||
// Needed for EZFlash Omega
|
||||
u32 PSRamPage = 0;
|
||||
|
||||
if(carttype >= 3) { fsz = MAX_NOR; } else { fsz = MAX_PSRAM; }
|
||||
if (carttype >= 3) { fsz = MAX_NOR; } else if (isOmega) { fsz = MAX_NOR; } else { fsz = MAX_PSRAM; }
|
||||
|
||||
if(carttype >= 4) { exp = 0x08000000; } else { exp = 0x08060000; }
|
||||
if (carttype >= 4) { exp = 0x08000000; } else if (isOmega) { exp = 0x08800000; } else { exp = 0x08060000; }
|
||||
|
||||
exps = exp;
|
||||
|
||||
if(fs[sel].filesize > fsz)return 1;
|
||||
|
||||
|
||||
// if(checkSRAM(savName) == false) {
|
||||
// err_cnf(4, 5);
|
||||
// } else writeSramToFile(savName);
|
||||
|
||||
// if((fs[sel].Alias[strlen(fs[sel].Alias) - 3] != 'G') || (fs[sel].Alias[strlen(fs[sel].Alias) - 3] != 'g')) {
|
||||
if((fs[sel].filename[strlen(fs[sel].filename) - 3] != 'G') || (fs[sel].filename[strlen(fs[sel].filename) - 3] != 'g')) { gba = false; } else { gba = true; }
|
||||
|
||||
sprintf(tbuf, "%s%s", curpath, fs[sel].filename);
|
||||
@ -924,16 +955,19 @@ int writeFileToRam(int sel) {
|
||||
cmd = save_sel(0, savName);
|
||||
|
||||
// SetRampage(USE_SRAM_PSR);
|
||||
if((carttype < 4) && !isSuperCard) {
|
||||
if((carttype < 4) && !isSuperCard && !isOmega) {
|
||||
if(carttype == 3) { SetRompage(0x300 - 3); } else { SetRompage(384 - 3); }
|
||||
OpenNorWrite();
|
||||
}
|
||||
// savesize = gba_check(gbaFile, fs[sel].filesize, rwbuf, 0x100000);
|
||||
// if(savesize == 0)savesize = 0x8000;
|
||||
|
||||
|
||||
dsp_bar(2, -1);
|
||||
gba_check_int(fs[sel].filename);
|
||||
|
||||
if (isOmega)SetPSRampage(0);
|
||||
|
||||
DC_FlushRange((void*)rwbuf, (0x100000 + 0x400));
|
||||
|
||||
for(siz = 0; siz < fs[sel].filesize; siz += 0x100000, exp += 0x100000) {
|
||||
fseek(gbaFile, siz, SEEK_SET);
|
||||
@ -945,17 +979,31 @@ int writeFileToRam(int sel) {
|
||||
|
||||
savesize = gba_check_Ram1(rwbuf, 0x100000, fs[sel].filesize, siz);
|
||||
|
||||
_WritePSram(exp, rwbuf, 0x100000);
|
||||
// dmaCopy(rwbuf, (void *)exp, 0x100000);
|
||||
if (isOmega) {
|
||||
if (exp >= 0x09000000) {
|
||||
PSRamPage += 0x1000;
|
||||
SetPSRampage(PSRamPage);
|
||||
exp = 0x08800000;
|
||||
}
|
||||
}
|
||||
|
||||
// _WritePSram(exp, rwbuf, 0x100000);
|
||||
|
||||
dmaCopy((void*)rwbuf, (void*)exp, 0x100000);
|
||||
// dmaCopyWords(3, rwbuf, (void *)exp, 0x100000);
|
||||
}
|
||||
|
||||
|
||||
DC_FlushRange((void*)rwbuf, 0x100000);
|
||||
|
||||
if (isOmega)SetPSRampage(0);
|
||||
|
||||
dsp_bar(2, 100);
|
||||
gba_check_Ram2(exps, rwbuf, 0x100000, fs[sel].filesize);
|
||||
gba_patch_Ram(exps, fs[sel].filename, carttype);
|
||||
|
||||
fclose(gbaFile);
|
||||
|
||||
|
||||
// if(carttype == 5 && savesize == 0x20000) {
|
||||
// dsp_bar(-1, 100);
|
||||
// return(2);
|
||||
@ -966,16 +1014,28 @@ int writeFileToRam(int sel) {
|
||||
|
||||
dsp_bar(-1, 100);
|
||||
|
||||
if((carttype < 4) && !isSuperCard)CloseNorWrite();
|
||||
if((carttype < 4) && !isSuperCard && !isOmega)CloseNorWrite();
|
||||
|
||||
_RamSave(0);
|
||||
|
||||
if(carttype >= 4 && !isSuperCard) {
|
||||
if(carttype == 6) { Close_M3(); } else { Close_EWIN(); }
|
||||
}
|
||||
if(carttype == 3)SetRompage(0x300);
|
||||
if(carttype <= 2)SetRompage(384);
|
||||
|
||||
return(0);
|
||||
|
||||
if (isSuperCard)return 0;
|
||||
|
||||
if (isOmega) {
|
||||
Set_RTC_status(gl_ingame_RTC_open_status);
|
||||
SetRompage(0x200);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(carttype == 3) {
|
||||
SetRompage(0x300);
|
||||
} else if(carttype <= 2) {
|
||||
SetRompage(384);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -48,7 +48,7 @@ extern uint16* SubScreen;
|
||||
|
||||
#define BG_256_COLOR (BIT(7))
|
||||
|
||||
#define VERSTRING "v0.62"
|
||||
#define VERSTRING "v0.63"
|
||||
|
||||
int numFiles = 0;
|
||||
int numGames = 0;
|
||||
@ -68,6 +68,9 @@ bool softReset;
|
||||
extern int carttype;
|
||||
extern bool isSuperCard;
|
||||
extern bool is3in1Plus;
|
||||
extern bool isOmega;
|
||||
extern u16 gl_ingame_RTC_open_status;
|
||||
extern void SetSDControl(u16 control);
|
||||
|
||||
u32 inp_key() {
|
||||
u32 ky;
|
||||
@ -808,6 +811,7 @@ int gba_sel() {
|
||||
if((ky & KEY_L) && !isSuperCard) {
|
||||
if(GBAmode > 0) {
|
||||
GBAmode--;
|
||||
if ((GBAmode == 1) && isOmega)GBAmode--;
|
||||
setGBAmode();
|
||||
_gba_sel_dsp(sel, yc, 0);
|
||||
// cmd = -1;
|
||||
@ -818,9 +822,13 @@ int gba_sel() {
|
||||
if(softReset && (carttype > 2)) {
|
||||
cmd = 3;
|
||||
break;
|
||||
}
|
||||
} /*else if (softReset && isOmega) {
|
||||
cmd = 3;
|
||||
break;
|
||||
}*/
|
||||
if(GBAmode < cn && carttype <= 2) {
|
||||
GBAmode++;
|
||||
if ((GBAmode == 1) && isOmega)GBAmode++;
|
||||
setGBAmode();
|
||||
if(GBAmode == 2) {
|
||||
_gba_dsp(sel, 0, x, y+yc);
|
||||
@ -861,7 +869,8 @@ int gba_sel() {
|
||||
|
||||
if(ky & KEY_X) {
|
||||
if(GBAmode == 1) {
|
||||
if (!is3in1Plus)SetRompage(0);
|
||||
// if (!is3in1Plus)SetRompage(0);
|
||||
SetRompage(0);
|
||||
SetRampage(16);
|
||||
gbaMode();
|
||||
} else {
|
||||
@ -911,6 +920,7 @@ int gba_sel() {
|
||||
}
|
||||
} else {
|
||||
if(GBAmode == 0) {
|
||||
// if (is3in1Plus)SetRompage(0x100);
|
||||
// SetRompage(384);
|
||||
gbaMode();
|
||||
}
|
||||
@ -1006,7 +1016,9 @@ REG_EXMEMCNT = (reg & 0xFFE0) | (1 << 4) | (1 << 2) | 1;
|
||||
break;
|
||||
case 1:
|
||||
if (is3in1Plus) {
|
||||
ShinoPrint_SUB( SubScreen, 23*6, 1*12-2, (u8*)"[3in1Pls]", 0, 0, 0 );
|
||||
ShinoPrint_SUB( SubScreen, 23*6, 1*12-2, (u8*)"[3in1Pls]", 0, 0, 0 );
|
||||
} else if (isOmega) {
|
||||
ShinoPrint_SUB( SubScreen, 23*6, 1*12-2, (u8*)"[ Omega ]", 0, 0, 0 );
|
||||
} else {
|
||||
ShinoPrint_SUB( SubScreen, 23*6, 1*12-2, (u8*)" [ 3in1 ]", 0, 0, 0 );
|
||||
}
|
||||
@ -1037,12 +1049,15 @@ REG_EXMEMCNT = (reg & 0xFFE0) | (1 << 4) | (1 << 2) | 1;
|
||||
ShinoPrint_SUB( SubScreen, 8*6, 5*12, (u8*)tbuf, 3, 0, 1);
|
||||
**********************/
|
||||
|
||||
// SuperCard does not support 3in1's Rumble commands. :P
|
||||
if (isSuperCard) {
|
||||
// SuperCard and EZFlash Omega does not support 3in1's Rumble commands. :P
|
||||
/*if (isOmega) {
|
||||
softReset = false;
|
||||
} else */ if (isSuperCard) {
|
||||
softReset = false;
|
||||
} else {
|
||||
softReset = ret_menu_chk();
|
||||
}
|
||||
|
||||
|
||||
/******************************
|
||||
sprintf(tbuf, "0x27FFE18 = %08X", (*(vu32*)0x027FFE18));
|
||||
@ -1105,20 +1120,25 @@ inp_key();
|
||||
*(vu8*)0x027FFC35 = 0x00; // Šg’£
|
||||
switch(cmd) {
|
||||
case 0:
|
||||
SetShake(0xF0);
|
||||
if (!isSuperCard)SetShake(0xF0);
|
||||
break;
|
||||
case 1:
|
||||
SetShake(0xF1);
|
||||
if (!isSuperCard)SetShake(0xF1);
|
||||
break;
|
||||
case 2:
|
||||
SetShake(0xF2);
|
||||
if (!isSuperCard)SetShake(0xF2);
|
||||
break;
|
||||
case 3:
|
||||
if(carttype != 4) {
|
||||
SetRompage(0x300);
|
||||
if((carttype != 4) && !isSuperCard && !isOmega) {
|
||||
/*if (isOmega) {
|
||||
Set_RTC_status(gl_ingame_RTC_open_status);
|
||||
SetRompage(0x200);*/
|
||||
// } else {
|
||||
if (is3in1Plus) { SetRompage(0x100); } else { SetRompage(0x300); }
|
||||
OpenNorWrite();
|
||||
// }
|
||||
}
|
||||
RamClear();
|
||||
if(!isSuperCard)RamClear();
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user