From 7a198a5e169c463872b893386af8964b47c4e8f8 Mon Sep 17 00:00:00 2001
From: sin365 <353374337@qq.com>
Date: Sun, 19 Jan 2025 22:45:37 +0800
Subject: [PATCH] =?UTF-8?q?video=20=E6=96=B9=E4=BE=BF=E5=B0=BD=E5=8F=AF?=
 =?UTF-8?q?=E8=83=BD=E6=8C=87=E9=92=88=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 MAME.Unity/Assets/Plugins/UMAME/emu/Motion.cs | 134 +++++++++---------
 MAME.Unity/Assets/Plugins/UMAME/emu/Video.cs  |  46 ++++--
 .../Plugins/UMAME/mame/capcom/Drawgfx.cs      |   6 +-
 .../Plugins/UMAME/mame/capcom/Tilemap.cs      |   8 +-
 .../Assets/Plugins/UMAME/mame/capcom/Video.cs |   2 +-
 .../Assets/Plugins/UMAME/mame/cps/Drawgfx.cs  |   4 +-
 .../Assets/Plugins/UMAME/mame/cps/Tilemap.cs  |   6 +-
 .../Assets/Plugins/UMAME/mame/cps/Video.cs    |   8 +-
 .../Plugins/UMAME/mame/dataeast/Drawgfx.cs    |   4 +-
 .../Plugins/UMAME/mame/dataeast/Tilemap.cs    |   4 +-
 .../Assets/Plugins/UMAME/mame/igs011/Video.cs |   4 +-
 .../Plugins/UMAME/mame/konami68000/Drawgfx.cs |  10 +-
 .../Plugins/UMAME/mame/konami68000/Tilemap.cs |   4 +-
 .../Plugins/UMAME/mame/konami68000/Video.cs   |   8 +-
 .../Assets/Plugins/UMAME/mame/m72/Drawgfx.cs  |   4 +-
 .../Assets/Plugins/UMAME/mame/m72/Tilemap.cs  |   6 +-
 .../Assets/Plugins/UMAME/mame/m92/Drawgfx.cs  |   6 +-
 .../Assets/Plugins/UMAME/mame/m92/Tilemap.cs  |   4 +-
 .../Plugins/UMAME/mame/namcos1/Drawgfx.cs     |   4 +-
 .../Plugins/UMAME/mame/namcos1/Tilemap.cs     |   6 +-
 .../Assets/Plugins/UMAME/mame/neogeo/Video.cs |  23 +--
 .../Assets/Plugins/UMAME/mame/pgm/Tilemap.cs  |   4 +-
 .../Assets/Plugins/UMAME/mame/pgm/Video.cs    |  16 +--
 .../Plugins/UMAME/mame/suna8/Drawgfx.cs       |   4 +-
 .../Plugins/UMAME/mame/taito/Drawgfx.cs       |   8 +-
 .../Plugins/UMAME/mame/taito/Tilemap.cs       |   4 +-
 .../Assets/Plugins/UMAME/mame/taito/Video.cs  |   2 +-
 .../Plugins/UMAME/mame/taitob/Tilemap.cs      |   6 +-
 .../Assets/Plugins/UMAME/mame/taitob/Video.cs |  10 +-
 .../Plugins/UMAME/mame/tehkan/Drawgfx.cs      |   4 +-
 .../Plugins/UMAME/mame/tehkan/Tilemap.cs      |   6 +-
 31 files changed, 198 insertions(+), 167 deletions(-)

diff --git a/MAME.Unity/Assets/Plugins/UMAME/emu/Motion.cs b/MAME.Unity/Assets/Plugins/UMAME/emu/Motion.cs
index a4e7236..61b9feb 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/emu/Motion.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/emu/Motion.cs
@@ -7,7 +7,7 @@ namespace MAME.Core
     /// <summary>
     /// 原依赖Form的内容
     /// </summary>
