Пример #1
0
        public void Test_LoadAndStoreFlags()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0x9f, 0x9e });

            cpu.EU.CondReg.Register = 0x14d7;
            cpu.NextInstruction();
            Assert.AreEqual(0xd7, cpu.EU.Registers.AH, "LAHF result failed");
            Assert.AreEqual(0x14d7, cpu.EU.CondReg.Register, "LAHF result failed");

            cpu.EU.CondReg.Register = 0xf82e;
            cpu.NextInstruction();
            Assert.AreEqual(0xd7, cpu.EU.Registers.AH, "SAHF result failed");
            Assert.AreEqual(0xf8d7, cpu.EU.CondReg.Register, "SAHF result failed");
        }
Пример #2
0
        public void Testc6()
        {
            // MOV [100],28
            i8086CPU cpu = GetCPU(new byte[] { 0xc6, 0x06, 0x00, 0x01, 0x28 });

            cpu.NextInstruction();

            Assert.AreEqual(0x28, cpu.Bus.GetData8(0x100), "Instruction c6 failed");

            // MOV [si],39
            cpu = GetCPU(new byte[] { 0xc6, 0x04, 0x39 });

            cpu.EU.Registers.SI = 0x350;
            cpu.NextInstruction();

            Assert.AreEqual(0x39, cpu.Bus.GetData8(cpu.EU.Registers.SI), "Instruction c6 failed (2)");
        }
Пример #3
0
        public void Testc7()
        {
            // MOV [100],28fa
            i8086CPU cpu = GetCPU(new byte[] { 0xc7, 0x06, 0x00, 0x01, 0xfa, 0x28 });

            cpu.NextInstruction();

            Assert.AreEqual(0x28fa, cpu.Bus.GetData16(0x100), "Instruction c7 failed");

            // MOV [si],3902
            cpu = GetCPU(new byte[] { 0xc7, 0x04, 0x02, 0x39 });

            cpu.EU.Registers.SI = 0x350;
            cpu.NextInstruction();

            Assert.AreEqual(0x3902, cpu.Bus.GetData16(cpu.EU.Registers.SI), "Instruction c7 failed (2)");
        }
Пример #4
0
        public void Test_SAR()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xd0, 0xf8,    /* SAR AL,1 */
                                               0xd2, 0xfb }); /* SAR BL, CL */

            cpu.EU.Registers.AL = 0xe0;
            cpu.EU.Registers.BL = 0x4c;
            cpu.EU.Registers.CL = 0x01;

            cpu.NextInstruction();
            Assert.AreEqual(0xf0, cpu.EU.Registers.AL, "SAR 1 result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.CarryFlag, "SAR 1 CF failed");

            cpu.NextInstruction();
            Assert.AreEqual(0x26, cpu.EU.Registers.BL, "SAR 2 result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.CarryFlag, "SAR 2 CF failed");
        }
Пример #5
0
        public void Test_CBW()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0x98 });

            cpu.EU.Registers.AX = 0x00fb;
            cpu.NextInstruction();
            Assert.AreEqual(0xfffb, cpu.EU.Registers.AX, "CBW result failed");
        }
Пример #6
0
        public void Testa2()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xa2, 0x23, 0x98 });

            cpu.EU.Registers.AL = 0xc4;
            cpu.NextInstruction();

            Assert.AreEqual(0xc4, cpu.Bus.GetData8(0x9823), "Instruction a2 failed");
        }
Пример #7
0
        public void Testa3()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xa3, 0x23, 0x98 });

            cpu.EU.Registers.AX = 0xc42f;
            cpu.NextInstruction();

            Assert.AreEqual(0xc42f, cpu.Bus.GetData16(0x9823), "Instruction a3 failed");
        }
Пример #8
0
        public void Test_SODS()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xaa, 0xab });

            cpu.EU.Registers.DI = 0x200;
            cpu.EU.Registers.AL = 0xf8;

            cpu.NextInstruction();
            Assert.AreEqual(0xf8, cpu.Bus.GetDestString8(0x200), "STOSB result failed");
            Assert.AreEqual(0x201, cpu.EU.Registers.DI, "STOSB DI failed");

            cpu.EU.Registers.DI = 0x300;
            cpu.EU.Registers.AX = 0x12fe;

            cpu.NextInstruction();
            Assert.AreEqual(0x12fe, cpu.Bus.GetDestString16(0x300), "STOSW result failed");
            Assert.AreEqual(0x302, cpu.EU.Registers.DI, "STOSW DI failed");
        }
