* base DMA time accounting on MMU_timing infrastructure for slightly better estimate, and add system to lock ARM9 bus while DMA occurs. still not completely realistic, but fixes a number of freezes

* fix multithreading bug in rasterizer exposed by some OSX builds a few weeks ago
* remove --dsimode and --debug-console and replace with --console-type={fat,lite,ique,debug,dsi}
* add a zany hack to jitter the stylus position for frames which read it more than once; no human can hold his hands that still, and CSI polled for and demanded sub-frame touch motion for swipe gestures, it seems. this is a bit fishy.. it is still open for discussion.
* track raw ADC coords for NDS and screen coords for DSI independently.
This commit is contained in:
zeromus 2011-11-23 10:32:27 +00:00
parent ffcca74387
commit e101b54d21
13 changed files with 223 additions and 171 deletions

View File

@ -1,5 +1,6 @@
/* Copyright (C) 2006 yopyop
Copyright (C) 2006-2010 DeSmuME team
/*
Copyright (C) 2006 yopyop
Copyright (C) 2006-2011 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -297,8 +298,8 @@ static void drawPad(double x, double y, double ratio) {
// touch pad
{
BOOL gameTouchOn = nds.isTouch;
double gameTouchX = screenLeft+1 + (nds.touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0;
double gameTouchY = screenTop+1 + (nds.touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0;
double gameTouchX = screenLeft+1 + (nds.scr_touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0;
double gameTouchY = screenTop+1 + (nds.scr_touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0;
bool physicalTouchOn = NDS_getRawUserInput().touch.isTouch;
double physicalTouchX = screenLeft+1 + (NDS_getRawUserInput().touch.touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0;
double physicalTouchY = screenTop+1 + (NDS_getRawUserInput().touch.touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0;
@ -373,8 +374,8 @@ static void TextualInputDisplay() {
{
char str [32];
BOOL gameTouchOn = nds.isTouch;
int gameTouchX = nds.touchX >> 4;
int gameTouchY = nds.touchY >> 4;
int gameTouchX = nds.adc_touchX >> 4;
int gameTouchY = nds.adc_touchY >> 4;
bool physicalTouchOn = NDS_getRawUserInput().touch.isTouch;
int physicalTouchX = NDS_getRawUserInput().touch.touchX >> 4;
int physicalTouchY = NDS_getRawUserInput().touch.touchY >> 4;
@ -433,8 +434,8 @@ static void TouchDisplay() {
}
if(nds.isTouch) {
temptouch.X = nds.touchX >> 4;
temptouch.Y = nds.touchY >> 4;
temptouch.X = nds.scr_touchX;
temptouch.Y = nds.scr_touchY;
aggDraw.hud->lineColor(255, 0, 0, 128);
aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz
aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert

View File

@ -1102,7 +1102,7 @@ u16 DSI_TSC::write16(u16 val)
{ }
else
{
registers[reg_selection] = val;
registers[reg_selection] = (u8)val;
}
ret = read16();
reg_selection++;
@ -1137,19 +1137,19 @@ u16 DSI_TSC::read16()
{
//high byte of X:
case 1: case 3: case 5: case 7: case 9:
return (nds.touchX>>8)&0xFF;
return (nds.scr_touchX>>8)&0xFF;
//low byte of X:
case 2: case 4: case 6: case 8: case 10:
return nds.touchX&0xFF;
return nds.scr_touchX&0xFF;
//high byte of Y:
case 11: case 13: case 15: case 17: case 19:
return (nds.touchY>>8)&0xFF;
return (nds.scr_touchY>>8)&0xFF;
//low byte of Y:
case 12: case 14: case 16: case 18: case 20:
return nds.touchY&0xFF;
return nds.scr_touchY&0xFF;
default:
return 0xFF;
@ -1886,6 +1886,11 @@ if(_startmode==0 && wordcount==1) {
void DmaController::exec()
{
//this function runs when the DMA ends. the dma start actually queues this event after some kind of guess as to how long the DMA should take
//we'll need to unfreeze the arm9 bus now
if(procnum==ARMCPU_ARM9) nds.freezeBus &= ~(1<<(chan+1));
dmaCheck = FALSE;
if(running)
@ -1944,7 +1949,8 @@ void DmaController::exec()
}
running = TRUE;
paused = FALSE;
doCopy();
if(procnum == ARMCPU_ARM9) doCopy<ARMCPU_ARM9>();
else doCopy<ARMCPU_ARM7>();
//printf(";%d\n",gxFIFO.size);
}
}
@ -1952,6 +1958,7 @@ void DmaController::exec()
driver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA);
}
template<int PROCNUM>
void DmaController::doCopy()
{
//generate a copy count depending on various copy mode's behavior
@ -2004,13 +2011,13 @@ void DmaController::doCopy()
//TODO - these might be losing out a lot by not going through the templated version anymore.
//we might make another function to do just the raw copy op which can use them with checks
//outside the loop
int time_elapsed = 0;
if(sz==4) {
for(s32 i=(s32)todo; i>0; i--)
{
time_elapsed += _MMU_accesstime<PROCNUM,MMU_AT_DMA,32,MMU_AD_READ,TRUE>(src,true);
time_elapsed += _MMU_accesstime<PROCNUM,MMU_AT_DMA,32,MMU_AD_WRITE,TRUE>(dst,true);
u32 temp = _MMU_read32(procnum,MMU_AT_DMA,src);
if(startmode == EDMAMode_GXFifo) {
//printf("GXFIFO DMA OF %08X FROM %08X WHILE GXFIFO.SIZE=%d\n",temp,src,gxFIFO.size);
}
_MMU_write32(procnum,MMU_AT_DMA,dst, temp);
dst += dstinc;
src += srcinc;
@ -2018,23 +2025,25 @@ void DmaController::doCopy()
} else {
for(s32 i=(s32)todo; i>0; i--)
{
_MMU_write16(procnum,MMU_AT_DMA,dst, _MMU_read16(procnum,MMU_AT_DMA,src));
time_elapsed += _MMU_accesstime<PROCNUM,MMU_AT_DMA,16,MMU_AD_READ,TRUE>(src,true);
time_elapsed += _MMU_accesstime<PROCNUM,MMU_AT_DMA,16,MMU_AD_WRITE,TRUE>(dst,true);
u16 temp = _MMU_read16(procnum,MMU_AT_DMA,src);
_MMU_write16(procnum,MMU_AT_DMA,dst, temp);
dst += dstinc;
src += srcinc;
}
}
//printf("dma of size %d took %d cycles\n",todo*sz,time_elapsed);
//reschedule an event for the end of this dma, and figure out how much it cost us
doSchedule();
nextEvent += time_elapsed;
// zeromus, check it
if (wordcount > todo)
nextEvent += todo/4; //TODO - surely this is a gross simplification
//<zeromus> nextEvent must [always] be advanced to schedule the completion IRQ to fire, even if the timing is pretty much completely imaginary.
//<crazymax> but it fixes contra 4 bonus menu, #2867258
//apparently moon has very, very tight timing (i didnt spy it using waitbyloop swi...)
//so lets bump this down a bit for now,
//(i think this code is in nintendo libraries)
//freeze the ARM9 bus for the duration of this DMA
//thats not entirely accurate
if(procnum==ARMCPU_ARM9)
nds.freezeBus |= (1<<(chan+1));
//write back the addresses
saddr = src;
@ -2192,7 +2201,7 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)
case REG_SQRTCNT+2: printf("ERROR 8bit SQRTCNT2 WRITE\n"); return;
case REG_SQRTCNT+3: printf("ERROR 8bit SQRTCNT3 WRITE\n"); return;
#if 0
#if 1
case REG_DIVCNT: printf("ERROR 8bit DIVCNT WRITE\n"); return;
case REG_DIVCNT+1: printf("ERROR 8bit DIVCNT1 WRITE\n"); return;
case REG_DIVCNT+2: printf("ERROR 8bit DIVCNT2 WRITE\n"); return;
@ -2543,7 +2552,7 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
MMU_new.div.write16(val);
execdiv();
return;
#if 0
#if 1
case REG_DIVNUMER:
case REG_DIVNUMER+2:
case REG_DIVNUMER+4:
@ -2975,7 +2984,7 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
case 0x40005B:
case 0x40005C: // Individual Commands
if (gxFIFO.size > 254)
nds.freezeBus = TRUE;
nds.freezeBus |= 1;
((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr & 0xFFF) >> 2] = val;
gfx3d_sendCommand(adr, val);
@ -3354,7 +3363,7 @@ u8 FASTCALL _MMU_ARM9_read08(u32 adr)
#endif
case REG_SQRTCNT+2: printf("ERROR 8bit SQRTCNT2 READ\n"); return 0;
case REG_SQRTCNT+3: printf("ERROR 8bit SQRTCNT3 READ\n"); return 0;
#if 0
#if 1
case REG_DIVCNT: printf("ERROR 8bit DIVCNT READ\n"); return 0;
case REG_DIVCNT+1: printf("ERROR 8bit DIVCNT1 READ\n"); return 0;
#else
@ -3527,10 +3536,10 @@ u32 FASTCALL _MMU_ARM9_read32(u32 adr)
switch(adr)
{
case REG_DSIMODE:
if(!CommonSettings.DSI) break;
if(!CommonSettings.Is_DSI()) break;
return 1;
case 0x04004008:
if(!CommonSettings.DSI) break;
if(!CommonSettings.Is_DSI()) break;
return 0x8000;
case REG_DISPA_DISPSTAT:
@ -3739,8 +3748,8 @@ static void CalculateTouchPressure(int pressurePercent, u16 &z1, u16& z2)
z1 = z2 = 0;
return;
}
int y = nds.touchY/16;
int x = nds.touchX/16;
int y = nds.scr_touchY;
int x = nds.scr_touchX;
float u = (x/256.0f);
float v = (y/192.0f);
@ -3938,7 +3947,7 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
case 2:
{
if(CommonSettings.DSI)
if(CommonSettings.Is_DSI())
{
//pass data to TSC
val = MMU_new.dsi_tsc.write16(val);
@ -3988,23 +3997,32 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
break;
case TSC_MEASURE_Y:
//emu_halt();
{
//counter the number of adc touch coord reads and jitter it after a while to simulate a shaky human hand or multiple reads
nds.adc_jitterctr++;
if(nds.adc_jitterctr == 25)
{
nds.adc_jitterctr = 0;
nds.adc_touchY ^= 16;
nds.adc_touchX ^= 16;
}
if(MMU.SPI_CNT&(1<<11))
{
if(partie)
{
val = ((nds.touchY<<3)&0x7FF);
val = (nds.adc_touchY<<3) & 0xFF;
partie = 0;
//emu_halt();
break;
}
val = (nds.touchY>>5);
val = (nds.adc_touchY>>5) & 0xFF;
partie = 1;
break;
}
val = ((nds.touchY<<3)&0x7FF);
val = (nds.adc_touchY<<3)&0xFF;
partie = 1;
break;
}
case TSC_MEASURE_Z1: //Z1
//used for pressure calculation - must be nonzero or else some softwares will think the stylus is up.
//something is wrong in here and some of these LSB dont make it back to libnds... whatever.
@ -4054,15 +4072,15 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
{
if(partie)
{
val = ((nds.touchX<<3)&0x7FF);
val = (nds.adc_touchX << 3) & 0xFF;
partie = 0;
break;
}
val = (nds.touchX>>5);
val = (nds.adc_touchX>>5) & 0xFF;
partie = 1;
break;
}
val = ((nds.touchX<<3)&0x7FF);
val = (nds.adc_touchX<<3) & 0xFF;
partie = 1;
break;
case TSC_MEASURE_AUX:
@ -4390,7 +4408,8 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr)
{
//this is gross. we should generate this whole reg instead of poking it in ndssystem
u16 ret = MMU.ARM7_REG[0x136];
if(nds.isTouch) ret &= ~64;
if(nds.isTouch)
ret &= ~64;
else ret |= 64;
return ret;
}

View File

@ -222,7 +222,7 @@ public:
bool loadstate(EMUFILE *f);
void exec();
void doCopy();
template<int PROCNUM> void doCopy();
void doPause();
void doStop();
void doSchedule();

View File

@ -1,23 +1,20 @@
/* Copyright (C) 2006 yopyop
/*
Copyright (C) 2006 yopyop
Copyright (C) 2007 shash
Copyright (C) 2007-2010 DeSmuME team
Copyright (C) 2007-2011 DeSmuME team
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
This file is distributed in the hope that it will be useful,
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
along with the this software. If not, see <http://www.gnu.org/licenses/>.
*/
// this file is split from MMU.h for the purpose of avoiding ridiculous recompile times
@ -296,7 +293,7 @@ FORCEINLINE u32 _MMU_accesstime(u32 addr, bool sequential)
#endif
// for now, assume the cache is always enabled for all of main memory
if(TIMING && PROCNUM==ARMCPU_ARM9 && (addr & 0x0F000000) == 0x02000000)
if(AT != MMU_AT_DMA && TIMING && PROCNUM==ARMCPU_ARM9 && (addr & 0x0F000000) == 0x02000000)
{
#ifdef ENABLE_CACHE_CONTROLLER_EMULATION
bool cached = false;

View File

@ -46,7 +46,7 @@
//int xxctr=0;
//#define LOG_ARM9
//#define LOG_ARM7
//bool dolog = false;
//#define dolog (currFrameCounter>15)
//#define LOG_TO_FILE
//#define LOG_TO_FILE_REGS
@ -1861,7 +1861,7 @@ static /*donotinline*/ std::pair<s32,s32> armInnerLoop(
s32 temp = arm9;
arm9 = min(s32next, arm9 + kIrqWait);
nds.idleCycles[0] += arm9-temp;
if (gxFIFO.size < 255) nds.freezeBus = FALSE;
if (gxFIFO.size < 255) nds.freezeBus &= ~1;
}
}
if(doarm7 && (!doarm9 || arm7 <= timer))
@ -2084,7 +2084,7 @@ void NDS_Reset()
nds.sleeping = FALSE;
nds.cardEjected = FALSE;
nds.freezeBus = FALSE;
nds.freezeBus = 0;
nds.power1.lcd = nds.power1.gpuMain = nds.power1.gfx3d_render = nds.power1.gfx3d_geometry = nds.power1.gpuSub = nds.power1.dispswap = 1;
nds.power2.speakers = 1;
nds.power2.wifi = 0;
@ -2382,7 +2382,7 @@ void NDS_Reset()
nds.wifiCycle = 0;
memset(nds.timerCycle, 0, sizeof(u64) * 2 * 4);
nds.old = 0;
nds.touchX = nds.touchY = 0;
nds.scr_touchX = nds.scr_touchY = nds.adc_touchX = nds.adc_touchY = 0;
nds.isTouch = 0;
nds.paddle = 0;
nds.debugConsole = CommonSettings.DebugConsole;
@ -2528,22 +2528,22 @@ void ClearAutoHold(void) {
}
}
INLINE u16 NDS_getADCTouchPosX(u16 scrX)
//convert a 12.4 screen coordinate to an ADC value.
//the desmume host system will track the screen coordinate, but the hardware should be receiving the raw ADC values.
//so we'll need to use this to simulate the ADC values corresponding to the desired screen coords, based on the current TSC calibrations
u16 NDS_getADCTouchPosX(int scrX_lsl4)
{
// 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;
scrX_lsl4 >>= 4;
int rv = ((scrX_lsl4 - TSCal.scr.x1 + 1) * TSCal.adc.width) / TSCal.scr.width + TSCal.adc.x1;
rv = min(0xFFF, max(0, rv));
return (u16)rv;
return (u16)(rv);
}
INLINE u16 NDS_getADCTouchPosY(u16 scrY)
u16 NDS_getADCTouchPosY(int scrY_lsl4)
{
int rv = (scrY - TSCal.scr.y1 + 1) * TSCal.adc.height / TSCal.scr.height + TSCal.adc.y1;
scrY_lsl4 >>= 4;
int rv = ((scrY_lsl4 - TSCal.scr.y1 + 1) * TSCal.adc.height) / TSCal.scr.height + TSCal.adc.y1;
rv = min(0xFFF, max(0, rv));
return (u16)rv;
return (u16)(rv);
}
static UserInput rawUserInput = {}; // requested input, generally what the user is physically pressing
@ -2645,8 +2645,8 @@ void NDS_setPad(bool R,bool L,bool D,bool U,bool T,bool S,bool B,bool A,bool Y,b
void NDS_setTouchPos(u16 x, u16 y)
{
gotInputRequest();
rawUserInput.touch.touchX = NDS_getADCTouchPosX(x);
rawUserInput.touch.touchY = NDS_getADCTouchPosY(y);
rawUserInput.touch.touchX = x<<4;
rawUserInput.touch.touchY = y<<4;
rawUserInput.touch.isTouch = true;
if(movieMode != MOVIEMODE_INACTIVE && movieMode != MOVIEMODE_FINISHED)
@ -2759,33 +2759,32 @@ static void NDS_applyFinalInput()
if(input.touch.isTouch)
{
nds.touchX = input.touch.touchX;
nds.touchY = input.touch.touchY;
nds.isTouch = 1;
u16 adc_x = NDS_getADCTouchPosX(input.touch.touchX);
u16 adc_y = NDS_getADCTouchPosY(input.touch.touchY);
nds.adc_touchX = adc_x;
nds.adc_touchY = adc_y;
nds.adc_jitterctr = 0;
MMU.ARM7_REG[0x136] &= 0xBF;
nds.scr_touchX = input.touch.touchX;
nds.scr_touchY = input.touch.touchY;
nds.isTouch = 1;
}
else
{
nds.touchX = 0;
nds.touchY = 0;
nds.adc_touchX = 0;
nds.adc_touchY = 0;
nds.scr_touchX = 0;
nds.scr_touchY = 0;
nds.isTouch = 0;
MMU.ARM7_REG[0x136] |= 0x40;
}
if (input.buttons.F && !countLid)
{
LidClosed = (!LidClosed) & 0x01;
if (!LidClosed)
{
// SPU_Pause(FALSE);
NDS_makeIrq(ARMCPU_ARM7,IRQ_BIT_ARM7_FOLD);
}
//else
//SPU_Pause(TRUE);
countLid = 30;
}

View File

@ -1,5 +1,6 @@
/* Copyright (C) 2006 yopyop
Copyright (C) 2008-2010 DeSmuME team
/*
Copyright (C) 2006 yopyop
Copyright (C) 2008-2011 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -164,8 +165,15 @@ struct NDSSystem
u32 VCount;
u32 old;
u16 touchX;
u16 touchY;
//raw adc touch coords for old NDS
u16 adc_touchX;
u16 adc_touchY;
s32 adc_jitterctr;
//the DSI returns calibrated touch coords from its TSC (?), so we need to save these separately
u16 scr_touchX;
u16 scr_touchY;
BOOL isTouch;
u16 pad;
@ -180,7 +188,7 @@ struct NDSSystem
BOOL sleeping;
BOOL cardEjected;
BOOL freezeBus;
u32 freezeBus;
//this is not essential NDS runtime state.
//it was perhaps a mistake to put it here.
@ -225,19 +233,20 @@ struct NDS_fw_touchscreen_cal {
u8 screen_y;
};
/** /brief The type of DS
*/
enum nds_fw_ds_type {
NDS_FW_DS_TYPE_FAT,
NDS_FW_DS_TYPE_LITE,
NDS_FW_DS_TYPE_iQue
enum NDS_CONSOLE_TYPE
{
NDS_CONSOLE_TYPE_FAT,
NDS_CONSOLE_TYPE_LITE,
NDS_CONSOLE_TYPE_IQUE,
NDS_CONSOLE_TYPE_DSI
};
#define MAX_FW_NICKNAME_LENGTH 10
#define MAX_FW_MESSAGE_LENGTH 26
struct NDS_fw_config_data {
enum nds_fw_ds_type ds_type;
struct NDS_fw_config_data
{
NDS_CONSOLE_TYPE ds_type;
u8 fav_colour;
u8 birth_month;
@ -251,8 +260,8 @@ struct NDS_fw_config_data {
u8 language;
/* touchscreen calibration */
struct NDS_fw_touchscreen_cal touch_cal[2];
//touchscreen calibration
NDS_fw_touchscreen_cal touch_cal[2];
};
extern NDSSystem nds;
@ -352,7 +361,7 @@ struct GameInfo
typedef struct TSCalInfo
{
struct adc
struct
{
u16 x1, x2;
u16 y1, y2;
@ -360,7 +369,7 @@ typedef struct TSCalInfo
u16 height;
} adc;
struct scr
struct
{
u8 x1, x2;
u8 y1, y2;
@ -493,7 +502,7 @@ extern struct TCommonSettings {
, spu_captureMuted(false)
, spu_advanced(false)
, StylusPressure(50)
, DSI(false)
, ConsoleType(NDS_CONSOLE_TYPE_FAT)
{
strcpy(ARM9BIOS, "biosnds9.bin");
strcpy(ARM7BIOS, "biosnds7.bin");
@ -529,7 +538,8 @@ extern struct TCommonSettings {
bool BootFromFirmware;
struct NDS_fw_config_data InternalFirmConf;
bool DSI;
NDS_CONSOLE_TYPE ConsoleType;
bool Is_DSI() { return ConsoleType == NDS_CONSOLE_TYPE_DSI; }
bool DebugConsole;
bool EnsataEmulation;

View File

@ -18,7 +18,7 @@
//windows note: make sure this file gets compiled with _cdecl
#include <glib.h>
#include <algorithm>
#include <stdio.h>
#include "commandline.h"
#include "types.h"
@ -49,9 +49,8 @@ CommandLine::CommandLine()
, _advanced_timing(-1)
, _slot1(NULL)
, _slot1_fat_dir(NULL)
, _console_type(NULL)
, depth_threshold(-1)
, debug_console(-1)
, dsi_mode(-1)
, load_slot(-1)
, arm9_gdb_port(0)
, arm7_gdb_port(0)
@ -96,8 +95,7 @@ void CommandLine::loadCommonOptions()
{ "slot1", 0, 0, G_OPTION_ARG_STRING, &_slot1, "Device to load in slot 1 (default retail)", "SLOT1"},
{ "slot1-fat-dir", 0, 0, G_OPTION_ARG_STRING, &_slot1_fat_dir, "Directory to scan for slot 1", "SLOT1_DIR"},
{ "depth-threshold", 0, 0, G_OPTION_ARG_INT, &depth_threshold, "Depth comparison threshold (default 0)", "DEPTHTHRESHOLD"},
{ "debug-console", 0, 0, G_OPTION_ARG_INT, &debug_console, "Behave as 8MB debug console (default 0)", "DEBUGCONSOLE"},
{ "dsi-mode", 0, 0, G_OPTION_ARG_INT, &dsi_mode, "Behave as a DSi", "DSIMODE"},
{ "console-type", 0, 0, G_OPTION_ARG_STRING, &_console_type, "Select console type: {fat,lite,ique,debug,dsi}", "CONSOLETYPE" },
#ifndef _MSC_VER
{ "disable-sound", 0, 0, G_OPTION_ARG_NONE, &disable_sound, "Disables the sound emulation", NULL},
{ "disable-limiter", 0, 0, G_OPTION_ARG_NONE, &disable_limiter, "Disables the 60fps limiter", NULL},
@ -114,6 +112,8 @@ void CommandLine::loadCommonOptions()
g_option_context_add_main_entries (ctx, options, "options");
}
char mytoupper(char c) { return ::toupper(c); }
bool CommandLine::parse(int argc,char **argv)
{
g_option_context_parse (ctx, &argc, &argv, &error);
@ -125,6 +125,7 @@ bool CommandLine::parse(int argc,char **argv)
if(_slot1_fat_dir) slot1_fat_dir = _slot1_fat_dir;
if(_slot1) slot1 = _slot1;
if(_console_type) console_type = _console_type;
if(slot1.size() != 0) str_lcase((char*)&slot1[0]);
if(_play_movie_file) play_movie_file = _play_movie_file;
if(_record_movie_file) record_movie_file = _record_movie_file;
@ -137,14 +138,26 @@ bool CommandLine::parse(int argc,char **argv)
if(_advanced_timing != -1) CommonSettings.advanced_timing = _advanced_timing==1;
if(depth_threshold != -1)
CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = depth_threshold;
if(debug_console != -1)
CommonSettings.DebugConsole = (debug_console==1);
if(dsi_mode != -1)
CommonSettings.DSI = (dsi_mode==1);
//process console type
CommonSettings.DebugConsole = false;
CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT;
std::transform(console_type.begin(), console_type.end(), console_type.begin(), ::mytoupper);
if(console_type == "") {}
else if(console_type == "FAT") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT;
else if(console_type == "LITE") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_LITE;
else if(console_type == "IQUE") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_IQUE;
else if(console_type == "DSI") CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_DSI;
else if(console_type == "DEBUG")
{
CommonSettings.ConsoleType = NDS_CONSOLE_TYPE_FAT;
CommonSettings.DebugConsole = true;
}
CommonSettings.autodetectBackupMethod = autodetect_method;
//TODO MAX PRIORITY! change ARM9BIOS etc to be a std::string
//TODO NOT MAX PRIORITY! change ARM9BIOS etc to be a std::string
if(_bios_arm9) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM9BIOS,_bios_arm9); }
if(_bios_arm7) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM7BIOS,_bios_arm7); }
if(_bios_swi) CommonSettings.SWIFromBIOS = true;
@ -160,6 +173,8 @@ bool CommandLine::parse(int argc,char **argv)
bool CommandLine::validate()
{
if(slot1 != "")
{
if(slot1 != "r4" && slot1 != "retail" && slot1 != "none") {

View File

@ -37,8 +37,6 @@ public:
//actual options: these may move to another sturct
int load_slot;
int depth_threshold;
int debug_console;
int dsi_mode;
int autodetect_method;
std::string nds_file;
std::string play_movie_file;
@ -49,6 +47,7 @@ public:
std::string cflash_path;
std::string gbaslot_rom;
std::string slot1;
std::string console_type;
std::string slot1_fat_dir;
#ifndef _MSC_VER
int disable_sound;
@ -92,6 +91,7 @@ private:
int _advanced_timing;
char* _slot1;
char *_slot1_fat_dir;
char* _console_type;
};
#endif

View File

@ -1,20 +1,18 @@
/* Copyright (C) 2009-2011 DeSmuME Team
/*
Copyright (C) 2009-2011 DeSmuME Team
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
This file is distributed in the hope that it will be useful,
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
along with the this software. If not, see <http://www.gnu.org/licenses/>.
*/
#include "firmware.h"
@ -798,7 +796,7 @@ int NDS_CreateDummyFirmware( struct NDS_fw_config_data *user_settings)
MMU.fw.data[0x8 + 3] = 'P';
// DS type
if ( user_settings->ds_type == NDS_FW_DS_TYPE_LITE)
if ( user_settings->ds_type == NDS_CONSOLE_TYPE_LITE)
MMU.fw.data[0x1d] = 0x20;
else
MMU.fw.data[0x1d] = 0xff;
@ -881,7 +879,7 @@ void NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config) {
int str_length;
memset( fw_config, 0, sizeof( struct NDS_fw_config_data));
fw_config->ds_type = NDS_FW_DS_TYPE_FAT;
fw_config->ds_type = NDS_CONSOLE_TYPE_FAT;
fw_config->fav_colour = 7;
@ -900,19 +898,32 @@ void NDS_FillDefaultFirmwareConfigData( struct NDS_fw_config_data *fw_config) {
}
fw_config->message_len = str_length;
/* default to English */
//default to English
fw_config->language = 1;
/* default touchscreen calibration */
// default touchscreen calibration
//ANCIENT DESMUME VALUES
fw_config->touch_cal[0].adc_x = 0x200;
fw_config->touch_cal[0].adc_y = 0x200;
fw_config->touch_cal[0].screen_x = 0x20 + 1; // calibration screen coords are 1-based,
fw_config->touch_cal[0].screen_y = 0x20 + 1; // either that or NDS_getADCTouchPosX/Y are wrong.
//VALUES FROM NOCASH
//fw_config->touch_cal[0].adc_x = 0x02DF;
//fw_config->touch_cal[0].adc_y = 0x032C;
//fw_config->touch_cal[0].screen_x = 0x20;
//fw_config->touch_cal[0].screen_y = 0x20;
//ANCIENT DESMUME VALUES
fw_config->touch_cal[1].adc_x = 0xe00;
fw_config->touch_cal[1].adc_y = 0x800;
fw_config->touch_cal[1].screen_x = 0xe0 + 1;
fw_config->touch_cal[1].screen_y = 0x80 + 1;
//VALUES FROM NOCASH
//fw_config->touch_cal[1].adc_x = 0x0D3B;
//fw_config->touch_cal[1].adc_y = 0x0CE7;
//fw_config->touch_cal[1].screen_x = 0xE0;
//fw_config->touch_cal[1].screen_y = 0xA0;
}
void NDS_PatchFirmwareMAC()

View File

@ -4408,9 +4408,9 @@ static int stylus_read(lua_State *L){
lua_newtable(L);
lua_pushinteger(L, nds.touchX >> 4);
lua_pushinteger(L, nds.scr_touchX >> 4);
lua_setfield(L, -2, "x");
lua_pushinteger(L, nds.touchY >> 4);
lua_pushinteger(L, nds.scr_touchY >> 4);
lua_setfield(L, -2, "y");
lua_pushboolean(L, nds.isTouch);
lua_setfield(L, -2, "touch");

View File

@ -1,4 +1,5 @@
/* Copyright 2008-2010 DeSmuME team
/*
Copyright 2008-2011 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -814,8 +815,8 @@ void FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::stri
mr.touch.y = input.touch.isTouch ? input.touch.touchY >> 4 : 0;
assert(mr.touch.touch || (!mr.touch.x && !mr.touch.y));
assert(nds.touchX == input.touch.touchX && nds.touchY == input.touch.touchY);
assert((mr.touch.x << 4) == nds.touchX && (mr.touch.y << 4) == nds.touchY);
//assert(nds.touchX == input.touch.touchX && nds.touchY == input.touch.touchY);
//assert((mr.touch.x << 4) == nds.touchX && (mr.touch.y << 4) == nds.touchY);
mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size());
currMovieData.records.push_back(mr);

View File

@ -1,20 +1,18 @@
/* Copyright 2009-2010 DeSmuME team
/*
Copyright (C) 2009-2011 DeSmuME team
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
This file is distributed in the hope that it will be useful,
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
along with the this software. If not, see <http://www.gnu.org/licenses/>.
*/
//nothing in this file should be assumed to be accurate
@ -455,7 +453,7 @@ public:
FORCEINLINE FragmentColor sample(float u, float v)
{
static FragmentColor white = MakeFragmentColor(63,63,63,31);
static const FragmentColor white = MakeFragmentColor(63,63,63,31);
if(!sampler.enabled) return white;
//finally, we can use floor here. but, it is slower than we want.
@ -814,8 +812,6 @@ public:
//do not overstep either of the edges
int Height = min(left->Height,right->Height);
bool first=true;
static int runctr=0;
runctr++;
//HACK: special handling for horizontal line poly
if (lineHack && left->Height == 0 && right->Height == 0 && left->Y<192 && left->Y>=0)

View File

@ -162,8 +162,11 @@ SFORMAT SF_NDS[]={
{ "_TCY", 8, 8, nds.timerCycle},
{ "_VCT", 4, 1, &nds.VCount},
{ "_OLD", 4, 1, &nds.old},
{ "_TPX", 2, 1, &nds.touchX},
{ "_TPY", 2, 1, &nds.touchY},
{ "_TPX", 2, 1, &nds.adc_touchX},
{ "_TPY", 2, 1, &nds.adc_touchY},
{ "_TPC", 2, 1, &nds.adc_jitterctr},
{ "_STX", 2, 1, &nds.scr_touchX},
{ "_STY", 2, 1, &nds.scr_touchY},
{ "_TPB", 4, 1, &nds.isTouch},
{ "_DBG", 4, 1, &nds.debugConsole},
{ "_ENS", 4, 1, &nds.ensataEmulation},