-    public class Motion
+    public unsafe class Motion
     {
         private static uint UI_FILLCOLOR = Palette.make_argb(0xe0, 0x10, 0x10, 0x30);
         public delegate void motion_delegate();
@@ -29,9 +29,9 @@ namespace MAME.Core
         //    //        byte bright = 0xa7;
         //    //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
         //    //        {
-        //    //            red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-        //    //            green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-        //    //            blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+        //    //            red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+        //    //            green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+        //    //            blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
         //    //            Video.bitmapcolor[i] = (int)Palette.make_argb(0xff, red, green, blue);
         //    //        }
         //    //    }
@@ -39,7 +39,7 @@ namespace MAME.Core
         //    //    {
         //    //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
         //    //        {
-        //    //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+        //    //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
         //    //        }
         //    //    }
         //    //}
@@ -65,10 +65,10 @@ namespace MAME.Core
         //                {
         //                    //i = y * Video.fullwidth + x;
         //                    i = stepIndex + x;
-        //                    red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-        //                    green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-        //                    blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
-        //                    Video.bitmapcolorRect[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
+        //                    red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+        //                    green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+        //                    blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+        //                    Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
         //                }
         //            }
         //        }
@@ -82,7 +82,7 @@ namespace MAME.Core
         //                {
         //                    //i = y * Video.fullwidth + x;
         //                    i = stepIndex + x;
-        //                    Video.bitmapcolorRect[target_i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+        //                    Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
         //                }
         //            }
         //        }
@@ -90,9 +90,9 @@ namespace MAME.Core
         //}
         public unsafe static void ui_updateC()
         {
-            //fixed (ushort* curbitmapPtr = &Video.bitmapbase[Video.curbitmap][0])
+            //fixed (ushort* curbitmapPtr = &Video.bitmapbase_Ptrs[Video.curbitmap][0])
             //fixed (uint* entry_colorPtr = &Palette.entry_color[0])
-            //fixed (int* bitmapcolorRectPtr = &Video.bitmapcolorRect[0])
+            //fixed (int* bitmapcolorRectPtr = &Video.bitmapcolorRect_Ptrunsafe[0])
             {
                 //ushort* curbitmap = curbitmapPtr;
                 ushort* curbitmap = (ushort*)Video.bitmapbase_Ptrs[Video.curbitmap];
@@ -111,9 +111,9 @@ namespace MAME.Core
             //        byte bright = 0xa7;
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-            //            green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-            //            blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+            //            red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+            //            green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+            //            blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
             //            Video.bitmapcolor[i] = (int)Palette.make_argb(0xff, red, green, blue);
             //        }
             //    }
@@ -121,7 +121,7 @@ namespace MAME.Core
             //    {
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+            //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
             //        }
             //    }
             //}
@@ -180,11 +180,11 @@ namespace MAME.Core
             //        byte bright = 0xa7;
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            if (Video.bitmapbase[Video.curbitmap][i] < 0x100)
+            //            if (Video.bitmapbase_Ptrs[Video.curbitmap][i] < 0x100)
             //            {
-            //                red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-            //                green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-            //                blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+            //                red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+            //                green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+            //                blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
             //                Video.bitmapcolor[i] = (int)Palette.make_argb(0xff, red, green, blue);
             //            }
             //            else
@@ -197,9 +197,9 @@ namespace MAME.Core
             //    {
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            if (Video.bitmapbase[Video.curbitmap][i] < 0x100)
+            //            if (Video.bitmapbase_Ptrs[Video.curbitmap][i] < 0x100)
             //            {
-            //                Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+            //                Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
             //            }
             //            else
             //            {
@@ -230,12 +230,12 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            if (Video.bitmapbase[Video.curbitmap][i] < 0x100)
+                            if (Video.bitmapbase_Ptrs[Video.curbitmap][i] < 0x100)
                             {
-                                red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-                                green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-                                blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
-                                Video.bitmapcolorRect[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
+                                red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+                                green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+                                blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+                                Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
                             }
                             else
                             {
@@ -253,20 +253,20 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            if (Video.bitmapbase[Video.curbitmap][i] < 0x100)
+                            if (Video.bitmapbase_Ptrs[Video.curbitmap][i] < 0x100)
                             {
-                                Video.bitmapcolorRect[target_i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+                                Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
                             }
                             else
                             {
-                                Video.bitmapcolorRect[target_i] = (int)Palette.entry_color[0];
+                                Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.entry_color[0];
                             }
                         }
                     }
                 }
             }
         }
-        public static void ui_updateN()
+        public unsafe static void ui_updateN()
         {
             //不再填充完整画布
             //{
@@ -277,9 +277,9 @@ namespace MAME.Core
             //        byte bright = 0xa7;
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            red = ((Video.bitmapbaseN[Video.curbitmap][i] & 0xff0000) >> 16) * bright / 0xff;
-            //            green = ((Video.bitmapbaseN[Video.curbitmap][i] & 0xff00) >> 8) * bright / 0xff;
-            //            blue = (Video.bitmapbaseN[Video.curbitmap][i] & 0xff) * bright / 0xff;
+            //            red = ((Video.bitmapbaseN_Ptrs[Video.curbitmap][i] & 0xff0000) >> 16) * bright / 0xff;
+            //            green = ((Video.bitmapbaseN_Ptrs[Video.curbitmap][i] & 0xff00) >> 8) * bright / 0xff;
+            //            blue = (Video.bitmapbaseN_Ptrs[Video.curbitmap][i] & 0xff) * bright / 0xff;
             //            Video.bitmapcolor[i] = (int)Palette.make_argb(0xff, red, green, blue);
             //        }
             //    }
@@ -287,7 +287,7 @@ namespace MAME.Core
             //    {
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            Video.bitmapcolor[i] = (int)(0xff000000 | (uint)Video.bitmapbaseN[Video.curbitmap][i]);
+            //            Video.bitmapcolor[i] = (int)(0xff000000 | (uint)Video.bitmapbaseN_Ptrs[Video.curbitmap][i]);
             //        }
             //    }
             //}
@@ -312,10 +312,10 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            red = ((Video.bitmapbaseN[Video.curbitmap][i] & 0xff0000) >> 16) * bright / 0xff;
-                            green = ((Video.bitmapbaseN[Video.curbitmap][i] & 0xff00) >> 8) * bright / 0xff;
-                            blue = (Video.bitmapbaseN[Video.curbitmap][i] & 0xff) * bright / 0xff;
-                            Video.bitmapcolorRect[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
+                            red = ((Video.bitmapbaseN_Ptrs[Video.curbitmap][i] & 0xff0000) >> 16) * bright / 0xff;
+                            green = ((Video.bitmapbaseN_Ptrs[Video.curbitmap][i] & 0xff00) >> 8) * bright / 0xff;
+                            blue = (Video.bitmapbaseN_Ptrs[Video.curbitmap][i] & 0xff) * bright / 0xff;
+                            Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
                         }
                     }
                 }
@@ -328,7 +328,7 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            Video.bitmapcolorRect[target_i] = (int)(0xff000000 | (uint)Video.bitmapbaseN[Video.curbitmap][i]);
+                            Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)(0xff000000 | (uint)Video.bitmapbaseN_Ptrs[Video.curbitmap][i]);
                         }
                     }
                 }
@@ -345,9 +345,9 @@ namespace MAME.Core
             //        byte bright = 0xa7;
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-            //            green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-            //            blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+            //            red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+            //            green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+            //            blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
             //            Video.bitmapcolor[i] = (int)Palette.make_argb(0xff, red, green, blue);
             //        }
             //    }
@@ -355,7 +355,7 @@ namespace MAME.Core
             //    {
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+            //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
             //        }
             //    }
             //}
@@ -380,10 +380,10 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-                            green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-                            blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
-                            Video.bitmapcolorRect[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
+                            red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+                            green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+                            blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+                            Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
                         }
                     }
                 }
@@ -396,7 +396,7 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            Video.bitmapcolorRect[target_i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+                            Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
                         }
                     }
                 }
@@ -413,9 +413,9 @@ namespace MAME.Core
             //        byte bright = 0xa7;
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-            //            green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-            //            blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+            //            red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+            //            green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+            //            blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
             //            Video.bitmapcolor[i] = (int)Palette.make_argb(0xff, red, green, blue);
             //        }
             //    }
@@ -423,7 +423,7 @@ namespace MAME.Core
             //    {
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+            //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
             //        }
             //    }
             //}
@@ -449,10 +449,10 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-                            green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-                            blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
-                            Video.bitmapcolorRect[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
+                            red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+                            green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+                            blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+                            Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
                         }
                     }
                 }
@@ -465,7 +465,7 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            Video.bitmapcolorRect[target_i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+                            Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
                         }
                     }
                 }
@@ -482,9 +482,9 @@ namespace MAME.Core
             //        byte bright = 0xa7;
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-            //            green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-            //            blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+            //            red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+            //            green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+            //            blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
             //            Video.bitmapcolor[i] = (int)Palette.make_argb(0xff, red, green, blue);
             //        }
             //    }
@@ -492,7 +492,7 @@ namespace MAME.Core
             //    {
             //        for (i = 0; i < Video.fullwidth * Video.fullheight; i++)
             //        {
-            //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+            //            Video.bitmapcolor[i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
             //        }
             //    }
             //}
@@ -518,10 +518,10 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            red = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
-                            green = (int)(((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
-                            blue = (int)((Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]] & 0xff) * bright / 0xff);
-                            Video.bitmapcolorRect[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
+                            red = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff0000) >> 16) * bright / 0xff);
+                            green = (int)(((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff00) >> 8) * bright / 0xff);
+                            blue = (int)((Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]] & 0xff) * bright / 0xff);
+                            Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.make_argb(0xff, red, green, blue);
                         }
                     }
                 }
