From 96039886f43cb4f4da319a5e73cb01c821be1d94 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Mon, 17 Nov 2025 01:29:37 +0800 Subject: [PATCH] =?UTF-8?q?MAME:NEOGEO=20=E6=8A=8A=E9=AB=98=E9=A2=91sprite?= =?UTF-8?q?=E9=A2=91=E5=A4=84=E7=90=86=E4=BB=8E=E4=BC=98=E5=8C=96=E5=90=8E?= =?UTF-8?q?=E7=9A=84=E6=8C=87=E9=92=88=E5=8C=96=E7=9A=84unsafe=E6=95=B0?= =?UTF-8?q?=E7=BB=84=EF=BC=8C=E5=BE=AA=E7=8E=AF=E7=9B=B4=E6=8E=A5=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=8C=87=E9=92=88=E6=8E=A8=E8=BF=9B=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E9=87=8D=E6=96=B0=E8=AE=A1=E7=AE=97=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=EF=BC=8C=E4=BA=89=E5=8F=96=E5=88=B0=E4=BA=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Plugins/Mame.Core/mame/neogeo/Video.cs | 192 ++++++++++-------- .../Assets/Plugins/Mame.Core/sound/YM2610.cs | 11 +- 2 files changed, 119 insertions(+), 84 deletions(-) diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Video.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Video.cs index a7163d63..6f3e02d6 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Video.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Video.cs @@ -354,7 +354,8 @@ namespace MAME.Core /// unsafe private static void draw_sprites(int iBitmap, int scanline) { - + int pixel_addr_offsety = scanline; + int pixel_addr_offsety_x_384 = pixel_addr_offsety * 384; fixed (ushort* videoramPtr = &neogeo_videoram[0]) //fixed (int* bitmapbasePtr = &Video.bitmapbaseN_Ptrs[iBitmap][0]) fixed (byte* spriteGfxPtr = &sprite_gfx[0]) @@ -499,55 +500,70 @@ namespace MAME.Core { x_inc = 1; } - int pixel_addr_offsetx, pixel_addr_offsety; - int pixel_addr_offsety_x_384 = scanline * 384; + //int pixel_addr_offsetx; if (x <= 0x01f0) { int i; - pixel_addr_offsetx = x + NEOGEO_HBEND; - pixel_addr_offsety = scanline; + //pixel_addr_offsetx = x + NEOGEO_HBEND; + int* pixel_ptr = &bitmapbase[pixel_addr_offsety_x_384 + x + NEOGEO_HBEND]; + int* zoom_x_tablePtr = &zoom_x_tables[zoom_x_table_offset]; + byte* spriteGfx_offset_Ptr = &spriteGfx[gfx_offset]; for (i = 0; i < 0x10; i++) { //if (zoom_x_tables[zoom_x, zoom_x_table_offset] != 0) - if (zoom_x_tables[zoom_x_table_offset] != 0) + //if (zoom_x_tables[zoom_x_table_offset] != 0) + if (*zoom_x_tablePtr != 0) { //if (sprite_gfx[gfx_offset] != 0) - if (spriteGfx[gfx_offset] != 0) + //if (spriteGfx[gfx_offset] != 0) + if (*spriteGfx_offset_Ptr != 0) { //Video.bitmapbaseN_Ptrs[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]]; - bitmapbase[pixel_addr_offsety_x_384 + pixel_addr_offsetx] = pens[line_pens_offset + spriteGfx[gfx_offset]]; + //bitmapbase[pixel_addr_offsety_x_384 + pixel_addr_offsetx] = pens[line_pens_offset + spriteGfx[gfx_offset]]; + *pixel_ptr = pens[line_pens_offset + *spriteGfx_offset_Ptr]; } - pixel_addr_offsetx++; + //pixel_addr_offsetx++; + pixel_ptr++; } - zoom_x_table_offset++; - gfx_offset += x_inc; + //zoom_x_table_offset++; + zoom_x_tablePtr++; + //gfx_offset += x_inc; + spriteGfx_offset_Ptr += x_inc; } } else { int i; int x_save = x; - pixel_addr_offsetx = NEOGEO_HBEND; - pixel_addr_offsety = scanline; + //pixel_addr_offsetx = NEOGEO_HBEND; + int* pixel_ptr = &bitmapbase[pixel_addr_offsety_x_384 + NEOGEO_HBEND]; + int* zoom_x_tablePtr = &zoom_x_tables[zoom_x_table_offset]; + byte* spriteGfx_offset_Ptr = &spriteGfx[gfx_offset]; for (i = 0; i < 0x10; i++) { //if (zoom_x_tables[zoom_x, zoom_x_table_offset] != 0) - if (zoom_x_tables[zoom_x_table_offset] != 0) + //if (zoom_x_tables[zoom_x_table_offset] != 0) + if (*zoom_x_tablePtr != 0) { if (x >= 0x200) { //if (sprite_gfx[gfx_offset] != 0) - if (spriteGfx[gfx_offset] != 0) + //if (spriteGfx[gfx_offset] != 0) + if (*spriteGfx_offset_Ptr != 0) { //Video.bitmapbaseN_Ptrs[iBitmap][pixel_addr_offsety * 384 + pixel_addr_offsetx] = pens[line_pens_offset + sprite_gfx[gfx_offset]]; - bitmapbase[pixel_addr_offsety_x_384 + pixel_addr_offsetx] = pens[line_pens_offset + spriteGfx[gfx_offset]]; + //bitmapbase[pixel_addr_offsety_x_384 + pixel_addr_offsetx] = pens[line_pens_offset + spriteGfx[gfx_offset]]; + *pixel_ptr = pens[line_pens_offset + *spriteGfx_offset_Ptr]; } - pixel_addr_offsetx++; + //pixel_addr_offsetx++; + pixel_ptr++; } x++; } - zoom_x_table_offset++; - gfx_offset += x_inc; + //zoom_x_table_offset++; + zoom_x_tablePtr++; + //gfx_offset += x_inc; + spriteGfx_offset_Ptr += x_inc; } x = x_save; } @@ -796,79 +812,91 @@ namespace MAME.Core static int[] garouoffsets = new int[32]; private static void draw_fixed_layer(int iBitmap, int scanline) { - int i, j, x, y; - byte[] gfx_base; - //int[] garouoffsets = new int[32], pix_offsets = new int[] { 0x10, 0x18, 0x00, 0x08 }; - int addr_mask; - int gfx_offset, char_pens_offset; - byte data; - bool banked; - int garoubank, k, code; - ushort code_and_palette; - if (fixed_layer_source != 0) + + fixed (ushort* videoramPtr = &neogeo_videoram[0]) { - gfx_base = fixedrom; - addr_mask = fixedrom.Length - 1; - } - else - { - gfx_base = fixedbiosrom; - addr_mask = fixedbiosrom.Length - 1; - } - int video_data_offset = 0x7000 | (scanline >> 3); - banked = (fixed_layer_source != 0) && (addr_mask > 0x1ffff); - if (banked && neogeo_fixed_layer_bank_type == 1) - { - garoubank = 0; - k = 0; - y = 0; - while (y < 32) + + int* bitmapbase = &Video.bitmapbaseN_Ptrs[iBitmap][0]; + + int scanline_x_384 = 384 * scanline; + int i, j, x, y; + byte[] gfx_base; + //int[] garouoffsets = new int[32], pix_offsets = new int[] { 0x10, 0x18, 0x00, 0x08 }; + int addr_mask; + int gfx_offset, char_pens_offset; + byte data; + bool banked; + int garoubank, k, code; + ushort code_and_palette; + if (fixed_layer_source != 0) { - if (neogeo_videoram[0x7500 + k] == 0x0200 && (neogeo_videoram[0x7580 + k] & 0xff00) == 0xff00) + gfx_base = fixedrom; + addr_mask = fixedrom.Length - 1; + } + else + { + gfx_base = fixedbiosrom; + addr_mask = fixedbiosrom.Length - 1; + } + int video_data_offset = 0x7000 | (scanline >> 3); + banked = (fixed_layer_source != 0) && (addr_mask > 0x1ffff); + if (banked && neogeo_fixed_layer_bank_type == 1) + { + garoubank = 0; + k = 0; + y = 0; + while (y < 32) { - garoubank = neogeo_videoram[0x7580 + k] & 3; + if (videoramPtr[0x7500 + k] == 0x0200 && (videoramPtr[0x7580 + k] & 0xff00) == 0xff00) + { + garoubank = videoramPtr[0x7580 + k] & 3; + garouoffsets[y++] = garoubank; + } garouoffsets[y++] = garoubank; + k += 2; } - garouoffsets[y++] = garoubank; - k += 2; } - } - for (x = 0; x < 40; x++) - { - code_and_palette = neogeo_videoram[video_data_offset]; - code = code_and_palette & 0x0fff; - if (banked) + y = scanline >> 3; + int temp_yvale = 0x7500 + ((y - 1) & 31); + for (x = 0; x < 40; x++) { - y = scanline >> 3; - switch (neogeo_fixed_layer_bank_type) + code_and_palette = videoramPtr[video_data_offset]; + code = code_and_palette & 0x0fff; + if (banked) { - case 1: - code += 0x1000 * (garouoffsets[(y - 2) & 31] ^ 3); - break; - case 2: - code += 0x1000 * (((neogeo_videoram[0x7500 + ((y - 1) & 31) + 32 * (x / 6)] >> (5 - (x % 6)) * 2) & 3) ^ 3); - break; + //y = scanline >> 3; + switch (neogeo_fixed_layer_bank_type) + { + case 1: + code += 0x1000 * (garouoffsets[(y - 2) & 31] ^ 3); + break; + case 2: + code += 0x1000 * (((videoramPtr[temp_yvale + 32 * (x / 6)] >> (5 - (x % 6)) * 2) & 3) ^ 3); + break; + } } + data = 0; + gfx_offset = ((code << 5) | (scanline & 0x07)) & addr_mask; + char_pens_offset = code_and_palette >> 12 << 4; + + int temp_xval = scanline_x_384 + 30 + x * 8; + for (i = 0; i < 8; i++) + { + if ((i & 0x01) != 0) + { + data = (byte)(data >> 4); + } + else + { + data = gfx_base[gfx_offset + pix_offsets[i >> 1]]; + } + if ((data & 0x0f) != 0) + { + bitmapbase[/*scanline_x_384 + 30 + x * 8*/temp_xval + i] = pens[char_pens_offset + (data & 0x0f)]; + } + } + video_data_offset += 0x20; } - data = 0; - gfx_offset = ((code << 5) | (scanline & 0x07)) & addr_mask; - char_pens_offset = code_and_palette >> 12 << 4; - for (i = 0; i < 8; i++) - { - if ((i & 0x01) != 0) - { - data = (byte)(data >> 4); - } - else - { - data = gfx_base[gfx_offset + pix_offsets[i >> 1]]; - } - if ((data & 0x0f) != 0) - { - Video.bitmapbaseN_Ptrs[iBitmap][384 * scanline + 30 + x * 8 + i] = pens[char_pens_offset + (data & 0x0f)]; - } - } - video_data_offset += 0x20; } } private static void optimize_sprite_data() diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2610.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2610.cs index 4c3c0868..56712202 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2610.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2610.cs @@ -544,6 +544,9 @@ namespace MAME.Core } OPN.refresh_fc_eg_chan(F2610.OPN.type, 4); OPN.refresh_fc_eg_chan(F2610.OPN.type, 5); + + int* streamoutput_0_offset_ptr = &Sound.ym2610stream.streamoutput_Ptrs[0][offset]; + int* streamoutput_1_offset_ptr = &Sound.ym2610stream.streamoutput_Ptrs[1][offset]; for (i = 0; i < length; i++) { OPN.advance_lfo(); @@ -601,8 +604,12 @@ namespace MAME.Core lt = Math.Max(lt, -32768); rt = Math.Min(rt, 32767); rt = Math.Max(rt, -32768); - Sound.ym2610stream.streamoutput_Ptrs[0][offset + i] = lt; - Sound.ym2610stream.streamoutput_Ptrs[1][offset + i] = rt; + //Sound.ym2610stream.streamoutput_Ptrs[0][offset + i] = lt; + *streamoutput_0_offset_ptr = lt; + streamoutput_0_offset_ptr++; + //Sound.ym2610stream.streamoutput_Ptrs[1][offset + i] = rt; + *streamoutput_1_offset_ptr = rt; + streamoutput_1_offset_ptr++; } } public void ym2610b_update_one(int offset, int length)