Merge pull request #123 from gameblabla/diablofix_hack
[pcsx_rearmed.git] / plugins / dfxvideo / gpulib_if.c
index 82bc38d..01b8dde 100644 (file)
@@ -265,9 +265,9 @@ long           lLowerpart;
 
 /////////////////////////////////////////////////////////////////////////////
 
 
 /////////////////////////////////////////////////////////////////////////////
 
-int renderer_init(void)
+static void set_vram(void *vram)
 {
 {
- psxVub=(void *)gpu.vram;
+ psxVub=vram;
 
  psxVsb=(signed char *)psxVub;                         // different ways of accessing PSX VRAM
  psxVsw=(signed short *)psxVub;
 
  psxVsb=(signed char *)psxVub;                         // different ways of accessing PSX VRAM
  psxVsw=(signed short *)psxVub;
@@ -276,6 +276,11 @@ int renderer_init(void)
  psxVul=(uint32_t *)psxVub;
 
  psxVuw_eom=psxVuw+1024*512;                           // pre-calc of end of vram
  psxVul=(uint32_t *)psxVub;
 
  psxVuw_eom=psxVuw+1024*512;                           // pre-calc of end of vram
+}
+
+int renderer_init(void)
+{
+ set_vram(gpu.vram);
 
  PSXDisplay.RGB24        = FALSE;                      // init some stuff
  PSXDisplay.Interlaced   = FALSE;
 
  PSXDisplay.RGB24        = FALSE;                      // init some stuff
  PSXDisplay.Interlaced   = FALSE;
@@ -294,18 +299,37 @@ int renderer_init(void)
  return 0;
 }
 
  return 0;
 }
 
-extern const unsigned char cmd_lengths[256];
+void renderer_finish(void)
+{
+}
 
 
-void do_cmd_list(unsigned int *list, int list_len)
+void renderer_notify_res_change(void)
 {
 {
-  unsigned int cmd, len;
+}
+
+extern const unsigned char cmd_lengths[256];
 
 
+int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
+{
+  unsigned int cmd = 0, len;
+  unsigned int *list_start = list;
   unsigned int *list_end = list + list_len;
 
   for (; list < list_end; list += 1 + len)
   {
     cmd = *list >> 24;
     len = cmd_lengths[cmd];
   unsigned int *list_end = list + list_len;
 
   for (; list < list_end; list += 1 + len)
   {
     cmd = *list >> 24;
     len = cmd_lengths[cmd];
+    if (list + 1 + len > list_end) {
+      cmd = -1;
+      break;
+    }
+
+#ifndef TEST
+    if (cmd == 0xa0 || cmd == 0xc0)
+      break; // image i/o, forward to upper layer
+    else if ((cmd & 0xf8) == 0xe0)
+      gpu.ex_regs[cmd & 7] = list[0];
+#endif
 
     primTableJ[cmd]((void *)list);
 
 
     primTableJ[cmd]((void *)list);
 
@@ -313,41 +337,47 @@ void do_cmd_list(unsigned int *list, int list_len)
     {
       case 0x48 ... 0x4F:
       {
     {
       case 0x48 ... 0x4F:
       {
-        u32 num_vertexes = 1;
-        u32 *list_position = &(list[2]);
+        u32 num_vertexes = 2;
+        u32 *list_position = &(list[3]);
 
         while(1)
         {
 
         while(1)
         {
-          if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
+          if(list_position >= list_end) {
+            cmd = -1;
+            goto breakloop;
+          }
+
+          if((*list_position & 0xf000f000) == 0x50005000)
             break;
 
           list_position++;
           num_vertexes++;
         }
 
             break;
 
           list_position++;
           num_vertexes++;
         }
 
-        if(num_vertexes > 2)
-          len += (num_vertexes - 2);
-
+        len += (num_vertexes - 2);
         break;
       }
 
       case 0x58 ... 0x5F:
       {
         break;
       }
 
       case 0x58 ... 0x5F:
       {
-        u32 num_vertexes = 1;
-        u32 *list_position = &(list[2]);
+        u32 num_vertexes = 2;
+        u32 *list_position = &(list[4]);
 
         while(1)
         {
 
         while(1)
         {
-          if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
+          if(list_position >= list_end) {
+            cmd = -1;
+            goto breakloop;
+          }
+
+          if((*list_position & 0xf000f000) == 0x50005000)
             break;
 
           list_position += 2;
           num_vertexes++;
         }
 
             break;
 
           list_position += 2;
           num_vertexes++;
         }
 
-        if(num_vertexes > 2)
-          len += (num_vertexes - 2) * 2;
-
+        len += (num_vertexes - 2) * 2;
         break;
       }
 
         break;
       }
 
@@ -365,6 +395,13 @@ void do_cmd_list(unsigned int *list, int list_len)
 #endif
     }
   }
 #endif
     }
   }
+
+breakloop:
+  gpu.ex_regs[1] &= ~0x1ff;
+  gpu.ex_regs[1] |= lGPUstatusRet & 0x1ff;
+
+  *last_cmd = cmd;
+  return list - list_start;
 }
 
 void renderer_sync_ecmds(uint32_t *ecmds)
 }
 
 void renderer_sync_ecmds(uint32_t *ecmds)
@@ -395,4 +432,7 @@ void renderer_set_config(const struct rearmed_cbs *cbs)
 {
  iUseDither = cbs->gpu_peops.iUseDither;
  dwActFixes = cbs->gpu_peops.dwActFixes;
 {
  iUseDither = cbs->gpu_peops.iUseDither;
  dwActFixes = cbs->gpu_peops.dwActFixes;
+ if (cbs->pl_set_gpu_caps)
+  cbs->pl_set_gpu_caps(0);
+ set_vram(gpu.vram);
 }
 }