Пример #9
0
        public void Testa0()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xa0, 0x23, 0x98 });

            cpu.Bus.SaveData8(0x9823, 0x65);
            cpu.NextInstruction();

            Assert.AreEqual(0x65, cpu.EU.Registers.AL, "Instruction a0 failed");
        }
Пример #10
0
        public void Testa1()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xa1, 0x23, 0x98 });

            cpu.Bus.SaveData16(0x9823, 0x65fe);
            cpu.NextInstruction();

            Assert.AreEqual(0x65fe, cpu.EU.Registers.AX, "Instruction a1 failed");
        }
Пример #11
0
        public void Test8b()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0x8b, 0xc8 } /* MOV cx,ax (16 bit) */);

            cpu.EU.Registers.AX = 0x11ab;
            cpu.EU.Registers.CX = 0x22fe;
            cpu.NextInstruction();

            Assert.AreEqual(0x11ab, cpu.EU.Registers.CX, "Instruction 0x8b failed");
        }
Пример #12
0
        public void Test89()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0x89, 0xd8, 0x10 } /* MOV ax,bx */);

            cpu.EU.Registers.AX = 0x11ab;
            cpu.EU.Registers.BX = 0x22fe;
            cpu.NextInstruction();

            Assert.AreEqual(0x22fe, cpu.EU.Registers.AX, "Instruction 0x89 failed");
        }
Пример #13
0
        public void Test83()
        {
            // Test Flags
            i8086CPU cpu = GetCPU(new byte[] { 0x83, 0xf8, 0x63, /* CMP AX, 63 */
                                               0x83, 0xf8, 0x63  /* CMP AX, 63 */
                                  });

            cpu.EU.Registers.AX = 0x1000;
            cpu.NextInstruction();

            Assert.AreEqual(false, cpu.EU.CondReg.CarryFlag, "CMP (1) carry flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "CMP (1) zero flag failed");

            cpu.EU.Registers.AX = 0x0058;
            cpu.NextInstruction();

            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "CMP (2) carry flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "CMP (2) zero flag failed");
        }
Пример #14
0
 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
 {
     if (keyData == (Keys.F5))
     {
         _cpu.NextInstruction();
         RefreshData();
         return(true);
     }
     return(base.ProcessCmdKey(ref msg, keyData));
 }
Пример #15
0
        public void TestMUL()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xf6, 0xe3 }); /* MUL BL */

            cpu.EU.Registers.AL = 0xc8;
            cpu.EU.Registers.BL = 0x04;
            cpu.NextInstruction();

            Assert.AreEqual(0x0320, cpu.EU.Registers.AX, "MUL AX result failed");

            cpu = GetCPU(new byte[] { 0xf7, 0xe3 }); /* MUL BX */

            cpu.EU.Registers.AX = 0x2000;
            cpu.EU.Registers.BX = 0x0100;
            cpu.NextInstruction();
            Assert.AreEqual(0x0020, cpu.EU.Registers.DX, "MUL 2 DX result failed");
            Assert.AreEqual(0x0000, cpu.EU.Registers.AX, "MUL 2 AX result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "MUL 2 CF failed");
        }
Пример #16
0
        public void Test_SAL()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xd0, 0xe0 });/* SAL AL,1 */

            cpu.EU.Registers.AL = 0xe0;

            cpu.NextInstruction();
            Assert.AreEqual(0xc0, cpu.EU.Registers.AL, "SAL result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "SAL CF failed");
        }
Пример #17
0
        public void Test_SHR()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xd0, 0xe8 });/* SHR AL,1 */

            cpu.EU.Registers.AL = 0x07;

            cpu.NextInstruction();
            Assert.AreEqual(0x03, cpu.EU.Registers.AL, "SHR result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "SHR CF failed");
        }
Пример #18
0
        public void Test_ROR()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xd0, 0xc8 });/* ROR AL,1 */

            cpu.EU.Registers.AL = 0x1c;

            cpu.NextInstruction();
            Assert.AreEqual(0x0e, cpu.EU.Registers.AL, "ROR result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.CarryFlag, "ROR CF failed");
        }
