Finish migrating to new mem handling. Make carthw db external.
[picodrive.git] / pico / pico.c
index 08ba510..f2da10b 100644 (file)
@@ -40,8 +40,6 @@ void PicoInit(void)
 \r
   PicoInitMCD();\r
   PicoSVPInit();\r
-\r
-  SRam.data=0;\r
 }\r
 \r
 // to be called once on emu exit\r
@@ -52,13 +50,12 @@ void PicoExit(void)
   PicoCartUnload();\r
   z80_exit();\r
 \r
-  if (SRam.data) free(SRam.data); SRam.data=0;\r
+  if (SRam.data)\r
+    free(SRam.data);\r
 }\r
 \r
 void PicoPower(void)\r
 {\r
-  unsigned char sram_reg=Pico.m.sram_reg; // must be preserved\r
-\r
   Pico.m.frame_count = 0;\r
 \r
   // clear all memory of the emulated machine\r
@@ -78,7 +75,6 @@ void PicoPower(void)
   if (PicoAHW & PAHW_MCD)\r
     PicoPowerMCD();\r
 \r
-  Pico.m.sram_reg=sram_reg;\r
   PicoReset();\r
 }\r
 \r
@@ -94,14 +90,16 @@ PICO_INTERNAL void PicoDetectRegion(void)
   else\r
   {\r
     // Read cartridge region data:\r
-    int region=PicoRead32(0x1f0);\r
+    unsigned short *rd = (unsigned short *)(Pico.rom + 0x1f0);\r
+    int region = (rd[0] << 16) | rd[1];\r
 \r
-    for (i=0;i<4;i++)\r
+    for (i = 0; i < 4; i++)\r
     {\r
-      int c=0;\r
+      int c;\r
 \r
-      c=region>>(i<<3); c&=0xff;\r
-      if (c<=' ') continue;\r
+      c = region >> (i<<3);\r
+      c &= 0xff;\r
+      if (c <= ' ') continue;\r
 \r
            if (c=='J')  support|=1;\r
       else if (c=='U')  support|=4;\r
@@ -139,16 +137,22 @@ PICO_INTERNAL void PicoDetectRegion(void)
 \r
 int PicoReset(void)\r
 {\r
-  unsigned char sram_reg=Pico.m.sram_reg; // must be preserved\r
-\r
-  if (Pico.romsize<=0) return 1;\r
+  if (Pico.romsize <= 0)\r
+    return 1;\r
 \r
   /* must call now, so that banking is reset, and correct vectors get fetched */\r
-  if (PicoResetHook) PicoResetHook();\r
+  if (PicoResetHook)\r
+    PicoResetHook();\r
 \r
-  PicoMemReset();\r
-  SekReset();\r
   memset(&PicoPadInt,0,sizeof(PicoPadInt));\r
+  emustatus = 0;\r
+\r
+  if (PicoAHW & PAHW_SMS) {\r
+    PicoResetMS();\r
+    return 0;\r
+  }\r
+\r
+  SekReset();\r
   // s68k doesn't have the TAS quirk, so we just globally set normal TAS handler in MCD mode (used by Batman games).\r
   SekSetRealTAS(PicoAHW & PAHW_MCD);\r
   SekCycleCntT=0;\r
@@ -156,11 +160,11 @@ int PicoReset(void)
   if (PicoAHW & PAHW_MCD)\r
     // needed for MCD to reset properly, probably some bug hides behind this..\r
     memset(Pico.ioports,0,sizeof(Pico.ioports));\r
-  emustatus = 0;\r
 \r
   Pico.m.dirtyPal = 1;\r
 \r
   Pico.m.z80_bank68k = 0;\r
+  Pico.m.z80_reset = 1;\r
   memset(Pico.zram, 0, sizeof(Pico.zram)); // ??\r
 \r
   PicoDetectRegion();\r
@@ -169,7 +173,7 @@ int PicoReset(void)
   PsndReset(); // pal must be known here\r
 \r
   // create an empty "dma" to cause 68k exec start at random frame location\r
-  if (Pico.m.dma_xfers == 0 && !(PicoOpt&POPT_DIS_VDP_FIFO))\r
+  if (Pico.m.dma_xfers == 0 && !(PicoOpt & POPT_DIS_VDP_FIFO))\r
     Pico.m.dma_xfers = rand() & 0x1fff;\r
 \r
   SekFinishIdleDet();\r
@@ -184,11 +188,13 @@ int PicoReset(void)
     SekInitIdleDet();\r
 \r
   // reset sram state; enable sram access by default if it doesn't overlap with ROM\r
-  Pico.m.sram_reg=sram_reg&0x14;\r
-  if (!(Pico.m.sram_reg&4) && Pico.romsize <= SRam.start) Pico.m.sram_reg |= 1;\r
+  Pico.m.sram_reg = 0;\r
+  if ((SRam.flags & SRF_EEPROM) || Pico.romsize <= SRam.start)\r
+    Pico.m.sram_reg |= SRR_MAPPED;\r
 \r
-  elprintf(EL_STATUS, "sram: det: %i; eeprom: %i; start: %06x; end: %06x",\r
-    (Pico.m.sram_reg>>4)&1, (Pico.m.sram_reg>>2)&1, SRam.start, SRam.end);\r
+  if (SRam.flags & SRF_ENABLED)\r
+    elprintf(EL_STATUS, "sram: %06x - %06x; eeprom: %i", SRam.start, SRam.end,\r
+      !!(SRam.flags & SRF_EEPROM));\r
 \r
   return 0;\r
 }\r
@@ -258,35 +264,6 @@ static __inline void SekRunM68k(int cyc)
 #endif\r
 }\r
 \r
-\r
-// to be called on 224 or line_sample scanlines only\r
-static __inline void getSamples(int y)\r
-{\r
-#if SIMPLE_WRITE_SOUND\r
-  if (y != 224) return;\r
-  PsndRender(0, PsndLen);\r
-  if (PicoWriteSound) PicoWriteSound(PsndLen);\r
-  PsndClear();\r
-#else\r
-  static int curr_pos = 0;\r
-\r
-  if(y == 224) {\r
-    if(emustatus & 2)\r
-         curr_pos += PsndRender(curr_pos, PsndLen-PsndLen/2);\r
-    else curr_pos  = PsndRender(0, PsndLen);\r
-    if (emustatus&1) emustatus|=2; else emustatus&=~2;\r
-    if (PicoWriteSound) PicoWriteSound(curr_pos);\r
-    // clear sound buffer\r
-    PsndClear();\r
-  }\r
-  else if(emustatus & 3) {\r
-    emustatus|= 2;\r
-    emustatus&=~1;\r
-    curr_pos = PsndRender(0, PsndLen/2);\r
-  }\r
-#endif\r
-}\r
-\r
 #include "pico_cmn.c"\r
 \r
 int z80stopCycle;\r
@@ -314,6 +291,11 @@ void PicoFrame(void)
 {\r
   Pico.m.frame_count++;\r
 \r
+  if (PicoAHW & PAHW_SMS) {\r
+    PicoFrameMS();\r
+    return;\r
+  }\r
+\r
   if (PicoAHW & PAHW_MCD) {\r
     PicoFrameMCD();\r
     return;\r
@@ -321,16 +303,18 @@ void PicoFrame(void)
 \r
   //if(Pico.video.reg[12]&0x2) Pico.video.status ^= 0x10; // change odd bit in interlace mode\r
 \r
-  if (!(PicoOpt&POPT_ALT_RENDERER))\r
-    PicoFrameStart();\r
-\r
+  PicoFrameStart();\r
   PicoFrameHints();\r
 }\r
 \r
 void PicoFrameDrawOnly(void)\r
 {\r
-  PicoFrameStart();\r
-  PicoDrawSync(223, 0);\r
+  if (!(PicoAHW & PAHW_SMS)) {\r
+    PicoFrameStart();\r
+    PicoDrawSync(223, 0);\r
+  } else {\r
+    PicoFrameDrawOnlyMS();\r
+  }\r
 }\r
 \r
 void PicoGetInternal(pint_t which, pint_ret_t *r)\r