Break up TI83.cs into different files for different interface implementations, super useful commit

This commit is contained in:
adelikat 2014-11-23 16:58:43 +00:00
parent 1832894405
commit c1c9a482f9
5 changed files with 249 additions and 205 deletions

View File

@ -85,7 +85,10 @@
<Compile Include="..\VersionInfo.cs">
<Link>VersionInfo.cs</Link>
</Compile>
<Compile Include="Calculator\TI83.IMemoryDomains.cs" />
<Compile Include="Calculator\TI83.ISettable.cs" />
<Compile Include="Calculator\TI83.cs" />
<Compile Include="Calculator\TI83.IDebuggable.cs" />
<Compile Include="Computers\Commodore64\C64.Core.cs" />
<Compile Include="Computers\Commodore64\C64.cs" />
<Compile Include="Computers\Commodore64\C64.Motherboard.cs" />

View File

@ -0,0 +1,123 @@
using System;
using System.Collections.Generic;
using BizHawk.Common.NumberExtensions;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Calculators
{
public partial class TI83 : IDebuggable
{
public IDictionary<string, int> GetCpuFlagsAndRegisters()
{
return new Dictionary<string, int>
{
{ "A", cpu.RegisterA },
{ "AF", cpu.RegisterAF },
{ "B", cpu.RegisterB },
{ "BC", cpu.RegisterBC },
{ "C", cpu.RegisterC },
{ "D", cpu.RegisterD },
{ "DE", cpu.RegisterDE },
{ "E", cpu.RegisterE },
{ "F", cpu.RegisterF },
{ "H", cpu.RegisterH },
{ "HL", cpu.RegisterHL },
{ "I", cpu.RegisterI },
{ "IX", cpu.RegisterIX },
{ "IY", cpu.RegisterIY },
{ "L", cpu.RegisterL },
{ "PC", cpu.RegisterPC },
{ "R", cpu.RegisterR },
{ "Shadow AF", cpu.RegisterShadowAF },
{ "Shadow BC", cpu.RegisterShadowBC },
{ "Shadow DE", cpu.RegisterShadowDE },
{ "Shadow HL", cpu.RegisterShadowHL },
{ "SP", cpu.RegisterSP },
{ "Flag C", cpu.RegisterF.Bit(0) ? 1 : 0 },
{ "Flag N", cpu.RegisterF.Bit(1) ? 1 : 0 },
{ "Flag P/V", cpu.RegisterF.Bit(2) ? 1 : 0 },
{ "Flag 3rd", cpu.RegisterF.Bit(3) ? 1 : 0 },
{ "Flag H", cpu.RegisterF.Bit(4) ? 1 : 0 },
{ "Flag 5th", cpu.RegisterF.Bit(5) ? 1 : 0 },
{ "Flag Z", cpu.RegisterF.Bit(6) ? 1 : 0 },
{ "Flag S", cpu.RegisterF.Bit(7) ? 1 : 0 }
};
}
public void SetCpuRegister(string register, int value)
{
switch (register)
{
default:
throw new InvalidOperationException();
case "A":
cpu.RegisterA = (byte)value;
break;
case "AF":
cpu.RegisterAF = (byte)value;
break;
case "B":
cpu.RegisterB = (byte)value;
break;
case "BC":
cpu.RegisterBC = (byte)value;
break;
case "C":
cpu.RegisterC = (byte)value;
break;
case "D":
cpu.RegisterD = (byte)value;
break;
case "DE":
cpu.RegisterDE = (byte)value;
break;
case "E":
cpu.RegisterE = (byte)value;
break;
case "F":
cpu.RegisterF = (byte)value;
break;
case "H":
cpu.RegisterH = (byte)value;
break;
case "HL":
cpu.RegisterHL = (byte)value;
break;
case "I":
cpu.RegisterI = (byte)value;
break;
case "IX":
cpu.RegisterIX = (byte)value;
break;
case "IY":
cpu.RegisterIY = (byte)value;
break;
case "L":
cpu.RegisterL = (byte)value;
break;
case "PC":
cpu.RegisterPC = (ushort)value;
break;
case "R":
cpu.RegisterR = (byte)value;
break;
case "Shadow AF":
cpu.RegisterShadowAF = (byte)value;
break;
case "Shadow BC":
cpu.RegisterShadowBC = (byte)value;
break;
case "Shadow DE":
cpu.RegisterShadowDE = (byte)value;
break;
case "Shadow HL":
cpu.RegisterShadowHL = (byte)value;
break;
case "SP":
cpu.RegisterSP = (byte)value;
break;
}
}
}
}

