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;
|
||||
|
||||
default:
|
||||
#ifdef DEVELOPER
|
||||
printf("MMU9 write%02d to undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -2814,7 +2816,9 @@ bool validateIORegsWrite(u32 addr, u8 size, u32 val)
|
|||
return true;
|
||||
|
||||
default:
|
||||
#ifdef DEVELOPER
|
||||
printf("MMU7 write%02d to undefined register %08Xh = %08Xh (PC:%08X)\n", size, addr, val, ARMPROC.instruct_adr);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -3087,7 +3091,9 @@ bool validateIORegsRead(u32 addr, u8 size)
|
|||
return true;
|
||||
|
||||
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);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -3181,7 +3187,9 @@ bool validateIORegsRead(u32 addr, u8 size)
|
|||
return true;
|
||||
|
||||
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);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -133,20 +133,6 @@ int NDS_Init( void)
|
|||
|
||||
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();
|
||||
cheatSearch = new CHEATSEARCH();
|
||||
|
||||
|
@ -2489,9 +2475,6 @@ bool NDS_LegitBoot()
|
|||
CommonSettings.jit_max_block_size = std::min(CommonSettings.jit_max_block_size,12U);
|
||||
#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
|
||||
firmware->loadSettings();
|
||||
|
||||
|
@ -2503,24 +2486,6 @@ bool NDS_LegitBoot()
|
|||
armcpu_init(&NDS_ARM7, 0x00000000);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -2636,22 +2601,6 @@ bool NDS_FakeBoot()
|
|||
// Write the header checksum to memory
|
||||
_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
|
||||
//otherwise the arm7 will crash before making a sound
|
||||
//(these according to gbatek softreset bios docs)
|
||||
|
@ -2792,6 +2741,9 @@ void NDS_Reset()
|
|||
else
|
||||
bootResult = NDS_FakeBoot();
|
||||
|
||||
// Init calibration info
|
||||
memcpy(&TSCal, firmware->getTouchCalibrate(), sizeof(TSCalInfo));
|
||||
|
||||
Screen_Reset();
|
||||
gfx3d_reset();
|
||||
gpu3D->NDS_3D_Reset();
|
||||
|
|
|
@ -166,10 +166,11 @@ enum ENSATA_HANDSHAKE
|
|||
|
||||
enum NDS_CONSOLE_TYPE
|
||||
{
|
||||
NDS_CONSOLE_TYPE_FAT,
|
||||
NDS_CONSOLE_TYPE_LITE,
|
||||
NDS_CONSOLE_TYPE_IQUE,
|
||||
NDS_CONSOLE_TYPE_DSI
|
||||
NDS_CONSOLE_TYPE_FAT = 0xFF,
|
||||
NDS_CONSOLE_TYPE_LITE = 0x20,
|
||||
NDS_CONSOLE_TYPE_IQUE = 0x43,
|
||||
NDS_CONSOLE_TYPE_IQUE_LIE = 0x63,
|
||||
NDS_CONSOLE_TYPE_DSI = 0xFE
|
||||
};
|
||||
|
||||
struct NDSSystem
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include "firmware.h"
|
||||
#include "NDSSystem.h"
|
||||
#include "MMU.h"
|
||||
#include "path.h"
|
||||
#include "encrypt.h"
|
||||
|
||||
|
@ -294,6 +295,15 @@ bool CFIRMWARE::load()
|
|||
|
||||
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);
|
||||
|
||||
delete [] data;
|
||||
|
@ -597,6 +607,41 @@ std::string CFIRMWARE::GetExternalFilePath()
|
|||
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
|
||||
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';
|
||||
|
||||
// DS type
|
||||
if ( user_settings->ds_type == NDS_CONSOLE_TYPE_LITE)
|
||||
MMU.fw.data[0x1d] = 0x20;
|
||||
if ( user_settings->ds_type == NDS_CONSOLE_TYPE_DSI)
|
||||
MMU.fw.data[0x1d] = 0xFF;
|
||||
else
|
||||
MMU.fw.data[0x1d] = 0xff;
|
||||
MMU.fw.data[0x1d] = user_settings->ds_type;
|
||||
|
||||
//User Settings offset 0x3fe00 / 8
|
||||
MMU.fw.data[0x20] = 0xc0;
|
||||
|
|
|
@ -54,6 +54,7 @@ public:
|
|||
|
||||
u32 getID() { return header.fw_identifier; }
|
||||
bool loaded() { return successLoad; }
|
||||
void *getTouchCalibrate();
|
||||
|
||||
struct HEADER
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue