Apple II Debugger - Add Stepping ability
This commit is contained in:
parent
212f94814d
commit
2da9650be5
|
@ -74,10 +74,115 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CanStep(StepType type) { return false; }
|
public bool CanStep(StepType type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case StepType.Into:
|
||||||
|
case StepType.Over:
|
||||||
|
case StepType.Out:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[FeatureNotImplemented]
|
|
||||||
public void Step(StepType type) { throw new NotImplementedException(); }
|
public void Step(StepType type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case StepType.Into:
|
||||||
|
StepInto();
|
||||||
|
break;
|
||||||
|
case StepType.Out:
|
||||||
|
StepOut();
|
||||||
|
break;
|
||||||
|
case StepType.Over:
|
||||||
|
StepOver();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StepInto()
|
||||||
|
{
|
||||||
|
var machineInVblank = _machine.Video.IsVBlank;
|
||||||
|
|
||||||
|
_machine.Events.HandleEvents(_machine.Cpu.Execute());
|
||||||
|
|
||||||
|
if (!machineInVblank && _machine.Video.IsVBlank) // Check if a frame has passed while stepping
|
||||||
|
{
|
||||||
|
Frame++;
|
||||||
|
if (_machine.Lagged)
|
||||||
|
{
|
||||||
|
LagCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
_machine.Lagged = true;
|
||||||
|
_machine.DriveLight = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StepOver()
|
||||||
|
{
|
||||||
|
var instruction = _machine.Memory.Read(_machine.Cpu.RPC);
|
||||||
|
|
||||||
|
if (instruction == JSR)
|
||||||
|
{
|
||||||
|
var destination = _machine.Cpu.RPC + JSRSize;
|
||||||
|
while (_machine.Cpu.RPC != destination)
|
||||||
|
{
|
||||||
|
StepInto();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StepInto();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StepOut()
|
||||||
|
{
|
||||||
|
var instr = _machine.Memory.Read(_machine.Cpu.RPC);
|
||||||
|
|
||||||
|
JSRCount = instr == JSR ? 1 : 0;
|
||||||
|
|
||||||
|
var bailOutFrame = Frame + 1;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
StepInto();
|
||||||
|
instr = _machine.Memory.Read(_machine.Cpu.RPC);
|
||||||
|
if (instr == JSR)
|
||||||
|
{
|
||||||
|
JSRCount++;
|
||||||
|
}
|
||||||
|
else if (instr == RTS && JSRCount <= 0)
|
||||||
|
{
|
||||||
|
StepInto();
|
||||||
|
JSRCount = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (instr == RTS)
|
||||||
|
{
|
||||||
|
JSRCount--;
|
||||||
|
}
|
||||||
|
else //Emergency Bailout Logic
|
||||||
|
{
|
||||||
|
if (Frame == bailOutFrame)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int JSRCount = 0;
|
||||||
|
|
||||||
|
private const byte JSR = 0x20;
|
||||||
|
private const byte RTS = 0x60;
|
||||||
|
|
||||||
|
private const byte JSRSize = 3;
|
||||||
|
|
||||||
public IMemoryCallbackSystem MemoryCallbacks
|
public IMemoryCallbackSystem MemoryCallbacks
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue