- fix support calibrating the stylus with firmware;
- some cleanup MMU;

addons:
- fix return value for blank memory (change to 0xFF);
This commit is contained in:
mtabachenko 2009-12-10 22:49:47 +00:00
parent 49667709bd
commit cf04dac50f
8 changed files with 140 additions and 64 deletions

View File

@ -125,7 +125,8 @@ void mmu_log_debug_ARM7(u32 adr, const char *fmt, ...)
if (adr < 0x4000004) return;
if (adr > 0x4808FFF) return;
#if 1
if (adr >= 0x4000004 && adr <= 0x40001C4) return; // ARM7 I/O Map
if (adr >= 0x4000004 && adr < 0x4000180) return; // ARM7 I/O Map
if (adr >= 0x4000180 && adr <= 0x40001C4) return; // IPC/ROM
if (adr >= 0x4000204 && adr <= 0x400030C) return; // Memory and IRQ Control
if (adr >= 0x4000400 && adr <= 0x400051E) return; // Sound Registers
if (adr >= 0x4100000 && adr <= 0x4100014) return; // IPC/ROM
@ -2343,7 +2344,7 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)
}
MMU.MMU_MEM[ARMCPU_ARM9][0x40][adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]]=val;
MMU.MMU_MEM[ARMCPU_ARM9][0x40][adr&MMU.MMU_MASK[ARMCPU_ARM9][0x40]]=val;
return;
}
@ -2833,7 +2834,7 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
}
}
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val);
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr&MMU.MMU_MASK[ARMCPU_ARM9][0x40], val);
return;
}
@ -3256,7 +3257,7 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
}
}
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val);
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM9][0x40], val);
return;
}
if(adr>=0x05000000 && adr<0x06200000)
@ -3304,6 +3305,7 @@ u8 FASTCALL _MMU_ARM9_read08(u32 adr)
case eng_3D_GXSTAT:
return MMU_new.gxstat.read(8,adr);
}
return MMU.MMU_MEM[ARMCPU_ARM9][0x40][adr&MMU.MMU_MASK[ARMCPU_ARM9][0x40]];
}
bool unmapped;
@ -3316,7 +3318,7 @@ u8 FASTCALL _MMU_ARM9_read08(u32 adr)
//================================================= MMU ARM9 read 16
u16 FASTCALL _MMU_ARM9_read16(u32 adr)
{
mmu_log_debug_ARM9(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM9][(adr >> 20) & 0xFF]));
mmu_log_debug_ARM9(adr, "(read16) 0x%04X", T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20]));
if(adr<0x02000000)
return T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, adr & 0x7FFE);
@ -3392,7 +3394,7 @@ u16 FASTCALL _MMU_ARM9_read16(u32 adr)
}
return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20]);
return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM9][0x40]);
}
bool unmapped;
@ -3406,7 +3408,7 @@ u16 FASTCALL _MMU_ARM9_read16(u32 adr)
//================================================= MMU ARM9 read 32
u32 FASTCALL _MMU_ARM9_read32(u32 adr)
{
mmu_log_debug_ARM9(adr, "(read32) 0x%08X", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM9][(adr >> 20)]));
mmu_log_debug_ARM9(adr, "(read32) 0x%08X", T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][(adr >> 20)], adr & MMU.MMU_MASK[ARMCPU_ARM9][(adr >> 20)]));
if(adr<0x02000000)
return T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, adr&0x7FFC);
@ -3500,7 +3502,7 @@ u32 FASTCALL _MMU_ARM9_read32(u32 adr)
case REG_GCDATAIN:
return MMU_readFromGC<ARMCPU_ARM9>();
}
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM9][(adr >> 20)]);
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM9][0x40]);
}
bool unmapped;
@ -3566,6 +3568,8 @@ void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val)
write_auxspicnt(9,8,1,val);
return;
}
MMU.MMU_MEM[ARMCPU_ARM7][0x40][adr&MMU.MMU_MASK[ARMCPU_ARM7][0x40]]=val;
return;
}
bool unmapped;
@ -3862,7 +3866,7 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
}
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val);
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr&MMU.MMU_MASK[ARMCPU_ARM7][0x40], val);
return;
}
@ -3977,7 +3981,7 @@ void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
MMU_writeToGCControl<ARMCPU_ARM7>(val);
return;
}
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val);
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM7][0x40], val);
return;
}
@ -4008,24 +4012,27 @@ u8 FASTCALL _MMU_ARM7_read08(u32 adr)
if (adr == REG_RTC) return (u8)rtcRead();
adr &= 0x0FFFFFFF;
if (adr >> 24 == 4)
{
if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,8,adr);
// Address is an IO register
//switch(adr) {}
return MMU.MMU_MEM[ARMCPU_ARM7][0x40][adr&MMU.MMU_MASK[ARMCPU_ARM7][0x40]];
}
bool unmapped;
adr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped);
if(unmapped) return 0;
return MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]];
return MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]];
}
//================================================= MMU ARM7 read 16
u16 FASTCALL _MMU_ARM7_read16(u32 adr)
{
mmu_log_debug_ARM7(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr >> 20) & 0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr >> 20) & 0xFF]));
mmu_log_debug_ARM7(adr, "(read16) 0x%04X", T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]));
//wifi mac access
if ((adr>=0x04800000)&&(adr<0x05000000))
@ -4078,7 +4085,7 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr)
case REG_POSTFLG:
return 1;
}
return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]);
return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM7][0x40]);
}
bool unmapped;
@ -4092,7 +4099,7 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr)
//================================================= MMU ARM7 read 32
u32 FASTCALL _MMU_ARM7_read32(u32 adr)
{
mmu_log_debug_ARM7(adr, "(read32) 0x%08X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr >> 20) & 0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr >> 20) & 0xFF]));
mmu_log_debug_ARM7(adr, "(read32) 0x%08X", T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][(adr >> 20)], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr >> 20)]));
//wifi mac access
if ((adr>=0x04800000)&&(adr<0x05000000))
@ -4138,7 +4145,7 @@ u32 FASTCALL _MMU_ARM7_read32(u32 adr)
return MMU_readFromGC<ARMCPU_ARM7>();
}
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][(adr >> 20)], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr >> 20)]);
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][0x40], adr & MMU.MMU_MASK[ARMCPU_ARM7][0x40]);
}
bool unmapped;

