示例#1
0
文件: Z80.cs 项目: kosinw/Castor
 public Z80(Device d)
 {
     _d      = d;
     _cycles = 0;
     _r      = new Registers();
     _ime    = InterruptMasterEnable.Disabled;
     _halted = false;
 }
示例#2
0
文件: Z80.cs 项目: kosinw/Castor
 void Reti()
 {
     _ime = InterruptMasterEnable.Enabled;
     Ret();
 }
示例#3
0
文件: Z80.cs 项目: kosinw/Castor
 void Ei()
 {
     _ime = InterruptMasterEnable.Enabling;
 }
示例#4
0
文件: Z80.cs 项目: kosinw/Castor
 void Di()
 {
     _ime = InterruptMasterEnable.Disabled;
 }
示例#5
0
文件: Z80.cs 项目: kosinw/Castor
        public int Step()
        {
            _cycles = 0;

            if (!_halted)
            {
                var opcode = DecodeInstruction();
                Decode(opcode);
            }

            else
            {
                InternalDelay();
            }

            if (_d.IRQ.CanServiceInterrupts)
            {
                _halted = false;

                if (_ime == InterruptMasterEnable.Enabled)
                {
                    if (_d.IRQ.CanHandleInterrupt(InterruptFlags.VBL))
                    {
                        Restart(0x40);
                        _ime = InterruptMasterEnable.Disabled;
                        _d.IRQ.DisableInterrupt(InterruptFlags.VBL);
                    }

                    else if (_d.IRQ.CanHandleInterrupt(InterruptFlags.STAT))
                    {
                        Restart(0x48);
                        _ime = InterruptMasterEnable.Disabled;
                        _d.IRQ.DisableInterrupt(InterruptFlags.STAT);
                    }

                    else if (_d.IRQ.CanHandleInterrupt(InterruptFlags.Timer))
                    {
                        Restart(0x50);
                        _ime = InterruptMasterEnable.Disabled;
                        _d.IRQ.DisableInterrupt(InterruptFlags.Timer);
                    }

                    else if (_d.IRQ.CanHandleInterrupt(InterruptFlags.Serial))
                    {
                        Restart(0x58);
                        _ime = InterruptMasterEnable.Disabled;
                        _d.IRQ.DisableInterrupt(InterruptFlags.Serial);
                    }

                    else if (_d.IRQ.CanHandleInterrupt(InterruptFlags.Joypad))
                    {
                        Restart(0x60);
                        _ime = InterruptMasterEnable.Disabled;
                        _d.IRQ.DisableInterrupt(InterruptFlags.Joypad);
                    }
                }
            }

            if (_cycles >= 4 && _ime == InterruptMasterEnable.Enabling)
            {
                _ime = InterruptMasterEnable.Enabled;
            }

            return(_cycles);
        }