www.pudn.com > potemkin_sourceforPSP.rar > DSSystem.cpp


#include "stdafx.h" 
 
#include "../MemMap.h" 
#include "../Misc.h" 
 
#include "../ARM/ARM.h" 
#include "../Core.h" 
 
#include "DSSystem.h" 
#include "DSDisplay.h" 
#include "DS7IO.h" 
#include "DS9IO.h" 
 
bool ndslibHLE; 
 
typedef struct sTransferRegion { 
	u32 heartbeat;         // counts frames 
 
	u16 touchX, touchY;    // TSC X, Y 
	u16 touchZ1, touchZ2;  // TSC x-panel measurements 
	u16 tdiode1, tdiode2;  // TSC temperature diodes 
	u32 temperature;       // TSC computed temperature 
 
	u16 buttons;           // X, Y, /PENIRQ buttons 
	u8 curtime[8];         // current time response from RTC 
 
	// Don't rely on these below, will change or be removed in the future 
	u32 tweakAddr; 
	u32 tweakData; 
	u32 readData; 
	bool wantToTweak; 
	bool tweakReading; 
} TransferRegion, * pTransferRegion; 
 
 
//22:17:27 <[firefly]> aha, my emu is crashing again because Nintendo changed the location of the IRQ handler address :/ 
//22:18:34  where is it now? 
//22:19:22 <[firefly]> I think 0x23C3FFC 
 
