ROM load progress bar
authornotaz <notasas@gmail.com>
Thu, 23 Aug 2007 13:24:11 +0000 (13:24 +0000)
committernotaz <notasas@gmail.com>
Thu, 23 Aug 2007 13:24:11 +0000 (13:24 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@224 be3aeb3a-fb24-0410-a615-afba39da0efa

Pico/Cart.c
Pico/Pico.h
platform/gp2x/Makefile
platform/gp2x/emu.c
platform/gp2x/gp2x.c
platform/gp2x/menu.c
platform/gp2x/menu.h

index a847088..1cf8dec 100644 (file)
@@ -15,6 +15,8 @@
 \r
 static char *rom_exts[] = { "bin", "gen", "smd", "iso" };\r
 \r
+void (*PicoCartLoadProgressCB)(int percent) = NULL;\r
+\r
 \r
 pm_file *pm_open(const char *path)\r
 {\r
@@ -244,7 +246,7 @@ static unsigned char *PicoCartAlloc(int filesize)
 \r
 int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)\r
 {\r
-  unsigned char *rom=NULL; int size;\r
+  unsigned char *rom=NULL; int size, bytes_read;\r
   if (f==NULL) return 1;\r
 \r
   size=f->size;\r
@@ -258,7 +260,30 @@ int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize)
     return 1;\r
   }\r
 \r
-  pm_read(rom,size,f); // Load up the rom\r
+  if (PicoCartLoadProgressCB != NULL)\r
+  {\r
+    // read ROM in blocks, just for fun\r
+    int ret;\r
+    unsigned char *p = rom;\r
+    bytes_read=0;\r
+    do\r
+    {\r
+      int todo = size - bytes_read;\r
+      if (todo > 256*1024) todo = 256*1024;\r
+      ret = pm_read(p,todo,f);\r
+      bytes_read += ret;\r
+      p += ret;\r
+      PicoCartLoadProgressCB(bytes_read * 100 / size);\r
+    }\r
+    while (ret > 0);\r
+  }\r
+  else\r
+    bytes_read = pm_read(rom,size,f); // Load up the rom\r
+  if (bytes_read <= 0) {\r
+    printf("read failed\n");\r
+    free(rom);\r
+    return 1;\r
+  }\r
 \r
   // maybe we are loading MegaCD BIOS?\r
   if (!(PicoMCD&1) && size == 0x20000 && (!strncmp((char *)rom+0x124, "BOOT", 4) || !strncmp((char *)rom+0x128, "BOOT", 4))) {\r
index 8e5d642..ec5148b 100644 (file)
@@ -92,6 +92,7 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize);
 void Byteswap(unsigned char *data,int len);\r
 // anotherguest\r
 int PicoUnloadCart(unsigned char* romdata);\r
+extern void (*PicoCartLoadProgressCB)(int percent);\r
 \r
 // Draw.c\r
 void PicoDrawSetColorFormat(int which); // 0=BGR444, 1=RGB555, 2=8bit(HighPal pal)\r
index d9c40bb..489d62f 100644 (file)
@@ -210,7 +210,7 @@ $(error need VER)
 endif\r
 endif\r
 \r
-rel: PicoDrive.gpe code940/code940.bin ../readme.txt config.txt PicoDrive.man.txt PicoDrive.png\r
+rel: PicoDrive.gpe code940/pico940.bin ../readme.txt config.txt PicoDrive.man.txt PicoDrive.png\r
        zip -9 -j ../../PicoDrive_$(VER).zip $^ mmuhack.o\r
 \r
 code940/code940.bin:\r
index cb924c3..bfbc0c1 100644 (file)
@@ -287,6 +287,8 @@ int emu_ReloadRom(void)
                return 0;\r
        }\r
 \r
+       menu_romload_prepare(used_rom_name);\r
+\r
        if(rom_data) {\r
                free(rom_data);\r
                rom_data = 0;\r
@@ -297,9 +299,11 @@ int emu_ReloadRom(void)
                sprintf(menuErrorMsg, "PicoCartLoad() failed.");\r
                printf("%s\n", menuErrorMsg);\r
                pm_close(rom);\r
+               menu_romload_end();\r
                return 0;\r
        }\r
        pm_close(rom);\r
