Cleanup and simplify AppleII core code
This commit is contained in:
parent
4848bb5cc3
commit
5247e1d357
|
@ -1,6 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using BizHawk.Emulation.Common;
|
||||
|
||||
|
@ -20,28 +19,12 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
reg.Key,
|
||||
reg.Key.Contains("Flag")
|
||||
? reg.Value > 0
|
||||
: getRegisterValue(reg));
|
||||
: GetRegisterValue(reg));
|
||||
}
|
||||
|
||||
return dic;
|
||||
}
|
||||
|
||||
private RegisterValue getRegisterValue(KeyValuePair<string, int> reg)
|
||||
{
|
||||
switch (reg.Key)
|
||||
{
|
||||
case "A":
|
||||
case "X":
|
||||
case "Y":
|
||||
case "S":
|
||||
return (byte)reg.Value;
|
||||
case "PC":
|
||||
return (ushort)reg.Value;
|
||||
default:
|
||||
return reg.Value;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetCpuRegister(string register, int value)
|
||||
{
|
||||
switch (register)
|
||||
|
@ -90,6 +73,8 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
}
|
||||
}
|
||||
|
||||
public IMemoryCallbackSystem MemoryCallbacks { get; } = new MemoryCallbackSystem();
|
||||
|
||||
public bool CanStep(StepType type)
|
||||
{
|
||||
switch (type)
|
||||
|
@ -103,7 +88,6 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public void Step(StepType type)
|
||||
{
|
||||
switch (type)
|
||||
|
@ -120,17 +104,34 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
}
|
||||
}
|
||||
|
||||
public int TotalExecutedCycles
|
||||
public int TotalExecutedCycles => (int)_machine.Cpu.Cycles;
|
||||
|
||||
private RegisterValue GetRegisterValue(KeyValuePair<string, int> reg)
|
||||
{
|
||||
get { return (int)_machine.Cpu.Cycles; }
|
||||
switch (reg.Key)
|
||||
{
|
||||
case "A":
|
||||
case "X":
|
||||
case "Y":
|
||||
case "S":
|
||||
return (byte)reg.Value;
|
||||
case "PC":
|
||||
return (ushort)reg.Value;
|
||||
default:
|
||||
return reg.Value;
|
||||
}
|
||||
}
|
||||
|
||||
private void StepInto()
|
||||
{
|
||||
if (Tracer.Enabled)
|
||||
_machine.Cpu.TraceCallback = (s) => TracerWrapper(s);
|
||||
if (_tracer.Enabled)
|
||||
{
|
||||
_machine.Cpu.TraceCallback = TracerWrapper;
|
||||
}
|
||||
else
|
||||
{
|
||||
_machine.Cpu.TraceCallback = null;
|
||||
}
|
||||
|
||||
var machineInVblank = _machine.Video.IsVBlank;
|
||||
|
||||
|
@ -153,9 +154,9 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
{
|
||||
var instruction = _machine.Memory.Read(_machine.Cpu.RPC);
|
||||
|
||||
if (instruction == JSR)
|
||||
if (instruction == Jsr)
|
||||
{
|
||||
var destination = _machine.Cpu.RPC + JSRSize;
|
||||
var destination = _machine.Cpu.RPC + JsrSize;
|
||||
while (_machine.Cpu.RPC != destination)
|
||||
{
|
||||
StepInto();
|
||||
|
@ -171,7 +172,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
{
|
||||
var instr = _machine.Memory.Read(_machine.Cpu.RPC);
|
||||
|
||||
JSRCount = instr == JSR ? 1 : 0;
|
||||
_jsrCount = instr == Jsr ? 1 : 0;
|
||||
|
||||
var bailOutFrame = Frame + 1;
|
||||
|
||||
|
@ -179,21 +180,21 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
{
|
||||
StepInto();
|
||||
instr = _machine.Memory.Read(_machine.Cpu.RPC);
|
||||
if (instr == JSR)
|
||||
if (instr == Jsr)
|
||||
{
|
||||
JSRCount++;
|
||||
_jsrCount++;
|
||||
}
|
||||
else if (instr == RTS && JSRCount <= 0)
|
||||
else if (instr == Rts && _jsrCount <= 0)
|
||||
{
|
||||
StepInto();
|
||||
JSRCount = 0;
|
||||
_jsrCount = 0;
|
||||
break;
|
||||
}
|
||||
else if (instr == RTS)
|
||||
else if (instr == Rts)
|
||||
{
|
||||
JSRCount--;
|
||||
_jsrCount--;
|
||||
}
|
||||
else //Emergency Bailout Logic
|
||||
else // Emergency Bailout Logic
|
||||
{
|
||||
if (Frame == bailOutFrame)
|
||||
{
|
||||
|
@ -203,13 +204,10 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
}
|
||||
}
|
||||
|
||||
private int JSRCount = 0;
|
||||
private int _jsrCount;
|
||||
|
||||
private const byte JSR = 0x20;
|
||||
private const byte RTS = 0x60;
|
||||
|
||||
private const byte JSRSize = 3;
|
||||
|
||||
public IMemoryCallbackSystem MemoryCallbacks { get; private set; }
|
||||
private const byte Jsr = 0x20;
|
||||
private const byte Rts = 0x60;
|
||||
private const byte JsrSize = 3;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using BizHawk.Emulation.Common;
|
||||
using BizHawk.Emulation.Cores.Components.M6502;
|
||||
|
@ -15,15 +13,13 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
{
|
||||
return "6502";
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public string PCRegisterName
|
||||
{
|
||||
get { return "PC"; }
|
||||
}
|
||||
public string PCRegisterName => "PC";
|
||||
|
||||
public IEnumerable<string> AvailableCpus
|
||||
{
|
||||
|
@ -32,7 +28,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
|
||||
public string Disassemble(MemoryDomain m, uint addr, out int length)
|
||||
{
|
||||
return MOS6502X.Disassemble((ushort)addr, out length, (a) => m.PeekByte(a));
|
||||
return MOS6502X.Disassemble((ushort)addr, out length, a => m.PeekByte(a));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,33 +4,24 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
{
|
||||
public partial class AppleII : IEmulator
|
||||
{
|
||||
public IEmulatorServiceProvider ServiceProvider { get; private set; }
|
||||
public IEmulatorServiceProvider ServiceProvider { get; }
|
||||
|
||||
public ControllerDefinition ControllerDefinition
|
||||
{
|
||||
get { return AppleIIController; }
|
||||
}
|
||||
public ControllerDefinition ControllerDefinition => AppleIIController;
|
||||
|
||||
public IController Controller { get; set; }
|
||||
|
||||
public int Frame { get; set; }
|
||||
public int Frame { get; private set; }
|
||||
|
||||
public string SystemId
|
||||
{
|
||||
get { return "AppleII"; }
|
||||
}
|
||||
public string SystemId => "AppleII";
|
||||
|
||||
public bool DeterministicEmulation
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
public bool DeterministicEmulation => true;
|
||||
|
||||
public void FrameAdvance(bool render, bool rendersound)
|
||||
{
|
||||
FrameAdv(render, rendersound);
|
||||
}
|
||||
|
||||
public string BoardName { get { return null; } }
|
||||
public string BoardName => null;
|
||||
|
||||
public void ResetCounters()
|
||||
{
|
||||
|
@ -39,7 +30,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
IsLagFrame = false;
|
||||
}
|
||||
|
||||
public CoreComm CoreComm { get; private set; }
|
||||
public CoreComm CoreComm { get; }
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
|
|
@ -12,6 +12,6 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
set { _machine.Lagged = value; }
|
||||
}
|
||||
|
||||
public IInputCallbackSystem InputCallbacks { get; private set; }
|
||||
public IInputCallbackSystem InputCallbacks { get; } = new InputCallbackSystem();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,13 +15,19 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
(addr) =>
|
||||
{
|
||||
if (addr < 0 || addr >= 0xC000)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
return (byte)_machine.Memory.Peek((int)addr);
|
||||
},
|
||||
(addr, value) =>
|
||||
{
|
||||
if (addr < 0 || addr >= 0xC000)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
_machine.Memory.Write((int)addr, value);
|
||||
}, 1);
|
||||
|
||||
|
@ -31,13 +37,19 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
(addr) =>
|
||||
{
|
||||
if (addr < 0 || addr >= 65536)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
return (byte)_machine.Memory.Peek((int)addr);
|
||||
},
|
||||
(addr, value) =>
|
||||
{
|
||||
if (addr < 0 || addr >= 65536)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
_machine.Memory.Write((int)addr, value);
|
||||
}, 1);
|
||||
|
||||
|
|
|
@ -1,13 +1,9 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.ComponentModel;
|
||||
using BizHawk.Emulation.Common;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Computers.AppleII
|
||||
{
|
||||
partial class AppleII : ISettable<AppleII.Settings, object>
|
||||
public partial class AppleII : ISettable<AppleII.Settings, object>
|
||||
{
|
||||
private Settings _settings;
|
||||
|
||||
|
@ -23,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
}
|
||||
}
|
||||
|
||||
public AppleII.Settings GetSettings()
|
||||
public Settings GetSettings()
|
||||
{
|
||||
return _settings.Clone();
|
||||
}
|
||||
|
@ -33,12 +29,12 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
return null;
|
||||
}
|
||||
|
||||
public bool PutSettings(AppleII.Settings o)
|
||||
public bool PutSettings(Settings o)
|
||||
{
|
||||
_settings = o;
|
||||
_machine.Video.IsMonochrome = _settings.Monochrome;
|
||||
|
||||
setCallbacks();
|
||||
SetCallbacks();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -5,10 +5,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
{
|
||||
public partial class AppleII : ISoundProvider
|
||||
{
|
||||
public bool CanProvideAsync
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
public bool CanProvideAsync => false;
|
||||
|
||||
public void GetSamplesSync(out short[] samples, out int nsamp)
|
||||
{
|
||||
|
@ -20,10 +17,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
_machine.Speaker.AudioService.Clear();
|
||||
}
|
||||
|
||||
public SyncSoundMode SyncMode
|
||||
{
|
||||
get { return SyncSoundMode.Sync; }
|
||||
}
|
||||
public SyncSoundMode SyncMode => SyncSoundMode.Sync;
|
||||
|
||||
public void SetSyncMode(SyncSoundMode mode)
|
||||
{
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
using BizHawk.Emulation.Common;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
using BizHawk.Emulation.Common;
|
||||
|
||||
using Jellyfish.Virtu;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Bson;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Computers.AppleII
|
||||
{
|
||||
|
@ -17,8 +19,9 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
return objectType == typeof(Machine);
|
||||
}
|
||||
|
||||
public override bool CanRead { get { return true; } }
|
||||
public override bool CanWrite { get { return false; } }
|
||||
public override bool CanRead => true;
|
||||
|
||||
public override bool CanWrite => false;
|
||||
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||
{
|
||||
|
@ -32,7 +35,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
}
|
||||
}
|
||||
|
||||
public bool BinarySaveStatesPreferred { get { return true; } }
|
||||
public bool BinarySaveStatesPreferred => true;
|
||||
|
||||
private void SerializeEverything(JsonWriter w)
|
||||
{
|
||||
|
@ -57,7 +60,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
|
||||
private void DeserializeEverything(JsonReader r)
|
||||
{
|
||||
var o = (OtherData)ser.Deserialize(r, typeof(OtherData));
|
||||
var o = (OtherData)_ser.Deserialize(r, typeof(OtherData));
|
||||
Frame = o.Frame;
|
||||
LagCount = o.LagCount;
|
||||
IsLagFrame = o.IsLagFrame;
|
||||
|
@ -65,6 +68,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
_machine = o.Core;
|
||||
_prevPressed = o.PreviousDiskPressed;
|
||||
_nextPressed = o.NextDiskPressed;
|
||||
|
||||
// since _machine was replaced, we need to reload settings from frontend
|
||||
PutSettings(_settings);
|
||||
}
|
||||
|
@ -82,10 +86,10 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
|
||||
private void InitSaveStates()
|
||||
{
|
||||
ser.Converters.Add(new CoreConverter());
|
||||
_ser.Converters.Add(new CoreConverter());
|
||||
}
|
||||
|
||||
private JsonSerializer ser = new JsonSerializer();
|
||||
private readonly JsonSerializer _ser = new JsonSerializer();
|
||||
|
||||
public void SaveStateText(TextWriter writer)
|
||||
{
|
||||
|
|
|
@ -1,25 +1,22 @@
|
|||
using BizHawk.Emulation.Common;
|
||||
using Jellyfish.Virtu;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Computers.AppleII
|
||||
{
|
||||
public partial class AppleII : IVideoProvider
|
||||
{
|
||||
private Jellyfish.Virtu.Services.VideoService _V
|
||||
{ get { return _machine.Video.VideoService; } }
|
||||
|
||||
int[] IVideoProvider.GetVideoBuffer() { return _V.fb; }
|
||||
public int[] GetVideoBuffer()
|
||||
{
|
||||
return _machine.Video.VideoService.fb;
|
||||
}
|
||||
|
||||
// put together, these describe a metric on the screen
|
||||
// they should define the smallest size that the buffer can be placed inside such that:
|
||||
// 1. no actual pixel data is lost
|
||||
// 2. aspect ratio is accurate
|
||||
int IVideoProvider.VirtualWidth { get { return 560; } }
|
||||
int IVideoProvider.VirtualHeight { get { return 384; } }
|
||||
|
||||
int IVideoProvider.BufferWidth { get { return 560; } }
|
||||
int IVideoProvider.BufferHeight { get { return 384; } }
|
||||
int IVideoProvider.BackgroundColor { get { return 0; } }
|
||||
|
||||
public int VirtualWidth => 560;
|
||||
public int VirtualHeight => 384;
|
||||
public int BufferWidth => 560;
|
||||
public int BufferHeight => 384;
|
||||
public int BackgroundColor => 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,37 +10,37 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
"Virtu",
|
||||
"fool",
|
||||
isPorted: true,
|
||||
isReleased: true
|
||||
)]
|
||||
isReleased: true)]
|
||||
[ServiceNotApplicable(typeof(ISaveRam), typeof(IRegionable))]
|
||||
public partial class AppleII : IEmulator, ISoundProvider, IVideoProvider, IStatable, IDriveLight
|
||||
{
|
||||
static AppleII()
|
||||
{
|
||||
AppleIIController = new ControllerDefinition { Name = "Apple IIe Keyboard" };
|
||||
AppleIIController.BoolButtons.AddRange(RealButtons);
|
||||
AppleIIController.BoolButtons.AddRange(ExtraButtons);
|
||||
}
|
||||
|
||||
public AppleII(CoreComm comm, IEnumerable<GameInfo> gameInfoSet, IEnumerable<byte[]> romSet, Settings settings)
|
||||
: this(comm, gameInfoSet.First(), romSet.First(), settings)
|
||||
{
|
||||
GameInfoSet = gameInfoSet.ToList();
|
||||
RomSet = romSet.ToList();
|
||||
_romSet = romSet.ToList();
|
||||
}
|
||||
|
||||
[CoreConstructor("AppleII")]
|
||||
public AppleII(CoreComm comm, GameInfo game, byte[] rom, Settings settings)
|
||||
{
|
||||
GameInfoSet = new List<GameInfo>();
|
||||
|
||||
var ser = new BasicServiceProvider(this);
|
||||
ServiceProvider = ser;
|
||||
CoreComm = comm;
|
||||
|
||||
Tracer = new TraceBuffer
|
||||
_tracer = new TraceBuffer
|
||||
{
|
||||
Header = "6502: PC, opcode, register (A, X, Y, P, SP, Cy), flags (NVTBDIZC)"
|
||||
};
|
||||
|
||||
MemoryCallbacks = new MemoryCallbackSystem();
|
||||
InputCallbacks = new InputCallbackSystem();
|
||||
|
||||
_disk1 = rom;
|
||||
RomSet.Add(rom);
|
||||
_romSet.Add(rom);
|
||||
|
||||
_appleIIRom = comm.CoreFileProvider.GetFirmware(
|
||||
SystemId, "AppleIIe", true, "The Apple IIe BIOS firmware is required");
|
||||
|
@ -55,22 +55,27 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
// for junk.dsk the .dsk is important because it determines the format from that
|
||||
InitDisk();
|
||||
|
||||
ser.Register<ITraceable>(Tracer);
|
||||
ser.Register<ITraceable>(_tracer);
|
||||
|
||||
setCallbacks();
|
||||
SetCallbacks();
|
||||
|
||||
InitSaveStates();
|
||||
SetupMemoryDomains();
|
||||
PutSettings(settings ?? new Settings());
|
||||
}
|
||||
|
||||
private List<GameInfo> GameInfoSet { get; set; }
|
||||
private readonly List<byte[]> RomSet = new List<byte[]>();
|
||||
private static readonly ControllerDefinition AppleIIController;
|
||||
|
||||
private readonly List<byte[]> _romSet = new List<byte[]>();
|
||||
private readonly ITraceable _tracer;
|
||||
|
||||
private Machine _machine;
|
||||
private byte[] _disk1;
|
||||
private readonly byte[] _appleIIRom;
|
||||
private readonly byte[] _diskIIRom;
|
||||
|
||||
public int CurrentDisk { get; private set; }
|
||||
public int DiskCount => RomSet.Count;
|
||||
|
||||
private ITraceable Tracer { get; }
|
||||
public int DiskCount => _romSet.Count;
|
||||
|
||||
public void SetDisk(int discNum)
|
||||
{
|
||||
|
@ -81,7 +86,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
private void IncrementDisk()
|
||||
{
|
||||
CurrentDisk++;
|
||||
if (CurrentDisk >= RomSet.Count)
|
||||
if (CurrentDisk >= _romSet.Count)
|
||||
{
|
||||
CurrentDisk = 0;
|
||||
}
|
||||
|
@ -94,29 +99,21 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
CurrentDisk--;
|
||||
if (CurrentDisk < 0)
|
||||
{
|
||||
CurrentDisk = RomSet.Count - 1;
|
||||
CurrentDisk = _romSet.Count - 1;
|
||||
}
|
||||
|
||||
InitDisk();
|
||||
}
|
||||
|
||||
|
||||
private void InitDisk()
|
||||
{
|
||||
_disk1 = RomSet[CurrentDisk];
|
||||
_disk1 = _romSet[CurrentDisk];
|
||||
|
||||
// make a writeable memory stream cloned from the rom.
|
||||
// for junk.dsk the .dsk is important because it determines the format from that
|
||||
_machine.BootDiskII.Drives[0].InsertDisk("junk.dsk", (byte[])_disk1.Clone(), false);
|
||||
}
|
||||
|
||||
private Machine _machine;
|
||||
private byte[] _disk1;
|
||||
private readonly byte[] _appleIIRom;
|
||||
private readonly byte[] _diskIIRom;
|
||||
|
||||
private static readonly ControllerDefinition AppleIIController;
|
||||
|
||||
private static readonly List<string> RealButtons = new List<string>(Keyboard.GetKeyNames()
|
||||
.Where(k => k != "White Apple") // Hack because these buttons aren't wired up yet
|
||||
.Where(k => k != "Black Apple")
|
||||
|
@ -128,22 +125,15 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
"Next Disk",
|
||||
};
|
||||
|
||||
static AppleII()
|
||||
{
|
||||
AppleIIController = new ControllerDefinition { Name = "Apple IIe Keyboard" };
|
||||
AppleIIController.BoolButtons.AddRange(RealButtons);
|
||||
AppleIIController.BoolButtons.AddRange(ExtraButtons);
|
||||
}
|
||||
public bool DriveLightEnabled => true;
|
||||
public bool DriveLightOn => _machine.DriveLight;
|
||||
|
||||
public bool DriveLightEnabled { get { return true; } }
|
||||
public bool DriveLightOn { get { return _machine.DriveLight; } }
|
||||
|
||||
private bool _nextPressed = false;
|
||||
private bool _prevPressed = false;
|
||||
private bool _nextPressed;
|
||||
private bool _prevPressed;
|
||||
|
||||
private void TracerWrapper(string[] content)
|
||||
{
|
||||
Tracer.Put(new TraceInfo
|
||||
_tracer.Put(new TraceInfo
|
||||
{
|
||||
Disassembly = content[0],
|
||||
RegisterInfo = content[1]
|
||||
|
@ -152,9 +142,9 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
|
||||
private void FrameAdv(bool render, bool rendersound)
|
||||
{
|
||||
if (Tracer.Enabled)
|
||||
if (_tracer.Enabled)
|
||||
{
|
||||
_machine.Cpu.TraceCallback = (s) => TracerWrapper(s);
|
||||
_machine.Cpu.TraceCallback = TracerWrapper;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -191,13 +181,12 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
Frame++;
|
||||
}
|
||||
|
||||
private void setCallbacks()
|
||||
private void SetCallbacks()
|
||||
{
|
||||
_machine.Memory.ReadCallback = MemoryCallbacks.CallReads;
|
||||
_machine.Memory.WriteCallback = MemoryCallbacks.CallWrites;
|
||||
_machine.Memory.ExecuteCallback = MemoryCallbacks.CallExecutes;
|
||||
_machine.Memory.InputCallback = InputCallbacks.Call;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +1,11 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
using System.IO;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Computers.AppleII
|
||||
{
|
||||
// barebones classes for writing and reading a simple bson-like format, used to gain a bit of speed in Apple II savestates
|
||||
|
||||
internal enum LBTOK : byte
|
||||
{
|
||||
Null,
|
||||
|
@ -38,61 +33,75 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
|
||||
public class LBR : JsonReader
|
||||
{
|
||||
public LBR(BinaryReader r)
|
||||
private readonly BinaryReader _r;
|
||||
private object _v;
|
||||
private JsonToken _t;
|
||||
|
||||
public LBR(BinaryReader reader)
|
||||
{
|
||||
this.r = r;
|
||||
_r = reader;
|
||||
}
|
||||
private BinaryReader r;
|
||||
|
||||
public override void Close()
|
||||
{
|
||||
}
|
||||
|
||||
// as best as I can tell, the serializers refer to depth, but don't actually need to work except when doing certain error recovery
|
||||
public override int Depth { get { return 0; } }
|
||||
public override string Path { get { throw new NotImplementedException(); } }
|
||||
public override Type ValueType { get { return v != null ? v.GetType() : null; } }
|
||||
public override JsonToken TokenType { get { return t; } }
|
||||
public override object Value { get { return v; } }
|
||||
private object v;
|
||||
private JsonToken t;
|
||||
public override int Depth => 0;
|
||||
|
||||
public override string Path
|
||||
{
|
||||
get { throw new NotImplementedException(); }
|
||||
}
|
||||
|
||||
public override Type ValueType => _v?.GetType();
|
||||
|
||||
public override JsonToken TokenType => _t;
|
||||
|
||||
public override object Value => _v;
|
||||
|
||||
public override bool Read()
|
||||
{
|
||||
LBTOK l = (LBTOK)r.ReadByte();
|
||||
LBTOK l = (LBTOK)_r.ReadByte();
|
||||
switch (l)
|
||||
{
|
||||
case LBTOK.StartArray: t = JsonToken.StartArray; v = null; break;
|
||||
case LBTOK.EndArray: t = JsonToken.EndArray; v = null; break;
|
||||
case LBTOK.StartObject: t = JsonToken.StartObject; v = null; break;
|
||||
case LBTOK.EndObject: t = JsonToken.EndObject; v = null; break;
|
||||
case LBTOK.Null: t = JsonToken.Null; v = null; break;
|
||||
case LBTOK.False: t = JsonToken.Boolean; v = false; break;
|
||||
case LBTOK.True: t = JsonToken.Boolean; v = true; break;
|
||||
case LBTOK.Property: t = JsonToken.PropertyName; v = r.ReadString(); break;
|
||||
case LBTOK.Undefined: t = JsonToken.Undefined; v = null; break;
|
||||
case LBTOK.S8: t = JsonToken.Integer; v = r.ReadSByte(); break;
|
||||
case LBTOK.U8: t = JsonToken.Integer; v = r.ReadByte(); break;
|
||||
case LBTOK.S16: t = JsonToken.Integer; v = r.ReadInt16(); break;
|
||||
case LBTOK.U16: t = JsonToken.Integer; v = r.ReadUInt16(); break;
|
||||
case LBTOK.S32: t = JsonToken.Integer; v = r.ReadInt32(); break;
|
||||
case LBTOK.U32: t = JsonToken.Integer; v = r.ReadUInt32(); break;
|
||||
case LBTOK.S64: t = JsonToken.Integer; v = r.ReadInt64(); break;
|
||||
case LBTOK.U64: t = JsonToken.Integer; v = r.ReadUInt64(); break;
|
||||
case LBTOK.String: t = JsonToken.String; v = r.ReadString(); break;
|
||||
case LBTOK.F32: t = JsonToken.Float; v = r.ReadSingle(); break;
|
||||
case LBTOK.F64: t = JsonToken.Float; v = r.ReadDouble(); break;
|
||||
case LBTOK.ByteArray: t = JsonToken.Bytes; v = r.ReadBytes(r.ReadInt32()); break;
|
||||
case LBTOK.StartArray: _t = JsonToken.StartArray; _v = null; break;
|
||||
case LBTOK.EndArray: _t = JsonToken.EndArray; _v = null; break;
|
||||
case LBTOK.StartObject: _t = JsonToken.StartObject; _v = null; break;
|
||||
case LBTOK.EndObject: _t = JsonToken.EndObject; _v = null; break;
|
||||
case LBTOK.Null: _t = JsonToken.Null; _v = null; break;
|
||||
case LBTOK.False: _t = JsonToken.Boolean; _v = false; break;
|
||||
case LBTOK.True: _t = JsonToken.Boolean; _v = true; break;
|
||||
case LBTOK.Property: _t = JsonToken.PropertyName; _v = _r.ReadString(); break;
|
||||
case LBTOK.Undefined: _t = JsonToken.Undefined; _v = null; break;
|
||||
case LBTOK.S8: _t = JsonToken.Integer; _v = _r.ReadSByte(); break;
|
||||
case LBTOK.U8: _t = JsonToken.Integer; _v = _r.ReadByte(); break;
|
||||
case LBTOK.S16: _t = JsonToken.Integer; _v = _r.ReadInt16(); break;
|
||||
case LBTOK.U16: _t = JsonToken.Integer; _v = _r.ReadUInt16(); break;
|
||||
case LBTOK.S32: _t = JsonToken.Integer; _v = _r.ReadInt32(); break;
|
||||
case LBTOK.U32: _t = JsonToken.Integer; _v = _r.ReadUInt32(); break;
|
||||
case LBTOK.S64: _t = JsonToken.Integer; _v = _r.ReadInt64(); break;
|
||||
case LBTOK.U64: _t = JsonToken.Integer; _v = _r.ReadUInt64(); break;
|
||||
case LBTOK.String: _t = JsonToken.String; _v = _r.ReadString(); break;
|
||||
case LBTOK.F32: _t = JsonToken.Float; _v = _r.ReadSingle(); break;
|
||||
case LBTOK.F64: _t = JsonToken.Float; _v = _r.ReadDouble(); break;
|
||||
case LBTOK.ByteArray: _t = JsonToken.Bytes; _v = _r.ReadBytes(_r.ReadInt32()); break;
|
||||
|
||||
default:
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override byte[] ReadAsBytes()
|
||||
{
|
||||
if (!Read() || t != JsonToken.Bytes)
|
||||
if (!Read() || _t != JsonToken.Bytes)
|
||||
{
|
||||
return null;
|
||||
return (byte[])v;
|
||||
}
|
||||
|
||||
return (byte[])_v;
|
||||
}
|
||||
|
||||
public override DateTime? ReadAsDateTime()
|
||||
|
@ -114,21 +123,25 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
{
|
||||
// TODO: speed this up if needed
|
||||
if (!Read())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (t)
|
||||
switch (_t)
|
||||
{
|
||||
case JsonToken.Null:
|
||||
return null;
|
||||
case JsonToken.Integer:
|
||||
case JsonToken.Float:
|
||||
return Convert.ToInt32(v);
|
||||
return Convert.ToInt32(_v);
|
||||
case JsonToken.String:
|
||||
int i;
|
||||
if (int.TryParse(v.ToString(), out i))
|
||||
if (int.TryParse(_v.ToString(), out i))
|
||||
{
|
||||
return i;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
return null;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
@ -137,9 +150,11 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
public override string ReadAsString()
|
||||
{
|
||||
if (!Read())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (t)
|
||||
switch (_t)
|
||||
{
|
||||
case JsonToken.Null:
|
||||
return null;
|
||||
|
@ -147,7 +162,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
case JsonToken.Integer:
|
||||
case JsonToken.Boolean:
|
||||
case JsonToken.String:
|
||||
return v.ToString();
|
||||
return _v.ToString();
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
@ -156,6 +171,8 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
|
||||
public class LBW : JsonWriter
|
||||
{
|
||||
private readonly BinaryWriter w;
|
||||
|
||||
private void WT(LBTOK t)
|
||||
{
|
||||
w.Write((byte)t);
|
||||
|
@ -165,7 +182,6 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
{
|
||||
this.w = w;
|
||||
}
|
||||
private BinaryWriter w;
|
||||
|
||||
public override void Flush()
|
||||
{
|
||||
|
@ -223,5 +239,4 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|||
public override void WriteValue(TimeSpan value) { throw new NotImplementedException(); }
|
||||
public override void WriteValue(Uri value) { throw new NotImplementedException(); }
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue