1{ %CPU=i8086 }
2program tasm17;
3
4{ This test is TP7 compatible }
5
6{$ifndef FPC}
7type
8  CodePointer = Pointer;
9{$endif}
10
11var
12  xx: word;
13
14const
15  expect1: array [0..6] of word =
16    (Ofs(xx),Ofs(xx),Ofs(xx),Seg(xx),Ofs(xx),0,$aa55);
17
18var
19  expect2: array [0..6] of word;
20  expect3: array [0..6] of word;
21  expect4: array [0..12] of word;
22
23procedure test1; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF}
24asm
25  dw xx
26  dw offset xx
27  dd xx
28  dd offset xx
29  db 55h, 0aah
30end;
31
32procedure test2; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF}
33asm
34  dw xx+5
35  dw offset xx+6
36  dd xx+7
37  dd offset xx+8
38  db 55h, 0aah
39end;
40
41procedure test3; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF}
42asm
43  dw 9+xx
44  dw 11+offset xx
45  dd 12+xx
46  dd 14+offset xx
47  db 55h, 0aah
48end;
49
50procedure test4; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF}
51asm
52  nop
53  nop
54@jumptab:
55  nop
56  nop
57  dw @jumptarget
58  nop
59  nop
60  dw offset @jumptarget
61  nop
62  nop
63  dd @jumptarget
64  nop
65  nop
66  dd offset @jumptarget
67  nop
68  nop
69@jumptarget:
70  db 55h, 0aah
71end;
72
73procedure Error;
74begin
75  Writeln('Error!');
76  Halt(1);
77end;
78
79{ This version works in all i8086 memory models }
80function CompareCode(cp: CodePointer; dp: Pointer; sz: Integer): Boolean;
81var
82  I: Integer;
83begin
84  for I := 0 to sz - 1 do
85    if Mem[Seg(cp^):Ofs(cp^) + I] <> Mem[Seg(dp^):Ofs(dp^) + I] then
86    begin
87      CompareCode := False;
88      exit;
89    end;
90  CompareCode := True;
91end;
92
93begin
94  if not CompareCode(CodePointer(@test1), @expect1, SizeOf(expect1)) then
95    Error;
96
97  expect2[0] := Ofs(xx)+5;
98  expect2[1] := Ofs(xx)+6;
99  expect2[2] := Ofs(xx)+7;
100  expect2[3] := Seg(xx);
101  expect2[4] := Ofs(xx)+8;
102  expect2[5] := 0;
103  expect2[6] := $aa55;
104  if not CompareCode(CodePointer(@test2), @expect2, SizeOf(expect2)) then
105    Error;
106
107  expect3[0] := Ofs(xx)+9;
108  expect3[1] := Ofs(xx)+11;
109  expect3[2] := Ofs(xx)+12;
110  expect3[3] := Seg(xx);
111  expect3[4] := Ofs(xx)+14;
112  expect3[5] := 0;
113  expect3[6] := $aa55;
114  if not CompareCode(CodePointer(@test3), @expect3, SizeOf(expect3)) then
115    Error;
116
117  expect4[0] := $9090;
118  expect4[1] := $9090;
119  expect4[2] := Ofs(test4) + 24;
120  expect4[3] := $9090;
121  expect4[4] := Ofs(test4) + 24;
122  expect4[5] := $9090;
123  expect4[6] := Ofs(test4) + 24;
124  expect4[7] := Seg(test4);
125  expect4[8] := $9090;
126  expect4[9] := Ofs(test4) + 24;
127  expect4[10] := 0;
128  expect4[11] := $9090;
129  expect4[12] := $aa55;
130  if not CompareCode(CodePointer(@test4), @expect4, SizeOf(expect4)) then
131    Error;
132
133  Writeln('Ok!');
134end.
135