public virtual void Execute(Clock.Clock clock, byte cycle) { if (cycle == 0) { _cpu.Memory.Write(_cpu.State.S.Value, _cpu.State.PC.PCH); _cpu.State.S.Value--; } else if (cycle == 1) { _cpu.Memory.Write(_cpu.State.S.Value, _cpu.State.PC.PCL); _cpu.State.S.Value--; } else if (cycle == 2) { _cpu.Memory.Write(_cpu.State.S.Value, _cpu.State.P.Value); _cpu.State.S.Value--; } else if (cycle == 3) { _readBuffer = _cpu.Memory.Read(_isrPointer); } else if (cycle == 4) { _cpu.State.PC.Value = (ushort)((_cpu.Memory.Read((ushort)(_isrPointer + 1)) << 8) | _readBuffer); _cpu.State.P.IrqMask = true; } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { cpu.State.A.Value = cpu.State.Y.Value; cpu.State.P.Zero = cpu.State.A.IsZero; cpu.State.P.Negative = cpu.State.A.IsNegative; }
public void Restart(Clock.Clock clock, byte phase) { Clock.ClockEntry first = new Clock.ClockEntryRep(new ResetOp(this), 3); first.Next = new Clock.ClockEntry(new DecodeOpcodeOp(this)); clock.QueueOpsStart(first, phase); }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { if (cycle == 0) { cpu.Memory.Write(cpu.State.S.Value, cpu.State.PC.PCH); cpu.State.S.Value--; } else if (cycle == 1) { cpu.Memory.Write(cpu.State.S.Value, cpu.State.PC.PCL); cpu.State.S.Value--; } else if (cycle == 2) { cpu.Memory.Write(cpu.State.S.Value, cpu.State.P.Value); cpu.State.S.Value--; } else if (cycle == 3) { cpu.Result = cpu.Memory.Read(0xfffe); } else if (cycle == 4) { cpu.State.PC.Value = (ushort)((cpu.Memory.Read(0xffff) << 8) | cpu.Result); cpu.State.P.BreakCmd = true; } }
public void Execute(Clock.Clock clock, byte cycle) { if (_ca2 && _pulseCA2) { _ca2 = false; } if (_cb2 && _pulseCB2) { _cb2 = false; } if (_t1Count && --_t1Counter == 0) { if (_t1FreeRun) { _t1Counter = _t1Latch; } else { _t1Count = false; } SetInterrupt(IR.T1); } if (_t2Count /*&& (!_t2InPB || (_portB.Pins & 0x40) == 0)*/) { if (--_t2Counter == 0) { _t2Count = false; SetInterrupt(IR.T2); } } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { if (cycle == 1) { cpu.Memory.Write(cpu.State.S.Value, cpu.State.P.Value); cpu.State.S.Value--; } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { if (cycle == 0) { cpu.State.S.Value++; cpu.State.P.Value = cpu.Memory.Read(cpu.State.S.Value); } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { int tmp = cpu.State.Y.Value - cpu.Target.Read(); cpu.State.P.Carry = (tmp & 0xff00) == 0; cpu.State.P.Zero = (tmp & 0xff) == 0; cpu.State.P.Negative = (tmp & 0x80) != 0; }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { byte mem = cpu.Target.Read(); int tmp = cpu.State.A.Value & mem; cpu.State.P.Zero = (tmp & 0xff) == 0; cpu.State.P.Negative = (mem & 0x80) != 0; cpu.State.P.Overflow = (mem & 0x40) != 0; }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { byte tmp = (byte)(cpu.Target.Read() + 1); cpu.Result = tmp; cpu.State.P.Zero = tmp == 0; cpu.State.P.Negative = (tmp & 0x80) != 0; }
public virtual void Execute(Clock.Clock clock, byte cycle) { bool edge = _cntEdge; //if (_cntEdge) // _cntEdge = false; //if (_pcState) // _pcState = false; Timer(_timerB, Timer(_timerA, false, edge), edge); }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { cpu.State.A.Value &= cpu.Target.Read(); cpu.State.P.Zero = cpu.State.A.IsZero; cpu.State.P.Negative = cpu.State.A.IsNegative; if (cpu.Target.IsPageCrossed(cpu.State.PC.Value)) { clock.Prolong(pageCrossProlong, cpu.Phase); } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { byte value = cpu.Target.Read(); cpu.State.P.Carry = (value & 0x01) != 0; value >>= 1; cpu.Result = value; cpu.State.P.Zero = (value & 0xff) == 0; cpu.State.P.Negative = (value & 0x80) != 0; }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { byte carry = cpu.State.P.CarryValue; int tmp = (cpu.Target.Read() << 1) | carry; cpu.Result = (byte)tmp; cpu.State.P.Carry = (tmp & 0xff00) != 0; cpu.State.P.Zero = (tmp & 0xff) == 0; cpu.State.P.Negative = (tmp & 0x80) != 0; }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { if (cycle == 1) { cpu.State.S.Value++; cpu.Result = cpu.Memory.Read(cpu.State.S.Value); } else if (cycle == 2) { cpu.State.S.Value++; cpu.State.PC.Value = (ushort)((cpu.Result | (cpu.Memory.Read(cpu.State.S.Value) << 8)) + 1); } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { uint tmp = (uint)(cpu.State.A.Value - cpu.Target.Read()); cpu.State.P.Carry = (tmp & 0xff00) == 0; cpu.State.P.Zero = (tmp & 0xff) == 0; cpu.State.P.Negative = (tmp & 0x80) != 0; if (cpu.Target.IsPageCrossed(cpu.State.PC.Value)) { clock.Prolong(pageCrossProlong, cpu.Phase); } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { byte carry = cpu.State.P.CarryValue; byte tmp = cpu.Target.Read(); cpu.State.P.Carry = (tmp & 0x01) != 0; tmp = (byte)((tmp >> 1) | (carry << 7)); cpu.Result = (byte)tmp; cpu.State.P.Zero = (tmp & 0xff) == 0; cpu.State.P.Negative = (tmp & 0x80) != 0; }
public virtual void Execute(Clock.Clock clock, byte cycle) { Clock.ClockEntry first = null; Clock.ClockEntry next = null; if (_cpu.NMI.Check()) { first = next = new Clock.ClockEntryRep(new InterruptOp(_cpu, 0xfffa), 7); } else if (_cpu.IRQ.IsRaised && !_cpu.State.P.IrqMask) { first = next = new Clock.ClockEntryRep(new InterruptOp(_cpu, 0xfffe), 7); } else { _cpu.Opcode = _cpu.Memory.Read(_cpu.State.PC.Value); _cpu.State.PC.Next(); DecodingTable.Entry decoded = DecodingTable.Opcodes[_cpu.Opcode]; DecodeAddressOp addrOp = new DecodeAddressOp(_cpu, decoded._addressing); ExecuteOpcodeOp execOp = new ExecuteOpcodeOp(_cpu, decoded._instruction, decoded._timing._prolongOnPageCross); byte addrTime = decoded._timing._addressingTime; byte execTime = decoded._timing._execTime; first = addrTime < 2 ? new Clock.ClockEntry(addrOp, true) : new Clock.ClockEntryRep(addrOp, addrTime); first.ComboNext = execTime == 0 || addrTime == 0; next = first.Next = execTime < 2 ? new Clock.ClockEntry(execOp) : new Clock.ClockEntryRep(execOp, execTime); sbyte writeCycles = decoded._timing._writeTime; if (writeCycles >= 0) { if (writeCycles < 2) { next.ComboNext = writeCycles == 0; next = next.Next = new Clock.ClockEntry(new WriteResultOp(_cpu)); } else { next = next.Next = new Clock.ClockEntryRep(new Clock.StallOp(), (byte)(writeCycles - 1)); next = next.Next = new Clock.ClockEntry(new WriteResultOp(_cpu)); } } } next.Next = new Clock.ClockEntry(new DecodeOpcodeOp(_cpu)); clock.QueueOps(first, _cpu.Phase); }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { if (cycle == 0) { cpu.Memory.Write(cpu.State.S.Value, (byte)((cpu.State.PC.Value - 1) >> 8)); cpu.State.S.Value--; } else if (cycle == 1) { cpu.Memory.Write(cpu.State.S.Value, (byte)((cpu.State.PC.Value - 1))); cpu.State.S.Value--; } else { cpu.State.PC.Value = cpu.Target.Address; } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { byte prolong = 0; if (cpu.State.P.Overflow) { prolong++; ushort newAddress = cpu.Target.Address; if ((newAddress & 0xff00) != (cpu.State.PC.Value & 0xff00)) { prolong++; } cpu.State.PC.Value = newAddress; } clock.Prolong(prolong, cpu.Phase); }
public virtual void Execute(Clock.Clock clock, byte cycle) { if (cycle == 0) { _cpu.State.A.Reset(); _cpu.State.X.Reset(); _cpu.State.Y.Reset(); _cpu.State.S.Reset(); _cpu.State.P.Reset(); } else if (cycle == 1) { _readBuffer = _cpu.Memory.Read(0xfffc); } else if (cycle == 2) { _cpu.State.PC.Value = (ushort)(_readBuffer | (_cpu.Memory.Read(0xfffd) << 8)); } }
public void Execute(Clock.Clock clock, byte cycle) { _controller.CA1 = true; _cycleCount++; if (_cycleCount >= _density) { if (_controller.CB2) { if (_attachedImage != null) { byte data = _attachedImage.Tracks[_headTrackPos][_headSectorPos]; bool sync = _lastData == GCRImage.GCR_SYNC_BYTE && data == GCRImage.GCR_SYNC_BYTE; _controller.PortB.Input = !sync ? (byte)0x80 : (byte)0x00; _lastData = data; _controller.PortA.Input = data; if (!sync && _controller.CA2) { _controller.CA1 = false; RaiseOnDataReady(); } } } else { // write } if (_attachedImage != null) { _headSectorPos++; if (_headSectorPos >= _attachedImage.Tracks[_headTrackPos].Length) { _headSectorPos = 0; } } _cycleCount = 0; } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { byte mem = cpu.Target.Read(); byte a = cpu.State.A.Value; int tmp = 0, vCheck = 0; if (cpu.State.P.Decimal) { tmp = (a & 0x0f) + (mem & 0x0f) + cpu.State.P.CarryValue; if (tmp > 0x09) { tmp += 0x06; } tmp += (a & 0xf0) + (mem & 0xf0); vCheck = tmp; if ((tmp & 0x1f0) > 0x90) { tmp += 0x60; } cpu.State.P.Carry = (tmp & 0xff0) > 0xf0; } else { vCheck = tmp = a + mem + cpu.State.P.CarryValue; cpu.State.P.Carry = (tmp & 0xff00) != 0; } cpu.State.A.Value = (byte)tmp; cpu.State.P.Overflow = ((a ^ mem) & 0x80) == 0 && ((a ^ vCheck) & 0x80) != 0; //(mem & 0x80) == (a & 0x80) && (vCheck & 0x80) != (a & 0x80); cpu.State.P.Zero = cpu.State.A.IsZero; cpu.State.P.Negative = cpu.State.A.IsNegative; if (cpu.Target.IsPageCrossed(cpu.State.PC.Value)) { clock.Prolong(pageCrossProlong, cpu.Phase); } }
private static void Main() { var clock = new Clock.Clock(); clock.Notify(1000); var client1 = new Client(); var client2 = new Client(); client1.Subscribe(clock); client2.Subscribe(clock); clock.Notify(2000); Console.WriteLine("--------------------------"); client2.Unsubscribe(clock); clock.Notify(2000); Console.ReadLine(); }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { byte mem = cpu.Target.Read(); byte a = cpu.State.A.Value; int tmp = 0, vCheck = 0; if (cpu.State.P.Decimal) { tmp = (a & 0x0f) - (mem & 0x0f) - (1 - cpu.State.P.CarryValue); tmp = (tmp & 0x10) != 0 ? ((tmp - 6) & 0x0f) | ((a & 0xf0) - (mem & 0xf0) - 0x10) : tmp | ((a & 0xf0) - (mem & 0xf0)); vCheck = tmp; if ((tmp & 0xff00) != 0) { tmp -= 0x60; } cpu.State.P.Carry = (tmp & 0xff00) == 0; } else { vCheck = tmp = a - mem - (1 - cpu.State.P.CarryValue); cpu.State.P.Carry = (tmp & 0xff00) == 0; } cpu.State.A.Value = (byte)tmp; cpu.State.P.Overflow = ((a ^ mem) & 0x80) != 0 && ((a ^ vCheck) & 0x80) != 0; //(mem & 0x80) != (a & 0x80) && (tmp & 0x80) != (a & 0x80); cpu.State.P.Zero = cpu.State.A.IsZero; cpu.State.P.Negative = cpu.State.A.IsNegative; if (cpu.Target.IsPageCrossed(cpu.State.PC.Value)) { clock.Prolong(pageCrossProlong, cpu.Phase); } }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { cpu.State.PC.Value = cpu.Target.Address; }
public MainWindow() { InitializeComponent(); _clock = new Clock.Clock(); }
public MainWindow() { InitializeComponent (); _clock = new Clock.Clock (); }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { cpu.State.P.IrqMask = true; }
public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle) { cpu.State.S.Value = cpu.State.X.Value; }