X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2FPico.c;h=8b4c9e59abb284d3f8404f4b87479011fd1a35ec;hb=51a902ae2512cffdb3ac7751988c1bde4a641be4;hp=9e87e9ed91a899638a81d8fd228ed9e3e2cc264b;hpb=d1df87866b45a5ab9f1b6c6c8a40da6a3a777f83;p=picodrive.git diff --git a/Pico/cd/Pico.c b/Pico/cd/Pico.c index 9e87e9ed..8b4c9e59 100644 --- a/Pico/cd/Pico.c +++ b/Pico/cd/Pico.c @@ -11,7 +11,7 @@ #include "../sound/sound.h" -static int counter75hz = 0; // TODO: move 2 context +extern unsigned char formatted_bram[8*0x10]; int PicoInitMCD(void) @@ -30,15 +30,22 @@ void PicoExitMCD(void) int PicoResetMCD(int hard) { - // clear everything except BIOS - memset(Pico_mcd->prg_ram, 0, sizeof(mcd_state) - sizeof(Pico_mcd->bios)); + memset(Pico_mcd->prg_ram, 0, sizeof(Pico_mcd->prg_ram)); + memset(Pico_mcd->word_ram, 0, sizeof(Pico_mcd->word_ram)); + if (hard) { + memset(Pico_mcd->bram, 0, sizeof(Pico_mcd->bram)); + memcpy(Pico_mcd->bram + sizeof(Pico_mcd->bram) - 8*0x10, formatted_bram, 8*0x10); + } + memset(Pico_mcd->s68k_regs, 0, sizeof(Pico_mcd->s68k_regs)); + *(unsigned int *)(Pico_mcd->bios + 0x70) = 0xffffffff; // reset hint vector (simplest way to implement reg6) - PicoMCD |= 2; // s68k reset pending + Pico_mcd->m.state_flags |= 2; // s68k reset pending Pico_mcd->s68k_regs[3] = 1; // 2M word RAM mode with m68k access after reset - counter75hz = 0; + Pico_mcd->m.counter75hz = 0; LC89510_Reset(); Reset_CD(); + gfx_cd_reset(); return 0; } @@ -48,7 +55,11 @@ static __inline void SekRun(int cyc) int cyc_do; SekCycleAim+=cyc; if((cyc_do=SekCycleAim-SekCycleCnt) < 0) return; -#if defined(EMU_M68K) +#if defined(EMU_C68K) + PicoCpu.cycles=cyc_do; + CycloneRun(&PicoCpu); + SekCycleCnt+=cyc_do-PicoCpu.cycles; +#elif defined(EMU_M68K) m68k_set_context(&PicoM68kCPU); SekCycleCnt+=m68k_execute(cyc_do); #endif @@ -59,7 +70,11 @@ static __inline void SekRunS68k(int cyc) int cyc_do; SekCycleAimS68k+=cyc; if((cyc_do=SekCycleAimS68k-SekCycleCntS68k) < 0) return; -#if defined(EMU_M68K) +#if defined(EMU_C68K) + PicoCpuS68k.cycles=cyc_do; + CycloneRun(&PicoCpuS68k); + SekCycleCntS68k+=cyc_do-PicoCpuS68k.cycles; +#elif defined(EMU_M68K) m68k_set_context(&PicoS68kCPU); SekCycleCntS68k+=m68k_execute(cyc_do); #endif @@ -82,6 +97,27 @@ static __inline void check_cd_dma(void) Update_CDC_TRansfer(ddx); // now go and do the actual transfer } +// to be called on 224 or line_sample scanlines only +static __inline void getSamples(int y) +{ + if(y == 224) { + //dprintf("sta%i: %i [%i]", (emustatus & 2), emustatus, y); + if(emustatus & 2) + sound_render(PsndLen/2, PsndLen-PsndLen/2); + else sound_render(0, PsndLen); + if (emustatus&1) emustatus|=2; else emustatus&=~2; + if (PicoWriteSound) PicoWriteSound(); + // clear sound buffer + memset(PsndOut, 0, (PicoOpt & 8) ? (PsndLen<<2) : (PsndLen<<1)); + } + else if(emustatus & 3) { + emustatus|= 2; + emustatus&=~1; + sound_render(0, PsndLen/2); + } +} + + // Accurate but slower frame which does hints static int PicoFrameHintsMCD(void) @@ -176,7 +212,7 @@ static int PicoFrameHintsMCD(void) if(y == 32 && PsndOut) emustatus &= ~1; else if((y == 224 || y == line_sample) && PsndOut) - ;//getSamples(y); + getSamples(y); // Run scanline: //dprintf("m68k starting exec @ %06x", SekPc); @@ -206,8 +242,8 @@ static int PicoFrameHintsMCD(void) total_z80+=z80_run(z80CycleAim-total_z80); } - if ((counter75hz+=10) >= counter75hz_lim) { - counter75hz -= counter75hz_lim; + if ((Pico_mcd->m.counter75hz+=10) >= counter75hz_lim) { + Pico_mcd->m.counter75hz -= counter75hz_lim; Check_CD_Command(); }