+static void set_cbs(int gz)\r
+{\r
+ if (gz) {\r
+ areaRead = gzRead2;\r
+ areaWrite = gzWrite2;\r
+ areaEof = (areaeof *) gzeof;\r
+ areaSeek = (areaseek *) gzseek;\r
+ areaClose = (areaclose *) gzclose;\r
+ } else {\r
+ areaRead = (arearw *) fread;\r
+ areaWrite = (arearw *) fwrite;\r
+ areaEof = (areaeof *) feof;\r
+ areaSeek = (areaseek *) fseek;\r
+ areaClose = (areaclose *) fclose;\r
+ }\r
+}\r
+\r
+int PicoState(const char *fname, int is_save)\r
+{\r
+ void *afile = NULL;\r
+ int ret;\r
+\r
+ if (strcmp(fname + strlen(fname) - 3, ".gz") == 0)\r
+ {\r
+ if ( (afile = gzopen(fname, is_save ? "wb" : "rb")) ) {\r
+ set_cbs(1);\r
+ if (is_save)\r
+ gzsetparams(afile, 9, Z_DEFAULT_STRATEGY);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if ( (afile = fopen(fname, is_save ? "wb" : "rb")) ) {\r
+ set_cbs(0);\r
+ }\r
+ }\r
+\r
+ if (afile == NULL)\r
+ return -1;\r
+\r
+ ret = PmovState(is_save, afile);\r
+ areaClose(afile);\r
+ if (!is_save)\r
+ Pico.m.dirtyPal=1;\r
+\r
+ return ret;\r
+}\r
+\r
+int PicoStateLoadVDP(const char *fname)\r
+{\r
+ void *afile = NULL;\r
+ if (strcmp(fname + strlen(fname) - 3, ".gz") == 0)\r
+ {\r
+ if ( (afile = gzopen(fname, "rb")) )\r
+ set_cbs(1);\r
+ }\r
+ else\r
+ {\r
+ if ( (afile = fopen(fname, "rb")) )\r
+ set_cbs(0);\r
+ }\r
+ if (afile == NULL)\r
+ return -1;\r
+\r
+ if ((PicoAHW & PAHW_MCD) || carthw_chunks != NULL) {\r
+ PicoCdLoadStateGfx(afile);\r
+ } else {\r
+ areaSeek(afile, 0x10020, SEEK_SET); // skip header and RAM in state file\r
+ areaRead(Pico.vram, 1, sizeof(Pico.vram), afile);\r
+ areaSeek(afile, 0x2000, SEEK_CUR);\r
+ areaRead(Pico.cram, 1, sizeof(Pico.cram), afile);\r
+ areaRead(Pico.vsram, 1, sizeof(Pico.vsram), afile);\r
+ areaSeek(afile, 0x221a0, SEEK_SET);\r
+ areaRead(&Pico.video, 1, sizeof(Pico.video), afile);\r
+ }\r
+ areaClose(afile);\r