@@ -534,7 +534,7 @@ namespace MAME.Core
                         {
                             //i = y * Video.fullwidth + x;
                             i = stepIndex + x;
-                            Video.bitmapcolorRect[target_i] = (int)Palette.entry_color[Video.bitmapbase[Video.curbitmap][i]];
+                            Video.bitmapcolorRect_Ptrunsafe[target_i] = (int)Palette.entry_color[Video.bitmapbase_Ptrs[Video.curbitmap][i]];
                         }
                     }
                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/emu/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/emu/Video.cs
index 906897d..b003ef2 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/emu/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/emu/Video.cs
@@ -19,7 +19,7 @@ namespace MAME.Core
         public Atime vblank_end_time;
         public long frame_number;
     };
-    partial class Video
+    unsafe partial class Video
     {
         public static bool flip_screen_x, flip_screen_y;
         public static long frame_number_obj;
@@ -37,13 +37,19 @@ namespace MAME.Core
         private static uint throttle_history, overall_valid_counter, overall_real_seconds;
         private static int[] popcount;
         //public static ushort[][] bitmapbase;
-        public static int[][] bitmapbaseN;
+        //public static int[][] bitmapbaseN;
         //public static int[] bitmapcolor;
 
         /**  bitmapcolor的指针管理  **/
-        public static ushort[][] bitmapbase;
+        public static ushort[][] bitmapbase; //还有 部分 Array.Copy 在引用
         static GCHandle[] bitmapbase_handles;
-        public static IntPtr[] bitmapbase_Ptrs;
+        public static ushort*[] bitmapbase_Ptrs;
+        /**  end **/
+
+        /**  bitmapbaseN的指针管理  **/
+        public static int[][] bitmapbaseN; //还有 部分 Array.Copy 在引用
+        static GCHandle[] bitmapbaseN_handles;
+        public static int*[] bitmapbaseN_Ptrs;
         /**  end **/
 
         /**  bitmapcolor的指针管理  **/
@@ -52,10 +58,10 @@ namespace MAME.Core
         //static GCHandle bitmapcolor_handle;
         //public static IntPtr bitmapcolor_Ptr;
 
-
         public static int[] bitmapcolorRect;
         static GCHandle bitmapcolorRect_handle;
         public static IntPtr bitmapcolorRect_Ptr;
+        public static int* bitmapcolorRect_Ptrunsafe;
         /**  end **/
 
         public static int fullwidth, fullheight;
@@ -634,14 +640,36 @@ namespace MAME.Core
             if (bitmapbase != null)
             {
                 bitmapbase_handles = new GCHandle[bitmapbase.Length];
-                bitmapbase_Ptrs = new IntPtr[bitmapbase.Length];
+                bitmapbase_Ptrs = new ushort*[bitmapbase.Length];
                 for (int i = 0; i < bitmapbase.Length; i++)
                 {
                     bitmapbase_handles[i] = GCHandle.Alloc(bitmapbase[i], GCHandleType.Pinned);
-                    bitmapbase_Ptrs[i] = bitmapbase_handles[i].AddrOfPinnedObject();
+                    bitmapbase_Ptrs[i] = (ushort*)bitmapbase_handles[i].AddrOfPinnedObject();
+                }
+            }
+
+
+            if (bitmapbaseN_handles != null)
+            {
+                for (int i = 0; i < bitmapbaseN_handles.Length; i++)
+                {
+                    if (bitmapbaseN_handles[i].IsAllocated)
+                        bitmapbaseN_handles[i].Free();
+                }
+                bitmapbaseN_handles = null;
+                bitmapbaseN_Ptrs = null;
+            }
+
+            if (bitmapbaseN != null)
+            {
+                bitmapbaseN_handles = new GCHandle[bitmapbaseN.Length];
+                bitmapbaseN_Ptrs = new int*[bitmapbaseN.Length];
+                for (int i = 0; i < bitmapbaseN.Length; i++)
+                {
+                    bitmapbaseN_handles[i] = GCHandle.Alloc(bitmapbaseN[i], GCHandleType.Pinned);
+                    bitmapbaseN_Ptrs[i] = (int*)bitmapbaseN_handles[i].AddrOfPinnedObject();
                 }
             }
-            
 
             /**  end **/
 
@@ -674,6 +702,8 @@ namespace MAME.Core
             bitmapcolorRect_handle = GCHandle.Alloc(bitmapcolorRect, GCHandleType.Pinned);
             // 获取数组的指针  
             bitmapcolorRect_Ptr = bitmapcolorRect_handle.AddrOfPinnedObject();
+
+            bitmapcolorRect_Ptrunsafe = (int*)bitmapcolorRect_Ptr;
             /**  end **/
 
 
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Drawgfx.cs
index f090f15..b27fff7 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Drawgfx.cs
@@ -1,6 +1,6 @@
 namespace MAME.Core
 {
-    public partial class Drawgfx
+    public unsafe partial class Drawgfx
     {
         public static void common_drawgfx_gng(byte[] bb1, int code, int color, int flipx, int flipy, int sx, int sy, RECT clip)
         {
@@ -94,7 +94,7 @@
                     col = bb1[srcdata_offset + srcmodulo * i + j];
                     if (col != 0x0f)
                     {
-                        Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
                     }
                 }
             }
@@ -191,7 +191,7 @@
                     col = bb1[srcdata_offset + srcmodulo * i + j];
                     if (col != 0x0f)
                     {
-                        Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
                     }
                 }
             }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Tilemap.cs
index 6ec6620..c07957b 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Tilemap.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
 
 namespace MAME.Core
 {
-    public partial class Capcom
+    public unsafe partial class Capcom
     {
         public static void tilemap_init()
         {
@@ -193,7 +193,7 @@ namespace MAME.Core
             Tilemap.lsTmap.Add(tx_tilemap);
         }
     }
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tilemap_draw_instanceCapcom_gng(RECT cliprect, int xpos, int ypos)
         {
@@ -274,7 +274,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x100 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x100 + i] = pixmap[offsety2 * width + i - xpos];
                                     }
                                 }
                                 offsety2++;
@@ -373,7 +373,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
                                     }
                                 }
                                 offsety2++;
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Video.cs
index ff7042f..d41acad 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/capcom/Video.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class Capcom
+    public unsafe partial class Capcom
     {
         public static Tmap bg_tilemap, fg_tilemap, tx_tilemap;
         public static int bg_scrollx, fg_scrollx;
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Drawgfx.cs
index 279d1a0..7591942 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Drawgfx.cs
@@ -62,7 +62,7 @@
             int colorbase = 0x10 * color;
             blockmove_4toN_transpen_pri16(bb1, code, sw, sh, 0x10, ls, ts, flipx, flipy, dw, dh, colorbase, sy, sx, primask);
         }
