Exemple #1
0
        public CPU(Memory memory, PPU ppu, LoadUnit loadUnit, ALU alu, MiscUnit miscUnit, JumpUnit jumpUnit, BitUnit bitUnit)
        {
            this.ppu = ppu;

            this.loadUnit = loadUnit;
            this.alu      = alu;
            this.miscUnit = miscUnit;
            this.jumpUnit = jumpUnit;
            this.bitUnit  = bitUnit;

            this.loadUnit.TickEvent += Tick;
            this.alu.TickEvent      += Tick;
            this.jumpUnit.TickEvent += Tick;
            this.bitUnit.TickEvent  += Tick;

            CreateLoadUnitOpCodes();
            CreateALUOpCodes();
            CreateMiscOpCodes();
            CreateJumpOpCodes();
            CreateBitUnitOpCodes();

            this.memory = memory;
            this.timer  = new Timer(memory);
            this.memory.DivResetEvent += DivResetHandler;

            interruptVector = new Dictionary <Interrupt, ushort>
            {
                { Interrupt.VBlank, 0x40 },
                { Interrupt.LCDStat, 0x48 },
                { Interrupt.Timer, 0x50 },
                { Interrupt.Serial, 0x58 },
                { Interrupt.Joypad, 0x60 }
            };
        }
Exemple #2
0
        public CPUTests(ITestOutputHelper testOutputHelper)
        {
            this.testOutputHelper = testOutputHelper;

            memory = new Memory(new byte[]
            {
                IMMEDIATE_BYTE,
                (IMMEDIATE_WORD >> 8) & 0xFF
            });
            display  = new BlankDisplay();
            ppu      = new PPU(memory, display);
            loadUnit = A.Fake <LoadUnit>();
            alu      = A.Fake <ALU>();
            miscUnit = A.Fake <MiscUnit>();
            jumpUnit = A.Fake <JumpUnit>();
            bitUnit  = A.Fake <BitUnit>();
            cpu      = new CPU(memory, ppu, loadUnit, alu, miscUnit, jumpUnit, bitUnit)
            {
                A  = 0x0A,
                B  = 0x0B,
                C  = 0x0C,
                D  = 0x0D,
                E  = 0x0E,
                H  = 0xAA,
                L  = 0xBB,
                PC = 0x00,
                SP = 0xFF
            };
            memory.WriteByte(0xAABB, MEM_HL_BYTE);
        }
Exemple #3
0
        public void WriteToAddressTest()
        {
            var  memory   = new Memory();
            var  loadUnit = new LoadUnit(memory);
            byte source   = 0x66;

            loadUnit.WriteToAddress(0xABBA, source);

            Assert.Equal(0x66, memory.ReadByte(0xABBA));
        }
Exemple #4
0
        public void LoadTest()
        {
            var  memory   = new Memory();
            var  loadUnit = new LoadUnit(memory);
            byte to       = 0x00;
            byte from     = 0xFF;

            loadUnit.Load(ref to, from);

            Assert.Equal(0xFF, to);
        }
Exemple #5
0
        public void WriteWordToAddressTest()
        {
            var    memory   = new Memory();
            var    loadUnit = new LoadUnit(memory);
            ushort value    = 0xABCD;

            loadUnit.WriteToAddress(0xABBA, value);

            Assert.Equal(0xCD, memory.ReadByte(0xABBA));
            Assert.Equal(0xAB, memory.ReadByte(0xABBB));
        }
Exemple #6
0
        public void LoadWordToWord()
        {
            var    memory   = new Memory();
            var    loadUnit = new LoadUnit(memory);
            ushort to       = 0x00;
            ushort from     = 0xABCD;

            loadUnit.Load(ref to, from);

            Assert.Equal(0xABCD, to);
        }
Exemple #7
0
        public void LoadBytesToWord()
        {
            var    memory   = new Memory();
            var    loadUnit = new LoadUnit(memory);
            ushort to       = 0x00;
            byte   fromHigh = 0xAB;
            byte   fromLow  = 0xCD;

            loadUnit.Load(ref to, fromHigh, fromLow);

            Assert.Equal(0xABCD, to);
        }
Exemple #8
0
        public void LoadFromAddressTest()
        {
            var  memory   = new Memory();
            var  loadUnit = new LoadUnit(memory);
            byte to       = 0x00;

            memory.WriteByte(0xABBA, 0x10);

            loadUnit.LoadFromAddress(ref to, 0xAB, 0xBA);

            Assert.Equal(0x10, to);
        }
