TI83 core cleanups

This commit is contained in:
adelikat 2017-05-01 09:10:07 -05:00
parent 698c6741ae
commit 69d056e990
5 changed files with 143 additions and 140 deletions

View File

@ -12,36 +12,36 @@ namespace BizHawk.Emulation.Cores.Calculators
{
return new Dictionary<string, RegisterValue>
{
["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),
["Flag N"] = Cpu.RegisterF.Bit(1),
["Flag P/V"] = Cpu.RegisterF.Bit(2),
["Flag 3rd"] = Cpu.RegisterF.Bit(3),
["Flag H"] = Cpu.RegisterF.Bit(4),
["Flag 5th"] = Cpu.RegisterF.Bit(5),
["Flag Z"] = Cpu.RegisterF.Bit(6),
["Flag S"] = Cpu.RegisterF.Bit(7)
["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),
["Flag N"] = _cpu.RegisterF.Bit(1),
["Flag P/V"] = _cpu.RegisterF.Bit(2),
["Flag 3rd"] = _cpu.RegisterF.Bit(3),
["Flag H"] = _cpu.RegisterF.Bit(4),
["Flag 5th"] = _cpu.RegisterF.Bit(5),
["Flag Z"] = _cpu.RegisterF.Bit(6),
["Flag S"] = _cpu.RegisterF.Bit(7)
};
}
@ -52,70 +52,70 @@ namespace BizHawk.Emulation.Cores.Calculators
default:
throw new InvalidOperationException();
case "A":
Cpu.RegisterA = (byte)value;
_cpu.RegisterA = (byte)value;
break;
case "AF":
Cpu.RegisterAF = (byte)value;
_cpu.RegisterAF = (byte)value;
break;
case "B":
Cpu.RegisterB = (byte)value;
_cpu.RegisterB = (byte)value;
break;
case "BC":
Cpu.RegisterBC = (byte)value;
_cpu.RegisterBC = (byte)value;
break;
case "C":
Cpu.RegisterC = (byte)value;
_cpu.RegisterC = (byte)value;
break;
case "D":
Cpu.RegisterD = (byte)value;
_cpu.RegisterD = (byte)value;
break;
case "DE":
Cpu.RegisterDE = (byte)value;
_cpu.RegisterDE = (byte)value;
break;
case "E":
Cpu.RegisterE = (byte)value;
_cpu.RegisterE = (byte)value;
break;
case "F":
Cpu.RegisterF = (byte)value;
_cpu.RegisterF = (byte)value;
break;
case "H":
Cpu.RegisterH = (byte)value;
_cpu.RegisterH = (byte)value;
break;
case "HL":
Cpu.RegisterHL = (byte)value;
_cpu.RegisterHL = (byte)value;
break;
case "I":
Cpu.RegisterI = (byte)value;
_cpu.RegisterI = (byte)value;
break;
case "IX":
Cpu.RegisterIX = (byte)value;
_cpu.RegisterIX = (byte)value;
break;
case "IY":
Cpu.RegisterIY = (byte)value;
_cpu.RegisterIY = (byte)value;
break;
case "L":
Cpu.RegisterL = (byte)value;
_cpu.RegisterL = (byte)value;
break;
case "PC":
Cpu.RegisterPC = (ushort)value;
_cpu.RegisterPC = (ushort)value;
break;
case "R":
Cpu.RegisterR = (byte)value;
_cpu.RegisterR = (byte)value;
break;
case "Shadow AF":
Cpu.RegisterShadowAF = (byte)value;
_cpu.RegisterShadowAF = (byte)value;
break;
case "Shadow BC":
Cpu.RegisterShadowBC = (byte)value;
_cpu.RegisterShadowBC = (byte)value;
break;
case "Shadow DE":
Cpu.RegisterShadowDE = (byte)value;
_cpu.RegisterShadowDE = (byte)value;
break;
case "Shadow HL":
Cpu.RegisterShadowHL = (byte)value;
_cpu.RegisterShadowHL = (byte)value;
break;
case "SP":
Cpu.RegisterSP = (byte)value;
_cpu.RegisterSP = (byte)value;
break;
}
}
@ -133,6 +133,6 @@ namespace BizHawk.Emulation.Cores.Calculators
return false;
}
public int TotalExecutedCycles => Cpu.TotalExecutedCycles;
public int TotalExecutedCycles => _cpu.TotalExecutedCycles;
}
}

View File

