forked from sin365/AxibugEmuOnline
VirtualNes.Core核心低版本C#兼容
This commit is contained in:
parent
3e91952330
commit
ad5d2cf35a
@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@ -249,7 +249,7 @@ namespace VirtualNes.Core
|
|||||||
LoadDISK();
|
LoadDISK();
|
||||||
|
|
||||||
{
|
{
|
||||||
// Pad・ッ・鬣ケトレ、タ、ネウ<EFBFBD>レサッ・ソ・、・゚・<EFBFBD>ー、ャ゚W、、、ホ、ヌ、ウ、ウ、ヌ
|
// Padクラス内だと初期化タイミングが遅いのでここで
|
||||||
uint crc = rom.GetPROM_CRC();
|
uint crc = rom.GetPROM_CRC();
|
||||||
if (
|
if (
|
||||||
crc == 0xe792de94 // Best Play - Pro Yakyuu (New) (J)
|
crc == 0xe792de94 // Best Play - Pro Yakyuu (New) (J)
|
||||||
@ -275,7 +275,7 @@ namespace VirtualNes.Core
|
|||||||
|
|
||||||
LoadTurboFile();
|
LoadTurboFile();
|
||||||
|
|
||||||
// VS-Unisystem、ホ・ヌ・ユ・ゥ・<EFBFBD>ネヤOカィ
|
// VS-Unisystemのデフォルト設定
|
||||||
if (rom.IsVSUNISYSTEM())
|
if (rom.IsVSUNISYSTEM())
|
||||||
{
|
{
|
||||||
uint crc = rom.GetPROM_CRC();
|
uint crc = rom.GetPROM_CRC();
|
||||||
@ -286,13 +286,13 @@ namespace VirtualNes.Core
|
|||||||
|
|
||||||
Reset();
|
Reset();
|
||||||
|
|
||||||
// ・イゥ`・犹フモミ、ホ・ヌ・ユ・ゥ・<EFBDA9>ネ・ェ・ラ・キ・逾<EFBDA5><E980BE>Oカィ(ヤOカィ諾、ケ瓶、ヒハケ、ヲ樣)
|
// ゲーム固有のデフォルトオプションを設定(設定戻す時に使う為)
|
||||||
GameOption.defRenderMethod = (int)GetRenderMethod();
|
GameOption.defRenderMethod = (int)GetRenderMethod();
|
||||||
GameOption.defIRQtype = GetIrqType();
|
GameOption.defIRQtype = GetIrqType();
|
||||||
GameOption.defFrameIRQ = GetFrameIRQmode();
|
GameOption.defFrameIRQ = GetFrameIRQmode();
|
||||||
GameOption.defVideoMode = GetVideoMode();
|
GameOption.defVideoMode = GetVideoMode();
|
||||||
|
|
||||||
// ヤOカィ、<EFBFBD>愰`・ノ、キ、ニヤOカィ、ケ、<EFBDB9>(・ィ・<EFBDA8>ネ・熙ャ殪、ア、<EFBDB1>ミ・ヌ・ユ・ゥ・<EFBDA9>ネ、ャネ<EFBDAC><EFBE88>)
|
// 設定をロードして設定する(エントリが無ければデフォルトが入る)
|
||||||
if (rom.GetMapperNo() != 20)
|
if (rom.GetMapperNo() != 20)
|
||||||
{
|
{
|
||||||
GameOption.Load(rom.GetPROM_CRC());
|
GameOption.Load(rom.GetPROM_CRC());
|
||||||
@ -331,12 +331,12 @@ namespace VirtualNes.Core
|
|||||||
{
|
{
|
||||||
if (fp == null)
|
if (fp == null)
|
||||||
{
|
{
|
||||||
// xxx ・ユ・。・、・<EFBFBD><EFBFBD>_、ア、゙、サ、<EFBFBD>
|
// xxx ファイルを開けません
|
||||||
throw new Exception($"Can Not Open File [TurboFile.vtf]");
|
throw new Exception($"Can Not Open File [TurboFile.vtf]");
|
||||||
}
|
}
|
||||||
|
|
||||||
long size = fp.Length;
|
long size = fp.Length;
|
||||||
// ・ユ・。・、・<EFBFBD>オ・、・コネ。オテ
|
// ファイルサイズ取得
|
||||||
if (size > 32 * 1024)
|
if (size > 32 * 1024)
|
||||||
{
|
{
|
||||||
size = 32 * 1024;
|
size = 32 * 1024;
|
||||||
@ -354,7 +354,7 @@ namespace VirtualNes.Core
|
|||||||
|
|
||||||
private void LoadDISK()
|
private void LoadDISK()
|
||||||
{
|
{
|
||||||
//todo : エナオ忞巐チネ。ヨァウヨ
|
//todo : 磁碟机读取支持
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadSRAM()
|
private void LoadSRAM()
|
||||||
@ -400,7 +400,7 @@ namespace VirtualNes.Core
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// メモリクリア
|
// 儊儌儕僋儕傾
|
||||||
MemoryUtility.ZEROMEMORY(MMU.RAM, MMU.RAM.Length);
|
MemoryUtility.ZEROMEMORY(MMU.RAM, MMU.RAM.Length);
|
||||||
MemoryUtility.ZEROMEMORY(MMU.WRAM, MMU.WRAM.Length);
|
MemoryUtility.ZEROMEMORY(MMU.WRAM, MMU.WRAM.Length);
|
||||||
MemoryUtility.ZEROMEMORY(MMU.DRAM, MMU.DRAM.Length);
|
MemoryUtility.ZEROMEMORY(MMU.DRAM, MMU.DRAM.Length);
|
||||||
@ -420,11 +420,11 @@ namespace VirtualNes.Core
|
|||||||
|
|
||||||
MMU.PROM = MMU.VROM = null;
|
MMU.PROM = MMU.VROM = null;
|
||||||
|
|
||||||
// 0 除算防止対策
|
// 0 彍嶼杊巭懳嶔
|
||||||
MMU.PROM_8K_SIZE = MMU.PROM_16K_SIZE = MMU.PROM_32K_SIZE = 1;
|
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;
|
MMU.VROM_1K_SIZE = MMU.VROM_2K_SIZE = MMU.VROM_4K_SIZE = MMU.VROM_8K_SIZE = 1;
|
||||||
|
|
||||||
// デフォルトバンク設定
|
// 僨僼僅儖僩僶儞僋愝掕
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
MMU.CPU_MEM_BANK[i] = null;
|
MMU.CPU_MEM_BANK[i] = null;
|
||||||
@ -432,11 +432,11 @@ namespace VirtualNes.Core
|
|||||||
MMU.CPU_MEM_PAGE[i] = 0;
|
MMU.CPU_MEM_PAGE[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 内臓RAM/WRAM
|
// 撪憻RAM/WRAM
|
||||||
MMU.SetPROM_Bank(0, MMU.RAM, MMU.BANKTYPE_RAM);
|
MMU.SetPROM_Bank(0, MMU.RAM, MMU.BANKTYPE_RAM);
|
||||||
MMU.SetPROM_Bank(3, MMU.WRAM, MMU.BANKTYPE_RAM);
|
MMU.SetPROM_Bank(3, MMU.WRAM, MMU.BANKTYPE_RAM);
|
||||||
|
|
||||||
// ダミー
|
// 僟儈乕
|
||||||
MMU.SetPROM_Bank(1, MMU.XRAM, MMU.BANKTYPE_ROM);
|
MMU.SetPROM_Bank(1, MMU.XRAM, MMU.BANKTYPE_ROM);
|
||||||
MMU.SetPROM_Bank(2, 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)
|
if (RenderMethod == EnumRenderMethod.PRE_ALL_RENDER)
|
||||||
EmulationCPU(nescfg.ScanlineCycles);
|
EmulationCPU(nescfg.ScanlineCycles);
|
||||||
|
|
||||||
@ -583,7 +583,7 @@ namespace VirtualNes.Core
|
|||||||
{
|
{
|
||||||
pad.VSync();
|
pad.VSync();
|
||||||
|
|
||||||
// VBLANK期間
|
// VBLANK婜娫
|
||||||
if (scanline == nescfg.TotalScanlines - 1)
|
if (scanline == nescfg.TotalScanlines - 1)
|
||||||
{
|
{
|
||||||
ppu.VBlankEnd();
|
ppu.VBlankEnd();
|
||||||
@ -642,7 +642,7 @@ namespace VirtualNes.Core
|
|||||||
|
|
||||||
if (scanline == 0)
|
if (scanline == 0)
|
||||||
{
|
{
|
||||||
// ダミースキャンライン
|
// 僟儈乕僗僉儍儞儔僀儞
|
||||||
// H-Draw (4fetches*32)
|
// H-Draw (4fetches*32)
|
||||||
EmulationCPU(FETCH_CYCLES * 128);
|
EmulationCPU(FETCH_CYCLES * 128);
|
||||||
ppu.FrameStart();
|
ppu.FrameStart();
|
||||||
@ -655,7 +655,7 @@ namespace VirtualNes.Core
|
|||||||
}
|
}
|
||||||
else if (scanline < 240)
|
else if (scanline < 240)
|
||||||
{
|
{
|
||||||
// スクリーン描画(Scanline 1~239)
|
// 僗僋儕乕儞昤夋(Scanline 1乣239)
|
||||||
if (bDraw)
|
if (bDraw)
|
||||||
{
|
{
|
||||||
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
|
ppu.Scanline(scanline, Supporter.Config.graphics.bAllSprite, Supporter.Config.graphics.bLeftClip);
|
||||||
@ -707,7 +707,7 @@ namespace VirtualNes.Core
|
|||||||
}
|
}
|
||||||
else if (scanline == 240)
|
else if (scanline == 240)
|
||||||
{
|
{
|
||||||
// ダミースキャンライン (Scanline 240)
|
// 僟儈乕僗僉儍儞儔僀儞 (Scanline 240)
|
||||||
mapper.VSync();
|
mapper.VSync();
|
||||||
|
|
||||||
EmulationCPU(nescfg.HDrawCycles);
|
EmulationCPU(nescfg.HDrawCycles);
|
||||||
@ -720,7 +720,7 @@ namespace VirtualNes.Core
|
|||||||
{
|
{
|
||||||
pad.VSync();
|
pad.VSync();
|
||||||
|
|
||||||
// VBLANK期間
|
// VBLANK婜娫
|
||||||
if (scanline == nescfg.TotalScanlines - 1)
|
if (scanline == nescfg.TotalScanlines - 1)
|
||||||
{
|
{
|
||||||
ppu.VBlankEnd();
|
ppu.VBlankEnd();
|
||||||
@ -864,7 +864,7 @@ namespace VirtualNes.Core
|
|||||||
MMU.VROM_4K_SIZE = rom.GetVROM_SIZE() * 2;
|
MMU.VROM_4K_SIZE = rom.GetVROM_SIZE() * 2;
|
||||||
MMU.VROM_8K_SIZE = rom.GetVROM_SIZE();
|
MMU.VROM_8K_SIZE = rom.GetVROM_SIZE();
|
||||||
|
|
||||||
// デフォルトバンク
|
// 僨僼僅儖僩僶儞僋
|
||||||
if (MMU.VROM_8K_SIZE != 0)
|
if (MMU.VROM_8K_SIZE != 0)
|
||||||
{
|
{
|
||||||
MMU.SetVROM_8K_Bank(0);
|
MMU.SetVROM_8K_Bank(0);
|
||||||
@ -874,7 +874,7 @@ namespace VirtualNes.Core
|
|||||||
MMU.SetCRAM_8K_Bank(0);
|
MMU.SetCRAM_8K_Bank(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ミラー
|
// 儈儔乕
|
||||||
if (rom.Is4SCREEN())
|
if (rom.Is4SCREEN())
|
||||||
{
|
{
|
||||||
MMU.SetVRAM_Mirror(MMU.VRAM_MIRROR4);
|
MMU.SetVRAM_Mirror(MMU.VRAM_MIRROR4);
|
||||||
@ -976,13 +976,13 @@ namespace VirtualNes.Core
|
|||||||
reg.S = 0xFF;
|
reg.S = 0xFF;
|
||||||
reg.P = CPU.Z_FLAG | CPU.R_FLAG | CPU.I_FLAG;
|
reg.P = CPU.Z_FLAG | CPU.R_FLAG | CPU.I_FLAG;
|
||||||
|
|
||||||
// 安全対策を兼ねてあえてループに(1秒分)
|
// 埨慡懳嶔傪寭偹偰偁偊偰儖乕僾偵(1昩暘)
|
||||||
for (int i = 0; i < nescfg.TotalScanlines * 60; i++)
|
for (int i = 0; i < nescfg.TotalScanlines * 60; i++)
|
||||||
{
|
{
|
||||||
EmulationCPU(nescfg.ScanlineCycles);
|
EmulationCPU(nescfg.ScanlineCycles);
|
||||||
cpu.GetContext(ref reg);
|
cpu.GetContext(ref reg);
|
||||||
|
|
||||||
// 無限ループに入ったことを確認したら抜ける
|
// 柍尷儖乕僾偵擖偭偨偙偲傪妋擣偟偨傜敳偗傞
|
||||||
if (reg.PC == 0x4700)
|
if (reg.PC == 0x4700)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@ -993,7 +993,7 @@ namespace VirtualNes.Core
|
|||||||
}
|
}
|
||||||
|
|
||||||
cpu.GetContext(ref reg);
|
cpu.GetContext(ref reg);
|
||||||
// 無限ループに入っていたら再設定する
|
// 柍尷儖乕僾偵擖偭偰偄偨傜嵞愝掕偡傞
|
||||||
if (reg.PC == 0x4700)
|
if (reg.PC == 0x4700)
|
||||||
{
|
{
|
||||||
reg.PC = 0x4720; // Play Address
|
reg.PC = 0x4720; // Play Address
|
||||||
@ -1009,7 +1009,7 @@ namespace VirtualNes.Core
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
cpu.GetContext(ref reg);
|
cpu.GetContext(ref reg);
|
||||||
reg.PC = 0x4700; // 無限ループ
|
reg.PC = 0x4700; // 柍尷儖乕僾
|
||||||
reg.S = 0xFF;
|
reg.S = 0xFF;
|
||||||
|
|
||||||
EmulationCPU(nescfg.ScanlineCycles * nescfg.TotalScanlines);
|
EmulationCPU(nescfg.ScanlineCycles * nescfg.TotalScanlines);
|
||||||
@ -1186,7 +1186,7 @@ namespace VirtualNes.Core
|
|||||||
if (m_BarcodeCycles > 1000)
|
if (m_BarcodeCycles > 1000)
|
||||||
{
|
{
|
||||||
m_BarcodeCycles = 0;
|
m_BarcodeCycles = 0;
|
||||||
// 停止?
|
// 掆巭丠
|
||||||
if (m_BarcodeData[m_BarcodePtr] != 0xFF)
|
if (m_BarcodeData[m_BarcodePtr] != 0xFF)
|
||||||
{
|
{
|
||||||
m_BarcodeOut = m_BarcodeData[m_BarcodePtr++];
|
m_BarcodeOut = m_BarcodeData[m_BarcodePtr++];
|
||||||
@ -1227,7 +1227,7 @@ namespace VirtualNes.Core
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
m_TapeCycles += (nescfg.CpuClock / 32000.0);
|
m_TapeCycles += (nescfg.CpuClock / 32000.0);
|
||||||
// m_TapeCycles += (nescfg.CpuClock / 22050.0); // 遅すぎてダメっぽい
|
// m_TapeCycles += (nescfg.CpuClock / 22050.0); // 抶偡偓偰僟儊偭傐偄
|
||||||
|
|
||||||
if (m_bTapePlay)
|
if (m_bTapePlay)
|
||||||
{
|
{
|
||||||
@ -1293,7 +1293,7 @@ namespace VirtualNes.Core
|
|||||||
return MMU.CPU_MEM_BANK[addr >> 13][addr & 0x1FFF];
|
return MMU.CPU_MEM_BANK[addr >> 13][addr & 0x1FFF];
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0x00; // Warning予防
|
return 0x00; // Warning梊杊
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte ReadReg(ushort addr)
|
private byte ReadReg(ushort addr)
|
||||||
@ -1504,7 +1504,7 @@ namespace VirtualNes.Core
|
|||||||
pad.Write(addr, data);
|
pad.Write(addr, data);
|
||||||
apu.Write(addr, data);
|
apu.Write(addr, data);
|
||||||
break;
|
break;
|
||||||
// VirtuaNES固有ポート
|
// VirtuaNES屌桳億乕僩
|
||||||
case 0x18:
|
case 0x18:
|
||||||
apu.Write(addr, data);
|
apu.Write(addr, data);
|
||||||
break;
|
break;
|
||||||
@ -1596,7 +1596,7 @@ namespace VirtualNes.Core
|
|||||||
ref state.reg.cpureg.FrameIRQ_type,
|
ref state.reg.cpureg.FrameIRQ_type,
|
||||||
ref state.reg.cpureg.FrameIRQ,
|
ref state.reg.cpureg.FrameIRQ,
|
||||||
ref state.reg.cpureg.FrameIRQ_occur);
|
ref state.reg.cpureg.FrameIRQ_occur);
|
||||||
state.reg.cpureg.FrameIRQ_cycles = cycles; // イホユユ、ャINT、ハ樣」ィ、ゥ
|
state.reg.cpureg.FrameIRQ_cycles = cycles; // 参照がINTな為(ぉ
|
||||||
|
|
||||||
state.reg.cpureg.DMA_cycles = cpu.GetDmaCycles();
|
state.reg.cpureg.DMA_cycles = cpu.GetDmaCycles();
|
||||||
state.reg.cpureg.emul_cycles = emul_cycles;
|
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.SPPAL, MMU.SPPAL, state.ram.SPPAL.Length);
|
||||||
MemoryUtility.memcpy(state.ram.SPRAM, MMU.SPRAM, state.ram.SPRAM.Length);
|
MemoryUtility.memcpy(state.ram.SPRAM, MMU.SPRAM, state.ram.SPRAM.Length);
|
||||||
|
|
||||||
// S-RAM STATE(ハケモテ/ホエハケモテ、ヒ騅、<E9A885>鬢コエ贇レ、ケ、<EFBDB9>ミ・サゥ`・ヨ、ケ、<EFBDB9>)
|
// S-RAM STATE(使用/未使用に関わらず存在すればセーブする)
|
||||||
if (rom.IsSAVERAM())
|
if (rom.IsSAVERAM())
|
||||||
{
|
{
|
||||||
size = (uint)SAVERAM_SIZE;
|
size = (uint)SAVERAM_SIZE;
|
||||||
@ -1649,9 +1649,9 @@ namespace VirtualNes.Core
|
|||||||
uint size = 0;
|
uint size = 0;
|
||||||
|
|
||||||
// SAVE CPU MEMORY BANK DATA
|
// SAVE CPU MEMORY BANK DATA
|
||||||
// BANK0,1,2、マ・ミ・<EFBFBD>ッ・サゥ`・ヨ、ヒ騅4、ハ、キ
|
// BANK0,1,2はバンクセーブに関係なし
|
||||||
// VirtuaNES0.30、ォ、<EFBFBD>
|
// VirtuaNES0.30から
|
||||||
// ・ミ・<EFBFBD>ッ」ウ、マSRAMハケモテ、ヒ騅、<EFBFBD>鬢コ・サゥ`・ヨ
|
// バンク3はSRAM使用に関わらずセーブ
|
||||||
for (int i = 3; i < 8; i++)
|
for (int i = 3; i < 8; i++)
|
||||||
{
|
{
|
||||||
state.mmu.CPU_MEM_TYPE[i] = MMU.CPU_MEM_TYPE[i];
|
state.mmu.CPU_MEM_TYPE[i] = MMU.CPU_MEM_TYPE[i];
|
||||||
@ -1696,7 +1696,7 @@ namespace VirtualNes.Core
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WRITE VRAM MEMORY(ウ」、ヒ4Kキヨ、ケ、ル、ニ抱、ュ゙z、<EFBFBD>)
|
// WRITE VRAM MEMORY(常に4K分すべて書き込む)
|
||||||
state.VRAM = new byte[4 * 1024];
|
state.VRAM = new byte[4 * 1024];
|
||||||
Array.Copy(MMU.VRAM, state.VRAM, state.VRAM.Length);
|
Array.Copy(MMU.VRAM, state.VRAM, state.VRAM.Length);
|
||||||
|
|
||||||
@ -1764,7 +1764,7 @@ namespace VirtualNes.Core
|
|||||||
int DiskSize = 16 + 65500 * rom.GetDiskNo();
|
int DiskSize = 16 + 65500 * rom.GetDiskNo();
|
||||||
|
|
||||||
|
|
||||||
// マ珀`ハ<>、<EFBFBD>ォ・ヲ・<EFBDA6>ネ
|
// 相違数をカウント
|
||||||
for (int i = 16; i < DiskSize; i++)
|
for (int i = 16; i < DiskSize; i++)
|
||||||
{
|
{
|
||||||
if (lpWrite[i] != 0)
|
if (lpWrite[i] != 0)
|
||||||
@ -1874,9 +1874,9 @@ namespace VirtualNes.Core
|
|||||||
//BANK STATE
|
//BANK STATE
|
||||||
{
|
{
|
||||||
// SAVE CPU MEMORY BANK DATA
|
// SAVE CPU MEMORY BANK DATA
|
||||||
// BANK0,1,2、マ・ミ・<EFBFBD>ッ・サゥ`・ヨ、ヒ騅4、ハ、キ
|
// BANK0,1,2はバンクセーブに関係なし
|
||||||
// VirtuaNES0.30、ォ、<EFBFBD>
|
// VirtuaNES0.30から
|
||||||
// ・ミ・<EFBFBD>ッ」ウ、マSRAMハケモテ、ヒ騅、<EFBFBD>鬢コ・サゥ`・ヨ
|
// バンク3はSRAM使用に関わらずセーブ
|
||||||
for (byte i = 3; i < 8; i++)
|
for (byte i = 3; i < 8; i++)
|
||||||
{
|
{
|
||||||
MMU.CPU_MEM_TYPE[i] = state.mmu.CPU_MEM_TYPE[i];
|
MMU.CPU_MEM_TYPE[i] = state.mmu.CPU_MEM_TYPE[i];
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace VirtualNes.Core
|
namespace VirtualNes.Core
|
||||||
{
|
{
|
||||||
public struct ControllerState
|
public struct ControllerState : IEquatable<ControllerState>
|
||||||
{
|
{
|
||||||
public uint raw0;
|
public uint raw0;
|
||||||
public uint raw1;
|
public uint raw1;
|
||||||
@ -11,19 +11,55 @@ namespace VirtualNes.Core
|
|||||||
|
|
||||||
public bool valid;
|
public bool valid;
|
||||||
|
|
||||||
public ControllerState(
|
public ControllerState(EnumButtonType[] states)
|
||||||
EnumButtonType player0_buttons,
|
|
||||||
EnumButtonType player1_buttons,
|
|
||||||
EnumButtonType player2_buttons,
|
|
||||||
EnumButtonType player3_buttons)
|
|
||||||
{
|
{
|
||||||
raw0 = (uint)player0_buttons;
|
raw0 = (uint)states[0];
|
||||||
raw1 = (uint)player1_buttons;
|
raw1 = (uint)states[1];
|
||||||
raw2 = (uint)player2_buttons;
|
raw2 = (uint)states[2];
|
||||||
raw3 = (uint)player3_buttons;
|
raw3 = (uint)states[3];
|
||||||
valid = true;
|
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)
|
public static bool operator ==(ControllerState left, ControllerState right)
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
@ -37,24 +73,7 @@ namespace VirtualNes.Core
|
|||||||
{
|
{
|
||||||
return !(left == right);
|
return !(left == right);
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
|
@ -5,6 +5,7 @@ namespace VirtualNes.Core
|
|||||||
public static class Supporter
|
public static class Supporter
|
||||||
{
|
{
|
||||||
private static ISupporterImpl s_support;
|
private static ISupporterImpl s_support;
|
||||||
|
|
||||||
public static void Setup(ISupporterImpl supporter)
|
public static void Setup(ISupporterImpl supporter)
|
||||||
{
|
{
|
||||||
s_support = supporter;
|
s_support = supporter;
|
||||||
@ -44,6 +45,7 @@ namespace VirtualNes.Core
|
|||||||
{
|
{
|
||||||
s_support.SaveFile(fileData, directPath, fileName);
|
s_support.SaveFile(fileData, directPath, fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Stream OpenFile(string directPath, string fileName)
|
public static Stream OpenFile(string directPath, string fileName)
|
||||||
{
|
{
|
||||||
return s_support.OpenFile(directPath, fileName);
|
return s_support.OpenFile(directPath, fileName);
|
||||||
@ -64,6 +66,11 @@ namespace VirtualNes.Core
|
|||||||
s_support.SampleInput(frameCount);
|
s_support.SampleInput(frameCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IControllerSetuper GetControllerSetuper()
|
||||||
|
{
|
||||||
|
return s_support.GetControllerSetuper();
|
||||||
|
}
|
||||||
|
|
||||||
public static EmulatorConfig Config => s_support.Config;
|
public static EmulatorConfig Config => s_support.Config;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,5 +89,21 @@ namespace VirtualNes.Core
|
|||||||
bool TryGetMapperNo(ROM rom, out int mapperNo);
|
bool TryGetMapperNo(ROM rom, out int mapperNo);
|
||||||
ControllerState GetControllerState();
|
ControllerState GetControllerState();
|
||||||
void SampleInput(uint frameCount);
|
void SampleInput(uint frameCount);
|
||||||
|
IControllerSetuper GetControllerSetuper();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 负责管理本地控制器与具体游戏之间的槽位分配
|
||||||
|
/// </summary>
|
||||||
|
public interface IControllerSetuper
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 设置本地手柄与游戏手柄槽位的映射
|
||||||
|
/// </summary>
|
||||||
|
void SetConnect(
|
||||||
|
uint? con0ToSlot = null,
|
||||||
|
uint? con1ToSlot = null,
|
||||||
|
uint? con2ToSlot = null,
|
||||||
|
uint? con3ToSlot = null);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user