public void Dispatch(Cpu8086 cpu, OpCodeManager.Instruction instruction) { ushort value1; ushort value2; byte size; if (instruction.Flag.Has(OpCodeManager.OpCodeFlag.Size8)) { value1 = cpu.GetRegisterU8(Register.AL); value2 = cpu.ReadU8(InstructionHelper.SegmentToAddress(cpu.GetRegister(Register.ES), cpu.GetRegister(Register.DI))); size = 1; } else { value1 = cpu.GetRegister(Register.AX); value2 = cpu.ReadU16(InstructionHelper.SegmentToAddress(cpu.GetRegister(Register.ES), cpu.GetRegister(Register.DI))); size = 2; } var result = value1 - value2; InstructionHelper.CalculateSubFlags(cpu, instruction.Flag, value1, value2, result); if (!cpu.GetFlags().Has(FlagsRegister.Direction)) { cpu.IncRegister(Register.DI, size); } else { cpu.DecRegister(Register.DI, size); } }
public void Dispatch(Cpu8086 cpu, OpCodeManager.Instruction instruction) { var segment = Register.DS; if (instruction.SegmentPrefix != Register.Invalid) { segment = instruction.SegmentPrefix; } var sourceAddress = InstructionHelper.SegmentToAddress(cpu.GetRegister(segment), cpu.GetRegister(Register.SI)); var destAddress = InstructionHelper.SegmentToAddress(cpu.GetRegister(Register.ES), cpu.GetRegister(Register.DI)); byte size; if (instruction.Flag.Has(OpCodeManager.OpCodeFlag.Size8)) { var value = cpu.ReadU8(sourceAddress); cpu.WriteU8(destAddress, value); size = 1; } else { var value = cpu.ReadU16(sourceAddress); cpu.WriteU16(destAddress, value); size = 2; } if (!cpu.GetFlags().Has(FlagsRegister.Direction)) { cpu.IncRegister(Register.DI, size); cpu.IncRegister(Register.SI, size); } else { cpu.DecRegister(Register.DI, size); cpu.DecRegister(Register.SI, size); } }
public void Dispatch(Cpu8086 cpu, OpCodeManager.Instruction instruction) { byte size; if (instruction.Flag.Has(OpCodeManager.OpCodeFlag.Size8)) { cpu.WriteU8(InstructionHelper.SegmentToAddress(cpu.GetRegister(Register.ES), cpu.GetRegister(Register.DI)), (byte)(cpu.GetRegister(Register.AX) & 0xFF)); size = 1; } else { cpu.WriteU16(InstructionHelper.SegmentToAddress(cpu.GetRegister(Register.ES), cpu.GetRegister(Register.DI)), cpu.GetRegister(Register.AX)); size = 2; } if (!cpu.GetFlags().Has(FlagsRegister.Direction)) { cpu.IncRegister(Register.DI, size); } else { cpu.DecRegister(Register.DI, size); } }
public void Dispatch(Cpu8086 cpu, OpCodeManager.Instruction instruction) { Debug.Assert(instruction.Argument1 == OpCodeManager.ARG_CONSTANT); cpu.IncRegister(Register.IP, instruction.Argument1Value); }