[Scummvm-cvs-logs] SF.net SVN: scummvm: [24170] scummvm/branches/branch-0-9-0/backends/ds/arm9 /source/fat

agent-q at users.sourceforge.net agent-q at users.sourceforge.net
Sat Oct 7 17:32:30 CEST 2006


Revision: 24170
          http://svn.sourceforge.net/scummvm/?rev=24170&view=rev
Author:   agent-q
Date:     2006-10-07 08:32:21 -0700 (Sat, 07 Oct 2006)

Log Message:
-----------
Changes to FAT driver to support MMD and new driver for M3SD.

Modified Paths:
--------------
    scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/disc_io.c
    scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/disc_io.h
    scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_m3sd.c
    scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_mmcf.c
    scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_mpcf.c

Modified: scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/disc_io.c
===================================================================
--- scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/disc_io.c	2006-10-07 13:57:06 UTC (rev 24169)
+++ scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/disc_io.c	2006-10-07 15:32:21 UTC (rev 24170)
@@ -233,6 +233,18 @@
 #endif
 
 
+#ifdef SUPPORT_MMCF
+	// check if we have a GBA Flash Cart plugged in
+	active_interface = MMCF_GetInterface() ;
+	if (active_interface->fn_StartUp())
+	{
+		// set MMCF as default IO
+		return true ;
+	} ;
+#endif
+
+
+
 #ifdef SUPPORT_M3CF
 	// check if we have a M3 perfect CF plugged in
 	active_interface = M3CF_GetInterface() ;
@@ -309,18 +321,6 @@
 	} ;
 #endif
 
-
-#ifdef SUPPORT_MMCF
-	// check if we have a GBA Flash Cart plugged in
-	active_interface = MMCF_GetInterface() ;
-	if (active_interface->fn_StartUp())
-	{
-		// set MMCF as default IO
-		return true ;
-	} ;
-#endif
-
-
 #ifdef SUPPORT_SCSD
 	// check if we have a SuperCard SD plugged in
 	active_interface = SCSD_GetInterface() ;

Modified: scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/disc_io.h
===================================================================
--- scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/disc_io.h	2006-10-07 13:57:06 UTC (rev 24169)
+++ scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/disc_io.h	2006-10-07 15:32:21 UTC (rev 24170)
@@ -10,7 +10,7 @@
 // Allow buffers not aligned to 16 bits when reading files. 
 // Note that this will slow down access speed, so only use if you have to.
 // It is also incompatible with DMA
-//#define _CF_ALLOW_UNALIGNED
+#define _CF_ALLOW_UNALIGNED
 
 // Device support options, added by www.neoflash.com
 
@@ -29,8 +29,8 @@
 // Each additional sector cache uses 512 bytes of memory
 // Disk caching is disabled on GBA to conserve memory
 
-#define DISC_CACHE				// uncomment this line to enable disc caching
-#define DISC_CACHE_COUNT	16	// maximum number of sectors to cache (512 bytes per sector)
+//#define DISC_CACHE				// uncomment this line to enable disc caching
+//#define DISC_CACHE_COUNT	16	// maximum number of sectors to cache (512 bytes per sector)
 //#define DISK_CACHE_DMA		// use DMA for cache copies. If this is enabled, the data buffers must be word aligned
 
 

Modified: scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_m3sd.c
===================================================================
--- scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_m3sd.c	2006-10-07 13:57:06 UTC (rev 24169)
+++ scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_m3sd.c	2006-10-07 15:32:21 UTC (rev 24170)
@@ -19,6 +19,8 @@
 */
 
 
+#define WAIT { vu32 w; for(w=0;w<0x1;w++){}; }
+
 #include "io_m3sd.h"
 
 #ifdef SUPPORT_M3SD
@@ -87,13 +89,12 @@
 	w = SDDIR;
 	for(w=0;w<0x100;w++)
 	{
-		u16 d16;
-		u8 *d8=(u8 *)&d16;
-//		*(u16*)(TAddr+w*2) = SDDIR;	//	16bit
-		d16 = SDDIR;	//	16bit
-		*(u8 *)(TAddr+w*2) =d8[0];
-		*(u8 *)(TAddr+w*2+1) =d8[1];
-		
+//		u16 d16;
+//		u8 *d8=(u8 *)&d16;
+		*(u16*)(TAddr+w*2) = SDDIR;	//	16bit
+//		d16 = SDDIR;	//	16bit
+//		*(u8 *)(TAddr+w*2) =d8[0];
+//		*(u8 *)(TAddr+w*2+1) =d8[1];
 	}
 	w = SDDIR;
 	w = SDDIR;
