- fix touch screen calibrate when use external firmware;
This commit is contained in:
mtabachenko 2013-11-05 09:23:36 +00:00
parent 7f88812fa9
commit da29c3f483
5 changed files with 65 additions and 58 deletions

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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

View File

@ -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;

View File

@ -54,6 +54,7 @@ public:
u32 getID() { return header.fw_identifier; }
bool loaded() { return successLoad; }
void *getTouchCalibrate();
struct HEADER
{