summaryrefslogtreecommitdiff
path: root/tests/webtbs/tw0736.pp
blob: 7792bd5d5caba1a5ff8a85c0f930df26cfd5b6f3 (plain)
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
{ %CPU=i386 }
{$ifdef FPC}
{$ASMMODE INTEL}
{$INLINE ON}
{$endif FPC}

program test;

type
   tobj = object
     x : word;
     constructor init;
     procedure test;virtual;
     procedure testx;
     end;

constructor tobj.init;
begin
  x:=1;
end;

procedure tobj.testx;
begin
  asm
    mov ax,3
    mov edx,SELF
    mov word ptr[edx+x],ax
  end;
end;

procedure tobj.test;
var
  pattern: word;
  dummyval : word;

  function rotate: boolean; assembler; {$ifdef FPC}inline;{$endif FPC}
  asm
    mov al,0
    rol word ptr [pattern],1
    rcl al,1
  end;

{ this does still not work because
  it can only work as inline not as normal sub function
  because dummyval and pattern are not reachable !! PM
  function rotateb(dummy : byte) : boolean; assembler; inline;
  asm
    movzx byte ptr [dummy],ax
    mov ax,word ptr [dummyval]
    mov al,0
    rol word ptr [pattern],1
    rcl al,1
  end; }

var
  i : byte;

begin
  pattern:= $a0a0;
  for i:=1 to 16 do
   begin
     Write('obj pattern = ',
       {$ifdef FPC}
       hexstr(pattern,4),' ');
       {$else}
       pattern,' ');
       {$endif}
     if rotate then
       Writeln('bit found')
     else
       Writeln('no bit found');
   end;
end;

procedure changepattern;
var
  pattern: word;
  dummyval : word;

  function rotate: boolean; assembler; {$ifdef FPC}inline;{$endif FPC}
  asm
    mov al,0
    rol word ptr [pattern],1
    rcl al,1
  end;

{ this does still not work because
  it can only work as inline not as normal sub function
  because dummyval and pattern are not reachable !! PM
  function rotateb(dummy : byte) : boolean; assembler; inline;
  asm
    movzx byte ptr [dummy],ax
    mov ax,word ptr [dummyval]
    mov al,0
    rol word ptr [pattern],1
    rcl al,1
  end; }

var
  i : byte;

begin
  pattern:= $a0a0;
  for i:=1 to 16 do
   begin
     Write('pattern = ',
       {$ifdef FPC}
       hexstr(pattern,4),' ');
       {$else}
       pattern,' ');
       {$endif}
     if rotate then
       Writeln('bit found')
     else
       Writeln('no bit found');
   end;
end;

var

  t : tobj;
begin
  changepattern;
  t.init;
  t.test;
  t.testx;
  if t.x<>3 then
    begin
      Writeln('Unable to access object fields in assembler');
      Halt(1);
    end;
end.