Esempio n. 1
0
 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;
     }
 }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 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;
     }
 }
Esempio n. 5
0
        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);
                }
            }
        }
Esempio n. 6
0
 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--;
     }
 }
Esempio n. 7
0
 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);
     }
 }
Esempio n. 8
0
        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;
        }
Esempio n. 9
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;
        }
Esempio n. 10
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;
        }
Esempio n. 11
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);
        }
Esempio n. 12
0
        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);
            }
        }
Esempio n. 13
0
        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;
        }
Esempio n. 14
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;
        }
Esempio n. 15
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);
     }
 }
Esempio n. 16
0
        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);
            }
        }
Esempio n. 17
0
        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;
        }
Esempio n. 18
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);
        }
Esempio n. 19
0
 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;
     }
 }
Esempio n. 20
0
        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);
        }
Esempio n. 21
0
 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));
     }
 }
Esempio n. 22
0
        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;
            }
        }
Esempio n. 23
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);
            }
        }
Esempio n. 24
0
        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();
        }
Esempio n. 25
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) - (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);
            }
        }
Esempio n. 26
0
 public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle)
 {
 }
Esempio n. 27
0
 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();
 }
Esempio n. 29
0
 public MainWindow()
 {
     InitializeComponent ();
     _clock = new Clock.Clock ();
 }
Esempio n. 30
0
 public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle)
 {
     cpu.State.P.IrqMask = true;
 }
Esempio n. 31
0
 public virtual void Execute(Clock.Clock clock, MOS6502 cpu, byte pageCrossProlong, byte cycle)
 {
     cpu.State.S.Value = cpu.State.X.Value;
 }