@@ -148,6 +149,7 @@
 
 	SDDIR=0x29;
 	Hal4ATA_WaitOnBusy();
+	WAIT; // wait for 1clk. (2006/08/13 added by Moonlight.)
 	SDDIR=0x09;
 }
 
@@ -156,11 +158,16 @@
 #define DMA3DAD      *(u32*)0x040000D8
 #define DMA3CNT      *(u32*)0x040000DC
 
+#define DMA3_CR        (*(vuint32*)0x040000DC)
+#define DMA_BUSY	    BIT(31)
+
 void DMA3(u32 src, u32 dst, u32 cnt)
 {
 	DMA3SAD=src;
 	DMA3DAD=dst;
 	DMA3CNT=cnt;
+	
+	while(DMA3_CR & DMA_BUSY); // wait for busy. (2006/08/13 added by Moonlight.)
 }
 
 
@@ -172,6 +179,7 @@
 	dmanum=(64+(num<<3))>>2;
 	SDDIR=0x8;
 	SDCON=0x4;
+	WAIT; // wait for 1clk. (2006/08/13 added by Moonlight.)
 	DMA3(0x8800000,(u32)&i,0x80400000+dmanum);
 }
 
@@ -179,7 +187,7 @@
 bool M3SD_write1sector(u32 sectorn,u32 p)
 {
 	u16 crc[4];
-
+	
 	SendCommand(24,sectorn);
 	PassRespond(6);
 
@@ -200,8 +208,12 @@
 #define M3_DATA			(vu16*)(0x08800000)		// Pointer to buffer of CF data transered from card
 
 // CF Card status
+#define CF_STS_INSERTED0		0xFF
 #define CF_STS_INSERTED1		0x20
 #define CF_STS_INSERTED2		0x30
+#define CF_STS_INSERTED3		0x22
+#define CF_STS_INSERTED4		0x32
+#define isM3ins(sta) ((sta == CF_STS_INSERTED1)||(sta == CF_STS_INSERTED2)||(sta == CF_STS_INSERTED3)||(sta == CF_STS_INSERTED4))
 
 /*-----------------------------------------------------------------
 M3SD_IsInserted
@@ -210,23 +222,13 @@
 -----------------------------------------------------------------*/
 bool M3SD_IsInserted (void) 
 {
-	int i;
 	u16 sta;
 	// Change register, then check if value did change
-	M3_REG_STS = CF_STS_INSERTED1;
-
-	for(i=0;i<CARD_TIMEOUT;i++)
-	{
-		sta=M3_REG_STS;
-		if((sta == CF_STS_INSERTED1)||(sta == CF_STS_INSERTED2))
-		{
-			return true;
-			//break;
-		}
-	}
-	return false;
-
-//	return ( (sta == CF_STS_INSERTED1)||(sta == CF_STS_INSERTED2) );
+	M3_REG_STS = CF_STS_INSERTED0;
+	sta=M3_REG_STS;
+//	return (M3_REG_STS == CF_STS_INSERTED);
+//	return ( (sta == CF_STS_INSERTED1)||(sta == CF_STS_INSERTED2)||(sta == CF_STS_INSERTED3)||(sta == CF_STS_INSERTED4) );
+	return  isM3ins(sta);
 //	return true;
 }
 
@@ -244,11 +246,12 @@
 	u16 sta;
 
 	i = 0;
-	M3_REG_STS = CF_STS_INSERTED1;
+	M3_REG_STS = CF_STS_INSERTED0;
 	while (i < CARD_TIMEOUT)
 	{
 		sta=M3_REG_STS;
-		if(  (sta == CF_STS_INSERTED1)||(sta == CF_STS_INSERTED2)  )break;
+//		if(  (sta == CF_STS_INSERTED1)||(sta == CF_STS_INSERTED2)||(sta == CF_STS_INSERTED3)||(sta == CF_STS_INSERTED4)  )break;
+		if(   isM3ins(sta)  )break;
 		i++;
 	}
 	if (i >= CARD_TIMEOUT)
@@ -342,8 +345,10 @@
 	vu16 sta;
 	sta=M3_REG_STS;
 	sta=M3_REG_STS;
-	if(  (sta == CF_STS_INSERTED1)||(sta == CF_STS_INSERTED2)  )return true;
+//	if(  (sta == CF_STS_INSERTED1)||(sta == CF_STS_INSERTED2)  )return true;
+	if(  isM3ins(sta)  )return true;
 
+
 	return false;
 }
 