Пример #19
0
        public void Test_LODS()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xac, 0xad });

            cpu.EU.Registers.SI = 0x200;
            cpu.EU.Registers.AX = 0x0e00;
            cpu.Bus.SaveData8(cpu.EU.Registers.SI, 0xc7);

            cpu.NextInstruction();
            Assert.AreEqual(0xc7, cpu.EU.Registers.AL, "LODSB 1 result failed");
            Assert.AreEqual(0x201, cpu.EU.Registers.SI, "LODSB 2 result failed");

            cpu.EU.Registers.SI = 0x300;
            cpu.EU.Registers.AX = 0xffff;
            cpu.Bus.SaveData16(cpu.EU.Registers.SI, 0xa965);

            cpu.NextInstruction();
            Assert.AreEqual(0xa965, cpu.EU.Registers.AX, "LODSW 2 result failed");
            Assert.AreEqual(0x302, cpu.EU.Registers.SI, "LODSW 2 result failed");
        }
Пример #20
0
        public void Test_RCL()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xd0, 0xd0 });/* RCL AL,1 */

            cpu.EU.CondReg.CarryFlag = true;
            cpu.EU.Registers.AL      = 0x1c;

            cpu.NextInstruction();
            Assert.AreEqual(0x39, cpu.EU.Registers.AL, "RCL result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.CarryFlag, "RCL CF failed");
        }
Пример #21
0
        public void Test8c()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0x8c, 0x5f, 0x35 } /* MOV bx+35, ds (16 bit) */);

            cpu.Bus.DS          = 0x76d2;
            cpu.EU.Registers.BX = 0x1015;

            cpu.NextInstruction();

            Assert.AreEqual(0x76d2, cpu.Bus.GetData16(cpu.EU.Registers.BX + 0x35), "Instruction 0x8c failed");
        }
Пример #22
0
        public void Test_AAS()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0x3f });

            cpu.EU.Registers.AX = 0x2ff;

            cpu.NextInstruction();
            Assert.AreEqual(0x01, cpu.EU.Registers.AH, "AAA AH result failed");
            Assert.AreEqual(0x09, cpu.EU.Registers.AL, "AAA AL result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.AuxCarryFlag, "AAA auxcarry flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "AAA carry flag failed");
        }
Пример #23
0
        public void Test8e()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0x8e, 0x45, 0x35 } /* MOV es, di+35 (16 bit) */);

            cpu.Bus.ES          = 0xffff;
            cpu.EU.Registers.DI = 0x1015;
            cpu.Bus.SaveData16(cpu.EU.Registers.DI + 0x35, 0x9f23);

            cpu.NextInstruction();

            Assert.AreEqual(0x9f23, cpu.Bus.ES, "Instruction 0x8e failed");
        }
Пример #24
0
        public void Test_A5_MOVS16()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xa5, 0xa5, 0xa5, 0xa5, 0xa5 });

            cpu.Bus.SegmentOverride = i8086BusInterfaceUnit.SegmentOverrideState.UseDS;

            cpu.EU.Registers.SI = 0x100;
            cpu.EU.Registers.DI = 0x200;

            // write a bunch of source data to DS:offset
            byte value = 0xa1;

            for (int ii = cpu.EU.Registers.SI; ii <= 0x120; ii++)
            {
                cpu.Bus.SaveData8(ii, value++);
            }

            // write a bunch of data to ES:offset (to show the correct data is overwritten)
            cpu.Bus.SegmentOverride = i8086BusInterfaceUnit.SegmentOverrideState.UseES;
            value = 0x55;
            for (int ii = cpu.EU.Registers.DI; ii <= 0x220; ii++)
            {
                cpu.Bus.SaveData8(ii, value++);
            }

            cpu.Bus.SegmentOverride = i8086BusInterfaceUnit.SegmentOverrideState.NoOverride;
            cpu.NextInstruction();
            cpu.NextInstruction();
            cpu.NextInstruction();
            cpu.NextInstruction();
            cpu.NextInstruction();

            cpu.Bus.SegmentOverride = i8086BusInterfaceUnit.SegmentOverrideState.UseES;
            Assert.AreEqual(0xa2a1, cpu.Bus.GetData16(0x200), "MOVSW 1 result failed");
            Assert.AreEqual(0xa4a3, cpu.Bus.GetData16(0x202), "MOVSW 2 result failed");
            Assert.AreEqual(0xa6a5, cpu.Bus.GetData16(0x204), "MOVSW 3 result failed");
            Assert.AreEqual(0xa8a7, cpu.Bus.GetData16(0x206), "MOVSW 4 result failed");
            Assert.AreEqual(0xaaa9, cpu.Bus.GetData16(0x208), "MOVSW 5 result failed");
        }
