fpc/tests/test/tasm16.pp
2018-02-01 20:00:43 +00:00

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.