diff --git a/Config/Project64.rdb b/Config/Project64.rdb
index abc3821fd..e11d649e8 100644
--- a/Config/Project64.rdb
+++ b/Config/Project64.rdb
@@ -1,4 +1,4 @@
-// ============ RDB for PJ64 v2.2. GoodN64 v321 =====================================
+// ============ RDB for PJ64 v2.2. GoodN64 v321 =====================================
 // PJ64 v2.2 Official RDB
 // Not for use with PJ64 v1.6 or previous
 //---- START OF RDB FILE HEADER ---------------------------------------------------------
@@ -5548,6 +5548,7 @@ ViRefresh=2200
 Good Name=Super Smash Bros. (E) (M3)
 Internal Name=SMASH BROTHERS
 Status=Compatible
+Counter Factor=1
 Culling=1
 SMM-Cache=0
 SMM-FUNC=0
diff --git a/Source/Glide64/rdp.cpp b/Source/Glide64/rdp.cpp
index c0457d664..d42c2e41a 100644
--- a/Source/Glide64/rdp.cpp
+++ b/Source/Glide64/rdp.cpp
@@ -4097,54 +4097,98 @@ void CALL ProcessRDPList(void)
 #endif
     WriteTrace(TraceGlide64, TraceDebug, "-");
 
-    uint32_t i;
-    uint32_t cmd, length, cmd_length;
-    rdp_cmd_ptr = 0;
-    rdp_cmd_cur = 0;
+    no_dlist = false;
+    update_screen_count = 0;
+    ChangeSize();
+
+    // Switch to fullscreen?
+    if (to_fullscreen)
+        GoToFullScreen();
+
+    //* Set states *//
+    if (g_settings->swapmode > 0)
+        SwapOK = TRUE;
+    rdp.updatescreen = 1;
+
+    rdp.tri_n = 0;  // 0 triangles so far this frame
+    rdp.debug_n = 0;
+
+    rdp.model_i = 0; // 0 matrices so far in stack
+    //stack_size can be less then 32! Important for Silicon Vally. Thanks Orkin!
+    rdp.model_stack_size = minval(32, (*(uint32_t*)(gfx.DMEM + 0x0FE4)) >> 6);
+    if (rdp.model_stack_size == 0)
+        rdp.model_stack_size = 32;
+    rdp.Persp_en = TRUE;
+    rdp.fb_drawn = rdp.fb_drawn_front = FALSE;
+    rdp.update = 0x7FFFFFFF;  // All but clear cache
+    rdp.geom_mode = 0;
+    rdp.acmp = 0;
+    rdp.maincimg[1] = rdp.maincimg[0];
+    rdp.skip_drawing = FALSE;
+    rdp.s2dex_tex_loaded = FALSE;
+    rdp.bg_image_height = 0xFFFF;
+    fbreads_front = fbreads_back = 0;
+    rdp.fog_multiplier = rdp.fog_offset = 0;
+    rdp.zsrc = 0;
+    if (rdp.vi_org_reg != *gfx.VI_ORIGIN_REG)
+        rdp.tlut_mode = 0; //is it correct?
+    rdp.scissor_set = FALSE;
+    ucode5_texshiftaddr = ucode5_texshiftcount = 0;
+    cpu_fb_write = FALSE;
+    cpu_fb_read_called = FALSE;
+    cpu_fb_write_called = FALSE;
+    cpu_fb_ignore = FALSE;
+    d_ul_x = 0xffff;
+    d_ul_y = 0xffff;
+    d_lr_x = 0;
+    d_lr_y = 0;
+    depth_buffer_fog = TRUE;
+
+    const uint32_t length = dp_end - dp_current;
+
+    dp_status &= ~0x0002;
 
     if (dp_end <= dp_current) return;
-    length = dp_end - dp_current;
+
+    rdp.LLE = TRUE;
 
     // load command data
-    for (i = 0; i < length; i += 4)
+    for (uint32_t i = 0; i < length; i += 4)
     {
-        rdp_cmd_data[rdp_cmd_ptr++] = READ_RDP_DATA(dp_current + i);
-        if (rdp_cmd_ptr >= 0x1000)
-        {
-            WriteTrace(TraceRDP, TraceDebug, "rdp_process_list: rdp_cmd_ptr overflow %x %x --> %x", length, dp_current, dp_end);
-        }
+        rdp_cmd_data[rdp_cmd_ptr] = READ_RDP_DATA(dp_current + i);
+        rdp_cmd_ptr = (rdp_cmd_ptr + 1) & maxCMDMask;
     }
 
-    dp_current = dp_end;
+    bool setZero = true;
 
-    cmd = (rdp_cmd_data[0] >> 24) & 0x3f;
-    cmd_length = (rdp_cmd_ptr + 1) * 4;
+    while (rdp_cmd_cur != rdp_cmd_ptr) {
+        uint32_t cmd = (rdp_cmd_data[rdp_cmd_cur] >> 24) & 0x3f;
 
-    // check if more data is needed
-    if (cmd_length < rdp_command_length[cmd])
-        return;
-    rdp.LLE = TRUE;
-    while (rdp_cmd_cur < rdp_cmd_ptr)
-    {
-        cmd = (rdp_cmd_data[rdp_cmd_cur] >> 24) & 0x3f;
+        if ((((rdp_cmd_ptr - rdp_cmd_cur)&maxCMDMask) * 4) < rdp_command_length[cmd]) {
+            setZero = false;
+            break;
+        }
 
-        if (((rdp_cmd_ptr - rdp_cmd_cur) * 4) < rdp_command_length[cmd])
-            return;
+        if (rdp_cmd_cur + rdp_command_length[cmd] / 4 > MAXCMD)
+            ::memcpy(rdp_cmd_data + MAXCMD, rdp_cmd_data, rdp_command_length[cmd] - (MAXCMD - rdp_cmd_cur) * 4);
 
         // execute the command
         rdp.cmd0 = rdp_cmd_data[rdp_cmd_cur + 0];
         rdp.cmd1 = rdp_cmd_data[rdp_cmd_cur + 1];
         rdp.cmd2 = rdp_cmd_data[rdp_cmd_cur + 2];
         rdp.cmd3 = rdp_cmd_data[rdp_cmd_cur + 3];
+        //RSP.cmd = cmd;
         rdp_command_table[cmd]();
 
-        rdp_cmd_cur += rdp_command_length[cmd] / 4;
-    };
+        rdp_cmd_cur = (rdp_cmd_cur + rdp_command_length[cmd] / 4) & maxCMDMask;
+    }
+
+    if (setZero) {
+        rdp_cmd_ptr = 0;
+        rdp_cmd_cur = 0;
+    }
+
     rdp.LLE = FALSE;
 
-    dp_start = dp_end;
-
-    dp_status &= ~0x0002;
-
-    //}
+    dp_start = dp_current = dp_end;
 }
\ No newline at end of file
diff --git a/Source/Glide64/rdp.h b/Source/Glide64/rdp.h
index 1bd11d7ca..f22022903 100644
--- a/Source/Glide64/rdp.h
+++ b/Source/Glide64/rdp.h
@@ -58,6 +58,9 @@ extern uint32_t frame_count; // frame counter
 
 #define MAX_TMU     2
 
+#define MAXCMD 0x100000
+const unsigned int maxCMDMask = MAXCMD - 1;
+
 #define TEXMEM_2MB_EDGE 2097152
 
 // Supported flags