about summary refs log tree commit diff stats
path: root/gba/source/libSave.c
diff options
context:
space:
mode:
Diffstat (limited to 'gba/source/libSave.c')
-rw-r--r--gba/source/libSave.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/gba/source/libSave.c b/gba/source/libSave.c index 1ae8162..d545a5f 100644 --- a/gba/source/libSave.c +++ b/gba/source/libSave.c
@@ -88,7 +88,8 @@ typedef enum { false, true } bool;
88#define REG_DM3SAD (*(volatile u32*)0x40000D4) 88#define REG_DM3SAD (*(volatile u32*)0x40000D4)
89#define REG_DM3DAD (*(volatile u32*)0x40000D8) 89#define REG_DM3DAD (*(volatile u32*)0x40000D8)
90#define REG_DM3CNT (*(volatile u32*)0x40000DC) 90#define REG_DM3CNT (*(volatile u32*)0x40000DC)
91 91#define REG_DM3CNT_H (*(volatile u16*)0x40000DE)
92#define REG_WAITCNT (*(volatile u16*)0x4000204)
92 93
93//----------------------------------------------------------------------- 94//-----------------------------------------------------------------------
94// Common EEPROM Routines 95// Common EEPROM Routines
@@ -96,16 +97,20 @@ typedef enum { false, true } bool;
96 97
97void EEPROM_SendPacket( u16* packet, int size ) 98void EEPROM_SendPacket( u16* packet, int size )
98{ 99{
100 REG_WAITCNT = (REG_WAITCNT & 0xF8FF) | 0x0300;
99 REG_DM3SAD = (u32)packet; 101 REG_DM3SAD = (u32)packet;
100 REG_DM3DAD = (u32)EEPROM_ADDRESS; 102 REG_DM3DAD = (u32)EEPROM_ADDRESS;
101 REG_DM3CNT = 0x80000000 + size; 103 REG_DM3CNT = 0x80000000 + size;
104 while((REG_DM3CNT_H & 0x8000) != 0) ;
102} 105}
103 106
104void EEPROM_ReceivePacket( u16* packet, int size ) 107void EEPROM_ReceivePacket( u16* packet, int size )
105{ 108{
109 REG_WAITCNT = (REG_WAITCNT & 0xF8FF) | 0x0300;
106 REG_DM3SAD = (u32)EEPROM_ADDRESS; 110 REG_DM3SAD = (u32)EEPROM_ADDRESS;
107 REG_DM3DAD = (u32)packet; 111 REG_DM3DAD = (u32)packet;
108 REG_DM3CNT = 0x80000000 + size; 112 REG_DM3CNT = 0x80000000 + size;
113 while((REG_DM3CNT_H & 0x8000) != 0) ;
109} 114}
110 115
111//----------------------------------------------------------------------- 116//-----------------------------------------------------------------------
@@ -187,7 +192,7 @@ void EEPROM_Write_512B( volatile u8 offset, u8* source ) // source must point to
187 in_byte = *in_pos++; 192 in_byte = *in_pos++;
188 for( bit = 7; bit >= 0; --bit ) 193 for( bit = 7; bit >= 0; --bit )
189 { 194 {
190 *out_pos++ = in_byte>>bit; 195 *out_pos++ = (in_byte>>bit)&1;
191 } 196 }
192 } 197 }
193 198
@@ -641,6 +646,7 @@ u32 SaveSize(u8* data, s32 gamesize)
641 646
642 u32 *pak= ((u32*)0x08000000); 647 u32 *pak= ((u32*)0x08000000);
643 s32 x; 648 s32 x;
649 u16 i;
644 s32 size = gamesize/4; 650 s32 size = gamesize/4;
645 651
646 652
@@ -658,10 +664,9 @@ u32 SaveSize(u8* data, s32 gamesize)
658 case 0x52504545: 664 case 0x52504545:
659 if ((pak[x+1] & 0x00FFFFFF) == 0x005F4D4F){ 665 if ((pak[x+1] & 0x00FFFFFF) == 0x005F4D4F){
660 GetSave_EEPROM_8KB(data); 666 GetSave_EEPROM_8KB(data);
661 if (memcmp(data,data+0x200,8) != 0 || 667 for(i = 8; i < 0x800; i += 8) {
662 memcmp(data,data+0x400,8) != 0 || 668 if(memcmp(data, data+i, 8) != 0)
663 memcmp(data,data+0x600,8) != 0){ 669 return 0x2000; // EEPROM_8KB
664 return 0x2000; //EEPROM_8KB
665 } 670 }
666 return 0x200; // EEPROM_512B 671 return 0x200; // EEPROM_512B
667 } 672 }