From 01c19d7afb0b8f9724a41301b070585c6360113e Mon Sep 17 00:00:00 2001 From: "SND\\weimingzhi_cp" Date: Sat, 6 Mar 2010 14:30:02 +0000 Subject: git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@42174 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/ppf.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'libpcsxcore') 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; } } -- cgit v1.2.3