core:
- fix touch screen calibrate when use external firmware;
This commit is contained in:
parent
7f88812fa9
commit
da29c3f483
|
@ -2720,7 +2720,9 @@ bool validateIORegsWrite(u32 addr, u8 size, u32 val)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
#ifdef DEVELOPER
|
||||||
printf("MMU9 write%02d to undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr);
|
printf("MMU9 write%02d to undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr);
|
||||||
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2814,7 +2816,9 @@ bool validateIORegsWrite(u32 addr, u8 size, u32 val)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
#ifdef DEVELOPER
|
||||||
printf("MMU7 write%02d to undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr);
|
printf("MMU7 write%02d to undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr);
|
||||||
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3087,7 +3091,9 @@ bool validateIORegsRead(u32 addr, u8 size)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
#ifdef DEVELOPER
|
||||||
printf("MMU9 read%02d from undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, T1ReadLong(MMU.ARM9_REG, addr & 0x00FFFFFF), ARMPROC.instruct_adr);
|
printf("MMU9 read%02d from undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, T1ReadLong(MMU.ARM9_REG, addr & 0x00FFFFFF), ARMPROC.instruct_adr);
|
||||||
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3181,7 +3187,9 @@ bool validateIORegsRead(u32 addr, u8 size)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
#ifdef DEVELOPER
|
||||||
printf("MMU7 read%02d from undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, T1ReadLong(MMU.ARM7_REG, addr & 0x00FFFFFF), ARMPROC.instruct_adr);
|
printf("MMU7 read%02d from undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, T1ReadLong(MMU.ARM7_REG, addr & 0x00FFFFFF), ARMPROC.instruct_adr);
|
||||||
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,20 +133,6 @@ int NDS_Init( void)
|
||||||
|
|
||||||
WIFI_Init() ;
|
WIFI_Init() ;
|
||||||
|
|
||||||
// Init calibration info
|
|
||||||
TSCal.adc.x1 = 0x0200;
|
|
||||||
TSCal.adc.y1 = 0x0200;
|
|
||||||
TSCal.scr.x1 = 0x20 + 1; // calibration screen coords are 1-based,
|
|
||||||
TSCal.scr.y1 = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong.
|
|
||||||
TSCal.adc.x2 = 0x0E00;
|
|
||||||
TSCal.adc.y2 = 0x0800;
|
|
||||||
TSCal.scr.x2 = 0xE0 + 1;
|
|
||||||
TSCal.scr.y2 = 0x80 + 1;
|
|
||||||
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);
|
|
||||||
|
|
||||||
cheats = new CHEATS();
|
cheats = new CHEATS();
|
||||||
cheatSearch = new CHEATSEARCH();
|
cheatSearch = new CHEATSEARCH();
|
||||||
|
|
||||||
|
@ -2489,9 +2475,6 @@ bool NDS_LegitBoot()
|
||||||
CommonSettings.jit_max_block_size = std::min(CommonSettings.jit_max_block_size,12U);
|
CommonSettings.jit_max_block_size = std::min(CommonSettings.jit_max_block_size,12U);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//crazymax: how would it have got whacked? dont think we need this
|
|
||||||
//gameInfo.restoreSecureArea();
|
|
||||||
|
|
||||||
//partially clobber the loaded firmware with the user settings from DFC
|
//partially clobber the loaded firmware with the user settings from DFC
|
||||||
firmware->loadSettings();
|
firmware->loadSettings();
|
||||||
|
|
||||||
|
@ -2503,24 +2486,6 @@ bool NDS_LegitBoot()
|
||||||
armcpu_init(&NDS_ARM7, 0x00000000);
|
armcpu_init(&NDS_ARM7, 0x00000000);
|
||||||
armcpu_init(&NDS_ARM9, 0xFFFF0000);
|
armcpu_init(&NDS_ARM9, 0xFFFF0000);
|
||||||
|
|
||||||
// TODO: hack!!!
|
|
||||||
// possible explanation - since we can't generally trust calibration info from the firmware (who's bothered to set it up?)
|
|
||||||
// we don't bother to use the firmware's configured calibration info, and just enter our own.
|
|
||||||
// Can someone verify this?
|
|
||||||
// TODO - this isn't good. need revising.
|
|
||||||
TSCal.adc.x1 = 0x0228;
|
|
||||||
TSCal.adc.y1 = 0x0350;
|
|
||||||
TSCal.scr.x1 = 0x0020;
|
|
||||||
TSCal.scr.y1 = 0x0020;
|
|
||||||
TSCal.adc.x2 = 0x0DA0;
|
|
||||||
TSCal.adc.y2 = 0x0BFC;
|
|
||||||
TSCal.scr.x2 = 0xE0;
|
|
||||||
TSCal.scr.y2 = 0xA0;
|
|
||||||
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);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2636,22 +2601,6 @@ bool NDS_FakeBoot()
|
||||||
// Write the header checksum to memory
|
// Write the header checksum to memory
|
||||||
_MMU_write16<ARMCPU_ARM9>(0x027FF808, gameInfo.header.headerCRC16);
|
_MMU_write16<ARMCPU_ARM9>(0x027FF808, gameInfo.header.headerCRC16);
|
||||||
|
|
||||||
// Save touchscreen calibration info in a structure
|
|
||||||
// so we can easily access it at any time
|
|
||||||
// TODO - this isn't good. need revising.
|
|
||||||
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);
|
|
||||||
|
|
||||||
//bitbox 4k demo is so stripped down it relies on default stack values
|
//bitbox 4k demo is so stripped down it relies on default stack values
|
||||||
//otherwise the arm7 will crash before making a sound
|
//otherwise the arm7 will crash before making a sound
|
||||||
//(these according to gbatek softreset bios docs)
|
//(these according to gbatek softreset bios docs)
|
||||||
|
@ -2792,6 +2741,9 @@ void NDS_Reset()
|
||||||
else
|
else
|
||||||
bootResult = NDS_FakeBoot();
|
bootResult = NDS_FakeBoot();
|
||||||
|
|
||||||
|
// Init calibration info
|
||||||
|
memcpy(&TSCal, firmware->getTouchCalibrate(), sizeof(TSCalInfo));
|
||||||
|
|
||||||
Screen_Reset();
|
Screen_Reset();
|
||||||
gfx3d_reset();
|
gfx3d_reset();
|
||||||
gpu3D->NDS_3D_Reset();
|
gpu3D->NDS_3D_Reset();
|
||||||
|
|
|
@ -166,10 +166,11 @@ enum ENSATA_HANDSHAKE
|
||||||
|
|
||||||
enum NDS_CONSOLE_TYPE
|
enum NDS_CONSOLE_TYPE
|
||||||
{
|
{
|
||||||
NDS_CONSOLE_TYPE_FAT,
|
NDS_CONSOLE_TYPE_FAT = 0xFF,
|
||||||
NDS_CONSOLE_TYPE_LITE,
|
NDS_CONSOLE_TYPE_LITE = 0x20,
|
||||||
NDS_CONSOLE_TYPE_IQUE,
|
NDS_CONSOLE_TYPE_IQUE = 0x43,
|
||||||
NDS_CONSOLE_TYPE_DSI
|
NDS_CONSOLE_TYPE_IQUE_LIE = 0x63,
|
||||||
|
NDS_CONSOLE_TYPE_DSI = 0xFE
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NDSSystem
|
struct NDSSystem
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "firmware.h"
|
#include "firmware.h"
|
||||||
#include "NDSSystem.h"
|
#include "NDSSystem.h"
|
||||||
|
#include "MMU.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "encrypt.h"
|
#include "encrypt.h"
|
||||||
|
|
||||||
|
@ -294,6 +295,15 @@ bool CFIRMWARE::load()
|
||||||
|
|
||||||
userDataAddr = T1ReadWord(data, 0x20) * 8;
|
userDataAddr = T1ReadWord(data, 0x20) * 8;
|
||||||
|
|
||||||
|
// fix bad dump of firmware? (wrong DS type)
|
||||||
|
// fix mario kart touch screen calibration
|
||||||
|
if ((T1ReadWord(data, 0x1E) != 0xFFFF) && data[0x1D] == 0x63)
|
||||||
|
{
|
||||||
|
data[0x1D] = NDS_CONSOLE_TYPE_FAT;
|
||||||
|
data[0x1E] = 0xFF;
|
||||||
|
data[0x1F] = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(MMU.fw.data, data, size);
|
memcpy(MMU.fw.data, data, size);
|
||||||
|
|
||||||
delete [] data;
|
delete [] data;
|
||||||
|
@ -597,6 +607,41 @@ std::string CFIRMWARE::GetExternalFilePath()
|
||||||
return finalPath;
|
return finalPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *CFIRMWARE::getTouchCalibrate()
|
||||||
|
{
|
||||||
|
static TSCalInfo cal = {0};
|
||||||
|
|
||||||
|
if (!successLoad || !CommonSettings.UseExtFirmware || !successLoad)
|
||||||
|
{
|
||||||
|
cal.adc.x1 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x58) & 0x1FFF;
|
||||||
|
cal.adc.y1 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x5A) & 0x1FFF;
|
||||||
|
cal.scr.x1 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x5C);
|
||||||
|
cal.scr.y1 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x5D);
|
||||||
|
cal.adc.x2 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x5E) & 0x1FFF;
|
||||||
|
cal.adc.y2 = _MMU_read16<ARMCPU_ARM7>(0x027FFC80 + 0x60) & 0x1FFF;
|
||||||
|
cal.scr.x2 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x62);
|
||||||
|
cal.scr.y2 = _MMU_read08<ARMCPU_ARM7>(0x027FFC80 + 0x63);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cal.adc.x1 = T1ReadWord(MMU.fw.data, userDataAddr + 0x58) & 0x1FFF;
|
||||||
|
cal.adc.y1 = T1ReadWord(MMU.fw.data, userDataAddr + 0x5A) & 0x1FFF;
|
||||||
|
cal.scr.x1 = T1ReadByte(MMU.fw.data, userDataAddr + 0x5C);
|
||||||
|
cal.scr.y1 = T1ReadByte(MMU.fw.data, userDataAddr + 0x5D);
|
||||||
|
cal.adc.x2 = T1ReadWord(MMU.fw.data, userDataAddr + 0x5E) & 0x1FFF;
|
||||||
|
cal.adc.y2 = T1ReadWord(MMU.fw.data, userDataAddr + 0x60) & 0x1FFF;
|
||||||
|
cal.scr.x2 = T1ReadByte(MMU.fw.data, userDataAddr + 0x62);
|
||||||
|
cal.scr.y2 = T1ReadByte(MMU.fw.data, userDataAddr + 0x63);
|
||||||
|
}
|
||||||
|
|
||||||
|
cal.adc.width = (cal.adc.x2 - cal.adc.x1);
|
||||||
|
cal.adc.height = (cal.adc.y2 - cal.adc.y1);
|
||||||
|
cal.scr.width = (cal.scr.x2 - cal.scr.x1);
|
||||||
|
cal.scr.height = (cal.scr.y2 - cal.scr.y1);
|
||||||
|
|
||||||
|
return (void*)&cal;
|
||||||
|
}
|
||||||
|
|
||||||
//=====================================================================================================
|
//=====================================================================================================
|
||||||
static u32
|
static u32
|
||||||
calc_CRC16( u32 start, const u8 *data, int count) {
|
calc_CRC16( u32 start, const u8 *data, int count) {
|
||||||
|
@ -776,10 +821,10 @@ int NDS_CreateDummyFirmware( struct NDS_fw_config_data *user_settings)
|
||||||
MMU.fw.data[0x8 + 3] = 'P';
|
MMU.fw.data[0x8 + 3] = 'P';
|
||||||
|
|
||||||
// DS type
|
// DS type
|
||||||
if ( user_settings->ds_type == NDS_CONSOLE_TYPE_LITE)
|
if ( user_settings->ds_type == NDS_CONSOLE_TYPE_DSI)
|
||||||
MMU.fw.data[0x1d] = 0x20;
|
MMU.fw.data[0x1d] = 0xFF;
|
||||||
else
|
else
|
||||||
MMU.fw.data[0x1d] = 0xff;
|
MMU.fw.data[0x1d] = user_settings->ds_type;
|
||||||
|
|
||||||
//User Settings offset 0x3fe00 / 8
|
//User Settings offset 0x3fe00 / 8
|
||||||
MMU.fw.data[0x20] = 0xc0;
|
MMU.fw.data[0x20] = 0xc0;
|
||||||
|
|
|
@ -54,6 +54,7 @@ public:
|
||||||
|
|
||||||
u32 getID() { return header.fw_identifier; }
|
u32 getID() { return header.fw_identifier; }
|
||||||
bool loaded() { return successLoad; }
|
bool loaded() { return successLoad; }
|
||||||
|
void *getTouchCalibrate();
|
||||||
|
|
||||||
struct HEADER
|
struct HEADER
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue