Fix X button reset issue with 3in1 Plus ...

* 3 in 1 Plus remaining issue with x button option to boot to nor flash
game after having completed a norflash flash operation has now been
resolved. :D
* NorFlash menu appearing when hitting L after entering rumble selection
menu on Omega/Omega DE has been resolved. NorFlash menu now fully
disabled for Omega to avoid possible bricking of this cart.
* Screen init process for GBA Frame loader optimized.
This commit is contained in:
ApacheThunder 2024-07-11 22:54:46 -05:00
parent 7b62f440d2
commit ead3daa6b7
7 changed files with 72 additions and 43 deletions

View File

@ -315,7 +315,7 @@ void chip_reset() {
*((vu16*)0x08600000) = 0xF0; *((vu16*)0x08600000) = 0xF0;
return; return;
} else if(ID == 0x89168916) { } else if(ID == 0x89168916) {
*((vu16*)(FlashBase+0)) = 0x50; // *((vu16*)(FlashBase+0)) = 0x50;
*((vu16*)(FlashBase+0x1000*2)) = 0x50; *((vu16*)(FlashBase+0x1000*2)) = 0x50;
*((vu16*)(FlashBase+0)) = 0xFF; *((vu16*)(FlashBase+0)) = 0xFF;
*((vu16*)(FlashBase+0x1000*2)) = 0xFF; *((vu16*)(FlashBase+0x1000*2)) = 0xFF;
@ -568,6 +568,7 @@ void WriteNorFlashINTEL(u32 address,u8 *buffer,u32 size) {
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0xFF; *((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0xFF;
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1))) = 0xE8; *((vu16*)(FlashBase+mapaddress+(loopwrite>>1))) = 0xE8;
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0xE8; *((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0xE8;
// Disabling this fixes X button reset bug with 3in1 Plus.
// *((vu16*)(FlashBase+mapaddress+(loopwrite>>1))) = 0x70; // *((vu16*)(FlashBase+mapaddress+(loopwrite>>1))) = 0x70;
// *((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0x70; // *((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0x70;
v1=v2=0; v1=v2=0;
@ -593,6 +594,9 @@ void WriteNorFlashINTEL(u32 address,u8 *buffer,u32 size) {
break; break;
} }
} }
// Adding this fixes 3in1 Plus reset bug with X button.
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1))) = 0xFF;
*((vu16*)(FlashBase+mapaddress+(loopwrite>>1)+0x2000)) = 0xFF;
} }
} }
if(b512) { if(b512) {

View File

@ -537,12 +537,12 @@ int checkSRAM(char *name) {
if(ctrl.sign[i] != Rudolph[i])break; if(ctrl.sign[i] != Rudolph[i])break;
} }
if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)OpenNorWrite(); // if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)OpenNorWrite();
if(Rudolph[i] != 0) { if(Rudolph[i] != 0) {
strcpy((char *)ctrl.sign, Rudolph); strcpy((char *)ctrl.sign, Rudolph);
ctrl_set(); ctrl_set();
if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite(); // if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite();
return false; return false;
} }
@ -562,11 +562,11 @@ int checkSRAM(char *name) {
savesize = 0x10000; savesize = 0x10000;
ctrl.save_siz[GBAmode] = savesize; ctrl.save_siz[GBAmode] = savesize;
ctrl_set(); ctrl_set();
if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite(); // if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite();
return false; return false;
} }
if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite(); // if((carttype < 4) && !isSuperCard && !is3in1Plus && !isOmega)CloseNorWrite();
return true; return true;
} }
@ -719,7 +719,7 @@ void SRAMdump(int cmd) {
} else { } else {
dsp_bar(5, -1); dsp_bar(5, -1);
dmp = fopen(name, "rb"); dmp = fopen(name, "rb");
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite(); // if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite();
if (isOmega)Omega_Bank_Switching(0); if (isOmega)Omega_Bank_Switching(0);
@ -760,7 +760,7 @@ void SRAMdump(int cmd) {
} }
} }
} }
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite(); // if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite();
} }
fclose(dmp); fclose(dmp);
_RamSave(0); _RamSave(0);
@ -771,7 +771,7 @@ void blankSRAM(char *savename) {
memset(rwbuf, 0xFF, USE_SRAM / 2); memset(rwbuf, 0xFF, USE_SRAM / 2);
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite(); // if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite();
if (isOmega)Omega_Bank_Switching(0); if (isOmega)Omega_Bank_Switching(0);
@ -792,7 +792,7 @@ void blankSRAM(char *savename) {
strcpy((char *)ctrl.sav_nam[GBAmode], savename); strcpy((char *)ctrl.sav_nam[GBAmode], savename);
ctrl_set(); ctrl_set();
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite(); // if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite();
} }
void writeSramToFile(char *savename) { void writeSramToFile(char *savename) {
@ -827,11 +827,11 @@ void writeSramToFile(char *savename) {
ctrl.save_flg[GBAmode] = 0xFF; ctrl.save_flg[GBAmode] = 0xFF;
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite(); // if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite();
ctrl_set(); ctrl_set();
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite(); // if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite();
} }
void writeSramFromFile(char *savename) { void writeSramFromFile(char *savename) {
@ -849,7 +849,7 @@ void writeSramFromFile(char *savename) {
return; return;
} }
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite(); // if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)OpenNorWrite();
ctrl.save_siz[GBAmode] = savesize; ctrl.save_siz[GBAmode] = savesize;
ctrl.save_flg[GBAmode] = 0x00; ctrl.save_flg[GBAmode] = 0x00;
@ -878,7 +878,7 @@ void writeSramFromFile(char *savename) {
} }
// } // }
if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite(); // if((carttype < 4) && !isSuperCard && !isOmega && !is3in1Plus)CloseNorWrite();
fclose(saver); fclose(saver);
} }
@ -979,11 +979,10 @@ int writeFileToNor(int sel) {
dsp_bar(1, 100); dsp_bar(1, 100);
fclose(gbaFile); fclose(gbaFile);
// if (is3in1Plus)chip_reset();
CloseNorWrite(); CloseNorWrite();
dsp_bar(5, -1); dsp_bar(5, -1);
// getSaveFilename(sel, savName); // getSaveFilename(sel, savName);
if(cmd >= 0) { writeSramFromFile(savName); } else { blankSRAM(savName); } if(cmd >= 0) { writeSramFromFile(savName); } else { blankSRAM(savName); }
@ -993,7 +992,7 @@ int writeFileToNor(int sel) {
dsp_bar(-1, 100); dsp_bar(-1, 100);
// SetRampage(USE_SRAM_NOR); // SetRampage(USE_SRAM_NOR);
return(0); return 0;
} }

