mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
reset behavior changed, Puggsy detection added
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@405 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
65ca3034d4
commit
1cb1584b86
12 changed files with 63 additions and 39 deletions
|
@ -530,7 +530,8 @@ int PicoCartInsert(unsigned char *rom,unsigned int romsize)
|
||||||
else PicoMemSetup();
|
else PicoMemSetup();
|
||||||
PicoMemReset();
|
PicoMemReset();
|
||||||
|
|
||||||
return PicoReset(1);
|
PicoPower();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PicoCartUnload(void)
|
int PicoCartUnload(void)
|
||||||
|
@ -597,6 +598,12 @@ static void PicoCartDetect(void)
|
||||||
sram_size = 0x004000;
|
sram_size = 0x004000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this game actually doesn't have SRAM, but some weird protection
|
||||||
|
if (rom_strcmp(0x120, "PUGGSY") == 0)
|
||||||
|
{
|
||||||
|
SRam.start = SRam.end = sram_size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (sram_size)
|
if (sram_size)
|
||||||
{
|
{
|
||||||
SRam.data = (unsigned char *) calloc(sram_size, 1);
|
SRam.data = (unsigned char *) calloc(sram_size, 1);
|
||||||
|
|
53
Pico/Pico.c
53
Pico/Pico.c
|
@ -52,10 +52,32 @@ void PicoExit(void)
|
||||||
PicoExitMCD();
|
PicoExitMCD();
|
||||||
z80_exit();
|
z80_exit();
|
||||||
|
|
||||||
if(SRam.data) free(SRam.data); SRam.data=0;
|
if (SRam.data) free(SRam.data); SRam.data=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PicoReset(int hard)
|
void PicoPower(void)
|
||||||
|
{
|
||||||
|
// clear all memory of the emulated machine
|
||||||
|
memset(&Pico.ram,0,(unsigned int)&Pico.rom-(unsigned int)&Pico.ram);
|
||||||
|
|
||||||
|
memset(&Pico.video,0,sizeof(Pico.video));
|
||||||
|
memset(&Pico.m,0,sizeof(Pico.m));
|
||||||
|
|
||||||
|
Pico.video.pending_ints=0;
|
||||||
|
z80_reset();
|
||||||
|
|
||||||
|
// default VDP register values (based on Fusion)
|
||||||
|
Pico.video.reg[0] = Pico.video.reg[1] = 0x04;
|
||||||
|
Pico.video.reg[0xc] = 0x81;
|
||||||
|
Pico.video.reg[0xf] = 0x02;
|
||||||
|
|
||||||
|
if (PicoMCD & 1)
|
||||||
|
PicoPowerMCD();
|
||||||
|
|
||||||
|
PicoReset();
|
||||||
|
}
|
||||||
|
|
||||||
|
int PicoReset(void)
|
||||||
{
|
{
|
||||||
unsigned int region=0;
|
unsigned int region=0;
|
||||||
int support=0,hw=0,i=0;
|
int support=0,hw=0,i=0;
|
||||||
|
@ -72,25 +94,12 @@ int PicoReset(int hard)
|
||||||
// s68k doesn't have the TAS quirk, so we just globally set normal TAS handler in MCD mode (used by Batman games).
|
// s68k doesn't have the TAS quirk, so we just globally set normal TAS handler in MCD mode (used by Batman games).
|
||||||
SekSetRealTAS(PicoMCD & 1);
|
SekSetRealTAS(PicoMCD & 1);
|
||||||
SekCycleCntT=0;
|
SekCycleCntT=0;
|
||||||
z80_reset();
|
|
||||||
|
|
||||||
// reset VDP state, VRAM and PicoMisc
|
if (PicoMCD & 1)
|
||||||
//memset(&Pico.video,0,sizeof(Pico.video));
|
// needed for MCD to reset properly, probably some bug hides behind this..
|
||||||
//memset(&Pico.vram,0,sizeof(Pico.vram));
|
memset(Pico.ioports,0,sizeof(Pico.ioports));
|
||||||
memset(Pico.ioports,0,sizeof(Pico.ioports)); // needed for MCD to reset properly
|
|
||||||
memset(&Pico.m,0,sizeof(Pico.m));
|
|
||||||
Pico.video.pending_ints=0;
|
|
||||||
emustatus = 0;
|
emustatus = 0;
|
||||||
|
|
||||||
if (hard) {
|
|
||||||
// clear all memory of the emulated machine
|
|
||||||
memset(&Pico.ram,0,(unsigned int)&Pico.rom-(unsigned int)&Pico.ram);
|
|
||||||
}
|
|
||||||
|
|
||||||
// default VDP register values (based on Fusion)
|
|
||||||
Pico.video.reg[0] = Pico.video.reg[1] = 0x04;
|
|
||||||
Pico.video.reg[0xc] = 0x81;
|
|
||||||
Pico.video.reg[0xf] = 0x02;
|
|
||||||
Pico.m.dirtyPal = 1;
|
Pico.m.dirtyPal = 1;
|
||||||
|
|
||||||
if(PicoRegionOverride)
|
if(PicoRegionOverride)
|
||||||
|
@ -141,12 +150,16 @@ int PicoReset(int hard)
|
||||||
|
|
||||||
Pico.m.hardware=(unsigned char)(hw|0x20); // No disk attached
|
Pico.m.hardware=(unsigned char)(hw|0x20); // No disk attached
|
||||||
Pico.m.pal=pal;
|
Pico.m.pal=pal;
|
||||||
Pico.video.status = 0x3408 | pal; // always set bits | vblank | pal
|
Pico.video.status = 0x3408 | pal; // 'always set' bits | vblank | pal
|
||||||
|
|
||||||
PsndReset(); // pal must be known here
|
PsndReset(); // pal must be known here
|
||||||
|
|
||||||
|
// create an empty "dma" to cause 68k exec start at random frame location
|
||||||
|
if (Pico.m.dma_xfers == 0 && !(PicoOpt&0x10000))
|
||||||
|
Pico.m.dma_xfers = rand() & 0x1fff;
|
||||||
|
|
||||||
if (PicoMCD & 1) {
|
if (PicoMCD & 1) {
|
||||||
PicoResetMCD(hard);
|
PicoResetMCD();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,8 @@ extern int PicoAutoRgnOrder; // packed priority list of regions, for example 0x1
|
||||||
extern int PicoSVPCycles;
|
extern int PicoSVPCycles;
|
||||||
int PicoInit(void);
|
int PicoInit(void);
|
||||||
void PicoExit(void);
|
void PicoExit(void);
|
||||||
int PicoReset(int hard);
|
void PicoPower(void);
|
||||||
|
int PicoReset(void);
|
||||||
int PicoFrame(void);
|
int PicoFrame(void);
|
||||||
void PicoFrameDrawOnly(void);
|
void PicoFrameDrawOnly(void);
|
||||||
extern int PicoPad[2]; // Joypads, format is MXYZ SACB RLDU
|
extern int PicoPad[2]; // Joypads, format is MXYZ SACB RLDU
|
||||||
|
|
|
@ -425,7 +425,8 @@ PICO_INTERNAL int CheckDMA(void);
|
||||||
// cd/Pico.c
|
// cd/Pico.c
|
||||||
PICO_INTERNAL int PicoInitMCD(void);
|
PICO_INTERNAL int PicoInitMCD(void);
|
||||||
PICO_INTERNAL void PicoExitMCD(void);
|
PICO_INTERNAL void PicoExitMCD(void);
|
||||||
PICO_INTERNAL int PicoResetMCD(int hard);
|
PICO_INTERNAL void PicoPowerMCD(void);
|
||||||
|
PICO_INTERNAL int PicoResetMCD(void);
|
||||||
PICO_INTERNAL int PicoFrameMCD(void);
|
PICO_INTERNAL int PicoFrameMCD(void);
|
||||||
|
|
||||||
// Sek.c
|
// Sek.c
|
||||||
|
|
|
@ -48,16 +48,18 @@ PICO_INTERNAL void PicoExitMCD(void)
|
||||||
//dump_ram(Pico.ram, "ram.bin");
|
//dump_ram(Pico.ram, "ram.bin");
|
||||||
}
|
}
|
||||||
|
|
||||||
PICO_INTERNAL int PicoResetMCD(int hard)
|
PICO_INTERNAL void PicoPowerMCD(void)
|
||||||
|
{
|
||||||
|
int fmt_size = sizeof(formatted_bram);
|
||||||
|
memset(Pico_mcd->prg_ram, 0, sizeof(Pico_mcd->prg_ram));
|
||||||
|
memset(Pico_mcd->word_ram2M, 0, sizeof(Pico_mcd->word_ram2M));
|
||||||
|
memset(Pico_mcd->pcm_ram, 0, sizeof(Pico_mcd->pcm_ram));
|
||||||
|
memset(Pico_mcd->bram, 0, sizeof(Pico_mcd->bram));
|
||||||
|
memcpy(Pico_mcd->bram + sizeof(Pico_mcd->bram) - fmt_size, formatted_bram, fmt_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
PICO_INTERNAL int PicoResetMCD(void)
|
||||||
{
|
{
|
||||||
if (hard) {
|
|
||||||
int fmt_size = sizeof(formatted_bram);
|
|
||||||
memset(Pico_mcd->prg_ram, 0, sizeof(Pico_mcd->prg_ram));
|
|
||||||
memset(Pico_mcd->word_ram2M, 0, sizeof(Pico_mcd->word_ram2M));
|
|
||||||
memset(Pico_mcd->pcm_ram, 0, sizeof(Pico_mcd->pcm_ram));
|
|
||||||
memset(Pico_mcd->bram, 0, sizeof(Pico_mcd->bram));
|
|
||||||
memcpy(Pico_mcd->bram + sizeof(Pico_mcd->bram) - fmt_size, formatted_bram, fmt_size);
|
|
||||||
}
|
|
||||||
memset(Pico_mcd->s68k_regs, 0, sizeof(Pico_mcd->s68k_regs));
|
memset(Pico_mcd->s68k_regs, 0, sizeof(Pico_mcd->s68k_regs));
|
||||||
memset(&Pico_mcd->pcm, 0, sizeof(Pico_mcd->pcm));
|
memset(&Pico_mcd->pcm, 0, sizeof(Pico_mcd->pcm));
|
||||||
memset(&Pico_mcd->m, 0, sizeof(Pico_mcd->m));
|
memset(&Pico_mcd->m, 0, sizeof(Pico_mcd->m));
|
||||||
|
|
|
@ -434,7 +434,7 @@ int emu_ReloadRom(void)
|
||||||
} else {
|
} else {
|
||||||
PicoRegionOverride = 4;
|
PicoRegionOverride = 4;
|
||||||
}
|
}
|
||||||
PicoReset(0);
|
PicoReset();
|
||||||
// TODO: bits 6 & 5
|
// TODO: bits 6 & 5
|
||||||
}
|
}
|
||||||
movie_data[0x18+30] = 0;
|
movie_data[0x18+30] = 0;
|
||||||
|
|
|
@ -775,7 +775,7 @@ void emu_Loop(void)
|
||||||
|
|
||||||
void emu_ResetGame(void)
|
void emu_ResetGame(void)
|
||||||
{
|
{
|
||||||
PicoReset(0);
|
PicoReset();
|
||||||
reset_timing = 1;
|
reset_timing = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -977,7 +977,7 @@ void emu_Loop(void)
|
||||||
|
|
||||||
void emu_ResetGame(void)
|
void emu_ResetGame(void)
|
||||||
{
|
{
|
||||||
PicoReset(0);
|
PicoReset();
|
||||||
reset_timing = 1;
|
reset_timing = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1022,7 +1022,7 @@ void emu_Loop(void)
|
||||||
|
|
||||||
void emu_ResetGame(void)
|
void emu_ResetGame(void)
|
||||||
{
|
{
|
||||||
PicoReset(0);
|
PicoReset();
|
||||||
reset_timing = 1;
|
reset_timing = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ void CPicoServSession::DispatchMessageL(const RMessage &aMessage)
|
||||||
|
|
||||||
case PicoMsgReset:
|
case PicoMsgReset:
|
||||||
if(rom_data) {
|
if(rom_data) {
|
||||||
PicoReset(0);
|
PicoReset();
|
||||||
pico_was_reset = 1;
|
pico_was_reset = 1;
|
||||||
gamestate = PGS_Running;
|
gamestate = PGS_Running;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ TInt CPicoGameSession::Do(const TPicoServRqst what, TAny *param)
|
||||||
|
|
||||||
case PicoMsgReset:
|
case PicoMsgReset:
|
||||||
if(rom_data) {
|
if(rom_data) {
|
||||||
PicoReset(0);
|
PicoReset();
|
||||||
pico_was_reset = 1;
|
pico_was_reset = 1;
|
||||||
return ChangeRunState(PGS_Running);
|
return ChangeRunState(PGS_Running);
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ static int DeviceRead()
|
||||||
|
|
||||||
static int sblobked = 0;
|
static int sblobked = 0;
|
||||||
if (!sblobked && GetAsyncKeyState(VK_TAB)) {
|
if (!sblobked && GetAsyncKeyState(VK_TAB)) {
|
||||||
PicoReset(0);
|
PicoReset();
|
||||||
sblobked = 1;
|
sblobked = 1;
|
||||||
}
|
}
|
||||||
else if (!sblobked && GetAsyncKeyState(VK_ESCAPE))
|
else if (!sblobked && GetAsyncKeyState(VK_ESCAPE))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue