notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
reset behavior changed, Puggsy detection added
[picodrive.git]
/
Pico
/
Cart.c
diff --git
a/Pico/Cart.c
b/Pico/Cart.c
index
25bb961
..
f2683ca
100644
(file)
--- a/
Pico/Cart.c
+++ b/
Pico/Cart.c
@@
-20,6
+20,8
@@
void (*PicoCartUnloadHook)(void) = NULL;
void (*PicoCartLoadProgressCB)(int percent) = NULL;
\r
void (*PicoCDLoadProgressCB)(int percent) = NULL; // handled in Pico/cd/cd_file.c
\r
\r
void (*PicoCartLoadProgressCB)(int percent) = NULL;
\r
void (*PicoCDLoadProgressCB)(int percent) = NULL; // handled in Pico/cd/cd_file.c
\r
\r
+static void PicoCartDetect(void);
\r
+
\r
/* cso struct */
\r
typedef struct _cso_struct
\r
{
\r
/* cso struct */
\r
typedef struct _cso_struct
\r
{
\r
@@
-135,6
+137,9
@@
zip_failed:
if (f == NULL)
\r
goto cso_failed;
\r
\r
if (f == NULL)
\r
goto cso_failed;
\r
\r
+ /* we use our own buffering */
\r
+ setvbuf(f, NULL, _IONBF, 0);
\r
+
\r
cso = malloc(sizeof(*cso));
\r
if (cso == NULL)
\r
goto cso_failed;
\r
cso = malloc(sizeof(*cso));
\r
if (cso == NULL)
\r
goto cso_failed;
\r
@@
-201,6
+206,7
@@
cso_failed:
file->size = ftell(f);
\r
file->type = PMT_UNCOMPRESSED;
\r
fseek(f, 0, SEEK_SET);
\r
file->size = ftell(f);
\r
file->type = PMT_UNCOMPRESSED;
\r
fseek(f, 0, SEEK_SET);
\r
+
\r
return file;
\r
}
\r
\r
return file;
\r
}
\r
\r
@@
-489,12
+495,17
@@
int PicoCartInsert(unsigned char *rom,unsigned int romsize)
// notaz: add a 68k "jump one op back" opcode to the end of ROM.
\r
// This will hang the emu, but will prevent nasty crashes.
\r
// note: 4 bytes are padded to every ROM
\r
// notaz: add a 68k "jump one op back" opcode to the end of ROM.
\r
// This will hang the emu, but will prevent nasty crashes.
\r
// note: 4 bytes are padded to every ROM
\r
- if(rom != NULL)
\r
+ if
(rom != NULL)
\r
*(unsigned long *)(rom+romsize) = 0xFFFE4EFA; // 4EFA FFFE byteswapped
\r
\r
Pico.rom=rom;
\r
Pico.romsize=romsize;
\r
\r
*(unsigned long *)(rom+romsize) = 0xFFFE4EFA; // 4EFA FFFE byteswapped
\r
\r
Pico.rom=rom;
\r
Pico.romsize=romsize;
\r
\r
+ if (SRam.data) {
\r
+ free(SRam.data);
\r
+ SRam.data = NULL;
\r
+ }
\r
+
\r
if (PicoCartUnloadHook != NULL) {
\r
PicoCartUnloadHook();
\r
PicoCartUnloadHook = NULL;
\r
if (PicoCartUnloadHook != NULL) {
\r
PicoCartUnloadHook();
\r
PicoCartUnloadHook = NULL;
\r
@@
-519,7
+530,8
@@
int PicoCartInsert(unsigned char *rom,unsigned int romsize)
else PicoMemSetup();
\r
PicoMemReset();
\r
\r
else PicoMemSetup();
\r
PicoMemReset();
\r
\r
- return PicoReset(1);
\r
+ PicoPower();
\r
+ return 0;
\r
}
\r
\r
int PicoCartUnload(void)
\r
}
\r
\r
int PicoCartUnload(void)
\r
@@
-550,10
+562,9
@@
static int name_cmp(const char *name)
* various cart-specific things, which can't be handled by generic code
\r
* (maybe I should start using CRC for this stuff?)
\r
*/
\r
* various cart-specific things, which can't be handled by generic code
\r
* (maybe I should start using CRC for this stuff?)
\r
*/
\r
-void PicoCartDetect(void)
\r
+
static
void PicoCartDetect(void)
\r
{
\r
int sram_size = 0, csum;
\r
{
\r
int sram_size = 0, csum;
\r
- if(SRam.data) free(SRam.data); SRam.data=0;
\r
Pico.m.sram_reg = 0;
\r
\r
csum = PicoRead32(0x18c) & 0xffff;
\r
Pico.m.sram_reg = 0;
\r
\r
csum = PicoRead32(0x18c) & 0xffff;
\r
@@
-587,10
+598,16
@@
void PicoCartDetect(void)
sram_size = 0x004000;
\r
}
\r
\r
sram_size = 0x004000;
\r
}
\r
\r
+ // this game actually doesn't have SRAM, but some weird protection
\r
+ if (rom_strcmp(0x120, "PUGGSY") == 0)
\r
+ {
\r
+ SRam.start = SRam.end = sram_size = 0;
\r
+ }
\r
+
\r
if (sram_size)
\r
{
\r
SRam.data = (unsigned char *) calloc(sram_size, 1);
\r
if (sram_size)
\r
{
\r
SRam.data = (unsigned char *) calloc(sram_size, 1);
\r
- if
(!SRam.data
) return;
\r
+ if
(SRam.data == NULL
) return;
\r
}
\r
SRam.changed = 0;
\r
\r
}
\r
SRam.changed = 0;
\r
\r
@@
-656,7
+673,9
@@
void PicoCartDetect(void)
\r
// Detect 12-in-1 mapper
\r
else if ((name_cmp("ROBOCOP 3") == 0 && Pico.romsize == 0x200000) ||
\r
\r
// Detect 12-in-1 mapper
\r
else if ((name_cmp("ROBOCOP 3") == 0 && Pico.romsize == 0x200000) ||
\r
- (rom_strcmp(0x160, "FLICKY") == 0 && Pico.romsize >= 0x200000))
\r
+ (rom_strcmp(0x160, "FLICKY") == 0 && Pico.romsize >= 0x200000) ||
\r
+ (name_cmp(" SHOVE IT!") == 0 && Pico.romsize >= 0x200000) ||
\r
+ (name_cmp("MS PACMAN") == 0 && Pico.romsize >= 0x200000)) // bad dump?
\r
{
\r
carthw_12in1_startup();
\r
}
\r
{
\r
carthw_12in1_startup();
\r
}
\r