File: asmtestunit.pas

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (81 lines) | stat: -rw-r--r-- 1,463 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
unit AsmTestUnit;


{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, LCLProc, Math,
  FpDbgDisasX86;

type

  { TForm1 }

  TForm1 = class(TForm)
    chk64Bit: TCheckBox;
    Timer1: TTimer;
    txtOutput: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    txtCode: TMemo;
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{$R asmtestunit.lfm}

{ TForm1 }

procedure TForm1.Timer1Timer(Sender: TObject);
var
  idx, n: Integer;
  Line, S: String;
  Code: array[0..28] of Byte;
  CodeIdx, B: Byte;
  Value: Int64;
  e: Integer;
  p: Pointer;
begin
  n := txtCode.SelStart;
  if n < 0 then Exit;
  S := Copy(txtCode.Text, 1, n);
  idx := 0;
  for n := 1 to Length(S) do
  begin
    if S[n] = #10 then Inc(idx);
  end;
  Line := txtCode.Lines[idx];
  CodeIdx := 0;
  while (Line <> '') and (CodeIdx < 20) do
  begin
    S := GetPart([], [' ', #9], Line);
    Delete(Line, 1, 1); // strip end ' ' or #9
    if S = '' then Continue;
    B := Min(16, Length(S));
    Val('$' + S, Value, e);
    if e <> 0 then Continue;
    Move(Value, Code[CodeIdx], B div 2);
    Inc(CodeIdx, B div 2);
  end;
  if CodeIdx > 0
  then begin
    p := @Code;
    Disassemble(p, chk64Bit.Checked, S, Line);
    txtOutput.Text := S + ' '+ Line;
  end
//  else txtOutput.Text :='';
end;

end.