AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Generic.cs

634 lines
22 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using cpu.m68000;
using System;
using System.Runtime.InteropServices;
namespace MAME.Core
{
public unsafe class Generic
{
//private static uint[] coin_count;
//private static uint[] coinlockedout;
//private static uint[] lastcoin;
//public static byte[] videoram, colorram;
//public static byte[] generic_nvram;
//public static byte[] buffered_spriteram;
//public static ushort[] buffered_spriteram16;
//public static byte[] spriteram;
//public static ushort[] spriteram16, spriteram16_2;
//public static byte[] paletteram, paletteram_2;
//public static ushort[] paletteram16, paletteram16_2;
#region //指针化coin_count
static uint[] coin_count_src;
static GCHandle coin_count_handle;
public static uint* coin_count;
public static int coin_countLength;
public static uint[] coin_count_set
{
set
{
coin_count_handle.ReleaseGCHandle();
coin_count_src = value;
coin_countLength = value.Length;
coin_count_src.GetObjectPtr(ref coin_count_handle, ref coin_count);
}
}
#endregion
#region //指针化coinlockedout
static uint[] coinlockedout_src;
static GCHandle coinlockedout_handle;
public static uint* coinlockedout;
public static int coinlockedoutLength;
public static uint[] coinlockedout_set
{
set
{
coinlockedout_handle.ReleaseGCHandle();
coinlockedout_src = value;
coinlockedoutLength = value.Length;
coinlockedout_src.GetObjectPtr(ref coinlockedout_handle, ref coinlockedout);
}
}
#endregion
#region //指针化lastcoin
static uint[] lastcoin_src;
static GCHandle lastcoin_handle;
public static uint* lastcoin;
public static int lastcoinLength;
public static uint[] lastcoin_set
{
set
{
lastcoin_handle.ReleaseGCHandle();
lastcoin_src = value;
lastcoinLength = value.Length;
lastcoin_src.GetObjectPtr(ref lastcoin_handle, ref lastcoin);
}
}
#endregion
#region //指针化colorram
static byte[] colorram_src;
static GCHandle colorram_handle;
public static byte* colorram;
public static int colorramLength;
public static byte[] colorram_set
{
set
{
colorram_handle.ReleaseGCHandle();
colorram_src = value;
colorramLength = value.Length;
colorram_src.GetObjectPtr(ref colorram_handle, ref colorram);
}
}
#endregion
#region //指针化videoram
static byte[] videoram_src;
static GCHandle videoram_handle;
public static byte* videoram;
public static int videoramLength;
public static byte[] videoram_set
{
set
{
videoram_handle.ReleaseGCHandle();
if (value == null)
return;
videoram_src = value;
videoramLength = value.Length;
videoram_src.GetObjectPtr(ref videoram_handle, ref videoram);
}
}
#endregion
#region //指针化generic_nvram
static byte[] generic_nvram_src;
static GCHandle generic_nvram_handle;
public static byte* generic_nvram;
public static int generic_nvramLength;
public static byte[] generic_nvram_set
{
set
{
generic_nvram_handle.ReleaseGCHandle();
generic_nvram_src = value;
generic_nvramLength = value.Length;
generic_nvram_src.GetObjectPtr(ref generic_nvram_handle, ref generic_nvram);
}
}
#endregion
#region //指针化buffered_spriteram
static byte[] buffered_spriteram_src;
static GCHandle buffered_spriteram_handle;
public static byte* buffered_spriteram;
public static int buffered_spriteramLength;
public static byte[] buffered_spriteram_set
{
set
{
buffered_spriteram_handle.ReleaseGCHandle();
buffered_spriteram_src = value;
buffered_spriteramLength = value.Length;
buffered_spriteram_src.GetObjectPtr(ref buffered_spriteram_handle, ref buffered_spriteram);
}
}
#endregion
#region //指针化buffered_spriteram16
static ushort[] buffered_spriteram16_src;
static GCHandle buffered_spriteram16_handle;
public static ushort* buffered_spriteram16;
public static int buffered_spriteram16Length;
public static ushort[] buffered_spriteram16_set
{
set
{
buffered_spriteram16_handle.ReleaseGCHandle();
buffered_spriteram16_src = value;
buffered_spriteram16Length = value.Length;
buffered_spriteram16_src.GetObjectPtr(ref buffered_spriteram16_handle, ref buffered_spriteram16);
}
}
#endregion
#region //指针化spriteram
static byte[] spriteram_src;
static GCHandle spriteram_handle;
public static byte* spriteram;
public static int spriteramLength;
public static byte[] spriteram_set
{
set
{
spriteram_handle.ReleaseGCHandle();
if (value == null)
return;
spriteram_src = value;
spriteramLength = value.Length;
spriteram_src.GetObjectPtr(ref spriteram_handle, ref spriteram);
}
}
#endregion
#region //指针化spriteram16
static ushort[] spriteram16_src;
static GCHandle spriteram16_handle;
public static ushort* spriteram16;
public static int spriteram16Length;
public static ushort[] spriteram16_set
{
set
{
spriteram16_handle.ReleaseGCHandle();
if (value == null)
return;
spriteram16_src = value;
spriteram16Length = value.Length;
spriteram16_src.GetObjectPtr(ref spriteram16_handle, ref spriteram16);
}
}
#endregion
#region //指针化spriteram16_2
static ushort[] spriteram16_2_src;
static GCHandle spriteram16_2_handle;
public static ushort* spriteram16_2;
public static int spriteram16_2Length;
public static ushort[] spriteram16_2_set
{
set
{
spriteram16_2_handle.ReleaseGCHandle();
if (value == null)
return;
spriteram16_2_src = value;
spriteram16_2Length = value.Length;
spriteram16_2_src.GetObjectPtr(ref spriteram16_2_handle, ref spriteram16_2);
}
}
#endregion
#region //指针化paletteram
static byte[] paletteram_src;
static GCHandle paletteram_handle;
public static byte* paletteram;
public static int paletteramLength;
public static byte[] paletteram_set
{
set
{
paletteram_handle.ReleaseGCHandle();
paletteram_src = value;
paletteramLength = value.Length;
paletteram_src.GetObjectPtr(ref paletteram_handle, ref paletteram);
}
}
#endregion
#region //指针化paletteram_2
static byte[] paletteram_2_src;
static GCHandle paletteram_2_handle;
public static byte* paletteram_2;
public static int paletteram_2Length;
public static byte[] paletteram_2_set
{
set
{
paletteram_2_handle.ReleaseGCHandle();
paletteram_2_src = value;
paletteram_2Length = value.Length;
paletteram_2_src.GetObjectPtr(ref paletteram_2_handle, ref paletteram_2);
}
}
#endregion
#region //指针化paletteram16
static ushort[] paletteram16_src;
static GCHandle paletteram16_handle;
public static ushort* paletteram16;
public static int paletteram16Length;
public static ushort[] paletteram16_set
{
set
{
paletteram16_handle.ReleaseGCHandle();
paletteram16_src = value;
paletteram16Length = value.Length;
paletteram16_src.GetObjectPtr(ref paletteram16_handle, ref paletteram16);
}
}
#endregion
#region //指针化paletteram16_2
static ushort[] paletteram16_2_src;
static GCHandle paletteram16_2_handle;
public static ushort* paletteram16_2;
public static int paletteram16_2Length;
public static ushort[] paletteram16_2_set
{
set
{
paletteram16_2_handle.ReleaseGCHandle();
paletteram16_2_src = value;
paletteram16_2Length = value.Length;
paletteram16_2_src.GetObjectPtr(ref paletteram16_2_handle, ref paletteram16_2);
}
}
#endregion
public static int[] interrupt_enable;
public static int objcpunum;
public static int flip_screen_x, flip_screen_y;
public static void generic_machine_init()
{
int counternum;
coin_count_set = new uint[8];
coinlockedout_set = new uint[8];
lastcoin_set = new uint[8];
for (counternum = 0; counternum < 8; counternum++)
{
lastcoin[counternum] = 0;
coinlockedout[counternum] = 0;
}
interrupt_enable = new int[8];
}
public static void coin_counter_w(int num, int on)
{
if (num >= 8)
{
return;
}
if (on != 0 && (lastcoin[num] == 0))
{
coin_count[num]++;
}
lastcoin[num] = (uint)on;
}
public static void coin_lockout_w(int num, int on)
{
if (num >= 8)
{
return;
}
coinlockedout[num] = (uint)on;
}
public static void coin_lockout_global_w(int on)
{
int i;
for (i = 0; i < 8; i++)
{
coin_lockout_w(i, on);
}
}
public static void nvram_load()
{
switch (Machine.sBoard)
{
case "Neo Geo":
Neogeo.nvram_handler_load_neogeo();
break;
/*case "Namco System 1":
Namcos1.nvram_handler_load_namcos1();
break;*/
}
}
public static void nvram_save()
{
switch (Machine.sBoard)
{
case "Neo Geo":
Neogeo.nvram_handler_save_neogeo();
break;
/*case "Namco System 1":
Namcos1.nvram_handler_save_namcos1();
break;*/
}
}
public static void watchdog_reset16_w()
{
Watchdog.watchdog_reset();
}
public static ushort watchdog_reset16_r()
{
Watchdog.watchdog_reset();
return 0xffff;
}
public static void nmi_0_line_pulse()
{
irqn_line_set(0, (int)LineState.INPUT_LINE_NMI, (int)LineState.PULSE_LINE);
}
public static void nmi_1_line_pulse()
{
irqn_line_set(1, (int)LineState.INPUT_LINE_NMI, (int)LineState.PULSE_LINE);
}
public static void irq_0_0_line_hold()
{
Cpuint.cpunum_set_input_line(0, 0, LineState.HOLD_LINE);
}
public static void irq_0_1_line_hold()
{
Cpuint.cpunum_set_input_line(0, 1, LineState.HOLD_LINE);
}
public static void irq_0_6_line_hold()
{
Cpuint.cpunum_set_input_line(0, 6, LineState.HOLD_LINE);
}
public static void irq_1_0_line_hold()
{
Cpuint.cpunum_set_input_line(1, 0, LineState.HOLD_LINE);
}
public static void irq_2_0_line_hold()
{
Cpuint.cpunum_set_input_line(2, 0, LineState.HOLD_LINE);
}
public static void watchdog_reset_w()
{
Watchdog.watchdog_reset();
}
public static void interrupt_reset()
{
int cpunum;
for (cpunum = 0; cpunum < Cpuexec.ncpu; cpunum++)
{
interrupt_enable[cpunum] = 1;
}
}
public static void clear_all_lines()
{
int inputcount = 0;
int line;
if (objcpunum == 0 && Cpuexec.cpu[0] == MC68000.m1)
{
inputcount = 8;
}
else
{
inputcount = 1;
}
Cpuint.cpunum_set_input_line(objcpunum, (int)LineState.INPUT_LINE_NMI, LineState.CLEAR_LINE);
for (line = 0; line < inputcount; line++)
{
Cpuint.cpunum_set_input_line(objcpunum, line, LineState.CLEAR_LINE);
}
}
public static void cpu_interrupt_enable(int cpunum, int enabled)
{
interrupt_enable[cpunum] = enabled;
if (enabled == 0)
{
objcpunum = cpunum;
EmuTimer.timer_set_internal(EmuTimer.TIME_ACT.Generic_clear_all_lines);
}
}
public static void interrupt_enable_w(byte data)
{
cpu_interrupt_enable(Cpuexec.activecpu, data);
}
public static void irqn_line_set(int cpunum, int line, int state)
{
if (interrupt_enable[cpunum] != 0)
{
Cpuint.cpunum_set_input_line(cpunum, line, (LineState)state);
}
}
public static void nmi_line_pulse0()
{
nmi_line_pulse(0);
}
public static void nmi_line_pulse(int cpunum)
{
irqn_line_set(cpunum, (int)LineState.INPUT_LINE_NMI, (int)LineState.PULSE_LINE);
}
public static void irq0_line_hold1()
{
irq0_line_hold(1);
}
public static void irq0_line_hold(int cpunum)
{
irqn_line_set(cpunum, 0, (int)LineState.HOLD_LINE);
}
public static void irq4_line_hold(int cpunum)
{
irqn_line_set(cpunum, 4, (int)LineState.HOLD_LINE);
}
public static void irq5_line_hold0()
{
irq5_line_hold(0);
}
public static void irq5_line_hold(int cpunum)
{
irqn_line_set(cpunum, 5, (int)LineState.HOLD_LINE);
}
public static ushort paletteram16_split(int offset)
{
return (ushort)(paletteram[offset] | (paletteram_2[offset] << 8));
}
public static void buffer_spriteram_w()
{
AxiArray.Copy(spriteram, buffered_spriteram, spriteramLength);
}
public static void buffer_spriteram16_w()
{
AxiArray.Copy(spriteram16, buffered_spriteram16, spriteram16Length);
}
public static ushort paletteram16_le(int offset)
{
return (ushort)(paletteram[offset & ~1] | (paletteram[offset | 1] << 8));
}
public static ushort paletteram16_be(int offset)
{
return (ushort)(paletteram[offset | 1] | (paletteram[offset & ~1] << 8));
}
public static void set_color_444(int color, int rshift, int gshift, int bshift, ushort data)
{
Palette.palette_set_callback(color, Palette.make_rgb(Palette.pal4bit((byte)(data >> rshift)), Palette.pal4bit((byte)(data >> gshift)), Palette.pal4bit((byte)(data >> bshift))));
}
public static void set_color_555(int color, int rshift, int gshift, int bshift, ushort data)
{
Palette.palette_set_callback(color, Palette.make_rgb(Palette.pal5bit((byte)(data >> rshift)), Palette.pal5bit((byte)(data >> gshift)), (int)Palette.pal5bit((byte)(data >> bshift))));
}
public static void updateflip()
{
int width = Video.screenstate.width;
int height = Video.screenstate.height;
long period = Video.screenstate.frame_period;
RECT visarea = Video.screenstate.visarea;
Tmap.tilemap_set_flip(null, (byte)((Tilemap.TILEMAP_FLIPX & flip_screen_x) | (Tilemap.TILEMAP_FLIPY & flip_screen_y)));
if (flip_screen_x != 0)
{
int temp;
temp = width - visarea.min_x - 1;
visarea.min_x = width - visarea.max_x - 1;
visarea.max_x = temp;
}
if (flip_screen_y != 0)
{
int temp;
temp = height - visarea.min_y - 1;
visarea.min_y = height - visarea.max_y - 1;
visarea.max_y = temp;
}
Video.video_screen_configure(width, height, visarea, period);
}
public static void flip_screen_set(int on)
{
flip_screen_x_set(on);
flip_screen_y_set(on);
}
public static void flip_screen_x_set(int on)
{
if (on != 0)
{
on = ~0;
}
if (flip_screen_x != on)
{
flip_screen_x = on;
updateflip();
}
}
public static void flip_screen_y_set(int on)
{
if (on != 0)
{
on = ~0;
}
if (flip_screen_y != on)
{
flip_screen_y = on;
updateflip();
}
}
public static int flip_screen_get()
{
return flip_screen_x;
}
public static void paletteram_xxxxBBBBGGGGRRRR_le_w(int offset, byte data)
{
paletteram[offset] = data;
set_color_444(offset / 2, 0, 4, 8, paletteram16_le(offset));
}
public static void paletteram16_xxxxRRRRGGGGBBBB_word_w(int offset, ushort data)
{
paletteram16[offset] = data;
set_color_444(offset, 8, 4, 0, paletteram16[offset]);
}
public static void paletteram16_xxxxRRRRGGGGBBBB_word_w1(int offset, byte data)
{
paletteram16[offset] = (ushort)((data << 8) | (paletteram16[offset] & 0xff));
set_color_444(offset, 8, 4, 0, paletteram16[offset]);
}
public static void paletteram16_xxxxRRRRGGGGBBBB_word_w2(int offset, byte data)
{
paletteram16[offset] = (ushort)((paletteram16[offset] & 0xff00) | data);
set_color_444(offset, 8, 4, 0, paletteram16[offset]);
}
public static void paletteram_RRRRGGGGBBBBxxxx_be_w(int offset, byte data)
{
paletteram[offset] = data;
set_color_444(offset / 2, 12, 8, 4, paletteram16_be(offset));
}
public static void paletteram_RRRRGGGGBBBBxxxx_split1_w(int offset, byte data)
{
paletteram[offset] = data;
set_color_444(offset, 12, 8, 4, paletteram16_split(offset));
}
public static void paletteram_RRRRGGGGBBBBxxxx_split2_w(int offset, byte data)
{
paletteram_2[offset] = data;
set_color_444(offset, 12, 8, 4, paletteram16_split(offset));
}
public static void paletteram16_xBBBBBGGGGGRRRRR_word_w(int offset, ushort data)
{
paletteram16[offset] = data;
set_color_555(offset, 0, 5, 10, paletteram16[offset]);
}
public static void paletteram16_xBBBBBGGGGGRRRRR_word_w1(int offset, byte data)
{
paletteram16[offset] = (ushort)((data << 8) | (paletteram16[offset] & 0xff));
set_color_555(offset, 0, 5, 10, paletteram16[offset]);
}
public static void paletteram16_xBBBBBGGGGGRRRRR_word_w2(int offset, byte data)
{
paletteram16[offset] = (ushort)((paletteram16[offset] & 0xff00) | data);
set_color_555(offset, 0, 5, 10, paletteram16[offset]);
}
public static void paletteram16_xRRRRRGGGGGBBBBB_word_w(int offset)
{
set_color_555(offset, 10, 5, 0, paletteram16[offset]);
}
public static void paletteram16_RRRRGGGGBBBBRGBx_word_w(int offset, ushort data)
{
paletteram16[offset] = data;
ushort data1 = paletteram16[offset];
//TODO 通道修改BGRA->RGBA
Palette.palette_set_callback(offset, (uint)((Palette.pal5bit((byte)(((data1 >> 11) & 0x1e) | ((data1 >> 3) & 0x01))) << 16) | (Palette.pal5bit((byte)(((data >> 7) & 0x1e) | ((data >> 2) & 0x01))) << 8) | Palette.pal5bit((byte)(((data >> 3) & 0x1e) | ((data >> 1) & 0x01)))));
}
public static void paletteram16_RRRRGGGGBBBBRGBx_word_w1(int offset, byte data)
{
paletteram16[offset] = (ushort)((data << 8) | (paletteram16[offset] & 0xff));
ushort data1 = paletteram16[offset];
//TODO 通道修改BGRA->RGBA
Palette.palette_set_callback(offset, (uint)((Palette.pal5bit((byte)(((data1 >> 11) & 0x1e) | ((data1 >> 3) & 0x01))) << 16) | (Palette.pal5bit((byte)(((data >> 7) & 0x1e) | ((data >> 2) & 0x01))) << 8) | Palette.pal5bit((byte)(((data >> 3) & 0x1e) | ((data >> 1) & 0x01)))));
}
public static void paletteram16_RRRRGGGGBBBBRGBx_word_w2(int offset, byte data)
{
paletteram16[offset] = (ushort)((paletteram16[offset] & 0xff00) | data);
ushort data1 = paletteram16[offset];
//TODO 通道修改BGRA->RGBA
Palette.palette_set_callback(offset, (uint)((Palette.pal5bit((byte)(((data1 >> 11) & 0x1e) | ((data1 >> 3) & 0x01))) << 16) | (Palette.pal5bit((byte)(((data >> 7) & 0x1e) | ((data >> 2) & 0x01))) << 8) | Palette.pal5bit((byte)(((data >> 3) & 0x1e) | ((data >> 1) & 0x01)))));
}
}
}