修复存档问题

This commit is contained in:
ALIENJACK\alien 2024-11-13 18:42:30 +08:00
parent 4f4e00df0d
commit 1e156c9b51
12 changed files with 308 additions and 109 deletions

View File

@ -30,7 +30,7 @@ Transform:
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: [] m_Children: []
m_Father: {fileID: 4232056521131536011} m_Father: {fileID: 4232056521131536011}
m_RootOrder: 2 m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &9003897287163669553 --- !u!114 &9003897287163669553
MonoBehaviour: MonoBehaviour:
@ -141,6 +141,78 @@ AudioSource:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
--- !u!1 &3297772745682094737
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3430872171738201552}
- component: {fileID: 183509793067265912}
- component: {fileID: 1908580308043775702}
m_Layer: 5
m_Name: img
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3430872171738201552
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3297772745682094737}
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: 1038087993597378172}
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!222 &183509793067265912
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3297772745682094737}
m_CullTransparentMesh: 1
--- !u!114 &1908580308043775702
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3297772745682094737}
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: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Texture: {fileID: 0}
m_UVRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
--- !u!1 &3545890545112170401 --- !u!1 &3545890545112170401
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -150,8 +222,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 1038087993597378172} - component: {fileID: 1038087993597378172}
- component: {fileID: 3032498056073774270} - component: {fileID: 4772135422360773263}
- component: {fileID: 634277252673086327}
m_Layer: 5 m_Layer: 5
m_Name: Viewer m_Name: Viewer
m_TagString: Untagged m_TagString: Untagged
@ -166,27 +237,21 @@ RectTransform:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3545890545112170401} m_GameObject: {fileID: 3545890545112170401}
m_LocalRotation: {x: 1, y: 0, z: 0, w: 0} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: [] m_Children:
- {fileID: 3430872171738201552}
- {fileID: 5684774662137182450}
m_Father: {fileID: 4232056520494431727} m_Father: {fileID: 4232056520494431727}
m_RootOrder: 1 m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 180, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1} m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 128, y: 256} m_SizeDelta: {x: 128, y: 256}
m_Pivot: {x: 0, y: 0} m_Pivot: {x: 0, y: 1}
--- !u!222 &3032498056073774270 --- !u!114 &4772135422360773263
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3545890545112170401}
m_CullTransparentMesh: 1
--- !u!114 &634277252673086327
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
@ -195,24 +260,11 @@ MonoBehaviour:
m_GameObject: {fileID: 3545890545112170401} m_GameObject: {fileID: 3545890545112170401}
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} m_Script: {fileID: 11500000, guid: c7a50c189f5be5b4ea54de444f8488a0, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_Material: {fileID: 0} img: {fileID: 1908580308043775702}
m_Color: {r: 1, g: 1, b: 1, a: 1} select: {fileID: 5340715074145844681}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Texture: {fileID: 8400000, guid: ffe34aaf87e4b9942b4c2ac05943d444, type: 2}
m_UVRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
--- !u!1 &4232056520112715746 --- !u!1 &4232056520112715746
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -292,7 +344,7 @@ RectTransform:
- {fileID: 4232056521759880275} - {fileID: 4232056521759880275}
- {fileID: 1038087993597378172} - {fileID: 1038087993597378172}
m_Father: {fileID: 4232056521131536011} m_Father: {fileID: 4232056521131536011}
m_RootOrder: 3 m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0}
@ -389,7 +441,6 @@ Transform:
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: m_Children:
- {fileID: 4232056520112715745} - {fileID: 4232056520112715745}
- {fileID: 393435831810118449}
- {fileID: 4785916497946256520} - {fileID: 4785916497946256520}
- {fileID: 4232056520494431727} - {fileID: 4232056520494431727}
m_Father: {fileID: 0} m_Father: {fileID: 0}
@ -409,6 +460,7 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
VideoProvider: {fileID: 4232056520112715744} VideoProvider: {fileID: 4232056520112715744}
AudioProvider: {fileID: 9003897287163669553} AudioProvider: {fileID: 9003897287163669553}
m_bPause: 0
--- !u!1 &4232056521759880276 --- !u!1 &4232056521759880276
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -481,7 +533,7 @@ MonoBehaviour:
y: 0 y: 0
width: 1 width: 1
height: 1 height: 1
--- !u!1 &7856060136050839404 --- !u!1 &9165783203684222035
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
@ -489,39 +541,74 @@ GameObject:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 393435831810118449} - component: {fileID: 5684774662137182450}
- component: {fileID: 499856625911497759} - component: {fileID: 8664526960435983253}
m_Layer: 0 - component: {fileID: 5340715074145844681}
m_Name: PatternViewer m_Layer: 5
m_Name: Text
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
m_IsActive: 0 m_IsActive: 1
--- !u!4 &393435831810118449 --- !u!224 &5684774662137182450
Transform: RectTransform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7856060136050839404} m_GameObject: {fileID: 9165783203684222035}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: [] m_Children: []
m_Father: {fileID: 4232056521131536011} m_Father: {fileID: 1038087993597378172}
m_RootOrder: 1 m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &499856625911497759 m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: -41}
m_SizeDelta: {x: 0, y: 30}
m_Pivot: {x: 0.5, y: 0}
--- !u!222 &8664526960435983253
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9165783203684222035}
m_CullTransparentMesh: 1
--- !u!114 &5340715074145844681
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7856060136050839404} m_GameObject: {fileID: 9165783203684222035}
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c7a50c189f5be5b4ea54de444f8488a0, type: 3} m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
img: {fileID: 634277252673086327} m_Material: {fileID: 0}
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
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: 0
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: New Text

