revert touchscreen modified crap. firmware is too broken to touch without rewriting entirely.

This commit is contained in:
zeromus 2010-10-07 09:25:42 +00:00
parent cc1aa30e0b
commit 3795d559e0
3 changed files with 83 additions and 42 deletions

View File

@ -75,6 +75,8 @@ int LagFrameFlag;
int lastLag; int lastLag;
int TotalLagFrames; int TotalLagFrames;
TSCalInfo TSCal;
namespace DLDI namespace DLDI
{ {
bool tryPatch(void* data, size_t size); bool tryPatch(void* data, size_t size);
@ -126,6 +128,20 @@ 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();
@ -2428,6 +2444,22 @@ void NDS_Reset()
_MMU_write08<ARMCPU_ARM9>(0x02FFFC40,0x1); _MMU_write08<ARMCPU_ARM9>(0x02FFFC40,0x1);
_MMU_write08<ARMCPU_ARM7>(0x02FFFC40,0x1); _MMU_write08<ARMCPU_ARM7>(0x02FFFC40,0x1);
// Save touchscreen calibration info in a structure
// so we can easily access it at any time
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; MainScreen.offset = 0;
SubScreen.offset = 192; SubScreen.offset = 192;
@ -2479,15 +2511,20 @@ void ClearAutoHold(void) {
} }
} }
INLINE u16 NDS_getADCTouchPosX(u16 scrX) INLINE u16 NDS_getADCTouchPosX(u16 scrX)
{ {
int rv = (scrX - TSC_scr_x1 + 1) * (TSC_adc_x2 - TSC_adc_x1) / (TSC_scr_x2 - TSC_scr_x1) + TSC_adc_x1; // this is a little iffy,
// 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.width / TSCal.scr.width + TSCal.adc.x1;
rv = min(0xFFF, max(0, rv)); rv = min(0xFFF, max(0, rv));
return (u16)rv; return (u16)rv;
} }
INLINE u16 NDS_getADCTouchPosY(u16 scrY) INLINE u16 NDS_getADCTouchPosY(u16 scrY)
{ {
int rv = (scrY - TSC_scr_y1 + 1) * (TSC_adc_y2 - TSC_adc_y1) / (TSC_scr_y2 - TSC_scr_y1) + TSC_adc_y1; int rv = (scrY - TSCal.scr.y1 + 1) * TSCal.adc.height / TSCal.scr.height + TSCal.adc.y1;
rv = min(0xFFF, max(0, rv)); rv = min(0xFFF, max(0, rv));
return (u16)rv; return (u16)rv;
} }
@ -2813,6 +2850,7 @@ void NDS_suspendProcessingInput(bool suspend)
} }
} }
void emu_halt() { void emu_halt() {
//printf("halting emu: ARM9 PC=%08X/%08X, ARM7 PC=%08X/%08X\n", NDS_ARM9.R[15], NDS_ARM9.instruct_adr, NDS_ARM7.R[15], NDS_ARM7.instruct_adr); //printf("halting emu: ARM9 PC=%08X/%08X, ARM7 PC=%08X/%08X\n", NDS_ARM9.R[15], NDS_ARM9.instruct_adr, NDS_ARM7.R[15], NDS_ARM7.instruct_adr);
execute = false; execute = false;

View File

@ -346,28 +346,28 @@ struct GameInfo
bool hasRomBanner(); bool hasRomBanner();
}; };
typedef struct TSCalInfo
{
struct adc
{
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;
extern GameInfo gameInfo; extern GameInfo gameInfo;
//default touchscreen calibration
//we need some way to convert screen coordinates from the emulator to TSC coordinates
//so we are going to assume a normal set of calibration parameters and do the reverse transformation.
//the game will then do the normal transformation via the user's calibration parameters to get back to screen coordinates.
//all this conversion could in principle be lossy, but we judge that it is not.
//
//the more historical way for desmume to do this is to attempt to use the calibration parameters in the firmware.
//is it possible that this causes the reverse and forward transformation to roundtrip lossless without affecting the values?
//maybe. but we really don't care about users who (mis)calibrate their firmware. we could even override the firmware calibration values
//by patching it to prevent this.
static const int TSC_adc_x1 = 0x200;
static const int TSC_adc_y1 = 0x200;
static const int TSC_scr_x1 = 0x20 + 1; // calibration screen coords are 1-based,
static const int TSC_scr_y1 = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong.
static const int TSC_adc_x2 = 0xe00;
static const int TSC_adc_y2 = 0x800;
static const int TSC_scr_x2 = 0xe0 + 1;
static const int TSC_scr_y2 = 0x80 + 1;
struct UserButtons : buttonstruct<bool> struct UserButtons : buttonstruct<bool>
{ {

View File

@ -1,20 +1,22 @@
/* Copyright (C) 2009-2010 DeSmuME Team /* Copyright (C) 2009 DeSmuME Team
This file is free software: you can redistribute it and/or modify This file is part of DeSmuME
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This file is distributed in the hope that it will be useful, DeSmuME is free software; you can redistribute it and/or modify
but WITHOUT ANY WARRANTY; without even the implied warranty of it under the terms of the GNU General Public License as published by
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the the Free Software Foundation; either version 2 of the License, or
GNU General Public License for more details. (at your option) any later version.
You should have received a copy of the GNU General Public License DeSmuME is distributed in the hope that it will be useful,
along with the this software. If not, see <http://www.gnu.org/licenses/>. but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "firmware.h" #include "firmware.h"
#include "NDSSystem.h" #include "NDSSystem.h"
#include "path.h" #include "path.h"
@ -893,14 +895,15 @@ void NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config) {
fw_config->language = 1; fw_config->language = 1;
/* default touchscreen calibration */ /* default touchscreen calibration */
fw_config->touch_cal[0].adc_x = TSC_adc_x1; fw_config->touch_cal[0].adc_x = 0x200;
fw_config->touch_cal[0].adc_y = TSC_adc_y1; fw_config->touch_cal[0].adc_y = 0x200;
fw_config->touch_cal[0].screen_x = TSC_scr_x1; fw_config->touch_cal[0].screen_x = 0x20 + 1; // calibration screen coords are 1-based,
fw_config->touch_cal[0].screen_y = TSC_scr_y1; fw_config->touch_cal[0].screen_y = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong.
fw_config->touch_cal[1].adc_x = TSC_adc_x2;
fw_config->touch_cal[1].adc_y = TSC_adc_y2; fw_config->touch_cal[1].adc_x = 0xe00;
fw_config->touch_cal[1].screen_x = TSC_scr_x2; fw_config->touch_cal[1].adc_y = 0x800;
fw_config->touch_cal[1].screen_y = TSC_scr_y2; fw_config->touch_cal[1].screen_x = 0xe0 + 1;
fw_config->touch_cal[1].screen_y = 0x80 + 1;
} }
void NDS_PatchFirmwareMAC() void NDS_PatchFirmwareMAC()