diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-03-06 14:30:02 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-03-06 14:30:02 +0000 |
| commit | 01c19d7afb0b8f9724a41301b070585c6360113e (patch) | |
| tree | 3bc412666433528663b5aed9a2acb9b6eb0d8662 | |
| parent | 21574a170079297b6c655c5dfea7be097c5df684 (diff) | |
| download | pcsxr-01c19d7afb0b8f9724a41301b070585c6360113e.tar.gz | |
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@42174 e17a0e51-4ae3-4d35-97c3-1a29b211df97
| -rw-r--r-- | ChangeLog | 5 | ||||
| -rw-r--r-- | libpcsxcore/ppf.c | 31 |
2 files changed, 26 insertions, 10 deletions
@@ -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; } } |
