X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2FPico.c;h=a0f288084e922cd91b89d50857178afa55f355ca;hb=55ca4154a2e8aa3687c4f73f2c4c4d5fcdc5a836;hp=00be7b67570640ae6ddd86d9e229135159ead2f3;hpb=c008977e8ec74b68cbccc017620a156cc39b79b2;p=picodrive.git diff --git a/Pico/cd/Pico.c b/Pico/cd/Pico.c index 00be7b6..a0f2880 100644 --- a/Pico/cd/Pico.c +++ b/Pico/cd/Pico.c @@ -1,10 +1,4 @@ -// 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" @@ -14,6 +8,8 @@ extern unsigned char formatted_bram[4*0x10]; extern unsigned int s68k_poll_adclk; +void (*PicoMCDopenTray)(void) = NULL; +int (*PicoMCDcloseTray)(void) = NULL; #define dump_ram(ram,fname) \ { \ @@ -79,6 +75,12 @@ 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; } @@ -214,13 +216,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 + } } } @@ -331,8 +335,15 @@ static int PicoFrameHintsMCD(void) } if ((PicoOpt&4) && Pico.m.z80Run) { - Pico.m.z80Run|=2; - z80CycleAim+=cycles_z80; + if (Pico.m.z80Run & 2) z80CycleAim+=cycles_z80; + else { + int cnt = SekCyclesDone() - z80startCycle; + cnt = (cnt>>1)-(cnt>>5); + //if (cnt > cycles_z80) printf("FIXME: z80 cycles: %i\n", cnt); + if (cnt > cycles_z80) cnt = cycles_z80; + Pico.m.z80Run |= 2; + z80CycleAim+=cnt; + } total_z80+=z80_run(z80CycleAim-total_z80); }