Exemple #1
0
        public void TestIMUL()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xf6, 0xeb }); /* IMUL BL */

            cpu.EU.Registers.AL = 0xfe;
            cpu.EU.Registers.BL = 0xfc;
            cpu.NextInstruction();

            Assert.AreEqual(0x08, cpu.EU.Registers.AX, "IMUL AX result failed");

            cpu = GetCPU(new byte[] { 0xf6, 0xeb }); /* IMUL BL */
            cpu.EU.Registers.AL = 48;
            cpu.EU.Registers.BL = 4;
            cpu.NextInstruction();

            Assert.AreEqual(0xc0, cpu.EU.Registers.AX, "IMUL 2 AX result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.OverflowFlag, "IMUL 2 OF failed");

            cpu = GetCPU(new byte[] { 0xf6, 0xeb }); /* IMUL BL */
            cpu.EU.Registers.AL = 0xfc;              // -4
            cpu.EU.Registers.BL = 4;
            cpu.NextInstruction();

            Assert.AreEqual(0xfff0, cpu.EU.Registers.AX, "IMUL 3 AX result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.OverflowFlag, "IMUL 3 OF failed");

            cpu = GetCPU(new byte[] { 0xf7, 0xeb }); /* IMUL BX */
            cpu.EU.Registers.AX = 48;
            cpu.EU.Registers.BX = 4;
            cpu.NextInstructionDebug();

            Assert.AreEqual(0x00, cpu.EU.Registers.DX, "IMUL 4 DX result failed");
            Assert.AreEqual(0xc0, cpu.EU.Registers.AX, "IMUL 4 AX result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.OverflowFlag, "IMUL 4 OF failed");
        }
Exemple #2
0
        public void TestIDIV()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xf6, 0xfb }); /* IDIV BL */

            cpu.EU.Registers.AX = 0xffd0;                     // -48
            cpu.EU.Registers.BL = 0x05;                       // 5

            // result AL = -9, AH = -3
            cpu.NextInstruction();

            Assert.AreEqual(0xf7, cpu.EU.Registers.AL, "IDIV AL result failed");
            Assert.AreEqual(0xfd, cpu.EU.Registers.AH, "IDIV AH result failed");

            cpu = GetCPU(new byte[] { 0xf6, 0xfb }); /* IDIV BL */

            cpu.EU.Registers.AX = 0xff35;            // -203
            cpu.EU.Registers.BL = 0x04;              // 4
            cpu.NextInstruction();

            //AL = -50, AH = -3
            Assert.AreEqual(0xce, cpu.EU.Registers.AL, "IDIV 2 AL result failed");
            Assert.AreEqual(0xfd, cpu.EU.Registers.AH, "IDIV 2 AH result failed");

            cpu = GetCPU(new byte[] { 0xf7, 0xfb }); /* IDIV BX */
            cpu.EU.Registers.DX = 0xffff;            // sign extend AX
            cpu.EU.Registers.AX = 0xec78;            // -5000
            cpu.EU.Registers.BX = 256;
            cpu.NextInstructionDebug();

            // AX = -19, DX = -136
            Assert.AreEqual(0xffed, cpu.EU.Registers.AX, "IDIV 3 AX result failed");
            Assert.AreEqual(0xff78, cpu.EU.Registers.DX, "IDIV 3 DX result failed");
        }
Exemple #3
0
        public void TestDIV()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xf6, 0xf3 }); /* DIV BL */

            cpu.EU.Registers.AX = 0xcb;
            cpu.EU.Registers.BL = 0x04;
            cpu.NextInstruction();

            Assert.AreEqual(0x32, cpu.EU.Registers.AL, "DIV AL result failed");
            Assert.AreEqual(0x03, cpu.EU.Registers.AH, "DIV AH result failed");

            cpu = GetCPU(new byte[] { 0xf7, 0xf3 }); /* DIV BX */
            cpu.EU.Registers.DX = 0;
            cpu.EU.Registers.AX = 5;
            cpu.EU.Registers.BX = 2;
            cpu.NextInstructionDebug();

            Assert.AreEqual(0x02, cpu.EU.Registers.AX, "DIV 2 AX result failed");
            Assert.AreEqual(0x01, cpu.EU.Registers.DX, "DIV 2 DX result failed");
        }