Browse Source

Last irixxxx's commits

root 2 years ago
parent
commit
6cbcad25b3
7 changed files with 86 additions and 19 deletions
  1. 1 1
      cpu/DrZ80/drz80.S
  2. 2 1
      cpu/cz80/cz80.h
  3. 16 0
      pico/cart.c
  4. 1 1
      pico/cd/libchdr
  5. 1 1
      pico/memory.h
  6. 13 6
      pico/mode4.c
  7. 52 9
      pico/sms.c

+ 1 - 1
cpu/DrZ80/drz80.S

@@ -20,7 +20,7 @@
       .equiv DRZ80_XMAP_MORE_INLINE, 1
 
 .if DRZ80_XMAP
-      .equ Z80_MEM_SHIFT, 13
+      .equ Z80_MEM_SHIFT, 10
 .endif
 
 .if INTERRUPT_MODE

+ 2 - 1
cpu/cz80/cz80.h

@@ -59,7 +59,8 @@ extern "C" {
 /* Z80 core Structures & definitions */
 /*************************************/
 
-#define CZ80_FETCH_BITS			4   // [4-12]   default = 8
+// NB this must have at least the value of (16-Z80_MEM_SHIFT)
+#define CZ80_FETCH_BITS			6   // [4-12]   default = 8
 
 #define CZ80_FETCH_SFT			(16 - CZ80_FETCH_BITS)
 #define CZ80_FETCH_BANK			(1 << CZ80_FETCH_BITS)

+ 16 - 0
pico/cart.c

@@ -34,6 +34,7 @@ void (*PicoCDLoadProgressCB)(const char *fname, int percent) = NULL; // handled
 int PicoGameLoaded;
 
 static void PicoCartDetect(const char *carthw_cfg);
+static void PicoCartDetectMS(void);
 
 /* cso struct */
 typedef struct _cso_struct
@@ -850,6 +851,8 @@ int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_
 
   if (!(PicoIn.AHW & (PAHW_MCD|PAHW_SMS)))
     PicoCartDetect(carthw_cfg);
+  else if (PicoIn.AHW & PAHW_SMS)
+    PicoCartDetectMS();
 
   // setup correct memory map for loaded ROM
   switch (PicoIn.AHW) {
@@ -1320,4 +1323,17 @@ static void PicoCartDetect(const char *carthw_cfg)
     *(u32 *) (Pico.rom + 0x1f0) = CPU_LE4(0x20204520);
 }
 
+static void PicoCartDetectMS(void)
+{
+  memset(&Pico.sv, 0, sizeof(Pico.sv));
+
+  // Always map SRAM, since there's no indicator in ROM if it's needed or not
+  // TODO: this should somehow be coming from a cart database!
+
+  Pico.sv.size  = 0x8000; // Sega mapper, 2 banks of 16 KB each
+  Pico.sv.flags |= SRF_ENABLED;
+  Pico.sv.data = calloc(Pico.sv.size, 1);
+  if (Pico.sv.data == NULL)
+    Pico.sv.flags &= ~SRF_ENABLED;
+}
 // vim:shiftwidth=2:expandtab

+ 1 - 1
pico/cd/libchdr

@@ -1 +1 @@
-Subproject commit 9bf1265d9369ae574b46fb1b897c1cd2752bc807
+Subproject commit 1d43110d9f860463bf3b8bc7ea3844423371c978

+ 1 - 1
pico/memory.h

@@ -38,7 +38,7 @@ extern void s68k_write16(u32 a, u16 d);
 extern void s68k_write32(u32 a, u32 d);
 
 // z80
-#define Z80_MEM_SHIFT 13
+#define Z80_MEM_SHIFT 10 // must be <=10 to allow 1KB pages for SMS Sega mapper
 extern uptr z80_read_map [0x10000 >> Z80_MEM_SHIFT];
 extern uptr z80_write_map[0x10000 >> Z80_MEM_SHIFT];
 typedef unsigned char (z80_read_f)(unsigned short a);

+ 13 - 6
pico/mode4.c

@@ -232,12 +232,14 @@ static void DrawDisplayM4(int scanline)
 
   // Find the line in the name table
   line = pv->reg[9] + scanline; // vscroll + scanline
-  if (line >= 224)
-    line -= 224;
+  line &= 0xff;
 
   // Find name table:
   nametab = PicoMem.vram;
-  nametab += (pv->reg[2] & 0x0e) << (10-1);
+  if ((Pico.video.reg[0] & 6) == 6 && (Pico.video.reg[1] & 0x18))
+    nametab += ((pv->reg[2] & 0x0c) << (10-1)) + (0x700 >> 1);
+  else
+    nametab += (pv->reg[2] & 0x0e) << (10-1);
   nametab += (line>>3) << (6-1);
 
   dx = pv->reg[8]; // hscroll
@@ -276,7 +278,7 @@ static void DrawDisplayM4(int scanline)
 static void FinalizeLineRGB555M4(int line);
 void PicoFrameStartMode4(void)
 {
-  int lines = 192, coffs;
+  int lines = 192, columns = 256, coffs;
   skip_next_line = 0;
   screen_offset = 24;
   Pico.est.rendstatus = PDRAW_32_COLS;
@@ -291,13 +293,18 @@ void PicoFrameStartMode4(void)
       lines = 224;
     }
   }
