X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=Pico%2Fcd%2Fbuffering.c;h=ad8b355dfff77a8614c3a8f057d30abf9f0b662c;hb=aefb65bc6a5336d2f02935e7a94bd0073def54c7;hp=c391cf459793796778f6b756d08650ad2b8fc730;hpb=66fdc0f0d590809fb0040d08fd57607bf80b1abc;p=picodrive.git diff --git a/Pico/cd/buffering.c b/Pico/cd/buffering.c index c391cf4..ad8b355 100644 --- a/Pico/cd/buffering.c +++ b/Pico/cd/buffering.c @@ -1,6 +1,7 @@ -#include "../PicoInt.h" +// Buffering handling +// (c) Copyright 2007, Grazvydas "notaz" Ignotas -//#include +#include "../PicoInt.h" int PicoCDBuffers = 0; static unsigned char *cd_buffer = NULL; @@ -24,7 +25,7 @@ void PicoCDBufferInit(void) /* try alloc'ing until we succeed */ while (PicoCDBuffers > 0) { - tmp = realloc(cd_buffer, PicoCDBuffers * 2048); + tmp = realloc(cd_buffer, PicoCDBuffers * 2048 + 304); if (tmp != NULL) break; PicoCDBuffers >>= 1; } @@ -47,7 +48,7 @@ void PicoCDBufferFree(void) /* this is a try to fight slow SD access of GP2X */ -void PicoCDBufferRead(void *dest, int lba) +PICO_INTERNAL void PicoCDBufferRead(void *dest, int lba) { int is_bin, offs, read_len, moved = 0; reads++; @@ -79,6 +80,7 @@ void PicoCDBufferRead(void *dest, int lba) dprintf("CD buffer seek %i -> %i\n", prev_lba, lba); pm_seek(Pico_mcd->TOC.Tracks[0].F, where_seek, SEEK_SET); } +else if (prev_lba == 0x80000000) printf("wtf?\n"); dprintf("CD buffer miss %i -> %i\n", prev_lba, lba); @@ -88,6 +90,7 @@ void PicoCDBufferRead(void *dest, int lba) dprintf("CD buffer move=%i, read_len=%i", PicoCDBuffers - read_len, read_len); memmove(cd_buffer + read_len*2048, cd_buffer, (PicoCDBuffers - read_len)*2048); moved = 1; +if (prev_lba == 0x80000000) printf("wtf?\n"); } else { @@ -101,12 +104,22 @@ void PicoCDBufferRead(void *dest, int lba) if (is_bin) { - int i; - for (i = 0; i < read_len; i++) + int i = 0; +#if REDUCE_IO_CALLS + int bufs = (read_len*2048) / (2048+304); + pm_read(cd_buffer, bufs*(2048+304), Pico_mcd->TOC.Tracks[0].F); + for (i = 1; i < bufs; i++) + // should really use memmove here, but my memcpy32 implementation is also suitable here + memcpy32((int *)(cd_buffer + i*2048), (int *)(cd_buffer + i*(2048+304)), 2048/4); +#endif + for (; i < read_len - 1; i++) { - pm_read(cd_buffer + i*2048, 2048, Pico_mcd->TOC.Tracks[0].F); - pm_seek(Pico_mcd->TOC.Tracks[0].F, 304, SEEK_CUR); + pm_read(cd_buffer + i*2048, 2048 + 304, Pico_mcd->TOC.Tracks[0].F); + // pm_seek(Pico_mcd->TOC.Tracks[0].F, 304, SEEK_CUR); // seeking is slower, in PSP case even more } + // further data might be moved, do not overwrite + pm_read(cd_buffer + i*2048, 2048, Pico_mcd->TOC.Tracks[0].F); + pm_seek(Pico_mcd->TOC.Tracks[0].F, 304, SEEK_CUR); } else {