View File

@ -1876,6 +1876,10 @@ void NDS_Reset()
INFO("ARM7 BIOS is loaded.\n");
} else {
NDS_ARM7.swi_tab = ARM7_swi_tab;
for (int t = 0; t < 16384; t++)
MMU.ARM7_BIOS[t] = 0xFF;
_MMU_write32<ARMCPU_ARM7>(0x00, 0xE25EF002);
_MMU_write32<ARMCPU_ARM7>(0x04, 0xEAFFFFFE);
_MMU_write32<ARMCPU_ARM7>(0x18, 0xEA000000);
@ -1902,18 +1906,7 @@ void NDS_Reset()
INFO("ARM9 BIOS is loaded.\n");
} else {
NDS_ARM9.swi_tab = ARM9_swi_tab;
#if 0
_MMU_write32<ARMCPU_ARM9>(0xFFFF0018, 0xEA000000);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0020, 0xE92D500F);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0024, 0xEE190F11);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0028, 0xE1A00620);
_MMU_write32<ARMCPU_ARM9>(0xFFFF002C, 0xE1A00600);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0030, 0xE2800C40);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0034, 0xE28FE000);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0038, 0xE510F004);
_MMU_write32<ARMCPU_ARM9>(0xFFFF003C, 0xE8BD500F);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0040, 0xE25EF004);
#else
for (int t = 0; t < 4096; t++)
MMU.ARM9_BIOS[t] = 0xFF;
@ -1931,7 +1924,6 @@ void NDS_Reset()
_MMU_write32<ARMCPU_ARM9>(0xFFFF028C, 0xE510F004);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0290, 0xE8BD500F);
_MMU_write32<ARMCPU_ARM9>(0xFFFF0294, 0xE25EF004);
#endif
}
if (firmware)
@ -2075,14 +2067,19 @@ void NDS_Reset()
// Save touchscreen calibration info in a structure
// so we can easily access it at any time
TSCal.adc.x1 = _MMU_read16<ARMCPU_ARM9>(0x027FFC80 + 0x58);
TSCal.adc.y1 = _MMU_read16<ARMCPU_ARM9>(0x027FFC80 + 0x5A);
TSCal.scr.x1 = _MMU_read08<ARMCPU_ARM9>(0x027FFC80 + 0x5C);
TSCal.scr.y1 = _MMU_read08<ARMCPU_ARM9>(0x027FFC80 + 0x5D);
TSCal.adc.x2 = _MMU_read16<ARMCPU_ARM9>(0x027FFC80 + 0x5E);
TSCal.adc.y2 = _MMU_read16<ARMCPU_ARM9>(0x027FFC80 + 0x60);
TSCal.scr.x2 = _MMU_read08<ARMCPU_ARM9>(0x027FFC80 + 0x62);
TSCal.scr.y2 = _MMU_read08<ARMCPU_ARM9>(0x027FFC80 + 0x63);
TSCal.adc.x1 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x58);
TSCal.adc.y1 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x5A);
TSCal.scr.x1 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x5C);
TSCal.scr.y1 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x5D);
TSCal.adc.x2 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x5E);
TSCal.adc.y2 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x60);
TSCal.scr.x2 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x62);
TSCal.scr.y2 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x63);
TSCal.adc.width = (TSCal.adc.x2 - TSCal.adc.x1);
TSCal.adc.height = (TSCal.adc.y2 - TSCal.adc.y1);
TSCal.scr.width = (TSCal.scr.x2 - TSCal.scr.x1);
TSCal.scr.height = (TSCal.scr.y2 - TSCal.scr.y1);
MainScreen.offset = 0;
SubScreen.offset = 192;
@ -2143,13 +2140,13 @@ INLINE u16 NDS_getADCTouchPosX(u16 scrX)
// we're basically adjusting the ADC results to
// compensate for how they will be interpreted.
// the actual system doesn't do this transformation.
int rv = (scrX - TSCal.scr.x1 + 1) * (TSCal.adc.x2 - TSCal.adc.x1) / (TSCal.scr.x2 - TSCal.scr.x1) + TSCal.adc.x1;
int rv = (scrX - TSCal.scr.x1 + 1) * TSCal.adc.width / TSCal.scr.width + TSCal.adc.x1;
rv = min(0xFFF, max(0, rv));
return (u16)rv;
}
INLINE u16 NDS_getADCTouchPosY(u16 scrY)
{
int rv = (scrY - TSCal.scr.y1 + 1) * (TSCal.adc.y2 - TSCal.adc.y1) / (TSCal.scr.y2 - TSCal.scr.y1) + TSCal.adc.y1;
int rv = (scrY - TSCal.scr.y1 + 1) * TSCal.adc.height / TSCal.scr.height + TSCal.adc.y1;
rv = min(0xFFF, max(0, rv));
return (u16)rv;
}