System DSSystem =  
{ 
	"Nintendo DS", 
	"Nintendo", 
	"*.nds;*.nef;*.bin", 
	2, //two cpus 
	2, //two displays 
	1, //one controller 
	0x02000000, 
	{CPUTYPE_ARM9,CPUTYPE_ARM7}, 
	{66*1024*1024,33*1024*1024}, 
 
	DS_HWAdvance, 
	DS_SWI 
}; 
 
 
TCHAR* MEMDECL GetMemoryPositionName(u32 address); 
 
 
TCHAR* MEMDECL GetMemoryPositionName(u32 address) 
{ 
	switch(address & 0x7FFFFF) { 
	case 0x007ffd80: return "Debugger Stack"; break; 
	case 0x007ffda0: return "Arena Information"; break; 
	case 0x007ffdf0: return "DMA Clear Buffer"; break; 
	case 0x007ffe00: return "Rom-reg area data buffer ?"; break; 
	case 0x007fffa0: return "Thread Info Main"; break; 
	case 0x007fffa4: return "Thread Info Sub"; break; 
	case 0x007fffa8: return "XY button buffer"; break; 
	case 0x007fffc0: return "VRAM C Lock"; break; 
	case 0x007fffc8: return "VRAM D Lock"; break; 
	case 0x007fffd0: return "Work RAM Lock 0"; break; 
	case 0x007fffd8: return "Work RAM Lock 1"; break; 
	case 0x007fffe0: return "Card Lock"; break; 
	case 0x007fffe8: return "Game Pak Lock"; break; 
	case 0x007ffff0: return "Initialized Lock"; break; 
	case 0x007ffff8: return "Component Sync Param"; break; 
	case 0x007ffffc: return "Ram Size Checker"; break; 
	case 0x007ffffe: return "MainMem Command Issue"; break; 
	} 
 
	return ""; 
} 
 
 
MemRegionInfo DSregions[] = 
{ 
	{"00 ITCM",       CPU_0,       MRTYPE_MEMORY, 0x00000000,0x00004000,0}, 
	{"01 DTCM",       CPU_0,       MRTYPE_MEMORY, 0x00800000,0x00804000,0}, 
	{"20 Main Memory",CPU_0|CPU_1, MRTYPE_MEMORY, 0x02000000,0x02400000,0,0,0,0,0,0,0,0,GetMemoryPositionName}, 
	{"24 MExt",       CPU_0|CPU_1, MRTYPE_MIRROR, 0x02400000,0x02800000,0,0,0,0,0,0,0,0,GetMemoryPositionName}, 
	{"37 WRAM Shared",CPU_0|CPU_1, MRTYPE_MEMORY, 0x037f8000,0x03800000,0}, 
	{"38 WRAM ARM7",        CPU_1, MRTYPE_MEMORY, 0x03800000,0x03810000,0}, 
	{"40 IO ARM9",    CPU_0,       MRTYPE_SPECIAL,0x04000000,0x04000800,0,ReadDS9IO8,ReadDS9IO16,ReadDS9IO32,WriteDS9IO8,WriteDS9IO16,WriteDS9IO32,ReadDS9IONoEffect,GetDS9IORegName}, 
	{"40 IO ARM7",          CPU_1, MRTYPE_SPECIAL,0x04000000,0x04000800,0,ReadDS7IO8,ReadDS7IO16,ReadDS7IO32,WriteDS7IO8,WriteDS7IO16,WriteDS7IO32,ReadDS7IONoEffect,GetDS7IORegName}, 
	{"50 Palettes",   CPU_0,       MRTYPE_MEMORY, 0x05000000,0x05000800,0}, 
	{"60 BG VRAM",    CPU_0,       MRTYPE_MEMORY, 0x06000000,0x06080000,0}, 
	{"62 DB BGVRAM",  CPU_0,       MRTYPE_MEMORY, 0x06200000,0x06220000,0}, 
	{"64 OBJ VRAM",   CPU_0,       MRTYPE_MEMORY, 0x06400000,0x06440000,0}, 
	{"66 DB OBJ VRAM",CPU_0,       MRTYPE_MEMORY, 0x06600000,0x06620000,0}, 
	{"68 LCDC VRAM",  CPU_0,       MRTYPE_MEMORY, 0x06800000,0x068A0000,0}, 
	{"70 OAM,OAMDB",  CPU_0,       MRTYPE_MEMORY, 0x07000000,0x07000800,0}, 
	{"80 CART",       CPU_0|CPU_1, MRTYPE_MEMORY, 0x08000000,0x09000000,0}, 
	{"A0 CARTRAM",    CPU_0|CPU_1, MRTYPE_MEMORY, 0x0A000000,0x0A010000,0}, 
	{"BIOS/arm9_ffff.bin",CPU_0,   MRTYPE_ROM,    0xFFFF0000,0xFFFFFFFF,0}, 
}; 
 
 
const int numDSRegions = sizeof(DSregions)/sizeof(MemRegionInfo); 
 
 
void DS_Init() 
{ 
	cpus[0]=&arm9; 
	cpus[1]=&arm7; 
 
	numCPUs=2; 
	 
	currentSystem = &DSSystem; 
	arm7.highVectors=true; 
	arm9.highVectors=true; 
	arm7.fakeBios=false; 
	arm9.fakeBios=false; 
	arm7.enabled=true; 
	arm9.enabled=true; 
 
	MemMap_Init(DSregions,numDSRegions,1,0); 
 
	//WriteMem32(0x01ffafd4,0xe12fff1e); //BX LR into ITCM 
 
	arm7.Reset(); 
	arm9.Reset(); 
	 
	g2dCores[0].g2 = &ds9IO.gfxregs1; 
	g2dCores[1].g2 = &ds9IO.gfxregs2; 
 
	g2dCores[0].bgvram = arm9.memMap.GetMemPointer(0x06000000); 
	g2dCores[1].bgvram = arm9.memMap.GetMemPointer(0x06200000); 
 
	g2dCores[0].objvram = arm9.memMap.GetMemPointer(0x06400000); 
	g2dCores[1].objvram = arm9.memMap.GetMemPointer(0x06600000); 
 
	g2dCores[0].paletteram = arm9.memMap.GetMemPointer(0x05000000); 
	g2dCores[1].paletteram = arm9.memMap.GetMemPointer(0x05000000); //??? 
 
	g2dCores[0].oam = arm9.memMap.GetMemPointer(0x07000000); 
	g2dCores[1].oam = arm9.memMap.GetMemPointer(0x07000800); 
 
	g2dCores[0].Init(256,192); 
	g2dCores[1].Init(256,192); 
 
	currentCPU = &arm7; 
 
	DS9IO_SelfTest(); 
	DS9IO_Init(); 
	DS7IO_SelfTest(); 
	DS7IO_Init(); 
} 
 
void DS_Shutdown() 
{ 
	MemMap_Shutdown(); 
} 
 
extern int curTimer; 
 
void DS_HWAdvance(int cycles) 
{ 
	curTimer-=cycles; 
	if (curTimer<0) 
	{ 
		curTimer+=8000; 
		g2dCores[0].DrawLine(ds9IO.vcount, ds9IO.dispcnt, ds9IO.dispstat); 
		g2dCores[1].DrawLine(ds9IO.vcount, ds9IO.dispcnt, ds9IO.dispstat); 
		ds9IO.vcount++; 
		if (ds9IO.vcount>192) 
			ds9IO.dispstat|=1; 
		else 
			ds9IO.dispstat&=~1; 
		if (ds9IO.vcount==200) 
		{ 
			DSDisplay_Draw(); 
			if (ndslibHLE) 
			{ 
				TransferRegion *rgn = (TransferRegion *)arm9.memMap.GetMemPointer(0x00800000); 
				rgn->heartbeat++; 
			} 
			ds9IO.vcount=0; 
		} 
	} 
} 
 
void DS_SWI() 
{ 
	LOG(INTC,"SWI"); 
	Core_EnableStepping(true); 
	((ARMState*)currentCPU)->SWI(); 
}