From ad5d2cf35a7dcbd0d77b58b0a0dc4aed07e2999b Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Fri, 20 Dec 2024 17:24:09 +0800 Subject: [PATCH] =?UTF-8?q?VirtualNes.Core=E6=A0=B8=E5=BF=83=E4=BD=8E?= =?UTF-8?q?=E7=89=88=E6=9C=ACC#=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/VirtualNes.Core/NES.cs | 78 +++++++++---------- .../Assets/VirtualNes.Core/State/BLOCKHDR.cs | 6 +- .../Assets/VirtualNes.Core/State/CTRSTAT.cs | 4 +- .../Assets/VirtualNes.Core/State/EXCTRSTAT.cs | 4 +- .../Assets/VirtualNes.Core/State/FILEHDR2.cs | 4 +- .../Assets/VirtualNes.Core/State/MMCSTAT.cs | 4 +- .../Assets/VirtualNes.Core/State/RAMSTAT.cs | 4 +- .../Assets/VirtualNes.Core/State/REGSTAT.cs | 12 +-- .../Assets/VirtualNes.Core/State/SNDSTAT.cs | 4 +- .../Assets/VirtualNes.Core/State/State.cs | 2 +- .../Supporter/ControllerState.cs | 75 +++++++++++------- .../VirtualNes.Core/Supporter/Supporter.cs | 25 +++++- 12 files changed, 132 insertions(+), 90 deletions(-) diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/NES.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/NES.cs index 91cb521..1b9f76b 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/NES.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/NES.cs @@ -1,4 +1,4 @@ -using System; +锘縰sing System; using System.Collections.Generic; using System.IO; using System.Text; @@ -249,7 +249,7 @@ namespace VirtualNes.Core LoadDISK(); { - // Padクラス内だと初期化タイミングが遅いのでここで + // Pad銈儵銈瑰唴銇犮仺鍒濇湡鍖栥偪銈ゃ儫銉炽偘銇岄亝銇勩伄銇с亾銇撱仹 uint crc = rom.GetPROM_CRC(); if ( crc == 0xe792de94 // Best Play - Pro Yakyuu (New) (J) @@ -275,7 +275,7 @@ namespace VirtualNes.Core LoadTurboFile(); - // VS-Unisystemのデフォルト設定 + // VS-Unisystem銇儑銉曘偐銉儓瑷畾 if (rom.IsVSUNISYSTEM()) { uint crc = rom.GetPROM_CRC(); @@ -286,13 +286,13 @@ namespace VirtualNes.Core Reset(); - // ゲーム固有のデフォルトオプションを設定(設定戻す時に使う為) + // 銈层兗銉犲浐鏈夈伄銉囥儠銈┿儷銉堛偑銉椼偡銉с兂銈掕ō瀹(瑷畾鎴汇仚鏅傘伀浣裤亞鐐) GameOption.defRenderMethod = (int)GetRenderMethod(); GameOption.defIRQtype = GetIrqType(); GameOption.defFrameIRQ = GetFrameIRQmode(); GameOption.defVideoMode = GetVideoMode(); - // 設定をロードして設定する(エントリが無ければデフォルトが入る) + // 瑷畾銈掋儹銉笺儔銇椼仸瑷畾銇欍倠(銈ㄣ兂銉堛儶銇岀劇銇戙倢銇般儑銉曘偐銉儓銇屽叆銈) if (rom.GetMapperNo() != 20) { GameOption.Load(rom.GetPROM_CRC()); @@ -331,12 +331,12 @@ namespace VirtualNes.Core { if (fp == null) { - // xxx ファイルを開けません + // xxx 銉曘偂銈ゃ儷銈掗枊銇戙伨銇涖倱 throw new Exception($"Can Not Open File [TurboFile.vtf]"); } long size = fp.Length; - // ファイルサイズ取得 + // 銉曘偂銈ゃ儷銈点偆銈哄彇寰 if (size > 32 * 1024) { size = 32 * 1024; @@ -354,7 +354,7 @@ namespace VirtualNes.Core private void LoadDISK() { - //todo : 磁碟机读取支持 + //todo : 纾佺鏈鸿鍙栨敮鎸 } private void LoadSRAM() @@ -400,7 +400,7 @@ namespace VirtualNes.Core { int i; - // 儊儌儕僋儕傾 + // 鍎婂剬鍎曞儖鍎曞偩 MemoryUtility.ZEROMEMORY(MMU.RAM, MMU.RAM.Length); MemoryUtility.ZEROMEMORY(MMU.WRAM, MMU.WRAM.Length); MemoryUtility.ZEROMEMORY(MMU.DRAM, MMU.DRAM.Length); @@ -420,11 +420,11 @@ namespace VirtualNes.Core MMU.PROM = MMU.VROM = null; - // 0 彍嶼杊巭懳嶔 + // 0 褰嶅都鏉婂翻鎳冲稊 MMU.PROM_8K_SIZE = MMU.PROM_16K_SIZE = MMU.PROM_32K_SIZE = 1; MMU.VROM_1K_SIZE = MMU.VROM_2K_SIZE = MMU.VROM_4K_SIZE = MMU.VROM_8K_SIZE = 1; - // 僨僼僅儖僩僶儞僋愝掕 + // 鍍ㄥ兗鍍呭剸鍍╁兌鍎炲儖鎰濇帟 for (i = 0; i < 8; i++) { MMU.CPU_MEM_BANK[i] = null; @@ -432,11 +432,11 @@ namespace VirtualNes.Core MMU.CPU_MEM_PAGE[i] = 0; } - // 撪憻RAM/WRAM + // 鎾喕RAM/WRAM MMU.SetPROM_Bank(0, MMU.RAM, MMU.BANKTYPE_RAM); MMU.SetPROM_Bank(3, MMU.WRAM, MMU.BANKTYPE_RAM); - // 僟儈乕 + // 鍍熷剤涔 MMU.SetPROM_Bank(1, MMU.XRAM, MMU.BANKTYPE_ROM); MMU.SetPROM_Bank(2, MMU.XRAM, MMU.BANKTYPE_ROM); @@ -522,7 +522,7 @@ namespace VirtualNes.Core } } } - ppu.ScanlineNext(); // 偙傟偺埵抲偱儔僗僞乕宯偼夋柺偑堘偆 + ppu.ScanlineNext(); // 鍋欏偀鍋哄煹鎶插伇鍎斿儣鍍炰箷瀹伡澶嬫熀鍋戝牁鍋 if (RenderMethod == EnumRenderMethod.PRE_ALL_RENDER) EmulationCPU(nescfg.ScanlineCycles); @@ -583,7 +583,7 @@ namespace VirtualNes.Core { pad.VSync(); - // VBLANK婜娫 + // VBLANK濠滃ǐ if (scanline == nescfg.TotalScanlines - 1) { ppu.VBlankEnd(); @@ -642,7 +642,7 @@ namespace VirtualNes.Core if (scanline == 0) { - // 僟儈乕僗僉儍儞儔僀儞 + // 鍍熷剤涔曞儣鍍夊剭鍎炲剶鍍鍎 // H-Draw (4fetches*32) EmulationCPU(FETCH_CYCLES * 128); ppu.FrameStart(); @@ -655,7 +655,7 @@ namespace VirtualNes.Core } else if (scanline < 240) { - // 僗僋儕乕儞昤夋(Scanline 1乣239) + // 鍍楀儖鍎曚箷鍎炴槫澶(Scanline 1涔239) if (bDraw) { ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip); @@ -707,7 +707,7 @@ namespace VirtualNes.Core } else if (scanline == 240) { - // 僟儈乕僗僉儍儞儔僀儞 (Scanline 240) + // 鍍熷剤涔曞儣鍍夊剭鍎炲剶鍍鍎 (Scanline 240) mapper.VSync(); EmulationCPU(nescfg.HDrawCycles); @@ -720,7 +720,7 @@ namespace VirtualNes.Core { pad.VSync(); - // VBLANK婜娫 + // VBLANK濠滃ǐ if (scanline == nescfg.TotalScanlines - 1) { ppu.VBlankEnd(); @@ -864,7 +864,7 @@ namespace VirtualNes.Core MMU.VROM_4K_SIZE = rom.GetVROM_SIZE() * 2; MMU.VROM_8K_SIZE = rom.GetVROM_SIZE(); - // 僨僼僅儖僩僶儞僋 + // 鍍ㄥ兗鍍呭剸鍍╁兌鍎炲儖 if (MMU.VROM_8K_SIZE != 0) { MMU.SetVROM_8K_Bank(0); @@ -874,7 +874,7 @@ namespace VirtualNes.Core MMU.SetCRAM_8K_Bank(0); } - // 儈儔乕 + // 鍎堝剶涔 if (rom.Is4SCREEN()) { MMU.SetVRAM_Mirror(MMU.VRAM_MIRROR4); @@ -976,13 +976,13 @@ namespace VirtualNes.Core reg.S = 0xFF; reg.P = CPU.Z_FLAG | CPU.R_FLAG | CPU.I_FLAG; - // 埨慡懳嶔傪寭偹偰偁偊偰儖乕僾偵(1昩暘) + // 鍩ㄦ叀鎳冲稊鍌鍋瑰伆鍋佸亰鍋板剸涔曞兙鍋(1鏄╂殬) for (int i = 0; i < nescfg.TotalScanlines * 60; i++) { EmulationCPU(nescfg.ScanlineCycles); cpu.GetContext(ref reg); - // 柍尷儖乕僾偵擖偭偨偙偲傪妋擣偟偨傜敳偗傞 + // 鏌嶅胺鍎栦箷鍍惧伒鎿栧伃鍋ㄥ仚鍋插偑濡嬫摚鍋熷仺鍌滄暢鍋楀倿 if (reg.PC == 0x4700) { break; @@ -993,7 +993,7 @@ namespace VirtualNes.Core } cpu.GetContext(ref reg); - // 柍尷儖乕僾偵擖偭偰偄偨傜嵞愝掕偡傞 + // 鏌嶅胺鍎栦箷鍍惧伒鎿栧伃鍋板亜鍋ㄥ倻宓炴劃鎺曞仭鍌 if (reg.PC == 0x4700) { reg.PC = 0x4720; // Play Address @@ -1009,7 +1009,7 @@ namespace VirtualNes.Core else { cpu.GetContext(ref reg); - reg.PC = 0x4700; // 柍尷儖乕僾 + reg.PC = 0x4700; // 鏌嶅胺鍎栦箷鍍 reg.S = 0xFF; EmulationCPU(nescfg.ScanlineCycles * nescfg.TotalScanlines); @@ -1186,7 +1186,7 @@ namespace VirtualNes.Core if (m_BarcodeCycles > 1000) { m_BarcodeCycles = 0; - // 掆巭丠 + // 鎺嗗翻涓 if (m_BarcodeData[m_BarcodePtr] != 0xFF) { m_BarcodeOut = m_BarcodeData[m_BarcodePtr++]; @@ -1227,7 +1227,7 @@ namespace VirtualNes.Core return; m_TapeCycles += (nescfg.CpuClock / 32000.0); - // m_TapeCycles += (nescfg.CpuClock / 22050.0); // 抶偡偓偰僟儊偭傐偄 + // m_TapeCycles += (nescfg.CpuClock / 22050.0); // 鎶跺仭鍋撳伆鍍熷剨鍋倫鍋 if (m_bTapePlay) { @@ -1293,7 +1293,7 @@ namespace VirtualNes.Core return MMU.CPU_MEM_BANK[addr >> 13][addr & 0x1FFF]; } - return 0x00; // Warning梊杊 + return 0x00; // Warning姊婃潑 } private byte ReadReg(ushort addr) @@ -1504,7 +1504,7 @@ namespace VirtualNes.Core pad.Write(addr, data); apu.Write(addr, data); break; - // VirtuaNES屌桳億乕僩 + // VirtuaNES灞屾〕鍎勪箷鍍 case 0x18: apu.Write(addr, data); break; @@ -1596,7 +1596,7 @@ namespace VirtualNes.Core ref state.reg.cpureg.FrameIRQ_type, ref state.reg.cpureg.FrameIRQ, ref state.reg.cpureg.FrameIRQ_occur); - state.reg.cpureg.FrameIRQ_cycles = cycles; // 参照がINTな為(ぉ + state.reg.cpureg.FrameIRQ_cycles = cycles; // 鍙傜収銇孖NT銇偤锛堛亯 state.reg.cpureg.DMA_cycles = cpu.GetDmaCycles(); state.reg.cpureg.emul_cycles = emul_cycles; @@ -1625,7 +1625,7 @@ namespace VirtualNes.Core MemoryUtility.memcpy(state.ram.SPPAL, MMU.SPPAL, state.ram.SPPAL.Length); MemoryUtility.memcpy(state.ram.SPRAM, MMU.SPRAM, state.ram.SPRAM.Length); - // S-RAM STATE(使用/未使用に関わらず存在すればセーブする) + // S-RAM STATE(浣跨敤/鏈娇鐢ㄣ伀闁€倧銈夈仛瀛樺湪銇欍倢銇般偦銉笺儢銇欍倠) if (rom.IsSAVERAM()) { size = (uint)SAVERAM_SIZE; @@ -1649,9 +1649,9 @@ namespace VirtualNes.Core uint size = 0; // SAVE CPU MEMORY BANK DATA - // BANK0,1,2はバンクセーブに関係なし - // VirtuaNES0.30から - // バンク3はSRAM使用に関わらずセーブ + // BANK0,1,2銇儛銉炽偗銈汇兗銉栥伀闁總銇仐 + // VirtuaNES0.30銇嬨倝 + // 銉愩兂銈紦銇疭RAM浣跨敤銇枹銈忋倝銇氥偦銉笺儢 for (int i = 3; i < 8; i++) { state.mmu.CPU_MEM_TYPE[i] = MMU.CPU_MEM_TYPE[i]; @@ -1696,7 +1696,7 @@ namespace VirtualNes.Core } } - // WRITE VRAM MEMORY(常に4K分すべて書き込む) + // WRITE VRAM MEMORY(甯搞伀4K鍒嗐仚銇广仸鏇搞亶杈笺個) state.VRAM = new byte[4 * 1024]; Array.Copy(MMU.VRAM, state.VRAM, state.VRAM.Length); @@ -1764,7 +1764,7 @@ namespace VirtualNes.Core int DiskSize = 16 + 65500 * rom.GetDiskNo(); - // 相違数をカウント + // 鐩搁仌鏁般倰銈偊銉炽儓 for (int i = 16; i < DiskSize; i++) { if (lpWrite[i] != 0) @@ -1874,9 +1874,9 @@ namespace VirtualNes.Core //BANK STATE { // SAVE CPU MEMORY BANK DATA - // BANK0,1,2はバンクセーブに関係なし - // VirtuaNES0.30から - // バンク3はSRAM使用に関わらずセーブ + // BANK0,1,2銇儛銉炽偗銈汇兗銉栥伀闁總銇仐 + // VirtuaNES0.30銇嬨倝 + // 銉愩兂銈紦銇疭RAM浣跨敤銇枹銈忋倝銇氥偦銉笺儢 for (byte i = 3; i < 8; i++) { MMU.CPU_MEM_TYPE[i] = state.mmu.CPU_MEM_TYPE[i]; diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/BLOCKHDR.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/BLOCKHDR.cs index d43a25e..cba1d1d 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/BLOCKHDR.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/BLOCKHDR.cs @@ -2,7 +2,7 @@ { public struct BLOCKHDR : IStateBufferObject { - public bool Valid => !string.IsNullOrEmpty(ID); + public bool Valid => !string.IsNullOrEmpty(ID); /// 鎬绘槸8涓瓧鑺 public string ID; public ushort Reserved; @@ -11,12 +11,12 @@ - public uint GetSize() + public uint GetSize() { return (uint)(8 + sizeof(ushort) + sizeof(ushort) + sizeof(uint)); } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { if (Valid) { diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/CTRSTAT.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/CTRSTAT.cs index 24ec730..b07bedf 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/CTRSTAT.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/CTRSTAT.cs @@ -8,12 +8,12 @@ public uint pad4bit; public byte strobe; - public uint GetSize() + public uint GetSize() { return sizeof(uint) * 4 + sizeof(byte); } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { buffer.Write(pad1bit); buffer.Write(pad2bit); diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/EXCTRSTAT.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/EXCTRSTAT.cs index 6c24dc6..ee1681e 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/EXCTRSTAT.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/EXCTRSTAT.cs @@ -4,12 +4,12 @@ { public uint data; - public uint GetSize() + public uint GetSize() { return sizeof(uint); } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { buffer.Write(data); } diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/FILEHDR2.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/FILEHDR2.cs index cbcafdc..e9a789b 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/FILEHDR2.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/FILEHDR2.cs @@ -14,12 +14,12 @@ - public uint GetSize() + public uint GetSize() { return (uint)(ID.Length + sizeof(ushort) + sizeof(uint) + sizeof(ushort) + sizeof(ushort)); } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { buffer.Write(ID); buffer.Write(BlockVersion); diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/MMCSTAT.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/MMCSTAT.cs index 0ea4f3f..918b122 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/MMCSTAT.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/MMCSTAT.cs @@ -9,12 +9,12 @@ return new MMCSTAT() { mmcdata = new byte[256] }; } - public uint GetSize() + public uint GetSize() { return 256; } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { buffer.Write(mmcdata); } diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/RAMSTAT.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/RAMSTAT.cs index 2ef839a..8d7f141 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/RAMSTAT.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/RAMSTAT.cs @@ -22,12 +22,12 @@ namespace VirtualNes.Core return res; } - public uint GetSize() + public uint GetSize() { return (uint)(RAM.Length + BGPAL.Length + SPPAL.Length + SPRAM.Length); } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { buffer.Write(RAM); buffer.Write(BGPAL); diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/REGSTAT.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/REGSTAT.cs index d773439..4033397 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/REGSTAT.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/REGSTAT.cs @@ -7,12 +7,12 @@ - public uint GetSize() + public uint GetSize() { return cpureg.GetSize() + ppureg.GetSize(); } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { cpureg.SaveState(buffer); ppureg.SaveState(buffer); @@ -45,12 +45,12 @@ public long emul_cycles; public long base_cycles; - public uint GetSize() + public uint GetSize() { return 32; } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { buffer.Write(PC); buffer.Write(A); @@ -102,12 +102,12 @@ public ushort loopy_v; public ushort loopy_x; - public uint GetSize() + public uint GetSize() { return 12; } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { buffer.Write(reg0); buffer.Write(reg1); diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/SNDSTAT.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/SNDSTAT.cs index a546561..4ed6c4c 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/SNDSTAT.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/SNDSTAT.cs @@ -9,12 +9,12 @@ return new SNDSTAT() { snddata = new byte[0x800] }; } - public uint GetSize() + public uint GetSize() { return (uint)snddata.Length; } - public void SaveState(StateBuffer buffer) + public void SaveState(StateBuffer buffer) { buffer.Write(snddata); } diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/State.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/State.cs index 02d3261..6b66f70 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/State.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/State/State.cs @@ -36,7 +36,7 @@ namespace VirtualNes.Core public BLOCKHDR exctrBLOCK; public EXCTRSTAT exctr; - public byte[] ToBytes() + public byte[] ToBytes() { StateBuffer buffer = new StateBuffer(); diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/Supporter/ControllerState.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/Supporter/ControllerState.cs index 409ba18..edb443d 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/Supporter/ControllerState.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/Supporter/ControllerState.cs @@ -2,7 +2,7 @@ namespace VirtualNes.Core { - public struct ControllerState + public struct ControllerState : IEquatable { public uint raw0; public uint raw1; @@ -11,19 +11,55 @@ namespace VirtualNes.Core public bool valid; - public ControllerState( - EnumButtonType player0_buttons, - EnumButtonType player1_buttons, - EnumButtonType player2_buttons, - EnumButtonType player3_buttons) + public ControllerState(EnumButtonType[] states) { - raw0 = (uint)player0_buttons; - raw1 = (uint)player1_buttons; - raw2 = (uint)player2_buttons; - raw3 = (uint)player3_buttons; + raw0 = (uint)states[0]; + raw1 = (uint)states[1]; + raw2 = (uint)states[2]; + raw3 = (uint)states[3]; valid = true; } + + public bool HasButton(int player, EnumButtonType button) + { + uint raw; + switch (player) + { + case 0: raw = raw0; break; + case 1: raw = raw1; break; + case 2: raw = raw2; break; + case 3: raw = raw3; break; + default: + raw = 0; + break; + } + return (raw & (uint)button) == (uint)button; + } + + public override string ToString() + { + return $"{raw0}|{raw1}|{raw2}|{raw3}"; + } + + #region Impl_Equals + public bool Equals(ControllerState other) + { + return raw0 == other.raw0 && raw1 == other.raw1 && raw2 == other.raw2 && raw3 == other.raw3 && valid == other.valid; + } + + public override bool Equals(object obj) + { + return obj is ControllerState other && Equals(other); + } + + public override int GetHashCode() + { + //return HashCode.Combine(raw0, raw1, raw2, raw3, valid); + return raw0.GetHashCode()+ raw1.GetHashCode()+ raw2.GetHashCode()+ raw3.GetHashCode(); + + } + public static bool operator ==(ControllerState left, ControllerState right) { return @@ -37,24 +73,7 @@ namespace VirtualNes.Core { return !(left == right); } - - public override string ToString() - { - return $"{raw0}|{raw1}|{raw2}|{raw3}"; - } - - public bool HasButton(int player, EnumButtonType button) - { - uint raw = 0; - switch (player) - { - case 0: raw = raw0; break; - case 1: raw = raw1; break; - case 2: raw = raw2; break; - case 3: raw = raw3; break; - } - return (raw & (uint)button) == (uint)button; - } + #endregion } [Flags] diff --git a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/Supporter/Supporter.cs b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/Supporter/Supporter.cs index 41ec222..2254833 100644 --- a/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/Supporter/Supporter.cs +++ b/AxibugEmuOnline.Client.Transplant/Assets/VirtualNes.Core/Supporter/Supporter.cs @@ -5,6 +5,7 @@ namespace VirtualNes.Core public static class Supporter { private static ISupporterImpl s_support; + public static void Setup(ISupporterImpl supporter) { s_support = supporter; @@ -44,6 +45,7 @@ namespace VirtualNes.Core { s_support.SaveFile(fileData, directPath, fileName); } + public static Stream OpenFile(string directPath, string fileName) { return s_support.OpenFile(directPath, fileName); @@ -64,6 +66,11 @@ namespace VirtualNes.Core s_support.SampleInput(frameCount); } + public static IControllerSetuper GetControllerSetuper() + { + return s_support.GetControllerSetuper(); + } + public static EmulatorConfig Config => s_support.Config; } @@ -82,5 +89,21 @@ namespace VirtualNes.Core bool TryGetMapperNo(ROM rom, out int mapperNo); ControllerState GetControllerState(); void SampleInput(uint frameCount); + IControllerSetuper GetControllerSetuper(); } -} + + /// + /// 璐熻矗绠$悊鏈湴鎺у埗鍣ㄤ笌鍏蜂綋娓告垙涔嬮棿鐨勬Ы浣嶅垎閰 + /// + public interface IControllerSetuper + { + /// + /// 璁剧疆鏈湴鎵嬫焺涓庢父鎴忔墜鏌勬Ы浣嶇殑鏄犲皠 + /// + void SetConnect( + uint? con0ToSlot = null, + uint? con1ToSlot = null, + uint? con2ToSlot = null, + uint? con3ToSlot = null); + } +} \ No newline at end of file