-        private static void blockmove_4toN_transpen_pri16(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int offsety, int offsetx, uint primask)
+        private unsafe static void blockmove_4toN_transpen_pri16(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int offsety, int offsetx, uint primask)
         {
             int ydir, xdir, col, i, j;
             int srcdata_offset = code * 0x100;
@@ -97,7 +97,7 @@
                     {
                         if (((1 << (Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] & 0x1f)) & primask) == 0)
                         {
-                            Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                            Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
                         }
                         Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] = (byte)((Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] & 0x7f) | 0x1f);
                     }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Tilemap.cs
index 3996990..3703c07 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Tilemap.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class CPS
+    public unsafe partial class CPS
     {
         public static Tmap[] ttmap;
         public static void tilemap_init()
@@ -63,7 +63,7 @@ namespace MAME.Core
             ttmap[2].total_elements = CPS.gfxrom.Length / 0x200;
         }
     }
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tile_updateC0(int col, int row)
         {
@@ -376,7 +376,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
                                         Tilemap.priority_bitmap[offsety2 + ypos, i] = (byte)(Tilemap.priority_bitmap[offsety2 + ypos, i] | priority);
                                     }
                                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Video.cs
index c14f01e..7fbbaa0 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/cps/Video.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
 
 namespace MAME.Core
 {
-    public partial class CPS
+    public unsafe partial class CPS
     {
         private static int iXAll, iYAll, nBitmap;
         //private static Bitmap bmAll=new Bitmap(512,512);
@@ -646,7 +646,7 @@ namespace MAME.Core
                         sy = ((sy - stars2y) & 0xff) + 0x100;
                         col = (int)(((col & 0xe0) >> 1) + (Video.screenstate.frame_number / 16 & 0x0f));
                         if (sx >= Video.screenstate.visarea.min_x && sx <= Video.screenstate.visarea.max_x && sy >= Video.screenstate.visarea.min_y && sy <= Video.screenstate.visarea.max_y)
-                            Video.bitmapbase[Video.curbitmap][sy * 0x200 + sx] = (ushort)(0xa00 + col);
+                            Video.bitmapbase_Ptrs[Video.curbitmap][sy * 0x200 + sx] = (ushort)(0xa00 + col);
                     }
                 }
             }
@@ -663,7 +663,7 @@ namespace MAME.Core
                         sy = ((sy - stars1y) & 0xff) + 0x100;
                         col = (int)(((col & 0xe0) >> 1) + (Video.screenstate.frame_number / 16 & 0x0f));
                         if (sx >= Video.screenstate.visarea.min_x && sx <= Video.screenstate.visarea.max_x && sy >= Video.screenstate.visarea.min_y && sy <= Video.screenstate.visarea.max_y)
-                            Video.bitmapbase[Video.curbitmap][sy * 0x200 + sx] = (ushort)(0x800 + col);
+                            Video.bitmapbase_Ptrs[Video.curbitmap][sy * 0x200 + sx] = (ushort)(0x800 + col);
                     }
                 }
             }
@@ -703,7 +703,7 @@ namespace MAME.Core
                     break;
             }
         }
-        public static void video_update_cps1()
+        public unsafe static void video_update_cps1()
         {
             int i;
             int l0, l1, l2, l3;
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/dataeast/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/dataeast/Drawgfx.cs
index 843e6a9..209253d 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/dataeast/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/dataeast/Drawgfx.cs
@@ -1,6 +1,6 @@
 namespace MAME.Core
 {
-    public partial class Drawgfx
+    public unsafe partial class Drawgfx
     {
         public static void common_drawgfx_pcktgal(byte[] bb1, int gfxwidth, int gfxheight, int gfxsrcmodulo, int gfxtotal_elements, int code, int color, int flipx, int flipy, int sx, int sy, RECT clip)
         {
@@ -96,7 +96,7 @@
                     col = bb1[srcdata_offset + srcmodulo * i + j];
                     if (col != 0)
                     {
-                        Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
                     }
                 }
             }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/dataeast/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/dataeast/Tilemap.cs
index b38def3..e556e56 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/dataeast/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/dataeast/Tilemap.cs
@@ -35,7 +35,7 @@ namespace MAME.Core
             bg_tilemap.tile_update3 = bg_tilemap.tile_updatePcktgalbg;
         }
     }
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tile_updatePcktgalbg(int col, int row)
         {
@@ -172,7 +172,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x100 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x100 + i] = pixmap[offsety2 * width + i - xpos];
                                     }
                                 }
                                 offsety2++;
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/igs011/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/igs011/Video.cs
index bcce9ac..bf49558 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/igs011/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/igs011/Video.cs
@@ -34,7 +34,7 @@
             }
             lhb2_pen_hi = 0;
         }
-        public static void video_update_igs011()
+        public unsafe static void video_update_igs011()
         {
             int x, y, l, scr_addr, pri_addr;
             int pri_ram_offset;
@@ -53,7 +53,7 @@
                         }
                     }
                     l = priority_ram[pri_ram_offset + pri_addr] & 7;
-                    Video.bitmapbase[Video.curbitmap][y * 0x200 + x] = (ushort)(layer[l][scr_addr] | (l << 8));
+                    Video.bitmapbase_Ptrs[Video.curbitmap][y * 0x200 + x] = (ushort)(layer[l][scr_addr] | (l << 8));
                 }
             }
         }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Drawgfx.cs