Exemple #9
0
        public void PushTest()
        {
            var    memory    = new Memory();
            var    loadUnit  = new LoadUnit(memory);
            ushort pointer   = 0xDFFF;
            byte   valueHigh = 0xAB;
            byte   valueLow  = 0xCD;

            loadUnit.Push(ref pointer, valueHigh, valueLow);

            Assert.Equal(0xABCD, memory.ReadWord(pointer));
            Assert.Equal(0xDFFD, pointer);
        }
Exemple #10
0
        public void LoadWordTest()
        {
            var    memory   = new Memory();
            var    loadUnit = new LoadUnit(memory);
            byte   high     = 0x00;
            byte   low      = 0x00;
            ushort from     = 0xABCD;

            loadUnit.Load(ref high, ref low, from);

            Assert.Equal(0xAB, high);
            Assert.Equal(0xCD, low);
        }
Exemple #11
0
        public void WriteToAddressAndIncrementTest()
        {
            var memory   = new Memory();
            var loadUnit = new LoadUnit(memory);

            byte source   = 0xDD;
            byte addrHigh = 0xAA;
            byte addrLow  = 0xFF;

            loadUnit.WriteToAddressAndIncrement(ref addrHigh, ref addrLow, source, 1);

            Assert.Equal(0xDD, memory.ReadByte(0xAAFF));
            Assert.Equal(0xAB, addrHigh);
            Assert.Equal(0x00, addrLow);
        }
Exemple #12
0
        static void Main(string[] args)
        {
            var cubing = new Cubing.Cubing();



            cubing.Boxes = generate_boxes(new Box(600, 400, 400), new Box(250, 150, 120), 200);
            var pallet = new LoadUnit(1000, 1200, 1200);

            cubing.loadUnit = pallet;

            cubing.cubing_FFD();

            File.WriteAllText(@"C:\Users\liweijun\Desktop\新建文件夹\Elkeurti\cubingData.json", JsonConvert.SerializeObject(cubing));
        }
Exemple #13
0
        public void PopWithFlagsTest()
        {
            var    memory   = new Memory();
            var    loadUnit = new LoadUnit(memory);
            byte   destHigh = 0x00;
            byte   destLow  = 0b10010000;
            ushort value    = 0xC000;

            memory.WriteWord(0xC000, 0x1234);

            loadUnit.PopWithFlags(ref destHigh, ref destLow, ref value, ref destLow);

            Assert.Equal(0x12, destHigh);
            Assert.Equal(0x34 & 0xF0, destLow);
            Assert.Equal(0xC002, value);
        }
Exemple #14
0
        public void LoadFromAddressAndIncrementTest()
        {
            var memory   = new Memory();
            var loadUnit = new LoadUnit(memory);

            byte dest     = 0x00;
            byte addrHigh = 0xAA;
            byte addrLow  = 0xFF;

            memory.WriteByte(0xAAFF, 0xEE);

            loadUnit.LoadFromAddressAndIncrement(ref dest, ref addrHigh, ref addrLow, 1);

            Assert.Equal(0xEE, dest);
            Assert.Equal(0xAB, addrHigh);
            Assert.Equal(0x00, addrLow);
        }
Exemple #15
0
        public void LoadAdjustedPositiveTest()
        {
            var    memory   = new Memory();
            var    loadUnit = new LoadUnit(memory);
            byte   H        = 0xF0;
            byte   L        = 0xF0;
            ushort SP       = 0x0000;
            byte   flags    = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0001, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0x0001;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0002, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0x000F;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0010, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0b00100000, flags);

            SP    = 0x0010;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0011, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0x001F;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0020, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0b00100000, flags);

            SP    = 0x007F;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0080, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0b00100000, flags);

            SP    = 0x0080;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0081, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0x00FF;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0100, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0b00110000, flags);

            SP    = 0x0100;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0101, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0x0F00;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0F01, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0x1F00;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x1F01, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0x1000;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x1001, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0x7FFF;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x8000, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0b00110000, flags);

            SP    = 0x8000;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x8001, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0x0, flags);

            SP    = 0xFFFF;
            flags = 0x0;

            loadUnit.LoadAdjusted(ref H, ref L, SP, 0x01, ref flags);

            Assert.Equal(0x0000, BitUtils.BytesToUshort(H, L));
            Assert.Equal(0b00110000, flags);
        }