Пример #25
0
        public void Test_AAM()
        {
            i8086CPU cpu = GetCPU(new byte[] { 0xd4 });

            cpu.EU.Registers.AL = 0x0f;

            cpu.NextInstruction();
            Assert.AreEqual(0x01, cpu.EU.Registers.AH, "AAM AH result failed");
            Assert.AreEqual(0x05, cpu.EU.Registers.AL, "AAM AL result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.SignFlag, "AAM sign flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "AAM zero flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.ParityFlag, "AAM parity flag failed");
        }
Пример #26
0
        public void Test86()
        {
            // Test Flags
            i8086CPU cpu = GetCPU(new byte[] { 0x86, 0xd1 });  // XCHG CL,DL

            cpu.EU.Registers.CL = 0x57;
            cpu.EU.Registers.DL = 0xf3;

            cpu.NextInstruction();
            Assert.AreEqual(0x57, cpu.EU.Registers.DL, "XCHG (1) DL failed");
            Assert.AreEqual(0xf3, cpu.EU.Registers.CL, "XCHG (1) CL failed");

            cpu = GetCPU(new byte[] { 0x86, 0x36, 0x15, 0x01 }); /* XCHG [0115],DH */

            cpu.EU.Registers.DH = 0x57;
            cpu.Bus.SaveData8(0x0115, 0xf3);

            cpu.NextInstruction();

            Assert.AreEqual(0x57, cpu.Bus.GetData8(0x0115), "XCHG (2) [0115] failed");
            Assert.AreEqual(0xf3, cpu.EU.Registers.DH, "XCHG (2) DH failed");
        }
Пример #27
0
        public void Test87()
        {
            // Test Flags
            i8086CPU cpu = GetCPU(new byte[] { 0x87, 0xd1 });  // XCHG CX,DX

            cpu.EU.Registers.CX = 0x1057;
            cpu.EU.Registers.DX = 0x23f3;

            cpu.NextInstruction();
            Assert.AreEqual(0x1057, cpu.EU.Registers.DX, "XCHG (1) DX failed");
            Assert.AreEqual(0x23f3, cpu.EU.Registers.CX, "XCHG (1) CX failed");

            cpu = GetCPU(new byte[] { 0x87, 0x36, 0x15, 0x01 }); /* XCHG [0115],SI */

            cpu.EU.Registers.SI = 0x1057;
            cpu.Bus.SaveData16(0x0115, 0x23f3);

            cpu.NextInstruction();

            Assert.AreEqual(0x1057, cpu.Bus.GetData16(0x0115), "XCHG (2) [0115] failed");
            Assert.AreEqual(0x23f3, cpu.EU.Registers.SI, "XCHG (2) SI failed");
        }
Пример #28
0
        public void Test14()
        {
            // Test Flags
            i8086CPU cpu = GetCPU(new byte[] { 0x14, 0x28, /* ADC AL,28H */
                                               0x14, 0x80, /* ADC AL,80H */
                                               0x14, 0x40  /* ADC BH,40H */
                                  });

            cpu.EU.Registers.AL = 0xf7; // F7+28=11F.  Carry=1, Parity=0, Zero=0, Sign=0, AuxCarry=0, Overflow=0
            cpu.NextInstruction();
            Assert.AreEqual(0x1f, cpu.EU.Registers.AL, "ADC (1) result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "ADC (1) carry flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ParityFlag, "ADC (1) parity flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "ADC (1) zero flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.SignFlag, "ADC (1) sign flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.AuxCarryFlag, "ADC (1) auxcarry flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.OverflowFlag, "ADC (1) overflow flag failed");

            cpu.EU.Registers.AL = 0x80;  // 80+80+1=101.  Carry=1, Parity=0, Zero=0, Sign=0, AuxCarry=0, Overflow=1
            cpu.NextInstruction();
            Assert.AreEqual(0x01, cpu.EU.Registers.AL, "ADC (2) result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "ADC (2) carry flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ParityFlag, "ADC (2) parity flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "ADC (2) zero flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.SignFlag, "ADC (2) sign flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.AuxCarryFlag, "ADC (2) auxcarry flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.OverflowFlag, "ADC (2) overflow flag failed");

            cpu.EU.Registers.AL = 0x40; // 40+40+1=81.  Carry=0, Parity=1, Zero=0, Sign=1, AuxCarry=0, Overflow=1
            cpu.NextInstruction();
            Assert.AreEqual(0x81, cpu.EU.Registers.AL, "ADC (3) result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.CarryFlag, "ADC (3) carry flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.ParityFlag, "ADC (3) parity flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "ADC (3) zero flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.SignFlag, "ADC (3) sign flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.AuxCarryFlag, "ADC (3) auxcarry flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.OverflowFlag, "ADC (3) overflow flag failed");
        }
Пример #29
0
        public void Test15()
        {
            // Test Flags
            i8086CPU cpu = GetCPU(new byte[] { 0x15, 0x00, 0x28, /* ADC AX,2800H */
                                               0x15, 0x00, 0x80, /* ADC AX,8000H */
                                               0x15, 0x00, 0x40  /* ADC AX,4000H */
                                  });

            cpu.EU.Registers.AX = 0xf700;  // F700+2800=11F00.  Carry=1, Parity=0, Zero=0, Sign=0, AuxCarry=0, Overflow=0
            cpu.NextInstruction();
            Assert.AreEqual(0x1f00, cpu.EU.Registers.AX, "ADC (1) result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "ADC (1) carry flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.ParityFlag, "ADC (1) parity flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "ADC (1) zero flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.SignFlag, "ADC (1) sign flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.AuxCarryFlag, "ADC (1) auxcarry flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.OverflowFlag, "ADC (1) overflow flag failed");

            cpu.EU.Registers.AX = 0x8000;  // 80+80+1=10001.  Carry=1, Parity=0, Zero=0, Sign=0, AuxCarry=0, Overflow=1
            cpu.NextInstruction();
            Assert.AreEqual(0x0001, cpu.EU.Registers.AX, "ADC (2) result failed");
            Assert.AreEqual(true, cpu.EU.CondReg.CarryFlag, "ADC (2) carry flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ParityFlag, "ADC (2) parity flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "ADC (2) zero flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.SignFlag, "ADC (2) sign flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.AuxCarryFlag, "ADC (2) auxcarry flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.OverflowFlag, "ADC (2) overflow flag failed");

            cpu.EU.Registers.AX = 0x4000;  // 4000+4000+1=8001.  Carry=0, Parity=0, Zero=0, Sign=1, AuxCarry=0, Overflow=1
            cpu.NextInstruction();
            Assert.AreEqual(0x8001, cpu.EU.Registers.AX, "ADC (3) result failed");
            Assert.AreEqual(false, cpu.EU.CondReg.CarryFlag, "ADC (3) carry flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ParityFlag, "ADC (3) parity flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.ZeroFlag, "ADC (3) zero flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.SignFlag, "ADC (3) sign flag failed");
            Assert.AreEqual(false, cpu.EU.CondReg.AuxCarryFlag, "ADC (3) auxcarry flag failed");
            Assert.AreEqual(true, cpu.EU.CondReg.OverflowFlag, "ADC (3) overflow flag failed");
        }
Пример #30
0
        public void Test88()
        {
            byte value8;

            i8086CPU cpu = GetCPU(new byte[] { 0x88, 0x4f, 0x10 } /* MOV [bx+10],CL */);

            value8 = 0x2f;

            cpu.EU.Registers.CL = value8;
            cpu.NextInstruction();

            Assert.AreEqual(value8, cpu.Bus.GetData8(cpu.EU.Registers.BX + 0x10), "Instruction 0x88 failed");

            cpu.Boot(new byte[] { 0x88, 0x8f, 0x10, 0x00 } /* MOV [bx+10],CL using 16 bit displacement */);
            value8 = 0x2f;

            cpu.EU.Registers.CL = value8;
            cpu.NextInstruction();

            Assert.AreEqual(value8, cpu.Bus.GetData8(cpu.EU.Registers.BX + 0x10), "Instruction 0x88 failed");

            // Test with segment override
            cpu.Boot(new byte[] { 0x26, 0x88, 0x8f, 0x10, 0x00 } /* MOV [bx+10],CL using 16 bit displacement with ES override */);
            value8 = 0x2f;

            cpu.EU.Registers.CL = value8;
            cpu.NextInstruction();
            Assert.AreEqual(i8086BusInterfaceUnit.SegmentOverrideState.UseES, cpu.Bus.SegmentOverride, "Invalid segment override value");

            cpu.NextInstruction();

            // after the instruction the override should be turned off
            Assert.AreEqual(i8086BusInterfaceUnit.SegmentOverrideState.NoOverride, cpu.Bus.SegmentOverride, "Invalid segment override value");

            // now set the override again so the correct memory segment is accessed
            cpu.Bus.SegmentOverride = i8086BusInterfaceUnit.SegmentOverrideState.UseES;
            Assert.AreEqual(value8, cpu.Bus.GetData8(cpu.EU.Registers.BX + 0x10), "Instruction 0x88 failed");
        }