index 82bec1c..31973ec 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Drawgfx.cs
@@ -1,6 +1,6 @@
 namespace MAME.Core
 {
-    public partial class Konami68000
+    public unsafe partial class Konami68000
     {
         public static void common_drawgfxzoom_konami68000(byte[] bb1, int code, int color, int flipx, int flipy, int sx, int sy, RECT clip, int transparent_color, int scalex, int scaley)
         {
@@ -93,7 +93,7 @@
                             c = bb1[source_baseoffset + srcoffset];
                             if (c != transparent_color)
                             {
-                                Video.bitmapbase[Video.curbitmap][(sy + i) * 0x200 + sx + j] = (ushort)(colorbase + c);
+                                Video.bitmapbase_Ptrs[Video.curbitmap][(sy + i) * 0x200 + sx + j] = (ushort)(colorbase + c);
                             }
                         }
                     }
@@ -193,7 +193,7 @@
                             {
                                 if (((1 << Tilemap.priority_bitmap[sy + i, sx + j]) & pri_mask) == 0)
                                 {
-                                    Video.bitmapbase[Video.curbitmap][(sy + i) * 0x200 + sx + j] = (ushort)(colorbase + c);
+                                    Video.bitmapbase_Ptrs[Video.curbitmap][(sy + i) * 0x200 + sx + j] = (ushort)(colorbase + c);
                                 }
                                 Tilemap.priority_bitmap[sy + i, sx + j] = 0x1f;
                             }
@@ -306,11 +306,11 @@
                         {
                             if ((Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] & 0x80) != 0)
                             {
-                                Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);//palette_shadow_table[paldata[col]];
+                                Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);//palette_shadow_table[paldata[col]];
                             }
                             else
                             {
-                                Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                                Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
                             }
                         }
                         Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] = (byte)((Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] & 0x7f) | 0x1f);
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Tilemap.cs
index 3ab49bb..b5d84d9 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Tilemap.cs
@@ -10,7 +10,7 @@ namespace MAME.Core
 
         }
     }
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tilemap_draw_instanceKonami68000(RECT cliprect, int xpos, int ypos)
         {
@@ -98,7 +98,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
                                         Tilemap.priority_bitmap[offsety2 + ypos, i] = (byte)(Tilemap.priority_bitmap[offsety2 + ypos, i] | priority);
                                     }
                                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Video.cs
index 8660257..5ce57e0 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/konami68000/Video.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class Konami68000
+    public unsafe partial class Konami68000
     {
         private static int[] layer_colorbase;
         private static int sprite_colorbase, bg_colorbase;
@@ -589,7 +589,7 @@ namespace MAME.Core
             Array.Clear(Tilemap.priority_bitmap, 0, 0x40000);
             for (i = 0; i < 0x20000; i++)
             {
-                Video.bitmapbase[Video.curbitmap][i] = (ushort)(16 * bg_colorbase);
+                Video.bitmapbase_Ptrs[Video.curbitmap][i] = (ushort)(16 * bg_colorbase);
             }
             K052109_tilemap[sorted_layer[0]].tilemap_draw_primask(Video.screenstate.visarea, 0x10, 1);
             K052109_tilemap[sorted_layer[1]].tilemap_draw_primask(Video.screenstate.visarea, 0x10, 2);
@@ -627,7 +627,7 @@ namespace MAME.Core
             Array.Clear(Tilemap.priority_bitmap, 0, 0x40000);
             for (i = 0; i < 0x20000; i++)
             {
-                Video.bitmapbase[Video.curbitmap][i] = (ushort)(16 * bg_colorbase);
+                Video.bitmapbase_Ptrs[Video.curbitmap][i] = (ushort)(16 * bg_colorbase);
             }
             K052109_tilemap[sorted_layer[0]].tilemap_draw_primask(Video.screenstate.visarea, 0x10, 1);
             if (layerpri[0] >= 0x30 && layerpri[1] < 0x30)
@@ -709,7 +709,7 @@ namespace MAME.Core
             Array.Clear(Tilemap.priority_bitmap, 0, 0x40000);
             for (i = 0; i < 0x20000; i++)
             {
-                Video.bitmapbase[Video.curbitmap][i] = (ushort)(16 * bg_colorbase);
+                Video.bitmapbase_Ptrs[Video.curbitmap][i] = (ushort)(16 * bg_colorbase);
             }
             K052109_tilemap[sorted_layer[0]].tilemap_draw_primask(Video.screenstate.visarea, 0x10, 1);
             K052109_tilemap[sorted_layer[1]].tilemap_draw_primask(Video.screenstate.visarea, 0x10, 2);
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/m72/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/m72/Drawgfx.cs
index 3d39b51..00f4dd2 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/m72/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/m72/Drawgfx.cs
@@ -1,6 +1,6 @@
 namespace MAME.Core
 {
-    public partial class Drawgfx
+    public unsafe partial class Drawgfx
     {
         public static void common_drawgfx_m72(byte[] bb1, int code, int color, int flipx, int flipy, int sx, int sy, RECT clip)
         {
@@ -94,7 +94,7 @@
                     col = bb1[srcdata_offset + srcmodulo * i + j];
                     if (col != 0)
                     {
-                        Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
                     }
                 }
             }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/m72/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/m72/Tilemap.cs
index 60dedae..512fb65 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/m72/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/m72/Tilemap.cs
@@ -220,7 +220,7 @@ namespace MAME.Core
             bg_tilemap_large.tile_update3 = bg_tilemap.tile_updateM72_bg_m72;
         }
     }
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tilemap_draw_instanceM72(RECT cliprect, int xpos, int ypos)
         {
@@ -289,7 +289,7 @@ namespace MAME.Core
                             {
                                 for (i = xpos + x_start; i < xpos + x_end; i++)
                                 {
-                                    Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * width + i - xpos] + palette_offset);
+                                    Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * width + i - xpos] + palette_offset);
                                 }
                                 offsety2++;
                             }
@@ -302,7 +302,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * width + i - xpos] + palette_offset);
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * width + i - xpos] + palette_offset);
                                     }
                                 }
                                 offsety2++;
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/m92/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/m92/Drawgfx.cs
index f36ac48..4944d81 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/m92/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/m92/Drawgfx.cs
@@ -61,7 +61,7 @@
             int colorbase = 0x10 * color;
             blockmove_8toN_transpen_pri16_m92(bb1, code, sw, sh, 0x10, ls, ts, flipx, flipy, dw, dh, colorbase, sy, sx, primask);
         }
-        public static void blockmove_8toN_transpen_pri16_m92(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int sy, int sx, uint primask)
+        public unsafe static void blockmove_8toN_transpen_pri16_m92(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int sy, int sx, uint primask)
         {
             int ydir, xdir, col, i, j;
             int offsetx = sx, offsety = sy;
@@ -99,11 +99,11 @@
                         {
                             if ((Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] & 0x80) != 0)
                             {
-                                Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = 0x800;
+                                Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = 0x800;
                             }
                             else
                             {
-                                Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                                Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x200 + offsetx + xdir * j] = (ushort)(colorbase + col);
                             }
                         }
                         Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] = (byte)((Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] & 0x7f) | 0x1f);
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/m92/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/m92/Tilemap.cs
index c358e35..5cadbab 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/m92/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/m92/Tilemap.cs
@@ -107,7 +107,7 @@ namespace MAME.Core
             }
         }
     }
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tilemap_draw_instanceM92(RECT cliprect, int xpos, int ypos)
         {
@@ -193,7 +193,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
                                         Tilemap.priority_bitmap[offsety2 + ypos, i] = (byte)(Tilemap.priority_bitmap[offsety2 + ypos, i] | priority);
                                     }
                                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/namcos1/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/namcos1/Drawgfx.cs
