X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2FPico.c;h=4e34e511f124f4652f5dc403791fc0d7e690159f;hb=c0fcf293c1833e8586b4147e12ea45d535da4985;hp=7978fedec1e2a3e4fb2831ed0ff0b0960e71f3e6;hpb=1cb1584b86a5679b8d32ccfc190f6e76c920810f;p=picodrive.git diff --git a/Pico/Pico.c b/Pico/Pico.c index 7978fed..4e34e51 100644 --- a/Pico/Pico.c +++ b/Pico/Pico.c @@ -12,20 +12,20 @@ int PicoVer=0x0133; struct Pico Pico; -int PicoOpt=0; // disable everything by default -int PicoSkipFrame=0; // skip rendering frame? +int PicoOpt = 0; +int PicoSkipFrame = 0; // skip rendering frame? +int emustatus = 0; // rapid_ym2612, multi_ym_updates +int PicoPad[2]; // Joypads, format is SACB RLDU +int PicoAHW = 0; // active addon hardware: scd_active, 32x_active, svp_active, pico_active int PicoRegionOverride = 0; // override the region detection 0: Auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe int PicoAutoRgnOrder = 0; -int emustatus = 0; // rapid_ym2612, multi_ym_updates +int z80startCycle, z80stopCycle; // in 68k cycles +struct PicoSRAM SRam = {0,}; + void (*PicoWriteSound)(int len) = NULL; // called at the best time to send sound buffer (PsndOut) to hardware void (*PicoResetHook)(void) = NULL; void (*PicoLineHook)(int count) = NULL; -struct PicoSRAM SRam = {0,}; -int z80startCycle, z80stopCycle; // in 68k cycles -int PicoPad[2]; // Joypads, format is SACB RLDU -int PicoMCD = 0; // mega CD status: scd_started - // to be called once on emu init int PicoInit(void) { @@ -48,7 +48,7 @@ int PicoInit(void) // to be called once on emu exit void PicoExit(void) { - if (PicoMCD&1) + if (PicoAHW & PAHW_MCD) PicoExitMCD(); z80_exit(); @@ -57,6 +57,8 @@ void PicoExit(void) void PicoPower(void) { + unsigned char sram_reg=Pico.m.sram_reg; // must be preserved + // clear all memory of the emulated machine memset(&Pico.ram,0,(unsigned int)&Pico.rom-(unsigned int)&Pico.ram); @@ -71,9 +73,10 @@ void PicoPower(void) Pico.video.reg[0xc] = 0x81; Pico.video.reg[0xf] = 0x02; - if (PicoMCD & 1) + if (PicoAHW & PAHW_MCD) PicoPowerMCD(); + Pico.m.sram_reg=sram_reg; PicoReset(); } @@ -92,10 +95,10 @@ int PicoReset(void) PicoMemReset(); SekReset(); // 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(PicoAHW & PAHW_MCD); SekCycleCntT=0; - if (PicoMCD & 1) + if (PicoAHW & PAHW_MCD) // needed for MCD to reset properly, probably some bug hides behind this.. memset(Pico.ioports,0,sizeof(Pico.ioports)); emustatus = 0; @@ -155,10 +158,10 @@ int PicoReset(void) 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)) + if (Pico.m.dma_xfers == 0 && !(PicoOpt&POPT_DIS_VDP_FIFO)) Pico.m.dma_xfers = rand() & 0x1fff; - if (PicoMCD & 1) { + if (PicoAHW & PAHW_MCD) { PicoResetMCD(); return 0; } @@ -306,7 +309,7 @@ static void PicoRunZ80Simple(int line_from, int line_to) int line_from_r=line_from, line_to_r=line_to, line=0; int line_sample = Pico.m.pal ? 68 : 93; - if (!(PicoOpt&4) || Pico.m.z80Run == 0) line_to_r = 0; + if (!(PicoOpt&POPT_EN_Z80) || Pico.m.z80Run == 0) line_to_r = 0; else { extern const unsigned short vcounts[]; if (z80startCycle) { @@ -317,7 +320,7 @@ static void PicoRunZ80Simple(int line_from, int line_to) z80startCycle = SekCyclesDone(); } - if (PicoOpt&1) { + if (PicoOpt&POPT_EN_FM) { // we have ym2612 enabled, so we have to run Z80 in lines, so we could update DAC and timers for (line = line_from; line < line_to; line++) { Psnd_timers_and_dac(line); @@ -358,7 +361,7 @@ static int PicoFrameSimple(void) } // a hack for VR, to get it running in fast mode - if (PicoRead16Hook == PicoSVPRead16) + if (PicoAHW & PAHW_SVP) Pico.ram[0xd864^1] = 0x1a; // we don't emulate DMA timing in this mode @@ -409,7 +412,7 @@ static int PicoFrameSimple(void) } // another hack for VR (it needs hints to work) - if (PicoRead16Hook == PicoSVPRead16) { + if (PicoAHW & PAHW_SVP) { Pico.ram[0xd864^1] = 1; pv->pending_ints|=0x10; if (pv->reg[0]&0x10) SekInterrupt(4); @@ -419,7 +422,7 @@ static int PicoFrameSimple(void) // render screen if (!PicoSkipFrame) { - if (!(PicoOpt&0x10)) + if (!(PicoOpt&POPT_ALT_RENDERER)) { // Draw the screen #if CAN_HANDLE_240_LINES @@ -439,7 +442,7 @@ static int PicoFrameSimple(void) } // here we render sound if ym2612 is disabled - if (!(PicoOpt&1) && PsndOut) { + if (!(PicoOpt&POPT_EN_FM) && PsndOut) { int len = PsndRender(0, PsndLen); if (PicoWriteSound) PicoWriteSound(len); // clear sound buffer @@ -470,10 +473,11 @@ static int PicoFrameSimple(void) } if (pv->reg[1]&0x20) SekInterrupt(6); // Set IRQ - if (Pico.m.z80Run && (PicoOpt&4)) + if (Pico.m.z80Run && (PicoOpt&POPT_EN_Z80)) z80_int(); - while (sects) { + while (sects) + { lines += lines_step; SekRunM68k(cycles_68k_vblock); @@ -502,23 +506,23 @@ int PicoFrame(void) Pico.m.frame_count++; - if (PicoMCD & 1) { + if (PicoAHW & PAHW_MCD) { PicoFrameMCD(); return 0; } // be accurate if we are asked for this - if(PicoOpt&0x40) acc=1; + if (PicoOpt&POPT_ACC_TIMING) acc=1; // don't be accurate in alternative render mode, as hint effects will not be rendered anyway - else if(PicoOpt&0x10) acc = 0; + else if (PicoOpt&POPT_ALT_RENDERER) acc = 0; else acc=Pico.video.reg[0]&0x10; // be accurate if hints are used //if(Pico.video.reg[12]&0x2) Pico.video.status ^= 0x10; // change odd bit in interlace mode - if(!(PicoOpt&0x10)) + if (!(PicoOpt&POPT_ALT_RENDERER)) PicoFrameStart(); - if(acc) + if (acc) PicoFrameHints(); else PicoFrameSimple();