View File

@ -14,6 +14,7 @@ namespace AxibugEmuOnline.Client
void Resume(); void Resume();
void SetupScheme(); void SetupScheme();
void StartGame(RomFile romFile); void StartGame(RomFile romFile);
void DoReset();
} }
public static class IEnumCoreTool public static class IEnumCoreTool

View File

@ -68,5 +68,12 @@ namespace AxibugEmuOnline.Client.Manager
ControlScheme.Current = ControlSchemeSetts.Normal; ControlScheme.Current = ControlSchemeSetts.Normal;
} }
public void ResetGame()
{
if(m_emuCore.IsNull()) return;
m_emuCore.DoReset();
}
} }
} }

View File

@ -1,4 +1,5 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Common;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
@ -112,30 +113,9 @@ namespace AxibugEmuOnline.Client
} }
public void DoReset()
[Conditional("UNITY_EDITOR")]
[ContextMenu("ImportNesDB")]
public void ImportNesDB()
{ {
var db = Resources.Load<RomDB>("NES/ROMDB"); NesCore.Reset();
db.Clear();
var xmlStr = File.ReadAllText("nes20db.xml");
var xml = XDocument.Parse(xmlStr);
var games = xml.Element("nes20db").Elements("game");
foreach (var game in games)
{
var crcStr = game.Element("rom").Attribute("crc32").Value;
var crc = uint.Parse($"{crcStr}", System.Globalization.NumberStyles.HexNumber);
var mapper = int.Parse($"{game.Element("pcb").Attribute("mapper").Value}");
if (mapper > 255) continue;
db.AddInfo(new RomDB.RomInfo { CRC = crc, Mapper = mapper });
}
UnityEditor.EditorUtility.SetDirty(db);
UnityEditor.AssetDatabase.SaveAssets();
} }
public void SetupScheme() public void SetupScheme()
@ -164,5 +144,31 @@ namespace AxibugEmuOnline.Client
st.FromByte(data); st.FromByte(data);
NesCore.LoadState(st); NesCore.LoadState(st);
} }
[Conditional("UNITY_EDITOR")]
[ContextMenu("ImportNesDB")]
public void ImportNesDB()
{
var db = Resources.Load<RomDB>("NES/ROMDB");
db.Clear();
var xmlStr = File.ReadAllText("nes20db.xml");
var xml = XDocument.Parse(xmlStr);
var games = xml.Element("nes20db").Elements("game");
foreach (var game in games)
{
var crcStr = game.Element("rom").Attribute("crc32").Value;
var crc = uint.Parse($"{crcStr}", System.Globalization.NumberStyles.HexNumber);
var mapper = int.Parse($"{game.Element("pcb").Attribute("mapper").Value}");
if (mapper > 255) continue;
db.AddInfo(new RomDB.RomInfo { CRC = crc, Mapper = mapper });
}
UnityEditor.EditorUtility.SetDirty(db);
UnityEditor.AssetDatabase.SaveAssets();
}
} }
} }