View File

@ -295,12 +295,16 @@ typedef struct TSCalInfo
{
u16 x1, x2;
u16 y1, y2;
u16 width;
u16 height;
} adc;
struct scr
{
u8 x1, x2;
u8 y1, y2;
u16 width;
u16 height;
} scr;
} TSCalInfo;

View File

@ -92,7 +92,7 @@ static u8 ExpMemory_read08(u32 adr)
if (adr >= 0x09000000)
{
u32 offs = (adr - 0x09000000);
if (offs >= expMemSize) return (0);
if (offs >= expMemSize) return (0xFF);
return (T1ReadByte(expMemory, offs));
}
@ -109,7 +109,7 @@ static u16 ExpMemory_read16(u32 adr)
if (adr >= 0x09000000)
{
u32 offs = (adr - 0x09000000);
if (offs >= expMemSize) return (0);
if (offs >= expMemSize) return (0xFFFF);
return (T1ReadWord(expMemory, offs));
}
@ -123,7 +123,7 @@ static u32 ExpMemory_read32(u32 adr)
if (adr >= 0x09000000)
{
u32 offs = (adr - 0x09000000);
if (offs >= expMemSize) return (0);
if (offs >= expMemSize) return (0xFFFFFFFF);
return (T1ReadLong(expMemory, offs));
}

