AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM3812.cs

383 lines
17 KiB
C#

using System.IO;
namespace MAME.Core
{
public class YM3812
{
public static EmuTimer.emu_timer[] timer;
public delegate void ym3812_delegate(LineState linestate);
public static ym3812_delegate ym3812handler;
public static void IRQHandler_3812(int irq)
{
if (ym3812handler != null)
{
ym3812handler(irq != 0 ? LineState.ASSERT_LINE : LineState.CLEAR_LINE);
}
}
public static void timer_callback_3812_0()
{
FMOpl.ym3812_timer_over(0);
}
public static void timer_callback_3812_1()
{
FMOpl.ym3812_timer_over(1);
}
private static void TimerHandler_3812(int c, Atime period)
{
if (Attotime.attotime_compare(period, Attotime.ATTOTIME_ZERO) == 0)
{
EmuTimer.timer_enable(timer[c], false);
}
else
{
EmuTimer.timer_adjust_periodic(timer[c], period, Attotime.ATTOTIME_NEVER);
}
}
public static void _stream_update_3812(int interval)
{
Sound.ym3812stream.stream_update();
}
public static void ym3812_start(int clock)
{
FMOpl.tl_tab = new int[0x1800];
FMOpl.sin_tab = new uint[0x1000];
timer = new EmuTimer.emu_timer[2];
int rate = clock / 72;
switch (Machine.sName)
{
case "pcktgal":
case "pcktgalb":
case "pcktgal2":
case "pcktgal2j":
case "spool3":
case "spool3i":
ym3812handler = null;
break;
case "starfigh":
ym3812handler = null;
break;
case "drgnwrld":
case "drgnwrldv30":
case "drgnwrldv21":
case "drgnwrldv21j":
case "drgnwrldv20j":
case "drgnwrldv10c":
case "drgnwrldv11h":
case "drgnwrldv40k":
ym3812handler = null;
break;
default:
ym3812handler = null;
break;
}
FMOpl.ym3812_init(0, clock, rate);
FMOpl.ym3812_set_timer_handler(TimerHandler_3812);
FMOpl.ym3812_set_irq_handler(IRQHandler_3812);
FMOpl.ym3812_set_update_handler(_stream_update_3812);
timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM3812_timer_callback_3812_0, false);
timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM3812_timer_callback_3812_1, false);
}
public static void ym3812_control_port_0_w(byte data)
{
FMOpl.ym3812_write(0, data);
}
public static void ym3812_write_port_0_w(byte data)
{
FMOpl.ym3812_write(1, data);
}
public static void SaveStateBinary(BinaryWriter writer)
{
int i, j;
for (i = 0; i < 9; i++)
{
writer.Write(FMOpl.YM3812.P_CH[i].block_fnum);
writer.Write(FMOpl.YM3812.P_CH[i].kcode);
for (j = 0; j < 2; j++)
{
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].ar);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].dr);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].rr);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].KSR);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].ksl);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].ksr);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].mul);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].Cnt);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].FB);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].op1_out[0]);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].op1_out[1]);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].CON);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].eg_type);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].state);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].TL);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].volume);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].sl);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].key);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].AMmask);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].vib);
writer.Write(FMOpl.YM3812.P_CH[i].SLOT[j].wavetable);
}
}
writer.Write(FMOpl.YM3812.eg_cnt);
writer.Write(FMOpl.YM3812.eg_timer);
writer.Write(FMOpl.YM3812.rhythm);
writer.Write(FMOpl.YM3812.lfo_am_depth);
writer.Write(FMOpl.YM3812.lfo_pm_depth_range);
writer.Write(FMOpl.YM3812.lfo_am_cnt);
writer.Write(FMOpl.YM3812.lfo_pm_cnt);
writer.Write(FMOpl.YM3812.noise_rng);
writer.Write(FMOpl.YM3812.noise_p);
writer.Write(FMOpl.YM3812.wavesel);
for (i = 0; i < 2; i++)
{
writer.Write(FMOpl.YM3812.T[i]);
}
for (i = 0; i < 2; i++)
{
writer.Write(FMOpl.YM3812.st[i]);
}
writer.Write(FMOpl.YM3812.address);
writer.Write(FMOpl.YM3812.status);
writer.Write(FMOpl.YM3812.statusmask);
writer.Write(FMOpl.YM3812.mode);
}
public static void LoadStateBinary(BinaryReader reader)
{
int i, j;
for (i = 0; i < 9; i++)
{
FMOpl.YM3812.P_CH[i].block_fnum = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].kcode = reader.ReadByte();
for (j = 0; j < 2; j++)
{
FMOpl.YM3812.P_CH[i].SLOT[j].ar = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].dr = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].rr = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].KSR = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].ksl = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].ksr = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].mul = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].Cnt = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].FB = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].op1_out[0] = reader.ReadInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].op1_out[1] = reader.ReadInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].CON = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].eg_type = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].state = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].TL = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].volume = reader.ReadInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].sl = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].key = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].AMmask = reader.ReadUInt32();
FMOpl.YM3812.P_CH[i].SLOT[j].vib = reader.ReadByte();
FMOpl.YM3812.P_CH[i].SLOT[j].wavetable = reader.ReadUInt16();
}
}
FMOpl.YM3812.eg_cnt = reader.ReadUInt32();
FMOpl.YM3812.eg_timer = reader.ReadUInt32();
FMOpl.YM3812.rhythm = reader.ReadByte();
FMOpl.YM3812.lfo_am_depth = reader.ReadByte();
FMOpl.YM3812.lfo_pm_depth_range = reader.ReadByte();
FMOpl.YM3812.lfo_am_cnt = reader.ReadUInt32();
FMOpl.YM3812.lfo_pm_cnt = reader.ReadUInt32();
FMOpl.YM3812.noise_rng = reader.ReadUInt32();
FMOpl.YM3812.noise_p = reader.ReadUInt32();
FMOpl.YM3812.wavesel = reader.ReadByte();
for (i = 0; i < 2; i++)
{
FMOpl.YM3812.T[i] = reader.ReadUInt32();
}
for (i = 0; i < 2; i++)
{
FMOpl.YM3812.st[i] = reader.ReadByte();
}
FMOpl.YM3812.address = reader.ReadByte();
FMOpl.YM3812.status = reader.ReadByte();
FMOpl.YM3812.statusmask = reader.ReadByte();
FMOpl.YM3812.mode = reader.ReadByte();
}
public static void IRQHandler_3526(int irq)
{
if (ym3812handler != null)
{
ym3812handler(irq != 0 ? LineState.ASSERT_LINE : LineState.CLEAR_LINE);
}
}
public static void timer_callback_3526_0()
{
FMOpl.ym3526_timer_over(0);
}
public static void timer_callback_3526_1()
{
FMOpl.ym3812_timer_over(1);
}
public static void TimerHandler_3526(int c, Atime period)
{
if (Attotime.attotime_compare(period, Attotime.ATTOTIME_ZERO) == 0)
{
EmuTimer.timer_enable(timer[c], false);
}
else
{
EmuTimer.timer_adjust_periodic(timer[c], period, Attotime.ATTOTIME_NEVER);
}
}
public static void _stream_update_3526(int interval)
{
Sound.ym3526stream.stream_update();
}
public static void ym3526_start(int clock)
{
int rate = clock / 72;
FMOpl.YM3526 = FMOpl.ym3526_init(0, clock, rate);
timer = new EmuTimer.emu_timer[2];
FMOpl.ym3526_set_timer_handler(TimerHandler_3526);
FMOpl.ym3526_set_irq_handler(IRQHandler_3526);
FMOpl.ym3526_set_update_handler(_stream_update_3526);
timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM3812_timer_callback_3526_0, false);
timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM3812_timer_callback_3526_1, false);
}
public static void ym3526_control_port_0_w(byte data)
{
FMOpl.ym3526_write(0, data);
}
public static void ym3526_write_port_0_w(byte data)
{
FMOpl.ym3526_write(1, data);
}
public static byte ym3526_status_port_0_r()
{
return FMOpl.ym3526_read(0);
}
public static byte ym3526_read_port_0_r()
{
return FMOpl.ym3526_read(1);
}
public static void ym3526_control_port_1_w(byte data)
{
FMOpl.ym3526_write(0, data);
}
public static void ym3526_write_port_1_w(byte data)
{
FMOpl.ym3526_write(1, data);
}
public static byte ym3526_status_port_1_r()
{
return FMOpl.ym3526_read(0);
}
public static byte ym3526_read_port_1_r()
{
return FMOpl.ym3526_read(1);
}
public static void SaveStateBinary_YM3526(BinaryWriter writer)
{
int i, j;
for (i = 0; i < 9; i++)
{
writer.Write(FMOpl.YM3526.P_CH[i].block_fnum);
writer.Write(FMOpl.YM3526.P_CH[i].kcode);
for (j = 0; j < 2; j++)
{
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].ar);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].dr);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].rr);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].KSR);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].ksl);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].ksr);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].mul);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].Cnt);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].FB);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].op1_out[0]);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].op1_out[1]);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].CON);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].eg_type);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].state);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].TL);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].volume);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].sl);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].key);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].AMmask);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].vib);
writer.Write(FMOpl.YM3526.P_CH[i].SLOT[j].wavetable);
}
}
writer.Write(FMOpl.YM3526.eg_cnt);
writer.Write(FMOpl.YM3526.eg_timer);
writer.Write(FMOpl.YM3526.rhythm);
writer.Write(FMOpl.YM3526.lfo_am_depth);
writer.Write(FMOpl.YM3526.lfo_pm_depth_range);
writer.Write(FMOpl.YM3526.lfo_am_cnt);
writer.Write(FMOpl.YM3526.lfo_pm_cnt);
writer.Write(FMOpl.YM3526.noise_rng);
writer.Write(FMOpl.YM3526.noise_p);
writer.Write(FMOpl.YM3526.wavesel);
for (i = 0; i < 2; i++)
{
writer.Write(FMOpl.YM3526.T[i]);
}
for (i = 0; i < 2; i++)
{
writer.Write(FMOpl.YM3526.st[i]);
}
writer.Write(FMOpl.YM3526.address);
writer.Write(FMOpl.YM3526.status);
writer.Write(FMOpl.YM3526.statusmask);
writer.Write(FMOpl.YM3526.mode);
}
public static void LoadStateBinary_YM3526(BinaryReader reader)
{
int i, j;
for (i = 0; i < 9; i++)
{
FMOpl.YM3526.P_CH[i].block_fnum = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].kcode = reader.ReadByte();
for (j = 0; j < 2; j++)
{
FMOpl.YM3526.P_CH[i].SLOT[j].ar = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].dr = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].rr = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].KSR = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].ksl = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].ksr = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].mul = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].Cnt = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].FB = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].op1_out[0] = reader.ReadInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].op1_out[1] = reader.ReadInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].CON = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].eg_type = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].state = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].TL = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].volume = reader.ReadInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].sl = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].key = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].AMmask = reader.ReadUInt32();
FMOpl.YM3526.P_CH[i].SLOT[j].vib = reader.ReadByte();
FMOpl.YM3526.P_CH[i].SLOT[j].wavetable = reader.ReadUInt16();
}
}
FMOpl.YM3526.eg_cnt = reader.ReadUInt32();
FMOpl.YM3526.eg_timer = reader.ReadUInt32();
FMOpl.YM3526.rhythm = reader.ReadByte();
FMOpl.YM3526.lfo_am_depth = reader.ReadByte();
FMOpl.YM3526.lfo_pm_depth_range = reader.ReadByte();
FMOpl.YM3526.lfo_am_cnt = reader.ReadUInt32();
FMOpl.YM3526.lfo_pm_cnt = reader.ReadUInt32();
FMOpl.YM3526.noise_rng = reader.ReadUInt32();
FMOpl.YM3526.noise_p = reader.ReadUInt32();
FMOpl.YM3526.wavesel = reader.ReadByte();
for (i = 0; i < 2; i++)
{
FMOpl.YM3526.T[i] = reader.ReadUInt32();
}
for (i = 0; i < 2; i++)
{
FMOpl.YM3526.st[i] = reader.ReadByte();
}
FMOpl.YM3526.address = reader.ReadByte();
FMOpl.YM3526.status = reader.ReadByte();
FMOpl.YM3526.statusmask = reader.ReadByte();
FMOpl.YM3526.mode = reader.ReadByte();
}
}
}