View File

@ -1,7 +1,10 @@
using System.Collections.Generic; using AxibugEmuOnline.Client.Common;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI; using UnityEngine.UI;
using VirtualNes; using VirtualNes;
using VirtualNes.Core;
using static AxibugEmuOnline.Client.PaletteDefine; using static AxibugEmuOnline.Client.PaletteDefine;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
@ -9,24 +12,40 @@ namespace AxibugEmuOnline.Client
public class PatternViewer : MonoBehaviour public class PatternViewer : MonoBehaviour
{ {
public RawImage img; public RawImage img;
public Text select;
private Color32[] m_lpPattern = new Color32[128 * 256]; private Color32[] m_lpPattern = new Color32[128 * 256];
private Texture2D m_texture; private Texture2D m_texture;
private Dictionary<byte, RGBQUAD> colors = new Dictionary<byte, RGBQUAD>(); private Dictionary<byte, RGBQUAD> colors = new Dictionary<byte, RGBQUAD>();
private int selectPal = 0;
private void Awake() private void Awake()
{ {
m_texture = new Texture2D(128, 256); m_texture = new Texture2D(128, 256);
m_texture.filterMode = FilterMode.Point;
} }
private void Update() private void Update()
{ {
if (Input.GetKey(KeyCode.LeftAlt) && Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.T))
{
SwitchSelectPal();
}
Paint(); Paint();
} }
private void OnEnable() private void OnEnable()
{ {
img.gameObject.SetActive(true); img.gameObject.SetActive(true);
if (selectPal < 4)
{
select.text = $"PatternView BG{(selectPal & 3):00}";
}
else
{
select.text = $"PatternView SP{(selectPal & 3):00}";
}
} }
private void OnDisable() private void OnDisable()
@ -38,7 +57,16 @@ namespace AxibugEmuOnline.Client
{ {
img.texture = m_texture; img.texture = m_texture;
var pal = MMU.SPPAL; ArrayRef<byte> pal = null;
if (selectPal < 4)
{
pal = new ArrayRef<byte>(MMU.BGPAL, selectPal * 4);
}
else
{
pal = new ArrayRef<byte>(MMU.SPPAL, (selectPal & 3) * 4);
}
var palette = PaletteDefine.GetPaletteData(); var palette = PaletteDefine.GetPaletteData();
colors[0] = palette[pal[0]]; colors[0] = palette[pal[0]];
colors[1] = palette[pal[1]]; colors[1] = palette[pal[1]];
@ -48,6 +76,12 @@ namespace AxibugEmuOnline.Client
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
{ {
var Ptn = MMU.PPU_MEM_BANK[i]; var Ptn = MMU.PPU_MEM_BANK[i];
if (Input.GetKeyDown(KeyCode.T))
{
Debug.Log($"{i}:{Ptn.Offset}\t{Helper.FileMD5Hash(Ptn.RawArray)}");
}
int lpPtn = 0; int lpPtn = 0;
for (int p = 0; p < 64; p++) for (int p = 0; p < 64; p++)
{ {
@ -81,5 +115,18 @@ namespace AxibugEmuOnline.Client
var raw = map[(byte)v]; var raw = map[(byte)v];
return new Color32(raw.rgbRed, raw.rgbGreen, raw.rgbBlue, 255); return new Color32(raw.rgbRed, raw.rgbGreen, raw.rgbBlue, 255);
} }
void SwitchSelectPal()
{
selectPal = (selectPal + 1) & 7;
if (selectPal < 4)
{
select.text = $"PatternView BG{(selectPal & 3):00}";
}
else
{
select.text = $"PatternView SP{(selectPal & 3):00}";
}
}
} }
} }

View File

@ -38,16 +38,18 @@ namespace AxibugEmuOnline.Client
m_stepPerformer = new StepPerformer(this); m_stepPerformer = new StepPerformer(this);
menus.Add(new InGameUI_Reset(this));
menus.Add(new InGameUI_SaveState(this)); menus.Add(new InGameUI_SaveState(this));
menus.Add(new InGameUI_LoadState(this)); menus.Add(new InGameUI_LoadState(this));
menus.Add(new InGameUI_QuitGame(this)); menus.Add(new InGameUI_QuitGame(this));
base.Awake(); base.Awake();
} }
private void OnDestroy() protected override void OnDestroy()
{ {
Instance = null; Instance = null;
base.OnDestroy();
} }
/// <summary> 괏닸우醵우亮 </summary> /// <summary> 괏닸우醵우亮 </summary>

