public void GetSet_Register_Equal(int regNum)
        {
            IRegisterSet registerSet = new BaseRegisterSet();

            registerSet.GetRegister(regNum) = 0xFFFFFFFF;

            Assert.Equal(0xFFFFFFFF, registerSet.GetRegister(regNum));
        }
        public void GetSet_SetOverriddenRegisterInBase_NotEqual(int regNum)
        {
            IRegisterSet baseSet     = new BaseRegisterSet();
            IRegisterSet overrideSet = new FastIrqRegisterSet(baseSet);

            baseSet.GetRegister(regNum) = 0xFFFFFFFF;

            Assert.NotEqual(0xFFFFFFFF, overrideSet.GetRegister(regNum));
        }
        public void GetSet_Register_Equal(int regNum)
        {
            IRegisterSet baseSet     = new BaseRegisterSet();
            IRegisterSet overrideSet = new OverrideRegisterSet(baseSet);

            baseSet.GetRegister(regNum) = 0xFFFFFFFF;

            Assert.Equal(0xFFFFFFFF, overrideSet.GetRegister(regNum));
        }
        public void GetSet_SetDifferentValuesForBaseAndOverride_NotEqual(int regNum)
        {
            IRegisterSet baseSet     = new BaseRegisterSet();
            IRegisterSet overrideSet = new FastIrqRegisterSet(baseSet);

            baseSet.GetRegister(regNum)     = 0xFFFFFFFF;
            overrideSet.GetRegister(regNum) = 0xFFFFFFFE;

            Assert.NotEqual(0xFFFFFFFF, overrideSet.GetRegister(regNum));
        }
Beispiel #5
0
        public AgbCpu(AgbMemoryMap memoryMap)
        {
            RegisterSets = new Dictionary <CpuMode, IRegisterSet>();

            IRegisterSet baseSet = new BaseRegisterSet();

            RegisterSets[CpuMode.User]       = baseSet;
            RegisterSets[CpuMode.System]     = baseSet;
            RegisterSets[CpuMode.FastIrq]    = new FastIrqRegisterSet(baseSet);
            RegisterSets[CpuMode.Irq]        = new OverrideRegisterSet(baseSet);
            RegisterSets[CpuMode.Supervisor] = new OverrideRegisterSet(baseSet);
            RegisterSets[CpuMode.Abort]      = new OverrideRegisterSet(baseSet);
            RegisterSets[CpuMode.Undefined]  = new OverrideRegisterSet(baseSet);

            SavedStatuses = new Dictionary <CpuMode, ProgramStatus>();

            SavedStatuses[CpuMode.System]     = new ProgramStatus();
            SavedStatuses[CpuMode.FastIrq]    = new ProgramStatus();
            SavedStatuses[CpuMode.Irq]        = new ProgramStatus();
            SavedStatuses[CpuMode.Supervisor] = new ProgramStatus();
            SavedStatuses[CpuMode.Abort]      = new ProgramStatus();
            SavedStatuses[CpuMode.Undefined]  = new ProgramStatus();

            CurrentStatus      = new ProgramStatus();
            CurrentStatus.Mode = CpuMode.User;

            InterruptMasterEnable  = true;
            EnabledInterrupts      = 0;
            AcknowledgedInterrupts = 0;

            ArmInterpreter   = new ArmInterpreter(this);
            ThumbInterpreter = new ThumbInterpreter(this);

            MemoryMap = memoryMap;

            // Interrupts MMIO

            memoryMap.RegisterMmio32(0x4000208, () => // IME
            {
                if (InterruptMasterEnable)
                {
                    return(1);
                }
                else
                {
                    return(0);
                }
            }, (x) =>
            {
                InterruptMasterEnable = BitUtil.IsBitSet(x, 0);
            });

            memoryMap.RegisterMmio16(0x4000200, () => // IE
            {
                return((ushort)EnabledInterrupts);
            }, (x) =>
            {
                EnabledInterrupts = x;
            });

            memoryMap.RegisterMmio16(0x4000202, () => // IF
            {
                return((ushort)AcknowledgedInterrupts);
            }, (x) =>
            {
                AcknowledgedInterrupts = x;
            });
        }