index 3d42a68..e0cd5b0 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/namcos1/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/namcos1/Drawgfx.cs
@@ -61,11 +61,11 @@
             int colorbase = 0x10 * color;
             blockmove_8toN_transpen_pri16(tx, ty, code, sw, sh, ls, ts, flipx, flipy, dw, dh, colorbase, sy, sx);
         }
-        private static void setpixelcolorNa(int offsety, int offsetx, int n)
+        private unsafe static void setpixelcolorNa(int offsety, int offsetx, int n)
         {
             if (Tilemap.priority_bitmap[offsety, offsetx] != 0x1f && Tilemap.priority_bitmap[offsety, offsetx] <= Namcos1.namcos1_pri)
             {
-                Video.bitmapbase[Video.curbitmap][offsety * 0x200 + offsetx] = (ushort)n;
+                Video.bitmapbase_Ptrs[Video.curbitmap][offsety * 0x200 + offsetx] = (ushort)n;
             }
             Tilemap.priority_bitmap[offsety, offsetx] = 0x1f;
         }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/namcos1/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/namcos1/Tilemap.cs
index 20c5c18..14be74c 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/namcos1/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/namcos1/Tilemap.cs
@@ -167,7 +167,7 @@ namespace MAME.Core
             }
             return (byte)(andmask ^ ormask);
         }
-        public void tilemap_draw_instanceNa(RECT cliprect, int xpos, int ypos)
+        public unsafe void tilemap_draw_instanceNa(RECT cliprect, int xpos, int ypos)
         {
             int mincol, maxcol;
             int x1, y1, x2, y2;
@@ -232,7 +232,7 @@ namespace MAME.Core
                             {
                                 for (i = xpos + x_start; i < xpos + x_end; i++)
                                 {
-                                    Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * 0x200 + i - xpos] + palette_offset);
+                                    Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * 0x200 + i - xpos] + palette_offset);
                                     Tilemap.priority_bitmap[offsety2 + ypos, i] = priority;
                                 }
                                 offsety2++;
@@ -246,7 +246,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * 0x200 + i - xpos] + palette_offset);
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * 0x200 + i - xpos] + palette_offset);
                                         Tilemap.priority_bitmap[offsety2 + ypos, i] = priority;
                                     }
                                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/neogeo/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/neogeo/Video.cs
index d1941a9..1648f21 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/neogeo/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/neogeo/Video.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class Neogeo
+    public unsafe partial class Neogeo
     {
         public static byte[] sprite_gfx;
         public static uint sprite_gfx_address_mask;
@@ -170,7 +170,7 @@ namespace MAME.Core
         //        sprite_list_offset = 0x8600;
         //    }
         //    Span<ushort> span_neogeo_videoram = neogeo_videoram.AsSpan();
-        //    Span<int> span_bitmapbaseN_iBitmap = Video.bitmapbaseN[iBitmap].AsSpan();
+        //    Span<int> span_bitmapbaseN_iBitmap = Video.bitmapbaseN_Ptrs[iBitmap].AsSpan();
         //    Span<byte> span_sprite_gfx = sprite_gfx.AsSpan();
         //    Span<int> span_pens = pens.AsSpan();
         //    for (max_sprite_index = 95; max_sprite_index >= 0; max_sprite_index--)
@@ -277,7 +277,7 @@ namespace MAME.Core
         //                        //if (sprite_gfx[gfx_offset] != 0)
         //                        if (span_sprite_gfx[gfx_offset] != 0)
         //                        {
-        //                            //Video.bitmapbaseN[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
+        //                            //Video.bitmapbaseN_Ptrs[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
         //                            span_bitmapbaseN_iBitmap[pixel_addr_offsety * 384 + pixel_addr_offsetx] = span_pens[line_pens_offset + span_sprite_gfx[gfx_offset]];
         //                        }
         //                        pixel_addr_offsetx++;
@@ -301,7 +301,7 @@ namespace MAME.Core
         //                            //if (sprite_gfx[gfx_offset] != 0)
         //                            if (span_sprite_gfx[gfx_offset] != 0)
         //                            {
-        //                                //Video.bitmapbaseN[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
+        //                                //Video.bitmapbaseN_Ptrs[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
         //                                span_bitmapbaseN_iBitmap[pixel_addr_offsety * 384 + pixel_addr_offsetx] = span_pens[line_pens_offset + span_sprite_gfx[gfx_offset]];
         //                            }
         //                            pixel_addr_offsetx++;
@@ -326,13 +326,14 @@ namespace MAME.Core
         {
 
             fixed (ushort* videoramPtr = &neogeo_videoram[0])
-            fixed (int* bitmapbasePtr = &Video.bitmapbaseN[iBitmap][0])
+            //fixed (int* bitmapbasePtr = &Video.bitmapbaseN_Ptrs[iBitmap][0])
             fixed (byte* spriteGfxPtr = &sprite_gfx[0])
             fixed (int* pensPtr = &pens[0])
             fixed (byte* zoomyromPtr = &zoomyrom[0])
             {
                 ushort* neogeo_videoram = videoramPtr;
-                int* bitmapbase = bitmapbasePtr;
+                //int* bitmapbase = bitmapbasePtr;
+                int* bitmapbase = &Video.bitmapbaseN_Ptrs[iBitmap][0];
                 byte* spriteGfx = spriteGfxPtr;
                 int* pens = pensPtr;
                 byte* zoomyrom = zoomyromPtr;
@@ -473,7 +474,7 @@ namespace MAME.Core
                                         //if (sprite_gfx[gfx_offset] != 0)
                                         if (spriteGfx[gfx_offset] != 0)
                                         {
-                                            //Video.bitmapbaseN[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
+                                            //Video.bitmapbaseN_Ptrs[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
                                             bitmapbase[pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + spriteGfx[gfx_offset]];
                                         }
                                         pixel_addr_offsetx++;
@@ -498,7 +499,7 @@ namespace MAME.Core
                                             //if (sprite_gfx[gfx_offset] != 0)
                                             if (spriteGfx[gfx_offset] != 0)
                                             {
-                                                //Video.bitmapbaseN[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
+                                                //Video.bitmapbaseN_Ptrs[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
                                                 bitmapbase[pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + spriteGfx[gfx_offset]];
                                             }
                                             pixel_addr_offsetx++;
@@ -639,7 +640,7 @@ namespace MAME.Core
         //                    {
         //                        if (sprite_gfx[gfx_offset] != 0)
         //                        {
-        //                            Video.bitmapbaseN[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
+        //                            Video.bitmapbaseN_Ptrs[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
         //                        }
         //                        pixel_addr_offsetx++;
         //                    }
@@ -661,7 +662,7 @@ namespace MAME.Core
         //                        {
         //                            if (sprite_gfx[gfx_offset] != 0)
         //                            {
-        //                                Video.bitmapbaseN[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
+        //                                Video.bitmapbaseN_Ptrs[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]];
         //                            }
         //                            pixel_addr_offsetx++;
         //                        }
@@ -814,7 +815,7 @@ namespace MAME.Core
                     }
                     if ((data & 0x0f) != 0)
                     {
-                        Video.bitmapbaseN[iBitmap][384 * scanline + 30 + x * 8 + i] = pens[char_pens_offset + (data & 0x0f)];
+                        Video.bitmapbaseN_Ptrs[iBitmap][384 * scanline + 30 + x * 8 + i] = pens[char_pens_offset + (data & 0x0f)];
                     }
                 }
                 video_data_offset += 0x20;
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/pgm/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/pgm/Tilemap.cs
index cbcb114..fa36f0c 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/pgm/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/pgm/Tilemap.cs
@@ -128,7 +128,7 @@ namespace MAME.Core
             }
             return (byte)(andmask ^ ormask);
         }
