* 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:
parent
ffcca74387
commit
e101b54d21
|
@ -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
|
||||
|
|
|
@ -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<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();
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -222,7 +222,7 @@ public:
|
|||
bool loadstate(EMUFILE *f);
|
||||
|
||||
void exec();
|
||||
void doCopy();
|
||||
template<int PROCNUM> void doCopy();
|
||||
void doPause();
|
||||
void doStop();
|
||||
void doSchedule();
|
||||
|
|
|
@ -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 <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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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") {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 <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()
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 <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)
|
||||
|
|
|
@ -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},
|
||||
|
|
Loading…
Reference in New Issue