public void UpdateKeyState_ChangeStateToPressedAndCheckBitfield_BitSet(ControllerKey key)
        {
            AgbMemoryMap  memoryMap  = new AgbMemoryMap();
            AgbController controller = new AgbController(memoryMap, null);

            controller.UpdateKeyState(key, true);

            ushort mmioValue = memoryMap.ReadU16(0x4000130);

            Assert.True(BitUtil.IsBitSet(mmioValue, (int)key));
        }
예제 #2
0
        public AgbDevice()
        {
            MemoryMap  = new AgbMemoryMap();
            Cpu        = new AgbCpu(MemoryMap);
            Ppu        = new AgbPpu(MemoryMap, Cpu);
            Controller = new AgbController(MemoryMap, Cpu);

            MemoryMap.RegisterRegion(new InternalWramRegion());
            MemoryMap.RegisterRegion(new ExternalWramRegion());

            PostBootFlag = 0;

            MemoryMap.RegisterMmio(0x4000300, () => PostBootFlag, (x) => PostBootFlag = x);
        }
        public void UpdateKeyState_OnlyAPressedWithLogicalAndInterrupts_CpuNotInterrupted()
        {
            AgbMemoryMap  memoryMap  = new AgbMemoryMap();
            AgbCpu        cpu        = new AgbCpu(memoryMap);
            AgbController controller = new AgbController(memoryMap, cpu);

            memoryMap.WriteU32(0x4000208, 1);      // IME = 1
            memoryMap.WriteU16(0x4000200, 0x1000); // IE = Key
            memoryMap.WriteU16(0x4000132, 0xC003); // Key interrupts enabled, logical AND, A and B

            memoryMap.FlushMmio();

            controller.UpdateKeyState(ControllerKey.A, true);

            Assert.Equal(CpuMode.User, cpu.CurrentStatus.Mode);
        }
        public void UpdateKeyState_ChangeAStateToPressedWithLogicalOrInterrupts_CpuInterrupted()
        {
            AgbMemoryMap  memoryMap  = new AgbMemoryMap();
            AgbCpu        cpu        = new AgbCpu(memoryMap);
            AgbController controller = new AgbController(memoryMap, cpu);

            memoryMap.WriteU32(0x4000208, 1);      // IME = 1
            memoryMap.WriteU16(0x4000200, 0x1000); // IE = Key
            memoryMap.WriteU16(0x4000132, 0x4003); // Key interrupts enabled, logical OR, A or B

            memoryMap.FlushMmio();

            controller.UpdateKeyState(ControllerKey.A, true);

            Assert.Equal(CpuMode.Irq, cpu.CurrentStatus.Mode);
        }