{**************************************************************************************************} { } { Project JEDI Code Library (JCL) } { } { The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } { you may not use this file except in compliance with the License. You may obtain a copy of the } { License at http://www.mozilla.org/MPL/ } { } { Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } { ANY KIND, either express or implied. See the License for the specific language governing rights } { and limitations under the License. } { } { The Original Code is: JvSIMDViewForm.pas, released on 2004-10-11. } { } { The Initial Developer of the Original Code is Florent Ouchet } { [ouchet dott florent att laposte dott net] } { Portions created by Florent Ouchet are Copyright (C) 2004 Florent Ouchet. } { All Rights Reserved. } { } { You may retrieve the latest version of this file at the Project JEDI's JCL home page, } { located at http://jcl.sourceforge.net } { } {**************************************************************************************************} // $Id: JclSIMDViewForm.pas,v 1.9 2006/01/08 17:16:56 outchy Exp $ unit JclSIMDViewForm; {$I jcl.inc} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ToolsApi, Grids, ExtCtrls, Menus, ActnList, JclOtaUtils, JclSysInfo, JclSIMDUtils, JclSIMDModifyForm; type TJclSIMDViewFrm = class(TForm) Splitter: TSplitter; ListBoxRegs: TListBox; ListBoxMXCSR: TListBox; PopupMenuRegs: TPopupMenu; PopupMenuMXCSR: TPopupMenu; MenuItemComplement: TMenuItem; MenuItemBinary: TMenuItem; MenuItemSigned: TMenuItem; MenuItemUnsigned: TMenuItem; MenuItemHexa: TMenuItem; MenuItemDisplay: TMenuItem; MenuItemFormat: TMenuItem; MenuItemBytes: TMenuItem; MenuItemWords: TMenuItem; MenuItemDWords: TMenuItem; MenuItemQWords: TMenuItem; MenuItemSeparator1: TMenuItem; MenuItemSingles: TMenuItem; MenuItemDoubles: TMenuItem; MenuItemSeparator2: TMenuItem; MenuItemStayOnTop: TMenuItem; MenuItemModify: TMenuItem; MenuItemCpuInfo: TMenuItem; ActionListOptions: TActionList; ActionStayOnTop: TAction; ActionModify: TAction; ActionComplement: TAction; ActionEmpty: TAction; ActionEmptyAll: TAction; MenuItemEmptyMM: TMenuItem; MenuItemEmptyAll: TMenuItem; procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ListBoxMXCSRDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure ListBoxMXCSRMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure ListBoxRegsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure MenuItemFormatClick(Sender: TObject); procedure MenuItemDisplayClick(Sender: TObject); procedure MenuItemCpuInfoClick(Sender: TObject); procedure ActionStayOnTopUpdate(Sender: TObject); procedure ActionStayOnTopExecute(Sender: TObject); procedure ActionModifyUpdate(Sender: TObject); procedure ActionModifyExecute(Sender: TObject); procedure ActionComplementExecute(Sender: TObject); procedure ActionComplementUpdate(Sender: TObject); procedure ActionEmptyUpdate(Sender: TObject); procedure ActionEmptyAllUpdate(Sender: TObject); procedure ActionEmptyExecute(Sender: TObject); procedure ActionEmptyAllExecute(Sender: TObject); procedure ListBoxesMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private FDebuggerServices: IOTADebuggerServices; FVectorFrame: TJclVectorFrame; FDisplay: TJclXMMContentType; FFormat: TJclSIMDFormat; FCpuInfo: TCpuInfo; FSIMDCaption: string; FNbMMRegister: Integer; FNbXMMRegister: Integer; FOldThreadID: LongWord; FOldThreadState: TOTAThreadState; FModifyForm: TJclSIMDModifyFrm; FMXCSRChanged: array [TMXCSRRange] of Boolean; FRegisterChanged: array of Boolean; FSettings: TJclOtaSettings; procedure SetDisplay(const Value: TJclXMMContentType); procedure SetFormat(const Value: TJclSIMDFormat); protected procedure DoClose(var Action: TCloseAction); override; procedure UpdateActions; override; procedure CreateParams(var Params: TCreateParams); override; public constructor Create(AOwner: TComponent; ADebuggerServices: IOTADebuggerServices; ASettings: TJclOtaSettings); reintroduce; destructor Destroy; override; procedure ThreadEvaluate(const ExprStr, ResultStr: string; ReturnCode: Integer); procedure SetThreadValues; procedure GetThreadValues; property CpuInfo: TCpuInfo read FCpuInfo; property Format: TJclSIMDFormat read FFormat write SetFormat; property Display: TJclXMMContentType read FDisplay write SetDisplay; property SIMDCaption: string read FSIMDCaption write FSIMDCaption; property DebuggerServices: IOTADebuggerServices read FDebuggerServices; property NbMMRegister: Integer read FNbMMRegister; property NbXMMRegister: Integer read FNbXMMRegister; property Settings: TJclOtaSettings read FSettings; end; implementation uses TypInfo, JclOtaResources, JclOtaConsts, JclSIMDCpuInfo; {$R *.dfm} constructor TJclSIMDViewFrm.Create(AOwner: TComponent; ADebuggerServices: IOTADebuggerServices; ASettings: TJclOTASettings); var I: TMXCSRRange; J: Integer; begin inherited Create(AOwner); FDebuggerServices := ADebuggerServices; FOldThreadID := 0; FOldThreadState := tsNone; FSettings := ASettings; JclSysInfo.GetCpuInfo(FCpuInfo); // the behaviour of Delphi and C++Builder overrides all changes made on // the floating point context of the debugged thread when it is run // (even using step into and step over). // to be uncommented as soon as Borland changes this behaviour {if CpuInfo.MMX or CPUInfo._3DNow then FNbMMRegister := 8 else FNbMMRegister := 0;} FNbMMRegister := 0; if CpuInfo.SSE = 0 then FNbXMMRegister := 0 else if CpuInfo.Is64Bits then FNbXMMRegister := 17 else FNbXMMRegister := 9; ListBoxMXCSR.Items.Clear; with CpuInfo do for I := Low(TMXCSRRange) to High(TMXCSRRange) do ListBoxMXCSR.Items.Add('0'); ListBoxRegs.Items.Clear; SetLength(FRegisterChanged,NbMMRegister + NbXMMRegister); for J := 0 to NbMMRegister + NbXMMRegister - 1 do // MM registers (MMX) + XMM registers (SSE) + 1 cardinal (MXCSR) ListBoxRegs.Items.Add(''); MenuItemBinary.Tag := Integer(sfBinary); MenuItemSigned.Tag := Integer(sfSigned); MenuItemUnsigned.Tag := Integer(sfUnsigned); MenuItemHexa.Tag := Integer(sfHexa); MenuItemBytes.Tag := Integer(xt16Bytes); MenuItemWords.Tag := Integer(xt8Words); MenuItemDWords.Tag := Integer(xt4DWords); MenuItemQWords.Tag := Integer(xt2QWords); MenuItemSingles.Tag := Integer(xt4Singles); MenuItemDoubles.Tag := Integer(xt2Doubles); Format := sfHexa; Display := xt8Words; GetThreadValues; end; procedure TJclSIMDViewFrm.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); // Fixing the Window Ghosting "bug" Params.Style := params.Style or WS_POPUP; if Assigned(Screen.ActiveForm) then Params.WndParent := Screen.ActiveForm.Handle else if Assigned (Application.MainForm) then Params.WndParent := Application.MainForm.Handle else Params.WndParent := Application.Handle; end; destructor TJclSIMDViewFrm.Destroy; begin SetLength(FRegisterChanged,0); FDebuggerServices := nil; inherited Destroy; end; procedure TJclSIMDViewFrm.ListBoxMXCSRDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin try with (Control as TListBox), Canvas do begin if not (odFocused in State) then begin Pen.Color := Brush.Color; if odSelected in State then Font.Color := clWindow; end; Rectangle(Rect); TextOut(Rect.Left + 2, Rect.Top, MXCSRBitsDescriptions[Index].ShortName); if FMXCSRChanged[Index] then Font.Color := clRed; TextOut(Rect.Left + 2 + TextExtent(MXCSRBitsDescriptions[Index].ShortName).cx, Rect.Top, Items[Index]); end; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ListBoxMXCSRMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var AIndex: Integer; AText: string; begin try if Shift <> [] then Application.HideHint else with Sender as TListBox do begin AIndex := ItemAtPos(Point(X,Y),True); if (AIndex >= 0) and (AIndex < Items.Count) then begin with MXCSRBitsDescriptions[AIndex] do begin AText := LongName; if AndMask = MXCSR_RC then case (FVectorFrame.MXCSR and AndMask) shr Shifting of 0: AText := SysUtils.Format('%s (%s)', [AText, RsRoundToNearest]); 1: AText := SysUtils.Format('%s (%s)', [AText, RsRoundDown]); 2: AText := SysUtils.Format('%s (%s)', [AText, RsRoundUp]); 3: AText := SysUtils.Format('%s (%s)', [AText, RsRoundTowardZero]); end; if AText <> Hint then begin Hint := AText; Application.HideHint; Application.ActivateHint(Point(X, Y)); end; end; end else begin Hint := ''; Application.HideHint; end; end; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ListBoxRegsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var AText: string; begin try with (Control as TListBox), Canvas do begin if not (odFocused in State) then begin Pen.Color := Brush.Color; if odSelected in State then Font.Color := clWindow; end; Rectangle(Rect); if Index < NbMMRegister then AText := SysUtils.Format('MM%d ', [Index]) else if Index < NbMMRegister + NbXMMRegister - 1 then begin if CpuInfo.Is64Bits then AText := SysUtils.Format('XMM%.2d ', [Index - NbMMRegister]) else AText := SysUtils.Format('XMM%d ', [Index - NbMMRegister]); end else AText := 'MXCSR '; TextOut(Rect.Left + 2, Rect.Top, AText); if FRegisterChanged[Index] then Font.Color := clRed; TextOut(Rect.Left + 2 + TextExtent(AText).cx, Rect.Top, Items[Index]); end; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.GetThreadValues; var NewVectorFrame: TJclVectorFrame; NewBitValue, OldBitValue: Cardinal; Index: Integer; AProcess: IOTAProcess; AThread: IOTAThread; function ChangedFlag(const Value1, Value2: TJclXMMRegister): Boolean; overload; begin Result := (Value1.QWords[0] <> Value2.QWords[0]) or (Value1.QWords[1] <> Value2.QWords[1]); end; function ChangedFlag(const Value1, Value2: TJclMMRegister): Boolean; overload; begin Result := Value1.QWords <> Value2.QWords; end; function FormatReg(const AReg: TJclXMMRegister): string; overload; var I: Integer; Value: TJclSIMDValue; begin Result := ''; Value.Display := Display; case Display of xt16Bytes: for I := High(AReg.Bytes) downto Low(AReg.Bytes) do begin Value.ValueByte := AReg.Bytes[I]; Result := Result + ' ' + FormatValue(Value, Format); end; xt8Words: for I := High(AReg.Words) downto Low(AReg.Words) do begin Value.ValueWord := AReg.Words[I]; Result := Result + ' ' + FormatValue(Value, Format); end; xt4DWords: for I := High(AReg.DWords) downto Low(AReg.DWords) do begin Value.ValueDWord := AReg.DWords[I]; Result := Result + ' ' + FormatValue(Value, Format); end; xt2QWords: for I := High(AReg.QWords) downto Low(AReg.QWords) do begin Value.ValueQWord := AReg.QWords[I]; Result := Result + ' ' + FormatValue(Value, Format); end; xt4Singles: for I := High(AReg.Singles) downto Low(AReg.Singles) do begin Value.ValueSingle := AReg.Singles[I]; Result := Result + ' ' + FormatValue(Value, sfBinary); end; xt2Doubles: for I := High(AReg.Doubles) downto Low(AReg.Doubles) do begin Value.ValueDouble := AReg.Doubles[I]; Result := Result + ' ' + FormatValue(Value, sfBinary); end; end; end; function FormatReg(const AReg: TJclFPUData; Index: Cardinal): string; overload; var I: Integer; Value: TJclSIMDValue; begin Result := ''; Value.Display := Display; if (AReg.Reserved = $FFFF) and ((NewVectorFrame.FTW and (1 shl Index)) <> 0) then case Display of xt16Bytes: for I := High(AReg.MMRegister.Bytes) downto Low(AReg.MMRegister.Bytes) do begin Value.ValueByte := AReg.MMRegister.Bytes[I]; Result := Result + ' ' + FormatValue(Value, Format); end; xt8Words: for I := High(AReg.MMRegister.Words) downto Low(AReg.MMRegister.Words) do begin Value.ValueWord := AReg.MMRegister.Words[I]; Result := Result + ' ' + FormatValue(Value, Format); end; xt4DWords: for I := High(AReg.MMRegister.DWords) downto Low(AReg.MMRegister.DWords) do begin Value.ValueDWord := AReg.MMRegister.DWords[I]; Result := Result + ' ' + FormatValue(Value, Format); end; xt2QWords: begin Value.ValueQWord := AReg.MMRegister.QWords; Result := FormatValue(Value, Format); end; xt4Singles: for I := High(AReg.MMRegister.Singles) downto Low(AReg.MMRegister.Singles) do begin Value.ValueSingle := AReg.MMRegister.Singles[I]; Result := Result + ' ' + FormatValue(Value, sfBinary); end; xt2Doubles: Result := RsNotSupportedFormat; end else Result := RsNoPackedData; end; begin AProcess := nil; AThread := nil; if DebuggerServices.ProcessCount > 0 then AProcess := DebuggerServices.CurrentProcess; if (AProcess <> nil) and (AProcess.ThreadCount > 0) then AThread := AProcess.CurrentThread; if (AThread = nil) or (AThread.State = tsNone) or (AThread.GetOSThreadID = 0) or (AThread.Handle = 0) then begin Close; Exit; end; case AThread.State of tsStopped: begin if DebuggerServices.CurrentProcess.ThreadCount > 1 then Caption := SysUtils.Format('%s Thread : %d', [SIMDCaption,AThread.GetOSThreadID]) else Caption := SIMDCaption; GetVectorContext(AThread,NewVectorFrame); for Index := 0 to ListBoxMXCSR.Items.Count - 1 do with ListBoxMXCSR, Items, MXCSRBitsDescriptions[Index] do begin NewBitValue := NewVectorFrame.MXCSR and AndMask; OldBitValue := FVectorFrame.MXCSR and AndMask; FMXCSRChanged[Index] := NewBitValue <> OldBitValue; Strings[Index] := IntToStr(NewBitValue shr Shifting); end; ListBoxMXCSR.Invalidate; for Index := 0 to NbMMRegister - 1 do begin FRegisterChanged[Index] := ChangedFlag(NewVectorFrame.FPURegisters[Index].Data.MMRegister, FVectorFrame.FPURegisters[Index].Data.MMRegister); ListBoxRegs.Items.Strings[Index] := FormatReg(NewVectorFrame.FPURegisters[Index].Data, Index); end; if FNbXMMRegister > 0 then begin for Index := 0 to FNbXMMRegister - 2 do begin FRegisterChanged[Index + NbMMRegister] := ChangedFlag(NewVectorFrame.XMMRegisters.LongXMM[Index], FVectorFrame.XMMRegisters.LongXMM[Index]); ListBoxRegs.Items.Strings[Index + NbMMRegister] := FormatReg(NewVectorFrame.XMMRegisters.LongXMM[Index]); end; FRegisterChanged[NbMMRegister + NbXMMRegister - 1] := NewVectorFrame.MXCSR <> FVectorFrame.MXCSR; ListBoxRegs.Items.Strings[NbMMRegister + NbXMMRegister - 1] := IntToHex(NewVectorFrame.MXCSR, 8); end; ListBoxRegs.Invalidate; FVectorFrame := NewVectorFrame; end; tsRunnable: Caption := SysUtils.Format('%s ', [SIMDCaption]); tsBlocked: Caption := SysUtils.Format('%s ', [SIMDCaption]); end; end; procedure TJclSIMDViewFrm.SetThreadValues; begin if not SetVectorContext(DebuggerServices.CurrentProcess.CurrentThread,FVectorFrame) then raise EJclExpertException.Create(RsECantUpdateThreadContext); end; procedure TJclSIMDViewFrm.MenuItemFormatClick(Sender: TObject); begin try Format := TJclSIMDFormat((Sender as TMenuItem).Tag); except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.SetDisplay(const Value: TJclXMMContentType); var AEnabled: Boolean; begin FDisplay := Value; MenuItemBytes.Checked := Value = xt16Bytes; MenuItemWords.Checked := Value = xt8Words; MenuItemDWords.Checked := Value = xt4DWords; MenuItemQWords.Checked := Value = xt2QWords; MenuItemSingles.Checked := Value = xt4Singles; MenuItemDoubles.Checked := Value = xt2Doubles; AEnabled := not (Value in [xt4Singles, xt2Doubles]); MenuItemBinary.Enabled := AEnabled; MenuItemSigned.Enabled := AEnabled; MenuItemUnsigned.Enabled := AEnabled; MenuItemHexa.Enabled := AEnabled; GetThreadValues; end; procedure TJclSIMDViewFrm.SetFormat(const Value: TJclSIMDFormat); begin FFormat := Value; MenuItemBinary.Checked := Value = sfBinary; MenuItemSigned.Checked := Value = sfSigned; MenuItemUnsigned.Checked := Value = sfUnsigned; MenuItemHexa.Checked := Value = sfHexa; GetThreadValues; end; procedure TJclSIMDViewFrm.MenuItemDisplayClick(Sender: TObject); begin try Display := TJclXMMContentType((Sender as TMenuItem).Tag); except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.DoClose(var Action: TCloseAction); begin Action := caFree; end; procedure TJclSIMDViewFrm.FormCreate(Sender: TObject); begin SetBounds( Settings.LoadInteger('Left', Left), Settings.LoadInteger('Top', Top), Settings.LoadInteger('Width', Width), Settings.LoadInteger('Height', Height)); if Left < 0 then Left := 0; if Top < 0 then Top := 0; if Width > Screen.Width then Width := Screen.Width; if (Left + Width) > Screen.DesktopWidth then Left := Screen.DesktopWidth - Width; if Height > Screen.Height then Height := Screen.Height; if (Top + Height) > Screen.DesktopHeight then Top := Screen.DesktopHeight - Height; Format := TJclSIMDFormat(GetEnumValue(TypeInfo(TJclSIMDFormat), Settings.LoadString('Format', GetEnumName(TypeInfo(TJclSIMDFormat), Integer(sfHexa))))); Display := TJclXMMContentType(GetEnumValue(TypeInfo(TJclXMMContentType), Settings.LoadString('Display', GetEnumName(TypeInfo(TJclXMMContentType), Integer(xt8Words))))); if Settings.LoadInteger('StayOnTop', 0) = 1 then FormStyle := fsStayOnTop else FormStyle := fsNormal; end; procedure TJclSIMDViewFrm.FormDestroy(Sender: TObject); begin Settings.SaveInteger('Left', Left); Settings.SaveInteger('Top', Top); Settings.SaveInteger('Width', Width); Settings.SaveInteger('Height', Height); Settings.SaveString('Display', GetEnumName(TypeInfo(TJclXMMContentType), Integer(Display))); Settings.SaveString('Format', GetEnumName(TypeInfo(TJclSIMDFormat), Integer(Format))); Settings.SaveInteger('StayOnTop', Ord(FormStyle = fsStayOnTop)); end; procedure TJclSIMDViewFrm.MenuItemCpuInfoClick(Sender: TObject); var FormCPUInfo: TJclFormCpuInfo; begin try FormCPUInfo := TJclFormCpuInfo.Create(Self); try FormCPUInfo.Execute(CpuInfo); finally FormCPUInfo.Free; end; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.UpdateActions; var CurrentThreadID: Cardinal; AProcess: IOTAProcess; AThread: IOTAThread; ANewThreadState: TOTAThreadState; begin inherited UpdateActions; CurrentThreadID := 0; AProcess := nil; AThread := nil; if DebuggerServices.ProcessCount > 0 then AProcess := DebuggerServices.CurrentProcess; if (AProcess <> nil) and (AProcess.ThreadCount > 0) then AThread := AProcess.CurrentThread; if AThread <> nil then begin ANewThreadState := AThread.State; if ANewThreadState in [tsStopped, tsBlocked] then CurrentThreadID := AThread.GetOSThreadID; if (CurrentThreadID <> 0) and ((CurrentThreadID <> FOldThreadID) or (ANewThreadState <> FOldThreadState)) then begin FOldThreadID := CurrentThreadID; FOldThreadState := ANewThreadState; GetThreadValues; end; end; end; procedure TJclSIMDViewFrm.ThreadEvaluate(const ExprStr, ResultStr: string; ReturnCode: Integer); begin if Assigned(FModifyForm) then FModifyForm.ThreadEvaluate(ExprStr, ResultStr, ReturnCode); end; procedure TJclSIMDViewFrm.ActionStayOnTopUpdate(Sender: TObject); var AAction: TAction; begin try AAction := Sender as TAction; AAction.Checked := FormStyle = fsStayOnTop; AAction.Enabled := True; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionStayOnTopExecute(Sender: TObject); begin try if FormStyle = fsStayOnTop then FormStyle := fsNormal else FormStyle := fsStayOnTop; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionModifyUpdate(Sender: TObject); var AProcess: IOTAProcess; AThread: IOTAThread; AItemIndex: Integer; begin try AProcess := DebuggerServices.CurrentProcess; AThread := nil; AItemIndex := ListBoxRegs.ItemIndex; if NbXMMRegister > 0 then Inc(AItemIndex); if Assigned(AProcess) then AThread := AProcess.CurrentThread; (Sender as TAction).Enabled := Assigned(AThread) and (AThread.State = tsStopped) and (AItemIndex >= 0) and (AItemIndex < (NbMMRegister + NbXMMRegister)); except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionModifyExecute(Sender: TObject); var AItemIndex: Integer; begin try AItemIndex := ListBoxRegs.ItemIndex; if AItemIndex >= 0 then try FModifyForm := TJclSIMDModifyFrm.Create(Self, DebuggerServices, Settings); FModifyForm.Icon.Assign(Self.Icon); if AItemIndex < NbMMRegister then begin FModifyForm.Caption := SysUtils.Format(RsModifyMM, [AItemIndex]); if FModifyForm.Execute(DebuggerServices.CurrentProcess.CurrentThread, Display, Format, FVectorFrame.FPURegisters[AItemIndex].Data.MMRegister ,FCpuInfo) then begin FVectorFrame.FPURegisters[AItemIndex].Data.Reserved := $FFFF; FVectorFrame.FTW := FVectorFrame.FTW or (1 shl AItemIndex); SetThreadValues; GetThreadValues; FRegisterChanged[AItemIndex] := True; ListBoxRegs.Invalidate; end; end else begin if CpuInfo.Is64Bits then FModifyForm.Caption := SysUtils.Format(RsModifyXMM2, [AItemIndex - NbMMRegister]) else FModifyForm.Caption := SysUtils.Format(RsModifyXMM1, [AItemIndex - NbMMRegister]); if FModifyForm.Execute(DebuggerServices.CurrentProcess.CurrentThread, Display, Format, FVectorFrame.XMMRegisters.LongXMM[AItemIndex - NbMMRegister], FCpuInfo) then begin SetThreadValues; GetThreadValues; FRegisterChanged[AItemIndex] := True; ListBoxRegs.Invalidate; end; end; finally FreeAndNil(FModifyForm); end; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionEmptyUpdate(Sender: TObject); var AProcess: IOTAProcess; AThread: IOTAThread; AItemIndex: Integer; begin try AProcess := DebuggerServices.CurrentProcess; AThread := nil; AItemIndex := ListBoxRegs.ItemIndex; if Assigned(AProcess) then AThread := AProcess.CurrentThread; (Sender as TAction).Enabled := Assigned(AThread) and (AThread.State = tsStopped) and (AItemIndex >= 0) and (AItemIndex < NbMMRegister) and ((FVectorFrame.FTW and (1 shl AItemIndex)) <> 0) and (FVectorFrame.FPURegisters[AItemIndex].Data.Reserved = $FFFF); except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionEmptyExecute(Sender: TObject); var AItemIndex: Integer; begin try AItemIndex := ListBoxRegs.ItemIndex; FVectorFrame.FTW := FVectorFrame.FTW and not (1 shl AItemIndex); FVectorFrame.FPURegisters[AItemIndex].Data.FloatValue := 0.0; SetThreadValues; GetThreadValues; FRegisterChanged[AItemIndex] := True; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionEmptyAllUpdate(Sender: TObject); var AProcess: IOTAProcess; AThread: IOTAThread; AItemIndex: Integer; begin try AProcess := DebuggerServices.CurrentProcess; AThread := nil; AItemIndex := ListBoxRegs.ItemIndex; if Assigned(AProcess) then AThread := AProcess.CurrentThread; (Sender as TAction).Enabled := (AItemIndex >= 0) and (AItemIndex < NbMMRegister) and Assigned(AThread) and (AThread.State = tsStopped); except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionEmptyAllExecute(Sender: TObject); var Index: Integer; begin try FVectorFrame.FTW := 0; for Index := Low(FVectorFrame.FPURegisters) to High(FVectorFrame.FPURegisters) do FVectorFrame.FPURegisters[Index].Data.FloatValue := 0.0; SetThreadValues; GetThreadValues; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionComplementUpdate(Sender: TObject); begin try (Sender as TAction).Enabled := ListBoxMXCSR.ItemIndex >= 0; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ActionComplementExecute(Sender: TObject); var BitValue: Cardinal; OldMXCSRValue: Cardinal; begin try if ListBoxMXCSR.ItemIndex >= 0 then with MXCSRBitsDescriptions[ListBoxMXCSR.ItemIndex] do begin OldMXCSRValue := FVectorFrame.MXCSR; BitValue := (Cardinal(FVectorFrame.MXCSR) and AndMask) shr Shifting; Inc(BitValue); FVectorFrame.MXCSR := (FVectorFrame.MXCSR and (not AndMask)) or ((BitValue shl Shifting) and AndMask); SetThreadValues; FVectorFrame.MXCSR := OldMXCSRValue; GetThreadValues; end; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; procedure TJclSIMDViewFrm.ListBoxesMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var AListBox: TListBox; begin try if Button = mbRight then begin AListBox := Sender as TListBox; AListBox.ItemIndex := AListBox.ItemAtPos(Point(X, Y), True); end; except on ExceptionObj: TObject do begin JclExpertShowExceptionDialog(ExceptionObj); raise; end; end; end; // History: // $Log: JclSIMDViewForm.pas,v $ // Revision 1.9 2006/01/08 17:16:56 outchy // Settings reworked. // Common window for expert configurations // // Revision 1.8 2005/12/16 23:46:25 outchy // Added expert stack form. // Added code to display call stack on expert exception. // Fixed package extension for D2006. // // Revision 1.7 2005/12/04 10:10:57 obones // Borland Developer Studio 2006 support // // Revision 1.6 2005/11/21 21:25:40 outchy // Modified the get/set methods of thread context for Delphi 2005 // // Revision 1.5 2005/10/26 03:29:44 rrossmair // - improved header information, added $Date: 2006/01/08 17:16:56 $ and $Log: JclSIMDViewForm.pas,v $ // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Revision 1.9 2006/01/08 17:16:56 outchy // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Settings reworked. // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Common window for expert configurations // - improved header information, added $Date: 2006/01/08 17:16:56 $ and // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Revision 1.8 2005/12/16 23:46:25 outchy // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Added expert stack form. // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Added code to display call stack on expert exception. // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Fixed package extension for D2006. // - improved header information, added $Date: 2006/01/08 17:16:56 $ and // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Revision 1.7 2005/12/04 10:10:57 obones // - improved header information, added $Date: 2006/01/08 17:16:56 $ and Borland Developer Studio 2006 support // - improved header information, added $Date: 2006/01/08 17:16:56 $ and CVS tags. // end.