@ -4,31 +4,30 @@ namespace BizHawk.Emulation.Cores.Calculators
{
public partial class TI83 : IEmulator
{
public IEmulatorServiceProvider ServiceProvider { get; private set; }
public IEmulatorServiceProvider ServiceProvider { get; }
public ControllerDefinition ControllerDefinition
{
get { return TI83Controller; }
}
public ControllerDefinition ControllerDefinition => TI83Controller;
public void FrameAdvance(IController controller, bool render, bool rendersound)
{
_controller = controller;
_lagged = true;
Cpu.Debug = Tracer.Enabled;
_cpu.Debug = _tracer.Enabled;
if (Cpu.Debug && Cpu.Logger == null) // TODO, lets not do this on each frame. But lets refactor CoreComm/CoreComm first
Cpu.Logger = (s) => Tracer.Put(s);
if (_cpu.Debug && _cpu.Logger == null) // TODO, lets not do this on each frame. But lets refactor CoreComm/CoreComm first
{
_cpu.Logger = s => _tracer.Put(s);
}
//I eyeballed this speed
// I eyeballed this speed
for (int i = 0; i < 5; i++)
{
_onPressed = controller.IsPressed("ON");
//and this was derived from other emus
Cpu.ExecuteCycles(10000);
Cpu.Interrupt = true;
// and this was derived from other emus
_cpu.ExecuteCycles(10000);
_cpu.Interrupt = true;
}
Frame++;
@ -44,22 +43,24 @@ namespace BizHawk.Emulation.Cores.Calculators
public int Frame
{
get { return _frame; }
set { _frame = value; }
private set { _frame = value; }
}
public string SystemId { get { return "TI83"; } }
public string SystemId => "TI83";
public bool DeterministicEmulation { get { return true; } }
public bool DeterministicEmulation => true;
public void ResetCounters()
public void ResetCounters()
{
Frame = 0;
_lagCount = 0;
_isLag = false;
}
public CoreComm CoreComm { get; private set; }
public CoreComm CoreComm { get; }
public void Dispose() { }
public void Dispose()
{
}
}
}

View File

@ -8,8 +8,8 @@ namespace BizHawk.Emulation.Cores.Calculators
{
public partial class TI83
{
private IMemoryDomains _memoryDomains;
private readonly Dictionary<string, MemoryDomainByteArray> _byteArrayDomains = new Dictionary<string, MemoryDomainByteArray>();
private IMemoryDomains _memoryDomains;
private bool _memoryDomainsInit = false;
private void SetupMemoryDomains()
@ -21,13 +21,13 @@ namespace BizHawk.Emulation.Cores.Calculators
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
return Cpu.ReadMemory((ushort)addr);
return _cpu.ReadMemory((ushort)addr);
},
(addr, value) =>
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
Cpu.WriteMemory((ushort)addr, value);
_cpu.WriteMemory((ushort)addr, value);
}, 1);
domains.Add(systemBusDomain);

View File