@@ -358,7 +363,7 @@
 
 IO_INTERFACE io_m3sd = {
 	DEVICE_TYPE_M3SD,
-	FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE,
+	FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_SLOT_GBA,
 	(FN_MEDIUM_STARTUP)&M3SD_StartUp,
 	(FN_MEDIUM_ISINSERTED)&M3SD_IsInserted,
 	(FN_MEDIUM_READSECTORS)&M3SD_ReadSectors,

Modified: scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_mmcf.c
===================================================================
--- scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_mmcf.c	2006-10-07 13:57:06 UTC (rev 24169)
+++ scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_mmcf.c	2006-10-07 15:32:21 UTC (rev 24170)
@@ -83,9 +83,10 @@
     while ( (!(CF_RD_STATUS & 0x40)) && (i < CARD_TIMEOUT) ) i++;    
   } while ( (CF_RD_STATUS & 0x80) && (i < CARD_TIMEOUT) ); 
 
-  if (i >= CARD_TIMEOUT) return false;
+  if (i >= CARD_TIMEOUT) {
+	return false;
+  }
 
-
   return true;
 }
 
@@ -226,6 +227,16 @@
 	DC_FlushRange( buffer, j * BYTE_PER_READ);
 #endif
 
+	if (numSecs > 1) 
+	{
+		int r = 0;
+		
+		for (r = 0; r < numSecs; r++)
+		{
+			MMCF_WriteSectors(sector + r, 1, ((unsigned char *) (buffer)) + 512);
+		}
+  }
+
   if ( !cf_block_ready() ) return false;
 
   CF_WR_SECTOR_COUNT = numSecs;
@@ -266,6 +277,7 @@
 		while(i--)
 			*MP_DATA = *buff++; 
 #endif
+
   }
 
 #if defined _CF_USE_DMA && defined NDS
@@ -273,6 +285,26 @@
 	while(DMA3_CR & DMA_BUSY);
 #endif  
 
+//#define _CF_VERIFY
+
+#ifdef _CF_VERIFY
+	char* tmp = malloc(512);
+	int r;
+
+	for (r = 0; r < numSecs; r++)
+	{
+		MMCF_ReadSectors(sector + r, 1, tmp);
+		while (memcmp(temp, ((unsigned char *) (buffer)) + 512 * r, 512) != 0)
+		{
+			consolePrintf("Rewriting sector %d\n", r);
+			MMCF_WriteSectors(sector + r, 1, ((unsigned char *) (buffer)) + 512 * r);
+			MMCF_ReadSectors(sector + r, 1, tmp);
+		}
+	}
+
+	free(temp);
+#endif
+
 	return true;
 }
 
@@ -298,7 +330,7 @@
 	temp = (~temp & 0xFF);
 	return (MP_REG_LBA1 == temp);
   */
-  if (CF_RD_STATUS != 0x0050)
+  if ( (CF_RD_STATUS != 0x0050) || ( *((u8 *) (0x080000B2)) == 0x96) )
   {
 	return false;
   }

Modified: scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_mpcf.c
===================================================================
--- scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_mpcf.c	2006-10-07 13:57:06 UTC (rev 24169)
+++ scummvm/branches/branch-0-9-0/backends/ds/arm9/source/fat/io_mpcf.c	2006-10-07 15:32:21 UTC (rev 24170)
@@ -329,7 +329,8 @@
 	u8 temp = MP_REG_LBA1;
 	MP_REG_LBA1 = (~temp & 0xFF);
 	temp = (~temp & 0xFF);
-	return (MP_REG_LBA1 == temp) ;
+	// NDM: Added GBA ROM header check so that this doesn't detect a Max Media Dock!
+	return (MP_REG_LBA1 == temp) && ( *((u8 *) (0x080000B2)) == 0x96);
 }
 
 /*-----------------------------------------------------------------


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list