AppleII - Add MemoryCallbacks, Breakpoint Support, Set Registers in Debugger to proper bit size.

This commit is contained in:
scrimpeh 2015-07-05 17:09:07 +02:00
parent 0a6fb3dce2
commit 43dd015b51
6 changed files with 75 additions and 11 deletions

View File

@ -20,12 +20,28 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
reg.Key,
reg.Key.Contains("Flag")
? reg.Value > 0
: (RegisterValue)reg.Value);
: 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)
@ -189,10 +205,6 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
private const byte JSRSize = 3;
public IMemoryCallbackSystem MemoryCallbacks
{
[FeatureNotImplemented]
get { throw new NotImplementedException(); }
}
public IMemoryCallbackSystem MemoryCallbacks { get; private set; }
}
}

View File

@ -16,7 +16,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
{
if (addr < 0 || addr >= 0xC000)
throw new ArgumentOutOfRangeException();
return (byte)_machine.Memory.Read((int)addr);
return (byte)_machine.Memory.Peek((int)addr);
},
(addr, value) =>
{
@ -32,7 +32,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
return (byte)_machine.Memory.Read((int)addr);
return (byte)_machine.Memory.Peek((int)addr);
},
(addr, value) =>
{

View File

@ -32,6 +32,9 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
ServiceProvider = ser;
CoreComm = comm;
Tracer = new TraceBuffer();
MemoryCallbacks = new MemoryCallbackSystem();
_disk1 = rom;
RomSet.Add(rom);
@ -48,10 +51,13 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
//for junk.dsk the .dsk is important because it determines the format from that
InitDisk();
//trace logger stuff
Tracer = new TraceBuffer();
ser.Register<ITraceable>(Tracer);
//Set up Memory Callbacks
_machine.Memory.ReadCallback = MemoryCallbacks.CallReads;
_machine.Memory.WriteCallback = MemoryCallbacks.CallWrites;
_machine.Memory.ExecuteCallback = MemoryCallbacks.CallExecutes;
InitSaveStates();
SetupMemoryDomains();
PutSettings(settings ?? new Settings());

View File

@ -405,7 +405,7 @@ namespace Jellyfish.Virtu
}
CC = 0;
OpCode = _memory.Read(RPC);
OpCode = _memory.ReadOpcode(RPC);
RPC = (RPC + 1) & 0xFFFF;
_executeOpCode[OpCode]();
Cycles += CC;

View File

@ -183,7 +183,33 @@ namespace Jellyfish.Virtu
}
#region Core Read & Write
public int ReadOpcode(int address)
{
int region = PageRegion[address >> 8];
var result = ((address & 0xF000) != 0xC000) ? _regionRead[region][address - RegionBaseAddress[region]] : ReadIoRegionC0CF(address);
if (ExecuteCallback != null)
{
ExecuteCallback((uint)address);
}
if (ReadCallback != null)
{
ReadCallback((uint)address);
}
return result;
}
public int Read(int address)
{
int region = PageRegion[address >> 8];
var result = ((address & 0xF000) != 0xC000) ? _regionRead[region][address - RegionBaseAddress[region]] : ReadIoRegionC0CF(address);
if (ReadCallback != null)
{
ReadCallback((uint)address);
}
return result;
}
public int Peek(int address)
{
int region = PageRegion[address >> 8];
return ((address & 0xF000) != 0xC000) ? _regionRead[region][address - RegionBaseAddress[region]] : ReadIoRegionC0CF(address);
@ -191,6 +217,10 @@ namespace Jellyfish.Virtu
public int ReadZeroPage(int address)
{
if (ReadCallback != null)
{
ReadCallback((uint)address);
}
return _zeroPage[address];
}
@ -199,16 +229,28 @@ namespace Jellyfish.Virtu
int region = PageRegion[address >> 8];
if (_writeRegion[region] == null)
{
if (WriteCallback != null)
{
WriteCallback((uint)(_regionWrite[region][address - RegionBaseAddress[region]]));
}
_regionWrite[region][address - RegionBaseAddress[region]] = (byte)data;
}
else
{
if (WriteCallback != null)
{
WriteCallback((uint)address);
}
_writeRegion[region](address, (byte)data);
}
}
public void WriteZeroPage(int address, int data)
{
if (WriteCallback != null)
{
WriteCallback((uint)address);
}
_zeroPage[address] = (byte)data;
}
#endregion
@ -2088,6 +2130,10 @@ namespace Jellyfish.Virtu
private Action<int, byte> _writeIoRegionC8CF;
private Action<int, byte> _writeRomRegionD0FF;
public Action<uint> ReadCallback;
public Action<uint> WriteCallback;
public Action<uint> ExecuteCallback;
private Keyboard _keyboard;
private GamePort _gamePort;
private Cassette _cassette;

Binary file not shown.