-        public void tilemap_draw_instancePgm(RECT cliprect, int xpos, int ypos)
+        public unsafe void tilemap_draw_instancePgm(RECT cliprect, int xpos, int ypos)
         {
             int mincol, maxcol;
             int x1, y1, x2, y2;
@@ -207,7 +207,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * width + i - xpos] + palette_offset);
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = (ushort)(pixmap[offsety2 * width + i - xpos] + palette_offset);
                                         Tilemap.priority_bitmap[offsety2 + ypos, i] = priority;
                                     }
                                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/pgm/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/pgm/Video.cs
index 3d02985..853eb09 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/pgm/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/pgm/Video.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class PGM
+    public unsafe partial class PGM
     {
         public static ushort[] pgm_spritebufferram; // buffered spriteram
         public static ushort[] sprite_temp_render;
@@ -48,13 +48,13 @@ namespace MAME.Core
                 {
                     if (pri == 0)
                     {
-                        Video.bitmapbase[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
+                        Video.bitmapbase_Ptrs[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
                     }
                     else
                     {
                         if ((Tilemap.priority_bitmap[ydrawpos, xdrawpos] & 2) == 0)
                         {
-                            Video.bitmapbase[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
+                            Video.bitmapbase_Ptrs[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
                         }
                     }
                 }
@@ -67,7 +67,7 @@ namespace MAME.Core
             {
                 if ((Tilemap.priority_bitmap[ydrawpos, xdrawpos] & 1) == 0)
                 {
-                    Video.bitmapbase[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
+                    Video.bitmapbase_Ptrs[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
                 }
                 Tilemap.priority_bitmap[ydrawpos, xdrawpos] |= 1;
             }
@@ -80,7 +80,7 @@ namespace MAME.Core
                 {
                     if ((Tilemap.priority_bitmap[ydrawpos, xdrawpos] & 2) == 0)
                     {
-                        Video.bitmapbase[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
+                        Video.bitmapbase_Ptrs[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
                     }
                 }
                 Tilemap.priority_bitmap[ydrawpos, xdrawpos] |= 1;
@@ -109,14 +109,14 @@ namespace MAME.Core
                     if ((srcdat & 0x8000) == 0)
                     {
                         if ((xdrawpos >= 0) && (xdrawpos < 448))
-                            Video.bitmapbase[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
+                            Video.bitmapbase_Ptrs[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
                     }
                     xcntdraw++;
                     xdrawpos = xpos + xcntdraw;
                     if ((srcdat & 0x8000) == 0)
                     {
                         if ((xdrawpos >= 0) && (xdrawpos < 448))
-                            Video.bitmapbase[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
+                            Video.bitmapbase_Ptrs[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
                     }
                     xcntdraw++;
                 }
@@ -130,7 +130,7 @@ namespace MAME.Core
                     if ((srcdat & 0x8000) == 0)
                     {
                         if ((xdrawpos >= 0) && (xdrawpos < 448))
-                            Video.bitmapbase[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
+                            Video.bitmapbase_Ptrs[Video.curbitmap][ydrawpos * 0x200 + xdrawpos] = srcdat;
                     }
                     xcntdraw++;
                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/suna8/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/suna8/Drawgfx.cs
index 2d85c70..57be215 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/suna8/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/suna8/Drawgfx.cs
@@ -61,7 +61,7 @@
             int colorbase = 0x10 * color;
             blockmove_8toN_transpen16_starfigh(bb1, code, sw, sh, 8, ls, ts, flipx, flipy, dw, dh, colorbase, sx, sy);
         }
-        public static void blockmove_8toN_transpen16_starfigh(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int offsetx, int offsety)
+        public unsafe static void blockmove_8toN_transpen16_starfigh(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int offsetx, int offsety)
         {
             int ydir, xdir, col, i, j;
             int srcdata_offset = code * 0x40;
@@ -94,7 +94,7 @@
                     col = bb1[srcdata_offset + srcmodulo * i + j];
                     if (col != 0x0f)
                     {
-                        Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
                     }
                 }
             }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Drawgfx.cs
index 61ca93d..0c501c1 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Drawgfx.cs
@@ -61,7 +61,7 @@
             int colorbase = 0x10 * color;
             blockmove_8toN_transpen16_bublbobl(bb1, code, sw, sh, 8, ls, ts, flipx, flipy, dw, dh, colorbase, sx, sy);
         }
-        public static void blockmove_8toN_transpen16_bublbobl(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int offsetx, int offsety)
+        public unsafe static void blockmove_8toN_transpen16_bublbobl(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int offsetx, int offsety)
         {
             int ydir, xdir, col, i, j;
             int srcdata_offset = code * 0x40;
@@ -94,7 +94,7 @@
                     col = bb1[srcdata_offset + srcmodulo * i + j];
                     if (col != 0x0f)
                     {
-                        Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
                     }
                 }
             }
@@ -162,7 +162,7 @@
             int colorbase = color * 0x10;
             blockmove_8toN_transpen_pri16_opwolf(bb1, code, sw, sh, 0x10, ls, ts, flipx, flipy, dw, dh, colorbase, pri_mask, sx, sy);
         }
-        public static void blockmove_8toN_transpen_pri16_opwolf(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo,
+        public unsafe static void blockmove_8toN_transpen_pri16_opwolf(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo,
                 int leftskip, int topskip, int flipx, int flipy,
                 int dstwidth, int dstheight, int colorbase, uint pmask, int sx, int sy)
         {
@@ -201,7 +201,7 @@
                     {
                         if (((1 << (Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] & 0x1f)) & pmask) == 0)
                         {
-                            Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x140 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                            Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x140 + offsetx + xdir * j] = (ushort)(colorbase + col);
                         }
                         Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] = (byte)((Tilemap.priority_bitmap[offsety + ydir * i, offsetx + xdir * j] & 0x7f) | 0x1f);
                     }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Tilemap.cs
index cbe45f8..4da5b1d 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Tilemap.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tilemap_draw_instanceTaito_opwolf(RECT cliprect, int xpos, int ypos)
         {
@@ -88,7 +88,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x140 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x140 + i] = pixmap[offsety2 * width + i - xpos];
                                         Tilemap.priority_bitmap[offsety2 + ypos, i] = (byte)(Tilemap.priority_bitmap[offsety2 + ypos, i] | priority);
                                     }
                                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Video.cs
index 2c8b521..7800120 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/taito/Video.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class Taito
+    public unsafe partial class Taito
     {
         public static byte[] gfx1rom, gfx2rom, gfx12rom, gfx22rom, prom;
         public static int bublbobl_objectram_size = 0x300;
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/taitob/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/taitob/Tilemap.cs
index 6ab8820..f6ee487 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/taitob/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/taitob/Tilemap.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class Taitob
+    public unsafe partial class Taitob
     {
         public static Tmap bg_tilemap, fg_tilemap, tx_tilemap;
         public static void tilemap_init()
@@ -95,7 +95,7 @@ namespace MAME.Core
             tx_tilemap.tile_update3 = tx_tilemap.tile_updateTaitobtx;
         }
     }
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tilemap_draw_instanceTaitob(RECT cliprect, int xpos, int ypos)
         {
@@ -181,7 +181,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x200 + i] = pixmap[offsety2 * width + i - xpos];
                                         Tilemap.priority_bitmap[offsety2 + ypos, i] = (byte)(Tilemap.priority_bitmap[offsety2 + ypos, i] | priority);
                                     }
                                 }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/taitob/Video.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/taitob/Video.cs
index 7049932..5daf418 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/taitob/Video.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/taitob/Video.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class Taitob
+    public unsafe partial class Taitob
     {
         public static ushort[][] framebuffer;
         public static ushort[] taitob_scroll, TC0180VCU_ram, taitob_spriteram, taitob_pixelram;
@@ -507,7 +507,7 @@ namespace MAME.Core
                             ushort c = framebuffer[framebuffer_page][y * 512 + x];
                             if (c != 0)
                             {
-                                Video.bitmapbase[Video.curbitmap][(255 - y) * 512 + 319 - x] = (ushort)(b_sp_color_base + c);
+                                Video.bitmapbase_Ptrs[Video.curbitmap][(255 - y) * 512 + 319 - x] = (ushort)(b_sp_color_base + c);
                             }
                         }
                     }
@@ -521,7 +521,7 @@ namespace MAME.Core
                             ushort c = framebuffer[framebuffer_page][y * 512 + x];
                             if (c != 0)
                             {
-                                Video.bitmapbase[Video.curbitmap][y * 512 + x] = (ushort)(b_sp_color_base + c);
+                                Video.bitmapbase_Ptrs[Video.curbitmap][y * 512 + x] = (ushort)(b_sp_color_base + c);
                             }
                         }
                     }
@@ -538,7 +538,7 @@ namespace MAME.Core
                             ushort c = framebuffer[framebuffer_page][y * 512 + x];
                             if ((c != 0) && ((c & 0x10) == priority))
                             {
-                                Video.bitmapbase[Video.curbitmap][(255 - y) * 512 + 319 - x] = (ushort)(b_sp_color_base + c);
+                                Video.bitmapbase_Ptrs[Video.curbitmap][(255 - y) * 512 + 319 - x] = (ushort)(b_sp_color_base + c);
                             }
                         }
                     }
