Compare commits
No commits in common. "master" and "dev_beforeShader" have entirely different histories.
master
...
dev_before
11
.gitignore
vendored
11
.gitignore
vendored
@ -13,10 +13,7 @@
|
||||
/AxibugEmuOnline.Client/ProjectSettings/ProjectVersion.txt
|
||||
/AxibugEmuOnline.Client/ProjectSettings/AutoStreamingSettings.asset
|
||||
/AxibugEmuOnline.Client/Logs
|
||||
|
||||
/virtuanessrc097-master
|
||||
/AxibugEmuOnline.Server/config.cfg
|
||||
/AxibugEmuOnline.Server/bin/
|
||||
/AxibugEmuOnline.Client/.editorconfig
|
||||
/AxibugEmuOnline.Client/*.user
|
||||
/AxibugEmuOnline.Client/.idea
|
||||
/virtuanessrc097-master/save
|
||||
/virtuanessrc097-master/.vs
|
||||
/virtuanessrc097-master/Debug
|
||||
/virtuanessrc097-master/VirtuaNES.ini
|
||||
|
0
.gitmodules
vendored
0
.gitmodules
vendored
@ -1,436 +0,0 @@
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using UnityEngine.Profiling;
|
||||
|
||||
public class Debugger : MonoBehaviour
|
||||
{
|
||||
/// <summary>
|
||||
/// 是否允许调试
|
||||
/// </summary>
|
||||
public bool AllowDebugging = true;
|
||||
|
||||
private DebugType _debugType = DebugType.Console;
|
||||
private List<LogData> _logInformations = new List<LogData>();
|
||||
private int _currentLogIndex = -1;
|
||||
private int _infoLogCount = 0;
|
||||
private int _warningLogCount = 0;
|
||||
private int _errorLogCount = 0;
|
||||
private int _fatalLogCount = 0;
|
||||
private bool _showInfoLog = true;
|
||||
private bool _showWarningLog = true;
|
||||
private bool _showErrorLog = true;
|
||||
private bool _showFatalLog = true;
|
||||
private Vector2 _scrollLogView = Vector2.zero;
|
||||
private Vector2 _scrollCurrentLogView = Vector2.zero;
|
||||
private Vector2 _scrollSystemView = Vector2.zero;
|
||||
private bool _expansion = false;
|
||||
private Rect _windowRect = new Rect(0, 0, 100, 60);
|
||||
|
||||
private int _fps = 0;
|
||||
private Color _fpsColor = Color.white;
|
||||
private int _frameNumber = 0;
|
||||
private float _lastShowFPSTime = 0f;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
DontDestroyOnLoad(this.gameObject);
|
||||
if (AllowDebugging)
|
||||
{
|
||||
Application.logMessageReceived += LogHandler;
|
||||
}
|
||||
}
|
||||
private void Update()
|
||||
{
|
||||
if (AllowDebugging)
|
||||
{
|
||||
_frameNumber += 1;
|
||||
float time = Time.realtimeSinceStartup - _lastShowFPSTime;
|
||||
if (time >= 1)
|
||||
{
|
||||
_fps = (int)(_frameNumber / time);
|
||||
_frameNumber = 0;
|
||||
_lastShowFPSTime = Time.realtimeSinceStartup;
|
||||
}
|
||||
}
|
||||
}
|
||||
private void OnDestory()
|
||||
{
|
||||
if (AllowDebugging)
|
||||
{
|
||||
Application.logMessageReceived -= LogHandler;
|
||||
}
|
||||
}
|
||||
|
||||
bool bUnityWaterFrist = false;
|
||||
private void LogHandler(string condition, string stackTrace, LogType type)
|
||||
{
|
||||
if (condition.Contains("UnityWater") || stackTrace.Contains("UnityWater"))
|
||||
{
|
||||
if(bUnityWaterFrist)
|
||||
return;
|
||||
|
||||
bUnityWaterFrist = true;
|
||||
}
|
||||
|
||||
LogData log = new LogData();
|
||||
log.time = DateTime.Now.ToString("HH:mm:ss");
|
||||
log.message = condition;
|
||||
log.stackTrace = stackTrace;
|
||||
|
||||
if (type == LogType.Assert)
|
||||
{
|
||||
log.type = "Fatal";
|
||||
_fatalLogCount += 1;
|
||||
}
|
||||
else if (type == LogType.Exception || type == LogType.Error)
|
||||
{
|
||||
log.type = "Error";
|
||||
_errorLogCount += 1;
|
||||
}
|
||||
else if (type == LogType.Warning)
|
||||
{
|
||||
log.type = "Warning";
|
||||
_warningLogCount += 1;
|
||||
}
|
||||
else if (type == LogType.Log)
|
||||
{
|
||||
log.type = "Info";
|
||||
_infoLogCount += 1;
|
||||
}
|
||||
|
||||
_logInformations.Add(log);
|
||||
|
||||
if (_warningLogCount > 0)
|
||||
{
|
||||
_fpsColor = Color.yellow;
|
||||
}
|
||||
if (_errorLogCount > 0)
|
||||
{
|
||||
_fpsColor = Color.red;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
if (AllowDebugging)
|
||||
{
|
||||
if (_expansion)
|
||||
{
|
||||
_windowRect = GUI.Window(0, _windowRect, ExpansionGUIWindow, "DEBUGGER");
|
||||
}
|
||||
else
|
||||
{
|
||||
_windowRect = GUI.Window(0, _windowRect, ShrinkGUIWindow, "DEBUGGER");
|
||||
}
|
||||
}
|
||||
}
|
||||
private void ExpansionGUIWindow(int windowId)
|
||||
{
|
||||
GUI.DragWindow(new Rect(0, 0, 10000, 20));
|
||||
|
||||
#region title
|
||||
GUILayout.BeginHorizontal();
|
||||
GUI.contentColor = _fpsColor;
|
||||
if (GUILayout.Button("FPS:" + _fps, GUILayout.Height(30)))
|
||||
{
|
||||
_expansion = false;
|
||||
_windowRect.width = 100;
|
||||
_windowRect.height = 60;
|
||||
}
|
||||
GUI.contentColor = (_debugType == DebugType.Console ? Color.white : Color.gray);
|
||||
if (GUILayout.Button("Console", GUILayout.Height(30)))
|
||||
{
|
||||
_debugType = DebugType.Console;
|
||||
}
|
||||
GUI.contentColor = (_debugType == DebugType.Memory ? Color.white : Color.gray);
|
||||
if (GUILayout.Button("Memory", GUILayout.Height(30)))
|
||||
{
|
||||
_debugType = DebugType.Memory;
|
||||
}
|
||||
GUI.contentColor = (_debugType == DebugType.System ? Color.white : Color.gray);
|
||||
if (GUILayout.Button("System", GUILayout.Height(30)))
|
||||
{
|
||||
_debugType = DebugType.System;
|
||||
}
|
||||
GUI.contentColor = (_debugType == DebugType.Screen ? Color.white : Color.gray);
|
||||
if (GUILayout.Button("Screen", GUILayout.Height(30)))
|
||||
{
|
||||
_debugType = DebugType.Screen;
|
||||
}
|
||||
GUI.contentColor = (_debugType == DebugType.Quality ? Color.white : Color.gray);
|
||||
if (GUILayout.Button("Quality", GUILayout.Height(30)))
|
||||
{
|
||||
_debugType = DebugType.Quality;
|
||||
}
|
||||
GUI.contentColor = (_debugType == DebugType.Environment ? Color.white : Color.gray);
|
||||
if (GUILayout.Button("Environment", GUILayout.Height(30)))
|
||||
{
|
||||
_debugType = DebugType.Environment;
|
||||
}
|
||||
GUI.contentColor = Color.white;
|
||||
GUILayout.EndHorizontal();
|
||||
#endregion
|
||||
|
||||
#region console
|
||||
if (_debugType == DebugType.Console)
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("Clear"))
|
||||
{
|
||||
_logInformations.Clear();
|
||||
_fatalLogCount = 0;
|
||||
_warningLogCount = 0;
|
||||
_errorLogCount = 0;
|
||||
_infoLogCount = 0;
|
||||
_currentLogIndex = -1;
|
||||
_fpsColor = Color.white;
|
||||
}
|
||||
GUI.contentColor = (_showInfoLog ? Color.white : Color.gray);
|
||||
_showInfoLog = GUILayout.Toggle(_showInfoLog, "Info [" + _infoLogCount + "]");
|
||||
GUI.contentColor = (_showWarningLog ? Color.white : Color.gray);
|
||||
_showWarningLog = GUILayout.Toggle(_showWarningLog, "Warning [" + _warningLogCount + "]");
|
||||
GUI.contentColor = (_showErrorLog ? Color.white : Color.gray);
|
||||
_showErrorLog = GUILayout.Toggle(_showErrorLog, "Error [" + _errorLogCount + "]");
|
||||
GUI.contentColor = (_showFatalLog ? Color.white : Color.gray);
|
||||
_showFatalLog = GUILayout.Toggle(_showFatalLog, "Fatal [" + _fatalLogCount + "]");
|
||||
GUI.contentColor = Color.white;
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
_scrollLogView = GUILayout.BeginScrollView(_scrollLogView, "Box", GUILayout.Height(165));
|
||||
for (int i = 0; i < _logInformations.Count; i++)
|
||||
{
|
||||
bool show = false;
|
||||
Color color = Color.white;
|
||||
switch (_logInformations[i].type)
|
||||
{
|
||||
case "Fatal":
|
||||
show = _showFatalLog;
|
||||
color = Color.red;
|
||||
break;
|
||||
case "Error":
|
||||
show = _showErrorLog;
|
||||
color = Color.red;
|
||||
break;
|
||||
case "Info":
|
||||
show = _showInfoLog;
|
||||
color = Color.white;
|
||||
break;
|
||||
case "Warning":
|
||||
show = _showWarningLog;
|
||||
color = Color.yellow;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (show)
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Toggle(_currentLogIndex == i, ""))
|
||||
{
|
||||
_currentLogIndex = i;
|
||||
}
|
||||
GUI.contentColor = color;
|
||||
GUILayout.Label("[" + _logInformations[i].type + "] ");
|
||||
GUILayout.Label("[" + _logInformations[i].time + "] ");
|
||||
GUILayout.Label(_logInformations[i].message);
|
||||
GUILayout.FlexibleSpace();
|
||||
GUI.contentColor = Color.white;
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
}
|
||||
GUILayout.EndScrollView();
|
||||
|
||||
_scrollCurrentLogView = GUILayout.BeginScrollView(_scrollCurrentLogView, "Box", GUILayout.Height(100));
|
||||
if (_currentLogIndex != -1)
|
||||
{
|
||||
GUILayout.Label(_logInformations[_currentLogIndex].message + "\r\n\r\n" + _logInformations[_currentLogIndex].stackTrace);
|
||||
}
|
||||
GUILayout.EndScrollView();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region memory
|
||||
else if (_debugType == DebugType.Memory)
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
GUILayout.Label("Memory Information");
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginVertical("Box");
|
||||
#if UNITY_5
|
||||
GUILayout.Label("总内存:" + Profiler.GetTotalReservedMemory() / 1000000 + "MB");
|
||||
GUILayout.Label("已占用内存:" + Profiler.GetTotalAllocatedMemory() / 1000000 + "MB");
|
||||
GUILayout.Label("空闲中内存:" + Profiler.GetTotalUnusedReservedMemory() / 1000000 + "MB");
|
||||
GUILayout.Label("总Mono堆内存:" + Profiler.GetMonoHeapSize() / 1000000 + "MB");
|
||||
GUILayout.Label("已占用Mono堆内存:" + Profiler.GetMonoUsedSize() / 1000000 + "MB");
|
||||
#endif
|
||||
#if UNITY_7
|
||||
GUILayout.Label("总内存:" + Profiler.GetTotalReservedMemoryLong() / 1000000 + "MB");
|
||||
GUILayout.Label("已占用内存:" + Profiler.GetTotalAllocatedMemoryLong() / 1000000 + "MB");
|
||||
GUILayout.Label("空闲中内存:" + Profiler.GetTotalUnusedReservedMemoryLong() / 1000000 + "MB");
|
||||
GUILayout.Label("总Mono堆内存:" + Profiler.GetMonoHeapSizeLong() / 1000000 + "MB");
|
||||
GUILayout.Label("已占用Mono堆内存:" + Profiler.GetMonoUsedSizeLong() / 1000000 + "MB");
|
||||
#endif
|
||||
GUILayout.EndVertical();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("卸载未使用的资源"))
|
||||
{
|
||||
Resources.UnloadUnusedAssets();
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("使用GC垃圾回收"))
|
||||
{
|
||||
GC.Collect();
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region system
|
||||
else if (_debugType == DebugType.System)
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
GUILayout.Label("System Information");
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
_scrollSystemView = GUILayout.BeginScrollView(_scrollSystemView, "Box");
|
||||
GUILayout.Label("操作系统:" + SystemInfo.operatingSystem);
|
||||
GUILayout.Label("系统内存:" + SystemInfo.systemMemorySize + "MB");
|
||||
GUILayout.Label("处理器:" + SystemInfo.processorType);
|
||||
GUILayout.Label("处理器数量:" + SystemInfo.processorCount);
|
||||
GUILayout.Label("显卡:" + SystemInfo.graphicsDeviceName);
|
||||
GUILayout.Label("显卡类型:" + SystemInfo.graphicsDeviceType);
|
||||
GUILayout.Label("显存:" + SystemInfo.graphicsMemorySize + "MB");
|
||||
GUILayout.Label("显卡标识:" + SystemInfo.graphicsDeviceID);
|
||||
GUILayout.Label("显卡供应商:" + SystemInfo.graphicsDeviceVendor);
|
||||
GUILayout.Label("显卡供应商标识码:" + SystemInfo.graphicsDeviceVendorID);
|
||||
GUILayout.Label("设备模式:" + SystemInfo.deviceModel);
|
||||
GUILayout.Label("设备名称:" + SystemInfo.deviceName);
|
||||
GUILayout.Label("设备类型:" + SystemInfo.deviceType);
|
||||
GUILayout.Label("设备标识:" + SystemInfo.deviceUniqueIdentifier);
|
||||
GUILayout.EndScrollView();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region screen
|
||||
else if (_debugType == DebugType.Screen)
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
GUILayout.Label("Screen Information");
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginVertical("Box");
|
||||
GUILayout.Label("DPI:" + Screen.dpi);
|
||||
GUILayout.Label("分辨率:" + Screen.currentResolution.ToString());
|
||||
GUILayout.EndVertical();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("全屏"))
|
||||
{
|
||||
Screen.SetResolution(Screen.currentResolution.width, Screen.currentResolution.height, !Screen.fullScreen);
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Quality
|
||||
else if (_debugType == DebugType.Quality)
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
GUILayout.Label("Quality Information");
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginVertical("Box");
|
||||
string value = "";
|
||||
if (QualitySettings.GetQualityLevel() == 0)
|
||||
{
|
||||
value = " [最低]";
|
||||
}
|
||||
else if (QualitySettings.GetQualityLevel() == QualitySettings.names.Length - 1)
|
||||
{
|
||||
value = " [最高]";
|
||||
}
|
||||
|
||||
GUILayout.Label("图形质量:" + QualitySettings.names[QualitySettings.GetQualityLevel()] + value);
|
||||
GUILayout.EndVertical();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("降低一级图形质量"))
|
||||
{
|
||||
QualitySettings.DecreaseLevel();
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("提升一级图形质量"))
|
||||
{
|
||||
QualitySettings.IncreaseLevel();
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Environment
|
||||
else if (_debugType == DebugType.Environment)
|
||||
{
|
||||
GUILayout.BeginHorizontal();
|
||||
GUILayout.Label("Environment Information");
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginVertical("Box");
|
||||
GUILayout.Label("项目名称:" + Application.productName);
|
||||
#if UNITY_5
|
||||
GUILayout.Label("项目ID:" + Application.bundleIdentifier);
|
||||
#endif
|
||||
#if UNITY_7
|
||||
GUILayout.Label("项目ID:" + Application.identifier);
|
||||
#endif
|
||||
GUILayout.Label("项目版本:" + Application.version);
|
||||
GUILayout.Label("Unity版本:" + Application.unityVersion);
|
||||
GUILayout.Label("公司名称:" + Application.companyName);
|
||||
GUILayout.EndVertical();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("退出程序"))
|
||||
{
|
||||
Application.Quit();
|
||||
}
|
||||
GUILayout.EndHorizontal();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
private void ShrinkGUIWindow(int windowId)
|
||||
{
|
||||
GUI.DragWindow(new Rect(0, 0, 10000, 20));
|
||||
|
||||
GUI.contentColor = _fpsColor;
|
||||
if (GUILayout.Button("FPS:" + _fps, GUILayout.Width(80), GUILayout.Height(30)))
|
||||
{
|
||||
_expansion = true;
|
||||
_windowRect.width = 600;
|
||||
_windowRect.height = 360;
|
||||
}
|
||||
GUI.contentColor = Color.white;
|
||||
}
|
||||
}
|
||||
public struct LogData
|
||||
{
|
||||
public string time;
|
||||
public string type;
|
||||
public string message;
|
||||
public string stackTrace;
|
||||
}
|
||||
public enum DebugType
|
||||
{
|
||||
Console,
|
||||
Memory,
|
||||
System,
|
||||
Screen,
|
||||
Quality,
|
||||
Environment
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4f6742d2e5aa8bf40b765aa44eca65d2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3072205f33d4ee84d8117484f05398b2
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
@ -1,30 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dbd119f599580a244b1858693cc49865
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
@ -1,30 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7783572e2d0e10145b5a94249ebd46d5
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
@ -1,30 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a870099e75652f540b865b7a83e4a232
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
@ -1,30 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 68c1d0e6ce0a09444999776ea1f3c0e4
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 481be8b9dd1218749a75bf1bd4612c04
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1 +0,0 @@
|
||||
{"androidStore":"GooglePlay"}
|
@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8ce858366bedbe74f989c336dd5b1986
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 319a1a12506a5334ebd963b4fd991c2a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ccf426abdad56c74682de4e38b3048e3
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 42cbfafb123e63b45841ae95eb432053
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,131 +0,0 @@
|
||||
Shader "AleinUI/Clip"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
_MainTex ("Sprite Texture", 2D) = "white" {}
|
||||
_PalTex ("PAL", 2D) = "white" {}
|
||||
_Color ("Tint", Color) = (1,1,1,1)
|
||||
|
||||
_StencilComp ("Stencil Comparison", Float) = 8
|
||||
_Stencil ("Stencil ID", Float) = 0
|
||||
_StencilOp ("Stencil Operation", Float) = 0
|
||||
_StencilWriteMask ("Stencil Write Mask", Float) = 255
|
||||
_StencilReadMask ("Stencil Read Mask", Float) = 255
|
||||
|
||||
_ColorMask ("Color Mask", Float) = 15
|
||||
|
||||
|
||||
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags
|
||||
{
|
||||
"Queue"="Transparent"
|
||||
"IgnoreProjector"="True"
|
||||
"RenderType"="Transparent"
|
||||
"PreviewType"="Plane"
|
||||
"CanUseSpriteAtlas"="True"
|
||||
}
|
||||
|
||||
Stencil
|
||||
{
|
||||
Ref [_Stencil]
|
||||
Comp [_StencilComp]
|
||||
Pass [_StencilOp]
|
||||
ReadMask [_StencilReadMask]
|
||||
WriteMask [_StencilWriteMask]
|
||||
}
|
||||
|
||||
Cull Off
|
||||
Lighting Off
|
||||
ZWrite Off
|
||||
ZTest [unity_GUIZTestMode]
|
||||
Blend SrcAlpha OneMinusSrcAlpha
|
||||
ColorMask [_ColorMask]
|
||||
|
||||
Pass
|
||||
{
|
||||
Name "Default"
|
||||
CGPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#pragma target 2.0
|
||||
|
||||
#include "UnityCG.cginc"
|
||||
#include "UnityUI.cginc"
|
||||
|
||||
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT
|
||||
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP
|
||||
|
||||
struct appdata_t
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float4 color : COLOR;
|
||||
float2 texcoord : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 vertex : SV_POSITION;
|
||||
fixed4 color : COLOR;
|
||||
float2 texcoord : TEXCOORD0;
|
||||
float4 worldPosition : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
sampler2D _MainTex;
|
||||
fixed4 _Color;
|
||||
fixed4 _TextureSampleAdd;
|
||||
float4 _ClipRect;
|
||||
float4 _MainTex_ST;
|
||||
float4 _MainTex_TexelSize;
|
||||
sampler2D _PalTex;
|
||||
|
||||
v2f vert(appdata_t v)
|
||||
{
|
||||
v2f OUT;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
|
||||
OUT.worldPosition = v.vertex;
|
||||
OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
|
||||
|
||||
OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
|
||||
|
||||
OUT.color = v.color * _Color;
|
||||
return OUT;
|
||||
}
|
||||
|
||||
fixed4 frag(v2f IN) : SV_Target
|
||||
{
|
||||
float2 mapUV = IN.texcoord;
|
||||
|
||||
float start= 8.0/272.0;
|
||||
float end = (272.0-8.0)/272.0;
|
||||
|
||||
mapUV.x = lerp(start,end, mapUV.x);
|
||||
|
||||
half4 color = tex2D(_MainTex,mapUV);
|
||||
|
||||
//float rawIndex = color.b;
|
||||
float rawIndex = color.r;
|
||||
|
||||
color = tex2D(_PalTex,float2(rawIndex,0.5));
|
||||
|
||||
#ifdef UNITY_UI_CLIP_RECT
|
||||
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
|
||||
#endif
|
||||
|
||||
#ifdef UNITY_UI_ALPHACLIP
|
||||
clip (color.a - 0.001);
|
||||
#endif
|
||||
|
||||
|
||||
return color;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3dd2917646ccf2b4baee8a5d1c15247f
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,87 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: VirtuaNesMaterial
|
||||
m_Shader: {fileID: 4800000, guid: 3dd2917646ccf2b4baee8a5d1c15247f, type: 3}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _PalTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _ColorMask: 15
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _Stencil: 0
|
||||
- _StencilComp: 8
|
||||
- _StencilOp: 0
|
||||
- _StencilReadMask: 255
|
||||
- _StencilWriteMask: 255
|
||||
- _UVSec: 0
|
||||
- _UseUIAlphaClip: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 374f5ecbae26b7149be2a078f37ad800
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 97287d4650544eb4daa041e4a384a06b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,588 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!29 &1
|
||||
OcclusionCullingSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_OcclusionBakeSettings:
|
||||
smallestOccluder: 5
|
||||
smallestHole: 0.25
|
||||
backfaceThreshold: 100
|
||||
m_SceneGUID: 00000000000000000000000000000000
|
||||
m_OcclusionCullingData: {fileID: 0}
|
||||
--- !u!104 &2
|
||||
RenderSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 9
|
||||
m_Fog: 0
|
||||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
m_FogMode: 3
|
||||
m_FogDensity: 0.01
|
||||
m_LinearFogStart: 0
|
||||
m_LinearFogEnd: 300
|
||||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
|
||||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
|
||||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
|
||||
m_AmbientIntensity: 1
|
||||
m_AmbientMode: 0
|
||||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_HaloStrength: 0.5
|
||||
m_FlareStrength: 1
|
||||
m_FlareFadeSpeed: 3
|
||||
m_HaloTexture: {fileID: 0}
|
||||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_DefaultReflectionMode: 0
|
||||
m_DefaultReflectionResolution: 128
|
||||
m_ReflectionBounces: 1
|
||||
m_ReflectionIntensity: 1
|
||||
m_CustomReflection: {fileID: 0}
|
||||
m_Sun: {fileID: 0}
|
||||
m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 12
|
||||
m_GIWorkflowMode: 1
|
||||
m_GISettings:
|
||||
serializedVersion: 2
|
||||
m_BounceScale: 1
|
||||
m_IndirectOutputScale: 1
|
||||
m_AlbedoBoost: 1
|
||||
m_EnvironmentLightingMode: 0
|
||||
m_EnableBakedLightmaps: 1
|
||||
m_EnableRealtimeLightmaps: 0
|
||||
m_LightmapEditorSettings:
|
||||
serializedVersion: 12
|
||||
m_Resolution: 2
|
||||
m_BakeResolution: 40
|
||||
m_AtlasSize: 1024
|
||||
m_AO: 0
|
||||
m_AOMaxDistance: 1
|
||||
m_CompAOExponent: 1
|
||||
m_CompAOExponentDirect: 0
|
||||
m_ExtractAmbientOcclusion: 0
|
||||
m_Padding: 2
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_LightmapsBakeMode: 1
|
||||
m_TextureCompression: 1
|
||||
m_FinalGather: 0
|
||||
m_FinalGatherFiltering: 1
|
||||
m_FinalGatherRayCount: 256
|
||||
m_ReflectionCompression: 2
|
||||
m_MixedBakeMode: 2
|
||||
m_BakeBackend: 1
|
||||
m_PVRSampling: 1
|
||||
m_PVRDirectSampleCount: 32
|
||||
m_PVRSampleCount: 512
|
||||
m_PVRBounces: 2
|
||||
m_PVREnvironmentSampleCount: 256
|
||||
m_PVREnvironmentReferencePointCount: 2048
|
||||
m_PVRFilteringMode: 1
|
||||
m_PVRDenoiserTypeDirect: 1
|
||||
m_PVRDenoiserTypeIndirect: 1
|
||||
m_PVRDenoiserTypeAO: 1
|
||||
m_PVRFilterTypeDirect: 0
|
||||
m_PVRFilterTypeIndirect: 0
|
||||
m_PVRFilterTypeAO: 0
|
||||
m_PVREnvironmentMIS: 1
|
||||
m_PVRCulling: 1
|
||||
m_PVRFilteringGaussRadiusDirect: 1
|
||||
m_PVRFilteringGaussRadiusIndirect: 5
|
||||
m_PVRFilteringGaussRadiusAO: 2
|
||||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||
m_ExportTrainingData: 0
|
||||
m_TrainingDataDestination: TrainingData
|
||||
m_LightProbeSampleCountMultiplier: 4
|
||||
m_LightingDataAsset: {fileID: 0}
|
||||
m_LightingSettings: {fileID: 0}
|
||||
--- !u!196 &4
|
||||
NavMeshSettings:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_BuildSettings:
|
||||
serializedVersion: 2
|
||||
agentTypeID: 0
|
||||
agentRadius: 0.5
|
||||
agentHeight: 2
|
||||
agentSlope: 45
|
||||
agentClimb: 0.4
|
||||
ledgeDropHeight: 0
|
||||
maxJumpAcrossDistance: 0
|
||||
minRegionArea: 2
|
||||
manualCellSize: 0
|
||||
cellSize: 0.16666667
|
||||
manualTileSize: 0
|
||||
tileSize: 256
|
||||
accuratePlacement: 0
|
||||
maxJobWorkers: 0
|
||||
preserveTilesOutsideBounds: 0
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
--- !u!1 &537454904
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 537454906}
|
||||
- component: {fileID: 537454905}
|
||||
m_Layer: 0
|
||||
m_Name: Directional Light
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!108 &537454905
|
||||
Light:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 537454904}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 10
|
||||
m_Type: 1
|
||||
m_Shape: 0
|
||||
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
|
||||
m_Intensity: 1
|
||||
m_Range: 10
|
||||
m_SpotAngle: 30
|
||||
m_InnerSpotAngle: 21.80208
|
||||
m_CookieSize: 10
|
||||
m_Shadows:
|
||||
m_Type: 2
|
||||
m_Resolution: -1
|
||||
m_CustomResolution: -1
|
||||
m_Strength: 1
|
||||
m_Bias: 0.05
|
||||
m_NormalBias: 0.4
|
||||
m_NearPlane: 0.2
|
||||
m_CullingMatrixOverride:
|
||||
e00: 1
|
||||
e01: 0
|
||||
e02: 0
|
||||
e03: 0
|
||||
e10: 0
|
||||
e11: 1
|
||||
e12: 0
|
||||
e13: 0
|
||||
e20: 0
|
||||
e21: 0
|
||||
e22: 1
|
||||
e23: 0
|
||||
e30: 0
|
||||
e31: 0
|
||||
e32: 0
|
||||
e33: 1
|
||||
m_UseCullingMatrixOverride: 0
|
||||
m_Cookie: {fileID: 0}
|
||||
m_DrawHalo: 0
|
||||
m_Flare: {fileID: 0}
|
||||
m_RenderMode: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingLayerMask: 1
|
||||
m_Lightmapping: 4
|
||||
m_LightShadowCasterMode: 0
|
||||
m_AreaSize: {x: 1, y: 1}
|
||||
m_BounceIntensity: 1
|
||||
m_ColorTemperature: 6570
|
||||
m_UseColorTemperature: 0
|
||||
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_UseBoundingSphereOverride: 0
|
||||
m_UseViewFrustumForShadowCasterCull: 1
|
||||
m_ShadowRadius: 0
|
||||
m_ShadowAngle: 0
|
||||
--- !u!4 &537454906
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 537454904}
|
||||
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
|
||||
m_LocalPosition: {x: 0, y: 3, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
|
||||
--- !u!1 &589359925
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 589359928}
|
||||
- component: {fileID: 589359927}
|
||||
- component: {fileID: 589359926}
|
||||
m_Layer: 0
|
||||
m_Name: EventSystem
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &589359926
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 589359925}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_HorizontalAxis: Horizontal
|
||||
m_VerticalAxis: Vertical
|
||||
m_SubmitButton: Submit
|
||||
m_CancelButton: Cancel
|
||||
m_InputActionsPerSecond: 10
|
||||
m_RepeatDelay: 0.5
|
||||
m_ForceModuleActive: 0
|
||||
--- !u!114 &589359927
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 589359925}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_FirstSelected: {fileID: 0}
|
||||
m_sendNavigationEvents: 1
|
||||
m_DragThreshold: 10
|
||||
--- !u!4 &589359928
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 589359925}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 3
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &622947734
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 622947735}
|
||||
- component: {fileID: 622947737}
|
||||
- component: {fileID: 622947736}
|
||||
m_Layer: 5
|
||||
m_Name: Game
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &622947735
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 622947734}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1361633018}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &622947736
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 622947734}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 0
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_Texture: {fileID: 8400000, guid: 6645567e4c11d9447b1aee2406f681c5, type: 2}
|
||||
m_UVRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
--- !u!222 &622947737
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 622947734}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!1 &1355724343
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1355724346}
|
||||
- component: {fileID: 1355724345}
|
||||
- component: {fileID: 1355724344}
|
||||
m_Layer: 0
|
||||
m_Name: Main Camera
|
||||
m_TagString: MainCamera
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!81 &1355724344
|
||||
AudioListener:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1355724343}
|
||||
m_Enabled: 1
|
||||
--- !u!20 &1355724345
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1355724343}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: -1
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 1
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!4 &1355724346
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1355724343}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1, z: -10}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &1361633014
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1361633018}
|
||||
- component: {fileID: 1361633017}
|
||||
- component: {fileID: 1361633016}
|
||||
- component: {fileID: 1361633015}
|
||||
m_Layer: 5
|
||||
m_Name: UI
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &1361633015
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1361633014}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_IgnoreReversedGraphics: 1
|
||||
m_BlockingObjects: 0
|
||||
m_BlockingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
--- !u!114 &1361633016
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1361633014}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_UiScaleMode: 0
|
||||
m_ReferencePixelsPerUnit: 100
|
||||
m_ScaleFactor: 1
|
||||
m_ReferenceResolution: {x: 800, y: 600}
|
||||
m_ScreenMatchMode: 0
|
||||
m_MatchWidthOrHeight: 0
|
||||
m_PhysicalUnit: 3
|
||||
m_FallbackScreenDPI: 96
|
||||
m_DefaultSpriteDPI: 96
|
||||
m_DynamicPixelsPerUnit: 1
|
||||
m_PresetInfoIsWorld: 0
|
||||
--- !u!223 &1361633017
|
||||
Canvas:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1361633014}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 3
|
||||
m_RenderMode: 0
|
||||
m_Camera: {fileID: 0}
|
||||
m_PlaneDistance: 100
|
||||
m_PixelPerfect: 0
|
||||
m_ReceivesEvents: 1
|
||||
m_OverrideSorting: 0
|
||||
m_OverridePixelPerfect: 0
|
||||
m_SortingBucketNormalizedSize: 0
|
||||
m_AdditionalShaderChannelsFlag: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingOrder: 0
|
||||
m_TargetDisplay: 0
|
||||
--- !u!224 &1361633018
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1361633014}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0, y: 0, z: 0}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 622947735}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0, y: 0}
|
||||
--- !u!1 &1498586261
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1498586263}
|
||||
- component: {fileID: 1498586262}
|
||||
m_Layer: 0
|
||||
m_Name: UndoProRecords
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &1498586262
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1498586261}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: df9ab10aeab793d47a27405557d0b929, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!4 &1498586263
|
||||
Transform:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1498586261}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 4
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eb0c18a619175384d95147898a43054b
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4f704ae4b4f98ae41a0bce26658850c1
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,933 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!29 &1
|
||||
OcclusionCullingSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_OcclusionBakeSettings:
|
||||
smallestOccluder: 5
|
||||
smallestHole: 0.25
|
||||
backfaceThreshold: 100
|
||||
m_SceneGUID: 00000000000000000000000000000000
|
||||
m_OcclusionCullingData: {fileID: 0}
|
||||
--- !u!104 &2
|
||||
RenderSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 9
|
||||
m_Fog: 0
|
||||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
m_FogMode: 3
|
||||
m_FogDensity: 0.01
|
||||
m_LinearFogStart: 0
|
||||
m_LinearFogEnd: 300
|
||||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
|
||||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
|
||||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
|
||||
m_AmbientIntensity: 1
|
||||
m_AmbientMode: 0
|
||||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_HaloStrength: 0.5
|
||||
m_FlareStrength: 1
|
||||
m_FlareFadeSpeed: 3
|
||||
m_HaloTexture: {fileID: 0}
|
||||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_DefaultReflectionMode: 0
|
||||
m_DefaultReflectionResolution: 128
|
||||
m_ReflectionBounces: 1
|
||||
m_ReflectionIntensity: 1
|
||||
m_CustomReflection: {fileID: 0}
|
||||
m_Sun: {fileID: 0}
|
||||
m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 11
|
||||
m_GIWorkflowMode: 0
|
||||
m_GISettings:
|
||||
serializedVersion: 2
|
||||
m_BounceScale: 1
|
||||
m_IndirectOutputScale: 1
|
||||
m_AlbedoBoost: 1
|
||||
m_TemporalCoherenceThreshold: 1
|
||||
m_EnvironmentLightingMode: 0
|
||||
m_EnableBakedLightmaps: 1
|
||||
m_EnableRealtimeLightmaps: 0
|
||||
m_LightmapEditorSettings:
|
||||
serializedVersion: 10
|
||||
m_Resolution: 2
|
||||
m_BakeResolution: 10
|
||||
m_AtlasSize: 512
|
||||
m_AO: 0
|
||||
m_AOMaxDistance: 1
|
||||
m_CompAOExponent: 1
|
||||
m_CompAOExponentDirect: 0
|
||||
m_Padding: 2
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_LightmapsBakeMode: 1
|
||||
m_TextureCompression: 1
|
||||
m_FinalGather: 0
|
||||
m_FinalGatherFiltering: 1
|
||||
m_FinalGatherRayCount: 256
|
||||
m_ReflectionCompression: 2
|
||||
m_MixedBakeMode: 2
|
||||
m_BakeBackend: 1
|
||||
m_PVRSampling: 1
|
||||
m_PVRDirectSampleCount: 32
|
||||
m_PVRSampleCount: 256
|
||||
m_PVRBounces: 2
|
||||
m_PVRFilterTypeDirect: 0
|
||||
m_PVRFilterTypeIndirect: 0
|
||||
m_PVRFilterTypeAO: 0
|
||||
m_PVRFilteringMode: 1
|
||||
m_PVRCulling: 1
|
||||
m_PVRFilteringGaussRadiusDirect: 1
|
||||
m_PVRFilteringGaussRadiusIndirect: 5
|
||||
m_PVRFilteringGaussRadiusAO: 2
|
||||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||
m_ShowResolutionOverlay: 1
|
||||
m_LightingDataAsset: {fileID: 0}
|
||||
m_UseShadowmask: 1
|
||||
--- !u!196 &4
|
||||
NavMeshSettings:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_BuildSettings:
|
||||
serializedVersion: 2
|
||||
agentTypeID: 0
|
||||
agentRadius: 0.5
|
||||
agentHeight: 2
|
||||
agentSlope: 45
|
||||
agentClimb: 0.4
|
||||
ledgeDropHeight: 0
|
||||
maxJumpAcrossDistance: 0
|
||||
minRegionArea: 2
|
||||
manualCellSize: 0
|
||||
cellSize: 0.16666667
|
||||
manualTileSize: 0
|
||||
tileSize: 256
|
||||
accuratePlacement: 0
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
--- !u!1 &85201915
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 85201916}
|
||||
- component: {fileID: 85201919}
|
||||
- component: {fileID: 85201918}
|
||||
- component: {fileID: 85201917}
|
||||
m_Layer: 5
|
||||
m_Name: btnStart
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &85201916
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 85201915}
|
||||
m_LocalRotation: {x: -1, y: -0, z: -0, w: 0}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 422799409}
|
||||
m_Father: {fileID: 1067981924}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 1}
|
||||
m_AnchorMax: {x: 0, y: 1}
|
||||
m_AnchoredPosition: {x: 44, y: -499}
|
||||
m_SizeDelta: {x: 67.6, y: 28.2}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &85201917
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 85201915}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Navigation:
|
||||
m_Mode: 3
|
||||
m_SelectOnUp: {fileID: 0}
|
||||
m_SelectOnDown: {fileID: 0}
|
||||
m_SelectOnLeft: {fileID: 0}
|
||||
m_SelectOnRight: {fileID: 0}
|
||||
m_Transition: 1
|
||||
m_Colors:
|
||||
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
|
||||
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
|
||||
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
|
||||
m_ColorMultiplier: 1
|
||||
m_FadeDuration: 0.1
|
||||
m_SpriteState:
|
||||
m_HighlightedSprite: {fileID: 0}
|
||||
m_PressedSprite: {fileID: 0}
|
||||
m_DisabledSprite: {fileID: 0}
|
||||
m_AnimationTriggers:
|
||||
m_NormalTrigger: Normal
|
||||
m_HighlightedTrigger: Highlighted
|
||||
m_PressedTrigger: Pressed
|
||||
m_DisabledTrigger: Disabled
|
||||
m_Interactable: 1
|
||||
m_TargetGraphic: {fileID: 85201918}
|
||||
m_OnClick:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
|
||||
Culture=neutral, PublicKeyToken=null
|
||||
--- !u!114 &85201918
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 85201915}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Type: 1
|
||||
m_PreserveAspect: 0
|
||||
m_FillCenter: 1
|
||||
m_FillMethod: 4
|
||||
m_FillAmount: 1
|
||||
m_FillClockwise: 1
|
||||
m_FillOrigin: 0
|
||||
--- !u!222 &85201919
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 85201915}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!1 &97286095
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 97286097}
|
||||
- component: {fileID: 97286096}
|
||||
- component: {fileID: 97286098}
|
||||
m_Layer: 0
|
||||
m_Name: NesEmu
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &97286096
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 97286095}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 39557e19783acee499ace6c68549e8f8, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
VideoProvider: {fileID: 1168232458}
|
||||
AudioProvider: {fileID: 1963186404}
|
||||
btnStart: {fileID: 85201917}
|
||||
RomName: KickMaster.nes
|
||||
--- !u!4 &97286097
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 97286095}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 1168232457}
|
||||
- {fileID: 1963186403}
|
||||
- {fileID: 1179864540}
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &97286098
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 97286095}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 4f6742d2e5aa8bf40b765aa44eca65d2, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
AllowDebugging: 1
|
||||
--- !u!1 &422799408
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 422799409}
|
||||
- component: {fileID: 422799411}
|
||||
- component: {fileID: 422799410}
|
||||
m_Layer: 5
|
||||
m_Name: Text
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &422799409
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 422799408}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 85201916}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &422799410
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 422799408}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
m_FontData:
|
||||
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_FontSize: 14
|
||||
m_FontStyle: 0
|
||||
m_BestFit: 0
|
||||
m_MinSize: 10
|
||||
m_MaxSize: 40
|
||||
m_Alignment: 4
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 0
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text: Start
|
||||
--- !u!222 &422799411
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 422799408}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!1 &534669902
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 534669905}
|
||||
- component: {fileID: 534669904}
|
||||
- component: {fileID: 534669903}
|
||||
- component: {fileID: 534669906}
|
||||
m_Layer: 0
|
||||
m_Name: Main Camera
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!81 &534669903
|
||||
AudioListener:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 534669902}
|
||||
m_Enabled: 0
|
||||
--- !u!20 &534669904
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 534669902}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: -1
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 1
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!4 &534669905
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 534669902}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1, z: -10}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &534669906
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 534669902}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 24d3dec34287f264d9d50bd278042e4b, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!1 &683409679
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 683409682}
|
||||
- component: {fileID: 683409681}
|
||||
- component: {fileID: 683409680}
|
||||
m_Layer: 0
|
||||
m_Name: EventSystem
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &683409680
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 683409679}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 1077351063, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_HorizontalAxis: Horizontal
|
||||
m_VerticalAxis: Vertical
|
||||
m_SubmitButton: Submit
|
||||
m_CancelButton: Cancel
|
||||
m_InputActionsPerSecond: 10
|
||||
m_RepeatDelay: 0.5
|
||||
m_ForceModuleActive: 0
|
||||
--- !u!114 &683409681
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 683409679}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: -619905303, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_FirstSelected: {fileID: 0}
|
||||
m_sendNavigationEvents: 1
|
||||
m_DragThreshold: 10
|
||||
--- !u!4 &683409682
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 683409679}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &1067981923
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1067981924}
|
||||
- component: {fileID: 1067981926}
|
||||
- component: {fileID: 1067981925}
|
||||
m_Layer: 5
|
||||
m_Name: RawImage
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &1067981924
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1067981923}
|
||||
m_LocalRotation: {x: 1, y: 0, z: 0, w: 0}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children:
|
||||
- {fileID: 85201916}
|
||||
m_Father: {fileID: 1179864540}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 180, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 1, y: 1}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &1067981925
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1067981923}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 2100000, guid: 374f5ecbae26b7149be2a078f37ad800, type: 2}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
m_Texture: {fileID: 8400000, guid: ffe34aaf87e4b9942b4c2ac05943d444, type: 2}
|
||||
m_UVRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
--- !u!222 &1067981926
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1067981923}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!1 &1168232456
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1168232457}
|
||||
- component: {fileID: 1168232458}
|
||||
m_Layer: 0
|
||||
m_Name: VideoProvider
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1168232457
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1168232456}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 97286097}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1168232458
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1168232456}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 83fbe375412d1af4482ae76e81c1dda2, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
NesEmu: {fileID: 0}
|
||||
Image: {fileID: 1067981925}
|
||||
fpstext: {fileID: 1559076253}
|
||||
detalTime: 0
|
||||
--- !u!1 &1179864539
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1179864540}
|
||||
- component: {fileID: 1179864543}
|
||||
- component: {fileID: 1179864542}
|
||||
- component: {fileID: 1179864541}
|
||||
m_Layer: 5
|
||||
m_Name: Canvas
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &1179864540
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1179864539}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0, y: 0, z: 0}
|
||||
m_Children:
|
||||
- {fileID: 1067981924}
|
||||
- {fileID: 1559076252}
|
||||
m_Father: {fileID: 97286097}
|
||||
m_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 0}
|
||||
m_AnchorMax: {x: 0, y: 0}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 0, y: 0}
|
||||
m_Pivot: {x: 0, y: 0}
|
||||
--- !u!114 &1179864541
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1179864539}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 1301386320, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_IgnoreReversedGraphics: 1
|
||||
m_BlockingObjects: 0
|
||||
m_BlockingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
--- !u!114 &1179864542
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1179864539}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 1980459831, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_UiScaleMode: 0
|
||||
m_ReferencePixelsPerUnit: 100
|
||||
m_ScaleFactor: 1
|
||||
m_ReferenceResolution: {x: 800, y: 600}
|
||||
m_ScreenMatchMode: 0
|
||||
m_MatchWidthOrHeight: 0
|
||||
m_PhysicalUnit: 3
|
||||
m_FallbackScreenDPI: 96
|
||||
m_DefaultSpriteDPI: 96
|
||||
m_DynamicPixelsPerUnit: 1
|
||||
--- !u!223 &1179864543
|
||||
Canvas:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1179864539}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 3
|
||||
m_RenderMode: 0
|
||||
m_Camera: {fileID: 0}
|
||||
m_PlaneDistance: 100
|
||||
m_PixelPerfect: 0
|
||||
m_ReceivesEvents: 1
|
||||
m_OverrideSorting: 0
|
||||
m_OverridePixelPerfect: 0
|
||||
m_SortingBucketNormalizedSize: 0
|
||||
m_AdditionalShaderChannelsFlag: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingOrder: 0
|
||||
m_TargetDisplay: 0
|
||||
--- !u!1 &1559076251
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1559076252}
|
||||
- component: {fileID: 1559076254}
|
||||
- component: {fileID: 1559076253}
|
||||
m_Layer: 5
|
||||
m_Name: FPS
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!224 &1559076252
|
||||
RectTransform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1559076251}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1179864540}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_AnchorMin: {x: 0, y: 1}
|
||||
m_AnchorMax: {x: 0, y: 1}
|
||||
m_AnchoredPosition: {x: 89, y: -26.25}
|
||||
m_SizeDelta: {x: 152.2, y: 30.5}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!114 &1559076253
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1559076251}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 0.009791947, b: 0, a: 1}
|
||||
m_RaycastTarget: 1
|
||||
m_OnCullStateChanged:
|
||||
m_PersistentCalls:
|
||||
m_Calls: []
|
||||
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
|
||||
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||
m_FontData:
|
||||
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_FontSize: 17
|
||||
m_FontStyle: 0
|
||||
m_BestFit: 0
|
||||
m_MinSize: 0
|
||||
m_MaxSize: 50
|
||||
m_Alignment: 0
|
||||
m_AlignByGeometry: 0
|
||||
m_RichText: 1
|
||||
m_HorizontalOverflow: 0
|
||||
m_VerticalOverflow: 0
|
||||
m_LineSpacing: 1
|
||||
m_Text: FPS
|
||||
--- !u!222 &1559076254
|
||||
CanvasRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1559076251}
|
||||
m_CullTransparentMesh: 0
|
||||
--- !u!1 &1963186402
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1963186403}
|
||||
- component: {fileID: 1963186404}
|
||||
- component: {fileID: 1963186405}
|
||||
m_Layer: 0
|
||||
m_Name: AudioProvider
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1963186403
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1963186402}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 97286097}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1963186404
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1963186402}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a6a09b6a4cf4c2d4f994a13fd7e89d6f, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_as: {fileID: 1963186405}
|
||||
--- !u!82 &1963186405
|
||||
AudioSource:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_GameObject: {fileID: 1963186402}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 4
|
||||
OutputAudioMixerGroup: {fileID: 0}
|
||||
m_audioClip: {fileID: 0}
|
||||
m_PlayOnAwake: 1
|
||||
m_Volume: 1
|
||||
m_Pitch: 1
|
||||
Loop: 0
|
||||
Mute: 0
|
||||
Spatialize: 0
|
||||
SpatializePostEffects: 0
|
||||
Priority: 128
|
||||
DopplerLevel: 1
|
||||
MinDistance: 1
|
||||
MaxDistance: 500
|
||||
Pan2D: 0
|
||||
rolloffMode: 0
|
||||
BypassEffects: 0
|
||||
BypassListenerEffects: 0
|
||||
BypassReverbZones: 0
|
||||
rolloffCustomCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
- serializedVersion: 3
|
||||
time: 1
|
||||
value: 0
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
panLevelCustomCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
spreadCustomCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
reverbZoneMixCustomCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 99c9720ab356a0642a771bea13969a05
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cb2f15a5cdbcfcc498fecad6768c5ec9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"name": "AxibugEmuOnline.Client",
|
||||
"references": [
|
||||
"VirtualNes.Core"
|
||||
],
|
||||
"optionalUnityReferences": [],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
public static class CorePath
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
public static string DataPath => Application.persistentDataPath;
|
||||
#elif UNITY_PSP2
|
||||
public static string DataPath => Application.dataPath;
|
||||
#else
|
||||
public static string DataPath => Application.persistentDataPath;
|
||||
#endif
|
||||
}
|
@ -1,296 +0,0 @@
|
||||
using VirtualNes.Core;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public static class PaletteDefine
|
||||
{
|
||||
public struct RGBQUAD
|
||||
{
|
||||
public byte rgbBlue;
|
||||
public byte rgbGreen;
|
||||
public byte rgbRed;
|
||||
public byte rgbReserved;
|
||||
}
|
||||
|
||||
public class PALBUF
|
||||
{
|
||||
public byte r;
|
||||
public byte g;
|
||||
public byte b;
|
||||
|
||||
public PALBUF(byte r, byte g, byte b)
|
||||
{
|
||||
this.r = r;
|
||||
this.g = g;
|
||||
this.b = b;
|
||||
}
|
||||
}
|
||||
|
||||
// スキャンラインカラー
|
||||
private static int m_nScanlineColor => Supporter.Config.graphics.nScanlineColor;
|
||||
|
||||
public static float[][] PalConvTbl = new float[8][]
|
||||
{
|
||||
new float[3]{1.00f, 1.00f, 1.00f},
|
||||
new float[3]{1.00f, 0.80f, 0.73f},
|
||||
new float[3]{0.73f, 1.00f, 0.70f},
|
||||
new float[3]{0.76f, 0.78f, 0.58f},
|
||||
new float[3]{0.86f, 0.80f, 1.00f},
|
||||
new float[3]{0.83f, 0.68f, 0.85f},
|
||||
new float[3]{0.67f, 0.77f, 0.83f},
|
||||
new float[3]{0.68f, 0.68f, 0.68f},
|
||||
};
|
||||
|
||||
public static PALBUF[] m_PaletteBuf = new PALBUF[64]
|
||||
{
|
||||
new PALBUF(0x7F, 0x7F, 0x7F),
|
||||
new PALBUF(0x20, 0x00, 0xB0),
|
||||
new PALBUF(0x28, 0x00, 0xB8),
|
||||
new PALBUF(0x60, 0x10, 0xA0),
|
||||
new PALBUF(0x98, 0x20, 0x78),
|
||||
new PALBUF(0xB0, 0x10, 0x30),
|
||||
new PALBUF(0xA0, 0x30, 0x00),
|
||||
new PALBUF(0x78, 0x40, 0x00),
|
||||
new PALBUF(0x48, 0x58, 0x00),
|
||||
new PALBUF(0x38, 0x68, 0x00),
|
||||
new PALBUF(0x38, 0x6C, 0x00),
|
||||
new PALBUF(0x30, 0x60, 0x40),
|
||||
new PALBUF(0x30, 0x50, 0x80),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0xBC, 0xBC, 0xBC),
|
||||
new PALBUF(0x40, 0x60, 0xF8),
|
||||
new PALBUF(0x40, 0x40, 0xFF),
|
||||
new PALBUF(0x90, 0x40, 0xF0),
|
||||
new PALBUF(0xD8, 0x40, 0xC0),
|
||||
new PALBUF(0xD8, 0x40, 0x60),
|
||||
new PALBUF(0xE0, 0x50, 0x00),
|
||||
new PALBUF(0xC0, 0x70, 0x00),
|
||||
new PALBUF(0x88, 0x88, 0x00),
|
||||
new PALBUF(0x50, 0xA0, 0x00),
|
||||
new PALBUF(0x48, 0xA8, 0x10),
|
||||
new PALBUF(0x48, 0xA0, 0x68),
|
||||
new PALBUF(0x40, 0x90, 0xC0),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0xFF, 0xFF, 0xFF),
|
||||
new PALBUF(0x60, 0xA0, 0xFF),
|
||||
new PALBUF(0x50, 0x80, 0xFF),
|
||||
new PALBUF(0xA0, 0x70, 0xFF),
|
||||
new PALBUF(0xF0, 0x60, 0xFF),
|
||||
new PALBUF(0xFF, 0x60, 0xB0),
|
||||
new PALBUF(0xFF, 0x78, 0x30),
|
||||
new PALBUF(0xFF, 0xA0, 0x00),
|
||||
new PALBUF(0xE8, 0xD0, 0x20),
|
||||
new PALBUF(0x98, 0xE8, 0x00),
|
||||
new PALBUF(0x70, 0xF0, 0x40),
|
||||
new PALBUF(0x70, 0xE0, 0x90),
|
||||
new PALBUF(0x60, 0xD0, 0xE0),
|
||||
new PALBUF(0x60, 0x60, 0x60),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0xFF, 0xFF, 0xFF),
|
||||
new PALBUF(0x90, 0xD0, 0xFF),
|
||||
new PALBUF(0xA0, 0xB8, 0xFF),
|
||||
new PALBUF(0xC0, 0xB0, 0xFF),
|
||||
new PALBUF(0xE0, 0xB0, 0xFF),
|
||||
new PALBUF(0xFF, 0xB8, 0xE8),
|
||||
new PALBUF(0xFF, 0xC8, 0xB8),
|
||||
new PALBUF(0xFF, 0xD8, 0xA0),
|
||||
new PALBUF(0xFF, 0xF0, 0x90),
|
||||
new PALBUF(0xC8, 0xF0, 0x80),
|
||||
new PALBUF(0xA0, 0xF0, 0xA0),
|
||||
new PALBUF(0xA0, 0xFF, 0xC8),
|
||||
new PALBUF(0xA0, 0xFF, 0xF0),
|
||||
new PALBUF(0xA0, 0xA0, 0xA0),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
new PALBUF(0x00, 0x00, 0x00),
|
||||
};
|
||||
|
||||
#region 256色モード用
|
||||
// Color
|
||||
public static RGBQUAD[][] m_cpPalette = new RGBQUAD[8][]
|
||||
{
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
};
|
||||
// Monochrome
|
||||
public static RGBQUAD[][] m_mpPalette = new RGBQUAD[8][]
|
||||
{
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
new RGBQUAD[64*2],
|
||||
};
|
||||
#endregion
|
||||
|
||||
#region ピクセルフォーマットに変換したパレット
|
||||
// Color
|
||||
public static uint[][] m_cnPalette = new uint[8][]
|
||||
{
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
};
|
||||
// Color/Scanline
|
||||
public static uint[][] m_csPalette = new uint[8][]
|
||||
{
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
};
|
||||
|
||||
// Monochrome
|
||||
public static uint[][] m_mnPalette = new uint[8][]
|
||||
{
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
};
|
||||
|
||||
// Monochrome/Scanline
|
||||
public static uint[][] m_msPalette = new uint[8][]
|
||||
{
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
new uint[256],
|
||||
};
|
||||
#endregion
|
||||
|
||||
public static RGBQUAD[] GetPaletteData()
|
||||
{
|
||||
RGBQUAD[] rgb = new RGBQUAD[256];
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
rgb[i] = m_cpPalette[0][i];
|
||||
rgb[i + 0x40] = m_mpPalette[0][i];
|
||||
}
|
||||
|
||||
return rgb;
|
||||
}
|
||||
|
||||
static PaletteDefine()
|
||||
{
|
||||
int Rbit = 0, Gbit = 0, Bbit = 0;
|
||||
int Rsft = 0, Gsft = 0, Bsft = 0;
|
||||
|
||||
GetBitMask(0xFF0000, ref Rsft, ref Rbit);
|
||||
GetBitMask(0x00FF00, ref Gsft, ref Gbit);
|
||||
GetBitMask(0x0000FF, ref Bsft, ref Bbit);
|
||||
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
uint Rn, Gn, Bn;
|
||||
uint Rs, Gs, Bs;
|
||||
|
||||
// Normal
|
||||
Rn = (uint)(PalConvTbl[j][0] * m_PaletteBuf[i].r);
|
||||
Gn = (uint)(PalConvTbl[j][1] * m_PaletteBuf[i].g);
|
||||
Bn = (uint)(PalConvTbl[j][2] * m_PaletteBuf[i].b);
|
||||
// Scanline
|
||||
Rs = (uint)(PalConvTbl[j][0] * m_PaletteBuf[i].r * m_nScanlineColor / 100.0f);
|
||||
Gs = (uint)(PalConvTbl[j][1] * m_PaletteBuf[i].g * m_nScanlineColor / 100.0f);
|
||||
Bs = (uint)(PalConvTbl[j][2] * m_PaletteBuf[i].b * m_nScanlineColor / 100.0f);
|
||||
|
||||
m_cpPalette[j][i + 0x00].rgbRed = (byte)Rn;
|
||||
m_cpPalette[j][i + 0x00].rgbGreen = (byte)Gn;
|
||||
m_cpPalette[j][i + 0x00].rgbBlue = (byte)Bn;
|
||||
m_cpPalette[j][i + 0x40].rgbRed = (byte)Rs;
|
||||
m_cpPalette[j][i + 0x40].rgbGreen = (byte)Gs;
|
||||
m_cpPalette[j][i + 0x40].rgbBlue = (byte)Bs;
|
||||
|
||||
m_cnPalette[j][i] = ((Rn >> (8 - Rbit)) << Rsft) | ((Gn >> (8 - Gbit)) << Gsft) | ((Bn >> (8 - Bbit)) << Bsft);
|
||||
m_csPalette[j][i] = ((Rs >> (8 - Rbit)) << Rsft) | ((Gs >> (8 - Gbit)) << Gsft) | ((Bs >> (8 - Bbit)) << Bsft);
|
||||
|
||||
// Monochrome
|
||||
Rn = (uint)(m_PaletteBuf[i & 0x30].r);
|
||||
Gn = (uint)(m_PaletteBuf[i & 0x30].g);
|
||||
Bn = (uint)(m_PaletteBuf[i & 0x30].b);
|
||||
Rn =
|
||||
Gn =
|
||||
Bn = (uint)(0.299f * Rn + 0.587f * Gn + 0.114f * Bn);
|
||||
Rn = (uint)(PalConvTbl[j][0] * Rn);
|
||||
Gn = (uint)(PalConvTbl[j][1] * Gn);
|
||||
Bn = (uint)(PalConvTbl[j][2] * Bn);
|
||||
if (Rn > 0xFF) Rs = 0xFF;
|
||||
if (Gn > 0xFF) Gs = 0xFF;
|
||||
if (Bn > 0xFF) Bs = 0xFF;
|
||||
// Scanline
|
||||
Rs = (uint)(m_PaletteBuf[i & 0x30].r * m_nScanlineColor / 100.0f);
|
||||
Gs = (uint)(m_PaletteBuf[i & 0x30].g * m_nScanlineColor / 100.0f);
|
||||
Bs = (uint)(m_PaletteBuf[i & 0x30].b * m_nScanlineColor / 100.0f);
|
||||
Rs =
|
||||
Gs =
|
||||
Bs = (uint)(0.299f * Rs + 0.587f * Gs + 0.114f * Bs);
|
||||
Rs = (uint)(PalConvTbl[j][0] * Rs);
|
||||
Gs = (uint)(PalConvTbl[j][1] * Gs);
|
||||
Bs = (uint)(PalConvTbl[j][2] * Bs);
|
||||
if (Rs > 0xFF) Rs = 0xFF;
|
||||
if (Gs > 0xFF) Gs = 0xFF;
|
||||
if (Bs > 0xFF) Bs = 0xFF;
|
||||
|
||||
m_mpPalette[j][i + 0x00].rgbRed = (byte)Rn;
|
||||
m_mpPalette[j][i + 0x00].rgbGreen = (byte)Gn;
|
||||
m_mpPalette[j][i + 0x00].rgbBlue = (byte)Bn;
|
||||
m_mpPalette[j][i + 0x40].rgbRed = (byte)Rs;
|
||||
m_mpPalette[j][i + 0x40].rgbGreen = (byte)Gs;
|
||||
m_mpPalette[j][i + 0x40].rgbBlue = (byte)Bs;
|
||||
|
||||
m_mnPalette[j][i] = ((Rn >> (8 - Rbit)) << Rsft) | ((Gn >> (8 - Gbit)) << Gsft) | ((Bn >> (8 - Bbit)) << Bsft);
|
||||
m_msPalette[j][i] = ((Rs >> (8 - Rbit)) << Rsft) | ((Gs >> (8 - Gbit)) << Gsft) | ((Bs >> (8 - Bbit)) << Bsft);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ビット位置の取得
|
||||
static void GetBitMask(uint val, ref int shift, ref int bits)
|
||||
{
|
||||
shift = 0;
|
||||
while (((val & (1 << shift)) == 0) && (shift < 32))
|
||||
{
|
||||
shift++;
|
||||
}
|
||||
|
||||
bits = 32;
|
||||
while (((val & (1 << (bits - 1))) == 0) && (bits > 0))
|
||||
{
|
||||
bits--;
|
||||
}
|
||||
bits = bits - shift;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,69 +0,0 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class VideoProvider : MonoBehaviour
|
||||
{
|
||||
public NesEmulator NesEmu;
|
||||
|
||||
public RawImage Image;
|
||||
public Text fpstext;
|
||||
|
||||
private UInt32[] wrapTexBuffer;
|
||||
private IntPtr wrapTexBufferPointer;
|
||||
private Texture2D wrapTex;
|
||||
private int TexBufferSize;
|
||||
|
||||
private Texture2D pPal;
|
||||
float lasttime;
|
||||
public float detalTime;
|
||||
public void SetDrawData(uint[] screenData, byte[] lineColorMode, int screenWidth, int screenHeight)
|
||||
{
|
||||
if (wrapTex == null)
|
||||
{
|
||||
//wrapTex = new Texture2D(272, 240, TextureFormat.BGRA32, false);
|
||||
wrapTex = new Texture2D(272, 240, TextureFormat.RGBA32, false);
|
||||
wrapTex.filterMode = FilterMode.Point;
|
||||
wrapTexBuffer = screenData;
|
||||
|
||||
// 固定数组,防止垃圾回收器移动它
|
||||
GCHandle handle = GCHandle.Alloc(wrapTexBuffer, GCHandleType.Pinned);
|
||||
// 获取数组的指针
|
||||
wrapTexBufferPointer = handle.AddrOfPinnedObject();
|
||||
|
||||
Image.texture = wrapTex;
|
||||
Image.material.SetTexture("_MainTex", wrapTex);
|
||||
|
||||
TexBufferSize = wrapTexBuffer.Length * 4;
|
||||
|
||||
var palRaw = PaletteDefine.m_cnPalette[0];
|
||||
//pPal = new Texture2D(palRaw.Length, 1, TextureFormat.BGRA32, 1, true);
|
||||
pPal = new Texture2D(palRaw.Length, 1, TextureFormat.RGBA32, true);
|
||||
pPal.filterMode = FilterMode.Point;
|
||||
for (int i = 0; i < palRaw.Length; i++)
|
||||
{
|
||||
uint colorRaw = palRaw[i];
|
||||
var argbColor = BitConverter.GetBytes(colorRaw);
|
||||
Color temp = Color.white;
|
||||
temp.r = argbColor[2] / 255f;
|
||||
temp.g = argbColor[1] / 255f;
|
||||
temp.b = argbColor[0] / 255f;
|
||||
temp.a = 1;
|
||||
pPal.SetPixel(i, 0, temp);
|
||||
}
|
||||
pPal.Apply();
|
||||
Image.material.SetTexture("_PalTex", pPal);
|
||||
}
|
||||
|
||||
wrapTex.LoadRawTextureData(wrapTexBufferPointer, TexBufferSize);
|
||||
wrapTex.Apply();
|
||||
|
||||
detalTime = Time.time - lasttime;
|
||||
lasttime = Time.time;
|
||||
fpstext.text = (1f / detalTime).ToString();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
using VirtualNes.Core;
|
||||
|
||||
public class SoundBuffer : RingBuffer<byte>, ISoundDataBuffer
|
||||
{
|
||||
public SoundBuffer(int capacity) : base(capacity) { }
|
||||
|
||||
public void WriteByte(byte value)
|
||||
{
|
||||
Write(value);
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1bb2987740587b44e90ef7dfc1832a23
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
@ -1,7 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8cc6e346f997e294c9dcea50436c1757
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2c5bcc6d5df67f04d93e0ab812c36b4e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,559 +0,0 @@
|
||||
//using Codice.CM.Client.Differences;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Principal;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core;
|
||||
using VirtualNes.Core.Debug;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class APU
|
||||
{
|
||||
public const uint QUEUE_LENGTH = 8192;
|
||||
|
||||
// Volume adjust
|
||||
// Internal sounds
|
||||
public const uint RECTANGLE_VOL = 0x0F0;
|
||||
public const uint TRIANGLE_VOL = 0x130;
|
||||
public const uint NOISE_VOL = 0x0C0;
|
||||
public const uint DPCM_VOL = 0x0F0;
|
||||
// Extra sounds
|
||||
public const uint VRC6_VOL = 0x0F0;
|
||||
public const uint VRC7_VOL = 0x130;
|
||||
public const uint FDS_VOL = 0x0F0;
|
||||
public const uint MMC5_VOL = 0x0F0;
|
||||
public const uint N106_VOL = 0x088;
|
||||
public const uint FME7_VOL = 0x130;
|
||||
|
||||
private NES nes;
|
||||
private byte exsound_select;
|
||||
private APU_INTERNAL @internal = new APU_INTERNAL();
|
||||
private APU_VRC6 vrc6 = new APU_VRC6();
|
||||
private APU_VRC7 vrc7 = new APU_VRC7();
|
||||
private APU_MMC5 mmc5 = new APU_MMC5();
|
||||
private APU_FDS fds = new APU_FDS();
|
||||
private APU_N106 n106 = new APU_N106();
|
||||
private APU_FME7 fme7 = new APU_FME7();
|
||||
private int last_data;
|
||||
private int last_diff;
|
||||
protected short[] m_SoundBuffer = new short[256];
|
||||
protected int[] lowpass_filter = new int[4];
|
||||
protected QUEUE queue = new QUEUE();
|
||||
protected QUEUE exqueue = new QUEUE();
|
||||
protected bool[] m_bMute = new bool[16];
|
||||
protected double elapsed_time;
|
||||
|
||||
public APU(NES parent)
|
||||
{
|
||||
exsound_select = 0;
|
||||
|
||||
nes = parent;
|
||||
@internal.SetParent(parent);
|
||||
|
||||
last_data = last_diff = 0;
|
||||
|
||||
Array.Clear(m_SoundBuffer, 0, m_SoundBuffer.Length);
|
||||
Array.Clear(lowpass_filter, 0, lowpass_filter.Length);
|
||||
|
||||
for (int i = 0; i < m_bMute.Length; i++)
|
||||
m_bMute[i] = true;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
@internal.Dispose();
|
||||
vrc6.Dispose();
|
||||
vrc7.Dispose();
|
||||
mmc5.Dispose();
|
||||
fds.Dispose();
|
||||
n106.Dispose();
|
||||
fme7.Dispose();
|
||||
}
|
||||
|
||||
private int[] vol = new int[24];
|
||||
static double cutofftemp = (2.0 * 3.141592653579 * 40.0);
|
||||
static double tmp = 0.0;
|
||||
|
||||
public void Process(ISoundDataBuffer lpBuffer, uint dwSize)
|
||||
{
|
||||
int nBits = Supporter.Config.sound.nBits;
|
||||
uint dwLength = (uint)(dwSize / (nBits / 8));
|
||||
int output;
|
||||
QUEUEDATA q = new QUEUEDATA();
|
||||
uint writetime;
|
||||
|
||||
var pSoundBuf = m_SoundBuffer;
|
||||
int nCcount = 0;
|
||||
|
||||
int nFilterType = Supporter.Config.sound.nFilterType;
|
||||
|
||||
if (!Supporter.Config.sound.bEnable)
|
||||
{
|
||||
byte empty = (byte)(Supporter.Config.sound.nRate == 8 ? 128 : 0);
|
||||
for (int i = 0; i < dwSize; i++)
|
||||
lpBuffer.WriteByte(empty);
|
||||
return;
|
||||
}
|
||||
|
||||
// Volume setup
|
||||
// 0:Master
|
||||
// 1:Rectangle 1
|
||||
// 2:Rectangle 2
|
||||
// 3:Triangle
|
||||
// 4:Noise
|
||||
// 5:DPCM
|
||||
// 6:VRC6
|
||||
// 7:VRC7
|
||||
// 8:FDS
|
||||
// 9:MMC5
|
||||
// 10:N106
|
||||
// 11:FME7
|
||||
MemoryUtility.ZEROMEMORY(vol, vol.Length);
|
||||
|
||||
var bMute = m_bMute;
|
||||
var nVolume = Supporter.Config.sound.nVolume;
|
||||
|
||||
int nMasterVolume = bMute[0] ? nVolume[0] : 0;
|
||||
|
||||
// Internal
|
||||
vol[0] = (int)(bMute[1] ? (RECTANGLE_VOL * nVolume[1] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[1] = (int)(bMute[2] ? (RECTANGLE_VOL * nVolume[2] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[2] = (int)(bMute[3] ? (TRIANGLE_VOL * nVolume[3] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[3] = (int)(bMute[4] ? (NOISE_VOL * nVolume[4] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[4] = (int)(bMute[5] ? (DPCM_VOL * nVolume[5] * nMasterVolume) / (100 * 100) : 0);
|
||||
|
||||
// VRC6
|
||||
vol[5] = (int)(bMute[6] ? (VRC6_VOL * nVolume[6] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[6] = (int)(bMute[7] ? (VRC6_VOL * nVolume[6] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[7] = (int)(bMute[8] ? (VRC6_VOL * nVolume[6] * nMasterVolume) / (100 * 100) : 0);
|
||||
|
||||
// VRC7
|
||||
vol[8] = (int)(bMute[6] ? (VRC7_VOL * nVolume[7] * nMasterVolume) / (100 * 100) : 0);
|
||||
|
||||
// FDS
|
||||
vol[9] = (int)(bMute[6] ? (FDS_VOL * nVolume[8] * nMasterVolume) / (100 * 100) : 0);
|
||||
|
||||
// MMC5
|
||||
vol[10] = (int)(bMute[6] ? (MMC5_VOL * nVolume[9] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[11] = (int)(bMute[7] ? (MMC5_VOL * nVolume[9] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[12] = (int)(bMute[8] ? (MMC5_VOL * nVolume[9] * nMasterVolume) / (100 * 100) : 0);
|
||||
|
||||
// N106
|
||||
vol[13] = (int)(bMute[6] ? (N106_VOL * nVolume[10] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[14] = (int)(bMute[7] ? (N106_VOL * nVolume[10] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[15] = (int)(bMute[8] ? (N106_VOL * nVolume[10] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[16] = (int)(bMute[9] ? (N106_VOL * nVolume[10] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[17] = (int)(bMute[10] ? (N106_VOL * nVolume[10] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[18] = (int)(bMute[11] ? (N106_VOL * nVolume[10] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[19] = (int)(bMute[12] ? (N106_VOL * nVolume[10] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[20] = (int)(bMute[13] ? (N106_VOL * nVolume[10] * nMasterVolume) / (100 * 100) : 0);
|
||||
|
||||
// FME7
|
||||
vol[21] = (int)(bMute[6] ? (FME7_VOL * nVolume[11] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[22] = (int)(bMute[7] ? (FME7_VOL * nVolume[11] * nMasterVolume) / (100 * 100) : 0);
|
||||
vol[23] = (int)(bMute[8] ? (FME7_VOL * nVolume[11] * nMasterVolume) / (100 * 100) : 0);
|
||||
|
||||
// double cycle_rate = ((double)FRAME_CYCLES*60.0/12.0)/(double)Config.sound.nRate;
|
||||
double cycle_rate = (nes.nescfg.FrameCycles * 60.0 / 12.0) / Supporter.Config.sound.nRate;
|
||||
|
||||
// CPUサイクル数がループしてしまった時の対策処理
|
||||
if (elapsed_time > nes.cpu.GetTotalCycles())
|
||||
{
|
||||
QueueFlush();
|
||||
}
|
||||
|
||||
while ((dwLength--) != 0)
|
||||
{
|
||||
writetime = (uint)elapsed_time;
|
||||
|
||||
while (GetQueue((int)writetime, ref q))
|
||||
{
|
||||
WriteProcess(q.addr, q.data);
|
||||
}
|
||||
|
||||
while (GetExQueue((int)writetime, ref q))
|
||||
{
|
||||
WriteExProcess(q.addr, q.data);
|
||||
}
|
||||
|
||||
// 0-4:internal 5-7:VRC6 8:VRC7 9:FDS 10-12:MMC5 13-20:N106 21-23:FME7
|
||||
output = 0;
|
||||
output += @internal.Process(0) * vol[0];
|
||||
output += @internal.Process(1) * vol[1];
|
||||
output += @internal.Process(2) * vol[2];
|
||||
output += @internal.Process(3) * vol[3];
|
||||
output += @internal.Process(4) * vol[4];
|
||||
|
||||
if ((exsound_select & 0x01) != 0)
|
||||
{
|
||||
output += vrc6.Process(0) * vol[5];
|
||||
output += vrc6.Process(1) * vol[6];
|
||||
output += vrc6.Process(2) * vol[7];
|
||||
}
|
||||
if ((exsound_select & 0x02) != 0)
|
||||
{
|
||||
output += vrc7.Process(0) * vol[8];
|
||||
}
|
||||
if ((exsound_select & 0x04) != 0)
|
||||
{
|
||||
output += fds.Process(0) * vol[9];
|
||||
}
|
||||
if ((exsound_select & 0x08) != 0)
|
||||
{
|
||||
output += mmc5.Process(0) * vol[10];
|
||||
output += mmc5.Process(1) * vol[11];
|
||||
output += mmc5.Process(2) * vol[12];
|
||||
}
|
||||
if ((exsound_select & 0x10) != 0)
|
||||
{
|
||||
output += n106.Process(0) * vol[13];
|
||||
output += n106.Process(1) * vol[14];
|
||||
output += n106.Process(2) * vol[15];
|
||||
output += n106.Process(3) * vol[16];
|
||||
output += n106.Process(4) * vol[17];
|
||||
output += n106.Process(5) * vol[18];
|
||||
output += n106.Process(6) * vol[19];
|
||||
output += n106.Process(7) * vol[20];
|
||||
}
|
||||
if ((exsound_select & 0x20) != 0)
|
||||
{
|
||||
fme7.Process(3); // Envelope & Noise
|
||||
output += fme7.Process(0) * vol[21];
|
||||
output += fme7.Process(1) * vol[22];
|
||||
output += fme7.Process(2) * vol[23];
|
||||
}
|
||||
|
||||
output >>= 8;
|
||||
|
||||
if (nFilterType == 1)
|
||||
{
|
||||
//ローパスフィルターTYPE 1(Simple)
|
||||
output = (lowpass_filter[0] + output) / 2;
|
||||
lowpass_filter[0] = output;
|
||||
}
|
||||
else if (nFilterType == 2)
|
||||
{
|
||||
//ローパスフィルターTYPE 2(Weighted type 1)
|
||||
output = (lowpass_filter[1] + lowpass_filter[0] + output) / 3;
|
||||
lowpass_filter[1] = lowpass_filter[0];
|
||||
lowpass_filter[0] = output;
|
||||
}
|
||||
else if (nFilterType == 3)
|
||||
{
|
||||
//ローパスフィルターTYPE 3(Weighted type 2)
|
||||
output = (lowpass_filter[2] + lowpass_filter[1] + lowpass_filter[0] + output) / 4;
|
||||
lowpass_filter[2] = lowpass_filter[1];
|
||||
lowpass_filter[1] = lowpass_filter[0];
|
||||
lowpass_filter[0] = output;
|
||||
}
|
||||
else if (nFilterType == 4)
|
||||
{
|
||||
//ローパスフィルターTYPE 4(Weighted type 3)
|
||||
output = (lowpass_filter[1] + lowpass_filter[0] * 2 + output) / 4;
|
||||
lowpass_filter[1] = lowpass_filter[0];
|
||||
lowpass_filter[0] = output;
|
||||
}
|
||||
// DC成分のカット(HPF TEST)
|
||||
{
|
||||
// static double cutoff = (2.0*3.141592653579*40.0/44100.0);
|
||||
double cutoff = cutofftemp / Supporter.Config.sound.nRate;
|
||||
double @in, @out;
|
||||
|
||||
@in = output;
|
||||
@out = (@in - tmp);
|
||||
tmp = tmp + cutoff * @out;
|
||||
|
||||
output = (int)@out;
|
||||
}
|
||||
|
||||
// Limit
|
||||
if (output > 0x7FFF)
|
||||
{
|
||||
output = 0x7FFF;
|
||||
}
|
||||
else if (output < -0x8000)
|
||||
{
|
||||
output = -0x8000;
|
||||
}
|
||||
|
||||
if (nBits != 8)
|
||||
{
|
||||
byte highByte = (byte)(output >> 8); // 获取高8位
|
||||
byte lowByte = (byte)(output & 0xFF); // 获取低8位
|
||||
lpBuffer.WriteByte(highByte);
|
||||
lpBuffer.WriteByte(lowByte);
|
||||
}
|
||||
else
|
||||
{
|
||||
lpBuffer.WriteByte((byte)((output >> 8) ^ 0x80));
|
||||
}
|
||||
|
||||
if (nCcount < 0x0100)
|
||||
pSoundBuf[nCcount++] = (short)output;
|
||||
|
||||
// elapsedtime += cycle_rate;
|
||||
elapsed_time += cycle_rate;
|
||||
}
|
||||
|
||||
|
||||
if (elapsed_time > ((nes.nescfg.FrameCycles / 24) + nes.cpu.GetTotalCycles()))
|
||||
{
|
||||
elapsed_time = nes.cpu.GetTotalCycles();
|
||||
}
|
||||
if ((elapsed_time + (nes.nescfg.FrameCycles / 6)) < nes.cpu.GetTotalCycles())
|
||||
{
|
||||
elapsed_time = nes.cpu.GetTotalCycles();
|
||||
}
|
||||
}
|
||||
|
||||
private bool GetExQueue(int writetime, ref QUEUEDATA ret)
|
||||
{
|
||||
if (exqueue.wrptr == exqueue.rdptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (exqueue.data[exqueue.rdptr].time <= writetime)
|
||||
{
|
||||
ret = exqueue.data[exqueue.rdptr];
|
||||
exqueue.rdptr++;
|
||||
exqueue.rdptr = (int)(exqueue.rdptr & (QUEUE_LENGTH - 1));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void QueueFlush()
|
||||
{
|
||||
while (queue.wrptr != queue.rdptr)
|
||||
{
|
||||
WriteProcess(queue.data[queue.rdptr].addr, queue.data[queue.rdptr].data);
|
||||
queue.rdptr++;
|
||||
queue.rdptr = (int)(queue.rdptr & (QUEUE_LENGTH - 1));
|
||||
}
|
||||
|
||||
while (exqueue.wrptr != exqueue.rdptr)
|
||||
{
|
||||
WriteExProcess(exqueue.data[exqueue.rdptr].addr, exqueue.data[exqueue.rdptr].data);
|
||||
exqueue.rdptr++;
|
||||
exqueue.rdptr = (int)(exqueue.rdptr & (QUEUE_LENGTH - 1));
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteExProcess(ushort addr, byte data)
|
||||
{
|
||||
if ((exsound_select & 0x01) != 0)
|
||||
{
|
||||
vrc6.Write(addr, data);
|
||||
}
|
||||
if ((exsound_select & 0x02) != 0)
|
||||
{
|
||||
vrc7.Write(addr, data);
|
||||
}
|
||||
if ((exsound_select & 0x04) != 0)
|
||||
{
|
||||
fds.Write(addr, data);
|
||||
}
|
||||
if ((exsound_select & 0x08) != 0)
|
||||
{
|
||||
mmc5.Write(addr, data);
|
||||
}
|
||||
if ((exsound_select & 0x10) != 0)
|
||||
{
|
||||
if (addr == 0x0000)
|
||||
{
|
||||
byte dummy = n106.Read(addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
n106.Write(addr, data);
|
||||
}
|
||||
}
|
||||
if ((exsound_select & 0x20) != 0)
|
||||
{
|
||||
fme7.Write(addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteProcess(ushort addr, byte data)
|
||||
{
|
||||
// $4018はVirtuaNES固有ポート
|
||||
if (addr >= 0x4000 && addr <= 0x401F)
|
||||
{
|
||||
@internal.Write(addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
internal void SyncDPCM(int cycles)
|
||||
{
|
||||
@internal.Sync(cycles);
|
||||
}
|
||||
|
||||
internal byte Read(ushort addr)
|
||||
{
|
||||
return @internal.SyncRead(addr);
|
||||
}
|
||||
|
||||
internal void Write(ushort addr, byte data)
|
||||
{
|
||||
// $4018偼VirtuaNES屌桳億乕僩
|
||||
if (addr >= 0x4000 && addr <= 0x401F)
|
||||
{
|
||||
@internal.SyncWrite(addr, data);
|
||||
SetQueue(nes.cpu.GetTotalCycles(), addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetQueue(int writetime, ushort addr, byte data)
|
||||
{
|
||||
queue.data[queue.wrptr].time = writetime;
|
||||
queue.data[queue.wrptr].addr = addr;
|
||||
queue.data[queue.wrptr].data = data;
|
||||
queue.wrptr++;
|
||||
|
||||
var newwrptr = (int)(queue.wrptr & (QUEUE_LENGTH - 1));
|
||||
queue.wrptr = newwrptr;
|
||||
|
||||
if (queue.wrptr == queue.rdptr)
|
||||
{
|
||||
Debuger.LogError("queue overflow.");
|
||||
}
|
||||
}
|
||||
|
||||
private bool GetQueue(int writetime, ref QUEUEDATA ret)
|
||||
{
|
||||
if (queue.wrptr == queue.rdptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (queue.data[queue.rdptr].time <= writetime)
|
||||
{
|
||||
ret = queue.data[queue.rdptr];
|
||||
queue.rdptr++;
|
||||
var newrdptr = (int)(queue.rdptr & (QUEUE_LENGTH - 1));
|
||||
queue.rdptr = newrdptr;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void SoundSetup()
|
||||
{
|
||||
float fClock = nes.nescfg.CpuClock;
|
||||
int nRate = Supporter.Config.sound.nRate;
|
||||
|
||||
@internal.Setup(fClock, nRate);
|
||||
vrc6.Setup(fClock, nRate);
|
||||
vrc7.Setup(fClock, nRate);
|
||||
mmc5.Setup(fClock, nRate);
|
||||
fds.Setup(fClock, nRate);
|
||||
n106.Setup(fClock, nRate);
|
||||
fme7.Setup(fClock, nRate);
|
||||
}
|
||||
|
||||
internal void SelectExSound(byte data)
|
||||
{
|
||||
exsound_select = data;
|
||||
}
|
||||
|
||||
internal void Reset()
|
||||
{
|
||||
queue = new QUEUE();
|
||||
exqueue = new QUEUE();
|
||||
|
||||
elapsed_time = 0;
|
||||
|
||||
float fClock = nes.nescfg.CpuClock;
|
||||
int nRate = Supporter.Config.sound.nRate;
|
||||
|
||||
@internal.Reset(fClock, nRate);
|
||||
vrc6.Reset(fClock, nRate);
|
||||
vrc7.Reset(fClock, nRate);
|
||||
mmc5.Reset(fClock, nRate);
|
||||
fds.Reset(fClock, nRate);
|
||||
n106.Reset(fClock, nRate);
|
||||
fme7.Reset(fClock, nRate);
|
||||
|
||||
SoundSetup();
|
||||
}
|
||||
|
||||
internal void ExWrite(ushort addr, byte data)
|
||||
{
|
||||
SetExQueue(nes.cpu.GetTotalCycles(), addr, data);
|
||||
|
||||
if ((exsound_select & 0x04) != 0)
|
||||
{
|
||||
if (addr >= 0x4040 && addr < 0x4100)
|
||||
{
|
||||
fds.SyncWrite(addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
if ((exsound_select & 0x08) != 0)
|
||||
{
|
||||
if (addr >= 0x5000 && addr <= 0x5015)
|
||||
{
|
||||
mmc5.SyncWrite(addr, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SetExQueue(int writetime, ushort addr, byte data)
|
||||
{
|
||||
exqueue.data[exqueue.wrptr].time = writetime;
|
||||
exqueue.data[exqueue.wrptr].addr = addr;
|
||||
exqueue.data[exqueue.wrptr].data = data;
|
||||
exqueue.wrptr++;
|
||||
var temp = QUEUE_LENGTH - 1;
|
||||
exqueue.wrptr = (int)(exqueue.wrptr & temp);
|
||||
if (exqueue.wrptr == exqueue.rdptr)
|
||||
{
|
||||
Debuger.LogError("exqueue overflow.");
|
||||
}
|
||||
}
|
||||
|
||||
internal byte ExRead(ushort addr)
|
||||
{
|
||||
byte data = 0;
|
||||
|
||||
if ((exsound_select & 0x10) != 0)
|
||||
{
|
||||
if (addr == 0x4800)
|
||||
{
|
||||
SetExQueue(nes.cpu.GetTotalCycles(), 0, 0);
|
||||
}
|
||||
}
|
||||
if ((exsound_select & 0x04) != 0)
|
||||
{
|
||||
if (addr >= 0x4040 && addr < 0x4100)
|
||||
{
|
||||
data = fds.SyncRead(addr);
|
||||
}
|
||||
}
|
||||
if ((exsound_select & 0x08) != 0)
|
||||
{
|
||||
if (addr >= 0x5000 && addr <= 0x5015)
|
||||
{
|
||||
data = mmc5.SyncRead(addr);
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
public struct QUEUEDATA
|
||||
{
|
||||
public int time;
|
||||
public ushort addr;
|
||||
public byte data;
|
||||
public byte reserved;
|
||||
}
|
||||
|
||||
public class QUEUE
|
||||
{
|
||||
public int rdptr;
|
||||
public int wrptr;
|
||||
public QUEUEDATA[] data = new QUEUEDATA[8192];
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cb5a8e579d35b9a4ca7966225235265a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e6179c4bc7e6fa744901b21b63e98aba
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,472 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class APU_FDS : APU_INTERFACE
|
||||
{
|
||||
FDSSOUND fds = new FDSSOUND();
|
||||
FDSSOUND fds_sync = new FDSSOUND();
|
||||
int[] output_buf = new int[8];
|
||||
int sampling_rate;
|
||||
|
||||
public APU_FDS()
|
||||
{
|
||||
fds.ZeroMemory();
|
||||
fds_sync.ZeroMemory();
|
||||
|
||||
Array.Clear(output_buf, 0, output_buf.Length);
|
||||
|
||||
sampling_rate = 22050;
|
||||
}
|
||||
|
||||
public override void Reset(float fClock, int nRate)
|
||||
{
|
||||
fds.ZeroMemory();
|
||||
fds_sync.ZeroMemory();
|
||||
|
||||
sampling_rate = 22050;
|
||||
}
|
||||
|
||||
public override void Setup(float fClock, int nRate)
|
||||
{
|
||||
sampling_rate = nRate;
|
||||
}
|
||||
|
||||
int[] tbl_writesub = { 30, 20, 15, 12 };
|
||||
|
||||
private void WriteSub(ushort addr, byte data, FDSSOUND ch, double rate)
|
||||
{
|
||||
if (addr < 0x4040 || addr > 0x40BF)
|
||||
return;
|
||||
|
||||
ch.reg[addr - 0x4040] = data;
|
||||
if (addr >= 0x4040 && addr <= 0x407F)
|
||||
{
|
||||
if (ch.wave_setup != 0)
|
||||
{
|
||||
ch.main_wavetable[addr - 0x4040] = 0x20 - (data & 0x3F);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x4080: // Volume Envelope
|
||||
ch.volenv_mode = (byte)(data >> 6);
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
ch.volenv_gain = (byte)(data & 0x3F);
|
||||
|
||||
// 即時反映
|
||||
if (ch.main_addr == 0)
|
||||
{
|
||||
ch.now_volume = (ch.volenv_gain < 0x21) ? ch.volenv_gain : 0x20;
|
||||
}
|
||||
}
|
||||
// エンベロープ1段階の演算
|
||||
ch.volenv_decay = (byte)(data & 0x3F);
|
||||
ch.volenv_phaseacc = (double)ch.envelope_speed * (double)(ch.volenv_decay + 1) * rate / (232.0 * 960.0);
|
||||
break;
|
||||
|
||||
case 0x4082: // Main Frequency(Low)
|
||||
ch.main_frequency = (ch.main_frequency & ~0x00FF) | data;
|
||||
break;
|
||||
case 0x4083: // Main Frequency(High)
|
||||
ch.main_enable = (byte)((~data) & (1 << 7));
|
||||
ch.envelope_enable = (byte)((~data) & (1 << 6));
|
||||
if (ch.main_enable == 0)
|
||||
{
|
||||
ch.main_addr = 0;
|
||||
ch.now_volume = (ch.volenv_gain < 0x21) ? ch.volenv_gain : 0x20;
|
||||
}
|
||||
// ch.main_frequency = (ch.main_frequency&0x00FF)|(((INT)data&0x3F)<<8);
|
||||
ch.main_frequency = (ch.main_frequency & 0x00FF) | ((data & 0x0F) << 8);
|
||||
break;
|
||||
|
||||
case 0x4084: // Sweep Envelope
|
||||
ch.swpenv_mode = (byte)(data >> 6);
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
ch.swpenv_gain = (byte)(data & 0x3F);
|
||||
}
|
||||
// エンベロープ1段階の演算
|
||||
ch.swpenv_decay = (byte)(data & 0x3F);
|
||||
ch.swpenv_phaseacc = (double)ch.envelope_speed * (double)(ch.swpenv_decay + 1) * rate / (232.0 * 960.0);
|
||||
break;
|
||||
|
||||
case 0x4085: // Sweep Bias
|
||||
if ((data & 0x40) != 0) ch.sweep_bias = (data & 0x3f) - 0x40;
|
||||
else ch.sweep_bias = data & 0x3f;
|
||||
ch.lfo_addr = 0;
|
||||
break;
|
||||
|
||||
case 0x4086: // Effector(LFO) Frequency(Low)
|
||||
ch.lfo_frequency = (ch.lfo_frequency & (~0x00FF)) | data;
|
||||
break;
|
||||
case 0x4087: // Effector(LFO) Frequency(High)
|
||||
ch.lfo_enable = (byte)((~data & 0x80));
|
||||
ch.lfo_frequency = (ch.lfo_frequency & 0x00FF) | ((data & 0x0F) << 8);
|
||||
break;
|
||||
|
||||
case 0x4088: // Effector(LFO) wavetable
|
||||
if (ch.lfo_enable == 0)
|
||||
{
|
||||
// FIFO?
|
||||
for (byte i = 0; i < 31; i++)
|
||||
{
|
||||
ch.lfo_wavetable[i * 2 + 0] = ch.lfo_wavetable[(i + 1) * 2 + 0];
|
||||
ch.lfo_wavetable[i * 2 + 1] = ch.lfo_wavetable[(i + 1) * 2 + 1];
|
||||
}
|
||||
ch.lfo_wavetable[31 * 2 + 0] = (byte)(data & 0x07);
|
||||
ch.lfo_wavetable[31 * 2 + 1] = (byte)(data & 0x07);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x4089: // Sound control
|
||||
{
|
||||
ch.master_volume = tbl_writesub[data & 3];
|
||||
ch.wave_setup = (byte)(data & 0x80);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x408A: // Sound control 2
|
||||
ch.envelope_speed = data;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
WriteSub(addr, data, fds, sampling_rate);
|
||||
}
|
||||
|
||||
public override byte Read(ushort addr)
|
||||
{
|
||||
byte data = (byte)(addr >> 8);
|
||||
|
||||
if (addr >= 0x4040 && addr <= 0x407F)
|
||||
{
|
||||
data = (byte)(fds.main_wavetable[addr & 0x3F] | 0x40);
|
||||
}
|
||||
else
|
||||
if (addr == 0x4090)
|
||||
{
|
||||
data = (byte)((fds.volenv_gain & 0x3F) | 0x40);
|
||||
}
|
||||
else
|
||||
if (addr == 0x4092)
|
||||
{
|
||||
data = (byte)((fds.swpenv_gain & 0x3F) | 0x40);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
int[] tbl_process = { 0, 1, 2, 4, 0, -4, -2, -1 };
|
||||
public override int Process(int channel)
|
||||
{
|
||||
// Envelope unit
|
||||
if (fds.envelope_enable != 0 && fds.envelope_speed != 0)
|
||||
{
|
||||
// Volume envelope
|
||||
if (fds.volenv_mode < 2)
|
||||
{
|
||||
double decay = ((double)fds.envelope_speed * (double)(fds.volenv_decay + 1) * (double)sampling_rate) / (232.0 * 960.0);
|
||||
fds.volenv_phaseacc -= 1.0;
|
||||
while (fds.volenv_phaseacc < 0.0)
|
||||
{
|
||||
fds.volenv_phaseacc += decay;
|
||||
|
||||
if (fds.volenv_mode == 0)
|
||||
{
|
||||
// 減少モード
|
||||
if (fds.volenv_gain != 0)
|
||||
fds.volenv_gain--;
|
||||
}
|
||||
else
|
||||
if (fds.volenv_mode == 1)
|
||||
{
|
||||
if (fds.volenv_gain < 0x20)
|
||||
fds.volenv_gain++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sweep envelope
|
||||
if (fds.swpenv_mode < 2)
|
||||
{
|
||||
double decay = ((double)fds.envelope_speed * (double)(fds.swpenv_decay + 1) * (double)sampling_rate) / (232.0 * 960.0);
|
||||
fds.swpenv_phaseacc -= 1.0;
|
||||
while (fds.swpenv_phaseacc < 0.0)
|
||||
{
|
||||
fds.swpenv_phaseacc += decay;
|
||||
|
||||
if (fds.swpenv_mode == 0)
|
||||
{
|
||||
// 減少モード
|
||||
if (fds.swpenv_gain != 0)
|
||||
fds.swpenv_gain--;
|
||||
}
|
||||
else
|
||||
if (fds.swpenv_mode == 1)
|
||||
{
|
||||
if (fds.swpenv_gain < 0x20)
|
||||
fds.swpenv_gain++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Effector(LFO) unit
|
||||
int sub_freq = 0;
|
||||
// if( fds.lfo_enable && fds.envelope_speed && fds.lfo_frequency ) {
|
||||
if (fds.lfo_enable != 0)
|
||||
{
|
||||
if (fds.lfo_frequency != 0)
|
||||
{
|
||||
fds.lfo_phaseacc -= (1789772.5 * (double)fds.lfo_frequency) / 65536.0;
|
||||
while (fds.lfo_phaseacc < 0.0)
|
||||
{
|
||||
fds.lfo_phaseacc += (double)sampling_rate;
|
||||
|
||||
if (fds.lfo_wavetable[fds.lfo_addr] == 4)
|
||||
fds.sweep_bias = 0;
|
||||
else
|
||||
fds.sweep_bias += tbl_process[fds.lfo_wavetable[fds.lfo_addr]];
|
||||
|
||||
fds.lfo_addr = (fds.lfo_addr + 1) & 63;
|
||||
}
|
||||
}
|
||||
|
||||
if (fds.sweep_bias > 63)
|
||||
fds.sweep_bias -= 128;
|
||||
else if (fds.sweep_bias < -64)
|
||||
fds.sweep_bias += 128;
|
||||
|
||||
int sub_multi = fds.sweep_bias * fds.swpenv_gain;
|
||||
|
||||
if ((sub_multi & 0x0F) != 0)
|
||||
{
|
||||
// 16で割り切れない場合
|
||||
sub_multi = (sub_multi / 16);
|
||||
if (fds.sweep_bias >= 0)
|
||||
sub_multi += 2; // 正の場合
|
||||
else
|
||||
sub_multi -= 1; // 負の場合
|
||||
}
|
||||
else
|
||||
{
|
||||
// 16で割り切れる場合
|
||||
sub_multi = (sub_multi / 16);
|
||||
}
|
||||
// 193を超えると-258する(-64へラップ)
|
||||
if (sub_multi > 193)
|
||||
sub_multi -= 258;
|
||||
// -64を下回ると+256する(192へラップ)
|
||||
if (sub_multi < -64)
|
||||
sub_multi += 256;
|
||||
|
||||
sub_freq = (fds.main_frequency) * sub_multi / 64;
|
||||
}
|
||||
|
||||
// Main unit
|
||||
int output = 0;
|
||||
if (fds.main_enable != 0 && fds.main_frequency != 0 && fds.wave_setup == 0)
|
||||
{
|
||||
int freq;
|
||||
int main_addr_old = fds.main_addr;
|
||||
|
||||
freq = (int)((fds.main_frequency + sub_freq) * 1789772.5 / 65536.0);
|
||||
|
||||
fds.main_addr = (fds.main_addr + freq + 64 * sampling_rate) % (64 * sampling_rate);
|
||||
|
||||
// 1周期を超えたらボリューム更新
|
||||
if (main_addr_old > fds.main_addr)
|
||||
fds.now_volume = (fds.volenv_gain < 0x21) ? fds.volenv_gain : 0x20;
|
||||
|
||||
output = fds.main_wavetable[(fds.main_addr / sampling_rate) & 0x3f] * 8 * fds.now_volume * fds.master_volume / 30;
|
||||
|
||||
if (fds.now_volume != 0)
|
||||
fds.now_freq = freq * 4;
|
||||
else
|
||||
fds.now_freq = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
fds.now_freq = 0;
|
||||
output = 0;
|
||||
}
|
||||
|
||||
// LPF
|
||||
output = (output_buf[0] * 2 + output) / 3;
|
||||
output_buf[0] = output;
|
||||
|
||||
fds.output = output;
|
||||
return fds.output;
|
||||
}
|
||||
|
||||
internal void SyncWrite(ushort addr, byte data)
|
||||
{
|
||||
WriteSub(addr, data, fds_sync, 1789772.5d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
internal byte SyncRead(ushort addr)
|
||||
{
|
||||
byte data = (byte)(addr >> 8);
|
||||
|
||||
if (addr >= 0x4040 && addr <= 0x407F)
|
||||
{
|
||||
data = (byte)(fds_sync.main_wavetable[addr & 0x3F] | 0x40);
|
||||
}
|
||||
else
|
||||
if (addr == 0x4090)
|
||||
{
|
||||
data = (byte)((fds_sync.volenv_gain & 0x3F) | 0x40);
|
||||
}
|
||||
else
|
||||
if (addr == 0x4092)
|
||||
{
|
||||
data = (byte)((fds_sync.swpenv_gain & 0x3F) | 0x40);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public override bool Sync(int cycles)
|
||||
{
|
||||
// Envelope unit
|
||||
if (fds_sync.envelope_enable != 0 && fds_sync.envelope_speed != 0)
|
||||
{
|
||||
// Volume envelope
|
||||
double decay;
|
||||
if (fds_sync.volenv_mode < 2)
|
||||
{
|
||||
decay = ((double)fds_sync.envelope_speed * (double)(fds_sync.volenv_decay + 1) * 1789772.5) / (232.0 * 960.0);
|
||||
fds_sync.volenv_phaseacc -= (double)cycles;
|
||||
while (fds_sync.volenv_phaseacc < 0.0)
|
||||
{
|
||||
fds_sync.volenv_phaseacc += decay;
|
||||
|
||||
if (fds_sync.volenv_mode == 0)
|
||||
{
|
||||
// 減少モード
|
||||
if (fds_sync.volenv_gain != 0)
|
||||
fds_sync.volenv_gain--;
|
||||
}
|
||||
else
|
||||
if (fds_sync.volenv_mode == 1)
|
||||
{
|
||||
// 増加モード
|
||||
if (fds_sync.volenv_gain < 0x20)
|
||||
fds_sync.volenv_gain++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sweep envelope
|
||||
if (fds_sync.swpenv_mode < 2)
|
||||
{
|
||||
decay = ((double)fds_sync.envelope_speed * (double)(fds_sync.swpenv_decay + 1) * 1789772.5) / (232.0 * 960.0);
|
||||
fds_sync.swpenv_phaseacc -= (double)cycles;
|
||||
while (fds_sync.swpenv_phaseacc < 0.0)
|
||||
{
|
||||
fds_sync.swpenv_phaseacc += decay;
|
||||
|
||||
if (fds_sync.swpenv_mode == 0)
|
||||
{
|
||||
// 減少モード
|
||||
if (fds_sync.swpenv_gain != 0)
|
||||
fds_sync.swpenv_gain--;
|
||||
}
|
||||
else
|
||||
if (fds_sync.swpenv_mode == 1)
|
||||
{
|
||||
// 増加モード
|
||||
if (fds_sync.swpenv_gain < 0x20)
|
||||
fds_sync.swpenv_gain++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override int GetFreq(int channel)
|
||||
{
|
||||
return fds.now_freq;
|
||||
}
|
||||
|
||||
private class FDSSOUND
|
||||
{
|
||||
public byte[] reg = new byte[0x80];
|
||||
public byte volenv_mode; // Volume Envelope
|
||||
public byte volenv_gain;
|
||||
public byte volenv_decay;
|
||||
public double volenv_phaseacc;
|
||||
public byte swpenv_mode; // Sweep Envelope
|
||||
public byte swpenv_gain;
|
||||
public byte swpenv_decay;
|
||||
public double swpenv_phaseacc;
|
||||
// For envelope unit
|
||||
public byte envelope_enable; // $4083 bit6
|
||||
public byte envelope_speed; // $408A
|
||||
// For $4089
|
||||
public byte wave_setup; // bit7
|
||||
public int master_volume; // bit1-0
|
||||
// For Main unit
|
||||
public int[] main_wavetable = new int[64];
|
||||
public byte main_enable;
|
||||
public int main_frequency;
|
||||
public int main_addr;
|
||||
// For Effector(LFO) unit
|
||||
public byte[] lfo_wavetable = new byte[64];
|
||||
public byte lfo_enable; // 0:Enable 1:Wavetable setup
|
||||
public int lfo_frequency;
|
||||
public int lfo_addr;
|
||||
public double lfo_phaseacc;
|
||||
// For Sweep unit
|
||||
public int sweep_bias;
|
||||
// Misc
|
||||
public int now_volume;
|
||||
public int now_freq;
|
||||
public int output;
|
||||
|
||||
public void ZeroMemory()
|
||||
{
|
||||
Array.Clear(reg, 0, reg.Length);
|
||||
volenv_mode = 0;
|
||||
volenv_gain = 0;
|
||||
volenv_decay = 0;
|
||||
volenv_phaseacc = 0.0;
|
||||
swpenv_mode = 0;
|
||||
swpenv_gain = 0;
|
||||
swpenv_decay = 0;
|
||||
swpenv_phaseacc = 0.0;
|
||||
envelope_enable = 0;
|
||||
envelope_speed = 0;
|
||||
wave_setup = 0;
|
||||
master_volume = 0;
|
||||
Array.Clear(main_wavetable, 0, main_wavetable.Length);
|
||||
main_enable = 0;
|
||||
main_frequency = 0;
|
||||
main_addr = 0;
|
||||
Array.Clear(lfo_wavetable, 0, lfo_wavetable.Length);
|
||||
lfo_enable = 0;
|
||||
lfo_frequency = 0;
|
||||
lfo_addr = 0;
|
||||
lfo_phaseacc = 0.0;
|
||||
sweep_bias = 0;
|
||||
now_volume = 0;
|
||||
now_freq = 0;
|
||||
output = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5e16912525198924a860e53ab4ef0c81
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,28 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class APU_FME7 : APU_INTERFACE
|
||||
{
|
||||
public override void Reset(float fClock, int nRate)
|
||||
{
|
||||
//todo : 实现
|
||||
}
|
||||
|
||||
public override void Setup(float fClock, int nRate)
|
||||
{
|
||||
//todo : 实现
|
||||
}
|
||||
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
//todo : 实现
|
||||
}
|
||||
|
||||
public override int Process(int channel)
|
||||
{
|
||||
//todo : 实现
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 03e0258857a7134438a497aec27ea607
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,36 +0,0 @@
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public abstract class APU_INTERFACE
|
||||
{
|
||||
public const float APU_CLOCK = 1789772.5f;
|
||||
|
||||
public virtual void Dispose() { }
|
||||
|
||||
public abstract void Reset(float fClock, int nRate);
|
||||
public abstract void Setup(float fClock, int nRate);
|
||||
public abstract void Write(ushort addr, byte data);
|
||||
public abstract int Process(int channel);
|
||||
public virtual byte Read(ushort addr)
|
||||
{
|
||||
return (byte)(addr >> 8);
|
||||
}
|
||||
public virtual void WriteSync(ushort addr, byte data) { }
|
||||
public virtual byte ReadSync(ushort addr) { return 0; }
|
||||
public virtual void VSync() { }
|
||||
public virtual bool Sync(int cycles) { return false; }
|
||||
public virtual int GetFreq(int channel) { return 0; }
|
||||
public virtual int GetStateSize() { return 0; }
|
||||
public virtual void SaveState(byte[] p) { }
|
||||
public virtual void LoadState(byte[] p) { }
|
||||
|
||||
public static int INT2FIX(int x)
|
||||
{
|
||||
return x << 16;
|
||||
}
|
||||
|
||||
public static int FIX2INT(int x)
|
||||
{
|
||||
return x >> 16;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cc44be42b66d6ac4aade437e81960274
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d5f443ad7d5ef1d4394c7fe540f2e3e4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,415 +0,0 @@
|
||||
//using Codice.CM.Client.Differences;
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class APU_MMC5 : APU_INTERFACE
|
||||
{
|
||||
public const int RECTANGLE_VOL_SHIFT = 8;
|
||||
public const int DAOUT_VOL_SHIFT = 6;
|
||||
|
||||
SYNCRECTANGLE sch0 = new SYNCRECTANGLE();
|
||||
SYNCRECTANGLE sch1 = new SYNCRECTANGLE();
|
||||
RECTANGLE ch0 = new RECTANGLE();
|
||||
RECTANGLE ch1 = new RECTANGLE();
|
||||
|
||||
byte reg5010;
|
||||
byte reg5011;
|
||||
byte reg5015;
|
||||
byte sync_reg5015;
|
||||
int FrameCycle;
|
||||
float cpu_clock;
|
||||
int cycle_rate;
|
||||
|
||||
// Tables
|
||||
static int[] vbl_length = new int[32];
|
||||
static int[] duty_lut = new int[4];
|
||||
|
||||
static int[] decay_lut = new int[16];
|
||||
static int[] vbl_lut = new int[32];
|
||||
|
||||
public APU_MMC5()
|
||||
{
|
||||
// 仮設定
|
||||
Reset(APU_INTERFACE.APU_CLOCK, 22050);
|
||||
}
|
||||
|
||||
public override void Reset(float fClock, int nRate)
|
||||
{
|
||||
sch0.ZeroMemory();
|
||||
sch1.ZeroMemory();
|
||||
|
||||
reg5010 = reg5011 = reg5015 = 0;
|
||||
|
||||
sync_reg5015 = 0;
|
||||
FrameCycle = 0;
|
||||
|
||||
Setup(fClock, nRate);
|
||||
|
||||
for (ushort addr = 0x5000; addr <= 0x5015; addr++)
|
||||
{
|
||||
Write(addr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Setup(float fClock, int nRate)
|
||||
{
|
||||
cpu_clock = fClock;
|
||||
cycle_rate = (int)(fClock * 65536.0f / nRate);
|
||||
|
||||
// Create Tables
|
||||
int i;
|
||||
int samples = (int)(nRate / 60.0f);
|
||||
for (i = 0; i < 16; i++)
|
||||
decay_lut[i] = (i + 1) * samples * 5;
|
||||
for (i = 0; i < 32; i++)
|
||||
vbl_lut[i] = vbl_length[i] * samples * 5;
|
||||
}
|
||||
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
// MMC5 CH0 rectangle
|
||||
case 0x5000:
|
||||
ch0.reg[0] = data;
|
||||
ch0.volume = (byte)(data & 0x0F);
|
||||
ch0.holdnote = (byte)(data & 0x20);
|
||||
ch0.fixed_envelope = (byte)(data & 0x10);
|
||||
ch0.env_decay = decay_lut[data & 0x0F];
|
||||
ch0.duty_flip = duty_lut[data >> 6];
|
||||
break;
|
||||
case 0x5001:
|
||||
ch0.reg[1] = data;
|
||||
break;
|
||||
case 0x5002:
|
||||
ch0.reg[2] = data;
|
||||
ch0.freq = INT2FIX(((ch0.reg[3] & 0x07) << 8) + data + 1);
|
||||
break;
|
||||
case 0x5003:
|
||||
ch0.reg[3] = data;
|
||||
ch0.vbl_length = vbl_lut[data >> 3];
|
||||
ch0.env_vol = 0;
|
||||
ch0.freq = INT2FIX(((data & 0x07) << 8) + ch0.reg[2] + 1);
|
||||
if ((reg5015 & 0x01) != 0)
|
||||
ch0.enable = 0xFF;
|
||||
break;
|
||||
// MMC5 CH1 rectangle
|
||||
case 0x5004:
|
||||
ch1.reg[0] = data;
|
||||
ch1.volume = (byte)(data & 0x0F);
|
||||
ch1.holdnote = (byte)(data & 0x20);
|
||||
ch1.fixed_envelope = (byte)(data & 0x10);
|
||||
ch1.env_decay = decay_lut[data & 0x0F];
|
||||
ch1.duty_flip = duty_lut[data >> 6];
|
||||
break;
|
||||
case 0x5005:
|
||||
ch1.reg[1] = data;
|
||||
break;
|
||||
case 0x5006:
|
||||
ch1.reg[2] = data;
|
||||
ch1.freq = INT2FIX(((ch1.reg[3] & 0x07) << 8) + data + 1);
|
||||
break;
|
||||
case 0x5007:
|
||||
ch1.reg[3] = data;
|
||||
ch1.vbl_length = vbl_lut[data >> 3];
|
||||
ch1.env_vol = 0;
|
||||
ch1.freq = INT2FIX(((data & 0x07) << 8) + ch1.reg[2] + 1);
|
||||
if ((reg5015 & 0x02) != 0)
|
||||
ch1.enable = 0xFF;
|
||||
break;
|
||||
case 0x5010:
|
||||
reg5010 = data;
|
||||
break;
|
||||
case 0x5011:
|
||||
reg5011 = data;
|
||||
break;
|
||||
case 0x5012:
|
||||
case 0x5013:
|
||||
case 0x5014:
|
||||
break;
|
||||
case 0x5015:
|
||||
reg5015 = data;
|
||||
if ((reg5015 & 0x01) != 0)
|
||||
{
|
||||
ch0.enable = 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
ch0.enable = 0;
|
||||
ch0.vbl_length = 0;
|
||||
}
|
||||
if ((reg5015 & 0x02) != 0)
|
||||
{
|
||||
ch1.enable = 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
ch1.enable = 0;
|
||||
ch1.vbl_length = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
internal void SyncWrite(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
// MMC5 CH0 rectangle
|
||||
case 0x5000:
|
||||
sch0.reg[0] = data;
|
||||
sch0.holdnote = (byte)(data & 0x20);
|
||||
break;
|
||||
case 0x5001:
|
||||
case 0x5002:
|
||||
sch0.reg[addr & 3] = data;
|
||||
break;
|
||||
case 0x5003:
|
||||
sch0.reg[3] = data;
|
||||
sch0.vbl_length = vbl_length[data >> 3];
|
||||
if ((sync_reg5015 & 0x01) != 0)
|
||||
sch0.enable = 0xFF;
|
||||
break;
|
||||
// MMC5 CH1 rectangle
|
||||
case 0x5004:
|
||||
sch1.reg[0] = data;
|
||||
sch1.holdnote = (byte)(data & 0x20);
|
||||
break;
|
||||
case 0x5005:
|
||||
case 0x5006:
|
||||
sch1.reg[addr & 3] = data;
|
||||
break;
|
||||
case 0x5007:
|
||||
sch1.reg[3] = data;
|
||||
sch1.vbl_length = vbl_length[data >> 3];
|
||||
if ((sync_reg5015 & 0x02) != 0)
|
||||
sch1.enable = 0xFF;
|
||||
break;
|
||||
case 0x5010:
|
||||
case 0x5011:
|
||||
case 0x5012:
|
||||
case 0x5013:
|
||||
case 0x5014:
|
||||
break;
|
||||
case 0x5015:
|
||||
sync_reg5015 = data;
|
||||
if ((sync_reg5015 & 0x01) != 0)
|
||||
{
|
||||
sch0.enable = 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
sch0.enable = 0;
|
||||
sch0.vbl_length = 0;
|
||||
}
|
||||
if ((sync_reg5015 & 0x02) != 0)
|
||||
{
|
||||
sch1.enable = 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
sch1.enable = 0;
|
||||
sch1.vbl_length = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
internal byte SyncRead(ushort addr)
|
||||
{
|
||||
byte data = 0;
|
||||
|
||||
if (addr == 0x5015)
|
||||
{
|
||||
if ((sch0.enable != 0) && sch0.vbl_length > 0) data |= (1 << 0);
|
||||
if ((sch1.enable != 0) && sch1.vbl_length > 0) data |= (1 << 1);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public override bool Sync(int cycles)
|
||||
{
|
||||
FrameCycle += cycles;
|
||||
if (FrameCycle >= 7457 * 5 / 2)
|
||||
{
|
||||
FrameCycle -= 7457 * 5 / 2;
|
||||
|
||||
if (sch0.enable != 0 && sch0.holdnote == 0)
|
||||
{
|
||||
if ((sch0.vbl_length) != 0)
|
||||
{
|
||||
sch0.vbl_length--;
|
||||
}
|
||||
}
|
||||
if (sch1.enable != 0 && sch1.holdnote == 0)
|
||||
{
|
||||
if ((sch1.vbl_length) != 0)
|
||||
{
|
||||
sch1.vbl_length--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override int Process(int channel)
|
||||
{
|
||||
switch (channel)
|
||||
{
|
||||
case 0:
|
||||
return RectangleRender(ch0);
|
||||
case 1:
|
||||
return RectangleRender(ch1);
|
||||
case 2:
|
||||
return reg5011 << DAOUT_VOL_SHIFT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public override int GetFreq(int channel)
|
||||
{
|
||||
if (channel == 0 || channel == 1)
|
||||
{
|
||||
RECTANGLE ch = null;
|
||||
if (channel == 0) ch = ch0;
|
||||
else ch = ch1;
|
||||
|
||||
if (ch.enable == 0 || ch.vbl_length <= 0)
|
||||
return 0;
|
||||
if (ch.freq < INT2FIX(8))
|
||||
return 0;
|
||||
if (ch.fixed_envelope != 0)
|
||||
{
|
||||
if (ch.volume == 0)
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((0x0F - ch.env_vol) == 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (int)(256.0f * cpu_clock / (FIX2INT(ch.freq) * 16.0f));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int RectangleRender(RECTANGLE ch)
|
||||
{
|
||||
if (ch.enable == 0 || ch.vbl_length <= 0)
|
||||
return 0;
|
||||
|
||||
// vbl length counter
|
||||
if (ch.holdnote == 0)
|
||||
ch.vbl_length -= 5;
|
||||
|
||||
// envelope unit
|
||||
ch.env_phase -= 5 * 4;
|
||||
while (ch.env_phase < 0)
|
||||
{
|
||||
ch.env_phase += ch.env_decay;
|
||||
if ((ch.holdnote) != 0)
|
||||
ch.env_vol = (byte)((ch.env_vol + 1) & 0x0F);
|
||||
else if (ch.env_vol < 0x0F)
|
||||
ch.env_vol++;
|
||||
}
|
||||
|
||||
if (ch.freq < INT2FIX(8))
|
||||
return 0;
|
||||
|
||||
int volume;
|
||||
if ((ch.fixed_envelope) != 0)
|
||||
volume = ch.volume;
|
||||
else
|
||||
volume = (0x0F - ch.env_vol);
|
||||
|
||||
int output = volume << RECTANGLE_VOL_SHIFT;
|
||||
|
||||
ch.phaseacc -= cycle_rate;
|
||||
if (ch.phaseacc >= 0)
|
||||
{
|
||||
if (ch.adder < ch.duty_flip)
|
||||
ch.output_vol = output;
|
||||
else
|
||||
ch.output_vol = -output;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
if (ch.freq > cycle_rate)
|
||||
{
|
||||
ch.phaseacc += ch.freq;
|
||||
ch.adder = (ch.adder + 1) & 0x0F;
|
||||
if (ch.adder < ch.duty_flip)
|
||||
ch.output_vol = output;
|
||||
else
|
||||
ch.output_vol = -output;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 加重平均
|
||||
int num_times, total;
|
||||
num_times = total = 0;
|
||||
while (ch.phaseacc < 0)
|
||||
{
|
||||
ch.phaseacc += ch.freq;
|
||||
ch.adder = (ch.adder + 1) & 0x0F;
|
||||
if (ch.adder < ch.duty_flip)
|
||||
total += output;
|
||||
else
|
||||
total -= output;
|
||||
num_times++;
|
||||
}
|
||||
ch.output_vol = total / num_times;
|
||||
}
|
||||
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
public class SYNCRECTANGLE
|
||||
{
|
||||
// For sync
|
||||
public byte[] reg = new byte[4];
|
||||
public byte enable;
|
||||
public byte holdnote;
|
||||
public byte[] dummy = new byte[2];
|
||||
public int vbl_length;
|
||||
|
||||
public void ZeroMemory()
|
||||
{
|
||||
Array.Clear(reg, 0, reg.Length);
|
||||
enable = 0;
|
||||
holdnote = 0;
|
||||
Array.Clear(dummy, 0, dummy.Length);
|
||||
vbl_length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public class RECTANGLE
|
||||
{
|
||||
public byte[] reg = new byte[4];
|
||||
public byte enable;
|
||||
|
||||
public int vbl_length;
|
||||
|
||||
public int phaseacc;
|
||||
public int freq;
|
||||
|
||||
public int output_vol;
|
||||
public byte fixed_envelope;
|
||||
public byte holdnote;
|
||||
public byte volume;
|
||||
|
||||
public byte env_vol;
|
||||
public int env_phase;
|
||||
public int env_decay;
|
||||
|
||||
public int adder;
|
||||
public int duty_flip;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 15b983a12234c3c47baefb9fa2751351
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,245 +0,0 @@
|
||||
using RECTANGLE = VirtualNes.Core.APU_VRC6.RECTANGLE;
|
||||
using SAWTOOTH = VirtualNes.Core.APU_VRC6.SAWTOOTH;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class APU_N106 : APU_INTERFACE
|
||||
{
|
||||
RECTANGLE ch0 = new RECTANGLE();
|
||||
RECTANGLE ch1 = new RECTANGLE();
|
||||
SAWTOOTH ch2 = new SAWTOOTH();
|
||||
float cpu_clock;
|
||||
int cycle_rate;
|
||||
|
||||
public APU_N106()
|
||||
{
|
||||
Reset(APU_CLOCK, 22050);
|
||||
}
|
||||
|
||||
public override void Reset(float fClock, int nRate)
|
||||
{
|
||||
ch0.ZeroMemory();
|
||||
ch1.ZeroMemory();
|
||||
ch2.ZeroMemory();
|
||||
|
||||
Setup(fClock, nRate);
|
||||
}
|
||||
|
||||
public override void Setup(float fClock, int nRate)
|
||||
{
|
||||
cpu_clock = fClock;
|
||||
cycle_rate = (int)(fClock * 65536.0f / nRate);
|
||||
}
|
||||
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
// VRC6 CH0 rectangle
|
||||
case 0x9000:
|
||||
ch0.reg[0] = data;
|
||||
ch0.gate = (byte)(data & 0x80);
|
||||
ch0.volume = (byte)(data & 0x0F);
|
||||
ch0.duty_pos = (byte)((data >> 4) & 0x07);
|
||||
break;
|
||||
case 0x9001:
|
||||
ch0.reg[1] = data;
|
||||
ch0.freq = INT2FIX((((ch0.reg[2] & 0x0F) << 8) | data) + 1);
|
||||
break;
|
||||
case 0x9002:
|
||||
ch0.reg[2] = data;
|
||||
ch0.enable = (byte)(data & 0x80);
|
||||
ch0.freq = INT2FIX((((data & 0x0F) << 8) | ch0.reg[1]) + 1);
|
||||
break;
|
||||
// VRC6 CH1 rectangle
|
||||
case 0xA000:
|
||||
ch1.reg[0] = data;
|
||||
ch1.gate = (byte)(data & 0x80);
|
||||
ch1.volume = (byte)(data & 0x0F);
|
||||
ch1.duty_pos = (byte)((data >> 4) & 0x07);
|
||||
break;
|
||||
case 0xA001:
|
||||
ch1.reg[1] = data;
|
||||
ch1.freq = INT2FIX((((ch1.reg[2] & 0x0F) << 8) | data) + 1);
|
||||
break;
|
||||
case 0xA002:
|
||||
ch1.reg[2] = data;
|
||||
ch1.enable = (byte)(data & 0x80);
|
||||
ch1.freq = INT2FIX((((data & 0x0F) << 8) | ch1.reg[1]) + 1);
|
||||
break;
|
||||
// VRC6 CH2 sawtooth
|
||||
case 0xB000:
|
||||
ch2.reg[1] = data;
|
||||
ch2.phaseaccum = (byte)(data & 0x3F);
|
||||
break;
|
||||
case 0xB001:
|
||||
ch2.reg[1] = data;
|
||||
ch2.freq = INT2FIX((((ch2.reg[2] & 0x0F) << 8) | data) + 1);
|
||||
break;
|
||||
case 0xB002:
|
||||
ch2.reg[2] = data;
|
||||
ch2.enable = (byte)(data & 0x80);
|
||||
ch2.freq = INT2FIX((((data & 0x0F) << 8) | ch2.reg[1]) + 1);
|
||||
// ch2.adder = 0; // クリアするとノイズの原因になる
|
||||
// ch2.accum = 0; // クリアするとノイズの原因になる
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override int Process(int channel)
|
||||
{
|
||||
switch (channel)
|
||||
{
|
||||
case 0:
|
||||
return RectangleRender(ch0);
|
||||
case 1:
|
||||
return RectangleRender(ch1);
|
||||
case 2:
|
||||
return SawtoothRender(ch2);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public override int GetFreq(int channel)
|
||||
{
|
||||
if (channel == 0 || channel == 1)
|
||||
{
|
||||
RECTANGLE ch;
|
||||
if (channel == 0) ch = ch0;
|
||||
else ch = ch1;
|
||||
if (ch.enable == 0 || ch.gate != 0 || ch.volume == 0)
|
||||
return 0;
|
||||
if (ch.freq < INT2FIX(8))
|
||||
return 0;
|
||||
return (int)((256.0f * cpu_clock / (FIX2INT(ch.freq) * 16.0f)));
|
||||
}
|
||||
if (channel == 2)
|
||||
{
|
||||
SAWTOOTH ch = ch2;
|
||||
if (ch.enable == 0 || ch.phaseaccum == 0)
|
||||
return 0;
|
||||
if (ch.freq < INT2FIX(8))
|
||||
return 0;
|
||||
return (int)(256.0f * cpu_clock / (FIX2INT(ch.freq) * 14.0f));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RectangleRender(RECTANGLE ch)
|
||||
{
|
||||
// Enable?
|
||||
if (ch.enable == 0)
|
||||
{
|
||||
ch.output_vol = 0;
|
||||
ch.adder = 0;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
// Digitized output
|
||||
if (ch.gate != 0)
|
||||
{
|
||||
ch.output_vol = ch.volume << APU_VRC6.RECTANGLE_VOL_SHIFT;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
// 一定以上の周波数は処理しない(無駄)
|
||||
if (ch.freq < INT2FIX(8))
|
||||
{
|
||||
ch.output_vol = 0;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
ch.phaseacc -= cycle_rate;
|
||||
if (ch.phaseacc >= 0)
|
||||
return ch.output_vol;
|
||||
|
||||
int output = ch.volume << APU_VRC6.RECTANGLE_VOL_SHIFT;
|
||||
|
||||
if (ch.freq > cycle_rate)
|
||||
{
|
||||
// add 1 step
|
||||
ch.phaseacc += ch.freq;
|
||||
ch.adder = (byte)((ch.adder + 1) & 0x0F);
|
||||
if (ch.adder <= ch.duty_pos)
|
||||
ch.output_vol = output;
|
||||
else
|
||||
ch.output_vol = -output;
|
||||
}
|
||||
else
|
||||
{
|
||||
// average calculate
|
||||
int num_times, total;
|
||||
num_times = total = 0;
|
||||
while (ch.phaseacc < 0)
|
||||
{
|
||||
ch.phaseacc += ch.freq;
|
||||
ch.adder = (byte)((ch.adder + 1) & 0x0F);
|
||||
if (ch.adder <= ch.duty_pos)
|
||||
total += output;
|
||||
else
|
||||
total += -output;
|
||||
num_times++;
|
||||
}
|
||||
ch.output_vol = total / num_times;
|
||||
}
|
||||
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
int SawtoothRender(SAWTOOTH ch)
|
||||
{
|
||||
// Digitized output
|
||||
if (ch.enable == 0)
|
||||
{
|
||||
ch.output_vol = 0;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
// 一定以上の周波数は処理しない(無駄)
|
||||
if (ch.freq < INT2FIX(9))
|
||||
{
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
ch.phaseacc -= cycle_rate / 2;
|
||||
if (ch.phaseacc >= 0)
|
||||
return ch.output_vol;
|
||||
|
||||
if (ch.freq > cycle_rate / 2)
|
||||
{
|
||||
// add 1 step
|
||||
ch.phaseacc += ch.freq;
|
||||
if (++ch.adder >= 7)
|
||||
{
|
||||
ch.adder = 0;
|
||||
ch.accum = 0;
|
||||
}
|
||||
ch.accum += ch.phaseaccum;
|
||||
ch.output_vol = ch.accum << APU_VRC6.SAWTOOTH_VOL_SHIFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
// average calculate
|
||||
int num_times, total;
|
||||
num_times = total = 0;
|
||||
while (ch.phaseacc < 0)
|
||||
{
|
||||
ch.phaseacc += ch.freq;
|
||||
if (++ch.adder >= 7)
|
||||
{
|
||||
ch.adder = 0;
|
||||
ch.accum = 0;
|
||||
}
|
||||
ch.accum += ch.phaseaccum;
|
||||
total += ch.accum << APU_VRC6.SAWTOOTH_VOL_SHIFT;
|
||||
num_times++;
|
||||
}
|
||||
ch.output_vol = (total / num_times);
|
||||
}
|
||||
|
||||
return ch.output_vol;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6a47ed257e942d4478215338d8fe4c35
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,310 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class APU_VRC6 : APU_INTERFACE
|
||||
{
|
||||
public const int RECTANGLE_VOL_SHIFT = 8;
|
||||
public const int SAWTOOTH_VOL_SHIFT = 6;
|
||||
|
||||
private RECTANGLE ch0 = new RECTANGLE();
|
||||
private RECTANGLE ch1 = new RECTANGLE();
|
||||
private SAWTOOTH ch2 = new SAWTOOTH();
|
||||
|
||||
private int cycle_rate;
|
||||
private float cpu_clock;
|
||||
|
||||
public APU_VRC6()
|
||||
{
|
||||
Reset(APU_CLOCK, 22050);
|
||||
}
|
||||
|
||||
public override void Reset(float fClock, int nRate)
|
||||
{
|
||||
ch0.ZeroMemory();
|
||||
ch1.ZeroMemory();
|
||||
ch2.ZeroMemory();
|
||||
|
||||
Setup(fClock, nRate);
|
||||
}
|
||||
|
||||
public override void Setup(float fClock, int nRate)
|
||||
{
|
||||
cpu_clock = fClock;
|
||||
cycle_rate = (int)(fClock * 65536.0f / nRate);
|
||||
}
|
||||
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
switch (addr)
|
||||
{
|
||||
// VRC6 CH0 rectangle
|
||||
case 0x9000:
|
||||
ch0.reg[0] = data;
|
||||
ch0.gate = (byte)(data & 0x80);
|
||||
ch0.volume = (byte)(data & 0x0F);
|
||||
ch0.duty_pos = (byte)((data >> 4) & 0x07);
|
||||
break;
|
||||
case 0x9001:
|
||||
ch0.reg[1] = data;
|
||||
ch0.freq = INT2FIX((((ch0.reg[2] & 0x0F) << 8) | data) + 1);
|
||||
break;
|
||||
case 0x9002:
|
||||
ch0.reg[2] = data;
|
||||
ch0.enable = (byte)(data & 0x80);
|
||||
ch0.freq = INT2FIX((((data & 0x0F) << 8) | ch0.reg[1]) + 1);
|
||||
break;
|
||||
// VRC6 CH1 rectangle
|
||||
case 0xA000:
|
||||
ch1.reg[0] = data;
|
||||
ch1.gate = (byte)(data & 0x80);
|
||||
ch1.volume = (byte)(data & 0x0F);
|
||||
ch1.duty_pos = (byte)((data >> 4) & 0x07);
|
||||
break;
|
||||
case 0xA001:
|
||||
ch1.reg[1] = data;
|
||||
ch1.freq = INT2FIX((((ch1.reg[2] & 0x0F) << 8) | data) + 1);
|
||||
break;
|
||||
case 0xA002:
|
||||
ch1.reg[2] = data;
|
||||
ch1.enable = (byte)(data & 0x80);
|
||||
ch1.freq = INT2FIX((((data & 0x0F) << 8) | ch1.reg[1]) + 1);
|
||||
break;
|
||||
// VRC6 CH2 sawtooth
|
||||
case 0xB000:
|
||||
ch2.reg[1] = data;
|
||||
ch2.phaseaccum = (byte)(data & 0x3F);
|
||||
break;
|
||||
case 0xB001:
|
||||
ch2.reg[1] = data;
|
||||
ch2.freq = INT2FIX((((ch2.reg[2] & 0x0F) << 8) | data) + 1);
|
||||
break;
|
||||
case 0xB002:
|
||||
ch2.reg[2] = data;
|
||||
ch2.enable = (byte)(data & 0x80);
|
||||
ch2.freq = INT2FIX((((data & 0x0F) << 8) | ch2.reg[1]) + 1);
|
||||
// ch2.adder = 0; // 僋儕傾偡傞偲僲僀僘偺尨場偵側傞
|
||||
// ch2.accum = 0; // 僋儕傾偡傞偲僲僀僘偺尨場偵側傞
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override int Process(int channel)
|
||||
{
|
||||
switch (channel)
|
||||
{
|
||||
case 0:
|
||||
return RectangleRender(ch0);
|
||||
case 1:
|
||||
return RectangleRender(ch1);
|
||||
case 2:
|
||||
return SawtoothRender(ch2);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public override int GetFreq(int channel)
|
||||
{
|
||||
if (channel == 0 || channel == 1)
|
||||
{
|
||||
RECTANGLE ch = null;
|
||||
if (channel == 0) ch = ch0;
|
||||
else ch = ch1;
|
||||
if (ch.enable == 0 || ch.gate != 0 || ch.volume == 0)
|
||||
return 0;
|
||||
if (ch.freq < INT2FIX(8))
|
||||
return 0;
|
||||
return (int)(256.0f * cpu_clock / (FIX2INT(ch.freq) * 16.0f));
|
||||
}
|
||||
if (channel == 2)
|
||||
{
|
||||
SAWTOOTH ch = ch2;
|
||||
if (ch.enable == 0 || ch.phaseaccum == 0)
|
||||
return 0;
|
||||
if (ch.freq < INT2FIX(8))
|
||||
return 0;
|
||||
return (int)(256.0f * cpu_clock / (FIX2INT(ch.freq) * 14.0f));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int RectangleRender(RECTANGLE ch)
|
||||
{
|
||||
// Enable?
|
||||
if (ch.enable == 0)
|
||||
{
|
||||
ch.output_vol = 0;
|
||||
ch.adder = 0;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
// Digitized output
|
||||
if (ch.gate != 0)
|
||||
{
|
||||
ch.output_vol = ch.volume << RECTANGLE_VOL_SHIFT;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
// 堦掕埲忋偺廃攇悢偼張棟偟側偄(柍懯)
|
||||
if (ch.freq < INT2FIX(8))
|
||||
{
|
||||
ch.output_vol = 0;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
ch.phaseacc -= cycle_rate;
|
||||
if (ch.phaseacc >= 0)
|
||||
return ch.output_vol;
|
||||
|
||||
int output = ch.volume << RECTANGLE_VOL_SHIFT;
|
||||
|
||||
if (ch.freq > cycle_rate)
|
||||
{
|
||||
// add 1 step
|
||||
ch.phaseacc += ch.freq;
|
||||
ch.adder = (byte)((ch.adder + 1) & 0x0F);
|
||||
if (ch.adder <= ch.duty_pos)
|
||||
ch.output_vol = output;
|
||||
else
|
||||
ch.output_vol = -output;
|
||||
}
|
||||
else
|
||||
{
|
||||
// average calculate
|
||||
int num_times, total;
|
||||
num_times = total = 0;
|
||||
while (ch.phaseacc < 0)
|
||||
{
|
||||
ch.phaseacc += ch.freq;
|
||||
ch.adder = (byte)((ch.adder + 1) & 0x0F);
|
||||
if (ch.adder <= ch.duty_pos)
|
||||
total += output;
|
||||
else
|
||||
total += -output;
|
||||
num_times++;
|
||||
}
|
||||
ch.output_vol = total / num_times;
|
||||
}
|
||||
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
private int SawtoothRender(SAWTOOTH ch)
|
||||
{
|
||||
// Digitized output
|
||||
if (ch.enable == 0)
|
||||
{
|
||||
ch.output_vol = 0;
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
// 堦掕埲忋偺廃攇悢偼張棟偟側偄(柍懯)
|
||||
if (ch.freq < INT2FIX(9))
|
||||
{
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
ch.phaseacc -= cycle_rate / 2;
|
||||
if (ch.phaseacc >= 0)
|
||||
return ch.output_vol;
|
||||
|
||||
if (ch.freq > cycle_rate / 2)
|
||||
{
|
||||
// add 1 step
|
||||
ch.phaseacc += ch.freq;
|
||||
if (++ch.adder >= 7)
|
||||
{
|
||||
ch.adder = 0;
|
||||
ch.accum = 0;
|
||||
}
|
||||
ch.accum += ch.phaseaccum;
|
||||
ch.output_vol = ch.accum << SAWTOOTH_VOL_SHIFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
// average calculate
|
||||
int num_times, total;
|
||||
num_times = total = 0;
|
||||
while (ch.phaseacc < 0)
|
||||
{
|
||||
ch.phaseacc += ch.freq;
|
||||
if (++ch.adder >= 7)
|
||||
{
|
||||
ch.adder = 0;
|
||||
ch.accum = 0;
|
||||
}
|
||||
ch.accum += ch.phaseaccum;
|
||||
total += ch.accum << SAWTOOTH_VOL_SHIFT;
|
||||
num_times++;
|
||||
}
|
||||
ch.output_vol = (total / num_times);
|
||||
}
|
||||
|
||||
return ch.output_vol;
|
||||
}
|
||||
|
||||
public class RECTANGLE
|
||||
{
|
||||
public byte[] reg = new byte[3];
|
||||
|
||||
public byte enable;
|
||||
public byte gate;
|
||||
public byte volume;
|
||||
|
||||
public int phaseacc;
|
||||
public int freq;
|
||||
public int output_vol;
|
||||
|
||||
public byte adder;
|
||||
public byte duty_pos;
|
||||
|
||||
public void ZeroMemory()
|
||||
{
|
||||
Array.Clear(reg, 0, reg.Length);
|
||||
enable = 0;
|
||||
gate = 0;
|
||||
volume = 0;
|
||||
|
||||
phaseacc = 0;
|
||||
freq = 0;
|
||||
output_vol = 0;
|
||||
|
||||
adder = 0;
|
||||
duty_pos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public class SAWTOOTH
|
||||
{
|
||||
public byte[] reg = new byte[3];
|
||||
|
||||
public byte enable;
|
||||
public byte volume;
|
||||
|
||||
public int phaseacc;
|
||||
public int freq;
|
||||
public int output_vol;
|
||||
|
||||
public byte adder;
|
||||
public byte accum;
|
||||
public byte phaseaccum;
|
||||
|
||||
public void ZeroMemory()
|
||||
{
|
||||
Array.Clear(reg, 0, reg.Length);
|
||||
enable = 0;
|
||||
volume = 0;
|
||||
|
||||
phaseacc = 0;
|
||||
freq = 0;
|
||||
output_vol = 0;
|
||||
|
||||
adder = 0;
|
||||
accum = 0;
|
||||
phaseaccum = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 190f3271accd30f4eb5b13590417d265
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,96 +0,0 @@
|
||||
using System;
|
||||
using VirtualNes.Core.Emu2413;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class APU_VRC7 : APU_INTERFACE
|
||||
{
|
||||
OPLL VRC7_OPLL;
|
||||
byte address;
|
||||
|
||||
public APU_VRC7()
|
||||
{
|
||||
Emu2413API.OPLL_init(3579545, 22050); // 仮のサンプリングレート
|
||||
VRC7_OPLL = Emu2413API.OPLL_new();
|
||||
|
||||
if (VRC7_OPLL != null)
|
||||
{
|
||||
Emu2413API.OPLL_reset(VRC7_OPLL);
|
||||
Emu2413API.OPLL_reset_patch(VRC7_OPLL, Emu2413API.OPLL_VRC7_TONE);
|
||||
VRC7_OPLL.masterVolume = 128;
|
||||
}
|
||||
|
||||
// 仮設定
|
||||
Reset(APU_CLOCK, 22050);
|
||||
}
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
if (VRC7_OPLL != null)
|
||||
{
|
||||
Emu2413API.OPLL_delete(VRC7_OPLL);
|
||||
VRC7_OPLL = null;
|
||||
// OPLL_close(); // 無くても良い(中身無し)
|
||||
}
|
||||
}
|
||||
|
||||
public override void Reset(float fClock, int nRate)
|
||||
{
|
||||
if (VRC7_OPLL != null)
|
||||
{
|
||||
Emu2413API.OPLL_reset(VRC7_OPLL);
|
||||
Emu2413API.OPLL_reset_patch(VRC7_OPLL, Emu2413API.OPLL_VRC7_TONE);
|
||||
VRC7_OPLL.masterVolume = 128;
|
||||
}
|
||||
|
||||
address = 0;
|
||||
|
||||
Setup(fClock, nRate);
|
||||
}
|
||||
|
||||
public override void Setup(float fClock, int nRate)
|
||||
{
|
||||
Emu2413API.OPLL_setClock((UInt32)(fClock * 2.0f), (UInt32)nRate);
|
||||
}
|
||||
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
if (VRC7_OPLL != null)
|
||||
{
|
||||
if (addr == 0x9010)
|
||||
{
|
||||
address = data;
|
||||
}
|
||||
else if (addr == 0x9030)
|
||||
{
|
||||
Emu2413API.OPLL_writeReg(VRC7_OPLL, address, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override int Process(int channel)
|
||||
{
|
||||
if (VRC7_OPLL != null)
|
||||
return Emu2413API.OPLL_calc(VRC7_OPLL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
float[] blkmul = { 0.5f, 1.0f, 2.0f, 4.0f, 8.0f, 16.0f, 32.0f, 64.0f };
|
||||
public override int GetFreq(int channel)
|
||||
{
|
||||
if (VRC7_OPLL != null && channel < 8)
|
||||
{
|
||||
int fno = ((VRC7_OPLL.reg[0x20 + channel] & 0x01) << 8) + VRC7_OPLL.reg[0x10 + channel];
|
||||
int blk = (VRC7_OPLL.reg[0x20 + channel] >> 1) & 0x07;
|
||||
|
||||
if ((VRC7_OPLL.reg[0x20 + channel] & 0x10) != 0)
|
||||
{
|
||||
return (int)((256.0d * fno * blkmul[blk]) / ((1 << 18) / (3579545.0 / 72.0)));
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 180a87918f9d49e4fad978014f1d594f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 055e668755423bf4dabeb6cc007bce76
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,36 +0,0 @@
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class CHEATCODE
|
||||
{
|
||||
// 埲壓偺俀偮偼OR儅僗僋
|
||||
public const int CHEAT_ENABLE = 1 << 0;
|
||||
public const int CHEAT_KEYDISABLE = 1 << 1;
|
||||
|
||||
// 彂偒崬傒庬椶
|
||||
public const int CHEAT_TYPE_ALWAYS = 0; // 忢偵彂偒崬傒
|
||||
public const int CHEAT_TYPE_ONCE = 1; // 侾夞偩偗彂偒崬傒
|
||||
public const int CHEAT_TYPE_GREATER = 2; // 僨乕僞傛傝戝偒偄帪
|
||||
public const int CHEAT_TYPE_LESS = 3; // 僨乕僞傛傝彫偝偄帪
|
||||
|
||||
// 僨乕僞挿
|
||||
public const int CHEAT_LENGTH_1BYTE = 0;
|
||||
public const int CHEAT_LENGTH_2BYTE = 1;
|
||||
public const int CHEAT_LENGTH_3BYTE = 2;
|
||||
public const int CHEAT_LENGTH_4BYTE = 3;
|
||||
|
||||
public byte enable;
|
||||
public byte type;
|
||||
public byte length;
|
||||
public ushort address;
|
||||
public uint data;
|
||||
|
||||
public string comment;
|
||||
}
|
||||
|
||||
class GENIECODE
|
||||
{
|
||||
public ushort address;
|
||||
public byte data;
|
||||
public byte cmp;
|
||||
};
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5494fe2d7f568c5498880bcb5625e21e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7b37fc906e6cec64eb2608762f7f80bf
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,66 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class ArrayRef<T>
|
||||
{
|
||||
private T[] m_rawArray;
|
||||
private int m_offset;
|
||||
private int m_length;
|
||||
|
||||
public int Offset
|
||||
{
|
||||
get => m_offset;
|
||||
set
|
||||
{
|
||||
var gap = value - m_offset;
|
||||
m_length -= gap;
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayRef() { }
|
||||
public ArrayRef(T[] array, int offset, int length)
|
||||
{
|
||||
SetArray(array, offset, length);
|
||||
}
|
||||
|
||||
public ArrayRef(T[] array) : this(array, 0, array.Length) { }
|
||||
public ArrayRef(T[] array, int offset) : this(array, offset, array.Length - offset) { }
|
||||
|
||||
public void SetArray(T[] array, int offset, int length)
|
||||
{
|
||||
m_rawArray = array;
|
||||
m_offset = offset;
|
||||
m_length = length;
|
||||
}
|
||||
|
||||
public void SetArray(T[] array, int offset)
|
||||
{
|
||||
m_rawArray = array;
|
||||
m_offset = offset;
|
||||
m_length = array.Length - offset;
|
||||
}
|
||||
|
||||
public T this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_rawArray[m_offset + index];
|
||||
}
|
||||
set
|
||||
{
|
||||
m_rawArray[(m_offset + index)] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public static implicit operator ArrayRef<T>(T[] array)
|
||||
{
|
||||
return new ArrayRef<T>(array);
|
||||
}
|
||||
|
||||
public static implicit operator Span<T>(ArrayRef<T> array)
|
||||
{
|
||||
return new Span<T>(array.m_rawArray, array.Offset, array.m_length);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fe59f85b299db6f498a7e87a5125df58
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,87 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public static class CRC
|
||||
{
|
||||
const int CHAR_BIT = 8;
|
||||
const uint CRCPOLY1 = 0x04C11DB7U;
|
||||
const uint CRCPOLY2 = 0xEDB88320U;
|
||||
|
||||
static bool m_Init;
|
||||
static bool m_InitRev;
|
||||
static uint[] m_CrcTable = new uint[byte.MaxValue + 1];
|
||||
static uint[] m_CrcTableRev = new uint[byte.MaxValue + 1];
|
||||
|
||||
public static ulong Crc(int size, Span<byte> c)
|
||||
{
|
||||
if (!m_Init)
|
||||
{
|
||||
MakeTable();
|
||||
m_Init = true;
|
||||
}
|
||||
|
||||
ulong r = 0xFFFFFFFFUL;
|
||||
int step = 0;
|
||||
while (--size >= 0)
|
||||
{
|
||||
r = (r << CHAR_BIT) ^ m_CrcTable[(byte)(r >> (32 - CHAR_BIT)) ^ c[step]];
|
||||
step++;
|
||||
}
|
||||
return ~r & 0xFFFFFFFFUL;
|
||||
}
|
||||
public static uint CrcRev(int size, Span<byte> c)
|
||||
{
|
||||
if (!m_InitRev)
|
||||
{
|
||||
MakeTableRev();
|
||||
m_InitRev = true;
|
||||
}
|
||||
|
||||
uint r = 0xFFFFFFFFU;
|
||||
int step = 0;
|
||||
while (--size >= 0)
|
||||
{
|
||||
r = (r >> CHAR_BIT) ^ m_CrcTableRev[(byte)r ^ c[step]];
|
||||
step++;
|
||||
}
|
||||
return r ^ 0xFFFFFFFFU;
|
||||
}
|
||||
|
||||
static void MakeTable()
|
||||
{
|
||||
int i, j;
|
||||
uint r;
|
||||
|
||||
for (i = 0; i <= byte.MaxValue; i++)
|
||||
{
|
||||
r = (uint)i << (32 - CHAR_BIT);
|
||||
for (j = 0; j < CHAR_BIT; j++)
|
||||
{
|
||||
if ((r & 0x80000000UL) > 0) r = (r << 1) ^ CRCPOLY1;
|
||||
else r <<= 1;
|
||||
}
|
||||
m_CrcTable[i] = r & 0xFFFFFFFFU;
|
||||
}
|
||||
|
||||
}
|
||||
static void MakeTableRev()
|
||||
{
|
||||
int i, j;
|
||||
uint r;
|
||||
|
||||
for (i = 0; i <= byte.MaxValue; i++)
|
||||
{
|
||||
r = (uint)i;
|
||||
for (j = 0; j < CHAR_BIT; j++)
|
||||
{
|
||||
if ((r & 1) > 0) r = (r >> 1) ^ CRCPOLY2;
|
||||
else r >>= 1;
|
||||
}
|
||||
m_CrcTableRev[i] = r;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e1939f721bc0cab42add18338dbff333
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d5b90f721bfc1ac4ea985c0f564d1c6e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f5ecddbb6b69204478d799a484d8c47c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,208 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core.Emu2413
|
||||
{
|
||||
public static class Const
|
||||
{
|
||||
internal static sbyte[][] Create_Default_Inst()
|
||||
{
|
||||
unchecked
|
||||
{
|
||||
sbyte[][] res = new sbyte[Emu2413API.OPLL_TONE_NUM][]
|
||||
{
|
||||
new sbyte[]
|
||||
{
|
||||
(sbyte)0x00,(sbyte) 0x00, (sbyte)0x00, (sbyte)0x00,(sbyte) 0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x61,(sbyte) 0x61, (sbyte)0x1e, (sbyte)0x17,(sbyte) 0xf0, (sbyte)0x7f, (sbyte)0x07, (sbyte)0x17, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x13,(sbyte) 0x41, (sbyte)0x0f, (sbyte)0x0d,(sbyte) 0xce, (sbyte)0xd2, (sbyte)0x43, (sbyte)0x13, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x03,(sbyte) 0x01, (sbyte)0x99, (sbyte)0x04,(sbyte) 0xff, (sbyte)0xc3, (sbyte)0x03, (sbyte)0x73, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x21,(sbyte) 0x61, (sbyte)0x1b, (sbyte)0x07,(sbyte) 0xaf, (sbyte)0x63, (sbyte)0x40, (sbyte)0x28, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x22,(sbyte) 0x21, (sbyte)0x1e, (sbyte)0x06,(sbyte) 0xf0, (sbyte)0x76, (sbyte)0x08, (sbyte)0x28, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x31,(sbyte) 0x22, (sbyte)0x16, (sbyte)0x05,(sbyte) 0x90, (sbyte)0x71, (sbyte)0x00, (sbyte)0x18, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x21,(sbyte) 0x61, (sbyte)0x1d, (sbyte)0x07,(sbyte) 0x82, (sbyte)0x81, (sbyte)0x10, (sbyte)0x17, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x23,(sbyte) 0x21, (sbyte)0x2d, (sbyte)0x16,(sbyte) 0xc0, (sbyte)0x70, (sbyte)0x07, (sbyte)0x07, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x61,(sbyte) 0x21, (sbyte)0x1b, (sbyte)0x06,(sbyte) 0x64, (sbyte)0x65, (sbyte)0x18, (sbyte)0x18, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x61,(sbyte) 0x61, (sbyte)0x0c, (sbyte)0x18,(sbyte) 0x85, (sbyte)0xa0, (sbyte)0x79, (sbyte)0x07, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x23,(sbyte) 0x21, (sbyte)0x87, (sbyte)0x11,(sbyte) 0xf0, (sbyte)0xa4, (sbyte)0x00, (sbyte)0xf7, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x97,(sbyte) 0xe1, (sbyte)0x28, (sbyte)0x07,(sbyte) 0xff, (sbyte)0xf3, (sbyte)0x02, (sbyte)0xf8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x61,(sbyte) 0x10, (sbyte)0x0c, (sbyte)0x05,(sbyte) 0xf2, (sbyte)0xc4, (sbyte)0x40, (sbyte)0xc8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x01,(sbyte) 0x01, (sbyte)0x56, (sbyte)0x03,(sbyte) 0xb4, (sbyte)0xb2, (sbyte)0x23, (sbyte)0x58, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x61,(sbyte) 0x41, (sbyte)0x89, (sbyte)0x03,(sbyte) 0xf1, (sbyte)0xf4, (sbyte)0xf0, (sbyte)0x13, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x04,(sbyte) 0x21, (sbyte)0x28, (sbyte)0x00,(sbyte) 0xdf, (sbyte)0xf8, (sbyte)0xff, (sbyte)0xf8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x23,(sbyte) 0x22, (sbyte)0x00, (sbyte)0x00,(sbyte) 0xd8, (sbyte)0xf8, (sbyte)0xf8, (sbyte)0xf8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x25,(sbyte) 0x18, (sbyte)0x00, (sbyte)0x00,(sbyte) 0xf8, (sbyte)0xda, (sbyte)0xf8, (sbyte)0x55, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
},
|
||||
new sbyte[]
|
||||
{
|
||||
(sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x33, (sbyte)0x01, (sbyte)0x09, (sbyte)0x0e, (sbyte)0x94, (sbyte)0x90, (sbyte)0x40, (sbyte)0x01, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x13, (sbyte)0x41, (sbyte)0x0f, (sbyte)0x0d, (sbyte)0xce, (sbyte)0xd3, (sbyte)0x43, (sbyte)0x13, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x01, (sbyte)0x12, (sbyte)0x1b, (sbyte)0x06, (sbyte)0xff, (sbyte)0xd2, (sbyte)0x00, (sbyte)0x32, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x61, (sbyte)0x61, (sbyte)0x1b, (sbyte)0x07, (sbyte)0xaf, (sbyte)0x63, (sbyte)0x20, (sbyte)0x28, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x22, (sbyte)0x21, (sbyte)0x1e, (sbyte)0x06, (sbyte)0xf0, (sbyte)0x76, (sbyte)0x08, (sbyte)0x28, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x66, (sbyte)0x21, (sbyte)0x15, (sbyte)0x00, (sbyte)0x93, (sbyte)0x94, (sbyte)0x20, (sbyte)0xf8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x21, (sbyte)0x61, (sbyte)0x1c, (sbyte)0x07, (sbyte)0x82, (sbyte)0x81, (sbyte)0x10, (sbyte)0x17, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x23, (sbyte)0x21, (sbyte)0x20, (sbyte)0x1f, (sbyte)0xc0, (sbyte)0x71, (sbyte)0x07, (sbyte)0x47, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x25, (sbyte)0x31, (sbyte)0x26, (sbyte)0x05, (sbyte)0x64, (sbyte)0x41, (sbyte)0x18, (sbyte)0xf8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x17, (sbyte)0x21, (sbyte)0x28, (sbyte)0x07, (sbyte)0xff, (sbyte)0x83, (sbyte)0x02, (sbyte)0xf8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x97, (sbyte)0x81, (sbyte)0x25, (sbyte)0x07, (sbyte)0xcf, (sbyte)0xc8, (sbyte)0x02, (sbyte)0x14, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x21, (sbyte)0x21, (sbyte)0x54, (sbyte)0x0f, (sbyte)0x80, (sbyte)0x7f, (sbyte)0x07, (sbyte)0x07, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x01, (sbyte)0x01, (sbyte)0x56, (sbyte)0x03, (sbyte)0xd3, (sbyte)0xb2, (sbyte)0x43, (sbyte)0x58, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x31, (sbyte)0x21, (sbyte)0x0c, (sbyte)0x03, (sbyte)0x82, (sbyte)0xc0, (sbyte)0x40, (sbyte)0x07, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x21, (sbyte)0x01, (sbyte)0x0c, (sbyte)0x03, (sbyte)0xd4, (sbyte)0xd3, (sbyte)0x40, (sbyte)0x84, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x04, (sbyte)0x21, (sbyte)0x28, (sbyte)0x00, (sbyte)0xdf, (sbyte)0xf8, (sbyte)0xff, (sbyte)0xf8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x23, (sbyte)0x22, (sbyte)0x00, (sbyte)0x00, (sbyte)0xa8, (sbyte)0xf8, (sbyte)0xf8, (sbyte)0xf8, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
(sbyte)0x25, (sbyte)0x18, (sbyte)0x00, (sbyte)0x00, (sbyte)0xf8, (sbyte)0xa9, (sbyte)0xf8, (sbyte)0x55, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00, (sbyte)0x00,
|
||||
}
|
||||
};
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
internal static OPLL_PATCH[][] Create_Default_Patch()
|
||||
{
|
||||
OPLL_PATCH[][] res = new OPLL_PATCH[Emu2413API.OPLL_TONE_NUM][]
|
||||
{
|
||||
new OPLL_PATCH[(16 + 3) * 2],
|
||||
new OPLL_PATCH[(16 + 3) * 2],
|
||||
};
|
||||
|
||||
for (int x = 0; x < Emu2413API.OPLL_TONE_NUM; x++)
|
||||
for (int y = 0; y < (16 + 3) * 2; y++)
|
||||
res[x][y] = new OPLL_PATCH();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
internal static uint[,,,] Create_tllTable()
|
||||
{
|
||||
var res = new uint[16, 8, 1 << Emu2413API.TL_BITS, 4];
|
||||
return res;
|
||||
}
|
||||
|
||||
internal static Int32[,,] Create_rksTable()
|
||||
{
|
||||
return new int[2, 8, 2];
|
||||
}
|
||||
|
||||
internal static UInt32[,,] Create_dphaseTable()
|
||||
{
|
||||
return new uint[512, 8, 16];
|
||||
}
|
||||
}
|
||||
public class OPLL_PATCH
|
||||
{
|
||||
public uint TL, FB, EG, ML, AR, DR, SL, RR, KR, KL, AM, PM, WF;
|
||||
|
||||
public void Copy(OPLL_PATCH other)
|
||||
{
|
||||
TL = other.TL;
|
||||
FB = other.FB;
|
||||
EG = other.EG;
|
||||
ML = other.ML;
|
||||
AR = other.AR;
|
||||
DR = other.DR;
|
||||
SL = other.SL;
|
||||
RR = other.RR;
|
||||
KR = other.KR;
|
||||
KL = other.KL;
|
||||
AM = other.AM;
|
||||
PM = other.PM;
|
||||
WF = other.WF;
|
||||
}
|
||||
}
|
||||
|
||||
public class OPLL_SLOT
|
||||
{
|
||||
public OPLL_PATCH patch;
|
||||
|
||||
public int type; /* 0 : modulator 1 : carrier */
|
||||
|
||||
/* OUTPUT */
|
||||
public Int32 feedback;
|
||||
public Int32[] output = new Int32[5]; /* Output value of slot */
|
||||
|
||||
/* for Phase Generator (PG) */
|
||||
public UInt32[] sintbl; /* Wavetable */
|
||||
public UInt32 phase; /* Phase */
|
||||
public UInt32 dphase; /* Phase increment amount */
|
||||
public UInt32 pgout; /* output */
|
||||
|
||||
/* for Envelope Generator (EG) */
|
||||
public int fnum; /* F-Number */
|
||||
public int block; /* Block */
|
||||
public int volume; /* Current volume */
|
||||
public int sustine; /* Sustine 1 = ON, 0 = OFF */
|
||||
public UInt32 tll; /* Total Level + Key scale level*/
|
||||
public UInt32 rks; /* Key scale offset (Rks) */
|
||||
public int eg_mode; /* Current state */
|
||||
public UInt32 eg_phase; /* Phase */
|
||||
public UInt32 eg_dphase; /* Phase increment amount */
|
||||
public UInt32 egout; /* output */
|
||||
|
||||
|
||||
/* refer to opll-> */
|
||||
public int plfo_pm => m_host.lfo_pm;
|
||||
public int plfo_am => m_host.lfo_am;
|
||||
|
||||
private OPLL m_host;
|
||||
public void SetHost(OPLL host)
|
||||
{
|
||||
m_host = host;
|
||||
}
|
||||
}
|
||||
|
||||
public class OPLL_CH
|
||||
{
|
||||
public int patch_number;
|
||||
public int key_status;
|
||||
public OPLL_SLOT mod;
|
||||
public OPLL_SLOT car;
|
||||
}
|
||||
|
||||
public class OPLL
|
||||
{
|
||||
public UInt32 adr;
|
||||
public Int32[] output = new Int32[2];
|
||||
|
||||
/* Register */
|
||||
public byte[] reg = new byte[0x40];
|
||||
public int[] slot_on_flag = new int[18];
|
||||
|
||||
/* Rythm Mode : 0 = OFF, 1 = ON */
|
||||
public int rythm_mode;
|
||||
|
||||
/* Pitch Modulator */
|
||||
public UInt32 pm_phase;
|
||||
public Int32 lfo_pm;
|
||||
|
||||
/* Amp Modulator */
|
||||
public Int32 am_phase;
|
||||
public Int32 lfo_am;
|
||||
|
||||
/* Noise Generator */
|
||||
public UInt32 noise_seed;
|
||||
public UInt32 whitenoise;
|
||||
public UInt32 noiseA;
|
||||
public UInt32 noiseB;
|
||||
public UInt32 noiseA_phase;
|
||||
public UInt32 noiseB_phase;
|
||||
public UInt32 noiseA_idx;
|
||||
public UInt32 noiseB_idx;
|
||||
public UInt32 noiseA_dphase;
|
||||
public UInt32 noiseB_dphase;
|
||||
|
||||
/* Channel & Slot */
|
||||
public OPLL_CH[] ch = new OPLL_CH[9];
|
||||
public OPLL_SLOT[] slot = new OPLL_SLOT[18];
|
||||
|
||||
/* Voice Data */
|
||||
public OPLL_PATCH[] patch = new OPLL_PATCH[19 * 2];
|
||||
public int[] patch_update = new int[2]; /* flag for check patch update */
|
||||
|
||||
public UInt32 mask;
|
||||
|
||||
public int masterVolume; /* 0min -- 64 -- 127 max (Liner) */
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9c1aaa5374091a64a88e750483fe6f6b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,12 +0,0 @@
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
// 昤夋曽幃
|
||||
public enum EnumRenderMethod
|
||||
{
|
||||
POST_ALL_RENDER = 0, // 僗僉儍儞儔僀儞暘偺柦椷幚峴屻丆儗儞僟儕儞僌
|
||||
PRE_ALL_RENDER = 1, // 儗儞僟儕儞僌偺幚峴屻丆僗僉儍儞儔僀儞暘偺柦椷幚峴
|
||||
POST_RENDER = 2, // 昞帵婜娫暘偺柦椷幚峴屻丆儗儞僟儕儞僌
|
||||
PRE_RENDER = 3, // 儗儞僟儕儞僌幚峴屻丆昞帵婜娫暘偺柦椷幚峴
|
||||
TILE_RENDER = 4 // 僞僀儖儀乕僗儗儞僟儕儞僌
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9c379fb6535bd23449474dee5018652c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,13 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public interface ISoundDataBuffer
|
||||
{
|
||||
void WriteByte(byte value);
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4585a754599519b48bfe50294600818f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,46 +0,0 @@
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public static class MemoryUtility
|
||||
{
|
||||
public static void ZEROMEMORY(byte[] array, int length)
|
||||
{
|
||||
Array.Clear(array, 0, array.Length);
|
||||
}
|
||||
public static void ZEROMEMORY(int[] array, int length)
|
||||
{
|
||||
Array.Clear(array, 0, array.Length);
|
||||
}
|
||||
|
||||
public static void memset(byte[] array, byte value, int length)
|
||||
{
|
||||
memset(array, 0, value, length);
|
||||
}
|
||||
|
||||
public static void memset(uint[] array, uint value, int length)
|
||||
{
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
array[i] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public static void memset(byte[] array, int offset, byte value, int length)
|
||||
{
|
||||
for (int i = offset; i < length; i++)
|
||||
{
|
||||
array[i] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public static void memset(uint[] array, int offset, uint value, int length)
|
||||
{
|
||||
for (int i = offset; i < length; i++)
|
||||
{
|
||||
array[i] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8586eb710dc81124593eb5adfa08d73b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,51 +0,0 @@
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class NesConfig
|
||||
{
|
||||
public float BaseClock; // NTSC:21477270.0 PAL:21281364.0
|
||||
public float CpuClock; // NTSC: 1789772.5 PAL: 1773447.0
|
||||
|
||||
public int TotalScanlines; // NTSC: 262 PAL: 312
|
||||
|
||||
public int ScanlineCycles; // NTSC:1364 PAL:1362
|
||||
|
||||
public int HDrawCycles; // NTSC:1024 PAL:1024
|
||||
public int HBlankCycles; // NTSC: 340 PAL: 338
|
||||
public int ScanlineEndCycles; // NTSC: 4 PAL: 2
|
||||
|
||||
public int FrameCycles; // NTSC:29829.52 PAL:35468.94
|
||||
public int FrameIrqCycles; // NTSC:29829.52 PAL:35468.94
|
||||
|
||||
public int FrameRate; // NTSC:60(59.94) PAL:50
|
||||
public float FramePeriod; // NTSC:16.683 PAL:20.0
|
||||
|
||||
public static NesConfig NESCONFIG_NTSC = new NesConfig
|
||||
{
|
||||
BaseClock = 21477270.0f,
|
||||
CpuClock = 1789772.5f,
|
||||
TotalScanlines = 262,
|
||||
ScanlineCycles = 1364,
|
||||
HDrawCycles = 1024,
|
||||
HBlankCycles = 340,
|
||||
ScanlineEndCycles = 4,
|
||||
FrameCycles = 1364 * 262,
|
||||
FrameIrqCycles = 29830,
|
||||
FrameRate = 60,
|
||||
FramePeriod = 1000.0f / 60.0f
|
||||
};
|
||||
public static NesConfig NESCONFIG_PAL = new NesConfig
|
||||
{
|
||||
BaseClock = 26601714.0f,
|
||||
CpuClock = 1662607.125f,
|
||||
TotalScanlines = 312,
|
||||
ScanlineCycles = 1278,
|
||||
HDrawCycles = 960,
|
||||
HBlankCycles = 318,
|
||||
ScanlineEndCycles = 2,
|
||||
FrameCycles = 1278 * 312,
|
||||
FrameIrqCycles = 33252,
|
||||
FrameRate = 50,
|
||||
FramePeriod = 1000.0f / 50.0f
|
||||
};
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4865f8871b37b0041b77060cf3c62664
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,140 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public enum EnumRomControlByte1 : byte
|
||||
{
|
||||
ROM_VMIRROR = 0x01,
|
||||
ROM_SAVERAM = 0x02,
|
||||
ROM_TRAINER = 0x04,
|
||||
ROM_4SCREEN = 0x08,
|
||||
}
|
||||
|
||||
public enum EnumRomControlByte2 : byte
|
||||
{
|
||||
ROM_VSUNISYSTEM = 0x01
|
||||
}
|
||||
|
||||
public enum EnumRomType
|
||||
{
|
||||
InValid,
|
||||
NES,
|
||||
/// <summary> Nintendo Disk System </summary>
|
||||
FDS,
|
||||
NSF
|
||||
}
|
||||
|
||||
public class NSFHEADER
|
||||
{
|
||||
byte[] ID;
|
||||
byte Version;
|
||||
byte TotalSong;
|
||||
byte StartSong;
|
||||
ushort LoadAddress;
|
||||
ushort InitAddress;
|
||||
ushort PlayAddress;
|
||||
byte[] SongName;
|
||||
byte[] ArtistName;
|
||||
byte[] CopyrightName;
|
||||
ushort SpeedNTSC;
|
||||
byte[] BankSwitch;
|
||||
ushort SpeedPAL;
|
||||
byte NTSC_PALbits;
|
||||
public byte ExtraChipSelect;
|
||||
byte[] Expansion; // must be 0
|
||||
|
||||
|
||||
public static int SizeOf()
|
||||
{
|
||||
return 128;
|
||||
}
|
||||
|
||||
public static NSFHEADER GetDefault()
|
||||
{
|
||||
var res = new NSFHEADER();
|
||||
res.ID = new byte[5];
|
||||
res.SongName = new byte[32];
|
||||
res.ArtistName = new byte[32];
|
||||
res.CopyrightName = new byte[32];
|
||||
res.BankSwitch = new byte[8];
|
||||
res.Expansion = new byte[4];
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public class NESHEADER
|
||||
{
|
||||
public byte[] ID;
|
||||
public byte PRG_PAGE_SIZE;
|
||||
public byte CHR_PAGE_SIZE;
|
||||
public byte control1;
|
||||
public byte control2;
|
||||
public byte[] reserved;
|
||||
|
||||
public bool CheckValid()
|
||||
{
|
||||
return GetRomType() != EnumRomType.InValid;
|
||||
}
|
||||
|
||||
public static int SizeOf()
|
||||
{
|
||||
return 16;
|
||||
}
|
||||
|
||||
public EnumRomType GetRomType()
|
||||
{
|
||||
if (ID[0] == 'N' && ID[1] == 'E' && ID[2] == 'S' && ID[3] == 0x1A)
|
||||
return EnumRomType.NES;
|
||||
if (ID[0] == 'F' && ID[1] == 'D' && ID[2] == 'S' && ID[3] == 0x1A)
|
||||
return EnumRomType.FDS;
|
||||
if (ID[0] == 'N' && ID[1] == 'E' && ID[2] == 'S' && ID[3] == 'M')
|
||||
return EnumRomType.NSF;
|
||||
|
||||
return EnumRomType.InValid;
|
||||
}
|
||||
|
||||
public static NESHEADER GetDefault()
|
||||
{
|
||||
var res = new NESHEADER();
|
||||
res.ID = new byte[4];
|
||||
res.reserved = new byte[8];
|
||||
return res;
|
||||
}
|
||||
|
||||
public static NESHEADER Read(Span<byte> data)
|
||||
{
|
||||
var res = new NESHEADER();
|
||||
res.ID = data.Slice(0, 4).ToArray();
|
||||
res.PRG_PAGE_SIZE = data[4];
|
||||
res.CHR_PAGE_SIZE = data[5];
|
||||
res.control1 = data[6];
|
||||
res.control2 = data[7];
|
||||
res.reserved = data.Slice(8, 8).ToArray();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public byte[] DataToBytes()
|
||||
{
|
||||
byte[] res = new byte[16];
|
||||
res[0] = ID[0];
|
||||
res[1] = ID[1];
|
||||
res[2] = ID[2];
|
||||
res[3] = ID[3];
|
||||
res[4] = PRG_PAGE_SIZE;
|
||||
res[5] = CHR_PAGE_SIZE;
|
||||
res[6] = control1;
|
||||
res[7] = control2;
|
||||
res[8] = reserved[0];
|
||||
res[9] = reserved[1];
|
||||
res[10] = reserved[2];
|
||||
res[11] = reserved[3];
|
||||
res[12] = reserved[4];
|
||||
res[13] = reserved[5];
|
||||
res[14] = reserved[6];
|
||||
res[15] = reserved[7];
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 65b1ea91f79171f4f82ab91106909f86
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,420 +0,0 @@
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public static class RomPatch
|
||||
{
|
||||
public static void DoPatch(ref uint crc, ref byte[] lpPRG, ref byte[] lpCHR, ref int mapper, ref NESHEADER header)
|
||||
{
|
||||
// Mapper 000
|
||||
if (crc == 0x57970078)
|
||||
{ // F-1 Race(J)
|
||||
lpPRG[0x078C] = 0x6C;
|
||||
lpPRG[0x3FE1] = 0xFF;
|
||||
lpPRG[0x3FE6] = 0x00;
|
||||
}
|
||||
if (crc == 0xaf2bbcbc // Mach Rider(JU)
|
||||
|| crc == 0x3acd4bf1 // Mach Rider(Alt)(JU) 無理矢理パッチ(^^;
|
||||
|| crc == 0x8bbe9bec)
|
||||
{
|
||||
lpPRG[0x090D] = 0x6E;
|
||||
lpPRG[0x7FDF] = 0xFF;
|
||||
lpPRG[0x7FE4] = 0x00;
|
||||
|
||||
header.control1 = (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
|
||||
if (crc == 0xe16bb5fe)
|
||||
{ // Zippy Race(J)
|
||||
header.control1 &= 0xf6;
|
||||
}
|
||||
if (crc == 0x85534474)
|
||||
{ // Lode Runner(J)
|
||||
lpPRG[0x29E9] = 0xEA; // セーブメニューを出すパッチ
|
||||
lpPRG[0x29EA] = 0xEA;
|
||||
lpPRG[0x29F8] = 0xEA;
|
||||
lpPRG[0x29F9] = 0xEA;
|
||||
}
|
||||
|
||||
// Mapper 001
|
||||
if (crc == 0x7831b2ff // America Daitouryou Senkyo(J)
|
||||
|| crc == 0x190a3e11 // Be-Bop-Highschool - Koukousei Gokuraku Densetsu(J)
|
||||
|| crc == 0x52449508 // Home Run Nighter - Pennant League!!(J)
|
||||
|| crc == 0x0973f714 // Jangou(J)
|
||||
|| crc == 0x7172f3d4 // Kabushiki Doujou(J)
|
||||
|| crc == 0xa5781280 // Kujaku Ou 2(J)
|
||||
|| crc == 0x8ce9c87b // Money Game, The(J)
|
||||
|| crc == 0xec47296d // Morita Kazuo no Shougi(J)
|
||||
|| crc == 0xcee5857b // Ninjara Hoi!(J)
|
||||
|| crc == 0xe63d9193 // Tanigawa Kouji no Shougi Shinan 3(J)
|
||||
|| crc == 0xd54f5da9 // Tsuppari Wars(J)
|
||||
|| crc == 0x1e0c7ea3)
|
||||
{ // AD&D Dragons of Flame(J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
if (crc == 0x1995ac4e)
|
||||
{ // Ferrari Grand Prix Challenge(J) 無理矢理パッチ(^^;
|
||||
lpPRG[0x1F7AD] = 0xFF;
|
||||
lpPRG[0x1F7BC] = 0x00;
|
||||
}
|
||||
|
||||
if (crc == 0x20d22251)
|
||||
{ // Top rider(J) 無理矢理パッチ(^^;
|
||||
lpPRG[0x1F17E] = 0xEA;
|
||||
lpPRG[0x1F17F] = 0xEA;
|
||||
}
|
||||
|
||||
if (crc == 0x11469ce3)
|
||||
{ // Viva! Las Vegas(J) 無理矢理パッチ(^^;
|
||||
lpCHR[0x0000] = 0x01;
|
||||
}
|
||||
|
||||
if (crc == 0x3fccdc7b)
|
||||
{ // Baseball Star - Mezase Sankanou!!(J) 無理矢理パッチ(^^;
|
||||
lpPRG[0x0F666] = 0x9D;
|
||||
}
|
||||
|
||||
if (crc == 0xdb564628)
|
||||
{ // Mario Open Golf(J)
|
||||
lpPRG[0x30195] = 0xC0;
|
||||
}
|
||||
|
||||
// Mapper 002
|
||||
if (crc == 0x63af202f)
|
||||
{ // JJ - Tobidase Daisakusen Part 2(J)
|
||||
header.control1 &= 0xf6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
|
||||
if (crc == 0x99a62e47)
|
||||
{ // Black Bass 2, The(J)
|
||||
header.control1 &= 0xf6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
|
||||
if (crc == 0x0eaa7515 // Rod Land(J)
|
||||
|| crc == 0x22ab9694)
|
||||
{ // Rod Land(E)
|
||||
header.control1 &= 0xf6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
|
||||
if (crc == 0x2061772a)
|
||||
{ // Tantei Jinguji Taburou Tokino Sugiyukumamani (J)
|
||||
header.control1 &= 0xf6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
|
||||
// Mapper 003
|
||||
if (crc == 0x29401686)
|
||||
{ // Minna no Taabou no Nakayoshi Dai Sakusen(J)
|
||||
// lpPRG[0x2B3E] = 0x60;
|
||||
}
|
||||
if (crc == 0x932a077a)
|
||||
{ // TwinBee(J)
|
||||
mapper = 87;
|
||||
}
|
||||
if (crc == 0x8218c637)
|
||||
{ // Space Hunter(J)
|
||||
// header.control1 &= 0xf6;
|
||||
// header.control1 |= ROM_4SCREEN;
|
||||
header.control1 = (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
if (crc == 0x2bb6a0f8 // Sherlock Holmes - Hakushaku Reijou Yuukai Jiken(J)
|
||||
|| crc == 0x28c11d24 // Sukeban Deka 3(J)
|
||||
|| crc == 0x02863604)
|
||||
{ // Sukeban Deka 3(J)(Alt)
|
||||
header.control1 &= 0xf6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
|
||||
// Mapper 004
|
||||
if (crc == 0x58581770)
|
||||
{ // Rasaaru Ishii no Childs Quest(J)
|
||||
header.control1 &= 0xf6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
if (crc == 0xf3feb3ab // Kunio Kun no Jidaigeki Dayo Zenin Shuugou! (J)
|
||||
|| crc == 0xa524ae9b // Otaku no Seiza - An Adventure in the Otaku Galaxy (J)
|
||||
|| crc == 0x46dc6e57 // SD Gundam - Gachapon Senshi 2 - Capsule Senki (J)
|
||||
|| crc == 0x66b2dec7 // SD Gundam - Gachapon Senshi 3 - Eiyuu Senki (J)
|
||||
|| crc == 0x92b07fd9 // SD Gundam - Gachapon Senshi 4 - New Type Story (J)
|
||||
|| crc == 0x8ee6463a // SD Gundam - Gachapon Senshi 5 - Battle of Universal Century (J)
|
||||
|| crc == 0xaf754426 // Ultraman Club 3 (J)
|
||||
|| crc == 0xfe4e5b11 // Ushio to Tora - Shinen no Daiyou (J)
|
||||
|| crc == 0x57c12c17)
|
||||
{ // Yamamura Misa Suspense - Kyouto Zaiteku Satsujin Jiken (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
if (crc == 0x42e03e4a)
|
||||
{ // RPG Jinsei Game (J)
|
||||
mapper = 118;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
if (crc == 0xfd0299c3)
|
||||
{ // METAL MAX(J)
|
||||
lpPRG[0x3D522] = 0xA9;
|
||||
lpPRG[0x3D523] = 0x19;
|
||||
}
|
||||
if (crc == 0x1d2e5018 // Rockman 3(J)
|
||||
|| crc == 0x6b999aaf)
|
||||
{ // Mega Man 3(U)
|
||||
// lpPRG[0x3C179] = 0xBA;//
|
||||
// lpPRG[0x3C9CC] = 0x9E;
|
||||
}
|
||||
|
||||
// Mapper 005
|
||||
if (crc == 0xe91548d8)
|
||||
{ // Shin 4 Nin Uchi Mahjong - Yakuman Tengoku (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
if (crc == 0x255b129c)
|
||||
{ // Gun Sight (J) / Gun Sight (J)[a1]
|
||||
lpPRG[0x02D0B] = 0x01;
|
||||
lpPRG[0x0BEC0] = 0x01;
|
||||
}
|
||||
|
||||
|
||||
// Mapper 010
|
||||
if (crc == 0xc9cce8f2)
|
||||
{ // Famicom Wars (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 016
|
||||
if (crc == 0x983d8175 // Datach - Battle Rush - Build Up Robot Tournament (J)
|
||||
|| crc == 0x894efdbc // Datach - Crayon Shin Chan - Ora to Poi Poi (J)
|
||||
|| crc == 0x19e81461 // Datach - Dragon Ball Z - Gekitou Tenkaichi Budou Kai (J)
|
||||
|| crc == 0xbe06853f // Datach - J League Super Top Players (J)
|
||||
|| crc == 0x0be0a328 // Datach - SD Gundam - Gundam Wars (J)
|
||||
|| crc == 0x5b457641 // Datach - Ultraman Club - Supokon Fight! (J)
|
||||
|| crc == 0xf51a7f46 // Datach - Yuu Yuu Hakusho - Bakutou Ankoku Bujutsu Kai (J)
|
||||
|| crc == 0x31cd9903 // Dragon Ball Z - Kyoushuu! Saiya Jin (J)
|
||||
|| crc == 0xe49fc53e // Dragon Ball Z 2 - Gekishin Freeza!! (J)
|
||||
|| crc == 0x09499f4d // Dragon Ball Z 3 - Ressen Jinzou Ningen (J)
|
||||
|| crc == 0x2e991109 // Dragon Ball Z Gaiden - Saiya Jin Zetsumetsu Keikaku (J)
|
||||
|| crc == 0x170250de)
|
||||
{ // Rokudenashi Blues(J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 019
|
||||
if (crc == 0x3296ff7a // Battle Fleet (J)
|
||||
|| crc == 0x429fd177 // Famista '90 (J)
|
||||
|| crc == 0xdd454208 // Hydlide 3 - Yami Kara no Houmonsha (J)
|
||||
|| crc == 0xb1b9e187 // Kaijuu Monogatari (J)
|
||||
|| crc == 0xaf15338f)
|
||||
{ // Mindseeker (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 026
|
||||
if (crc == 0x836cc1ab)
|
||||
{ // Mouryou Senki Madara (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 033
|
||||
if (crc == 0x547e6cc1)
|
||||
{ // Flintstones - The Rescue of Dino & Hoppy, The(J)
|
||||
mapper = 48;
|
||||
}
|
||||
|
||||
// Mapper 065
|
||||
if (crc == 0xfd3fc292)
|
||||
{ // Ai Sensei no Oshiete - Watashi no Hoshi (J)
|
||||
mapper = 32;
|
||||
}
|
||||
|
||||
// Mapper 068
|
||||
if (crc == 0xfde79681)
|
||||
{ // Maharaja (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 069
|
||||
if (crc == 0xfeac6916 // Honoo no Toukyuuji - Dodge Danpei 2(J)
|
||||
|| crc == 0x67898319)
|
||||
{ // Barcode World(J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 080
|
||||
if (crc == 0x95aaed34 // Mirai Shinwa Jarvas (J)
|
||||
|| crc == 0x17627d4b)
|
||||
{ // Taito Grand Prix - Eikou heno License (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 082
|
||||
if (crc == 0x4819a595)
|
||||
{ // Kyuukyoku Harikiri Stadium - Heisei Gannen Ban (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 086
|
||||
if (crc == 0xe63f7d0b)
|
||||
{ // Urusei Yatsura - Lum no Wedding Bell(J)
|
||||
mapper = 101;
|
||||
}
|
||||
|
||||
// Mapper 118
|
||||
if (crc == 0x3b0fb600)
|
||||
{ // Ys 3 - Wonderers From Ys (J)
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_SAVERAM;
|
||||
}
|
||||
|
||||
// Mapper 180
|
||||
if (crc == 0xc68363f6)
|
||||
{ // Crazy Climber(J)
|
||||
header.control1 &= 0xf6;
|
||||
}
|
||||
|
||||
// VS-Unisystem
|
||||
if (crc == 0x70901b25)
|
||||
{ // VS Slalom
|
||||
mapper = 99;
|
||||
}
|
||||
|
||||
if (crc == 0xd5d7eac4)
|
||||
{ // VS Dr. Mario
|
||||
mapper = 1;
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
|
||||
if (crc == 0xffbef374 // VS Castlevania
|
||||
|| crc == 0x8c0c2df5)
|
||||
{ // VS Top Gun
|
||||
mapper = 2;
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
|
||||
if (crc == 0xeb2dba63 // VS TKO Boxing
|
||||
|| crc == 0x98cfe016 // VS TKO Boxing (Alt)
|
||||
|| crc == 0x9818f656)
|
||||
{ // VS TKO Boxing (f1)
|
||||
mapper = 4;
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
|
||||
if (crc == 0x135adf7c)
|
||||
{ // VS Atari RBI Baseball
|
||||
mapper = 4;
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
|
||||
if (crc == 0xf9d3b0a3 // VS Super Xevious
|
||||
|| crc == 0x9924980a // VS Super Xevious (b1)
|
||||
|| crc == 0x66bb838f)
|
||||
{ // VS Super Xevious (b2)
|
||||
mapper = 4;
|
||||
header.control1 &= 0xF6;
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
|
||||
if (crc == 0x17ae56be)
|
||||
{ // VS Freedom Force
|
||||
mapper = 4;
|
||||
header.control1 &= 0xF6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_4SCREEN;
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
|
||||
if (crc == 0xe2c0a2be)
|
||||
{ // VS Platoon
|
||||
mapper = 68;
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
|
||||
if (crc == 0xcbe85490 // VS Excitebike
|
||||
|| crc == 0x29155e0c // VS Excitebike (Alt)
|
||||
|| crc == 0xff5135a3)
|
||||
{ // VS Hogan's Alley
|
||||
header.control1 &= 0xF6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_4SCREEN;
|
||||
}
|
||||
|
||||
if (crc == 0x0b65a917)
|
||||
{ // VS Mach Rider(Endurance Course)
|
||||
lpPRG[0x7FDF] = 0xFF;
|
||||
lpPRG[0x7FE4] = 0x00;
|
||||
}
|
||||
|
||||
if (crc == 0x8a6a9848 // VS Mach Rider(Endurance Course)(Alt)
|
||||
|| crc == 0xae8063ef)
|
||||
{ // VS Mach Rider(Japan, Fighting Course)
|
||||
lpPRG[0x7FDD] = 0xFF;
|
||||
lpPRG[0x7FE2] = 0x00;
|
||||
}
|
||||
|
||||
if (crc == 0x16d3f469)
|
||||
{ // VS Ninja Jajamaru Kun (J)
|
||||
header.control1 &= 0xf6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_VMIRROR;
|
||||
}
|
||||
|
||||
if (crc == 0xc99ec059)
|
||||
{ // VS Raid on Bungeling Bay(J)
|
||||
mapper = 99;
|
||||
header.control1 &= 0xF6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_4SCREEN;
|
||||
}
|
||||
if (crc == 0xca85e56d)
|
||||
{ // VS Mighty Bomb Jack(J)
|
||||
mapper = 99;
|
||||
header.control1 &= 0xF6;
|
||||
header.control1 |= (byte)EnumRomControlByte1.ROM_4SCREEN;
|
||||
}
|
||||
|
||||
|
||||
if (crc == 0xeb2dba63 // VS TKO Boxing
|
||||
|| crc == 0x9818f656 // VS TKO Boxing
|
||||
|| crc == 0xed588f00 // VS Duck Hunt
|
||||
|| crc == 0x8c0c2df5 // VS Top Gun
|
||||
|| crc == 0x16d3f469 // VS Ninja Jajamaru Kun
|
||||
|| crc == 0x8850924b // VS Tetris
|
||||
|| crc == 0xcf36261e // VS Sky Kid
|
||||
|| crc == 0xe1aa8214 // VS Star Luster
|
||||
|| crc == 0xec461db9 // VS Pinball
|
||||
|| crc == 0xe528f651 // VS Pinball (alt)
|
||||
|| crc == 0x17ae56be // VS Freedom Force
|
||||
|| crc == 0xe2c0a2be // VS Platoon
|
||||
|| crc == 0xff5135a3 // VS Hogan's Alley
|
||||
|| crc == 0x70901b25 // VS Slalom
|
||||
|| crc == 0x0b65a917 // VS Mach Rider(Endurance Course)
|
||||
|| crc == 0x8a6a9848 // VS Mach Rider(Endurance Course)(Alt)
|
||||
|| crc == 0xae8063ef // VS Mach Rider(Japan, Fighting Course)
|
||||
|| crc == 0xcc2c4b5d // VS Golf
|
||||
|| crc == 0xa93a5aee // VS Stroke and Match Golf
|
||||
|| crc == 0x86167220 // VS Lady Golf
|
||||
|| crc == 0xffbef374 // VS Castlevania
|
||||
|| crc == 0x135adf7c // VS Atari RBI Baseball
|
||||
|| crc == 0xd5d7eac4 // VS Dr. Mario
|
||||
|| crc == 0x46914e3e // VS Soccer
|
||||
|| crc == 0x70433f2c // VS Battle City
|
||||
|| crc == 0x8d15a6e6 // VS bad .nes
|
||||
|| crc == 0x1e438d52 // VS Goonies
|
||||
|| crc == 0xcbe85490 // VS Excitebike
|
||||
|| crc == 0x29155e0c // VS Excitebike (alt)
|
||||
|| crc == 0x07138c06 // VS Clu Clu Land
|
||||
|| crc == 0x43a357ef // VS Ice Climber
|
||||
|| crc == 0x737dd1bf // VS Super Mario Bros
|
||||
|| crc == 0x4bf3972d // VS Super Mario Bros
|
||||
|| crc == 0x8b60cc58 // VS Super Mario Bros
|
||||
|| crc == 0x8192c804 // VS Super Mario Bros
|
||||
|| crc == 0xd99a2087 // VS Gradius
|
||||
|| crc == 0xf9d3b0a3 // VS Super Xevious
|
||||
|| crc == 0x9924980a // VS Super Xevious
|
||||
|| crc == 0x66bb838f // VS Super Xevious
|
||||
|| crc == 0xc99ec059 // VS Raid on Bungeling Bay(J)
|
||||
|| crc == 0xca85e56d)
|
||||
{ // VS Mighty Bomb Jack(J)
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
|
||||
if (mapper == 99 || mapper == 151)
|
||||
{
|
||||
header.control2 |= (byte)EnumRomControlByte2.ROM_VSUNISYSTEM;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 953873ef00535544abd9591708c8e7a5
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,54 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class DISKFILEHDR
|
||||
{
|
||||
public byte[] ID = new byte[12]; // "VirtuaNES DI"
|
||||
public ushort BlockVersion; // 0x0200:0.30 0x0210:0.31
|
||||
public ushort Reserved;
|
||||
public ulong ProgID; // 僾儘僌儔儉ID
|
||||
public ushort MakerID; // 儊乕僇乕ID
|
||||
public ushort DiskNo; // 僨傿僗僋悢
|
||||
public ulong DifferentSize; // 憡堘悢
|
||||
|
||||
|
||||
public byte[] ToBytes()
|
||||
{
|
||||
byte[] res = new byte[36];
|
||||
Array.Copy(ID, res, ID.Length);
|
||||
var temp = BitConverter.GetBytes(BlockVersion);
|
||||
res[12] = temp[0];
|
||||
res[13] = temp[1];
|
||||
temp = BitConverter.GetBytes(Reserved);
|
||||
res[14] = temp[0];
|
||||
res[15] = temp[1];
|
||||
temp = BitConverter.GetBytes(ProgID);
|
||||
res[16] = temp[0];
|
||||
res[17] = temp[1];
|
||||
res[18] = temp[2];
|
||||
res[19] = temp[3];
|
||||
res[20] = temp[4];
|
||||
res[21] = temp[5];
|
||||
res[22] = temp[6];
|
||||
res[23] = temp[7];
|
||||
temp = BitConverter.GetBytes(MakerID);
|
||||
res[24] = temp[0];
|
||||
res[25] = temp[1];
|
||||
temp = BitConverter.GetBytes(DiskNo);
|
||||
res[26] = temp[0];
|
||||
res[27] = temp[1];
|
||||
temp = BitConverter.GetBytes(ProgID);
|
||||
res[28] = temp[0];
|
||||
res[29] = temp[1];
|
||||
res[30] = temp[2];
|
||||
res[31] = temp[3];
|
||||
res[32] = temp[4];
|
||||
res[33] = temp[5];
|
||||
res[34] = temp[6];
|
||||
res[35] = temp[7];
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 447095b8c8ae4c74885562c127998e9e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,28 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace VirtualNes.Core.Debug
|
||||
{
|
||||
public static class Debuger
|
||||
{
|
||||
private static IDebugerImpl s_debuger;
|
||||
public static void Setup(IDebugerImpl debuger)
|
||||
{
|
||||
s_debuger = debuger;
|
||||
}
|
||||
public static void Log(string message)
|
||||
{
|
||||
s_debuger.Log(message);
|
||||
}
|
||||
|
||||
public static void LogError(string message)
|
||||
{
|
||||
s_debuger.LogError(message);
|
||||
}
|
||||
}
|
||||
|
||||
public interface IDebugerImpl
|
||||
{
|
||||
void Log(string message);
|
||||
void LogError(string message);
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7dbca4403bc49f347a8b36f230364226
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,247 +0,0 @@
|
||||
using System;
|
||||
using VirtualNes.Core;
|
||||
|
||||
namespace VirtualNes
|
||||
{
|
||||
public static class MMU
|
||||
{
|
||||
// CPU 儊儌儕僶儞僋
|
||||
public static ArrayRef<byte>[] CPU_MEM_BANK = new ArrayRef<byte>[8]; // 8K扨埵
|
||||
public static byte[] CPU_MEM_TYPE = new byte[8];
|
||||
public static int[] CPU_MEM_PAGE = new int[8]; // 僗僥乕僩僙乕僽梡
|
||||
// PPU 儊儌儕僶儞僋
|
||||
public static ArrayRef<byte>[] PPU_MEM_BANK = new ArrayRef<byte>[12]; // 1K扨埵
|
||||
public static byte[] PPU_MEM_TYPE = new byte[12];
|
||||
public static int[] PPU_MEM_PAGE = new int[12]; // 僗僥乕僩僙乕僽梡
|
||||
public static byte[] CRAM_USED = new byte[16]; // 僗僥乕僩僙乕僽梡
|
||||
|
||||
// NES儊儌儕
|
||||
public static byte[] RAM = new byte[8 * 1024]; // NES撪憻RAM
|
||||
public static byte[] WRAM = new byte[128 * 1024]; // 儚乕僋/僶僢僋傾僢僾RAM
|
||||
public static byte[] DRAM = new byte[40 * 1024]; // 僨傿僗僋僔僗僥儉RAM
|
||||
public static byte[] XRAM = new byte[8 * 1024]; // 僟儈乕僶儞僋
|
||||
public static byte[] ERAM = new byte[32 * 1024]; // 奼挘婡婍梡RAM
|
||||
|
||||
public static byte[] CRAM = new byte[32 * 1024]; // 僉儍儔僋僞僷僞乕儞RAM
|
||||
public static byte[] VRAM = new byte[4 * 1024]; // 僱乕儉僥乕僽儖/傾僩儕價儏乕僩RAM
|
||||
|
||||
public static byte[] SPRAM = new byte[0x100]; // 僗僾儔僀僩RAM
|
||||
public static byte[] BGPAL = new byte[0x10]; // BG僷儗僢僩
|
||||
public static byte[] SPPAL = new byte[0x10]; // SP僷儗僢僩
|
||||
// 儗僕僗僞
|
||||
public static byte[] CPUREG = new byte[0x18]; // Nes $4000-$4017
|
||||
public static byte[] PPUREG = new byte[0x04]; // Nes $2000-$2003
|
||||
|
||||
// PPU撪晹儗僕僗僞
|
||||
public static byte PPU56Toggle; // $2005-$2006 Toggle
|
||||
public static byte PPU7_Temp; // $2007 read buffer
|
||||
public static ushort loopy_t; // same as $2005/$2006
|
||||
public static ushort loopy_v; // same as $2005/$2006
|
||||
public static ushort loopy_x; // tile x offset
|
||||
|
||||
// ROM僨乕僞億僀儞僞
|
||||
public static byte[] PROM; // PROM ptr
|
||||
public static byte[] VROM; // VROM ptr
|
||||
|
||||
// For dis...
|
||||
public static byte PROM_ACCESS;
|
||||
|
||||
// ROM 僶儞僋僒僀僘
|
||||
public static int PROM_8K_SIZE, PROM_16K_SIZE, PROM_32K_SIZE;
|
||||
public static int VROM_1K_SIZE, VROM_2K_SIZE, VROM_4K_SIZE, VROM_8K_SIZE;
|
||||
|
||||
// 儊儌儕僞僀僾
|
||||
// For PROM (CPU)
|
||||
public const byte BANKTYPE_ROM = 0x00;
|
||||
public const byte BANKTYPE_RAM = 0xFF;
|
||||
public const byte BANKTYPE_DRAM = 0x01;
|
||||
public const byte BANKTYPE_MAPPER = 0x80;
|
||||
// For VROM/VRAM=/CRAM (PPU)
|
||||
public const byte BANKTYPE_VROM = 0x00;
|
||||
public const byte BANKTYPE_CRAM = 0x01;
|
||||
public const byte BANKTYPE_VRAM = 0x80;
|
||||
|
||||
// 儈儔乕僞僀僾
|
||||
public const byte VRAM_HMIRROR = 0x00; // Horizontal
|
||||
public const byte VRAM_VMIRROR = 0x01; // Virtical
|
||||
public const byte VRAM_MIRROR4 = 0x02; // All screen
|
||||
public const byte VRAM_MIRROR4L = 0x03; // PA10 L屌掕 $2000-$23FF偺儈儔乕
|
||||
public const byte VRAM_MIRROR4H = 0x04; // PA10 H屌掕 $2400-$27FF偺儈儔乕
|
||||
|
||||
// Frame-IRQ儗僕僗僞($4017)
|
||||
public static int FrameIRQ;
|
||||
|
||||
internal static void SetPROM_Bank(byte page, byte[] ptr, byte type)
|
||||
{
|
||||
CPU_MEM_BANK[page] = new ArrayRef<byte>(ptr, 0, ptr.Length);
|
||||
CPU_MEM_TYPE[page] = type;
|
||||
CPU_MEM_PAGE[page] = 0;
|
||||
}
|
||||
|
||||
internal static void SetPROM_Bank(byte page, ArrayRef<byte> ptr, byte type)
|
||||
{
|
||||
CPU_MEM_BANK[page] = ptr;
|
||||
CPU_MEM_TYPE[page] = type;
|
||||
CPU_MEM_PAGE[page] = 0;
|
||||
}
|
||||
|
||||
internal static void SetPROM_8K_Bank(byte page, int bank)
|
||||
{
|
||||
bank %= PROM_8K_SIZE;
|
||||
CPU_MEM_BANK[page] = new ArrayRef<byte>(MMU.PROM, 0x2000 * bank, MMU.PROM.Length - 0x2000 * bank);
|
||||
CPU_MEM_TYPE[page] = BANKTYPE_ROM;
|
||||
CPU_MEM_PAGE[page] = bank;
|
||||
}
|
||||
|
||||
internal static void SetPROM_16K_Bank(byte page, int bank)
|
||||
{
|
||||
SetPROM_8K_Bank((byte)(page + 0), bank * 2 + 0);
|
||||
SetPROM_8K_Bank((byte)(page + 1), bank * 2 + 1);
|
||||
}
|
||||
|
||||
internal static void SetPROM_32K_Bank(int bank)
|
||||
{
|
||||
SetPROM_8K_Bank(4, bank * 4 + 0);
|
||||
SetPROM_8K_Bank(5, bank * 4 + 1);
|
||||
SetPROM_8K_Bank(6, bank * 4 + 2);
|
||||
SetPROM_8K_Bank(7, bank * 4 + 3);
|
||||
}
|
||||
|
||||
internal static void SetPROM_32K_Bank(int bank0, int bank1, int bank2, int bank3)
|
||||
{
|
||||
SetPROM_8K_Bank(4, bank0);
|
||||
SetPROM_8K_Bank(5, bank1);
|
||||
SetPROM_8K_Bank(6, bank2);
|
||||
SetPROM_8K_Bank(7, bank3);
|
||||
}
|
||||
|
||||
// PPU VROM bank
|
||||
internal static void SetVROM_Bank(byte page, ArrayRef<byte> ptr, byte type)
|
||||
{
|
||||
PPU_MEM_BANK[page] = ptr;
|
||||
PPU_MEM_TYPE[page] = type;
|
||||
PPU_MEM_PAGE[page] = 0;
|
||||
}
|
||||
|
||||
internal static void SetVROM_1K_Bank(byte page, int bank)
|
||||
{
|
||||
bank %= VROM_1K_SIZE;
|
||||
PPU_MEM_BANK[page] = new ArrayRef<byte>(VROM, 0x0400 * bank, VROM.Length - (0x0400 * bank));
|
||||
PPU_MEM_TYPE[page] = BANKTYPE_VROM;
|
||||
PPU_MEM_PAGE[page] = bank;
|
||||
}
|
||||
|
||||
internal static void SetVROM_2K_Bank(byte page, int bank)
|
||||
{
|
||||
SetVROM_1K_Bank((byte)(page + 0), bank * 2 + 0);
|
||||
SetVROM_1K_Bank((byte)(page + 1), bank * 2 + 1);
|
||||
}
|
||||
|
||||
internal static void SetVROM_4K_Bank(byte page, int bank)
|
||||
{
|
||||
SetVROM_1K_Bank((byte)(page + 0), bank * 4 + 0);
|
||||
SetVROM_1K_Bank((byte)(page + 1), bank * 4 + 1);
|
||||
SetVROM_1K_Bank((byte)(page + 2), bank * 4 + 2);
|
||||
SetVROM_1K_Bank((byte)(page + 3), bank * 4 + 3);
|
||||
}
|
||||
|
||||
internal static void SetVROM_8K_Bank(int bank)
|
||||
{
|
||||
for (byte i = 0; i < 8; i++)
|
||||
{
|
||||
SetVROM_1K_Bank(i, bank * 8 + i);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SetVROM_8K_Bank(int bank0, int bank1, int bank2, int bank3,
|
||||
int bank4, int bank5, int bank6, int bank7)
|
||||
{
|
||||
SetVROM_1K_Bank(0, bank0);
|
||||
SetVROM_1K_Bank(1, bank1);
|
||||
SetVROM_1K_Bank(2, bank2);
|
||||
SetVROM_1K_Bank(3, bank3);
|
||||
SetVROM_1K_Bank(4, bank4);
|
||||
SetVROM_1K_Bank(5, bank5);
|
||||
SetVROM_1K_Bank(6, bank6);
|
||||
SetVROM_1K_Bank(7, bank7);
|
||||
}
|
||||
|
||||
internal static void SetCRAM_1K_Bank(byte page, int bank)
|
||||
{
|
||||
bank &= 0x1F;
|
||||
PPU_MEM_BANK[page] = new ArrayRef<byte>(MMU.CRAM, 0x0400 * bank, MMU.CRAM.Length - 0x0400 * bank);
|
||||
PPU_MEM_TYPE[page] = BANKTYPE_CRAM;
|
||||
PPU_MEM_PAGE[page] = bank;
|
||||
|
||||
CRAM_USED[bank >> 2] = 0xFF; // CRAM巊梡僼儔僌
|
||||
}
|
||||
|
||||
internal static void SetCRAM_2K_Bank(byte page, int bank)
|
||||
{
|
||||
SetCRAM_1K_Bank((byte)(page + 0), bank * 2 + 0);
|
||||
SetCRAM_1K_Bank((byte)(page + 1), bank * 2 + 1);
|
||||
}
|
||||
|
||||
internal static void SetCRAM_4K_Bank(byte page, int bank)
|
||||
{
|
||||
SetCRAM_1K_Bank((byte)(page + 0), bank * 4 + 0);
|
||||
SetCRAM_1K_Bank((byte)(page + 1), bank * 4 + 1);
|
||||
SetCRAM_1K_Bank((byte)(page + 2), bank * 4 + 2);
|
||||
SetCRAM_1K_Bank((byte)(page + 3), bank * 4 + 3);
|
||||
}
|
||||
|
||||
internal static void SetCRAM_8K_Bank(int bank)
|
||||
{
|
||||
for (byte i = 0; i < 8; i++)
|
||||
{
|
||||
SetCRAM_1K_Bank(i, bank * 8 + 1);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SetVRAM_1K_Bank(byte page, int bank)
|
||||
{
|
||||
bank &= 3;
|
||||
PPU_MEM_BANK[page] = new ArrayRef<byte>(VRAM, 0x0400 * bank, VRAM.Length - 0x0400 * bank);
|
||||
PPU_MEM_TYPE[page] = BANKTYPE_VRAM;
|
||||
PPU_MEM_PAGE[page] = bank;
|
||||
}
|
||||
|
||||
internal static void SetVRAM_Bank(int bank0, int bank1, int bank2, int bank3)
|
||||
{
|
||||
SetVRAM_1K_Bank(8, bank0);
|
||||
SetVRAM_1K_Bank(9, bank1);
|
||||
SetVRAM_1K_Bank(10, bank2);
|
||||
SetVRAM_1K_Bank(11, bank3);
|
||||
}
|
||||
|
||||
internal static void SetVRAM_Mirror(int type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case VRAM_HMIRROR:
|
||||
SetVRAM_Bank(0, 0, 1, 1);
|
||||
break;
|
||||
case VRAM_VMIRROR:
|
||||
SetVRAM_Bank(0, 1, 0, 1);
|
||||
break;
|
||||
case VRAM_MIRROR4L:
|
||||
SetVRAM_Bank(0, 0, 0, 0);
|
||||
break;
|
||||
case VRAM_MIRROR4H:
|
||||
SetVRAM_Bank(1, 1, 1, 1);
|
||||
break;
|
||||
case VRAM_MIRROR4:
|
||||
SetVRAM_Bank(0, 1, 2, 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SetVRAM_Mirror(int bank0, int bank1, int bank2, int bank3)
|
||||
{
|
||||
SetVRAM_1K_Bank(8, bank0);
|
||||
SetVRAM_1K_Bank(9, bank1);
|
||||
SetVRAM_1K_Bank(10, bank2);
|
||||
SetVRAM_1K_Bank(11, bank3);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 863989820a4fb1d49a7c0c883c5a7078
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 351e90d17a844b44f869f7c59fd1efb6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,455 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
|
||||
|
||||
public class X24C01
|
||||
{
|
||||
public const int X24C01_IDLE = 0; // Idle
|
||||
public const int X24C01_ADDRESS = 1; // Address set
|
||||
public const int X24C01_READ = 2; // Read
|
||||
public const int X24C01_WRITE = 3; // Write
|
||||
public const int X24C01_ACK = 4; // Acknowledge
|
||||
public const int X24C01_ACK_WAIT = 5; // Acknowledge wait
|
||||
|
||||
int now_state, next_state;
|
||||
int bitcnt;
|
||||
byte addr, data;
|
||||
byte sda;
|
||||
byte scl_old, sda_old;
|
||||
|
||||
ArrayRef<byte> pEEPDATA;
|
||||
|
||||
public X24C01()
|
||||
{
|
||||
now_state = X24C01_IDLE;
|
||||
next_state = X24C01_IDLE;
|
||||
addr = 0;
|
||||
data = 0;
|
||||
sda = 0xFF;
|
||||
scl_old = 0;
|
||||
sda_old = 0;
|
||||
|
||||
pEEPDATA = null;
|
||||
}
|
||||
|
||||
public void Reset(ArrayRef<byte> ptr)
|
||||
{
|
||||
now_state = X24C01_IDLE;
|
||||
next_state = X24C01_IDLE;
|
||||
addr = 0;
|
||||
data = 0;
|
||||
sda = 0xFF;
|
||||
scl_old = 0;
|
||||
sda_old = 0;
|
||||
|
||||
pEEPDATA = ptr;
|
||||
}
|
||||
|
||||
public void Write(byte scl_in, byte sda_in)
|
||||
{
|
||||
// Clock line
|
||||
byte scl_rise = (byte)(~scl_old & scl_in);
|
||||
byte scl_fall = (byte)(scl_old & ~scl_in);
|
||||
// Data line
|
||||
byte sda_rise = (byte)(~sda_old & sda_in);
|
||||
byte sda_fall = (byte)(sda_old & ~sda_in);
|
||||
|
||||
byte scl_old_temp = scl_old;
|
||||
byte sda_old_temp = sda_old;
|
||||
|
||||
scl_old = scl_in;
|
||||
sda_old = sda_in;
|
||||
|
||||
// Start condition?
|
||||
if (scl_old_temp != 0 && sda_fall != 0)
|
||||
{
|
||||
now_state = X24C01_ADDRESS;
|
||||
bitcnt = 0;
|
||||
addr = 0;
|
||||
sda = 0xFF;
|
||||
return;
|
||||
}
|
||||
|
||||
// Stop condition?
|
||||
if (scl_old_temp != 0 && sda_rise != 0)
|
||||
{
|
||||
now_state = X24C01_IDLE;
|
||||
sda = 0xFF;
|
||||
return;
|
||||
}
|
||||
|
||||
// SCL ____---- RISE
|
||||
if (scl_rise != 0)
|
||||
{
|
||||
switch (now_state)
|
||||
{
|
||||
case X24C01_ADDRESS:
|
||||
if (bitcnt < 7)
|
||||
{
|
||||
// 本来はMSB->LSB
|
||||
addr = (byte)(addr & (~(1 << bitcnt)));
|
||||
addr = (byte)(addr | ((sda_in != 0 ? 1 : 0) << bitcnt));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (sda_in != 0)
|
||||
{
|
||||
next_state = X24C01_READ;
|
||||
data = pEEPDATA[addr & 0x7F];
|
||||
}
|
||||
else
|
||||
{
|
||||
next_state = X24C01_WRITE;
|
||||
}
|
||||
}
|
||||
bitcnt++;
|
||||
break;
|
||||
case X24C01_ACK:
|
||||
sda = 0; // ACK
|
||||
break;
|
||||
case X24C01_READ:
|
||||
if (bitcnt < 8)
|
||||
{
|
||||
// 本来はMSB->LSB
|
||||
sda = (byte)((data & (1 << bitcnt)) != 0 ? 1 : 0);
|
||||
}
|
||||
bitcnt++;
|
||||
break;
|
||||
case X24C01_WRITE:
|
||||
if (bitcnt < 8)
|
||||
{
|
||||
// 本来はMSB->LSB
|
||||
data = (byte)(data & (~(1 << bitcnt)));
|
||||
data = (byte)(data | ((sda_in != 0 ? 1 : 0) << bitcnt));
|
||||
}
|
||||
bitcnt++;
|
||||
break;
|
||||
|
||||
case X24C01_ACK_WAIT:
|
||||
if (sda_in == 0)
|
||||
{
|
||||
next_state = X24C01_IDLE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// SCL ----____ FALL
|
||||
if (scl_fall != 0)
|
||||
{
|
||||
switch (now_state)
|
||||
{
|
||||
case X24C01_ADDRESS:
|
||||
if (bitcnt >= 8)
|
||||
{
|
||||
now_state = X24C01_ACK;
|
||||
sda = 0xFF;
|
||||
}
|
||||
break;
|
||||
case X24C01_ACK:
|
||||
now_state = next_state;
|
||||
bitcnt = 0;
|
||||
sda = 0xFF;
|
||||
break;
|
||||
case X24C01_READ:
|
||||
if (bitcnt >= 8)
|
||||
{
|
||||
now_state = X24C01_ACK_WAIT;
|
||||
addr = (byte)((addr + 1) & 0x7F);
|
||||
}
|
||||
break;
|
||||
case X24C01_WRITE:
|
||||
if (bitcnt >= 8)
|
||||
{
|
||||
now_state = X24C01_ACK;
|
||||
next_state = X24C01_IDLE;
|
||||
pEEPDATA[addr & 0x7F] = data;
|
||||
addr = (byte)((addr + 1) & 0x7F);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte Read()
|
||||
{
|
||||
return sda;
|
||||
}
|
||||
|
||||
public void Load(byte[] p)
|
||||
{
|
||||
//now_state = *((INT*)&p[0]);
|
||||
//next_state = *((INT*)&p[4]);
|
||||
//bitcnt = *((INT*)&p[8]);
|
||||
//addr = p[12];
|
||||
//data = p[13];
|
||||
//sda = p[14];
|
||||
//scl_old = p[15];
|
||||
//sda_old = p[16];
|
||||
}
|
||||
|
||||
public void Save(byte[] p)
|
||||
{
|
||||
//*((INT*)&p[0]) = now_state;
|
||||
//*((INT*)&p[4]) = next_state;
|
||||
//*((INT*)&p[8]) = bitcnt;
|
||||
//p[12] = addr;
|
||||
//p[13] = data;
|
||||
//p[14] = sda;
|
||||
//p[15] = scl_old;
|
||||
//p[16] = sda_old;
|
||||
}
|
||||
}
|
||||
|
||||
public class X24C02
|
||||
{
|
||||
public const int X24C02_IDLE = 0; // Idle
|
||||
public const int X24C02_DEVADDR = 1; // Device address set
|
||||
public const int X24C02_ADDRESS = 2; // Address set
|
||||
public const int X24C02_READ = 3; // Read
|
||||
public const int X24C02_WRITE = 4; // Write
|
||||
public const int X24C02_ACK = 5; // Acknowledge
|
||||
public const int X24C02_NAK = 6; // Not Acknowledge
|
||||
public const int X24C02_ACK_WAIT = 7; // Acknowledge wait
|
||||
|
||||
int now_state, next_state;
|
||||
int bitcnt;
|
||||
byte addr, data, rw;
|
||||
byte sda;
|
||||
byte scl_old, sda_old;
|
||||
|
||||
ArrayRef<byte> pEEPDATA;
|
||||
|
||||
public X24C02()
|
||||
{
|
||||
now_state = X24C02_IDLE;
|
||||
next_state = X24C02_IDLE;
|
||||
addr = 0;
|
||||
data = 0;
|
||||
rw = 0;
|
||||
sda = 0xFF;
|
||||
scl_old = 0;
|
||||
sda_old = 0;
|
||||
|
||||
pEEPDATA = null;
|
||||
}
|
||||
|
||||
public void Reset(ArrayRef<byte> ptr)
|
||||
{
|
||||
now_state = X24C02_IDLE;
|
||||
next_state = X24C02_IDLE;
|
||||
addr = 0;
|
||||
data = 0;
|
||||
rw = 0;
|
||||
sda = 0xFF;
|
||||
scl_old = 0;
|
||||
sda_old = 0;
|
||||
|
||||
pEEPDATA = ptr;
|
||||
}
|
||||
|
||||
public void Write(byte scl_in, byte sda_in)
|
||||
{
|
||||
// Clock line
|
||||
byte scl_rise = (byte)(~scl_old & scl_in);
|
||||
byte scl_fall = (byte)(scl_old & ~scl_in);
|
||||
// Data line
|
||||
byte sda_rise = (byte)(~sda_old & sda_in);
|
||||
byte sda_fall = (byte)(sda_old & ~sda_in);
|
||||
|
||||
byte scl_old_temp = scl_old;
|
||||
byte sda_old_temp = sda_old;
|
||||
|
||||
scl_old = scl_in;
|
||||
sda_old = sda_in;
|
||||
|
||||
// Start condition?
|
||||
if (scl_old_temp != 0 && sda_fall != 0)
|
||||
{
|
||||
now_state = X24C02_DEVADDR;
|
||||
bitcnt = 0;
|
||||
sda = 0xFF;
|
||||
return;
|
||||
}
|
||||
|
||||
// Stop condition?
|
||||
if (scl_old_temp != 0 && sda_rise != 0)
|
||||
{
|
||||
now_state = X24C02_IDLE;
|
||||
sda = 0xFF;
|
||||
return;
|
||||
}
|
||||
|
||||
// SCL ____---- RISE
|
||||
if (scl_rise != 0)
|
||||
{
|
||||
switch (now_state)
|
||||
{
|
||||
case X24C02_DEVADDR:
|
||||
if (bitcnt < 8)
|
||||
{
|
||||
data = (byte)(data & (~(1 << (7 - bitcnt))));
|
||||
data = (byte)(data | ((sda_in != 0 ? 1 : 0) << (7 - bitcnt)));
|
||||
}
|
||||
bitcnt++;
|
||||
break;
|
||||
case X24C02_ADDRESS:
|
||||
if (bitcnt < 8)
|
||||
{
|
||||
addr = (byte)(addr & (~(1 << (7 - bitcnt))));
|
||||
addr = (byte)(addr | ((sda_in != 0 ? 1 : 0) << (7 - bitcnt)));
|
||||
}
|
||||
bitcnt++;
|
||||
break;
|
||||
case X24C02_READ:
|
||||
if (bitcnt < 8)
|
||||
{
|
||||
sda = (byte)((data & (1 << (7 - bitcnt))) != 0 ? 1 : 0);
|
||||
}
|
||||
bitcnt++;
|
||||
break;
|
||||
case X24C02_WRITE:
|
||||
if (bitcnt < 8)
|
||||
{
|
||||
data = (byte)(data & (~(1 << (7 - bitcnt))));
|
||||
data = (byte)(data | ((sda_in != 0 ? 1 : 0) << (7 - bitcnt)));
|
||||
}
|
||||
bitcnt++;
|
||||
break;
|
||||
case X24C02_NAK:
|
||||
sda = 0xFF; // NAK
|
||||
break;
|
||||
case X24C02_ACK:
|
||||
sda = 0; // ACK
|
||||
break;
|
||||
case X24C02_ACK_WAIT:
|
||||
if (sda_in == 0)
|
||||
{
|
||||
next_state = X24C02_READ;
|
||||
data = pEEPDATA[addr];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// SCL ----____ FALL
|
||||
if (scl_fall != 0)
|
||||
{
|
||||
switch (now_state)
|
||||
{
|
||||
case X24C02_DEVADDR:
|
||||
if (bitcnt >= 8)
|
||||
{
|
||||
if ((data & 0xA0) == 0xA0)
|
||||
{
|
||||
now_state = X24C02_ACK;
|
||||
rw = (byte)(data & 0x01);
|
||||
sda = 0xFF;
|
||||
if (rw != 0)
|
||||
{
|
||||
// Now address read
|
||||
next_state = X24C02_READ;
|
||||
data = pEEPDATA[addr];
|
||||
}
|
||||
else
|
||||
{
|
||||
next_state = X24C02_ADDRESS;
|
||||
}
|
||||
bitcnt = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
now_state = X24C02_NAK;
|
||||
next_state = X24C02_IDLE;
|
||||
sda = 0xFF;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case X24C02_ADDRESS:
|
||||
if (bitcnt >= 8)
|
||||
{
|
||||
now_state = X24C02_ACK;
|
||||
sda = 0xFF;
|
||||
if (rw != 0)
|
||||
{
|
||||
// Readでは絶対来ないが念の為
|
||||
next_state = X24C02_IDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// to Data Write
|
||||
next_state = X24C02_WRITE;
|
||||
}
|
||||
bitcnt = 0;
|
||||
}
|
||||
break;
|
||||
case X24C02_READ:
|
||||
if (bitcnt >= 8)
|
||||
{
|
||||
now_state = X24C02_ACK_WAIT;
|
||||
addr = (byte)((addr + 1) & 0xFF);
|
||||
}
|
||||
break;
|
||||
case X24C02_WRITE:
|
||||
if (bitcnt >= 8)
|
||||
{
|
||||
pEEPDATA[addr] = data;
|
||||
now_state = X24C02_ACK;
|
||||
next_state = X24C02_WRITE;
|
||||
addr = (byte)((addr + 1) & 0xFF);
|
||||
bitcnt = 0;
|
||||
}
|
||||
break;
|
||||
case X24C02_NAK:
|
||||
now_state = X24C02_IDLE;
|
||||
bitcnt = 0;
|
||||
sda = 0xFF;
|
||||
break;
|
||||
case X24C02_ACK:
|
||||
now_state = next_state;
|
||||
bitcnt = 0;
|
||||
sda = 0xFF;
|
||||
break;
|
||||
case X24C02_ACK_WAIT:
|
||||
now_state = next_state;
|
||||
bitcnt = 0;
|
||||
sda = 0xFF;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte Read()
|
||||
{
|
||||
return sda;
|
||||
}
|
||||
|
||||
public void Load(byte[] p)
|
||||
{
|
||||
//now_state = *((INT*)&p[0]);
|
||||
//next_state = *((INT*)&p[4]);
|
||||
//bitcnt = *((INT*)&p[8]);
|
||||
//addr = p[12];
|
||||
//data = p[13];
|
||||
//rw = p[14];
|
||||
//sda = p[15];
|
||||
//scl_old = p[16];
|
||||
//sda_old = p[17];
|
||||
}
|
||||
|
||||
public void Save(byte[] p)
|
||||
{
|
||||
//*((INT*)&p[0]) = now_state;
|
||||
//*((INT*)&p[4]) = next_state;
|
||||
//*((INT*)&p[8]) = bitcnt;
|
||||
//p[12] = addr;
|
||||
//p[13] = data;
|
||||
//p[14] = rw;
|
||||
//p[15] = sda;
|
||||
//p[16] = scl_old;
|
||||
//p[17] = sda_old;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: be5901dc72f4b6045a7c33edba28145f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,247 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public abstract class Mapper
|
||||
{
|
||||
protected NES nes;
|
||||
|
||||
public Mapper(NES parent)
|
||||
{
|
||||
nes = parent;
|
||||
}
|
||||
|
||||
public virtual void Dispose() { }
|
||||
|
||||
public abstract void Reset();
|
||||
|
||||
// $8000-$FFFF Memory write
|
||||
public virtual void Write(ushort addr, byte data) { }
|
||||
// $8000-$FFFF Memory read(Dummy)
|
||||
public virtual void Read(ushort addr, byte data) { }
|
||||
|
||||
// $4100-$7FFF Lower Memory read/write
|
||||
public virtual byte ReadLow(ushort addr)
|
||||
{
|
||||
// $6000-$7FFF WRAM
|
||||
if (addr >= 0x6000 && addr <= 0x7FFF)
|
||||
{
|
||||
return MMU.CPU_MEM_BANK[addr >> 13][addr & 0x1FFF];
|
||||
}
|
||||
|
||||
return (byte)(addr >> 8);
|
||||
}
|
||||
public virtual void WriteLow(ushort addr, byte data)
|
||||
{
|
||||
if (addr >= 0x6000 && addr <= 0x7FFF)
|
||||
{
|
||||
MMU.CPU_MEM_BANK[addr >> 13][addr & 0x1FFF] = data;
|
||||
}
|
||||
}
|
||||
|
||||
// $4018-$40FF Extention register read/write
|
||||
public virtual byte ExRead(ushort addr) { return 0x00; }
|
||||
public virtual void ExWrite(ushort addr, byte data) { }
|
||||
|
||||
public virtual byte ExCmdRead(EXCMDRD cmd) { return 0x00; }
|
||||
public virtual void ExCmdWrite(EXCMDWR cmd, byte data) { }
|
||||
|
||||
// H sync/V sync/Clock sync
|
||||
public virtual void HSync(int scanline) { }
|
||||
public virtual void VSync() { }
|
||||
public virtual void Clock(int cycles) { }
|
||||
// PPU address bus latch
|
||||
public virtual void PPU_Latch(ushort addr) { }
|
||||
// PPU Character latch
|
||||
public virtual void PPU_ChrLatch(ushort addr) { }
|
||||
// PPU Extension character/palette
|
||||
public virtual void PPU_ExtLatchX(int x) { }
|
||||
public virtual void PPU_ExtLatch(ushort addr, ref byte chr_l, ref byte chr_h, ref byte attr) { }
|
||||
// For State save
|
||||
public virtual bool IsStateSave() { return false; }
|
||||
public virtual void SaveState(byte[] p) { }
|
||||
public virtual void LoadState(byte[] p) { }
|
||||
|
||||
// Extension commands
|
||||
// For ExCmdRead command
|
||||
public enum EXCMDRD
|
||||
{
|
||||
EXCMDRD_NONE = 0,
|
||||
EXCMDRD_DISKACCESS,
|
||||
}
|
||||
// For ExCmdWrite command
|
||||
public enum EXCMDWR
|
||||
{
|
||||
EXCMDWR_NONE = 0,
|
||||
EXCMDWR_DISKINSERT,
|
||||
EXCMDWR_DISKEJECT,
|
||||
}
|
||||
|
||||
public static Mapper CreateMapper(NES parent, int no)
|
||||
{
|
||||
//todo : 实现加载mapper
|
||||
switch (no)
|
||||
{
|
||||
case 0: return new Mapper000(parent);
|
||||
case 1: return new Mapper001(parent);
|
||||
case 2: return new Mapper002(parent);
|
||||
case 3: return new Mapper003(parent);
|
||||
case 4: return new Mapper004(parent);
|
||||
case 5: return new Mapper005(parent);
|
||||
case 6: return new Mapper006(parent);
|
||||
case 7: return new Mapper007(parent);
|
||||
case 8: return new Mapper008(parent);
|
||||
case 9: return new Mapper009(parent);
|
||||
case 10: return new Mapper010(parent);
|
||||
case 11: return new Mapper011(parent);
|
||||
case 12: return new Mapper012(parent);
|
||||
case 13: return new Mapper013(parent);
|
||||
case 15: return new Mapper015(parent);
|
||||
case 16: return new Mapper016(parent);
|
||||
case 17: return new Mapper017(parent);
|
||||
case 18: return new Mapper018(parent);
|
||||
case 19: return new Mapper019(parent);
|
||||
case 21: return new Mapper021(parent);
|
||||
case 22: return new Mapper022(parent);
|
||||
case 23: return new Mapper023(parent);
|
||||
case 24: return new Mapper024(parent);
|
||||
case 25: return new Mapper025(parent);
|
||||
case 26: return new Mapper026(parent);
|
||||
case 27: return new Mapper027(parent);
|
||||
case 32: return new Mapper032(parent);
|
||||
case 33: return new Mapper033(parent);
|
||||
case 34: return new Mapper034(parent);
|
||||
case 35: return new Mapper035(parent);
|
||||
case 40: return new Mapper040(parent);
|
||||
case 41: return new Mapper041(parent);
|
||||
case 42: return new Mapper042(parent);
|
||||
case 43: return new Mapper043(parent);
|
||||
case 44: return new Mapper044(parent);
|
||||
case 45: return new Mapper045(parent);
|
||||
case 46: return new Mapper046(parent);
|
||||
case 47: return new Mapper047(parent);
|
||||
case 48: return new Mapper048(parent);
|
||||
case 50: return new Mapper050(parent);
|
||||
case 51: return new Mapper051(parent);
|
||||
case 57: return new Mapper057(parent);
|
||||
case 58: return new Mapper058(parent);
|
||||
case 60: return new Mapper060(parent);
|
||||
case 61: return new Mapper061(parent);
|
||||
case 62: return new Mapper062(parent);
|
||||
case 64: return new Mapper064(parent);
|
||||
case 65: return new Mapper065(parent);
|
||||
case 66: return new Mapper066(parent);
|
||||
case 67: return new Mapper067(parent);
|
||||
case 68: return new Mapper068(parent);
|
||||
case 69: return new Mapper069(parent);
|
||||
case 70: return new Mapper070(parent);
|
||||
case 71: return new Mapper071(parent);
|
||||
case 72: return new Mapper072(parent);
|
||||
case 73: return new Mapper073(parent);
|
||||
case 74: return new Mapper074(parent);
|
||||
case 75: return new Mapper075(parent);
|
||||
case 76: return new Mapper076(parent);
|
||||
case 77: return new Mapper077(parent);
|
||||
case 78: return new Mapper078(parent);
|
||||
case 79: return new Mapper079(parent);
|
||||
case 80: return new Mapper080(parent);
|
||||
case 82: return new Mapper082(parent);
|
||||
case 83: return new Mapper083(parent);
|
||||
case 85: return new Mapper085(parent);
|
||||
case 86: return new Mapper086(parent);
|
||||
case 87: return new Mapper087(parent);
|
||||
case 88: return new Mapper088(parent);
|
||||
case 89: return new Mapper089(parent);
|
||||
case 90: return new Mapper090(parent);
|
||||
case 91: return new Mapper091(parent);
|
||||
case 92: return new Mapper092(parent);
|
||||
case 93: return new Mapper093(parent);
|
||||
case 94: return new Mapper094(parent);
|
||||
case 95: return new Mapper095(parent);
|
||||
case 96: return new Mapper096(parent);
|
||||
case 97: return new Mapper097(parent);
|
||||
case 99: return new Mapper099(parent);
|
||||
case 100: return new Mapper100(parent);
|
||||
case 101: return new Mapper101(parent);
|
||||
case 105: return new Mapper105(parent);
|
||||
case 108: return new Mapper108(parent);
|
||||
case 109: return new Mapper109(parent);
|
||||
case 110: return new Mapper110(parent);
|
||||
case 111: return new Mapper111(parent);
|
||||
case 112: return new Mapper112(parent);
|
||||
case 113: return new Mapper113(parent);
|
||||
case 114: return new Mapper114(parent);
|
||||
case 115: return new Mapper115(parent);
|
||||
case 116: return new Mapper116(parent);
|
||||
case 117: return new Mapper117(parent);
|
||||
case 118: return new Mapper118(parent);
|
||||
case 119: return new Mapper119(parent);
|
||||
case 122: return new Mapper122(parent);
|
||||
case 133: return new Mapper133(parent);
|
||||
case 134: return new Mapper134(parent);
|
||||
case 135: return new Mapper135(parent);
|
||||
case 140: return new Mapper140(parent);
|
||||
case 142: return new Mapper142(parent);
|
||||
case 151: return new Mapper151(parent);
|
||||
case 160: return new Mapper160(parent);
|
||||
case 162: return new Mapper162(parent);
|
||||
case 163: return new Mapper163(parent);
|
||||
case 164: return new Mapper164(parent);
|
||||
case 165: return new Mapper165(parent);
|
||||
case 167: return new Mapper167(parent);
|
||||
case 175: return new Mapper175(parent);
|
||||
case 176: return new Mapper176(parent);
|
||||
case 178: return new Mapper178(parent);
|
||||
case 180: return new Mapper180(parent);
|
||||
case 181: return new Mapper181(parent);
|
||||
case 182: return new Mapper182(parent);
|
||||
case 183: return new Mapper183(parent);
|
||||
case 185: return new Mapper185(parent);
|
||||
case 187: return new Mapper187(parent);
|
||||
case 188: return new Mapper188(parent);
|
||||
case 189: return new Mapper189(parent);
|
||||
case 190: return new Mapper190(parent);
|
||||
case 191: return new Mapper191(parent);
|
||||
case 192: return new Mapper192(parent);
|
||||
case 193: return new Mapper193(parent);
|
||||
case 194: return new Mapper194(parent);
|
||||
case 195: return new Mapper195(parent);
|
||||
case 198: return new Mapper198(parent);
|
||||
case 199: return new Mapper199(parent);
|
||||
case 200: return new Mapper200(parent);
|
||||
case 201: return new Mapper201(parent);
|
||||
case 202: return new Mapper202(parent);
|
||||
case 216: return new Mapper216(parent);
|
||||
case 222: return new Mapper222(parent);
|
||||
case 225: return new Mapper225(parent);
|
||||
case 226: return new Mapper226(parent);
|
||||
case 227: return new Mapper227(parent);
|
||||
case 228: return new Mapper228(parent);
|
||||
case 229: return new Mapper229(parent);
|
||||
case 230: return new Mapper230(parent);
|
||||
case 231: return new Mapper231(parent);
|
||||
case 232: return new Mapper232(parent);
|
||||
case 233: return new Mapper233(parent);
|
||||
case 234: return new Mapper234(parent);
|
||||
case 235: return new Mapper235(parent);
|
||||
case 236: return new Mapper236(parent);
|
||||
case 240: return new Mapper240(parent);
|
||||
case 241: return new Mapper241(parent);
|
||||
case 242: return new Mapper242(parent);
|
||||
case 243: return new Mapper243(parent);
|
||||
case 244: return new Mapper244(parent);
|
||||
case 245: return new Mapper245(parent);
|
||||
case 246: return new Mapper246(parent);
|
||||
case 248: return new Mapper248(parent);
|
||||
case 249: return new Mapper249(parent);
|
||||
case 251: return new Mapper251(parent);
|
||||
case 252: return new Mapper252(parent);
|
||||
case 254: return new Mapper254(parent);
|
||||
case 255: return new Mapper255(parent);
|
||||
|
||||
default:
|
||||
throw new NotImplementedException($"Mapper#{no:000} is not Impl");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9c095219b80f9234fb1a9a87f6fbf004
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,47 +0,0 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper000 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
//using Codice.CM.Client.Differences;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper000 : Mapper
|
||||
{
|
||||
|
||||
public Mapper000(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
switch (PROM_16K_SIZE)
|
||||
{
|
||||
default:
|
||||
case 1: // 16K only
|
||||
SetPROM_16K_Bank(4, 0);
|
||||
SetPROM_16K_Bank(6, 0);
|
||||
break;
|
||||
case 2: // 32K
|
||||
SetPROM_32K_Bank(0);
|
||||
break;
|
||||
}
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
if (crc == 0x4e7db5af)
|
||||
{ // Circus Charlie(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0x57970078)
|
||||
{ // F-1 Race(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
if (crc == 0xaf2bbcbc // Mach Rider(JU)
|
||||
|| crc == 0x3acd4bf1)
|
||||
{ // Mach Rider(Alt)(JU)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_RENDER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c57bc13f96a8d064a885b65c6aebc351
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,416 +0,0 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Mapper001 Nintendo MMC1 //
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
using static VirtualNes.MMU;
|
||||
using static VirtualNes.Core.CPU;
|
||||
using INT = System.Int32;
|
||||
using BYTE = System.Byte;
|
||||
//using Codice.CM.Client.Differences;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class Mapper001 : Mapper
|
||||
{
|
||||
|
||||
uint last_addr;
|
||||
|
||||
BYTE patch;
|
||||
BYTE wram_patch;
|
||||
BYTE wram_bank;
|
||||
BYTE wram_count;
|
||||
|
||||
BYTE[] reg = new byte[4];
|
||||
BYTE shift, regbuf;
|
||||
|
||||
public Mapper001(NES parent) : base(parent) { }
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
reg[0] = 0x0C; // D3=1,D2=1
|
||||
reg[1] = reg[2] = reg[3] = 0;
|
||||
shift = regbuf = 0;
|
||||
|
||||
patch = 0;
|
||||
wram_patch = 0;
|
||||
|
||||
if (PROM_16K_SIZE < 32)
|
||||
{
|
||||
SetPROM_32K_Bank(0, 1, PROM_8K_SIZE - 2, PROM_8K_SIZE - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// For 512K/1M byte Cartridge
|
||||
SetPROM_16K_Bank(4, 0);
|
||||
SetPROM_16K_Bank(6, 16 - 1);
|
||||
|
||||
patch = 1;
|
||||
}
|
||||
|
||||
if (VROM_8K_SIZE != 0)
|
||||
{
|
||||
// SetVROM_8K_Bank( 0 );
|
||||
}
|
||||
|
||||
uint crc = nes.rom.GetPROM_CRC();
|
||||
|
||||
if (crc == 0xb8e16bd0)
|
||||
{ // Snow Bros.(J)
|
||||
patch = 2;
|
||||
}
|
||||
// if( crc == 0x9b565541 ) { // Triathron, The(J)
|
||||
// nes.SetFrameIRQmode( FALSE );
|
||||
// }
|
||||
if (crc == 0xc96c6f04)
|
||||
{ // Venus Senki(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
// if( crc == 0x5e3f7004 ) { // Softball Tengoku(J)
|
||||
// }
|
||||
|
||||
if (crc == 0x4d2edf70)
|
||||
{ // Night Rider(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
}
|
||||
if (crc == 0xcd2a73f0)
|
||||
{ // Pirates!(U)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
patch = 2;
|
||||
}
|
||||
|
||||
// if( crc == 0x09efe54b ) { // Majaventure - Mahjong Senki(J)
|
||||
// nes.SetFrameIRQmode( FALSE );
|
||||
// }
|
||||
|
||||
if (crc == 0x11469ce3)
|
||||
{ // Viva! Las Vegas(J)
|
||||
}
|
||||
if (crc == 0xd878ebf5)
|
||||
{ // Ninja Ryukenden(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.POST_ALL_RENDER);
|
||||
}
|
||||
|
||||
// if( crc == 0x7bd7b849 ) { // Nekketsu Koukou - Dodgeball Bu(J)
|
||||
// }
|
||||
|
||||
if (crc == 0x466efdc2)
|
||||
{ // Final Fantasy(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
nes.ppu.SetExtMonoMode(true);
|
||||
}
|
||||
if (crc == 0xc9556b36)
|
||||
{ // Final Fantasy I&II(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.TILE_RENDER);
|
||||
nes.ppu.SetExtMonoMode(true);
|
||||
nes.SetSAVERAM_SIZE(16 * 1024);
|
||||
wram_patch = 2;
|
||||
}
|
||||
|
||||
if (crc == 0x717e1169)
|
||||
{ // Cosmic Wars(J)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
|
||||
if (crc == 0xC05D2034)
|
||||
{ // Snake's Revenge(U)
|
||||
nes.SetRenderMethod(EnumRenderMethod.PRE_ALL_RENDER);
|
||||
}
|
||||
|
||||
if (crc == 0xb8747abf // Best Play - Pro Yakyuu Special(J)
|
||||
|| crc == 0x29449ba9 // Nobunaga no Yabou - Zenkoku Ban(J)
|
||||
|| crc == 0x2b11e0b0 // Nobunaga no Yabou - Zenkoku Ban(J)(alt)
|
||||
|| crc == 0x4642dda6 // Nobunaga's Ambition(U)
|
||||
|| crc == 0xfb69743a // Aoki Ookami to Shiroki Mejika - Genghis Khan(J)
|
||||
|| crc == 0x2225c20f // Genghis Khan(U)
|
||||
|| crc == 0xabbf7217 // Sangokushi(J)
|
||||
)
|
||||
{
|
||||
|
||||
nes.SetSAVERAM_SIZE(16 * 1024);
|
||||
wram_patch = 1;
|
||||
wram_bank = 0;
|
||||
wram_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayRef<byte> _PROM_BANK = new ArrayRef<byte>();
|
||||
//void Mapper001::Write(WORD addr, BYTE data)
|
||||
public override void Write(ushort addr, byte data)
|
||||
{
|
||||
// DEBUGOUT( "MMC1 %04X=%02X\n", addr&0xFFFF,data&0xFF );
|
||||
|
||||
if (wram_patch == 1 && addr == 0xBFFF)
|
||||
{
|
||||
wram_count++;
|
||||
wram_bank += (byte)(data & 0x01);
|
||||
if (wram_count == 5)
|
||||
{
|
||||
if (wram_bank != 0)
|
||||
{
|
||||
_PROM_BANK.SetArray(WRAM, 0x2000);
|
||||
SetPROM_Bank(3, _PROM_BANK, BANKTYPE_RAM);
|
||||
}
|
||||
else
|
||||
{
|
||||
_PROM_BANK.SetArray(WRAM, 0x0000);
|
||||
SetPROM_Bank(3, _PROM_BANK, BANKTYPE_RAM);
|
||||
}
|
||||
wram_bank = wram_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (patch != 1)
|
||||
{
|
||||
if ((addr & 0x6000) != (last_addr & 0x6000))
|
||||
{
|
||||
shift = regbuf = 0;
|
||||
}
|
||||
last_addr = addr;
|
||||
}
|
||||
|
||||
if ((data & 0x80) != 0)
|
||||
{
|
||||
shift = regbuf = 0;
|
||||
// reg[0] = 0x0C; // D3=1,D2=1
|
||||
reg[0] |= 0x0C; // D3=1,D2=1 残りはリセットされない
|
||||
return;
|
||||
}
|
||||
|
||||
if ((data & 0x01) != 0) regbuf |= (byte)(1 << shift);
|
||||
if (++shift < 5)
|
||||
return;
|
||||
addr = (ushort)((addr & 0x7FFF) >> 13);
|
||||
reg[addr] = regbuf;
|
||||
|
||||
// DEBUGOUT( "MMC1 %d=%02X\n", addr&0xFFFF,regbuf&0xFF );
|
||||
|
||||
regbuf = 0;
|
||||
shift = 0;
|
||||
|
||||
if (patch != 1)
|
||||
{
|
||||
// For Normal Cartridge
|
||||
switch (addr)
|
||||
{
|
||||
case 0:
|
||||
if ((reg[0] & 0x02) != 0)
|
||||
{
|
||||
if ((reg[0] & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((reg[0] & 0x01) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
// Register #1
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x10) != 0)
|
||||
{
|
||||
// CHR 4K bank lower($0000-$0FFF)
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
// CHR 4K bank higher($1000-$1FFF)
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// CHR 8K bank($0000-$1FFF)
|
||||
SetVROM_8K_Bank(reg[1] >> 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// For Romancia
|
||||
if ((reg[0] & 0x10) != 0)
|
||||
{
|
||||
SetCRAM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
// Register #2
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x10) != 0)
|
||||
{
|
||||
// CHR 4K bank lower($0000-$0FFF)
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
// CHR 4K bank higher($1000-$1FFF)
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// CHR 8K bank($0000-$1FFF)
|
||||
SetVROM_8K_Bank(reg[1] >> 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// For Romancia
|
||||
if ((reg[0] & 0x10) != 0)
|
||||
{
|
||||
SetCRAM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (!((reg[0] & 0x08) != 0))
|
||||
{
|
||||
// PRG 32K bank ($8000-$FFFF)
|
||||
SetPROM_32K_Bank(reg[3] >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((reg[0] & 0x04) != 0)
|
||||
{
|
||||
// PRG 16K bank ($8000-$BFFF)
|
||||
SetPROM_16K_Bank(4, reg[3]);
|
||||
SetPROM_16K_Bank(6, PROM_16K_SIZE - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// PRG 16K bank ($C000-$FFFF)
|
||||
SetPROM_16K_Bank(6, reg[3]);
|
||||
SetPROM_16K_Bank(4, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// For 512K/1M byte Cartridge
|
||||
INT PROM_BASE = 0;
|
||||
if (PROM_16K_SIZE >= 32)
|
||||
{
|
||||
PROM_BASE = reg[1] & 0x10;
|
||||
}
|
||||
|
||||
// For FinalFantasy I&II
|
||||
if (wram_patch == 2)
|
||||
{
|
||||
if (((reg[1] & 0x18) == 0))
|
||||
{
|
||||
_PROM_BANK.SetArray(WRAM, 0x0000);
|
||||
SetPROM_Bank(3, _PROM_BANK, BANKTYPE_RAM);
|
||||
}
|
||||
else
|
||||
{
|
||||
_PROM_BANK.SetArray(WRAM, 0x2000);
|
||||
SetPROM_Bank(3, _PROM_BANK, BANKTYPE_RAM);
|
||||
}
|
||||
}
|
||||
|
||||
// Register #0
|
||||
if (addr == 0)
|
||||
{
|
||||
if ((reg[0] & 0x02) != 0)
|
||||
{
|
||||
if ((reg[0] & 0x01) != 0) SetVRAM_Mirror(VRAM_HMIRROR);
|
||||
else SetVRAM_Mirror(VRAM_VMIRROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((reg[0] & 0x01) != 0) SetVRAM_Mirror(VRAM_MIRROR4H);
|
||||
else SetVRAM_Mirror(VRAM_MIRROR4L);
|
||||
}
|
||||
}
|
||||
// Register #1
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x10) != 0)
|
||||
{
|
||||
// CHR 4K bank lower($0000-$0FFF)
|
||||
SetVROM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// CHR 8K bank($0000-$1FFF)
|
||||
SetVROM_8K_Bank(reg[1] >> 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// For Romancia
|
||||
if ((reg[0] & 0x10) != 0)
|
||||
{
|
||||
SetCRAM_4K_Bank(0, reg[1]);
|
||||
}
|
||||
}
|
||||
// Register #2
|
||||
if (VROM_1K_SIZE != 0)
|
||||
{
|
||||
if ((reg[0] & 0x10) != 0)
|
||||
{
|
||||
// CHR 4K bank higher($1000-$1FFF)
|
||||
SetVROM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// For Romancia
|
||||
if ((reg[0] & 0x10) != 0)
|
||||
{
|
||||
SetCRAM_4K_Bank(4, reg[2]);
|
||||
}
|
||||
}
|
||||
// Register #3
|
||||
if (((reg[0] & 0x08) == 0))
|
||||
{
|
||||
// PRG 32K bank ($8000-$FFFF)
|
||||
SetPROM_32K_Bank((reg[3] & (0xF + PROM_BASE)) >> 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((reg[0] & 0x04) != 0)
|
||||
{
|
||||
// PRG 16K bank ($8000-$BFFF)
|
||||
SetPROM_16K_Bank(4, PROM_BASE + (reg[3] & 0x0F));
|
||||
if (PROM_16K_SIZE >= 32) SetPROM_16K_Bank(6, PROM_BASE + 16 - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// PRG 16K bank ($C000-$FFFF)
|
||||
SetPROM_16K_Bank(6, PROM_BASE + (reg[3] & 0x0F));
|
||||
if (PROM_16K_SIZE >= 32) SetPROM_16K_Bank(4, PROM_BASE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Mapper001::SaveState(LPBYTE p)
|
||||
public override void SaveState(byte[] p)
|
||||
{
|
||||
p[0] = reg[0];
|
||||
p[1] = reg[1];
|
||||
p[2] = reg[2];
|
||||
p[3] = reg[3];
|
||||
p[4] = shift;
|
||||
p[5] = regbuf;
|
||||
|
||||
p[6] = wram_bank;
|
||||
p[7] = wram_count;
|
||||
}
|
||||
|
||||
//void Mapper001::LoadState(LPBYTE p)
|
||||
public override void LoadState(byte[] p)
|
||||
{
|
||||
reg[0] = p[0];
|
||||
reg[1] = p[1];
|
||||
reg[2] = p[2];
|
||||
reg[3] = p[3];
|
||||
shift = p[4];
|
||||
regbuf = p[5];
|
||||
|
||||
wram_bank = p[6];
|
||||
wram_count = p[7];
|
||||
}
|
||||
|
||||
public override bool IsStateSave()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user