X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=Pico%2Fcd%2FPico.c;h=5dcb39ca39cf564561e3e75037f25b0d166e104b;hb=e5503e2f4fe1c7ccc46c493a1596fb0e416f678e;hp=d29469be41e8d9ae46c22b6acf04cc6d52665d20;hpb=721cd3963fa4ba82ca218345e8f543703dc46c90;p=picodrive.git diff --git a/Pico/cd/Pico.c b/Pico/cd/Pico.c index d29469b..5dcb39c 100644 --- a/Pico/cd/Pico.c +++ b/Pico/cd/Pico.c @@ -1,14 +1,7 @@ -// This is part of Pico Library - -// (c) Copyright 2004 Dave, All rights reserved. // (c) Copyright 2007 notaz, All rights reserved. -// Free for non-commercial use. - -// For commercial use, separate licencing terms must be obtained. #include "../PicoInt.h" -#include "../sound/sound.h" extern unsigned char formatted_bram[4*0x10]; @@ -38,7 +31,7 @@ int (*PicoMCDcloseTray)(void) = NULL; } -int PicoInitMCD(void) +PICO_INTERNAL int PicoInitMCD(void) { SekInitS68k(); Init_CD_Driver(); @@ -47,7 +40,7 @@ int PicoInitMCD(void) } -void PicoExitMCD(void) +PICO_INTERNAL void PicoExitMCD(void) { End_CD_Driver(); @@ -55,7 +48,7 @@ void PicoExitMCD(void) //dump_ram(Pico.ram, "ram.bin"); } -int PicoResetMCD(int hard) +PICO_INTERNAL int PicoResetMCD(int hard) { if (hard) { int fmt_size = sizeof(formatted_bram); @@ -81,10 +74,16 @@ int PicoResetMCD(int hard) //PicoMemResetCDdecode(1); // don't have to call this in 2M mode #endif + // use SRam.data for RAM cart + if (SRam.data) free(SRam.data); + SRam.data = NULL; + if (PicoOpt&0x8000) + SRam.data = calloc(1, 0x12000); + return 0; } -static __inline void SekRun(int cyc) +static __inline void SekRunM68k(int cyc) { int cyc_do; SekCycleAim+=cyc; @@ -216,13 +215,15 @@ static __inline void update_chips(void) // delayed setting of DMNA bit (needed for Silpheed) if (Pico_mcd->m.state_flags & 2) { Pico_mcd->m.state_flags &= ~2; - Pico_mcd->s68k_regs[3] |= 2; - Pico_mcd->s68k_regs[3] &= ~1; + if (!(Pico_mcd->s68k_regs[3] & 4)) { + Pico_mcd->s68k_regs[3] |= 2; + Pico_mcd->s68k_regs[3] &= ~1; #ifdef USE_POLL_DETECT - if ((s68k_poll_adclk&0xfe) == 2) { - SekSetStopS68k(0); s68k_poll_adclk = 0; - } + if ((s68k_poll_adclk&0xfe) == 2) { + SekSetStopS68k(0); s68k_poll_adclk = 0; + } #endif + } } } @@ -289,7 +290,7 @@ static int PicoFrameHintsMCD(void) { //dprintf("vint: @ %06x [%i|%i]", SekPc, y, SekCycleCnt); pv->status|=0x88; // V-Int happened, go into vblank - SekRun(128); SekCycleAim-=128; // there must be a gap between H and V ints, also after vblank bit set (Mazin Saga, Bram Stoker's Dracula) + SekRunM68k(128); SekCycleAim-=128; // there must be a gap between H and V ints, also after vblank bit set (Mazin Saga, Bram Stoker's Dracula) /*if(Pico.m.z80Run && (PicoOpt&4)) { z80CycleAim+=cycles_z80/2; total_z80+=z80_run(z80CycleAim-total_z80); @@ -327,7 +328,7 @@ static int PicoFrameHintsMCD(void) if ((PicoOpt & 0x2000) && (Pico_mcd->m.busreq&3) == 1) { SekRunPS(cycles_68k, cycles_s68k); // "better/perfect sync" } else { - SekRun(cycles_68k); + SekRunM68k(cycles_68k); if ((Pico_mcd->m.busreq&3) == 1) // no busreq/no reset SekRunS68k(cycles_s68k); } @@ -356,7 +357,7 @@ static int PicoFrameHintsMCD(void) } -int PicoFrameMCD(void) +PICO_INTERNAL int PicoFrameMCD(void) { if(!(PicoOpt&0x10)) PicoFrameStart();