1{ %CPU=i8086,i386,x86_64 }
2
3program tasm16;
4
5{$ifdef cpui8086}
6{$asmcpu 80386}
7{$endif cpui8086}
8
9const
10{$ifdef cpui8086}
11  expect1: array [0..3] of byte = (
12    $2E,              // segcs
13    $67,$66,          // db $67,$66
14    $AD               // lodsw
15  );
16  expect2: array [0..3] of byte = (
17    $3E,              // segds
18    $67,$66,          // db $67,$66
19    $AD               // lodsw
20  );
21  expect3: array [0..3] of byte = (
22    $36,              // segss
23    $67,$66,          // db $67,$66
24    $AD               // lodsw
25  );
26  expect4: array [0..3] of byte = (
27    $26,              // seges
28    $67,$66,          // db $67,$66
29    $AD               // lodsw
30  );
31  expect5: array [0..3] of byte = (
32    $64,              // segfs
33    $67,$66,          // db $67,$66
34    $AD               // lodsw
35  );
36  expect6: array [0..3] of byte = (
37    $65,              // seggs
38    $67,$66,          // db $67,$66
39    $AD               // lodsw
40  );
41{$else}
42  expect1: array [0..4] of byte = (
43    $2E,              // segcs
44    $67,$66,          // db $67,$66
45    $66,$AD           // lodsw
46  );
47  expect2: array [0..4] of byte = (
48    $3E,              // segds
49    $67,$66,          // db $67,$66
50    $66,$AD           // lodsw
51  );
52  expect3: array [0..4] of byte = (
53    $36,              // segss
54    $67,$66,          // db $67,$66
55    $66,$AD           // lodsw
56  );
57  expect4: array [0..4] of byte = (
58    $26,              // seges
59    $67,$66,          // db $67,$66
60    $66,$AD           // lodsw
61  );
62  expect5: array [0..4] of byte = (
63    $64,              // segfs
64    $67,$66,          // db $67,$66
65    $66,$AD           // lodsw
66  );
67  expect6: array [0..4] of byte = (
68    $65,              // seggs
69    $67,$66,          // db $67,$66
70    $66,$AD           // lodsw
71  );
72{$endif}
73  expect7: array [0..0] of byte = (
74    $2E               // segcs
75  );
76  expect8: array [0..0] of byte = (
77    $3E               // segds
78  );
79  expect9: array [0..0] of byte = (
80    $36               // segss
81  );
82  expect10: array [0..0] of byte = (
83    $26               // seges
84  );
85  expect11: array [0..0] of byte = (
86    $64               // segfs
87  );
88  expect12: array [0..0] of byte = (
89    $65               // seggs
90  );
91  expect13: array [0..1] of byte = (
92    $2E,$AC           // segcs lodsb
93  );
94  expect14: array [0..1] of byte = (
95    $3E,$AC           // segds lodsb
96  );
97  expect15: array [0..1] of byte = (
98    $36,$AC           // segss lodsb
99  );
100  expect16: array [0..1] of byte = (
101    $26,$AC           // seges lodsb
102  );
103  expect17: array [0..1] of byte = (
104    $64,$AC           // segfs lodsb
105  );
106  expect18: array [0..1] of byte = (
107    $65,$AC           // seggs lodsb
108  );
109{$ifdef cpui8086}
110  expect19: array [0..2] of byte = (
111    $F3,              // rep
112    $66,              // db $66
113    $A5               // movsw
114  );
115{$else}
116  expect19: array [0..3] of byte = (
117    $F3,              // rep
118    $66,              // db $66
119    $66,$A5           // movsw
120  );
121{$endif}
122
123{$asmmode intel}
124
125procedure test1; assembler; nostackframe;
126asm
127  segcs; db $67,$66; lodsw
128end;
129procedure test2; assembler; nostackframe;
130asm
131  segds; db $67,$66; lodsw
132end;
133procedure test3; assembler; nostackframe;
134asm
135  segss; db $67,$66; lodsw
136end;
137procedure test4; assembler; nostackframe;
138asm
139  seges; db $67,$66; lodsw
140end;
141procedure test5; assembler; nostackframe;
142asm
143  segfs; db $67,$66; lodsw
144end;
145procedure test6; assembler; nostackframe;
146asm
147  seggs; db $67,$66; lodsw
148end;
149procedure test7; assembler; nostackframe;
150asm
151  segcs
152end;
153procedure test8; assembler; nostackframe;
154asm
155  segds
156end;
157procedure test9; assembler; nostackframe;
158asm
159  segss
160end;
161procedure test10; assembler; nostackframe;
162asm
163  seges
164end;
165procedure test11; assembler; nostackframe;
166asm
167  segfs
168end;
169procedure test12; assembler; nostackframe;
170asm
171  seggs
172end;
173procedure test13; assembler; nostackframe;
174asm
175  segcs lodsb
176end;
177procedure test14; assembler; nostackframe;
178asm
179  segds lodsb
180end;
181procedure test15; assembler; nostackframe;
182asm
183  segss lodsb
184end;
185procedure test16; assembler; nostackframe;
186asm
187  seges lodsb
188end;
189procedure test17; assembler; nostackframe;
190asm
191  segfs lodsb
192end;
193procedure test18; assembler; nostackframe;
194asm
195  seggs lodsb
196end;
197procedure test19; assembler; nostackframe;
198asm
199  rep; db $66; movsw
200end;
201
202procedure Error;
203begin
204  Writeln('Error!');
205  Halt(1);
206end;
207
208{$ifdef cpui8086}
209{ This version works in all i8086 memory models }
210function CompareCode(cp: CodePointer; dp: Pointer; sz: SizeInt): Boolean;
211var
212  I: SizeInt;
213begin
214  for I := 0 to sz - 1 do
215    if Mem[Seg(cp^):Ofs(cp^) + I] <> Mem[Seg(dp^):Ofs(dp^) + I] then
216    begin
217      CompareCode := False;
218      exit;
219    end;
220  CompareCode := True;
221end;
222{$else cpui8086}
223function CompareCode(cp: CodePointer; dp: Pointer; sz: SizeInt): Boolean;
224begin
225  CompareCode := CompareByte(cp^, dp^, sz) = 0;
226end;
227{$endif}
228
229begin
230  if not CompareCode(CodePointer(@test1), @expect1, SizeOf(expect1)) then
231    Error;
232  if not CompareCode(CodePointer(@test2), @expect2, SizeOf(expect2)) then
233    Error;
234  if not CompareCode(CodePointer(@test3), @expect3, SizeOf(expect3)) then
235    Error;
236  if not CompareCode(CodePointer(@test4), @expect4, SizeOf(expect4)) then
237    Error;
238  if not CompareCode(CodePointer(@test5), @expect5, SizeOf(expect5)) then
239    Error;
240  if not CompareCode(CodePointer(@test6), @expect6, SizeOf(expect6)) then
241    Error;
242  if not CompareCode(CodePointer(@test7), @expect7, SizeOf(expect7)) then
243    Error;
244  if not CompareCode(CodePointer(@test8), @expect8, SizeOf(expect8)) then
245    Error;
246  if not CompareCode(CodePointer(@test9), @expect9, SizeOf(expect9)) then
247    Error;
248  if not CompareCode(CodePointer(@test10), @expect10, SizeOf(expect10)) then
249    Error;
250  if not CompareCode(CodePointer(@test11), @expect11, SizeOf(expect11)) then
251    Error;
252  if not CompareCode(CodePointer(@test12), @expect12, SizeOf(expect12)) then
253    Error;
254  if not CompareCode(CodePointer(@test13), @expect13, SizeOf(expect13)) then
255    Error;
256  if not CompareCode(CodePointer(@test14), @expect14, SizeOf(expect14)) then
257    Error;
258  if not CompareCode(CodePointer(@test15), @expect15, SizeOf(expect15)) then
259    Error;
260  if not CompareCode(CodePointer(@test16), @expect16, SizeOf(expect16)) then
261    Error;
262  if not CompareCode(CodePointer(@test17), @expect17, SizeOf(expect17)) then
263    Error;
264  if not CompareCode(CodePointer(@test18), @expect18, SizeOf(expect18)) then
265    Error;
266  if not CompareCode(CodePointer(@test19), @expect19, SizeOf(expect19)) then
267    Error;
268  Writeln('Ok!')
269end.
270