+       menu_romload_end();\r
 \r
        // detect wrong files (Pico crashes on very small files), also see if ROM EP is good\r
        if(rom_size <= 0x200 || strncmp((char *)rom_data, "Pico", 4) == 0 ||\r
index d6a701c..c0396d9 100644 (file)
@@ -159,10 +159,11 @@ void gp2x_video_wait_vsync(void)
 \r
 void gp2x_memcpy_buffers(int buffers, void *data, int offset, int len)\r
 {\r
-       if (buffers & (1<<0)) memcpy((char *)gp2x_screens[0] + offset, data, len);\r
-       if (buffers & (1<<1)) memcpy((char *)gp2x_screens[1] + offset, data, len);\r
-       if (buffers & (1<<2)) memcpy((char *)gp2x_screens[2] + offset, data, len);\r
-       if (buffers & (1<<3)) memcpy((char *)gp2x_screens[3] + offset, data, len);\r
+       char *dst;\r
+       if (buffers & (1<<0)) { dst = (char *)gp2x_screens[0] + offset; if (dst != data) memcpy(dst, data, len); }\r
+       if (buffers & (1<<1)) { dst = (char *)gp2x_screens[1] + offset; if (dst != data) memcpy(dst, data, len); }\r
+       if (buffers & (1<<2)) { dst = (char *)gp2x_screens[2] + offset; if (dst != data) memcpy(dst, data, len); }\r
+       if (buffers & (1<<3)) { dst = (char *)gp2x_screens[3] + offset; if (dst != data) memcpy(dst, data, len); }\r
 }\r
 \r
 \r
index 9b51d7c..06a3e3d 100644 (file)
@@ -420,6 +420,39 @@ static unsigned long wait_for_input_usbjoy(unsigned long interesting, int *joy)
 \r
 \r
 \r
+// --------- loading ROM screen ----------\r
+\r
+static void load_progress_cb(int percent)\r
+{\r
+       int ln, len = percent * 320 / 100;\r
+       unsigned char *dst = (unsigned char *)gp2x_screen + 320*20;\r
+\r
+       if (len > 320) len = 320;\r
+       for (ln = 10; ln > 0; ln--, dst += 320)\r
+               memset(dst, 0xf0, len);\r
+       gp2x_video_flip2();\r
+}\r
+\r
+void menu_romload_prepare(const char *rom_name)\r
+{\r
+       const char *p = rom_name + strlen(rom_name);\r
+       while (p > rom_name && *p != '/') p--;\r
+\r
+       gp2x_pd_clone_buffer2();\r
+       gp2x_smalltext8(1, 1, "Loading");\r
+       gp2x_smalltext8_lim(1, 10, p, 53);\r
+       gp2x_memcpy_buffers(3, gp2x_screen, 0, 320*240);\r
+       gp2x_video_flip2();\r
+       PicoCartLoadProgressCB = load_progress_cb;\r
+}\r
+\r
+void menu_romload_end(void)\r
+{\r
+       PicoCartLoadProgressCB = NULL;\r
+       gp2x_smalltext8(1, 30, "Starting emulation...");\r
+       gp2x_video_flip2();\r
+}\r
+\r
 // -------------- ROM selector --------------\r
 \r
 static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel)\r
@@ -429,7 +462,6 @@ static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel)
        start = 12 - sel;\r
        n--; // exclude current dir (".")\r
 \r
-       //memset(gp2x_screen, 0, 320*240);\r
        gp2x_pd_clone_buffer2();\r
 \r
        if(start - 2 >= 0)\r
index 87c51b5..8c9e29b 100644 (file)
@@ -10,6 +10,8 @@ void gp2x_text_out15 (int x, int y, const char *text);
 void gp2x_text_out8_2(int x, int y, const char *texto, int color);\r
 void menu_loop(void);\r
 int  menu_loop_tray(void);\r
+void menu_romload_prepare(const char *rom_name);\r
+void menu_romload_end(void);\r
 \r
 #define CONFIGURABLE_KEYS \\r
        (GP2X_UP|GP2X_DOWN|GP2X_LEFT|GP2X_RIGHT|GP2X_A|GP2X_B|GP2X_X|GP2X_Y| \\r