View File

@ -0,0 +1,31 @@
using System.Collections.Generic;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Calculators
{
public partial class TI83 : IMemoryDomains
{
public MemoryDomainList MemoryDomains
{
get { return _memoryDomains; }
}
private void SetupMemoryDomains()
{
var domains = new List<MemoryDomain>
{
new MemoryDomain(
"Main RAM",
ram.Length,
MemoryDomain.Endian.Little,
addr => ram[addr],
(addr, value) => ram[addr] = value
)
};
_memoryDomains = new MemoryDomainList(domains);
}
private MemoryDomainList _memoryDomains;
}
}

View File

@ -0,0 +1,46 @@
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Calculators
{
public partial class TI83 : ISettable<TI83.TI83Settings, object>
{
private TI83Settings Settings;
public TI83Settings GetSettings()
{
return Settings.Clone();
}
public bool PutSettings(TI83Settings o)
{
Settings = o;
return false;
}
public object GetSyncSettings()
{
return null;
}
public bool PutSyncSettings(object o)
{
return false;
}
public class TI83Settings
{
public uint BGColor = 0x889778;
public uint ForeColor = 0x36412D;
public TI83Settings()
{
}
public TI83Settings Clone()
{
return (TI83Settings)MemberwiseClone();
}
}
}
}

View File

