示例#1
0
        private void SetupMemoryDomains()
        {
            var mms = new List <MemoryDomain>
            {
                new MemoryDomainIntPtr("RAM", MemoryDomain.Endian.Little, LibLynx.GetRamPointer(Core), 65536, true, 2)
            };

            IntPtr p;
            int    s;

            if (LibLynx.GetSaveRamPtr(Core, out s, out p))
            {
                mms.Add(new MemoryDomainIntPtr("Save RAM", MemoryDomain.Endian.Little, p, s, true, 2));
            }

            IntPtr p0, p1;
            int    s0, s1;

            LibLynx.GetReadOnlyCartPtrs(Core, out s0, out p0, out s1, out p1);
            if (s0 > 0 && p0 != IntPtr.Zero)
            {
                mms.Add(new MemoryDomainIntPtr("Cart A", MemoryDomain.Endian.Little, p0, s0, false, 2));
            }

            if (s1 > 0 && p1 != IntPtr.Zero)
            {
                mms.Add(new MemoryDomainIntPtr("Cart B", MemoryDomain.Endian.Little, p1, s1, false, 2));
            }

            _memoryDomains = new MemoryDomainList(mms);
            (ServiceProvider as BasicServiceProvider).Register <IMemoryDomains>(_memoryDomains);
        }
示例#2
0
文件: Lynx.cs 项目: TASeditor/BizHawk
        static Lynx()
        {
            var resolver = new DynamicLibraryImportResolver(
                OSTailoredCode.IsUnixHost ? "libbizlynx.dll.so" : "bizlynx.dll", hasLimitedLifetime: false);

            LibLynx = BizInvoker.GetInvoker <LibLynx>(resolver, CallingConventionAdapters.Native);
        }
示例#3
0
文件: Lynx.cs 项目: lenalia/BizHawk
 public void Dispose()
 {
     if (Core != IntPtr.Zero)
     {
         LibLynx.Destroy(Core);
         Core = IntPtr.Zero;
     }
 }
示例#4
0
        public byte[] CloneSaveRam()
        {
            if (!LibLynx.GetSaveRamPtr(Core, out var size, out var data))
            {
                return(null);
            }

            byte[] ret = new byte[size];
            Marshal.Copy(data, ret, 0, size);
            return(ret);
        }
示例#5
0
        public void LoadStateText(TextReader reader)
        {
            var s = (TextState <TextStateData>)_ser.Deserialize(reader, typeof(TextState <TextStateData>));

            s.Prepare();
            var ff = s.GetFunctionPointersLoad();

            LibLynx.TxtStateLoad(Core, ref ff);
            IsLagFrame = s.ExtraData.IsLagFrame;
            LagCount   = s.ExtraData.LagCount;
            Frame      = s.ExtraData.Frame;
        }
示例#6
0
        public void StoreSaveRam(byte[] srcData)
        {
            if (!LibLynx.GetSaveRamPtr(Core, out var size, out var data))
            {
                throw new InvalidOperationException();
            }

            if (size != srcData.Length)
            {
                throw new ArgumentOutOfRangeException();
            }

            Marshal.Copy(srcData, 0, data, size);
        }
示例#7
0
        public void SaveStateText(TextWriter writer)
        {
            var s = new TextState <TextStateData>();

            s.Prepare();
            var ff = s.GetFunctionPointersSave();

            LibLynx.TxtStateSave(Core, ref ff);
            s.ExtraData.IsLagFrame = IsLagFrame;
            s.ExtraData.LagCount   = LagCount;
            s.ExtraData.Frame      = Frame;

            _ser.Serialize(writer, s);
        }
示例#8
0
        public void SaveStateBinary(BinaryWriter writer)
        {
            if (!LibLynx.BinStateSave(Core, _savebuff, _savebuff.Length))
            {
                throw new InvalidOperationException($"Core's {nameof(LibLynx.BinStateSave)}() returned false!");
            }

            writer.Write(_savebuff.Length);
            writer.Write(_savebuff);

            // other variables
            writer.Write(IsLagFrame);
            writer.Write(LagCount);
            writer.Write(Frame);
        }
示例#9
0
        public void SaveStateText(TextWriter writer)
        {
            var s = new TextState <TextStateData>();

            s.Prepare();
            var ff = s.GetFunctionPointersSave();

            LibLynx.TxtStateSave(Core, ref ff);
            s.ExtraData.IsLagFrame = IsLagFrame;
            s.ExtraData.LagCount   = LagCount;
            s.ExtraData.Frame      = Frame;

            _ser.Serialize(writer, s);

            ////Console.WriteLine(BizHawk.Common.BufferExtensions.BufferExtensions.HashSHA1(SaveStateBinary()));
        }
示例#10
0
文件: Lynx.cs 项目: lenalia/BizHawk
        public void FrameAdvance(bool render, bool rendersound = true)
        {
            Frame++;
            if (Controller.IsPressed("Power"))
            {
                LibLynx.Reset(Core);
            }

            int samples = _soundbuff.Length;

            IsLagFrame = LibLynx.Advance(Core, GetButtons(), _videobuff, _soundbuff, ref samples);
            _numsamp   = samples / 2;           // sound provider wants number of sample pairs
            if (IsLagFrame)
            {
                LagCount++;
            }
        }
