X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fpico.c;h=302cc699215a78278e67a3902e3d3e097e34c515;hb=3cf9570bacd8952713106a2a2e3176852d811d18;hp=c919507ea296d24f19c7450b36aff1f108743bfe;hpb=87b0845f3733166b491ae236feb8bc2eb0fca2ec;p=picodrive.git diff --git a/pico/pico.c b/pico/pico.c index c919507..302cc69 100644 --- a/pico/pico.c +++ b/pico/pico.c @@ -40,8 +40,7 @@ void PicoInit(void) PicoInitMCD(); PicoSVPInit(); - - SRam.data=0; + Pico32xInit(); } // to be called once on emu exit @@ -52,13 +51,12 @@ 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 @@ -78,7 +76,9 @@ void PicoPower(void) if (PicoAHW & PAHW_MCD) PicoPowerMCD(); - Pico.m.sram_reg=sram_reg; + if (!(PicoOpt & POPT_DIS_32X)) + PicoPower32x(); + PicoReset(); } @@ -94,14 +94,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,8 +141,6 @@ 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; @@ -148,7 +148,6 @@ int PicoReset(void) if (PicoResetHook) PicoResetHook(); - PicoMemReset(); memset(&PicoPadInt,0,sizeof(PicoPadInt)); emustatus = 0; @@ -169,6 +168,7 @@ int PicoReset(void) Pico.m.dirtyPal = 1; Pico.m.z80_bank68k = 0; + Pico.m.z80_reset = 1; memset(Pico.zram, 0, sizeof(Pico.zram)); // ?? PicoDetectRegion(); @@ -191,12 +191,19 @@ int PicoReset(void) if (!(PicoOpt & POPT_DIS_IDLE_DET)) SekInitIdleDet(); + if (!(PicoOpt & POPT_DIS_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; } @@ -293,20 +300,25 @@ void PicoFrame(void) { Pico.m.frame_count++; + if (PicoAHW & PAHW_SMS) { + PicoFrameMS(); + return; + } + + // TODO: MCD+32X if (PicoAHW & PAHW_MCD) { PicoFrameMCD(); return; } - else if (PicoAHW & PAHW_SMS) { - PicoFrameMS(); + + if (PicoAHW & PAHW_32X) { + PicoFrame32x(); return; } //if(Pico.video.reg[12]&0x2) Pico.video.status ^= 0x10; // change odd bit in interlace mode - if (!(PicoOpt&POPT_ALT_RENDERER)) - PicoFrameStart(); - + PicoFrameStart(); PicoFrameHints(); }