View File

@ -42,6 +42,7 @@
#include "ctrl_tbl.h" #include "ctrl_tbl.h"
#include "skin.h" #include "skin.h"
#include "message.h" #include "message.h"
#include "tonccpy.h"
extern uint16* MainScreen; extern uint16* MainScreen;
extern uint16* SubScreen; extern uint16* SubScreen;
@ -109,32 +110,33 @@ void turn_off(bool softReset) {
void gba_frame() { void gba_frame() {
int ret; int ret;
int x=0, y=0; int mode = 3; // old mode == 2
u16 *pDstBuf1; // int x = 0, y = 0;
u16 *pDstBuf2; // u16 *pDstBuf1;
// u16 *pDstBuf2;
if (access("/gbaframe.bmp", F_OK) == 0) { if (access("/gbaframe.bmp", F_OK) == 0) {
ret = LoadSkin(2, "/gbaframe.bmp"); ret = LoadSkin(mode, "/gbaframe.bmp");
if(ret)return; if(ret)return;
} }
sprintf(tbuf, "%s/gbaframe.bmp", ini.sign_dir); sprintf(tbuf, "%s/gbaframe.bmp", ini.sign_dir);
if (access(tbuf, F_OK) == 0) { if (access(tbuf, F_OK) == 0) {
ret = LoadSkin(2, tbuf); ret = LoadSkin(mode, tbuf);
if(ret)return; if(ret)return;
} }
if (access("/_system_/gbaframe.bmp", F_OK) == 0) { if (access("/_system_/gbaframe.bmp", F_OK) == 0) {
ret = LoadSkin(2, "/_system_/gbaframe.bmp"); ret = LoadSkin(mode, "/_system_/gbaframe.bmp");
if(ret)return; if(ret)return;
} }
if (access("/ttmenu/gbaframe.bmp", F_OK) == 0) { if (access("/ttmenu/gbaframe.bmp", F_OK) == 0) {
ret = LoadSkin(2, "/ttmenu/gbaframe.bmp"); ret = LoadSkin(mode, "/ttmenu/gbaframe.bmp");
if(ret)return; if(ret)return;
} }
pDstBuf1 = (u16*)0x06000000; /*pDstBuf1 = (u16*)0x06000000;
pDstBuf2 = (u16*)0x06020000; pDstBuf2 = (u16*)0x06020000;
for(y = 0; y < 192; y++) { for(y = 0; y < 192; y++) {
for(x = 0; x < 256; x++) { for(x = 0; x < 256; x++) {
@ -143,7 +145,7 @@ void gba_frame() {
} }
pDstBuf1 += 256; pDstBuf1 += 256;
pDstBuf2 += 256; pDstBuf2 += 256;
} }*/
} }
static void resetToSlot2() { static void resetToSlot2() {
@ -168,10 +170,28 @@ void gbaMode() {
if(strncmp(GBA_HEADER.gamecode, "PASS", 4) == 0)resetToSlot2(); if(strncmp(GBA_HEADER.gamecode, "PASS", 4) == 0)resetToSlot2();
videoSetMode(0); // videoSetMode(0);
videoSetModeSub(0); // videoSetModeSub(0);
vramSetPrimaryBanks(VRAM_A_MAIN_BG, VRAM_B_MAIN_BG, VRAM_C_MAIN_BG, VRAM_D_MAIN_BG); // vramSetPrimaryBanks(VRAM_A_MAIN_BG, VRAM_B_MAIN_BG, VRAM_C_MAIN_BG, VRAM_D_MAIN_BG);
videoSetMode(MODE_5_2D | DISPLAY_BG3_ACTIVE);
videoSetModeSub(MODE_5_2D | DISPLAY_BG3_ACTIVE);
vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
vramSetBankB(VRAM_B_MAIN_BG_0x06020000);
vramSetBankC(VRAM_C_SUB_BG_0x06200000);
vramSetBankD(VRAM_D_LCD);
// for the main screen
REG_BG3CNT = BG_BMP16_256x256 | BG_BMP_BASE(0) | BG_WRAP_OFF;
REG_BG3PA = 1 << 8; //scale x
REG_BG3PB = 0; //rotation x
REG_BG3PC = 0; //rotation y
REG_BG3PD = 1 << 8; //scale y
REG_BG3X = 0; //translation x
REG_BG3Y = 0; //translation y*/
toncset((void*)BG_BMP_RAM(0),0,0x18000);
toncset((void*)BG_BMP_RAM(8),0,0x18000);
swiWaitForVBlank();
if(PersonalData->gbaScreen) { lcdMainOnBottom(); } else { lcdMainOnTop(); } if(PersonalData->gbaScreen) { lcdMainOnBottom(); } else { lcdMainOnTop(); }
@ -180,6 +200,7 @@ void gbaMode() {
sysSetBusOwners(ARM7_OWNS_CARD, ARM7_OWNS_ROM); sysSetBusOwners(ARM7_OWNS_CARD, ARM7_OWNS_ROM);
fifoSendValue32(FIFO_USER_01, 1); fifoSendValue32(FIFO_USER_01, 1);
REG_IME = 0; REG_IME = 0;
irqDisable(IRQ_VBLANK);
while(1)swiWaitForVBlank(); while(1)swiWaitForVBlank();
} }
@ -847,7 +868,7 @@ int gba_sel() {
} }
break; break;
} else if (isOmega && (GBAmode == 0)) { } else if (isOmega && (GBAmode == 0)) {
SetRampage(0x8002); SetRompage(0x8002);
gbaMode(); gbaMode();
} }
} }

