sms, minor fixes (vdp mode switch, zram init)
authorkub <derkub@gmail.com>
Sun, 24 Oct 2021 20:51:16 +0000 (22:51 +0200)
committerkub <derkub@gmail.com>
Sun, 24 Oct 2021 20:51:16 +0000 (22:51 +0200)
pico/mode4.c
pico/sms.c

index c0327f9..9ae8b71 100644 (file)
@@ -18,7 +18,7 @@
 static void (*FinalizeLineSMS)(int line);
 static int skip_next_line;
 static int screen_offset, line_offset;
-
+static u8 mode;
 
 /* sprite collision detection */
 static int CollisionDetect(u8 *mb, u16 sx, unsigned int pack, int zoomed)
@@ -558,6 +558,12 @@ void PicoFrameStartSMS(void)
   loffs = screen_offset = 24; // 192 lines is really 224 with top/bottom bars
   Pico.est.rendstatus = PDRAW_32_COLS;
 
+  // if mode changes make palette dirty since some modes switch to a fixed one
+  if (mode != ((Pico.video.reg[0]&0x06) | (Pico.video.reg[1]&0x18))) {
+    mode = (Pico.video.reg[0]&0x06) | (Pico.video.reg[1]&0x18);
+    Pico.m.dirtyPal = 1;
+  }
+
   // Copy LCD enable flag for easier handling
   Pico.m.hardware &= ~0x2;
   if (PicoIn.opt & POPT_EN_GG_LCD)
@@ -569,7 +575,7 @@ void PicoFrameStartSMS(void)
     loffs = 48;
     lines = 144;
     columns = 160;
-  } else switch ((Pico.video.reg[0]&0x06) | (Pico.video.reg[1]&0x18)) {
+  } else switch (mode) {
   // SMS2 only 224/240 line modes, e.g. Micro Machines
   case 0x06|0x08:
       loffs = screen_offset = 0;
@@ -717,6 +723,7 @@ void PicoDrawSetOutputSMS(pdso_t which)
                      PicoDrawSetInternalBuf(Pico.est.Draw2FB, 328); break;
   }
   rendstatus_old = -1;
+  mode = -1;
 }
 
 // vim:shiftwidth=2:ts=2:expandtab
index 7e5233e..9f70a40 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * SMS emulation
  * (C) notaz, 2009-2010
+ * (C) kub, 2021
  *
  * This work is licensed under the terms of MAME license.
  * See COPYING file in the top-level directory.
@@ -149,10 +150,10 @@ static unsigned char z80_sms_in(unsigned short a)
       case 0x01:
         if ((Pico.m.hardware & 0x1) && a < 0x8) { // GG I/O area
           switch (a) {
-          case 0: d = 0xff & ~(PicoIn.pad[0] & 0x80); break;
-          case 1: d = Pico.ms.io_gg[1] | Pico.ms.io_gg[2]; break;
-          case 5: d = Pico.ms.io_gg[5] & 0xf8; break;
-          default: d = Pico.ms.io_gg[a]; break;
+          case 0: d = 0xff & ~(PicoIn.pad[0] & 0x80);               break;
+          case 1: d = Pico.ms.io_gg[1] | (Pico.ms.io_gg[2] & 0x7f); break;
+          case 5: d = Pico.ms.io_gg[5] & 0xf8;                      break;
+          default: d = Pico.ms.io_gg[a];                            break;
           }
         }
         break;
@@ -398,6 +399,9 @@ void PicoPowerMS(void)
   memset(&Pico.m,0,sizeof(Pico.m));
   Pico.m.pal = 0;
 
+  for (s = 0; s < sizeof(PicoMem.zram); s++)
+    PicoMem.zram[s] = rand();
+
   // calculate a mask for bank writes.
   // ROM loader has aligned the size for us, so this is safe.
   s = 0; tmp = Pico.romsize;