AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs

98 lines
2.6 KiB
C#
Raw Normal View History

using AxibugEmuOnline.Client.ClientCore;
2024-07-30 11:57:09 +08:00
using System;
using System.IO;
using System.Xml.Linq;
2024-07-24 14:27:10 +08:00
using UnityEngine;
using VirtualNes.Core;
using VirtualNes.Core.Debug;
namespace AxibugEmuOnline.Client
{
public class NesEmulator : MonoBehaviour
{
2024-08-06 16:03:17 +08:00
public NES NesCore { get; private set; }
2024-07-25 11:03:58 +08:00
2024-07-30 11:57:09 +08:00
public VideoProvider VideoProvider;
2024-08-02 16:50:16 +08:00
public AudioProvider AudioProvider;
2024-07-30 11:57:09 +08:00
2024-08-06 16:03:17 +08:00
#if UNITY_EDITOR
public string RomName;
#endif
2024-07-24 14:27:10 +08:00
private void Start()
{
Application.targetFrameRate = 60;
2024-08-06 16:03:17 +08:00
VideoProvider.NesEmu = this;
AudioProvider.NesEmu = this;
#if UNITY_EDITOR
StartGame(RomName);
#endif
2024-07-24 14:27:10 +08:00
}
public void StartGame(string romName)
{
2024-07-25 11:03:58 +08:00
StopGame();
2024-07-24 14:27:10 +08:00
Supporter.Setup(new CoreSupporter());
Debuger.Setup(new CoreDebuger());
2024-07-30 11:57:09 +08:00
try
{
2024-08-06 16:03:17 +08:00
NesCore = new NES(romName);
2024-07-30 11:57:09 +08:00
}
catch (Exception ex)
{
2024-08-06 16:03:17 +08:00
NesCore = null;
2024-07-30 11:57:09 +08:00
Debug.LogError(ex);
}
2024-07-25 11:03:58 +08:00
}
public void StopGame()
{
2024-08-06 16:03:17 +08:00
NesCore?.Dispose();
NesCore = null;
2024-07-25 11:03:58 +08:00
}
private void Update()
{
2024-08-06 16:03:17 +08:00
if (NesCore != null)
2024-07-30 11:57:09 +08:00
{
2024-08-06 18:09:32 +08:00
var controlState = Supporter.GetControllerState();
NesCore.pad.Sync(controlState);
2024-08-06 16:03:17 +08:00
NesCore.EmulateFrame(true);
2024-07-30 18:53:36 +08:00
2024-08-06 16:03:17 +08:00
var screenBuffer = NesCore.ppu.GetScreenPtr();
var lineColorMode = NesCore.ppu.GetLineColorMode();
2024-07-30 18:53:36 +08:00
VideoProvider.SetDrawData(screenBuffer, lineColorMode, 256, 240);
2024-07-30 11:57:09 +08:00
}
2024-07-24 14:27:10 +08:00
}
#if UNITY_EDITOR
[ContextMenu("IMPORT")]
public void TTTA()
{
var db = Resources.Load<RomDB>("NES/ROMDB");
db.Clear();
var xmlStr = File.ReadAllText("nes20db.xml");
var xml = XDocument.Parse(xmlStr);
var games = xml.Element("nes20db").Elements("game");
foreach (var game in games)
{
var crcStr = game.Element("rom").Attribute("crc32").Value;
var crc = uint.Parse($"{crcStr}", System.Globalization.NumberStyles.HexNumber);
var mapper = int.Parse($"{game.Element("pcb").Attribute("mapper").Value}");
if (mapper > 255) continue;
db.AddInfo(new RomDB.RomInfo { CRC = crc, Mapper = mapper });
}
UnityEditor.EditorUtility.SetDirty(db);
UnityEditor.AssetDatabase.SaveAssets();
}
#endif
2024-07-24 14:27:10 +08:00
}
}