|
@@ -2,6 +2,22 @@
|
|
|
|
|
|
program tasm23;
|
|
|
|
|
|
+{$S-}
|
|
|
+
|
|
|
+{$IFNDEF FPC}
|
|
|
+type
|
|
|
+ CodePointer = Pointer;
|
|
|
+{$ENDIF FPC}
|
|
|
+
|
|
|
+const
|
|
|
+{$IFDEF FPC_MM_HUGE}
|
|
|
+ hugeadd = 7;
|
|
|
+{$ELSE FPC_MM_HUGE}
|
|
|
+ hugeadd = 0;
|
|
|
+{$ENDIF FPC_MM_HUGE}
|
|
|
+
|
|
|
+const
|
|
|
+ t_size = 13 + hugeadd;
|
|
|
procedure t; assembler;
|
|
|
asm
|
|
|
mov ax, [bx[5]][di][54][-17][45][4] { mov ax, [bx+di+5Bh] }
|
|
@@ -9,7 +25,16 @@ asm
|
|
|
mov ax, [5[7]] { mov ax, [000Ch] }
|
|
|
mov ax, [5+[7]] { mov ax, [000Ch] }
|
|
|
end;
|
|
|
+procedure t_verify; assembler;
|
|
|
+asm
|
|
|
+ mov ax, [bx+di+5Bh] { mov ax, [bx[5]][di][54][-17][45][4] }
|
|
|
+ mov ax, [bx+di+5Bh] { mov ax, [[bx+5]+[di+54]+[-17]+[45]+[4]] }
|
|
|
+ mov ax, [000Ch] { mov ax, [5[7]] }
|
|
|
+ mov ax, [000Ch] { mov ax, [5+[7]] }
|
|
|
+end;
|
|
|
|
|
|
+const
|
|
|
+ t2_size = 33 + hugeadd;
|
|
|
procedure t2; assembler;
|
|
|
var
|
|
|
locl: word;
|
|
@@ -21,6 +46,52 @@ asm
|
|
|
mov ax, cs:locl[5] { mov ax, cs:[bp+03] }
|
|
|
mov ax, cs:5[locl] { mov ax, cs:[bp+03] }
|
|
|
end;
|
|
|
+procedure t2_verify; assembler;
|
|
|
+var
|
|
|
+ locl: word;
|
|
|
+asm
|
|
|
+ mov ax, [bp-02] { mov ax, locl }
|
|
|
+ mov ax, cs:[bp-02] { mov ax, cs:locl }
|
|
|
+ mov ax, cs:[bp-02] { mov ax, [cs:locl] }
|
|
|
+ mov ax, cs:[bp-02] { mov ax, [cs:[locl]] }
|
|
|
+ mov ax, cs:[bp+03] { mov ax, cs:locl[5] }
|
|
|
+ mov ax, cs:[bp+03] { mov ax, cs:5[locl] }
|
|
|
+end;
|
|
|
|
|
|
+{ This version works in all i8086 memory models }
|
|
|
+function CompareCode(cp, cp2: CodePointer; sz: Integer): Boolean;
|
|
|
+var
|
|
|
+ I: Integer;
|
|
|
+ lastbyte: Byte;
|
|
|
+begin
|
|
|
+ for I := 0 to sz - 1 do
|
|
|
+ if Mem[Seg(cp^):Ofs(cp^) + I] <> Mem[Seg(cp2^):Ofs(cp2^) + I] then
|
|
|
+ begin
|
|
|
+ Writeln(I, ' ', Mem[Seg(cp^):Ofs(cp^) + I], ' ', Mem[Seg(cp2^):Ofs(cp2^) + I]);
|
|
|
+ CompareCode := False;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ { check also that the last byte is a retn or retf instruction }
|
|
|
+ lastbyte:=Mem[Seg(cp^):Ofs(cp^)+sz-1];
|
|
|
+ if (lastbyte<>$C3) and (lastbyte<>$CB) then
|
|
|
+ begin
|
|
|
+ CompareCode := False;
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ CompareCode := True;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure Error(N: Integer);
|
|
|
begin
|
|
|
+ Writeln('Error! ', N);
|
|
|
+ Halt(1);
|
|
|
+end;
|
|
|
+
|
|
|
+begin
|
|
|
+ if not CompareCode(CodePointer(@t), CodePointer(@t_verify), t_size) then
|
|
|
+ Error(1);
|
|
|
+ if not CompareCode(CodePointer(@t2), CodePointer(@t2_verify), t2_size) then
|
|
|
+ Error(2);
|
|
|
+
|
|
|
+ Writeln('Ok!');
|
|
|
end.
|