diff --git a/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs b/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs
index 6b1e480fbf..ecfaaad078 100644
--- a/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs
+++ b/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs
@@ -8,6 +8,44 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn
{
public static class LibYabause
{
+ ///
+ /// A,B,C,Start,DPad
+ ///
+ public enum Buttons1 : byte
+ {
+ B = 0x01,
+ C = 0x02,
+ A = 0x04,
+ S = 0x08,
+ U = 0x10,
+ D = 0x20,
+ L = 0x40,
+ R = 0x80
+ }
+
+ ///
+ /// X,Y,Z,Shoulders
+ ///
+ public enum Buttons2 : byte
+ {
+ L = 0x08,
+ Z = 0x10,
+ Y = 0x20,
+ X = 0x40,
+ R = 0x80
+ }
+
+ ///
+ ///
+ ///
+ /// player1
+ /// player1
+ /// player2
+ /// player2
+ [DllImport("libyabause.dll", CallingConvention = CallingConvention.Cdecl)]
+ public static extern void libyabause_setpads(Buttons1 p11, Buttons2 p12, Buttons1 p21, Buttons2 p22);
+
+
///
/// set video buffer
///
diff --git a/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs b/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs
index 74ae757015..9cb0263e25 100644
--- a/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs
+++ b/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs
@@ -12,8 +12,10 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn
{
Name = "Saturn Controller",
BoolButtons =
- {
- "Up", "Down", "Left", "Right", "Start", "Z", "Y", "X", "B", "A", "L", "R"
+ {
+ "Power", "Reset",
+ "P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Start", "P1 Z", "P1 Y", "P1 X", "P1 C", "P1 B", "P1 A", "P1 L", "P1 R",
+ "P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Start", "P2 Z", "P2 Y", "P2 X", "P2 C", "P2 B", "P2 A", "P2 L", "P2 R",
}
};
@@ -78,6 +80,76 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn
public void FrameAdvance(bool render, bool rendersound = true)
{
int w, h, nsamp;
+
+ LibYabause.Buttons1 p11 = (LibYabause.Buttons1)0xff;
+ LibYabause.Buttons2 p12 = (LibYabause.Buttons2)0xff;
+ LibYabause.Buttons1 p21 = (LibYabause.Buttons1)0xff;
+ LibYabause.Buttons2 p22 = (LibYabause.Buttons2)0xff;
+
+ if (Controller["P1 A"])
+ p11 &= ~LibYabause.Buttons1.A;
+ if (Controller["P1 B"])
+ p11 &= ~LibYabause.Buttons1.B;
+ if (Controller["P1 C"])
+ p11 &= ~LibYabause.Buttons1.C;
+ if (Controller["P1 Start"])
+ p11 &= ~LibYabause.Buttons1.S;
+ if (Controller["P1 Left"])
+ p11 &= ~LibYabause.Buttons1.L;
+ if (Controller["P1 Right"])
+ p11 &= ~LibYabause.Buttons1.R;
+ if (Controller["P1 Up"])
+ p11 &= ~LibYabause.Buttons1.U;
+ if (Controller["P1 Down"])
+ p11 &= ~LibYabause.Buttons1.D;
+ if (Controller["P1 L"])
+ p12 &= ~LibYabause.Buttons2.L;
+ if (Controller["P1 R"])
+ p12 &= ~LibYabause.Buttons2.R;
+ if (Controller["P1 X"])
+ p12 &= ~LibYabause.Buttons2.X;
+ if (Controller["P1 Y"])
+ p12 &= ~LibYabause.Buttons2.Y;
+ if (Controller["P1 Z"])
+ p12 &= ~LibYabause.Buttons2.Z;
+
+ if (Controller["P2 A"])
+ p21 &= ~LibYabause.Buttons1.A;
+ if (Controller["P2 B"])
+ p21 &= ~LibYabause.Buttons1.B;
+ if (Controller["P2 C"])
+ p21 &= ~LibYabause.Buttons1.C;
+ if (Controller["P2 Start"])
+ p21 &= ~LibYabause.Buttons1.S;
+ if (Controller["P2 Left"])
+ p21 &= ~LibYabause.Buttons1.L;
+ if (Controller["P2 Right"])
+ p21 &= ~LibYabause.Buttons1.R;
+ if (Controller["P2 Up"])
+ p21 &= ~LibYabause.Buttons1.U;
+ if (Controller["P2 Down"])
+ p21 &= ~LibYabause.Buttons1.D;
+ if (Controller["P2 L"])
+ p22 &= ~LibYabause.Buttons2.L;
+ if (Controller["P2 R"])
+ p22 &= ~LibYabause.Buttons2.R;
+ if (Controller["P2 X"])
+ p22 &= ~LibYabause.Buttons2.X;
+ if (Controller["P2 Y"])
+ p22 &= ~LibYabause.Buttons2.Y;
+ if (Controller["P2 Z"])
+ p22 &= ~LibYabause.Buttons2.Z;
+
+
+ if (Controller["Reset"])
+ LibYabause.libyabause_softreset();
+ if (Controller["Power"])
+ {
+ // TODO
+ }
+
+ LibYabause.libyabause_setpads(p11, p12, p21, p22);
+
LibYabause.libyabause_frameadvance(out w, out h, out nsamp);
BufferWidth = w;
BufferHeight = h;
diff --git a/BizHawk.MultiClient/Config.cs b/BizHawk.MultiClient/Config.cs
index efecc704e2..4db082c243 100644
--- a/BizHawk.MultiClient/Config.cs
+++ b/BizHawk.MultiClient/Config.cs
@@ -34,6 +34,12 @@ namespace BizHawk.MultiClient
GenesisController[0] = new GenControllerTemplate(true);
GenesisAutoController[0] = new GenControllerTemplate(false);
+ SaturnController[0] = new SaturnControllerTemplate(true);
+ SaturnController[1] = new SaturnControllerTemplate(false);
+
+ SaturnAutoController[0] = new SaturnControllerTemplate(false);
+ SaturnAutoController[1] = new SaturnControllerTemplate(false);
+
Atari2600Controller[0] = new SingleButtonJoyStickTemplate(true);
Atari2600Controller[1] = new SingleButtonJoyStickTemplate(false);
Atari2600AutoController[0] = new SingleButtonJoyStickTemplate(false);
@@ -811,6 +817,11 @@ namespace BizHawk.MultiClient
public GBAControllerTemplate[] GBAController = new GBAControllerTemplate[1];
public GBAControllerTemplate[] GBAAutoController = new GBAControllerTemplate[1];
+ //Saturn
+ public SaturnControllerTemplate[] SaturnController = new SaturnControllerTemplate[2];
+ public SaturnControllerTemplate[] SaturnAutoController = new SaturnControllerTemplate[2];
+ public SaturnConsoleButtonTemplate[] SaturnConsoleButtons = new SaturnConsoleButtonTemplate[1];
+
//Commodore 64 Settings
public SingleButtonJoyStickTemplate[] C64Joysticks = new SingleButtonJoyStickTemplate[2];
public SingleButtonJoyStickTemplate[] C64AutoJoysticks = new SingleButtonJoyStickTemplate[2];
@@ -883,6 +894,19 @@ namespace BizHawk.MultiClient
}
}
+ public class SaturnConsoleButtonTemplate : iControllerConfigObject
+ {
+ public string Reset = "";
+ public string Power = "";
+
+ public void SetDefaults()
+ {
+ Reset = "";
+ Power = "";
+ }
+ }
+
+
public class GenConsoleButtonTemplate : iControllerConfigObject
{
public string Reset = "";
@@ -1166,6 +1190,37 @@ namespace BizHawk.MultiClient
}
}
+ public class SaturnControllerTemplate : iControllerConfigObject
+ {
+ public string Up = "";
+ public string Down = "";
+ public string Left = "";
+ public string Right = "";
+ public string A = "";
+ public string B = "";
+ public string C = "";
+ public string X = "";
+ public string Y = "";
+ public string Z = "";
+ public string L = "";
+ public string R = "";
+ public string Start = "";
+ public bool Enabled;
+
+ public SaturnControllerTemplate() { }
+ public SaturnControllerTemplate(bool defaults)
+ {
+ if (defaults)
+ {
+ SetDefaults();
+ }
+ }
+ public void SetDefaults()
+ {
+ Enabled = true;
+ }
+ }
+
public class GenControllerTemplate : iControllerConfigObject
{
public string Up = "";
diff --git a/BizHawk.MultiClient/Global.cs b/BizHawk.MultiClient/Global.cs
index 8186948366..73c18de8b0 100644
--- a/BizHawk.MultiClient/Global.cs
+++ b/BizHawk.MultiClient/Global.cs
@@ -64,6 +64,9 @@ namespace BizHawk.MultiClient
public static Controller ColecoControls;
public static AutofireController AutofireColecoControls;
+ public static Controller SaturnControls;
+ public static AutofireController AutofireSaturnControls;
+
public static Controller IntellivisionControls;
public static AutofireController AutofireIntellivisionControls;
diff --git a/BizHawk.MultiClient/MainForm.cs b/BizHawk.MultiClient/MainForm.cs
index 0ee5634e2c..098e0b1e81 100644
--- a/BizHawk.MultiClient/MainForm.cs
+++ b/BizHawk.MultiClient/MainForm.cs
@@ -1037,6 +1037,64 @@ namespace BizHawk.MultiClient
agbaControls.BindMulti("Power", Global.Config.GBAAutoController[0].Power);
Global.AutofireGBAControls = agbaControls;
+ var satControls = new Controller(Emulation.Consoles.Sega.Saturn.Yabause.SaturnController);
+ satControls.BindMulti("P1 Up", Global.Config.SaturnController[0].Up);
+ satControls.BindMulti("P1 Down", Global.Config.SaturnController[0].Down);
+ satControls.BindMulti("P1 Left", Global.Config.SaturnController[0].Left);
+ satControls.BindMulti("P1 Right", Global.Config.SaturnController[0].Right);
+ satControls.BindMulti("P1 A", Global.Config.SaturnController[0].A);
+ satControls.BindMulti("P1 B", Global.Config.SaturnController[0].B);
+ satControls.BindMulti("P1 C", Global.Config.SaturnController[0].C);
+ satControls.BindMulti("P1 X", Global.Config.SaturnController[0].X);
+ satControls.BindMulti("P1 Y", Global.Config.SaturnController[0].Y);
+ satControls.BindMulti("P1 Z", Global.Config.SaturnController[0].Z);
+ satControls.BindMulti("P1 L", Global.Config.SaturnController[0].L);
+ satControls.BindMulti("P1 R", Global.Config.SaturnController[0].R);
+ satControls.BindMulti("P1 Start", Global.Config.SaturnController[0].Start);
+ satControls.BindMulti("P2 Up", Global.Config.SaturnController[1].Up);
+ satControls.BindMulti("P2 Down", Global.Config.SaturnController[1].Down);
+ satControls.BindMulti("P2 Left", Global.Config.SaturnController[1].Left);
+ satControls.BindMulti("P2 Right", Global.Config.SaturnController[1].Right);
+ satControls.BindMulti("P2 A", Global.Config.SaturnController[1].A);
+ satControls.BindMulti("P2 B", Global.Config.SaturnController[1].B);
+ satControls.BindMulti("P2 C", Global.Config.SaturnController[1].C);
+ satControls.BindMulti("P2 X", Global.Config.SaturnController[1].X);
+ satControls.BindMulti("P2 Y", Global.Config.SaturnController[1].Y);
+ satControls.BindMulti("P2 Z", Global.Config.SaturnController[1].Z);
+ satControls.BindMulti("P2 L", Global.Config.SaturnController[1].L);
+ satControls.BindMulti("P2 R", Global.Config.SaturnController[1].R);
+ satControls.BindMulti("P2 Start", Global.Config.SaturnController[1].Start);
+ Global.SaturnControls = satControls;
+
+ var asatControls = new AutofireController(Emulation.Consoles.Sega.Saturn.Yabause.SaturnController);
+ asatControls.BindMulti("P1 Up", Global.Config.SaturnAutoController[0].Up);
+ asatControls.BindMulti("P1 Down", Global.Config.SaturnAutoController[0].Down);
+ asatControls.BindMulti("P1 Left", Global.Config.SaturnAutoController[0].Left);
+ asatControls.BindMulti("P1 Right", Global.Config.SaturnAutoController[0].Right);
+ asatControls.BindMulti("P1 A", Global.Config.SaturnAutoController[0].A);
+ asatControls.BindMulti("P1 B", Global.Config.SaturnAutoController[0].B);
+ asatControls.BindMulti("P1 C", Global.Config.SaturnAutoController[0].C);
+ asatControls.BindMulti("P1 X", Global.Config.SaturnAutoController[0].X);
+ asatControls.BindMulti("P1 Y", Global.Config.SaturnAutoController[0].Y);
+ asatControls.BindMulti("P1 Z", Global.Config.SaturnAutoController[0].Z);
+ asatControls.BindMulti("P1 L", Global.Config.SaturnAutoController[0].L);
+ asatControls.BindMulti("P1 R", Global.Config.SaturnAutoController[0].R);
+ asatControls.BindMulti("P1 Start", Global.Config.SaturnAutoController[0].Start);
+ asatControls.BindMulti("P2 Up", Global.Config.SaturnAutoController[1].Up);
+ asatControls.BindMulti("P2 Down", Global.Config.SaturnAutoController[1].Down);
+ asatControls.BindMulti("P2 Left", Global.Config.SaturnAutoController[1].Left);
+ asatControls.BindMulti("P2 Right", Global.Config.SaturnAutoController[1].Right);
+ asatControls.BindMulti("P2 A", Global.Config.SaturnAutoController[1].A);
+ asatControls.BindMulti("P2 B", Global.Config.SaturnAutoController[1].B);
+ asatControls.BindMulti("P2 C", Global.Config.SaturnAutoController[1].C);
+ asatControls.BindMulti("P2 X", Global.Config.SaturnAutoController[1].X);
+ asatControls.BindMulti("P2 Y", Global.Config.SaturnAutoController[1].Y);
+ asatControls.BindMulti("P2 Z", Global.Config.SaturnAutoController[1].Z);
+ asatControls.BindMulti("P2 L", Global.Config.SaturnAutoController[1].L);
+ asatControls.BindMulti("P2 R", Global.Config.SaturnAutoController[1].R);
+ asatControls.BindMulti("P2 Start", Global.Config.SaturnAutoController[1].Start);
+ Global.AutofireSaturnControls = asatControls;
+
var genControls = new Controller(Genesis.GenesisController);
genControls.BindMulti("P1 Up", Global.Config.GenesisController[0].Up);
genControls.BindMulti("P1 Left", Global.Config.GenesisController[0].Left);
@@ -1744,6 +1802,10 @@ namespace BizHawk.MultiClient
Global.ActiveController = Global.ColecoControls;
Global.AutoFireController = Global.AutofireColecoControls;
break;
+ case "SAT":
+ Global.ActiveController = Global.SaturnControls;
+ Global.AutoFireController = Global.AutofireSaturnControls;
+ break;
case "C64":
Global.ActiveController = Global.Commodore64Controls;
Global.AutoFireController = Global.AutofireCommodore64Controls;
diff --git a/BizHawk.MultiClient/output/dll/libyabause.dll b/BizHawk.MultiClient/output/dll/libyabause.dll
index e7c6d621cd..50a9ab6a90 100644
Binary files a/BizHawk.MultiClient/output/dll/libyabause.dll and b/BizHawk.MultiClient/output/dll/libyabause.dll differ
diff --git a/yabause/src/libyabause/yui.cpp b/yabause/src/libyabause/yui.cpp
index 0349150d50..bdec66021c 100644
--- a/yabause/src/libyabause/yui.cpp
+++ b/yabause/src/libyabause/yui.cpp
@@ -106,6 +106,9 @@ s16 *sndbuff = NULL;
int sndbuffpos = 0;
u32 *vidbuff = NULL;
+PerPad_struct *ctrl1;
+PerPad_struct *ctrl2;
+
extern "C" int vdp2height;
extern "C" int vdp2width;
@@ -187,6 +190,14 @@ extern "C" __declspec(dllexport) void libyabause_deinit()
YabauseDeInit();
}
+extern "C" __declspec(dllexport) void libyabause_setpads(u8 p11, u8 p12, u8 p21, u8 p22)
+{
+ ctrl1->padbits[0] = p11;
+ ctrl1->padbits[1] = p12;
+ ctrl2->padbits[0] = p21;
+ ctrl2->padbits[1] = p22;
+}
+
extern "C" __declspec(dllexport) int libyabause_init(CDInterface *_CD)
{
FECD.DeInit = _CD->DeInit;
@@ -228,5 +239,8 @@ extern "C" __declspec(dllexport) int libyabause_init(CDInterface *_CD)
DisableAutoFrameSkip();
ScspSetFrameAccurate(1);
+ ctrl1 = PerPadAdd(&PORTDATA1);
+ ctrl2 = PerPadAdd(&PORTDATA2);
+
return 1;
}