View File

@ -38,7 +38,7 @@ static u8 guitarGrip_read08(u32 adr)
{
//INFO("GuitarGrip: read 08 at 0x%08X\n", adr);
if (adr == 0x0A000000) return (~guitarKeyStatus);
return (0x0);
return (0xFF);
}
static u16 guitarGrip_read16(u32 adr)
{
@ -46,12 +46,12 @@ static u16 guitarGrip_read16(u32 adr)
if (adr == 0x080000BE) return (0xF9FF);
if (adr == 0x0801FFFE) return (0xF9FF);
return (0);
return (0xFFFF);
}
static u32 guitarGrip_read32(u32 adr)
{
//INFO("GuitarGrip: read 32 at 0x%08X\n", adr);
return (0);
return (0xFFFFFFFF);
}
static void guitarGrip_info(char *info) { strcpy(info, "Guitar Grip for Guitar Hero games"); }

View File

@ -28,9 +28,9 @@ static void None_config(void) {}
static void None_write08(u32 adr, u8 val) {}
static void None_write16(u32 adr, u16 val) {}
static void None_write32(u32 adr, u32 val) {}
static u8 None_read08(u32 adr){ return (0); }
static u16 None_read16(u32 adr){ return (0); }
static u32 None_read32(u32 adr){ return (0); }
static u8 None_read08(u32 adr){ return (0xFF); }
static u16 None_read16(u32 adr){ return (0xFFFF); }
static u32 None_read32(u32 adr){ return (0xFFFFFFFF); }
static void None_info(char *info) { strcpy(info, "Nothing in GBA slot"); }
ADDONINTERFACE addonNone = {

View File

@ -57,7 +57,7 @@ static void RumblePak_write32(u32 adr, u32 val)
static u8 RumblePak_read08(u32 adr)
{
return (0);
return (0xFF);
}
static u16 RumblePak_read16(u32 adr)
@ -70,7 +70,7 @@ static u16 RumblePak_read16(u32 adr)
static u32 RumblePak_read32(u32 adr)
{
return (0);
return (0xFFFFFFFF);
}
static void RumblePak_info(char *info)

View File

@ -65,7 +65,7 @@ void CFIRMWARE::crypt64BitDown(u32 *ptr)
u32 Z = (keyBuf[i] ^ X);
X = keyBuf[DWNUM(0x048 + (((Z >> 24) & 0xFF) << 2))];
X = (keyBuf[DWNUM(0x448 + (((Z >> 16) & 0xFF) << 2))] + X);
X = (keyBuf[DWNUM(0x848 + (((Z >> 8) & 0xFF) << 2))] ^ X);
X = (keyBuf[DWNUM(0x848 + (((Z >> 8) & 0xFF) << 2))] ^ X);
X = (keyBuf[DWNUM(0xC48 + ((Z & 0xFF) << 2))] + X);
X = (Y ^ X);
Y = Z;
@ -117,7 +117,6 @@ bool CFIRMWARE::initKeycode(u32 idCode, int level, u32 modulo)
return TRUE;
}
// TODO
u16 CFIRMWARE::getBootCodeCRC16()
{
unsigned int i, j;
@ -338,11 +337,14 @@ bool CFIRMWARE::load()
u32 src = 0;
if (CommonSettings.UseExtFirmware == false) return false;
if (strlen(CommonSettings.Firmware) == 0) return false;
if (CommonSettings.UseExtFirmware == false)
return false;
if (strlen(CommonSettings.Firmware) == 0)
return false;
FILE *fp = fopen(CommonSettings.Firmware, "rb");
if (!fp) return false;
if (!fp)
return false;
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
@ -352,13 +354,28 @@ bool CFIRMWARE::load()
return false;
}
data = new u8 [size];
if (!data) { fclose(fp); return false; }
if (fread(data, 1, size, fp) != size) { delete [] data; fclose(fp); return false; }
if (!data)
{
fclose(fp);
return false;
}
if (fread(data, 1, size, fp) != size)
{
delete [] data;
fclose(fp);
return false;
}
memcpy(&header, data, sizeof(header));
if ((header.fw_identifier[0] != 'M') ||
(header.fw_identifier[1] != 'A') ||
(header.fw_identifier[2] != 'C')) { delete [] data; fclose(fp); return false; }
(header.fw_identifier[2] != 'C'))
{
delete [] data;
fclose(fp);
return false;
}
shift1 = ((header.shift_amounts >> 0) & 0x07);
shift2 = ((header.shift_amounts >> 3) & 0x07);
@ -377,24 +394,64 @@ bool CFIRMWARE::load()
ARM9bootAddr = part1ram;
ARM7bootAddr = part2ram;
if(initKeycode(T1ReadLong(data, 0x08), 1, 0xC) == FALSE) { delete [] data; fclose(fp); return false; };
if(initKeycode(T1ReadLong(data, 0x08), 1, 0xC) == FALSE)
{
delete [] data;
fclose(fp);
return false;
}
#if 0
crypt64BitDown((u32*)&data[0x18]);
if(initKeycode(T1ReadLong(data, 0x08), 2, 0xC) == FALSE) { delete [] data; fclose(fp); return false; };
#else
// hack?
data[0x18] = 0x00;
data[0x19] = 0x00;
data[0x1A] = 0x00;
data[0x1B] = 0x00;
data[0x1C] = 0x00;
data[0x1D] = 0xFF;
data[0x1E] = 0x00;
data[0x1F] = 0x00;
#endif
if(initKeycode(T1ReadLong(data, 0x08), 2, 0xC) == FALSE)
{
delete [] data;
fclose(fp);
return false;
}
size9 = decrypt(data + part1addr, tmp_data9);
if (!tmp_data9) { delete [] data; fclose(fp); return false; };
if (!tmp_data9)
{
delete [] data;
fclose(fp);
return false;
}
size7 = decrypt(data + part2addr, tmp_data7);
if (!tmp_data7) { delete [] tmp_data9; delete [] data; fclose(fp); return false; };
if (!tmp_data7)
{
delete [] tmp_data9;
delete [] data;
fclose(fp);
return false;
}
u16 crc16_mine = getBootCodeCRC16();
if (crc16_mine != header.part12_boot_crc16)
{
INFO("Firmware: ERROR: the boot code CRC16 (0x%04X) doesn't match the value in the firmware header (0x%04X)", crc16_mine, header.part12_boot_crc16);
delete [] tmp_data9; delete [] tmp_data7; delete [] data; fclose(fp);
delete [] tmp_data9;
delete [] tmp_data7;
delete [] data;
fclose(fp);
return false;
}
// Copy firmware boot codes to their respective locations
src = 0;
for(u32 i = 0; i < (size9 >> 2); i++)
@ -469,10 +526,21 @@ bool CFIRMWARE::load()
ARM7bootAddr = part2ram;
size9 = decompress(data + part1addr, tmp_data9);
if (!tmp_data9) { delete [] data; fclose(fp); return false; };
if (!tmp_data9)
{
delete [] data;
fclose(fp);
return false;
}
size7 = decompress(data + part2addr, tmp_data7);
if (!tmp_data7) { delete [] tmp_data9; delete [] data; fclose(fp); return false; };
if (!tmp_data7)
{
delete [] tmp_data9;
delete [] data;
fclose(fp);
return false;
};
// Copy firmware boot codes to their respective locations
src = 0;
for(u32 i = 0; i < (size9 >> 2); i++)