-  line_offset = PicoIn.opt & (POPT_DIS_32C_BORDER|POPT_EN_SOFTSCALE) ? 0 : 32;
+  if (PicoIn.opt & POPT_EN_SOFTSCALE) {
+    line_offset = 0;
+    columns = 320;
+  } else
+    line_offset = PicoIn.opt & POPT_DIS_32C_BORDER ? 0 : 32;
+
   coffs = line_offset;
   if (FinalizeLineM4 == FinalizeLineRGB555M4)
     line_offset = 0 /* done in FinalizeLine */;
 
   if (Pico.est.rendstatus != rendstatus_old || lines != rendlines) {
-    emu_video_mode_change(screen_offset, lines, coffs, 256);
+    emu_video_mode_change(screen_offset, lines, coffs, columns);
     rendstatus_old = Pico.est.rendstatus;
     rendlines = lines;
   }

+ 52 - 9
pico/sms.c

@@ -219,17 +219,30 @@ static void z80_sms_out(unsigned short a, unsigned char d)
 
 static int bank_mask;
 
+static void xwrite(unsigned int a, unsigned char d);
+
+static void write_sram(unsigned short a, unsigned char d)
+{
+  // SRAM is mapped in 2 16KB banks, selected by bit 2 in control reg
+  a &= 0x3fff;
+  a += ((Pico.ms.carthw[0x0c] & 0x04) >> 2) * 0x4000;
+
+  Pico.sv.changed |= (Pico.sv.data[a] != d);
+  Pico.sv.data[a] = d;
+}
+
 static void write_bank(unsigned short a, unsigned char d)
 {
   elprintf(EL_Z80BNK, "bank %04x %02x @ %04x", a, d, z80_pc());
+  Pico.ms.carthw[a & 0x0f] = d;
   switch (a & 0x0f)
   {
-    case 0x0c:
-      elprintf(EL_STATUS|EL_ANOMALY, "%02x written to control reg!", d);
-      break;
     case 0x0d:
-      if (d != 0)
-        elprintf(EL_STATUS|EL_ANOMALY, "bank0 changed to %d!", d);
+      d &= bank_mask;
+      z80_map_set(z80_read_map, 0x0400, 0x3fff, Pico.rom+0x400 + (d << 14), 0);
+#ifdef _USE_CZ80
+      Cz80_Set_Fetch(&CZ80, 0x0400, 0x3fff, (FPTR)Pico.rom+0x400 + (d << 14));
+#endif
       break;
     case 0x0e:
       d &= bank_mask;
@@ -238,15 +251,29 @@ static void write_bank(unsigned short a, unsigned char d)
       Cz80_Set_Fetch(&CZ80, 0x4000, 0x7fff, (FPTR)Pico.rom + (d << 14));
 #endif
       break;
+
+    case 0x0c:
+      if (d & ~0x8c)
+        elprintf(EL_STATUS|EL_ANOMALY, "%02x written to control reg!", d);
+      /*FALLTHROUGH*/
     case 0x0f:
-      d &= bank_mask;
-      z80_map_set(z80_read_map, 0x8000, 0xbfff, Pico.rom + (d << 14), 0);
+      if (Pico.ms.carthw[0xc] & 0x08) {
+        d = (Pico.ms.carthw[0xc] & 0x04) >> 2;
+        z80_map_set(z80_read_map, 0x8000, 0xbfff, Pico.sv.data + d*0x4000, 0);
 #ifdef _USE_CZ80
-      Cz80_Set_Fetch(&CZ80, 0x8000, 0xbfff, (FPTR)Pico.rom + (d << 14));
+        Cz80_Set_Fetch(&CZ80, 0x8000, 0xbfff, (FPTR)Pico.sv.data + d*0x4000);
 #endif
+        z80_map_set(z80_write_map, 0x8000, 0xbfff, write_sram, 1);
+      } else {
+        d = Pico.ms.carthw[0xf] & bank_mask;
+        z80_map_set(z80_read_map, 0x8000, 0xbfff, Pico.rom + (d << 14), 0);
+#ifdef _USE_CZ80
+        Cz80_Set_Fetch(&CZ80, 0x8000, 0xbfff, (FPTR)Pico.rom + (d << 14));
+#endif
+        z80_map_set(z80_write_map, 0x8000, 0xbfff, xwrite, 1);
+      }
       break;
   }
-  Pico.ms.carthw[a & 0x0f] = d;
 }
 
 static void xwrite(unsigned int a, unsigned char d)
