diff --git a/X86Disassembler/X86/Handlers/FloatingPoint/Arithmetic/Fprem1Handler.cs b/X86Disassembler/X86/Handlers/FloatingPoint/Arithmetic/Fprem1Handler.cs new file mode 100644 index 0000000..872fff6 --- /dev/null +++ b/X86Disassembler/X86/Handlers/FloatingPoint/Arithmetic/Fprem1Handler.cs @@ -0,0 +1,61 @@ +namespace X86Disassembler.X86.Handlers.FloatingPoint.Arithmetic; + +/// +/// Handler for FPREM1 instruction (D9 F5) - Computes the IEEE-compliant partial remainder of ST(0) รท ST(1) +/// +public class Fprem1Handler : InstructionHandler +{ + /// + /// Initializes a new instance of the Fprem1Handler class + /// + /// The instruction decoder that owns this handler + public Fprem1Handler(InstructionDecoder decoder) + : base(decoder) + { + } + + /// + /// Checks if this handler can decode the given opcode + /// + /// The opcode to check + /// True if this handler can decode the opcode + public override bool CanHandle(byte opcode) + { + // FPREM1 is D9 F5 + if (opcode != 0xD9) return false; + + if (!Decoder.CanReadByte()) + return false; + + // Check if the next byte is F5 + byte nextByte = Decoder.PeakByte(); + return nextByte == 0xF5; + } + + /// + /// Decodes an FPREM1 instruction + /// + /// The opcode of the instruction + /// The instruction object to populate + /// True if the instruction was successfully decoded + public override bool Decode(byte opcode, Instruction instruction) + { + if (!Decoder.CanReadByte()) + return false; + + // Read the second byte of the opcode + byte secondByte = Decoder.ReadByte(); + + // Verify the opcode is correct + if (secondByte != 0xF5) + return false; + + // Set the instruction type + instruction.Type = InstructionType.Fprem1; + + // FPREM1 has no operands + instruction.StructuredOperands = []; + + return true; + } +} diff --git a/X86Disassembler/X86/Handlers/FloatingPoint/Arithmetic/FxtractHandler.cs b/X86Disassembler/X86/Handlers/FloatingPoint/Arithmetic/FxtractHandler.cs new file mode 100644 index 0000000..78f57e5 --- /dev/null +++ b/X86Disassembler/X86/Handlers/FloatingPoint/Arithmetic/FxtractHandler.cs @@ -0,0 +1,61 @@ +namespace X86Disassembler.X86.Handlers.FloatingPoint.Arithmetic; + +/// +/// Handler for FXTRACT instruction (D9 F4) - Extracts the exponent and significand from the ST(0) value +/// +public class FxtractHandler : InstructionHandler +{ + /// + /// Initializes a new instance of the FxtractHandler class + /// + /// The instruction decoder that owns this handler + public FxtractHandler(InstructionDecoder decoder) + : base(decoder) + { + } + + /// + /// Checks if this handler can decode the given opcode + /// + /// The opcode to check + /// True if this handler can decode the opcode + public override bool CanHandle(byte opcode) + { + // FXTRACT is D9 F4 + if (opcode != 0xD9) return false; + + if (!Decoder.CanReadByte()) + return false; + + // Check if the next byte is F4 + byte nextByte = Decoder.PeakByte(); + return nextByte == 0xF4; + } + + /// + /// Decodes an FXTRACT instruction + /// + /// The opcode of the instruction + /// The instruction object to populate + /// True if the instruction was successfully decoded + public override bool Decode(byte opcode, Instruction instruction) + { + if (!Decoder.CanReadByte()) + return false; + + // Read the second byte of the opcode + byte secondByte = Decoder.ReadByte(); + + // Verify the opcode is correct + if (secondByte != 0xF4) + return false; + + // Set the instruction type + instruction.Type = InstructionType.Fxtract; + + // FXTRACT has no operands + instruction.StructuredOperands = []; + + return true; + } +} diff --git a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs index 479167c..776cdba 100644 --- a/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs +++ b/X86Disassembler/X86/Handlers/InstructionHandlerFactory.cs @@ -415,6 +415,8 @@ public class InstructionHandlerFactory _handlers.Add(new FloatingPoint.Transcendental.Fyl2xHandler(_decoder)); // FYL2X (D9 F1) _handlers.Add(new FloatingPoint.Transcendental.FptanHandler(_decoder)); // FPTAN (D9 F2) _handlers.Add(new FloatingPoint.Transcendental.FpatanHandler(_decoder)); // FPATAN (D9 F3) + _handlers.Add(new FloatingPoint.Arithmetic.FxtractHandler(_decoder)); // FXTRACT (D9 F4) + _handlers.Add(new FloatingPoint.Arithmetic.Fprem1Handler(_decoder)); // FPREM1 (D9 F5) // Other floating point handlers _handlers.Add(new FloatingPoint.Control.FnstswHandler(_decoder)); // FNSTSW AX (DF E0)