notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
32x and sms savestates. Core-independent z80 state. SS bugfixing/refactoring.
[picodrive.git]
/
pico
/
cart.c
diff --git
a/pico/cart.c
b/pico/cart.c
index
45f3866
..
8ac330a
100644
(file)
--- a/
pico/cart.c
+++ b/
pico/cart.c
@@
-9,10
+9,12
@@
\r
#include "pico_int.h"
\r
#include "../zlib/zlib.h"
\r
\r
#include "pico_int.h"
\r
#include "../zlib/zlib.h"
\r
+#include "../cpu/debug.h"
\r
#include "../unzip/unzip.h"
\r
#include "../unzip/unzip_stream.h"
\r
\r
\r
#include "../unzip/unzip.h"
\r
#include "../unzip/unzip_stream.h"
\r
\r
\r
+static int rom_alloc_size;
\r
static const char *rom_exts[] = { "bin", "gen", "smd", "iso", "sms", "gg", "sg" };
\r
\r
void (*PicoCartUnloadHook)(void);
\r
static const char *rom_exts[] = { "bin", "gen", "smd", "iso", "sms", "gg", "sg" };
\r
\r
void (*PicoCartUnloadHook)(void);
\r
@@
-425,22
+427,10
@@
static int DecodeSmd(unsigned char *data,int len)
return 0;
\r
}
\r
\r
return 0;
\r
}
\r
\r
-static unsigned char *cd_realloc(void *old, int filesize)
\r
-{
\r
- unsigned char *rom;
\r
- rom=realloc(old, sizeof(mcd_state));
\r
- if (rom) memset(rom+0x20000, 0, sizeof(mcd_state)-0x20000);
\r
- return rom;
\r
-}
\r
-
\r
static unsigned char *PicoCartAlloc(int filesize, int is_sms)
\r
{
\r
static unsigned char *PicoCartAlloc(int filesize, int is_sms)
\r
{
\r
- int alloc_size;
\r
unsigned char *rom;
\r
\r
unsigned char *rom;
\r
\r
- if (PicoAHW & PAHW_MCD)
\r
- return cd_realloc(NULL, filesize);
\r
-
\r
if (is_sms) {
\r
// make size power of 2 for easier banking handling
\r
int s = 0, tmp = filesize;
\r
if (is_sms) {
\r
// make size power of 2 for easier banking handling
\r
int s = 0, tmp = filesize;
\r
@@
-448,18
+438,27
@@
static unsigned char *PicoCartAlloc(int filesize, int is_sms)
s++;
\r
if (filesize > (1 << s))
\r
s++;
\r
s++;
\r
if (filesize > (1 << s))
\r
s++;
\r
- alloc_size = 1 << s;
\r
+ rom_alloc_size = 1 << s;
\r
+ // be sure we can cover all address space
\r
+ if (rom_alloc_size < 0x10000)
\r
+ rom_alloc_size = 0x10000;
\r
}
\r
else {
\r
}
\r
else {
\r
+ // make alloc size at least sizeof(mcd_state),
\r
+ // in case we want to switch to CD mode
\r
+ if (filesize < sizeof(mcd_state))
\r
+ filesize = sizeof(mcd_state);
\r
+
\r
// align to 512K for memhandlers
\r
// align to 512K for memhandlers
\r
- alloc_size = (filesize + 0x7ffff) & ~0x7ffff;
\r
+
rom_
alloc_size = (filesize + 0x7ffff) & ~0x7ffff;
\r
}
\r
\r
}
\r
\r
- if (alloc_size - filesize < 4)
\r
- alloc_size += 4; // padding for out-of-bound exec protection
\r
+ if (
rom_
alloc_size - filesize < 4)
\r
+
rom_
alloc_size += 4; // padding for out-of-bound exec protection
\r
\r
// Allocate space for the rom plus padding
\r
\r
// Allocate space for the rom plus padding
\r
- rom = calloc(alloc_size, 1);
\r
+ // use special address for 32x dynarec
\r
+ rom = plat_mmap(0x02000000, rom_alloc_size);
\r
return rom;
\r
}
\r
\r
return rom;
\r
}
\r
\r
@@
-513,7
+512,6
@@
int PicoCartLoad(pm_file *f,unsigned char **prom,unsigned int *psize,int is_sms)
if (!(PicoAHW & PAHW_MCD) && size == 0x20000 && (!strncmp((char *)rom+0x124, "BOOT", 4) ||
\r
!strncmp((char *)rom+0x128, "BOOT", 4))) {
\r
PicoAHW |= PAHW_MCD;
\r
if (!(PicoAHW & PAHW_MCD) && size == 0x20000 && (!strncmp((char *)rom+0x124, "BOOT", 4) ||
\r
!strncmp((char *)rom+0x128, "BOOT", 4))) {
\r
PicoAHW |= PAHW_MCD;
\r
- rom = cd_realloc(rom, size);
\r
}
\r
\r
// Check for SMD:
\r
}
\r
\r
// Check for SMD:
\r
@@
-561,6
+559,7
@@
int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_
PicoCartUnloadHook();
\r
PicoCartUnloadHook = NULL;
\r
}
\r
PicoCartUnloadHook();
\r
PicoCartUnloadHook = NULL;
\r
}
\r
+ pdb_cleanup();
\r
\r
PicoAHW &= PAHW_MCD|PAHW_SMS;
\r
\r
\r
PicoAHW &= PAHW_MCD|PAHW_SMS;
\r
\r
@@
-596,6
+595,17
@@
int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_
return 0;
\r
}
\r
\r
return 0;
\r
}
\r
\r
+int PicoCartResize(int newsize)
\r
+{
\r
+ void *tmp = plat_mremap(Pico.rom, rom_alloc_size, newsize);
\r
+ if (tmp == NULL)
\r
+ return -1;
\r
+
\r
+ Pico.rom = tmp;
\r
+ rom_alloc_size = newsize;
\r
+ return 0;
\r
+}
\r
+
\r
void PicoCartUnload(void)
\r
{
\r
if (PicoCartUnloadHook != NULL) {
\r
void PicoCartUnload(void)
\r
{
\r
if (PicoCartUnloadHook != NULL) {
\r
@@
-608,8
+618,8
@@
void PicoCartUnload(void)
\r
if (Pico.rom != NULL) {
\r
SekFinishIdleDet();
\r
\r
if (Pico.rom != NULL) {
\r
SekFinishIdleDet();
\r
-
free(Pico.rom
);
\r
- Pico.rom
=
NULL;
\r
+
plat_munmap(Pico.rom, rom_alloc_size
);
\r
+ Pico.rom
=
NULL;
\r
}
\r
}
\r
\r
}
\r
}
\r
\r