From 60e436cbfc50b7ec6af134ecec0d4c19ee6b95ed Mon Sep 17 00:00:00 2001 From: "SND\\MaddTheSane_cp" Date: Mon, 8 Jul 2013 03:35:06 +0000 Subject: Implement compaction of memory cards. Other assorted bug fixes. git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@85890 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- macosx/PcsxrMemCardArray.m | 89 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 11 deletions(-) (limited to 'macosx/PcsxrMemCardArray.m') diff --git a/macosx/PcsxrMemCardArray.m b/macosx/PcsxrMemCardArray.m index d482cd5b..b3b8ce41 100644 --- a/macosx/PcsxrMemCardArray.m +++ b/macosx/PcsxrMemCardArray.m @@ -9,6 +9,7 @@ #import "PcsxrMemCardArray.h" #import "ARCBridge.h" #import "ConfigurationController.h" +#include "sio.h" #define MAX_MEMCARD_BLOCKS 15 @@ -25,6 +26,43 @@ static inline void CopyMemcardData(char *from, char *to, int srci, int dsti, cha //printf("data = %s\n", from + (srci+1) * 128); } +static inline char* CreateBlankHeader() +{ + struct PSXMemHeader { + unsigned int allocState; + unsigned int fileSize; + unsigned short nextBlock; + char fileName[21]; + unsigned char garbage[96]; + unsigned char checksum; + }; + struct PSXMemHeader *toReturn = calloc(sizeof(struct PSXMemHeader), 1); + + toReturn->allocState = 0x000000a0; + toReturn->nextBlock = 0xFFFF; + unsigned char *bytePtr = (unsigned char*)toReturn; + for (int i = 0; i < sizeof(struct PSXMemHeader) - sizeof(unsigned char); i++) { + toReturn->checksum = toReturn->checksum ^ bytePtr[i]; + } + + return (char*)toReturn; +} + +static inline void ClearMemcardData(char *to, int dsti, char *str) +{ + // header + char *header = CreateBlankHeader(); + + memcpy(to + (dsti + 1) * 128, header, 128); + SaveMcd(str, to, (dsti + 1) * 128, 128); + free(header); + + // data + memset(to + (dsti + 1) * 1024 * 8, 0, 1024 * 8); + SaveMcd(str, to, (dsti + 1) * 1024 * 8, 1024 * 8); + +} + @interface PcsxrMemCardArray () @property (arcretain) NSArray *rawArray; @@ -45,6 +83,15 @@ static inline void CopyMemcardData(char *from, char *to, int srci, int dsti, cha } } +- (const char *)memCardCPath +{ + if (cardNumber == 1) { + return Config.Mcd1; + } else { + return Config.Mcd2; + } +} + - (id)initWithMemoryCardNumber:(int)carNum { NSParameterAssert(carNum == 1 || carNum == 2); @@ -152,18 +199,10 @@ static inline void CopyMemcardData(char *from, char *to, int srci, int dsti, cha NSAssert(toCopy != -1, @"Compacting the card should have made space!"); } - char *to, *from; - if (cardNumber == 1) { - to = Mcd2Data; - from = Mcd1Data; - } else { - to = Mcd1Data; - from = Mcd2Data; - } int memIdx = tmpObj.startingIndex; int i; for (i = 0; i < memSize; i++) { - CopyMemcardData([self memDataPtr], [otherCard memDataPtr], (memIdx+i), (toCopy+i), (char*)[[[otherCard memCardURL] path] fileSystemRepresentation]); + CopyMemcardData([self memDataPtr], [otherCard memDataPtr], (memIdx+i), (toCopy+i), (char*)otherCard.memCardCPath); } return YES; @@ -227,9 +266,37 @@ static inline void CopyMemcardData(char *from, char *to, int srci, int dsti, cha - (void)compactMemory { - NSAssert(NO, @"Compacting memory cards is not implemented yet!"); + int i = 0, x = 1; + while (i < MAX_MEMCARD_BLOCKS && x < MAX_MEMCARD_BLOCKS) { + x = i; + McdBlock baseBlock; + GetMcdBlockInfo(cardNumber, i+1, &baseBlock); + PCSXRMemFlags theFlags = [PcsxrMemoryObject memFlagsFromBlockFlags:baseBlock.Flags]; + + if (theFlags == memFlagDeleted || theFlags == memFlagFree) { + PCSXRMemFlags up1Flags = theFlags; + while ((up1Flags == memFlagDeleted || up1Flags == memFlagFree) && x < MAX_MEMCARD_BLOCKS){ + x++; + McdBlock up1Block; + GetMcdBlockInfo(cardNumber, x+1, &up1Block); + up1Flags = [PcsxrMemoryObject memFlagsFromBlockFlags:up1Block.Flags]; + } + if (x >= MAX_MEMCARD_BLOCKS) { + + break; + } + CopyMemcardData(self.memDataPtr, self.memDataPtr, x, i, (char*)[[self.memCardURL path] fileSystemRepresentation]); + ClearMemcardData(self.memDataPtr, x, (char*)self.memCardCPath ); + } + i++; + } + + while (i < MAX_MEMCARD_BLOCKS) { + ClearMemcardData(self.memDataPtr, i, (char*)self.memCardCPath); + i++; + } - LoadMcd(cardNumber, cardNumber == 1 ? Config.Mcd1 : Config.Mcd2); + LoadMcd(cardNumber, (char*)self.memCardCPath); #if 0 [[NSNotificationCenter defaultCenter] postNotificationName:memChangeNotifier object:nil userInfo:[NSDictionary dictionaryWithObject:@(cardNumber) forKey:memCardChangeNumberKey]]; #endif -- cgit v1.2.3