@@ -552,7 +552,7 @@ namespace MAME.Core
                             ushort c = framebuffer[framebuffer_page][y * 512 + x];
                             if ((c != 0) && ((c & 0x10) == priority))
                             {
-                                Video.bitmapbase[Video.curbitmap][y * 512 + x] = (ushort)(b_sp_color_base + c);
+                                Video.bitmapbase_Ptrs[Video.curbitmap][y * 512 + x] = (ushort)(b_sp_color_base + c);
                             }
                         }
                     }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/tehkan/Drawgfx.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/tehkan/Drawgfx.cs
index ad3e677..94f5bdb 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/tehkan/Drawgfx.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/tehkan/Drawgfx.cs
@@ -63,7 +63,7 @@
             int colorbase = 8 * color;
             blockmove_8toN_transpen16_pbaction(bb1, code, sw, sh, sm, ls, ts, flipx, flipy, dw, dh, colorbase, sy, sx);
         }
-        public static void blockmove_8toN_transpen16_pbaction(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int offsety, int offsetx)
+        public unsafe static void blockmove_8toN_transpen16_pbaction(byte[] bb1, int code, int srcwidth, int srcheight, int srcmodulo, int leftskip, int topskip, int flipx, int flipy, int dstwidth, int dstheight, int colorbase, int offsety, int offsetx)
         {
             int ydir, xdir, col, i, j;
             int srcdata_offset = code * srcwidth * srcheight;
@@ -96,7 +96,7 @@
                     col = bb1[srcdata_offset + srcmodulo * i + j];
                     if (col != 0)
                     {
-                        Video.bitmapbase[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
+                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety + ydir * i) * 0x100 + offsetx + xdir * j] = (ushort)(colorbase + col);
                     }
                 }
             }
diff --git a/MAME.Unity/Assets/Plugins/UMAME/mame/tehkan/Tilemap.cs b/MAME.Unity/Assets/Plugins/UMAME/mame/tehkan/Tilemap.cs
index 7308777..e890b79 100644
--- a/MAME.Unity/Assets/Plugins/UMAME/mame/tehkan/Tilemap.cs
+++ b/MAME.Unity/Assets/Plugins/UMAME/mame/tehkan/Tilemap.cs
@@ -2,7 +2,7 @@
 
 namespace MAME.Core
 {
-    public partial class Tehkan
+    public unsafe partial class Tehkan
     {
         public static Tmap bg_tilemap, fg_tilemap;
         public static void tilemap_init()
@@ -62,7 +62,7 @@ namespace MAME.Core
             fg_tilemap.tile_update3 = fg_tilemap.tile_updatePbactionfg;
         }
     }
-    public partial class Tmap
+    public unsafe partial class Tmap
     {
         public void tile_updatePbactionbg(int col, int row)
         {
@@ -261,7 +261,7 @@ namespace MAME.Core
                                 {
                                     if ((flagsmap[offsety2, i - xpos] & mask) == value)
                                     {
-                                        Video.bitmapbase[Video.curbitmap][(offsety2 + ypos) * 0x100 + i] = pixmap[offsety2 * width + i - xpos];
+                                        Video.bitmapbase_Ptrs[Video.curbitmap][(offsety2 + ypos) * 0x100 + i] = pixmap[offsety2 * width + i - xpos];
                                     }
                                 }
                                 offsety2++;