summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-03-06 14:30:02 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-03-06 14:30:02 +0000
commit01c19d7afb0b8f9724a41301b070585c6360113e (patch)
tree3bc412666433528663b5aed9a2acb9b6eb0d8662
parent21574a170079297b6c655c5dfea7be097c5df684 (diff)
downloadpcsxr-01c19d7afb0b8f9724a41301b070585c6360113e.tar.gz
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@42174 e17a0e51-4ae3-4d35-97c3-1a29b211df97
-rw-r--r--ChangeLog5
-rw-r--r--libpcsxcore/ppf.c31
2 files changed, 26 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 7ac2b617..21370ea1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+March 6, 2010 Wei Mingzhi <whistler_wmz@users.sf.net>
+
+ * libpcsxcore/ppf.c: Speeded up the PPF loading routine when the PPF file
+ is "in order".
+
February 23, 2010 Wei Mingzhi <whistler_wmz@users.sf.net>
* plugins/dfinput/analog.c: Confirmed center value should be 127 instead of
diff --git a/libpcsxcore/ppf.c b/libpcsxcore/ppf.c
index ef1b81ac..cd33f92c 100644
--- a/libpcsxcore/ppf.c
+++ b/libpcsxcore/ppf.c
@@ -38,7 +38,7 @@ typedef struct tagPPF_CACHE {
} PPF_CACHE;
static PPF_CACHE *ppfCache = NULL;
-static PPF_DATA *ppfHead = NULL;
+static PPF_DATA *ppfHead = NULL, *ppfLast = NULL;
static int iPPFNum = 0;
// using a linked data list, and address array
@@ -86,6 +86,7 @@ void FreePPFCache() {
p = (PPF_DATA *)pn;
}
ppfHead = NULL;
+ ppfLast = NULL;
if (ppfCache != NULL) free(ppfCache);
ppfCache = NULL;
@@ -140,22 +141,30 @@ static void AddToPPF(s32 ladr, s32 pos, s32 anz, unsigned char *ppfmem) {
ppfHead->anz = anz;
memcpy(ppfHead + 1, ppfmem, anz);
iPPFNum = 1;
+ ppfLast = ppfHead;
} else {
PPF_DATA *p = ppfHead;
PPF_DATA *plast = NULL;
PPF_DATA *padd;
- while (p != NULL) {
- if (ladr < p->addr) break;
- if (ladr == p->addr) {
- while (p && ladr == p->addr && pos > p->pos) {
- plast = p;
- p = p->pNext;
+
+ if (ladr > ppfLast->addr || (ladr == ppfLast->addr && pos > ppfLast->pos)) {
+ p = NULL;
+ plast = ppfLast;
+ } else {
+ while (p != NULL) {
+ if (ladr < p->addr) break;
+ if (ladr == p->addr) {
+ while (p && ladr == p->addr && pos > p->pos) {
+ plast = p;
+ p = p->pNext;
+ }
+ break;
}
- break;
+ plast = p;
+ p = p->pNext;
}
- plast = p;
- p = p->pNext;
}
+
padd = (PPF_DATA *)malloc(sizeof(PPF_DATA) + anz);
padd->addr = ladr;
padd->pNext = p;
@@ -165,6 +174,8 @@ static void AddToPPF(s32 ladr, s32 pos, s32 anz, unsigned char *ppfmem) {
iPPFNum++;
if (plast == NULL) ppfHead = padd;
else plast->pNext = padd;
+
+ if (padd->pNext == NULL) ppfLast = padd;
}
}