private void InitSaveRamBuff() { int size = 0; LibQuickNES.ThrowStringError(QN.qn_battery_ram_size(Context, ref size)); _saveRamBuff = new byte[size]; }
private void InitSaveStateBuff() { int size = 0; LibQuickNES.ThrowStringError(QN.qn_state_size(Context, ref size)); _saveStateBuff = new byte[size]; }
private static byte[] GetDefaultColors() { IntPtr src = QN.qn_get_default_colors(); byte[] ret = new byte[1536]; Marshal.Copy(src, ret, 0, 1536); return(ret); }
static QuickNES() { var resolver = new DynamicLibraryImportResolver( $"libquicknes{(OSTailoredCode.IsUnixHost ? ".dll.so.0.7.0" : ".dll")}", hasLimitedLifetime: false); QN = BizInvoker.GetInvoker <LibQuickNES>(resolver, CallingConventionAdapters.Native); QN.qn_setup_mappers(); }
public PutSettingsDirtyBits PutSettings(QuickNESSettings o) { _settings = o; QN.qn_set_sprite_limit(Context, _settings.NumSprites); RecalculateCrops(); CalculatePalette(); return(PutSettingsDirtyBits.None); }
public bool PutSettings(QuickNESSettings o) { _settings = o; QN.qn_set_sprite_limit(Context, _settings.NumSprites); RecalculateCrops(); CalculatePalette(); return(false); }
public void SaveStateBinary(System.IO.BinaryWriter writer) { CheckDisposed(); LibQuickNES.ThrowStringError(QN.qn_state_save(Context, SaveStateBuff, SaveStateBuff.Length)); writer.Write(SaveStateBuff.Length); writer.Write(SaveStateBuff); // other variables writer.Write(IsLagFrame); writer.Write(LagCount); writer.Write(Frame); }
public bool PutSettings(QuickNESSettings o) { _settings = o; QN.qn_set_sprite_limit(Context, _settings.NumSprites); RecalculateCrops(); CalculatePalette(); CoreComm.ScreenLogicalOffsetX = o.ClipLeftAndRight ? 8 : 0; CoreComm.ScreenLogicalOffsetY = o.ClipTopAndBottom ? 8 : 0; return(false); }
unsafe void InitMemoryDomains() { List <MemoryDomain> mm = new List <MemoryDomain>(); for (int i = 0; ; i++) { IntPtr data = IntPtr.Zero; int size = 0; bool writable = false; IntPtr name = IntPtr.Zero; if (!QN.qn_get_memory_area(Context, i, ref data, ref size, ref writable, ref name)) { break; } if (data != IntPtr.Zero && size > 0 && name != IntPtr.Zero) { mm.Add(MemoryDomain.FromIntPtr(Marshal.PtrToStringAnsi(name), size, MemoryDomain.Endian.Little, data, writable)); } } // add system bus mm.Add(new MemoryDomain ( "System Bus", 0x10000, MemoryDomain.Endian.Unknown, delegate(long addr) { if (addr < 0 || addr >= 0x10000) { throw new ArgumentOutOfRangeException(); } return(QN.qn_peek_prgbus(Context, (int)addr)); }, delegate(long addr, byte val) { if (addr < 0 || addr >= 0x10000) { throw new ArgumentOutOfRangeException(); } QN.qn_poke_prgbus(Context, (int)addr, val); } )); _memoryDomains = new MemoryDomainList(mm); (ServiceProvider as BasicServiceProvider).Register <IMemoryDomains>(_memoryDomains); }
public IDictionary <string, RegisterValue> GetCpuFlagsAndRegisters() { int[] regs = new int[6]; var ret = new Dictionary <string, RegisterValue>(); QN.qn_get_cpuregs(Context, regs); ret["A"] = (byte)regs[0]; ret["X"] = (byte)regs[1]; ret["Y"] = (byte)regs[2]; ret["SP"] = (ushort)regs[3]; ret["PC"] = (ushort)regs[4]; ret["P"] = (byte)regs[5]; return(ret); }
public QuickNES(CoreComm comm, byte[] file, object settings, object syncSettings) { FP = OSTailoredCode.IsUnixHost ? (IFPCtrl) new Unix_FPCtrl() : new Win32_FPCtrl(); using (FP.Save()) { ServiceProvider = new BasicServiceProvider(this); CoreComm = comm; Context = QN.qn_new(); if (Context == IntPtr.Zero) { throw new InvalidOperationException($"{nameof(QN.qn_new)}() returned NULL"); } try { file = FixInesHeader(file); LibQuickNES.ThrowStringError(QN.qn_loadines(Context, file, file.Length)); InitSaveRamBuff(); InitSaveStateBuff(); InitAudio(); InitMemoryDomains(); int mapper = 0; string mappername = Marshal.PtrToStringAnsi(QN.qn_get_mapper(Context, ref mapper)); Console.WriteLine("QuickNES: Booted with Mapper #{0} \"{1}\"", mapper, mappername); BoardName = mappername; PutSettings((QuickNESSettings)settings ?? new QuickNESSettings()); _syncSettings = (QuickNESSyncSettings)syncSettings ?? new QuickNESSyncSettings(); _syncSettingsNext = _syncSettings.Clone(); SetControllerDefinition(); ComputeBootGod(); ConnectTracer(); } catch { Dispose(); throw; } } }
public void LoadStateBinary(System.IO.BinaryReader reader) { CheckDisposed(); int len = reader.ReadInt32(); if (len != SaveStateBuff.Length) { throw new InvalidOperationException("Unexpected savestate buffer length!"); } reader.Read(SaveStateBuff, 0, SaveStateBuff.Length); LibQuickNES.ThrowStringError(QN.qn_state_load(Context, SaveStateBuff, SaveStateBuff.Length)); // other variables IsLagFrame = reader.ReadBoolean(); LagCount = reader.ReadInt32(); Frame = reader.ReadInt32(); }
private void DrainAudio() { _numSamples = QN.qn_read_audio(Context, _monoBuff, _monoBuff.Length); unsafe { fixed(short *_src = &_monoBuff[0], _dst = &_stereoBuff[0]) { short *src = _src; short *dst = _dst; for (int i = 0; i < _numSamples; i++) { *dst++ = *src; *dst++ = *src++; } } } }
public byte[] GetPalRam() { Marshal.Copy(QN.qn_get_palmem(Context), palrambuf, 0, 0x20); return(palrambuf); }
public ActionResult Add() { var id = Request.Form["mhid"]; var sort = Request.Form["sort"]; // 章节ID var name = Request.Form["name"]; var gid = 0; Tab_User u = null; HttpCookie authCookie = Request.Cookies["a"]; // 获取cookie if (authCookie != null) { try { FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value); // 解密 var user = SerializeHelper.FromJson <Tab_User>(ticket.UserData); u = _us.GetUser(user.F_Name, user.F_Password); if (u != null) { } else { return(RedirectToAction("SignOut", "Home")); } } catch (Exception ex) { return(RedirectToAction("SignOut", "Home")); } } var gzh = _gzhs.GetGZH(u.F_Id); if (gzh != null) { gid = gzh.F_Id; } if (gid == 0) { // IE浏览器对非ajax请求Content-Type:是json的不友好所以使用View而非Json return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "账号没有关联公众号" })); } int mhid = 0; if (id == null || !int.TryParse(id, out mhid) || mhid == 0) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "漫画ID无效" })); } int zjid = 0; if (sort == null || !int.TryParse(sort, out zjid) || zjid == 0) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "章节ID无效" })); } if (name == null || name.Length > 50) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "章节名称长度必须小于50字符" })); } var img = ""; if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0 && new string[] { ".gif", ".jpeg", ".jpg", ".png" }.Contains(System.IO.Path.GetExtension(Request.Files[0].FileName.ToLower()))) { var key = QN.MHimg(gid, mhid); var token = QN.GetUploadToken(QN.BUCKET, key); FormUploader fu = new FormUploader(); HttpResult result = fu.UploadStream(Request.Files[0].InputStream, key, token); if (result.Code == 200) { img = key; } } else { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "请为章节内容添加图片" })); } Tab_MHImg m = new Tab_MHImg(); m.F_Name = name; m.F_Img = img != "" ? img : null; m.F_MHId = mhid; m.F_Sort = zjid; m.F_UserId = u.F_Id; var i = _mhs.AddImg(m); if (i == 1) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.OK, message = "成功" })); } else if (i == 2) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "章节重复" })); } else { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "失败" })); } }
public byte[] GetOam() { Marshal.Copy(QN.qn_get_oammem(Context), oambuf, 0, 0x100); return(oambuf); }
private void Blit() { QN.qn_blit(Context, _videoOutput, _videoPalette, _cropLeft, _cropTop, _cropRight, _cropBottom); }
public byte[] GetPPUBus() { QN.qn_peek_ppubus(Context, ppubusbuf); return(ppubusbuf); }
public byte[] CloneSaveRam() { LibQuickNES.ThrowStringError(QN.qn_battery_ram_save(Context, _saveRamBuff, _saveRamBuff.Length)); return((byte[])_saveRamBuff.Clone()); }
public byte PeekPPU(int addr) { return(QN.qn_peek_ppu(Context, addr)); }
public void StoreSaveRam(byte[] data) { LibQuickNES.ThrowStringError(QN.qn_battery_ram_load(Context, data, data.Length)); }
public ActionResult Edit() { var name = Request.Form["name"]; var about = Request.Form["about"]; var gid = 0; Tab_User u = null; HttpCookie authCookie = Request.Cookies["a"]; // 获取cookie if (authCookie != null) { try { FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value); // 解密 var user = SerializeHelper.FromJson <Tab_User>(ticket.UserData); u = _us.GetUser(user.F_Name, user.F_Password); if (u != null) { } else { return(RedirectToAction("SignOut", "Home")); } } catch (Exception ex) { return(RedirectToAction("SignOut", "Home")); } } var gzh = _gzhs.GetGZH(u.F_Id); if (gzh != null) { gid = gzh.F_Id; } if (gid == 0) { // IE浏览器对非ajax请求Content-Type:是json的不友好所以使用View而非Json return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "账号没有关联公众号" })); } if (name != null && name.Length > 200) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "公号名称长度必须小于200字符" })); } if (about != null && about.Length > 4000) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "公号简介长度必须小于4000字符" })); } var logo = ""; if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0 && new string[] { ".gif", ".jpeg", ".jpg", ".png" }.Contains(System.IO.Path.GetExtension(Request.Files[0].FileName.ToLower()))) { var key = QN.GZHLogo(gid); var token = QN.GetUploadToken(QN.BUCKET, key); FormUploader fu = new FormUploader(); HttpResult result = fu.UploadStream(Request.Files[0].InputStream, key, token); if (result.Code == 200) { logo = key; } } Tab_GongZhongHao g = new Tab_GongZhongHao(); g.F_About = (about != null && about.Length > 0) ? about : null; g.F_Logo = logo != "" ? logo : null; g.F_Id = gid; var i = _gzhs.UpdateGZHInfo(g); if (i == 1) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.OK, message = "成功" })); } else { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "失败" })); } }
public ActionResult Edit() { var name = Request.Form["name"]; var id1 = Request.Form["gid"]; var id2 = Request.Form["id"]; var about = Request.Form["about"]; if (name == null || name.Length < 1 || name.Length > 50) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "长度必须大于1个字符小于50字符" })); } var gid = 0; if (!int.TryParse(id1, out gid) || gid == 0) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "公众号不存在" })); } var id = 0; if (!int.TryParse(id2, out id) || id == 0) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "漫画不存在" })); } if (about == null || about.Length > 2000) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "漫画简介必须小于2000字符" })); } var logo = ""; if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0 && new string[] { ".gif", ".jpeg", ".jpg", ".png" }.Contains(System.IO.Path.GetExtension(Request.Files[0].FileName.ToLower()))) { var key = QN.MHLogo(gid, id); var token = QN.GetUploadToken(QN.BUCKET, key); FormUploader fu = new FormUploader(); HttpResult result = fu.UploadStream(Request.Files[0].InputStream, key, token); if (result.Code == 200) { logo = key; } } Tab_MHCatalog m = new Tab_MHCatalog(); m.F_Catalog = name; m.F_GZHId = gid; m.F_Logo = logo != "" ? logo : null; m.F_Id = id; m.F_About = about; int i = _ms.UpdateMH(m); if (i == 1) { return(View(new DWZJson { statusCode = (int)DWZStatusCode.OK, message = "成功" })); } else { return(View(new DWZJson { statusCode = (int)DWZStatusCode.ERROR, message = "失败" })); } }
static QuickNES() { Resolver = new DynamicLibraryImportResolver($"libquicknes{(OSTailoredCode.CurrentOS == OSTailoredCode.DistinctOS.Windows ? ".dll" : ".dll.so.0.7.0")}"); QN = BizInvoker.GetInvoker <LibQuickNES>(Resolver, CallingConventionAdapters.Native); QN.qn_setup_mappers(); }
private void InitAudio() { LibQuickNES.ThrowStringError(QN.qn_set_sample_rate(Context, 44100)); }
static QuickNES() { Resolver = new DynamicLibraryImportResolver(LibQuickNES.dllname); QN = BizInvoker.GetInvoker <LibQuickNES>(Resolver, CallingConventionAdapters.Native); QN.qn_setup_mappers(); }
public ActionResult InfoEdit() { var id = Request.Form["id"]; var about = Request.Form["about"]; var gid = 0; if (!int.TryParse(id, out gid) || gid == 0) { // IE浏览器对非ajax请求Content-Type:是json的不友好所以使用View而非Json return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "公号不存在" })); } if (about != null && about.Length > 4000) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "公号简介长度必须小于4000字符" })); } var logo = ""; if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0 && new string[] { ".gif", ".jpeg", ".jpg", ".png" }.Contains(System.IO.Path.GetExtension(Request.Files[0].FileName.ToLower()))) { var key = QN.GZHLogo(gid); var token = QN.GetUploadToken(QN.BUCKET, key); FormUploader fu = new FormUploader(); HttpResult result = fu.UploadStream(Request.Files[0].InputStream, key, token); if (result.Code == 200) { logo = key; } } Tab_GongZhongHao g = new Tab_GongZhongHao(); g.F_About = (about != null && about.Length > 0) ? about : null; g.F_Logo = logo != "" ? logo : null; g.F_Id = gid; var i = _gzhs.UpdateGZHInfo(g); if (i == 1) { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.OK, message = "成功" })); } else { return(View(new DWZJson() { statusCode = (int)DWZStatusCode.ERROR, message = "失败" })); } }
static QuickNES() { Resolver = new DynamicLibraryImportResolver("libquicknes.dll" + (PlatformLinkedLibSingleton.RunningOnUnix ? ".so" : String.Empty)); QN = BizInvoker.GetInvoker <LibQuickNES>(Resolver, CallingConventionAdapters.Native); QN.qn_setup_mappers(); }
private void Blit() { QN.qn_blit(Context, VideoOutput, VideoPalette, cropleft, croptop, cropright, cropbottom); }