add --dsi-mode=1 and dsi TSC emulation. this does not constitute "dsi support". you will probably think that it does anyway.

This commit is contained in:
zeromus 2011-02-22 07:13:20 +00:00
parent 0a0d4fe509
commit 4a330878ae
7 changed files with 215 additions and 54 deletions

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2006 yopyop
/*
Copyright (C) 2006 yopyop
Copyright (C) 2007 shash
Copyright (C) 2007-2011 DeSmuME team
@ -1072,6 +1073,114 @@ static void execdiv() {
NDS_Reschedule();
}
DSI_TSC::DSI_TSC()
: state(0)
, selection(0)
{
for(int i=0;i<ARRAY_SIZE(registers);i++)
registers[i] = 0x00;
}
void DSI_TSC::reset_command()
{
state = 0;
readcount = 0;
}
u16 DSI_TSC::write16(u16 val)
{
switch(state)
{
case 0:
selection = val;
state = 1;
return read16();
case 1:
{
u16 regsel = selection>>1;
if(selection&1)
{
//read
}
else
{
//write
registers[regsel] = val;
}
state = 2;
return read16();
}
case 2:
{
//continuing...
readcount++;
return read16();
}
break;
}
return 0;
}
u16 DSI_TSC::read16()
{
u16 regsel = selection>>1;
switch(regsel)
{
case 1:
{
u16 temp;
if(registers[0] != 252) return 0xFF;
if(readcount<10) temp = nds.touchX;
else temp = nds.touchY;
if(readcount&1) return temp&0xFF;
else return (temp>>8)&0xFF;
}
case 9:
if(registers[0] == 3)
{
if(nds.isTouch)
return 0;
}
break;
case 14:
if(registers[0] == 3)
{
if(nds.isTouch)
return 0;
}
break;
}
return 0xFF;
}
bool DSI_TSC::save_state(EMUFILE* os)
{
u32 version = 0;
write32le(version,os);
write16le(selection,os);
write32le(state,os);
write32le(readcount,os);
for(int i=0;i<ARRAY_SIZE(registers);i++)
write8le(registers[i],os);
return true;
}
bool DSI_TSC::load_state(EMUFILE* is)
{
u32 version;
read32le(&version,is);
read16le(&selection,is);
read32le(&state,is);
read32le(&readcount,is);
for(int i=0;i<ARRAY_SIZE(registers);i++)
read8le(&registers[i],is);
return true;
}
// TODO:
// NAND flash support (used in Made in Ore/WarioWare D.I.Y.)
template<int PROCNUM>
@ -3397,6 +3506,13 @@ u32 FASTCALL _MMU_ARM9_read32(u32 adr)
switch(adr)
{
case REG_DSIMODE:
if(!CommonSettings.DSI) break;
return 1;
case 0x04004008:
if(!CommonSettings.DSI) break;
return 0x8000;
case REG_DISPA_DISPSTAT:
break;
@ -3729,6 +3845,10 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
fw_reset_com(&MMU.fw);
}
MMU.SPI_CNT = val;
//new code:
if(!BIT11(MMU.SPI_CNT))
MMU_new.dsi_tsc.reset_command();
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][(REG_SPICNT >> 20) & 0xff], REG_SPICNT & 0xfff, val);
}
@ -3801,6 +3921,12 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
case 2:
{
if(CommonSettings.DSI)
{
val = MMU_new.dsi_tsc.write16(val);
break;
}
int channel = (MMU.SPI_CMD&0x70)>>4;
//printf("%08X\n",channel);
switch(channel)

View File

@ -1,22 +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/>.
*/
#ifndef MMU_H
@ -419,6 +417,26 @@ struct MMU_struct
nds_dscard dscard[2];
};
//everything in here is derived from libnds behaviours. no hardware tests yet
class DSI_TSC
{
public:
DSI_TSC();
void reset_command();
u16 write16(u16 val);
bool save_state(EMUFILE* os);
bool load_state(EMUFILE* is);
private:
u16 read16();
u16 selection;
s32 state;
s32 readcount;
u8 registers[0x80];
};
//this contains things which can't be memzeroed because they are smarter classes
struct MMU_struct_new
{
@ -428,6 +446,7 @@ struct MMU_struct_new
TGXSTAT gxstat;
SqrtController sqrt;
DivController div;
DSI_TSC dsi_tsc;
void write_dma(const int proc, const int size, const u32 adr, const u32 val);
u32 read_dma(const int proc, const int size, const u32 adr);

View File

@ -490,6 +490,7 @@ extern struct TCommonSettings {
, spu_captureMuted(false)
, spu_advanced(false)
, StylusPressure(50)
, DSI(false)
{
strcpy(ARM9BIOS, "biosnds9.bin");
strcpy(ARM7BIOS, "biosnds7.bin");
@ -524,6 +525,7 @@ extern struct TCommonSettings {
bool BootFromFirmware;
struct NDS_fw_config_data InternalFirmConf;
bool DSI;
bool DebugConsole;
bool EnsataEmulation;

View File

@ -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/>.
*/
//windows note: make sure this file gets compiled with _cdecl
@ -53,6 +51,7 @@ CommandLine::CommandLine()
, _slot1_fat_dir(NULL)
, depth_threshold(-1)
, debug_console(-1)
, dsi_mode(-1)
, load_slot(-1)
, arm9_gdb_port(0)
, arm7_gdb_port(0)
@ -97,6 +96,7 @@ void CommandLine::loadCommonOptions()
{ "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"},
#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},
@ -136,7 +136,9 @@ bool CommandLine::parse(int argc,char **argv)
if(depth_threshold != -1)
CommonSettings.GFX3D_Zelda_Shadow_Depth_Hack = depth_threshold;
if(debug_console != -1)
CommonSettings.DebugConsole = true;
CommonSettings.DebugConsole = (debug_console==1);
if(dsi_mode != -1)
CommonSettings.DSI = (dsi_mode==1);
//TODO MAX PRIORITY! change ARM9BIOS etc to be a std::string
if(_bios_arm9) { CommonSettings.UseExtBIOS = true; strcpy(CommonSettings.ARM9BIOS,_bios_arm9); }

View File

@ -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/>.
*/
#ifndef _COMMANDLINE_H_
@ -40,6 +38,7 @@ public:
int load_slot;
int depth_threshold;
int debug_console;
int dsi_mode;
std::string nds_file;
std::string play_movie_file;
std::string record_movie_file;

View File

@ -1,5 +1,6 @@
/* Copyright (C) 2006 Theo Berkau
Copyright (C) 2006-2010 DeSmuME team
/*
Copyright (C) 2006 Theo Berkau
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
@ -347,6 +348,9 @@
#define eng_3D_CLIPMTX_RESULT 0x04000640
#define eng_3D_VECMTX_RESULT 0x04000680
//DSI
#define REG_DSIMODE 0x04004000
#define IPCFIFOCNT_SENDEMPTY 0x0001
#define IPCFIFOCNT_SENDFULL 0x0002
#define IPCFIFOCNT_SENDIRQEN 0x0004

View File

@ -1,7 +1,8 @@
/* Copyright (C) 2006 Normmatt
Copyright (C) 2006 Theo Berkau
Copyright (C) 2007 Pascal Giard
Copyright (C) 2008-2010 DeSmuME team
/*
Copyright (C) 2006 Normmatt
Copyright (C) 2006 Theo Berkau
Copyright (C) 2007 Pascal Giard
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
@ -264,7 +265,7 @@ SFORMAT SF_MOVIE[]={
static void mmu_savestate(EMUFILE* os)
{
u32 version = 5;
u32 version = 6;
write32le(version,os);
//version 2:
@ -286,6 +287,9 @@ static void mmu_savestate(EMUFILE* os)
//version 4:
MMU_new.sqrt.savestate(os);
MMU_new.div.savestate(os);
//version 6:
MMU_new.dsi_tsc.save_state(os);
}
SFORMAT SF_WIFI[]={
@ -455,8 +459,13 @@ static bool mmu_loadstate(EMUFILE* is, int size)
MMU_new.gxstat.fifo_low = gxFIFO.size <= 127;
MMU_new.gxstat.fifo_empty = gxFIFO.size == 0;
if(version < 5)
MMU.reg_DISP3DCNT_bits = T1ReadWord(MMU.ARM9_REG,0x60);
if(version < 4) return ok;
MMU.reg_DISP3DCNT_bits = T1ReadWord(MMU.ARM9_REG,0x60);
if(version < 6) return ok;
MMU_new.dsi_tsc.load_state(is);
return ok;
}