示例#11
0
        public void LoadStateBinary(BinaryReader reader)
        {
            int length = reader.ReadInt32();

            if (length != _savebuff.Length)
            {
                throw new InvalidOperationException("Save buffer size mismatch!");
            }

            reader.Read(_savebuff, 0, length);
            if (!LibLynx.BinStateLoad(Core, _savebuff, _savebuff.Length))
            {
                throw new InvalidOperationException($"Core's {nameof(LibLynx.BinStateLoad)}() returned false!");
            }

            // other variables
            IsLagFrame = reader.ReadBoolean();
            LagCount   = reader.ReadInt32();
            Frame      = reader.ReadInt32();
        }
示例#12
0
文件: Lynx.cs 项目: gocha/BizHawk
        public bool FrameAdvance(IController controller, bool render, bool rendersound = true)
        {
            if (controller.IsPressed("Power"))
            {
                LibLynx.Reset(Core);
            }

            int samples = _soundBuff.Length;

            IsLagFrame = LibLynx.Advance(Core, GetButtons(controller), _videoBuff, _soundBuff, ref samples);
            _numSamp   = samples / 2;           // sound provider wants number of sample pairs
            if (IsLagFrame)
            {
                LagCount++;
            }

            Frame++;

            return(true);
        }
示例#13
0
文件: Lynx.cs 项目: lenalia/BizHawk
        public Lynx(byte[] file, GameInfo game, CoreComm comm)
        {
            ServiceProvider = new BasicServiceProvider(this);
            CoreComm        = comm;

            byte[] bios = CoreComm.CoreFileProvider.GetFirmware("Lynx", "Boot", true, "Boot rom is required");
            if (bios.Length != 512)
            {
                throw new MissingFirmwareException("Lynx Bootrom must be 512 bytes!");
            }

            int pagesize0 = 0;
            int pagesize1 = 0;

            byte[] realfile = null;

            {
                var    ms     = new MemoryStream(file, false);
                var    br     = new BinaryReader(ms);
                string header = Encoding.ASCII.GetString(br.ReadBytes(4));
                int    p0     = br.ReadUInt16();
                int    p1     = br.ReadUInt16();
                int    ver    = br.ReadUInt16();
                string cname  = Encoding.ASCII.GetString(br.ReadBytes(32)).Trim();
                string mname  = Encoding.ASCII.GetString(br.ReadBytes(16)).Trim();
                int    rot    = br.ReadByte();

                ms.Position = 6;
                string bs93 = Encoding.ASCII.GetString(br.ReadBytes(6));
                if (bs93 == "BS93")
                {
                    throw new InvalidOperationException("Unsupported BS93 Lynx ram image");
                }

                if (header == "LYNX" && (ver & 255) == 1)
                {
                    Console.WriteLine("Processing Handy-Lynx header");
                    pagesize0 = p0;
                    pagesize1 = p1;
                    Console.WriteLine("TODO: Rotate {0}", rot);
                    Console.WriteLine("Cart: {0} Manufacturer: {1}", cname, mname);
                    realfile = new byte[file.Length - 64];
                    Buffer.BlockCopy(file, 64, realfile, 0, realfile.Length);
                    Console.WriteLine("Header Listed banking: {0} {1}", p0, p1);
                }
                else
                {
                    Console.WriteLine("No Handy-Lynx header found!  Assuming raw rom image.");
                    realfile = file;
                }
            }

            if (game.OptionPresent("pagesize0"))
            {
                pagesize0 = int.Parse(game.OptionValue("pagesize0"));
                pagesize1 = int.Parse(game.OptionValue("pagesize1"));
                Console.WriteLine("Loading banking options {0} {1} from gamedb", pagesize0, pagesize1);
            }

            if (pagesize0 == 0 && pagesize1 == 0)
            {
                switch (realfile.Length)
                {
                case 0x10000: pagesize0 = 0x100; break;

                case 0x20000: pagesize0 = 0x200; break;                         //

                case 0x40000: pagesize0 = 0x400; break;                         // all known good dumps fall in one of these three categories

                case 0x80000: pagesize0 = 0x800; break;                         //

                case 0x30000: pagesize0 = 0x200; pagesize1 = 0x100; break;

                case 0x50000: pagesize0 = 0x400; pagesize1 = 0x100; break;

                case 0x60000: pagesize0 = 0x400; pagesize1 = 0x200; break;

                case 0x90000: pagesize0 = 0x800; pagesize1 = 0x100; break;

                case 0xa0000: pagesize0 = 0x800; pagesize1 = 0x200; break;

                case 0xc0000: pagesize0 = 0x800; pagesize1 = 0x400; break;

                case 0x100000: pagesize0 = 0x800; pagesize1 = 0x800; break;
                }
                Console.WriteLine("Auto-guessed banking options {0} {1}", pagesize0, pagesize1);
            }

            Core = LibLynx.Create(realfile, realfile.Length, bios, bios.Length, pagesize0, pagesize1, false);
            try
            {
                CoreComm.VsyncNum = 16000000;                 // 16.00 mhz refclock
                CoreComm.VsyncDen = 16 * 105 * 159;

                _savebuff  = new byte[LibLynx.BinStateSize(Core)];
                _savebuff2 = new byte[_savebuff.Length + 13];

                int rot = game.OptionPresent("rotate") ? int.Parse(game.OptionValue("rotate")) : 0;
                LibLynx.SetRotation(Core, rot);
                if ((rot & 1) != 0)
                {
                    BufferWidth  = Height;
                    BufferHeight = Width;
                }
                else
                {
                    BufferWidth  = Width;
                    BufferHeight = Height;
                }
                SetupMemoryDomains();
            }
            catch
            {
                Dispose();
                throw;
            }
        }