From e101b54d21e9d141d4376b0a7a8411a7f9509eff Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 23 Nov 2011 10:32:27 +0000 Subject: [PATCH] * 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. --- desmume/src/GPU_osd.cpp | 17 +++--- desmume/src/MMU.cpp | 103 +++++++++++++++++++++--------------- desmume/src/MMU.h | 2 +- desmume/src/MMU_timing.h | 31 +++++------ desmume/src/NDSSystem.cpp | 59 ++++++++++----------- desmume/src/NDSSystem.h | 48 ++++++++++------- desmume/src/commandline.cpp | 35 ++++++++---- desmume/src/commandline.h | 4 +- desmume/src/firmware.cpp | 47 +++++++++------- desmume/src/lua-engine.cpp | 4 +- desmume/src/movie.cpp | 7 +-- desmume/src/rasterize.cpp | 30 +++++------ desmume/src/saves.cpp | 7 ++- 13 files changed, 223 insertions(+), 171 deletions(-) diff --git a/desmume/src/GPU_osd.cpp b/desmume/src/GPU_osd.cpp index 26f485214..ae47372d3 100644 --- a/desmume/src/GPU_osd.cpp +++ b/desmume/src/GPU_osd.cpp @@ -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 diff --git a/desmume/src/MMU.cpp b/desmume/src/MMU.cpp index 1247df973..b0d8941ee 100644 --- a/desmume/src/MMU.cpp +++ b/desmume/src/MMU.cpp @@ -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,8 +1886,13 @@ 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) { switch(startmode) { @@ -1944,7 +1949,8 @@ void DmaController::exec() } running = TRUE; paused = FALSE; - doCopy(); + if(procnum == ARMCPU_ARM9) doCopy(); + else doCopy(); //printf(";%d\n",gxFIFO.size); } } @@ -1952,6 +1958,7 @@ void DmaController::exec() driver->DEBUG_UpdateIORegView(BaseDriver::EDEBUG_IOREG_DMA); } +template 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(src,true); + time_elapsed += _MMU_accesstime(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(src,true); + time_elapsed += _MMU_accesstime(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 - // nextEvent must [always] be advanced to schedule the completion IRQ to fire, even if the timing is pretty much completely imaginary. - // 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(); - if(MMU.SPI_CNT&(1<<11)) { - if(partie) + //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) { - val = ((nds.touchY<<3)&0x7FF); - partie = 0; - //emu_halt(); + nds.adc_jitterctr = 0; + nds.adc_touchY ^= 16; + nds.adc_touchX ^= 16; + } + if(MMU.SPI_CNT&(1<<11)) + { + if(partie) + { + val = (nds.adc_touchY<<3) & 0xFF; + partie = 0; + break; + } + + val = (nds.adc_touchY>>5) & 0xFF; + partie = 1; break; } - val = (nds.touchY>>5); + val = (nds.adc_touchY<<3)&0xFF; partie = 1; break; } - val = ((nds.touchY<<3)&0x7FF); - 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; } diff --git a/desmume/src/MMU.h b/desmume/src/MMU.h index d6e2b1fe8..57fa04264 100644 --- a/desmume/src/MMU.h +++ b/desmume/src/MMU.h @@ -222,7 +222,7 @@ public: bool loadstate(EMUFILE *f); void exec(); - void doCopy(); + template void doCopy(); void doPause(); void doStop(); void doSchedule(); diff --git a/desmume/src/MMU_timing.h b/desmume/src/MMU_timing.h index 2f45cccc1..9da0a09df 100644 --- a/desmume/src/MMU_timing.h +++ b/desmume/src/MMU_timing.h @@ -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 + 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 + (at your option) any later version. - DeSmuME 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 - (at your option) any later version. + 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. - DeSmuME 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ // 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; diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp index df43c8459..b73052b67 100644 --- a/desmume/src/NDSSystem.cpp +++ b/desmume/src/NDSSystem.cpp @@ -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 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; } diff --git a/desmume/src/NDSSystem.h b/desmume/src/NDSSystem.h index 9897b2ddf..fed73bae2 100644 --- a/desmume/src/NDSSystem.h +++ b/desmume/src/NDSSystem.h @@ -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; diff --git a/desmume/src/commandline.cpp b/desmume/src/commandline.cpp index 0bf78e536..c345877d2 100644 --- a/desmume/src/commandline.cpp +++ b/desmume/src/commandline.cpp @@ -18,7 +18,7 @@ //windows note: make sure this file gets compiled with _cdecl #include - +#include #include #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") { diff --git a/desmume/src/commandline.h b/desmume/src/commandline.h index f1b0d7641..0707790a7 100644 --- a/desmume/src/commandline.h +++ b/desmume/src/commandline.h @@ -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 diff --git a/desmume/src/firmware.cpp b/desmume/src/firmware.cpp index b0dda1aa2..9b88c73b0 100644 --- a/desmume/src/firmware.cpp +++ b/desmume/src/firmware.cpp @@ -1,20 +1,18 @@ -/* Copyright (C) 2009-2011 DeSmuME Team +/* + Copyright (C) 2009-2011 DeSmuME Team - This file is part of DeSmuME + 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 + (at your option) any later version. - DeSmuME 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 - (at your option) any later version. + 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. - DeSmuME 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ #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() diff --git a/desmume/src/lua-engine.cpp b/desmume/src/lua-engine.cpp index fe6461d9a..0be21dc4f 100644 --- a/desmume/src/lua-engine.cpp +++ b/desmume/src/lua-engine.cpp @@ -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"); diff --git a/desmume/src/movie.cpp b/desmume/src/movie.cpp index 9ddadd661..95fb868dc 100644 --- a/desmume/src/movie.cpp +++ b/desmume/src/movie.cpp @@ -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); diff --git a/desmume/src/rasterize.cpp b/desmume/src/rasterize.cpp index aa0583952..6b16a0ef7 100644 --- a/desmume/src/rasterize.cpp +++ b/desmume/src/rasterize.cpp @@ -1,20 +1,18 @@ -/* Copyright 2009-2010 DeSmuME team +/* + Copyright (C) 2009-2011 DeSmuME team - This file is part of DeSmuME + 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 + (at your option) any later version. - DeSmuME 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 - (at your option) any later version. + 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. - DeSmuME 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 + You should have received a copy of the GNU General Public License + along with the this software. If not, see . */ //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) diff --git a/desmume/src/saves.cpp b/desmume/src/saves.cpp index 28d58e146..472feb302 100644 --- a/desmume/src/saves.cpp +++ b/desmume/src/saves.cpp @@ -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},