View File

@ -0,0 +1,28 @@
using AxibugEmuOnline.Client.ClientCore;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
namespace AxibugEmuOnline.Client
{
public class InGameUI_Reset : ExecuteMenu
{
private InGameUI m_gameUI;
public override bool Visible => !m_gameUI.IsNetPlay || App.roomMgr.IsHost;
public InGameUI_Reset(InGameUI gameUI) : base("¸´Î»", null)
{
m_gameUI = gameUI;
}
public override void OnExcute()
{
if (!m_gameUI.IsNetPlay)
{
App.emu.ResetGame();
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: eedc9c8d06bb21242bb50bee6ca858fe
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -4,6 +4,7 @@ namespace VirtualNes.Core
{ {
public class ArrayRef<T> public class ArrayRef<T>
{ {
public T[] RawArray => m_rawArray;
private T[] m_rawArray; private T[] m_rawArray;
private int m_offset; private int m_offset;
private int m_length; private int m_length;

View File

@ -10,8 +10,7 @@ namespace VirtualNes.Core
{ {
public class Mapper001 : Mapper public class Mapper001 : Mapper
{ {
ushort last_addr;
uint last_addr;
BYTE patch; BYTE patch;
BYTE wram_patch; BYTE wram_patch;
@ -131,7 +130,6 @@ namespace VirtualNes.Core
} }
} }
private ArrayRef<byte> _PROM_BANK = new ArrayRef<byte>();
//void Mapper001::Write(WORD addr, BYTE data) //void Mapper001::Write(WORD addr, BYTE data)
public override void Write(ushort addr, byte data) public override void Write(ushort addr, byte data)
{ {
@ -145,13 +143,11 @@ namespace VirtualNes.Core
{ {
if (wram_bank != 0) if (wram_bank != 0)
{ {
_PROM_BANK.SetArray(WRAM, 0x2000); SetPROM_Bank(3, new ArrayRef<byte>(WRAM, 0x2000), BANKTYPE_RAM);
SetPROM_Bank(3, _PROM_BANK, BANKTYPE_RAM);
} }
else else
{ {
_PROM_BANK.SetArray(WRAM, 0x0000); SetPROM_Bank(3, new ArrayRef<byte>(WRAM, 0x0000), BANKTYPE_RAM);
SetPROM_Bank(3, _PROM_BANK, BANKTYPE_RAM);
} }
wram_bank = wram_count = 0; wram_bank = wram_count = 0;
} }
@ -292,13 +288,11 @@ namespace VirtualNes.Core
{ {
if (((reg[1] & 0x18) == 0)) if (((reg[1] & 0x18) == 0))
{ {
_PROM_BANK.SetArray(WRAM, 0x0000); SetPROM_Bank(3, new ArrayRef<byte>(WRAM, 0x0000), BANKTYPE_RAM);
SetPROM_Bank(3, _PROM_BANK, BANKTYPE_RAM);
} }
else else
{ {
_PROM_BANK.SetArray(WRAM, 0x2000); SetPROM_Bank(3, new ArrayRef<byte>(WRAM, 0x2000), BANKTYPE_RAM);
SetPROM_Bank(3, _PROM_BANK, BANKTYPE_RAM);
} }
} }

View File

@ -26,6 +26,11 @@ namespace VirtualNes.Core
protected byte vs_patch; protected byte vs_patch;
protected byte vs_index; protected byte vs_index;
public override bool IsStateSave()
{
return true;
}
private byte[] VS_TKO_Security = new byte[32] private byte[] VS_TKO_Security = new byte[32]
{ {
0xff, 0xbf, 0xb7, 0x97, 0x97, 0x17, 0x57, 0x4f, 0xff, 0xbf, 0xb7, 0x97, 0x97, 0x17, 0x57, 0x4f,

View File

@ -911,7 +911,7 @@ namespace VirtualNes.Core
CPU_CALL_COUNT++; CPU_CALL_COUNT++;
} }
internal void Reset() public void Reset()
{ {
SaveSRAM(); SaveSRAM();
SaveDISK(); SaveDISK();
@ -1024,7 +1024,7 @@ namespace VirtualNes.Core
internal void SoftReset() public void SoftReset()
{ {
pad.Reset(); pad.Reset();
cpu.Reset(); cpu.Reset();
@ -1974,23 +1974,45 @@ namespace VirtualNes.Core
// BANK0,1,2¤Ï¥Ð¥ó¥¯¥»©`¥Ö¤ËévS¤Ê¤· // BANK0,1,2¤Ï¥Ð¥ó¥¯¥»©`¥Ö¤ËévS¤Ê¤·
// VirtuaNES0.30¤«¤é // VirtuaNES0.30¤«¤é
// ¥Ð¥ó¥¯£³¤ÏSRAMʹÓäËév¤ï¤é¤º¥»©`¥Ö // ¥Ð¥ó¥¯£³¤ÏSRAMʹÓäËév¤ï¤é¤º¥»©`¥Ö
for (int i = 3; i < 8; i++) for (byte i = 3; i < 8; i++)
{ {
MMU.CPU_MEM_TYPE[i] = state.mmu.CPU_MEM_TYPE[i]; MMU.CPU_MEM_TYPE[i] = state.mmu.CPU_MEM_TYPE[i];
MMU.CPU_MEM_PAGE[i] = state.mmu.CPU_MEM_PAGE[i]; MMU.CPU_MEM_PAGE[i] = state.mmu.CPU_MEM_PAGE[i];
if (MMU.CPU_MEM_TYPE[i] == MMU.BANKTYPE_ROM)
MMU.SetPROM_8K_Bank(i, MMU.CPU_MEM_PAGE[i]);
else
{
MMU.CPU_MEM_BANK[i].SetArray(state.CPU_MEM_BANK.ToArray(), 0);
}
} }
// SAVE VRAM MEMORY DATA // VRAM
for (int i = 0; i < 12; i++) MemoryUtility.memcpy(MMU.VRAM, state.VRAM, 4 * 1024);
{ // CRAM
MMU.PPU_MEM_TYPE[i] = state.mmu.PPU_MEM_TYPE[i];
MMU.PPU_MEM_PAGE[i] = state.mmu.PPU_MEM_PAGE[i];
}
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
{ {
MMU.CRAM_USED[i] = state.mmu.CRAM_USED[i]; MMU.CRAM_USED[i] = state.mmu.CRAM_USED[i];
} }
// SAVE VRAM MEMORY DATA
for (byte i = 0; i < 12; i++)
{
if (state.mmu.PPU_MEM_TYPE[i] == MMU.BANKTYPE_VROM)
{
MMU.SetVROM_1K_Bank(i, state.mmu.PPU_MEM_PAGE[i]);
}
else if (state.mmu.PPU_MEM_TYPE[i] == MMU.BANKTYPE_CRAM)
{
MMU.SetCRAM_1K_Bank(i, state.mmu.PPU_MEM_PAGE[i]);
}
else if (state.mmu.PPU_MEM_TYPE[i] == MMU.BANKTYPE_VRAM)
{
MMU.SetVRAM_1K_Bank(i, state.mmu.PPU_MEM_PAGE[i]);
}
else
{
throw new Exception("Unknown bank types.");
}
}
// WRITE CPU RAM MEMORY BANK // WRITE CPU RAM MEMORY BANK
@ -2024,17 +2046,7 @@ namespace VirtualNes.Core
// MMC STATE // MMC STATE
{ {
state.mmc = MMCSTAT.GetDefault(); mapper.LoadState(state.mmc.mmcdata);
// Create Header
state.mmcBLOCK.ID = "MMC DATA";
state.mmcBLOCK.BlockVersion = 0x0100;
state.mmcBLOCK.BlockSize = state.mmc.GetSize();
if (mapper.IsStateSave())
{
mapper.LoadState(state.mmc.mmcdata);
}
} }
//CONTROLLER STATE //CONTROLLER STATE
@ -2048,8 +2060,6 @@ namespace VirtualNes.Core
//SND STATE //SND STATE
{ {
state.snd = SNDSTAT.GetDefault();
var buffer = new StateReader(state.snd.snddata); var buffer = new StateReader(state.snd.snddata);
apu.LoadState(buffer); apu.LoadState(buffer);
} }