Beispiel #1
0
 public void Reset()
 {
     _additionalReadCycles  = 1;
     _additionalWriteCycles = 2;
     _read  = null;
     _write = null;
 }
Beispiel #2
0
 public void Reset()
 {
     _inputCycle.Reset();
     _destinationWriter = null;
     _repeatCycles.Reset();
     _remainingM1Cycles = 1;
 }
Beispiel #3
0
        public void StartExecution()
        {
            var addrMode = new RegIndirectWide(_cpu, WideRegister.SP, false);

            _read  = addrMode.Reader;
            _write = addrMode.Writer;
        }
Beispiel #4
0
        public void Clock()
        {
            if (!_addressMode.IsComplete)
            {
                _addressMode.Clock();

                if (_addressMode.IsComplete)
                {
                    _valueReader = _addressMode.Reader;
                    _valueWriter = _addressMode.Writer;
                    if (_valueReader.IsComplete)
                    {
                        PerformDecrement();
                    }
                }
                return;
            }
            if (!_valueReader.IsComplete)
            {
                _valueReader.Clock();
                if (_valueReader.IsComplete)
                {
                    PerformDecrement();
                }
                return;
            }
            if (!_valueWriter.IsComplete)
            {
                _valueWriter.Clock();
            }
        }
Beispiel #5
0
 public void Clock()
 {
     if (!_addressMode.IsComplete)
     {
         _addressMode.Clock();
         if (_addressMode.IsComplete)
         {
             _reader = _addressMode.Reader;
             _writer = _addressMode.Writer;
         }
         return;
     }
     if (!_reader.IsComplete)
     {
         _reader.Clock();
         if (_reader.IsComplete)
         {
             DoRotate();
         }
         return;
     }
     if (!_writer.IsComplete)
     {
         _writer.Clock();
     }
 }
Beispiel #6
0
 public void Reset()
 {
     _readCycle              = null;
     _writeCycle             = null;
     _additionalCycles       = 2;
     _additionalRepeatCycles = 5;
     IsComplete              = false;
 }
Beispiel #7
0
 public virtual void Reset()
 {
     _sourceAddressMode.Reset();
     _destinationAddressMode.Reset();
     _sourceReader      = null;
     _destinationWriter = null;
     _remainingM1Cycles = _additionalM1TCycles;
 }
Beispiel #8
0
 public void StartExecution()
 {
     if (_addressMode.IsComplete)
     {
         _reader = _addressMode.Reader;
         _writer = _addressMode.Writer;
         if (_reader.IsComplete)
         {
             ManipulateBit();
         }
     }
 }
Beispiel #9
0
 public void StartExecution()
 {
     if (_addressMode.IsComplete)
     {
         _valueReader = _addressMode.Reader;
         _valueWriter = _addressMode.Writer;
         if (_valueReader.IsComplete)
         {
             PerformDecrement();
         }
     }
 }
Beispiel #10
0
 public void StartExecution()
 {
     if (_addressMode.IsComplete)
     {
         _reader = _addressMode.Reader;
         _writer = _addressMode.Writer;
         if (_reader.IsComplete)
         {
             DoRotate();
         }
     }
 }
Beispiel #11
0
        public virtual void Clock()
        {
            if (_remainingM1Cycles-- <= 0)
            {
                // Destination is checked first as its operand comes first if there are
                // additional bytes to the instruction.
                if (!_destinationAddressMode.IsComplete)
                {
                    _destinationAddressMode.Clock();
                    if (_destinationAddressMode.IsComplete)
                    {
                        _destinationWriter = _destinationAddressMode.Writer;
                        if (_sourceReader?.IsComplete ?? false)
                        {
                            _destinationWriter.AddressedValue = _sourceReader.AddressedValue;
                        }
                    }
                    return;
                }
                if (!_sourceAddressMode.IsComplete)
                {
                    _sourceAddressMode.Clock();

                    if (_sourceAddressMode.IsComplete)
                    {
                        _sourceReader = _sourceAddressMode.Reader;
                        if (_sourceReader.IsComplete)
                        {
                            _destinationWriter.AddressedValue = _sourceReader.AddressedValue;
                        }
                    }
                    return;
                }
                if (!_sourceReader.IsComplete)
                {
                    _sourceReader.Clock();
                    if (_sourceReader.IsComplete)
                    {
                        _destinationWriter.AddressedValue = _sourceReader.AddressedValue;
                    }
                    return;
                }
                if (!_destinationWriter.IsComplete)
                {
                    _destinationWriter.Clock();
                }
            }
        }