@ -9,7 +9,7 @@ using BizHawk.Common.NumberExtensions;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Components.Z80;
//http://www.ticalc.org/pub/text/calcinfo/
// http://www.ticalc.org/pub/text/calcinfo/
namespace BizHawk.Emulation.Cores.Calculators
{
@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Calculators
isPorted: false,
isReleased: true
)]
public class TI83 : IEmulator, IMemoryDomains, IDebuggable, ISettable<TI83.TI83Settings, object>
public partial class TI83 : IEmulator, IMemoryDomains, IDebuggable, ISettable<TI83.TI83Settings, object>
{
//hardware
private readonly Z80A cpu = new Z80A();
@ -47,6 +47,38 @@ namespace BizHawk.Emulation.Cores.Calculators
private bool LinkActive;
private bool m_CursorMoved;
private int lagCount = 0;
private bool lagged = true;
private bool isLag = false;
private int frame;
[CoreConstructor("TI83")]
public TI83(CoreComm comm, GameInfo game, byte[] rom, object Settings)
{
PutSettings((TI83Settings)Settings ?? new TI83Settings());
CoreComm = comm;
cpu.ReadMemory = ReadMemory;
cpu.WriteMemory = WriteMemory;
cpu.ReadHardware = ReadHardware;
cpu.WriteHardware = WriteHardware;
cpu.IRQCallback = IRQCallback;
cpu.NMICallback = NMICallback;
this.rom = rom;
LinkPort = new Link(this);
//different calculators (different revisions?) have different initPC. we track this in the game database by rom hash
//if( *(unsigned long *)(m_pRom + 0x6ce) == 0x04D3163E ) m_Regs.PC.W = 0x6ce; //KNOWN
//else if( *(unsigned long *)(m_pRom + 0x6f6) == 0x04D3163E ) m_Regs.PC.W = 0x6f6; //UNKNOWN
if (game["initPC"])
startPC = ushort.Parse(game.OptionValue("initPC"), NumberStyles.HexNumber);
HardReset();
SetupMemoryDomains();
}
//-------
public byte ReadMemory(ushort addr)
@ -155,7 +187,7 @@ namespace BizHawk.Emulation.Cores.Calculators
return 0xFF;
}
byte ReadKeyboard()
private byte ReadKeyboard()
{
CoreComm.InputCallback.Call();
//ref TI-9X
@ -240,7 +272,7 @@ namespace BizHawk.Emulation.Cores.Calculators
}
byte ReadDispData()
private byte ReadDispData()
{
if (m_CursorMoved)
{
@ -265,7 +297,7 @@ namespace BizHawk.Emulation.Cores.Calculators
return ret;
}
void WriteDispData(byte value)
private void WriteDispData(byte value)
{
int offset;
if (disp_mode == 1)
@ -298,7 +330,7 @@ namespace BizHawk.Emulation.Cores.Calculators
doDispMove();
}
void doDispMove()
private void doDispMove()
{
switch (disp_move)
{
@ -312,7 +344,7 @@ namespace BizHawk.Emulation.Cores.Calculators
disp_y &= 0x3F;
}
void WriteDispCtrl(byte value)
private void WriteDispCtrl(byte value)
{
if (value <= 1)
disp_mode = value;
@ -347,50 +379,22 @@ namespace BizHawk.Emulation.Cores.Calculators
}
}
[CoreConstructor("TI83")]
public TI83(CoreComm comm, GameInfo game, byte[] rom, object Settings)
{
PutSettings((TI83Settings)Settings ?? new TI83Settings());
CoreComm = comm;
cpu.ReadMemory = ReadMemory;
cpu.WriteMemory = WriteMemory;
cpu.ReadHardware = ReadHardware;
cpu.WriteHardware = WriteHardware;
cpu.IRQCallback = IRQCallback;
cpu.NMICallback = NMICallback;
this.rom = rom;
LinkPort = new Link(this);
//different calculators (different revisions?) have different initPC. we track this in the game database by rom hash
//if( *(unsigned long *)(m_pRom + 0x6ce) == 0x04D3163E ) m_Regs.PC.W = 0x6ce; //KNOWN
//else if( *(unsigned long *)(m_pRom + 0x6f6) == 0x04D3163E ) m_Regs.PC.W = 0x6f6; //UNKNOWN
if (game["initPC"])
startPC = ushort.Parse(game.OptionValue("initPC"), NumberStyles.HexNumber);
HardReset();
SetupMemoryDomains();
}
void IRQCallback()
private void IRQCallback()
{
//Console.WriteLine("IRQ with vec {0} and cpu.InterruptMode {1}", cpu.RegisterI, cpu.InterruptMode);
cpu.Interrupt = false;
}
void NMICallback()
private void NMICallback()
{
Console.WriteLine("NMI");
cpu.NonMaskableInterrupt = false;
}
public CoreComm CoreComm { get; private set; }
protected byte[] vram = new byte[0x300];
class MyVideoProvider : IVideoProvider
private class MyVideoProvider : IVideoProvider
{
private readonly TI83 emu;
public MyVideoProvider(TI83 emu)
@ -458,8 +462,8 @@ namespace BizHawk.Emulation.Cores.Calculators
public IController Controller { get; set; }
//configuration
ushort startPC;
// configuration
private ushort startPC;
public void FrameAdvance(bool render, bool rendersound)
{
@ -507,10 +511,6 @@ namespace BizHawk.Emulation.Cores.Calculators
disp_x = disp_y = 0;
}
private int lagCount = 0;
private bool lagged = true;
private bool isLag = false;
private int frame;
public int Frame { get { return frame; } set { frame = value; } }
public int LagCount { get { return lagCount; } set { lagCount = value; } }
public bool IsLagFrame { get { return isLag; } }
@ -539,7 +539,7 @@ namespace BizHawk.Emulation.Cores.Calculators
public void SaveStateText(TextWriter tw) { SyncState(Serializer.CreateTextWriter(tw)); }
public void LoadStateText(TextReader tr) { SyncState(Serializer.CreateTextReader(tr)); }
void SyncState(Serializer ser)
private void SyncState(Serializer ser)
{
ser.BeginSection("TI83");
cpu.SyncState(ser);
@ -562,7 +562,7 @@ namespace BizHawk.Emulation.Cores.Calculators
ser.EndSection();
}
byte[] stateBuffer;
private byte[] stateBuffer;
public byte[] SaveStateBinary()
{
if (stateBuffer == null)
@ -587,27 +587,8 @@ namespace BizHawk.Emulation.Cores.Calculators
public string SystemId { get { return "TI83"; } }
public string BoardName { get { return null; } }
private MemoryDomainList _memoryDomains;
private const ushort RamSizeMask = 0x7FFF;
private void SetupMemoryDomains()
{
var domains = new List<MemoryDomain>
{
new MemoryDomain(
"Main RAM",
ram.Length,
MemoryDomain.Endian.Little,
addr => ram[addr],
(addr, value) => ram[addr] = value
)
};
_memoryDomains = new MemoryDomainList(domains);
}
public MemoryDomainList MemoryDomains { get { return _memoryDomains; } }
public void Dispose() { }
public Link LinkPort;
@ -979,145 +960,5 @@ namespace BizHawk.Emulation.Cores.Calculators
SendNextFile();
}
}
public class TI83Settings
{
public uint BGColor = 0x889778;
public uint ForeColor = 0x36412D;
public TI83Settings()
{
}
public TI83Settings Clone()
{
return (TI83Settings)MemberwiseClone();
}
}
TI83Settings Settings;
public TI83Settings GetSettings() { return Settings.Clone(); }
public bool PutSettings(TI83Settings o)
{
Settings = o;
return false;
}
public object GetSyncSettings() { return null; }
public bool PutSyncSettings(object o) { return false; }
public IDictionary<string, int> GetCpuFlagsAndRegisters()
{
return new Dictionary<string, int>
{
{ "A", cpu.RegisterA },
{ "AF", cpu.RegisterAF },
{ "B", cpu.RegisterB },
{ "BC", cpu.RegisterBC },
{ "C", cpu.RegisterC },
{ "D", cpu.RegisterD },
{ "DE", cpu.RegisterDE },
{ "E", cpu.RegisterE },
{ "F", cpu.RegisterF },
{ "H", cpu.RegisterH },
{ "HL", cpu.RegisterHL },
{ "I", cpu.RegisterI },
{ "IX", cpu.RegisterIX },
{ "IY", cpu.RegisterIY },
{ "L", cpu.RegisterL },
{ "PC", cpu.RegisterPC },
{ "R", cpu.RegisterR },
{ "Shadow AF", cpu.RegisterShadowAF },
{ "Shadow BC", cpu.RegisterShadowBC },
{ "Shadow DE", cpu.RegisterShadowDE },
{ "Shadow HL", cpu.RegisterShadowHL },
{ "SP", cpu.RegisterSP },
{ "Flag C", cpu.RegisterF.Bit(0) ? 1 : 0 },
{ "Flag N", cpu.RegisterF.Bit(1) ? 1 : 0 },
{ "Flag P/V", cpu.RegisterF.Bit(2) ? 1 : 0 },
{ "Flag 3rd", cpu.RegisterF.Bit(3) ? 1 : 0 },
{ "Flag H", cpu.RegisterF.Bit(4) ? 1 : 0 },
{ "Flag 5th", cpu.RegisterF.Bit(5) ? 1 : 0 },
{ "Flag Z", cpu.RegisterF.Bit(6) ? 1 : 0 },
{ "Flag S", cpu.RegisterF.Bit(7) ? 1 : 0 }
};
}
public void SetCpuRegister(string register, int value)
{
switch (register)
{
default:
throw new InvalidOperationException();
case "A":
cpu.RegisterA = (byte)value;
break;
case "AF":
cpu.RegisterAF = (byte)value;
break;
case "B":
cpu.RegisterB = (byte)value;
break;
case "BC":
cpu.RegisterBC = (byte)value;
break;
case "C":
cpu.RegisterC = (byte)value;
break;
case "D":
cpu.RegisterD = (byte)value;
break;
case "DE":
cpu.RegisterDE = (byte)value;
break;
case "E":
cpu.RegisterE = (byte)value;
break;
case "F":
cpu.RegisterF = (byte)value;
break;
case "H":
cpu.RegisterH = (byte)value;
break;
case "HL":
cpu.RegisterHL = (byte)value;
break;
case "I":
cpu.RegisterI = (byte)value;
break;
case "IX":
cpu.RegisterIX = (byte)value;
break;
case "IY":
cpu.RegisterIY = (byte)value;
break;
case "L":
cpu.RegisterL = (byte)value;
break;
case "PC":
cpu.RegisterPC = (ushort)value;
break;
case "R":
cpu.RegisterR = (byte)value;
break;
case "Shadow AF":
cpu.RegisterShadowAF = (byte)value;
break;
case "Shadow BC":
cpu.RegisterShadowBC = (byte)value;
break;
case "Shadow DE":
cpu.RegisterShadowDE = (byte)value;
break;
case "Shadow HL":
cpu.RegisterShadowHL = (byte)value;
break;
case "SP":
cpu.RegisterSP = (byte)value;
break;
}
}
}
}