@@ -256,6 +283,16 @@ static void xwrite(unsigned int a, unsigned char d)
     PicoMem.zram[a & 0x1fff] = d;
   if (a >= 0xfff8)
     write_bank(a, d);
+  // codemasters
+  if (a == 0x0000)
+    write_bank(0xfffd, d);
+  if (a == 0x4000)
+    write_bank(0xfffe, d);
+  if (a == 0x8000)
+    write_bank(0xffff, d);
+  // korean
+  if (a == 0xa000)
+    write_bank(0xffff, d);
 }
 
 void PicoResetMS(void)
@@ -284,6 +321,8 @@ void PicoPowerMS(void)
   tmp = 1 << s;
   bank_mask = (tmp - 1) >> 14;
 
+  Pico.ms.carthw[0x0c] = 0;
+  Pico.ms.carthw[0x0d] = 0;
   Pico.ms.carthw[0x0e] = 1;
   Pico.ms.carthw[0x0f] = 2;
 
@@ -315,6 +354,8 @@ void PicoMemSetupMS(void)
 
 void PicoStateLoadedMS(void)
 {
+  write_bank(0xfffc, Pico.ms.carthw[0x0c]);
+  write_bank(0xfffd, Pico.ms.carthw[0x0d]);
   write_bank(0xfffe, Pico.ms.carthw[0x0e]);
   write_bank(0xffff, Pico.ms.carthw[0x0f]);
 }
@@ -339,6 +380,8 @@ void PicoFrameMS(void)
     z80_nmi();
   Pico.ms.nmi_state = nmi;
 
+  if ((Pico.video.reg[0] & 6) == 6 && (Pico.video.reg[1] & 0x18))
+    lines_vis = (Pico.video.reg[1] & 0x08) ? 240 : 224;
   PicoFrameStartMode4();
   hint = pv->reg[0x0a];