[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