View File

@ -18,3 +18,4 @@ extern char *jstrncpy(char *s1, char *s2, size_t n);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -283,7 +283,7 @@ static bool intLoadBM(const char *bmpfn,u16 *pbm,const u32 bmw,const u32 bmh) {
ALIGN(4) static u16 *pBuf; ALIGN(4) static u16 *pBuf;
bool LoadSkin(int mod, char *Name) { bool LoadSkin(int mode, const char *Name) {
u16 *pDstBuf1; u16 *pDstBuf1;
u16 *pDstBuf2; u16 *pDstBuf2;
@ -291,7 +291,7 @@ bool LoadSkin(int mod, char *Name) {
pBuf = (u16*)malloc(256*192*2); pBuf = (u16*)malloc(256*192*2);
if(!intLoadBM(Name, pBuf, 256, 192)) { free(pBuf); return false; } if(!intLoadBM(Name, pBuf, 256, 192)) { free(pBuf); return false; }
switch (mod) { switch (mode) {
case 0: pDstBuf1 = (u16*)0x06020000; break; case 0: pDstBuf1 = (u16*)0x06020000; break;
case 1: pDstBuf1 = (u16*)0x06220000; break; case 1: pDstBuf1 = (u16*)0x06220000; break;
case 2: case 2:
@ -300,19 +300,22 @@ bool LoadSkin(int mod, char *Name) {
// pDstBuf1 = (u16*)0x06800000; // pDstBuf1 = (u16*)0x06800000;
// pDstBuf2 = (u16*)0x06820000; // pDstBuf2 = (u16*)0x06820000;
break; break;
case 3: {
pDstBuf1 = BG_BMP_RAM(0);
pDstBuf2 = BG_BMP_RAM(8);
} break;
default: pDstBuf1 = (u16*)0x06020000; break; default: pDstBuf1 = (u16*)0x06020000; break;
} }
for (s32 y = 0; y < 192; y++) { for (s32 y = 0; y < 192; y++) {
for (s32 x = 0; x < 256; x++) { for (s32 x = 0; x < 256; x++) {
pDstBuf1[x] = pBuf[x]; pDstBuf1[x] = pBuf[x];
if(mod == 2)pDstBuf2[x]=pBuf[x]; if ((mode == 2) || (mode == 3))pDstBuf2[x] = pBuf[x];
} }
pDstBuf1 += 256; pDstBuf1 += 256;
if(mod == 2)pDstBuf2+=256; if ((mode == 2) || (mode == 3))pDstBuf2 += 256;
pBuf += 256; pBuf += 256;
} }
// free(pBuf); // free(pBuf);
return true; return true;
} }

View File

@ -2,8 +2,9 @@
extern "C" { extern "C" {
#endif #endif
extern bool LoadSkin(int mod, char *Name); extern bool LoadSkin(int mode, const char *Name);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif