From 149eeb5f33e459183c07d06932557ce4f8853999 Mon Sep 17 00:00:00 2001 From: goyuken Date: Thu, 2 May 2013 20:47:56 +0000 Subject: [PATCH] saturn - support loading bios. note that at the moment, the bios filename isn't in the firmware configuratorthingy. this marks the first change made to the yabause core itself (excepting the yui.cpp that we added); changing memory.h so that block loads don't do unnecessary fseek() --- BizHawk.Emulation/BizHawk.Emulation.csproj | 1 + .../Consoles/Sega/Saturn/FilePiping.cs | 80 ++++++++++++++++++ .../Consoles/Sega/Saturn/LibYabause.cs | 3 +- .../Consoles/Sega/Saturn/Yabause.cs | 16 +++- BizHawk.MultiClient/Config.cs | 1 + BizHawk.MultiClient/MainForm.cs | 12 ++- BizHawk.MultiClient/output/dll/libyabause.dll | Bin 551424 -> 551424 bytes yabause/src/libyabause/yui.cpp | 4 +- yabause/src/memory.h | 32 ++++--- 9 files changed, 127 insertions(+), 22 deletions(-) create mode 100644 BizHawk.Emulation/Consoles/Sega/Saturn/FilePiping.cs diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj index 611e8db33d..ade0cb89de 100644 --- a/BizHawk.Emulation/BizHawk.Emulation.csproj +++ b/BizHawk.Emulation/BizHawk.Emulation.csproj @@ -357,6 +357,7 @@ + diff --git a/BizHawk.Emulation/Consoles/Sega/Saturn/FilePiping.cs b/BizHawk.Emulation/Consoles/Sega/Saturn/FilePiping.cs new file mode 100644 index 0000000000..ca7c297752 --- /dev/null +++ b/BizHawk.Emulation/Consoles/Sega/Saturn/FilePiping.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.IO.Pipes; +using System.Threading; + +namespace BizHawk.Emulation.Consoles.Sega.Saturn +{ + /// + /// helpers for moving files across named pipes + /// + public class FilePiping + { + public void Offer(byte[] data) + { + MemoryStream ms = new MemoryStream(data, false); + Offer(ms); + } + + string PipeName; + Thread thr; + Exception e; + + public string GetPipeName() + { + return PipeName; + } + + public string GetPipeNameNative() + { + return @"\\.\pipe\" + PipeName; + } + + public FilePiping() + { + PipeName = "BizHawk-" + Guid.NewGuid().ToString(); + } + + public void Offer(Stream s) + { + if (thr != null) + throw new Exception("Can only serve one thing at a time!"); + if (e != null) + throw new Exception("Previous attempt failed!", e); + if (!s.CanRead) + throw new ArgumentException("Stream must be readable!"); + + thr = new Thread(delegate() + { + try + { + using (var srv = new NamedPipeServerStream(PipeName, PipeDirection.Out)) + { + srv.WaitForConnection(); + s.CopyTo(srv); + srv.WaitForPipeDrain(); + } + } + catch (Exception ee)// might want to do something about this... + { + e = ee; + } + }); + thr.Start(); + } + + public Exception GetResults() + { + if (thr == null) + throw new Exception("No pending!"); + thr.Join(); + thr = null; + Exception ret = e; + e = null; + return ret; + } + } +} diff --git a/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs b/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs index 1eeac89f85..30e2aa2f3e 100644 --- a/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs +++ b/BizHawk.Emulation/Consoles/Sega/Saturn/LibYabause.cs @@ -83,9 +83,10 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn /// /// /// cd interface. struct need not persist after call, but the function pointers better + /// path to bios, pass null to use built in bios emulation /// [DllImport("libyabause.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern bool libyabause_init(ref CDInterface intf); + public static extern bool libyabause_init(ref CDInterface intf, string biosfn); public struct CDInterface { diff --git a/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs b/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs index b5465bd53d..be795792ef 100644 --- a/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs +++ b/BizHawk.Emulation/Consoles/Sega/Saturn/Yabause.cs @@ -33,16 +33,16 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn LibYabause.CDInterface.ReadSectorFAD ReadSectorFADH; LibYabause.CDInterface.ReadAheadFAD ReadAheadFADH; - public Yabause(CoreComm CoreComm, DiscSystem.Disc CD) + public Yabause(CoreComm CoreComm, DiscSystem.Disc CD, byte[] bios) { CoreComm.RomStatusDetails = "Yeh"; this.CoreComm = CoreComm; this.CD = CD; ResetFrameCounter(); - Init(); + Init(bios); } - void Init() + void Init(byte[] bios) { if (AttachedCore != null) { @@ -60,9 +60,17 @@ namespace BizHawk.Emulation.Consoles.Sega.Saturn CDInt.ReadSectorFADFunc = ReadSectorFADH = new LibYabause.CDInterface.ReadSectorFAD(CD_ReadSectorFAD); CDInt.ReadAheadFADFunc = ReadAheadFADH = new LibYabause.CDInterface.ReadAheadFAD(CD_ReadAheadFAD); - if (!LibYabause.libyabause_init(ref CDInt)) + var fp = new FilePiping(); + string BiosPipe = fp.GetPipeNameNative(); + fp.Offer(bios); + + if (!LibYabause.libyabause_init(ref CDInt, BiosPipe)) throw new Exception("libyabause_init() failed!"); + var e = fp.GetResults(); + if (e != null) + throw e; + LibYabause.libyabause_setvidbuff(VideoHandle.AddrOfPinnedObject()); LibYabause.libyabause_setsndbuff(SoundHandle.AddrOfPinnedObject()); AttachedCore = this; diff --git a/BizHawk.MultiClient/Config.cs b/BizHawk.MultiClient/Config.cs index e732f3cb6d..48c9cc1708 100644 --- a/BizHawk.MultiClient/Config.cs +++ b/BizHawk.MultiClient/Config.cs @@ -256,6 +256,7 @@ namespace BizHawk.MultiClient public string FilenameA78PALBios = "7800PALBIOS.bin"; public string FilenameA78HSCBios = "7800highscore.bin"; public string FilenameINTVEROM = "erom.bin"; + public string FilenameSaturnBios = "Sega Saturn BIOS v1.01 (JAP).bin"; public string FFMpegPath = "%exe%/dll/ffmpeg.exe"; diff --git a/BizHawk.MultiClient/MainForm.cs b/BizHawk.MultiClient/MainForm.cs index efa481cc3a..37b1d0a5bc 100644 --- a/BizHawk.MultiClient/MainForm.cs +++ b/BizHawk.MultiClient/MainForm.cs @@ -2082,8 +2082,16 @@ namespace BizHawk.MultiClient switch (game.System) { case "SAT": - var saturn = new Emulation.Consoles.Sega.Saturn.Yabause(nextComm, disc); - nextEmulator = saturn; + { + string biosPath = PathManager.StandardFirmwareName(Global.Config.FilenameSaturnBios); + if (!File.Exists(biosPath)) + { + MessageBox.Show("Saturn BIOS not found. Please check firmware configurations."); + return false; + } + var saturn = new Emulation.Consoles.Sega.Saturn.Yabause(nextComm, disc, File.ReadAllBytes(biosPath)); + nextEmulator = saturn; + } break; case "PSX": diff --git a/BizHawk.MultiClient/output/dll/libyabause.dll b/BizHawk.MultiClient/output/dll/libyabause.dll index db22f4b26cf1d3d4593204c34797f61ba73bc322..e437a48e49e43ee9021d051fe072b119ed1013fb 100644 GIT binary patch delta 17657 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 diff --git a/yabause/src/libyabause/yui.cpp b/yabause/src/libyabause/yui.cpp index c147e1fbc8..91cf54a18e 100644 --- a/yabause/src/libyabause/yui.cpp +++ b/yabause/src/libyabause/yui.cpp @@ -201,7 +201,7 @@ extern "C" __declspec(dllexport) void libyabause_setpads(u8 p11, u8 p12, u8 p21, ctrl2->padbits[1] = p22; } -extern "C" __declspec(dllexport) int libyabause_init(CDInterface *_CD) +extern "C" __declspec(dllexport) int libyabause_init(CDInterface *_CD, const char *biosfn) { FECD.DeInit = _CD->DeInit; FECD.GetStatus = _CD->GetStatus; @@ -227,7 +227,7 @@ extern "C" __declspec(dllexport) int libyabause_init(CDInterface *_CD) yinit.m68kcoretype = M68KCORE_C68K; yinit.cartpath = CART_NONE; yinit.regionid = REGION_AUTODETECT; - yinit.biospath = NULL; + yinit.biospath = biosfn; yinit.cdpath = "Saturnus"; //NULL; yinit.buppath = NULL; yinit.mpegpath = NULL; diff --git a/yabause/src/memory.h b/yabause/src/memory.h index 2de4cbdc47..7cab523ea7 100644 --- a/yabause/src/memory.h +++ b/yabause/src/memory.h @@ -194,7 +194,7 @@ static INLINE void T3WriteLong(T3Memory * mem, u32 addr, u32 val) static INLINE int T123Load(void * mem, u32 size, int type, const char *filename) { FILE *fp; - u32 filesize, filesizecheck; + u32 filesizecheck; u8 *buffer; u32 i; @@ -205,41 +205,47 @@ static INLINE int T123Load(void * mem, u32 size, int type, const char *filename) return -1; // Calculate file size - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - fseek(fp, 0, SEEK_SET); + //fseek(fp, 0, SEEK_END); + //filesize = ftell(fp); + //fseek(fp, 0, SEEK_SET); - if (filesize > size) - return -1; + //if (filesize > size) + // return -1; - if ((buffer = (u8 *)malloc(filesize)) == NULL) + if ((buffer = (u8 *)malloc(size)) == NULL) { fclose(fp); return -1; } - filesizecheck = (u32)fread((void *)buffer, 1, filesize, fp); - fclose(fp); + filesizecheck = (u32)fread((void *)buffer, 1, size, fp); + // make sure there are no bytes left in the file + if (filesizecheck != size || fgetc(fp) != EOF) + { + free(buffer); + fclose(fp); + return -1; + } - if (filesizecheck != filesize) return -1; + fclose(fp); switch (type) { case 1: { - for (i = 0; i < filesize; i++) + for (i = 0; i < size; i++) T1WriteByte((u8 *) mem, i, buffer[i]); break; } case 2: { - for (i = 0; i < filesize; i++) + for (i = 0; i < size; i++) T2WriteByte((u8 *) mem, i, buffer[i]); break; } case 3: { - for (i = 0; i < filesize; i++) + for (i = 0; i < size; i++) T3WriteByte((T3Memory *) mem, i, buffer[i]); break; }