Beispiel #12
0
        public void Clock()
        {
            if (!_reader.IsComplete)
            {
                _reader.Clock();
                return;
            }
            if (!_internalCycle.IsComplete)
            {
                _internalCycle.Clock();
                if (_internalCycle.IsComplete)
                {
                    var originalAccBits = _cpu.A & 0x0f;
                    var newAccBits      = 0;
                    var shiftedValue    = 0;
                    if (_isLeftShift)
                    {
                        newAccBits   = (_reader.AddressedValue & 0xf0) >> 4;
                        shiftedValue = _reader.AddressedValue << 4;
                    }
                    else
                    {
                        newAccBits      = _reader.AddressedValue & 0x0f;
                        originalAccBits = originalAccBits << 4;
                        shiftedValue    = _reader.AddressedValue >> 4;
                    }

                    var newPointedValue = (shiftedValue & 0xff) | originalAccBits;
                    _writer = _addressMode.Writer;
                    _writer.AddressedValue = (byte)newPointedValue;
                    _cpu.A = (byte)((_cpu.A & 0xf0) | newAccBits);

                    // Set the flags
                    Z80Flags.HalfCarry_H.SetOrReset(_cpu, false);
                    Z80Flags.AddSubtract_N.SetOrReset(_cpu, false);

                    Z80Flags.ParityOverflow_PV.SetOrReset(_cpu, _cpu.A.IsEvenParity());
                    Z80Flags.Sign_S.SetOrReset(_cpu, _cpu.A >= 0x80);
                    Z80Flags.Zero_Z.SetOrReset(_cpu, _cpu.A == 0);
                }
                return;
            }
            if (!_writer.IsComplete)
            {
                _writer.Clock();
            }
        }
Beispiel #13
0
        public void Clock()
        {
            if (_remainingM1Cycles-- <= 0)
            {
                if (_remainingM1Cycles == -1)
                {
                    _inputCycle.Address = (ushort)(_cpu.B << 8 | _cpu.C);
                }
                if (!_inputCycle.IsComplete)
                {
                    _inputCycle.Clock();
                    if (_inputCycle.IsComplete)
                    {
                        _destinationWriter = _destination.Writer;
                        _destinationWriter.AddressedValue = _inputCycle.LatchedData;
                    }
                    return;
                }
                if (!_destinationWriter.IsComplete)
                {
                    _destinationWriter.Clock();
                    if (_destinationWriter.IsComplete)
                    {
                        var hlValue = WideRegister.HL.GetValue(_cpu);
                        hlValue = (ushort)(_increment ? hlValue + 1 : hlValue - 1);
                        WideRegister.HL.SetValueOnProcessor(_cpu, hlValue);
                        Register.B.SetValueOnProcessor(_cpu, (byte)(_cpu.B - 1));
                        var input = _inputCycle.LatchedData;

                        Z80Flags.Zero_Z.SetOrReset(_cpu, _cpu.B == 0);
                        Z80Flags.AddSubtract_N.SetOrReset(_cpu, true);
                    }
                    return;
                }
                if (!_repeatCycles.IsComplete)
                {
                    _repeatCycles.Clock();
                    if (_repeatCycles.IsComplete)
                    {
                        _cpu.PC -= 2;
                    }
                }
            }
        }
Beispiel #14
0
        public virtual void StartExecution()
        {
            if (_sourceAddressMode.IsComplete)
            {
                _sourceReader = _sourceAddressMode.Reader;
            }
            if (_destinationAddressMode.IsComplete)
            {
                _destinationWriter = _destinationAddressMode.Writer;
            }

            if ((_sourceReader?.IsComplete ?? false) && (_destinationAddressMode?.IsComplete ?? false))
            {
                _destinationWriter.AddressedValue = _sourceAddressMode.Reader.AddressedValue;
                if (_setsFlags)
                {
                    Z80Flags.Zero_Z.SetOrReset(_cpu, _cpu.A == 0);
                    Z80Flags.Sign_S.SetOrReset(_cpu, (_cpu.A & 0x8000) == 0x8000);
                    Z80Flags.ParityOverflow_PV.SetOrReset(_cpu, _cpu.IFF2);
                    Z80Flags.HalfCarry_H.SetOrReset(_cpu, false);
                    Z80Flags.AddSubtract_N.SetOrReset(_cpu, false);
                }
            }
        }
Beispiel #15
0
 public void Reset()
 {
     _addressMode.Reset();
     _valueReader = null;
     _valueWriter = null;
 }
Beispiel #16
0
 public void StartExecution()
 {
     _readCycle  = new RegIndirect(_cpu, WideRegister.HL).Reader;
     _writeCycle = new RegIndirect(_cpu, WideRegister.DE).Writer;
 }
Beispiel #17
0
 public void Reset()
 {
     _addressMode.Reset();
     _reader = null;
     _writer = null;
 }
Beispiel #18
0
 public void Reset()
 {
     _reader = _addressMode.Reader;
     _internalCycle.Reset();
     _writer = null;
 }