bizswan: settings and syncsettings, random cleanup, include mingw makefile (we're building from msvs here though)

This commit is contained in:
goyuken 2014-05-30 22:31:16 +00:00
parent 5ce23c815d
commit fb4bd18fe1
15 changed files with 556 additions and 444 deletions

View File

@ -415,7 +415,8 @@ namespace BizHawk.Client.Common
nextEmulator = new N64(nextComm, game, rom.RomData, GetCoreSyncSettings<N64>());
break;
case "WSWAN":
nextEmulator = new WonderSwan(nextComm, rom.RomData, Deterministic);
nextEmulator = new WonderSwan(nextComm, rom.RomData, Deterministic,
GetCoreSettings<WonderSwan>(), GetCoreSyncSettings<WonderSwan>());
break;
case "DEBUG":
if (VersionInfo.INTERIM)

File diff suppressed because it is too large Load Diff

View File

@ -1318,6 +1318,7 @@ namespace BizHawk.Client.EmuHawk
SaturnSubMenu.Visible = false;
DGBSubMenu.Visible = false;
GenesisSubMenu.Visible = false;
wonderSwanToolStripMenuItem.Visible = false;
switch (system)
{
@ -1381,6 +1382,9 @@ namespace BizHawk.Client.EmuHawk
case "DGB":
DGBSubMenu.Visible = true;
break;
case "WSWAN":
wonderSwanToolStripMenuItem.Visible = true;
break;
}
}
@ -3234,5 +3238,10 @@ namespace BizHawk.Client.EmuHawk
{
BizHawk.Client.EmuHawk.config.GB.GBPrefs.DoGBPrefsDialog(this);
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
GenericCoreConfig.DoDialog(this, "WonderSwan Settings");
}
}
}

View File

@ -85,6 +85,15 @@ namespace BizHawk.Emulation.Cores.WonderSwan
[DllImport(dd, CallingConvention = cc)]
public static extern bool bizswan_saveramsave(IntPtr core, byte[] data, int maxsize);
/// <summary>
/// put non-sync settings, can be done at any time
/// </summary>
/// <param name="core"></param>
/// <param name="settings"></param>
[DllImport(dd, CallingConvention = cc)]
public static extern void bizswan_putsettings(IntPtr core, [In] ref Settings settings);
[Flags]
public enum Buttons : ushort
{
@ -101,13 +110,13 @@ namespace BizHawk.Emulation.Cores.WonderSwan
B = 0x0400,
}
public enum Language : byte
public enum Language : uint
{
Japanese = 0,
English = 1
}
public enum Bloodtype : byte
public enum Bloodtype : uint
{
A = 1,
B = 2,
@ -115,7 +124,7 @@ namespace BizHawk.Emulation.Cores.WonderSwan
AB = 4
}
public enum Gender : byte
public enum Gender : uint
{
Male = 1,
Female = 2
@ -124,19 +133,23 @@ namespace BizHawk.Emulation.Cores.WonderSwan
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct SyncSettings
{
public ushort byear;
public byte bmonth;
public byte bday;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]
public byte[] name;
public ulong initialtime; // inital time in unix format; only used when userealtime = false
public uint byear;
public uint bmonth;
public uint bday;
[MarshalAs(UnmanagedType.Bool)]
public bool color; // true for color system
[MarshalAs(UnmanagedType.Bool)]
public bool userealtime; // true for use real real RTC instead of emulation pegged time
public Language language;
public Gender sex;
public Bloodtype blood;
[MarshalAs(UnmanagedType.U1)]
public bool color; // true for color system
[MarshalAs(UnmanagedType.U1)]
public bool userealtime; // true for use real real RTC instead of emulation pegged time
public ulong initialtime; // inital time in unix format; only used when userealtime = false
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]
public byte[] name;
public void SetName(string newname)
{
@ -145,5 +158,19 @@ namespace BizHawk.Emulation.Cores.WonderSwan
Buffer.BlockCopy(data, 0, name, 0, Math.Min(data.Length, name.Length));
}
}
[Flags]
public enum LayerFlags : uint
{
BG = 1,
FG = 2,
Sprite = 4
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct Settings
{
public LayerFlags LayerMask; // 1 = show
}
}
}

View File

