32x: more wip
authornotaz <notasas@gmail.com>
Mon, 14 Sep 2009 10:41:30 +0000 (10:41 +0000)
committernotaz <notasas@gmail.com>
Mon, 14 Sep 2009 10:41:30 +0000 (10:41 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@774 be3aeb3a-fb24-0410-a615-afba39da0efa

pico/32x/32x.c
pico/32x/draw.c
pico/32x/memory.c
pico/cart.c
pico/pico.h
pico/pico_int.h
platform/common/emu.c
platform/common/menu.c
platform/gp2x/Makefile

index 7a122cb..1128893 100644 (file)
@@ -23,12 +23,24 @@ void Pico32xInit(void)
 void PicoPower32x(void)
 {
   memset(&Pico32x, 0, sizeof(Pico32x));
+
   Pico32x.regs[0] = 0x0082; // SH2 reset?
   Pico32x.vdp_regs[0x0a/2] = P32XV_VBLK|P32XV_HBLK|P32XV_PEN;
 }
 
+void PicoUnload32x(void)
+{
+  if (Pico32xMem != NULL)
+    free(Pico32xMem);
+  Pico32xMem = NULL;
+
+  PicoAHW &= ~PAHW_32X;
+}
+
 void PicoReset32x(void)
 {
+  extern int p32x_csum_faked;
+  p32x_csum_faked = 0; // tmp
 }
 
 static void p32x_start_blank(void)
index 794e2d4..1e2f57c 100644 (file)
@@ -1,18 +1,22 @@
 #include "../pico_int.h"
 
-static void convert_pal555(void)
+static void convert_pal555(int invert_prio)
 {
   unsigned int *ps = (void *)Pico32xMem->pal;
   unsigned int *pd = (void *)Pico32xMem->pal_native;
   unsigned int m1 = 0x001f001f;
   unsigned int m2 = 0x03e003e0;
   unsigned int m3 = 0xfc00fc00;
+  unsigned int inv = 0;
   int i;
 
+  if (invert_prio)
+    inv = 0x00200020;
+
   // place prio to LS green bit
   for (i = 0x100/2; i > 0; i--, ps++, pd++) {
     unsigned int t = *ps;
-    *pd = ((t & m1) << 11) | ((t & m2) << 1) | ((t & m3) >> 10);
+    *pd = (((t & m1) << 11) | ((t & m2) << 1) | ((t & m3) >> 10)) ^ inv;
   }
 
   Pico32x.dirty_pal = 0;
@@ -34,11 +38,14 @@ void FinalizeLine32xRGB555(int sh, int line)
   FinalizeLineRGB555(sh, line);
   Pico.cram[0] = cram0;
 
-  if ((Pico32x.vdp_regs[0] & 3) == 0)
+  if ((Pico32x.vdp_regs[0] & P32XV_Mx) == 0)
     return; // blanking
 
+  if (!(PicoDrawMask & PDRAW_32X_ON))
+    return;
+
   if (Pico32x.dirty_pal)
-    convert_pal555();
+    convert_pal555(Pico32x.vdp_regs[0] & P32XV_PRI);
 
   if ((Pico32x.vdp_regs[0] & P32XV_Mx) == 1) {
     unsigned short *dram = (void *)Pico32xMem->dram[Pico32x.vdp_regs[0x0a/2] & P32XV_FS];
index f1a109e..1606226 100644 (file)
@@ -5,13 +5,21 @@ static const char str_mars[] = "MARS";
 
 struct Pico32xMem *Pico32xMem;
 
+static void bank_switch(int b);
+
 // SH2 faking
 static const u16 comm_fakevals[] = {
   0x4d5f, 0x4f4b, // M_OK
   0x535f, 0x4f4b, // S_OK
+  0x4D41, 0x5346, // MASF - Brutal Unleashed
+  0x5331, 0x4d31, // Darxide
+  0x5332, 0x4d32,
+  0x5333, 0x4d33,
+  0x0000, 0x0000, // eq for doom
   0x0002, // Mortal Kombat
   0, // pad
 };
+int p32x_csum_faked;
 
 static u32 p32x_reg_read16(u32 a)
 {
@@ -20,9 +28,9 @@ static u32 p32x_reg_read16(u32 a)
   // SH2 faker
   if ((a & 0x30) == 0x20)
   {
-    static int f = 0, csum_faked = 0;
-    if (a == 0x28 && !csum_faked) {
-      csum_faked = 1;
+    static int f = 0;
+    if (a == 0x28 && !p32x_csum_faked) {
+      p32x_csum_faked = 1;
       return *(unsigned short *)(Pico.rom + 0x18e);
     }
     if (f >= sizeof(comm_fakevals) / sizeof(comm_fakevals[0]))
@@ -33,17 +41,6 @@ static u32 p32x_reg_read16(u32 a)
   return Pico32x.regs[a / 2];
 }
 
-static void p32x_reg_write16(u32 a, u32 d)
-{
-  a &= 0x3e;
-
-  if (a == 0 && !(Pico32x.regs[0] & 1)) {
-    Pico32x.regs[0] |= 1;
-    Pico32xStartup();
-    return;
-  }
-}
-
 static void p32x_reg_write8(u32 a, u32 d)
 {
   a &= 0x3f;
@@ -53,6 +50,23 @@ static void p32x_reg_write8(u32 a, u32 d)
     Pico32xStartup();
     return;
   }
+
+  if (!(Pico32x.regs[0] & 1))
+    return;
+
+  if (a == 5) {
+    d &= 7;
+    if (Pico32x.regs[4/2] != d) {
+      Pico32x.regs[4/2] = d;
+      bank_switch(d);
+      return;
+    }
+  }
+}
+
+static void p32x_reg_write16(u32 a, u32 d)
+{
+  p32x_reg_write8(a + 1, d);
 }
 
 // VDP regs
@@ -77,6 +91,9 @@ static void p32x_vdp_write8(u32 a, u32 d)
         else
           r[0x0a/2] &= ~P32XV_VBLK;
       }
+      // priority inversion is handled in palette
+      if ((r[0] ^ d) & P32XV_PRI)
+        Pico32x.dirty_pal = 1;
       r[0] = (r[0] & P32XV_nPAL) | (d & 0xff);
       break;
     case 0x0b:
@@ -260,12 +277,33 @@ void Pico32xSwapDRAM(int b)
   cpu68k_map_set(m68k_write16_map, 0x840000, 0x85ffff, Pico32xMem->dram[b], 0);
 }
 
+static void bank_switch(int b)
+{
+  unsigned int rs, bank;
+
+  bank = b << 20;
+  if (bank >= Pico.romsize) {
+    elprintf(EL_32X|EL_ANOMALY, "missing bank @ %06x", bank);
+    return;
+  }
+
+  // 32X ROM (unbanked, XXX: consider mirroring?)
+  rs = (Pico.romsize + M68K_BANK_MASK) & ~M68K_BANK_MASK;
+  rs -= bank;
+  if (rs > 0x100000)
+    rs = 0x100000;
+  cpu68k_map_set(m68k_read8_map,   0x900000, 0x900000 + rs - 1, Pico.rom + bank, 0);
+  cpu68k_map_set(m68k_read16_map,  0x900000, 0x900000 + rs - 1, Pico.rom + bank, 0);
+
+  elprintf(EL_32X, "bank %06x-%06x -> %06x", 0x900000, 0x900000 + rs - 1, bank);
+}
+
 #define HWSWAP(x) (((x) << 16) | ((x) >> 16))
 void PicoMemSetup32x(void)
 {
   unsigned short *ps;
   unsigned int *pl;
-  unsigned int rs, rs1;
+  unsigned int rs;
   int i;
 
   Pico32xMem = calloc(1, sizeof(*Pico32xMem));
@@ -284,9 +322,13 @@ void PicoMemSetup32x(void)
   for (i = 0xc0/2; i < 0x100/2; i++)
     ps[i] = 0x4e71;
 
+#if 0
   ps[0xc0/2] = 0x46fc;
   ps[0xc2/2] = 0x2700; // move #0x2700,sr
   ps[0xfe/2] = 0x60fe; // jump to self
+#else
+  ps[0xfe/2] = 0x4e75; // rts
+#endif
 
   // fill remaining mem with ROM
   memcpy(Pico32xMem->m68k_rom + 0x100, Pico.rom + 0x100, sizeof(Pico32xMem->m68k_rom) - 0x100);
@@ -307,16 +349,13 @@ void PicoMemSetup32x(void)
   Pico32xSwapDRAM(1);
 
   // 32X ROM (unbanked, XXX: consider mirroring?)
-  rs1 = rs = (Pico.romsize + M68K_BANK_MASK) & ~M68K_BANK_MASK;
-  if (rs1 > 0x80000)
-    rs1 = 0x80000;
-  cpu68k_map_set(m68k_read8_map,   0x880000, 0x880000 + rs1 - 1, Pico.rom, 0);
-  cpu68k_map_set(m68k_read16_map,  0x880000, 0x880000 + rs1 - 1, Pico.rom, 0);
+  rs = (Pico.romsize + M68K_BANK_MASK) & ~M68K_BANK_MASK;
+  if (rs > 0x80000)
+    rs = 0x80000;
+  cpu68k_map_set(m68k_read8_map,   0x880000, 0x880000 + rs - 1, Pico.rom, 0);
+  cpu68k_map_set(m68k_read16_map,  0x880000, 0x880000 + rs - 1, Pico.rom, 0);
 
   // 32X ROM (banked)
-  if (rs > 0x100000)
-    rs = 0x100000;
-  cpu68k_map_set(m68k_read8_map,   0x900000, 0x900000 + rs - 1, Pico.rom, 0);
-  cpu68k_map_set(m68k_read16_map,  0x900000, 0x900000 + rs - 1, Pico.rom, 0);
+  bank_switch(0);
 }
 
index 067b422..cbd4bb6 100644 (file)
@@ -605,6 +605,9 @@ void PicoCartUnload(void)
     PicoCartUnloadHook = NULL;\r
   }\r
 \r
+  if (PicoAHW & PAHW_32X)\r
+    PicoUnload32x();\r
+\r
   if (Pico.rom != NULL) {\r
     SekFinishIdleDet();\r
     free(Pico.rom);\r
index e20820c..2398ad1 100644 (file)
@@ -169,6 +169,7 @@ extern int PicoDrawMask;
 #define PDRAW_LAYERA_ON      (1<<3)\r
 #define PDRAW_SPRITES_LOW_ON (1<<4)\r
 #define PDRAW_SPRITES_HI_ON  (1<<7)\r
+#define PDRAW_32X_ON         (1<<8)\r
 // internals\r
 #define PDRAW_SPRITES_MOVED (1<<0) // (asm)\r
 #define PDRAW_WND_DIFF_PRIO (1<<1) // not all window tiles use same priority\r
index 431c9a6..013ce2c 100644 (file)
@@ -611,6 +611,7 @@ void Pico32xInit(void);
 void PicoPower32x(void);\r
 void PicoReset32x(void);\r
 void Pico32xStartup(void);\r
+void PicoUnload32x(void);\r
 void PicoFrame32x(void);\r
 \r
 // 32x/memory.c\r
index 627c3be..cc450d8 100644 (file)
@@ -514,6 +514,9 @@ int emu_reload_rom(char *rom_fname)
 \r
        shutdown_MCD();\r
        PicoPatchUnload();\r
+       PicoCartUnload();\r
+       rom_loaded = 0;\r
+\r
        PicoAHW = 0;\r
 \r
        if (media_type == PM_CD)\r
@@ -558,9 +561,6 @@ int emu_reload_rom(char *rom_fname)
 \r
        menu_romload_prepare(used_rom_name); // also CD load\r
 \r
-       PicoCartUnload();\r
-       rom_loaded = 0;\r
-\r
        ret = PicoCartLoad(rom, &rom_data, &rom_size, (PicoAHW & PAHW_SMS) ? 1 : 0);\r
        pm_close(rom);\r
        if (ret != 0) {\r
index adfacef..1788033 100644 (file)
@@ -1752,11 +1752,12 @@ static void draw_text_debug(const char *str, int skip, int from)
 \r
 static void draw_frame_debug(void)\r
 {\r
-       char layer_str[48] = "layers:             ";\r
+       char layer_str[48] = "layers:                   ";\r
        if (PicoDrawMask & PDRAW_LAYERB_ON)      memcpy(layer_str +  8, "B", 1);\r
        if (PicoDrawMask & PDRAW_LAYERA_ON)      memcpy(layer_str + 10, "A", 1);\r
        if (PicoDrawMask & PDRAW_SPRITES_LOW_ON) memcpy(layer_str + 12, "spr_lo", 6);\r
        if (PicoDrawMask & PDRAW_SPRITES_HI_ON)  memcpy(layer_str + 19, "spr_hi", 6);\r
+       if (PicoDrawMask & PDRAW_32X_ON)         memcpy(layer_str + 26, "32x", 4);\r
 \r
        memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);\r
        pemu_forced_frame(0);\r
@@ -1826,6 +1827,7 @@ static void debug_menu_loop(void)
                                if (inp & PBTN_RIGHT) PicoDrawMask ^= PDRAW_LAYERA_ON;\r
                                if (inp & PBTN_DOWN)  PicoDrawMask ^= PDRAW_SPRITES_LOW_ON;\r
                                if (inp & PBTN_UP)    PicoDrawMask ^= PDRAW_SPRITES_HI_ON;\r
+                               if (inp & PBTN_MA2)   PicoDrawMask ^= PDRAW_32X_ON;\r
                                if (inp & PBTN_MOK) {\r
                                        PsndOut = NULL; // just in case\r
                                        PicoSkipFrame = 1;\r
index 8ccea30..8a061cb 100644 (file)
@@ -116,8 +116,9 @@ vpath %.c = ../..
 vpath %.s = ../..\r
 vpath %.S = ../..\r
 \r
-DIRS = platform platform/gp2x platform/linux platform/common pico pico/cd pico/pico pico/sound \\r
-       pico/carthw/svp zlib unzip cpu cpu/musashi cpu/Cyclone/proj cpu/Cyclone/tools cpu/mz80 cpu/DrZ80\r
+DIRS = platform platform/gp2x platform/linux platform/common pico pico/cd pico/pico pico/32x \\r
+       pico/sound pico/carthw/svp zlib unzip cpu cpu/musashi cpu/Cyclone/proj cpu/Cyclone/tools \\r
+       cpu/mz80 cpu/DrZ80\r
 \r
 \r
 all: mkdirs PicoDrive\r