X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fpico.c;h=c63360c647f89b0de2df34972843d182edd37515;hb=04092e329bbd050073d42defcd609550d8545e74;hp=f900dfee3072e9cefce8b64bcbc333611f647a9b;hpb=3e49ffd0bf13f3a889cfb5196c2a61962dff6d0b;p=picodrive.git diff --git a/pico/pico.c b/pico/pico.c index f900dfe..c63360c 100644 --- a/pico/pico.c +++ b/pico/pico.c @@ -10,17 +10,18 @@ #include "pico_int.h" #include "sound/ym2612.h" -int PicoVer=0x0133; struct Pico Pico; -int PicoOpt = 0; -int PicoSkipFrame = 0; // skip rendering frame? -int emustatus = 0; // rapid_ym2612, multi_ym_updates +int PicoOpt; +int PicoSkipFrame; // skip rendering frame? int PicoPad[2]; // Joypads, format is MXYZ SACB RLDU int PicoPadInt[2]; // internal copy -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; -struct PicoSRAM SRam = {0,}; +int PicoAHW; // active addon hardware: PAHW_* +int PicoRegionOverride; // override the region detection 0: Auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe +int PicoAutoRgnOrder; + +struct PicoSRAM SRam; +int emustatus; // rapid_ym2612, multi_ym_updates +int scanlines_total; void (*PicoWriteSound)(int len) = NULL; // called at the best time to send sound buffer (PsndOut) to hardware void (*PicoResetHook)(void) = NULL; @@ -40,8 +41,7 @@ void PicoInit(void) PicoInitMCD(); PicoSVPInit(); - - SRam.data=0; + Pico32xInit(); } // to be called once on emu exit @@ -52,17 +52,16 @@ void PicoExit(void) PicoCartUnload(); z80_exit(); - if (SRam.data) free(SRam.data); SRam.data=0; + if (SRam.data) + free(SRam.data); } void PicoPower(void) { - unsigned char sram_reg=Pico.m.sram_reg; // must be preserved - Pico.m.frame_count = 0; // clear all memory of the emulated machine - memset(&Pico.ram,0,(unsigned int)&Pico.rom-(unsigned int)&Pico.ram); + memset(&Pico.ram,0,(unsigned char *)&Pico.rom - Pico.ram); memset(&Pico.video,0,sizeof(Pico.video)); memset(&Pico.m,0,sizeof(Pico.m)); @@ -78,7 +77,9 @@ void PicoPower(void) if (PicoAHW & PAHW_MCD) PicoPowerMCD(); - Pico.m.sram_reg=sram_reg; + if (PicoOpt & POPT_EN_32X) + PicoPower32x(); + PicoReset(); } @@ -94,14 +95,16 @@ PICO_INTERNAL void PicoDetectRegion(void) else { // Read cartridge region data: - int region=PicoRead32(0x1f0); + unsigned short *rd = (unsigned short *)(Pico.rom + 0x1f0); + int region = (rd[0] << 16) | rd[1]; - for (i=0;i<4;i++) + for (i = 0; i < 4; i++) { - int c=0; + int c; - c=region>>(i<<3); c&=0xff; - if (c<=' ') continue; + c = region >> (i<<3); + c &= 0xff; + if (c <= ' ') continue; if (c=='J') support|=1; else if (c=='U') support|=4; @@ -139,16 +142,22 @@ PICO_INTERNAL void PicoDetectRegion(void) int PicoReset(void) { - unsigned char sram_reg=Pico.m.sram_reg; // must be preserved - - if (Pico.romsize<=0) return 1; + if (Pico.romsize <= 0) + return 1; /* must call now, so that banking is reset, and correct vectors get fetched */ - if (PicoResetHook) PicoResetHook(); + if (PicoResetHook) + PicoResetHook(); - PicoMemReset(); - SekReset(); memset(&PicoPadInt,0,sizeof(PicoPadInt)); + emustatus = 0; + + if (PicoAHW & PAHW_SMS) { + PicoResetMS(); + return 0; + } + + SekReset(); // s68k doesn't have the TAS quirk, so we just globally set normal TAS handler in MCD mode (used by Batman games). SekSetRealTAS(PicoAHW & PAHW_MCD); SekCycleCntT=0; @@ -156,11 +165,11 @@ int PicoReset(void) 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; Pico.m.dirtyPal = 1; Pico.m.z80_bank68k = 0; + Pico.m.z80_reset = 1; memset(Pico.zram, 0, sizeof(Pico.zram)); // ?? PicoDetectRegion(); @@ -169,7 +178,7 @@ 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&POPT_DIS_VDP_FIFO)) + if (Pico.m.dma_xfers == 0 && !(PicoOpt & POPT_DIS_VDP_FIFO)) Pico.m.dma_xfers = rand() & 0x1fff; SekFinishIdleDet(); @@ -183,16 +192,37 @@ int PicoReset(void) if (!(PicoOpt & POPT_DIS_IDLE_DET)) SekInitIdleDet(); + if (PicoOpt & POPT_EN_32X) { + PicoReset32x(); + return 0; + } + // reset sram state; enable sram access by default if it doesn't overlap with ROM - Pico.m.sram_reg=sram_reg&0x14; - if (!(Pico.m.sram_reg&4) && Pico.romsize <= SRam.start) Pico.m.sram_reg |= 1; + Pico.m.sram_reg = 0; + if ((SRam.flags & SRF_EEPROM) || Pico.romsize <= SRam.start) + Pico.m.sram_reg |= SRR_MAPPED; - elprintf(EL_STATUS, "sram: det: %i; eeprom: %i; start: %06x; end: %06x", - (Pico.m.sram_reg>>4)&1, (Pico.m.sram_reg>>2)&1, SRam.start, SRam.end); + if (SRam.flags & SRF_ENABLED) + elprintf(EL_STATUS, "sram: %06x - %06x; eeprom: %i", SRam.start, SRam.end, + !!(SRam.flags & SRF_EEPROM)); return 0; } +// flush cinfig changes before emu loop starts +void PicoLoopPrepare(void) +{ + if (PicoRegionOverride) + // force setting possibly changed.. + Pico.m.pal = (PicoRegionOverride == 2 || PicoRegionOverride == 8) ? 1 : 0; + + // FIXME: PAL has 313 scanlines.. + scanlines_total = Pico.m.pal ? 312 : 262; + + if (PicoAHW & PAHW_32X) + p32x_timers_recalc(); +} + // dma2vram settings are just hacks to unglitch Legend of Galahad (needs <= 104 to work) // same for Outrunners (92-121, when active is set to 24) @@ -242,6 +272,8 @@ PICO_INTERNAL int CheckDMA(void) static __inline void SekRunM68k(int cyc) { int cyc_do; + pprof_start(m68k); + SekCycleAim+=cyc; if ((cyc_do=SekCycleAim-SekCycleCnt) <= 0) return; #if defined(EMU_CORE_DEBUG) @@ -256,6 +288,8 @@ static __inline void SekRunM68k(int cyc) #elif defined(EMU_F68K) SekCycleCnt+=fm68k_emulate(cyc_do+1, 0, 0); #endif + + pprof_end(m68k); } #include "pico_cmn.c" @@ -273,39 +307,57 @@ PICO_INTERNAL void PicoSyncZ80(int m68k_cycles_done) z80_cycle_aim = cycles_68k_to_z80(m68k_cycles_done); cnt = z80_cycle_aim - z80_cycle_cnt; + pprof_start(z80); + elprintf(EL_BUSREQ, "z80 sync %i (%i|%i -> %i|%i)", cnt, z80_cycle_cnt, z80_cycle_cnt / 228, z80_cycle_aim, z80_cycle_aim / 228); if (cnt > 0) z80_cycle_cnt += z80_run(cnt); + + pprof_end(z80); } void PicoFrame(void) { + pprof_start(frame); + Pico.m.frame_count++; + if (PicoAHW & PAHW_SMS) { + PicoFrameMS(); + goto end; + } + + // TODO: MCD+32X if (PicoAHW & PAHW_MCD) { PicoFrameMCD(); - return; + goto end; } - else if (PicoAHW & PAHW_SMS) { - PicoFrameMS(); - return; + + if (PicoAHW & PAHW_32X) { + PicoFrame32x(); + goto end; } //if(Pico.video.reg[12]&0x2) Pico.video.status ^= 0x10; // change odd bit in interlace mode - if (!(PicoOpt&POPT_ALT_RENDERER)) - PicoFrameStart(); - + PicoFrameStart(); PicoFrameHints(); + +end: + pprof_end(frame); } void PicoFrameDrawOnly(void) { - PicoFrameStart(); - PicoDrawSync(223, 0); + if (!(PicoAHW & PAHW_SMS)) { + PicoFrameStart(); + PicoDrawSync(223, 0); + } else { + PicoFrameDrawOnlyMS(); + } } void PicoGetInternal(pint_t which, pint_ret_t *r)