@ -5,6 +5,8 @@ using System.Text;
using BizHawk.Common;
using BizHawk.Emulation.Common;
using System.IO;
using System.ComponentModel;
using Newtonsoft.Json;
namespace BizHawk.Emulation.Cores.WonderSwan
{
@ -40,25 +42,19 @@ namespace BizHawk.Emulation.Cores.WonderSwan
#endregion
public WonderSwan(CoreComm comm, byte[] rom, bool deterministicEmulation)
public WonderSwan(CoreComm comm, byte[] rom, bool deterministicEmulation, object Settings, object SyncSettings)
{
this.CoreComm = comm;
CoreComm = comm;
_Settings = (Settings)Settings ?? new Settings();
_SyncSettings = (SyncSettings)SyncSettings ?? new SyncSettings();
DeterministicEmulation = deterministicEmulation; // when true, remember to force the RTC flag!
Core = BizSwan.bizswan_new();
if (Core == IntPtr.Zero)
throw new InvalidOperationException("bizswan_new() returned NULL!");
try
{
var ss = new BizSwan.SyncSettings
{
sex = BizSwan.Gender.Male,
blood = BizSwan.Bloodtype.A,
language = BizSwan.Language.Japanese,
bday = 5,
bmonth = 12,
byear = 1968
};
ss.SetName("LaForge");
var ss = _SyncSettings.GetNativeSettings();
bool rotate = false;
@ -71,6 +67,7 @@ namespace BizHawk.Emulation.Cores.WonderSwan
saverambuff = new byte[BizSwan.bizswan_saveramsize(Core)];
InitVideo(rotate);
PutSettings(_Settings);
}
catch
{
@ -202,24 +199,133 @@ namespace BizHawk.Emulation.Cores.WonderSwan
#region Settings
Settings _Settings;
SyncSettings _SyncSettings;
public class Settings
{
[Description("True to display the selected layer.")]
[DefaultValue(true)]
public bool EnableBG { get; set; }
[Description("True to display the selected layer.")]
[DefaultValue(true)]
public bool EnableFG { get; set; }
[Description("True to display the selected layer.")]
[DefaultValue(true)]
public bool EnableSprites { get; set; }
public BizSwan.Settings GetNativeSettings()
{
var ret = new BizSwan.Settings();
if (EnableBG) ret.LayerMask |= BizSwan.LayerFlags.BG;
if (EnableFG) ret.LayerMask |= BizSwan.LayerFlags.FG;
if (EnableSprites) ret.LayerMask |= BizSwan.LayerFlags.Sprite;
return ret;
}
public Settings()
{
SettingsUtil.SetDefaultValues(this);
}
public Settings Clone()
{
return (Settings)MemberwiseClone();
}
}
public class SyncSettings
{
[Description("Initial time of emulation. Only relevant when UseRealTime is false.")]
[DefaultValue(typeof(DateTime), "2010-01-01")]
public DateTime InitialTime { get; set; }
[Description("Your birthdate. Stored in EEPROM and used by some games.")]
[DefaultValue(typeof(DateTime), "1968-05-13")]
public DateTime BirthDate { get; set; }
[Description("True to emulate a color system.")]
[DefaultValue(true)]
public bool Color { get; set; }
[Description("If true, RTC clock will be based off of real time instead of emulated time. Ignored (set to false) when recording a movie.")]
[DefaultValue(false)]
public bool UseRealTime { get; set; }
[Description("Your gender. Stored in EEPROM and used by some games.")]
[DefaultValue(BizSwan.Gender.Female)]
public BizSwan.Gender Gender { get; set; }
[Description("Language to play games in. Most games ignore this.")]
[DefaultValue(BizSwan.Language.Japanese)]
public BizSwan.Language Language { get; set; }
[Description("Your blood type. Stored in EEPROM and used by some games.")]
[DefaultValue(BizSwan.Bloodtype.AB)]
public BizSwan.Bloodtype BloodType { get; set; }
[Description("Your name. Stored in EEPROM and used by some games. Maximum of 16 characters")]
[DefaultValue("Lady Ashelia")]
public string Name { get; set; }
public BizSwan.SyncSettings GetNativeSettings()
{
var ret = new BizSwan.SyncSettings
{
color = Color,
userealtime = UseRealTime,
sex = Gender,
language = Language,
blood = BloodType
};
ret.SetName(Name);
ret.bday = (uint)BirthDate.Day;
ret.bmonth = (uint)BirthDate.Month;
ret.byear = (uint)BirthDate.Year;
ret.initialtime = (ulong)((InitialTime - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds);
return ret;
}
public SyncSettings()
{
SettingsUtil.SetDefaultValues(this);
}
public SyncSettings Clone()
{
return (SyncSettings)MemberwiseClone();
}
public static bool NeedsReboot(SyncSettings x, SyncSettings y)
{
return x != y;
}
}
public object GetSettings()
{
return null;
return _Settings.Clone();
}
public object GetSyncSettings()
{
return null;
return _SyncSettings.Clone();
}
public bool PutSettings(object o)
{
_Settings = (Settings)o;
var native = _Settings.GetNativeSettings();
BizSwan.bizswan_putsettings(Core, ref native);
return false;
}
public bool PutSyncSettings(object o)
{
return false;
var newsettings = (SyncSettings)o;
bool ret = SyncSettings.NeedsReboot(newsettings, _SyncSettings);
_SyncSettings = newsettings;
return ret;
}
#endregion

Binary file not shown.

View File

@ -87,7 +87,6 @@
<ClInclude Include="..\eeprom.h" />
<ClInclude Include="..\gfx.h" />
<ClInclude Include="..\interrupt.h" />
<ClInclude Include="..\mednafen\state.h" />
<ClInclude Include="..\mednafen\types.h" />
<ClInclude Include="..\memory.h" />
<ClInclude Include="..\msvc\inttypes.h" />

View File

@ -98,9 +98,6 @@
<ClInclude Include="..\mednafen\types.h">
<Filter>Header Files\mednafen</Filter>
</ClInclude>
<ClInclude Include="..\mednafen\state.h">
<Filter>Header Files\mednafen</Filter>
</ClInclude>
<ClInclude Include="..\blip\Blip_Buffer.h">
<Filter>Header Files\blip</Filter>
</ClInclude>

View File

@ -1,4 +0,0 @@
#ifndef _STATE_H
#define _STATE_H
#endif

View File

@ -27,95 +27,6 @@ typedef uint16_t uint16;
typedef uint32_t uint32;
typedef uint64_t uint64;
#if !defined(HAVE_NATIVE64BIT) && (SIZEOF_VOID_P >= 8 || defined(__x86_64__))
#define HAVE_NATIVE64BIT 1
#endif
#ifdef __GNUC__
#define MDFN_MAKE_GCCV(maj,min,pl) (((maj)*100*100) + ((min) * 100) + (pl))
#define MDFN_GCC_VERSION MDFN_MAKE_GCCV(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
#define INLINE inline __attribute__((always_inline))
#define NO_INLINE __attribute__((noinline))
//
// Just avoid using fastcall with gcc before 4.1.0, as it(and similar regparm)
// tend to generate bad code on the older versions(between about 3.1.x and 4.0.x, at least)
//
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12236
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7574
// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17025
//
#if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,1,0)
#if defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386)
#define MDFN_FASTCALL __attribute__((fastcall))
#else
#define MDFN_FASTCALL
#endif
#else
#define MDFN_FASTCALL
#endif
#define MDFN_ALIGN(n) __attribute__ ((aligned (n)))
#define MDFN_FORMATSTR(a,b,c) __attribute__ ((format (a, b, c)));
#define MDFN_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result))
#define MDFN_NOWARN_UNUSED __attribute__((unused))
#define MDFN_UNLIKELY(n) __builtin_expect((n) != 0, 0)
#define MDFN_LIKELY(n) __builtin_expect((n) != 0, 1)
#if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,3,0)
#define MDFN_COLD __attribute__((cold))
#else
#define MDFN_COLD
#endif
#undef MDFN_MAKE_GCCV
#undef MDFN_GCC_VERSION
#elif defined(_MSC_VER)
#define INLINE __forceinline
#define NO_INLINE __declspec(noinline)
#define MDFN_FASTCALL __fastcall
#define MDFN_ALIGN(n) __declspec(align(n))
#define MDFN_FORMATSTR(a,b,c)
#define MDFN_WARN_UNUSED_RESULT
#define MDFN_NOWARN_UNUSED
#define MDFN_UNLIKELY(n) ((n) != 0)
#define MDFN_LIKELY(n) ((n) != 0)
#define MDFN_COLD
#else
#error "Not compiling with GCC nor MSVC"
#define INLINE inline
#define NO_INLINE
#define MDFN_FASTCALL
#define MDFN_ALIGN(n) // hence the #error.
#define MDFN_FORMATSTR(a,b,c)
#define MDFN_WARN_UNUSED_RESULT
#define MDFN_NOWARN_UNUSED
#define MDFN_UNLIKELY(n) ((n) != 0)
#define MDFN_LIKELY(n) ((n) != 0)
#define MDFN_COLD
#endif
typedef struct
{
union

36
wonderswan/mingw/Makefile Normal file
View File

@ -0,0 +1,36 @@
CXX = g++
CXXFLAGS = -Wall -DLSB_FIRST -I.. -Wno-multichar -O3
TARGET = bizswan.dll
LDFLAGS = -shared -static-libgcc -static-libstdc++
RM = rm
CP = cp
SRCS = \
../eeprom.cpp \
../gfx.cpp \
../interrupt.cpp \
../main.cpp \
../memory.cpp \
../rtc.cpp \
../sound.cpp \
../system.cpp \
../tcache.cpp \
../v30mz.cpp \
../Blip/Blip_Buffer.cpp
OBJS = $(SRCS:.cpp=.o)
all: $(TARGET)
%.o: %.cpp
$(CXX) -c -o $@ $< $(CXXFLAGS)
$(TARGET) : $(OBJS)
$(CXX) -o $@ $(LDFLAGS) $(OBJS)
clean:
$(RM) $(OBJS)
$(RM) $(TARGET)
install:
$(CP) $(TARGET) ../../output/dll

View File

@ -97,7 +97,7 @@ namespace MDFN_IEN_WSWAN
// Source: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
// Rounds up to the nearest power of 2.
static INLINE uint32 round_up_pow2(uint32 v)
static inline uint32 round_up_pow2(uint32 v)
{
v--;
v |= v >> 1;
@ -200,7 +200,6 @@ namespace MDFN_IEN_WSWAN
rotate = header[6] & 1;
memory.Init(settings);
gfx.Init(settings.color);
rtc.Init(settings.initialtime, settings.userealtime);
@ -270,6 +269,12 @@ namespace MDFN_IEN_WSWAN
return true;
}
void System::PutSettings(const Settings &s)
{
gfx.SetLayerEnableMask(s.LayerMask);
}
EXPORT System *bizswan_new()
{
return new System();
@ -312,4 +317,9 @@ namespace MDFN_IEN_WSWAN
return s->SaveRamSave(dest, maxsize);
}
EXPORT void bizswan_putsettings(System *s, const Settings *settings)
{
s->PutSettings(*settings);
}
}

View File

@ -32,6 +32,7 @@ public:
void Reset();
bool Advance(uint16 buttons, bool novideo, uint32 *surface, int16 *soundbuff, int &soundbuffsize);
bool Load(const uint8 *data, int length, const SyncSettings &s);
void PutSettings(const Settings &s);
int SaveRamSize() const;
bool SaveRamLoad(const uint8 *data, int size);
@ -51,16 +52,16 @@ public:
struct SyncSettings
{
uint16 byear; // birth year, 0000-9999
uint8 bmonth; // birth month, 1-12
uint8 bday; // birth day, 1-31
char name[17]; // up to 16 chars long, most chars don't work (conversion from ascii is internal)
uint8 language; // 0 = J, 1 = E; only affects "Digimon Tamers - Battle Spirit"
uint8 sex; // sex, 1 = male, 2 = female
uint8 blood; // 1 = a, 2 = b, 3 = o, 4 = ab
bool color; // true if wonderswan is in color mode
bool userealtime; // true to use the system's actual clock; false to use an emulation pegged clock
uint64 initialtime; // when userealtime is false, the initial time in unix format
uint32 byear; // birth year, 0000-9999
uint32 bmonth; // birth month, 1-12
uint32 bday; // birth day, 1-31
uint32 color; // true if wonderswan is in color mode
uint32 userealtime; // true to use the system's actual clock; false to use an emulation pegged clock
uint32 language; // 0 = J, 1 = E; only affects "Digimon Tamers - Battle Spirit"
uint32 sex; // sex, 1 = male, 2 = female
uint32 blood; // 1 = a, 2 = b, 3 = o, 4 = ab
char name[17]; // up to 16 chars long, most chars don't work (conversion from ascii is internal)
};
struct Settings

View File

@ -105,13 +105,13 @@ namespace MDFN_IEN_WSWAN
}
}
INLINE void V30MZ::i_real_pushf()
inline void V30MZ::i_real_pushf()
{
PUSH( CompressFlags() );
CLK(2);
}
INLINE void V30MZ::i_real_popf()
inline void V30MZ::i_real_popf()
{
uint32 tmp;
POP(tmp);
@ -230,14 +230,14 @@ namespace MDFN_IEN_WSWAN
/* OPCODES */
/****************************************************************************/
INLINE void V30MZ::i_real_insb()
inline void V30MZ::i_real_insb()
{
PutMemB(DS1,I.regs.w[IY], read_port(I.regs.w[DW]));
I.regs.w[IY]+= -2 * I.DF + 1;
CLK(6);
}
INLINE void V30MZ::i_real_insw()
inline void V30MZ::i_real_insw()
{
PutMemB(DS1,I.regs.w[IY],read_port(I.regs.w[DW]));
PutMemB(DS1,(I.regs.w[IY]+1)&0xffff,read_port((I.regs.w[DW]+1)&0xffff));
@ -245,14 +245,14 @@ namespace MDFN_IEN_WSWAN
CLK(6);
}
INLINE void V30MZ::i_real_outsb()
inline void V30MZ::i_real_outsb()
{
write_port(I.regs.w[DW],GetMemB(DS0,I.regs.w[IX]));
I.regs.w[IX]+= -2 * I.DF + 1;
CLK(7);
}
INLINE void V30MZ::i_real_outsw()
inline void V30MZ::i_real_outsw()
{
write_port(I.regs.w[DW],GetMemB(DS0,I.regs.w[IX]));
write_port((I.regs.w[DW]+1)&0xffff,GetMemB(DS0,(I.regs.w[IX]+1)&0xffff));
@ -260,7 +260,7 @@ namespace MDFN_IEN_WSWAN
CLK(7);
}
INLINE void V30MZ::i_real_movsb()
inline void V30MZ::i_real_movsb()
{
uint32 tmp = GetMemB(DS0,I.regs.w[IX]);
PutMemB(DS1,I.regs.w[IY], tmp);
@ -269,51 +269,51 @@ namespace MDFN_IEN_WSWAN
CLK(5);
}
INLINE void V30MZ::i_real_movsw()
inline void V30MZ::i_real_movsw()
{
uint32 tmp = GetMemW(DS0,I.regs.w[IX]); PutMemW(DS1,I.regs.w[IY], tmp); I.regs.w[IY] += -4 * I.DF + 2;
I.regs.w[IX] += -4 * I.DF + 2; CLK(5);
}
INLINE void V30MZ::i_real_cmpsb()
inline void V30MZ::i_real_cmpsb()
{
uint32 src = GetMemB(DS1, I.regs.w[IY]); uint32 dst = GetMemB(DS0, I.regs.w[IX]); SUBB; I.regs.w[IY] += -2 * I.DF + 1;
I.regs.w[IX] += -2 * I.DF + 1; CLK(6);
}
INLINE void V30MZ::i_real_cmpsw()
inline void V30MZ::i_real_cmpsw()
{
uint32 src = GetMemW(DS1, I.regs.w[IY]); uint32 dst = GetMemW(DS0, I.regs.w[IX]); SUBW; I.regs.w[IY] += -4 * I.DF + 2;
I.regs.w[IX] += -4 * I.DF + 2; CLK(6);
}
INLINE void V30MZ::i_real_stosb()
inline void V30MZ::i_real_stosb()
{
PutMemB(DS1,I.regs.w[IY],I.regs.b[AL]); I.regs.w[IY] += -2 * I.DF + 1; CLK(3);
}
INLINE void V30MZ::i_real_stosw()
inline void V30MZ::i_real_stosw()
{
PutMemW(DS1,I.regs.w[IY],I.regs.w[AW]); I.regs.w[IY] += -4 * I.DF + 2; CLK(3);
}
INLINE void V30MZ::i_real_lodsb()
inline void V30MZ::i_real_lodsb()
{
I.regs.b[AL] = GetMemB(DS0,I.regs.w[IX]); I.regs.w[IX] += -2 * I.DF + 1; CLK(3);
}
INLINE void V30MZ::i_real_lodsw()
inline void V30MZ::i_real_lodsw()
{
I.regs.w[AW] = GetMemW(DS0,I.regs.w[IX]); I.regs.w[IX] += -4 * I.DF + 2; CLK(3);
}
INLINE void V30MZ::i_real_scasb()
inline void V30MZ::i_real_scasb()
{
uint32 src = GetMemB(DS1, I.regs.w[IY]); uint32 dst = I.regs.b[AL]; SUBB;
I.regs.w[IY] += -2 * I.DF + 1; CLK(4);
}
INLINE void V30MZ::i_real_scasw()
inline void V30MZ::i_real_scasw()
{
uint32 src = GetMemW(DS1, I.regs.w[IY]); uint32 dst = I.regs.w[AW]; SUBW;
I.regs.w[IY] += -4 * I.DF + 2; CLK(4);

View File

@ -2,7 +2,6 @@
#define __WSWAN_H
#include <mednafen/types.h>
#include <mednafen/state.h>
#include "interrupt.h"