@ -9,10 +9,7 @@ namespace BizHawk.Emulation.Cores.Calculators
{
private byte[] _stateBuffer;
public bool BinarySaveStatesPreferred
{
get { return false; }
}
public bool BinarySaveStatesPreferred => false;
public void SaveStateBinary(BinaryWriter bw)
{
@ -58,7 +55,7 @@ namespace BizHawk.Emulation.Cores.Calculators
private void SyncState(Serializer ser)
{
ser.BeginSection("TI83");
Cpu.SyncState(ser);
_cpu.SyncState(ser);
ser.Sync("RAM", ref _ram, false);
ser.Sync("romPageLow3Bits", ref _romPageLow3Bits);
ser.Sync("romPageHighBit", ref _romPageHighBit);
@ -70,7 +67,7 @@ namespace BizHawk.Emulation.Cores.Calculators
ser.Sync("maskOn", ref _maskOn);
ser.Sync("onPressed", ref _onPressed);
ser.Sync("keyboardMask", ref _keyboardMask);
ser.Sync("m_LinkOutput", ref LinkOutput);
ser.Sync("m_LinkOutput", ref _linkOutput);
ser.Sync("VRAM", ref _vram, false);
ser.Sync("Frame", ref _frame);
ser.Sync("LagCount", ref _lagCount);

View File

@ -18,19 +18,20 @@ namespace BizHawk.Emulation.Cores.Calculators
[CoreConstructor("TI83")]
public TI83(CoreComm comm, GameInfo game, byte[] rom, object Settings)
{
ServiceProvider = new BasicServiceProvider(this);
var ser = new BasicServiceProvider(this);
ServiceProvider = ser;
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;
Cpu.MemoryCallbacks = MemoryCallbacks;
_cpu.ReadMemory = ReadMemory;
_cpu.WriteMemory = WriteMemory;
_cpu.ReadHardware = ReadHardware;
_cpu.WriteHardware = WriteHardware;
_cpu.IRQCallback = IRQCallback;
_cpu.NMICallback = NMICallback;
_cpu.MemoryCallbacks = MemoryCallbacks;
Rom = rom;
_rom = rom;
LinkPort = new TI83LinkPort(this);
// different calculators (different revisions?) have different initPC. we track this in the game database by rom hash
@ -44,21 +45,19 @@ namespace BizHawk.Emulation.Cores.Calculators
HardReset();
SetupMemoryDomains();
Tracer = new TraceBuffer { Header = Cpu.TraceHeader };
_tracer = new TraceBuffer { Header = _cpu.TraceHeader };
var serviceProvider = ServiceProvider as BasicServiceProvider;
serviceProvider.Register<ITraceable>(Tracer);
serviceProvider.Register<IDisassemblable>(new Disassembler());
ser.Register<ITraceable>(_tracer);
ser.Register<IDisassemblable>(new Disassembler());
}
private readonly TraceBuffer Tracer;
private readonly TraceBuffer _tracer;
// hardware
private const ushort RamSizeMask = 0x7FFF;
private readonly Z80A _cpu = new Z80A();
private readonly byte[] _rom;
private readonly Z80A Cpu = new Z80A();
private readonly byte[] Rom;
// configuration
private readonly ushort _startPC;
private IController _controller;
@ -76,16 +75,16 @@ namespace BizHawk.Emulation.Cores.Calculators
private bool _cursorMoved;
private int _frame;
// configuration
private ushort _startPC;
// Link Cable
public TI83LinkPort LinkPort { get; }
internal bool LinkActive;
internal int LinkOutput, LinkInput;
private int _linkOutput;
internal int LinkState => (LinkOutput | LinkInput) ^ 3;
internal int LinkOutput => _linkOutput;
internal bool LinkActive { private get; set; }
internal int LinkInput { private get; set; }
internal int LinkState => (_linkOutput | LinkInput) ^ 3;
private static readonly ControllerDefinition TI83Controller =
new ControllerDefinition
@ -93,7 +92,7 @@ namespace BizHawk.Emulation.Cores.Calculators
Name = "TI83 Controller",
BoolButtons =
{
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9","DOT",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "DOT",
"ON", "ENTER",
"DOWN", "LEFT", "UP", "RIGHT",
"PLUS", "MINUS", "MULTIPLY", "DIVIDE",
@ -111,11 +110,11 @@ namespace BizHawk.Emulation.Cores.Calculators
if (addr < 0x4000)
{
ret = Rom[addr]; // ROM zero-page
ret = _rom[addr]; // ROM zero-page
}
else if (addr < 0x8000)
{
ret = Rom[(romPage * 0x4000) + addr - 0x4000]; // other rom page
ret = _rom[(romPage * 0x4000) + addr - 0x4000]; // other rom page
}
else
{
@ -129,11 +128,11 @@ namespace BizHawk.Emulation.Cores.Calculators
{
if (addr < 0x4000)
{
return; // ROM zero-page
// ROM zero-page
}
else if (addr < 0x8000)
{
return; // other rom page
// other rom page
}
else
{
@ -147,12 +146,12 @@ namespace BizHawk.Emulation.Cores.Calculators
{
case 0: // PORT_LINK
_romPageHighBit = (value >> 4) & 1;
LinkOutput = value & 3;
_linkOutput = value & 3;
if (LinkActive)
{
// Prevent rom calls from disturbing link port activity
if (LinkActive && Cpu.RegisterPC < 0x4000)
if (LinkActive && _cpu.RegisterPC < 0x4000)
{
return;
}
@ -164,7 +163,7 @@ namespace BizHawk.Emulation.Cores.Calculators
case 1: // PORT_KEYBOARD:
_lagged = false;
_keyboardMask = value;
//Console.WriteLine("write PORT_KEYBOARD {0:X2}",value);
////Console.WriteLine("write PORT_KEYBOARD {0:X2}",value);
break;
case 2: // PORT_ROMPAGE
_romPageLow3Bits = value & 0x7;
@ -173,11 +172,11 @@ namespace BizHawk.Emulation.Cores.Calculators
_maskOn = (byte)(value & 1);
break;
case 16: // PORT_DISPCTRL
//Console.WriteLine("write PORT_DISPCTRL {0}",value);
////Console.WriteLine("write PORT_DISPCTRL {0}",value);
WriteDispCtrl(value);
break;
case 17: // PORT_DISPDATA
//Console.WriteLine("write PORT_DISPDATA {0}",value);
////Console.WriteLine("write PORT_DISPDATA {0}",value);
WriteDispData(value);
break;
}
@ -191,7 +190,7 @@ namespace BizHawk.Emulation.Cores.Calculators
LinkPort.Update();
return (byte)((_romPageHighBit << 4) | (LinkState << 2) | LinkOutput);
case 1: // PORT_KEYBOARD:
//Console.WriteLine("read PORT_KEYBOARD");
////Console.WriteLine("read PORT_KEYBOARD");
return ReadKeyboard();
case 2: // PORT_ROMPAGE
return (byte)_romPageLow3Bits;
@ -204,32 +203,33 @@ namespace BizHawk.Emulation.Cores.Calculators
// 2 - Unknown, but used
// 3 - Set if ON key is up
// 4-7 - Unknown
//if (onPressed && maskOn) ret |= 1;
//if (!onPressed) ret |= 0x8;
return (byte)((_controller.IsPressed("ON") ? _maskOn : 8) | (LinkActive ? 0 : 2));
////if (onPressed && maskOn) ret |= 1;
////if (!onPressed) ret |= 0x8;
return (byte)((Controller.IsPressed("ON") ? _maskOn : 8) | (LinkActive ? 0 : 2));
}
case 4: // PORT_INTCTRL
//Console.WriteLine("read PORT_INTCTRL");
////Console.WriteLine("read PORT_INTCTRL");
return 0xFF;
case 16: // PORT_DISPCTRL
//Console.WriteLine("read DISPCTRL");
////Console.WriteLine("read DISPCTRL");
break;
case 17: // PORT_DISPDATA
return ReadDispData();
}
return 0xFF;
}
private byte ReadKeyboard()
{
InputCallbacks.Call();
//ref TI-9X
// ref TI-9X
int ret = 0xFF;
//Console.WriteLine("keyboardMask: {0:X2}",keyboardMask);
////Console.WriteLine("keyboardMask: {0:X2}",keyboardMask);
if ((_keyboardMask & 1) == 0)
{
if (_controller.IsPressed("DOWN")) ret ^= 1;
@ -326,7 +326,7 @@ namespace BizHawk.Emulation.Cores.Calculators
else
{
int column = 6 * (int)_displayX;
int offset = (int)_displayY * 12 + (column >> 3);
int offset = (int)(_displayY * 12) + (column >> 3);
int shift = 10 - (column & 7);
ret = (byte)(((_vram[offset] << 8) | _vram[offset + 1]) >> shift);
}
@ -340,13 +340,13 @@ namespace BizHawk.Emulation.Cores.Calculators
int offset;
if (_displayMode == 1)
{
offset = (int)_displayY * 12 + (int)_displayX;
offset = (int)(_displayY * 12) + (int)_displayX;
_vram[offset] = value;
}
else
{
int column = 6 * (int)_displayX;
offset = (int)_displayY * 12 + (column >> 3);
offset = (int)(_displayY * 12) + (column >> 3);
if (offset < 0x300)
{
int shift = column & 7;
@ -372,10 +372,18 @@ namespace BizHawk.Emulation.Cores.Calculators
{
switch (_displayMove)
{
case 0: _displayY--; break;
case 1: _displayY++; break;
case 2: _displayX--; break;
case 3: _displayX++; break;
case 0:
_displayY--;
break;
case 1:
_displayY++;
break;
case 2:
_displayX--;
break;
case 3:
_displayX++;
break;
}
_displayX &= 0xF; // 0xF or 0x1F? dunno
@ -416,37 +424,34 @@ namespace BizHawk.Emulation.Cores.Calculators
else if (value == 3)
{
}
else
{
}
}
private void IRQCallback()
{
// Console.WriteLine("IRQ with vec {0} and cpu.InterruptMode {1}", cpu.RegisterI, cpu.InterruptMode);
Cpu.Interrupt = false;
_cpu.Interrupt = false;
}
private void NMICallback()
{
Console.WriteLine("NMI");
Cpu.NonMaskableInterrupt = false;
_cpu.NonMaskableInterrupt = false;
}
private void HardReset()
{
Cpu.Reset();
_cpu.Reset();
_ram = new byte[0x8000];
for (int i = 0; i < 0x8000; i++)
{
_ram[i] = 0xFF;
}
Cpu.RegisterPC = _startPC;
_cpu.RegisterPC = _startPC;
Cpu.IFF1 = false;
Cpu.IFF2 = false;
Cpu.InterruptMode = 2;
_cpu.IFF1 = false;
_cpu.IFF2 = false;
_cpu.InterruptMode = 2;
_maskOn = 1;
_romPageHighBit = 0;