mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 22:27:57 +02:00
270 lines
6.4 KiB
ObjectPascal
270 lines
6.4 KiB
ObjectPascal
{ %CPU=i8086,i386,x86_64 }
|
|
|
|
program tasm16;
|
|
|
|
{$ifdef cpui8086}
|
|
{$asmcpu 80386}
|
|
{$endif cpui8086}
|
|
|
|
const
|
|
{$ifdef cpui8086}
|
|
expect1: array [0..3] of byte = (
|
|
$2E, // segcs
|
|
$67,$66, // db $67,$66
|
|
$AD // lodsw
|
|
);
|
|
expect2: array [0..3] of byte = (
|
|
$3E, // segds
|
|
$67,$66, // db $67,$66
|
|
$AD // lodsw
|
|
);
|
|
expect3: array [0..3] of byte = (
|
|
$36, // segss
|
|
$67,$66, // db $67,$66
|
|
$AD // lodsw
|
|
);
|
|
expect4: array [0..3] of byte = (
|
|
$26, // seges
|
|
$67,$66, // db $67,$66
|
|
$AD // lodsw
|
|
);
|
|
expect5: array [0..3] of byte = (
|
|
$64, // segfs
|
|
$67,$66, // db $67,$66
|
|
$AD // lodsw
|
|
);
|
|
expect6: array [0..3] of byte = (
|
|
$65, // seggs
|
|
$67,$66, // db $67,$66
|
|
$AD // lodsw
|
|
);
|
|
{$else}
|
|
expect1: array [0..4] of byte = (
|
|
$2E, // segcs
|
|
$67,$66, // db $67,$66
|
|
$66,$AD // lodsw
|
|
);
|
|
expect2: array [0..4] of byte = (
|
|
$3E, // segds
|
|
$67,$66, // db $67,$66
|
|
$66,$AD // lodsw
|
|
);
|
|
expect3: array [0..4] of byte = (
|
|
$36, // segss
|
|
$67,$66, // db $67,$66
|
|
$66,$AD // lodsw
|
|
);
|
|
expect4: array [0..4] of byte = (
|
|
$26, // seges
|
|
$67,$66, // db $67,$66
|
|
$66,$AD // lodsw
|
|
);
|
|
expect5: array [0..4] of byte = (
|
|
$64, // segfs
|
|
$67,$66, // db $67,$66
|
|
$66,$AD // lodsw
|
|
);
|
|
expect6: array [0..4] of byte = (
|
|
$65, // seggs
|
|
$67,$66, // db $67,$66
|
|
$66,$AD // lodsw
|
|
);
|
|
{$endif}
|
|
expect7: array [0..0] of byte = (
|
|
$2E // segcs
|
|
);
|
|
expect8: array [0..0] of byte = (
|
|
$3E // segds
|
|
);
|
|
expect9: array [0..0] of byte = (
|
|
$36 // segss
|
|
);
|
|
expect10: array [0..0] of byte = (
|
|
$26 // seges
|
|
);
|
|
expect11: array [0..0] of byte = (
|
|
$64 // segfs
|
|
);
|
|
expect12: array [0..0] of byte = (
|
|
$65 // seggs
|
|
);
|
|
expect13: array [0..1] of byte = (
|
|
$2E,$AC // segcs lodsb
|
|
);
|
|
expect14: array [0..1] of byte = (
|
|
$3E,$AC // segds lodsb
|
|
);
|
|
expect15: array [0..1] of byte = (
|
|
$36,$AC // segss lodsb
|
|
);
|
|
expect16: array [0..1] of byte = (
|
|
$26,$AC // seges lodsb
|
|
);
|
|
expect17: array [0..1] of byte = (
|
|
$64,$AC // segfs lodsb
|
|
);
|
|
expect18: array [0..1] of byte = (
|
|
$65,$AC // seggs lodsb
|
|
);
|
|
{$ifdef cpui8086}
|
|
expect19: array [0..2] of byte = (
|
|
$F3, // rep
|
|
$66, // db $66
|
|
$A5 // movsw
|
|
);
|
|
{$else}
|
|
expect19: array [0..3] of byte = (
|
|
$F3, // rep
|
|
$66, // db $66
|
|
$66,$A5 // movsw
|
|
);
|
|
{$endif}
|
|
|
|
{$asmmode intel}
|
|
|
|
procedure test1; assembler; nostackframe;
|
|
asm
|
|
segcs; db $67,$66; lodsw
|
|
end;
|
|
procedure test2; assembler; nostackframe;
|
|
asm
|
|
segds; db $67,$66; lodsw
|
|
end;
|
|
procedure test3; assembler; nostackframe;
|
|
asm
|
|
segss; db $67,$66; lodsw
|
|
end;
|
|
procedure test4; assembler; nostackframe;
|
|
asm
|
|
seges; db $67,$66; lodsw
|
|
end;
|
|
procedure test5; assembler; nostackframe;
|
|
asm
|
|
segfs; db $67,$66; lodsw
|
|
end;
|
|
procedure test6; assembler; nostackframe;
|
|
asm
|
|
seggs; db $67,$66; lodsw
|
|
end;
|
|
procedure test7; assembler; nostackframe;
|
|
asm
|
|
segcs
|
|
end;
|
|
procedure test8; assembler; nostackframe;
|
|
asm
|
|
segds
|
|
end;
|
|
procedure test9; assembler; nostackframe;
|
|
asm
|
|
segss
|
|
end;
|
|
procedure test10; assembler; nostackframe;
|
|
asm
|
|
seges
|
|
end;
|
|
procedure test11; assembler; nostackframe;
|
|
asm
|
|
segfs
|
|
end;
|
|
procedure test12; assembler; nostackframe;
|
|
asm
|
|
seggs
|
|
end;
|
|
procedure test13; assembler; nostackframe;
|
|
asm
|
|
segcs lodsb
|
|
end;
|
|
procedure test14; assembler; nostackframe;
|
|
asm
|
|
segds lodsb
|
|
end;
|
|
procedure test15; assembler; nostackframe;
|
|
asm
|
|
segss lodsb
|
|
end;
|
|
procedure test16; assembler; nostackframe;
|
|
asm
|
|
seges lodsb
|
|
end;
|
|
procedure test17; assembler; nostackframe;
|
|
asm
|
|
segfs lodsb
|
|
end;
|
|
procedure test18; assembler; nostackframe;
|
|
asm
|
|
seggs lodsb
|
|
end;
|
|
procedure test19; assembler; nostackframe;
|
|
asm
|
|
rep; db $66; movsw
|
|
end;
|
|
|
|
procedure Error;
|
|
begin
|
|
Writeln('Error!');
|
|
Halt(1);
|
|
end;
|
|
|
|
{$ifdef cpui8086}
|
|
{ This version works in all i8086 memory models }
|
|
function CompareCode(cp: CodePointer; dp: Pointer; sz: SizeInt): Boolean;
|
|
var
|
|
I: SizeInt;
|
|
begin
|
|
for I := 0 to sz - 1 do
|
|
if Mem[Seg(cp^):Ofs(cp^) + I] <> Mem[Seg(dp^):Ofs(dp^) + I] then
|
|
begin
|
|
CompareCode := False;
|
|
exit;
|
|
end;
|
|
CompareCode := True;
|
|
end;
|
|
{$else cpui8086}
|
|
function CompareCode(cp: CodePointer; dp: Pointer; sz: SizeInt): Boolean;
|
|
begin
|
|
CompareCode := CompareByte(cp^, dp^, sz) = 0;
|
|
end;
|
|
{$endif}
|
|
|
|
begin
|
|
if not CompareCode(CodePointer(@test1), @expect1, SizeOf(expect1)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test2), @expect2, SizeOf(expect2)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test3), @expect3, SizeOf(expect3)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test4), @expect4, SizeOf(expect4)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test5), @expect5, SizeOf(expect5)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test6), @expect6, SizeOf(expect6)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test7), @expect7, SizeOf(expect7)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test8), @expect8, SizeOf(expect8)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test9), @expect9, SizeOf(expect9)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test10), @expect10, SizeOf(expect10)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test11), @expect11, SizeOf(expect11)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test12), @expect12, SizeOf(expect12)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test13), @expect13, SizeOf(expect13)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test14), @expect14, SizeOf(expect14)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test15), @expect15, SizeOf(expect15)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test16), @expect16, SizeOf(expect16)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test17), @expect17, SizeOf(expect17)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test18), @expect18, SizeOf(expect18)) then
|
|
Error;
|
|
if not CompareCode(CodePointer(@test19), @expect19, SizeOf(expect19)) then
|
|
Error;
|
|
Writeln('Ok!')
|
|
end.
|