瀏覽代碼

* updated test tasm18.pp, so it is now runnable and checks the generated code

git-svn-id: trunk@38188 -
nickysn 7 年之前
父節點
當前提交
d5845a2d2a
共有 1 個文件被更改,包括 62 次插入3 次删除
  1. 62 3
      tests/test/tasm18.pp

+ 62 - 3
tests/test/tasm18.pp

@@ -1,7 +1,11 @@
-{ %NORUN }
 { %CPU=i8086 }
 program tasm18;
 
+{$ifndef FPC}
+type
+  CodePointer = Pointer;
+{$endif FPC}
+
 const
   cval = 1;
 
@@ -15,7 +19,38 @@ type
     bb1, bb2: byte;
   end;
 
-procedure x; assembler;
+const
+  expect1: array [0..$65] of byte = (
+    $F7,$05,$01,$00,      { TEST    WORD PTR [DI],0001    }
+    $F6,$05,$01,          { TEST    BYTE PTR [DI],01      }
+    $F7,$45,$01,$01,$00,  { TEST    WORD PTR [DI+01],0001 }
+    $F6,$45,$03,$01,      { TEST    BYTE PTR [DI+03],01   }
+    $F7,$45,$FF,$01,$00,  { TEST    WORD PTR [DI-01],0001 }
+    $F6,$45,$FD,$01,      { TEST    BYTE PTR [DI-03],01   }
+    $F7,$45,$04,$01,$00,  { TEST    WORD PTR [DI+04],0001 }
+    $F6,$45,$04,$01,      { TEST    BYTE PTR [DI+04],01   }
+
+    $F6,$05,$01,          { TEST    BYTE PTR [DI],01      }
+    $F6,$05,$01,          { TEST    BYTE PTR [DI],01      }
+    $F6,$45,$01,$01,      { TEST    BYTE PTR [DI+01],01   }
+    $F6,$45,$03,$01,      { TEST    BYTE PTR [DI+03],01   }
+    $F6,$45,$FF,$01,      { TEST    BYTE PTR [DI-01],01   }
+    $F6,$45,$FD,$01,      { TEST    BYTE PTR [DI-03],01   }
+    $F6,$45,$04,$01,      { TEST    BYTE PTR [DI+04],01   }
+    $F6,$45,$04,$01,      { TEST    BYTE PTR [DI+04],01   }
+
+    $F7,$05,$01,$00,      { TEST    WORD PTR [DI],0001    }
+    $F7,$05,$01,$00,      { TEST    WORD PTR [DI],0001    }
+    $F7,$45,$01,$01,$00,  { TEST    WORD PTR [DI+01],0001 }
+    $F7,$45,$03,$01,$00,  { TEST    WORD PTR [DI+03],0001 }
+    $F7,$45,$FF,$01,$00,  { TEST    WORD PTR [DI-01],0001 }
+    $F7,$45,$FD,$01,$00,  { TEST    WORD PTR [DI-03],0001 }
+    $F7,$45,$04,$01,$00,  { TEST    WORD PTR [DI+04],0001 }
+    $F7,$45,$04,$01,$00   { TEST    WORD PTR [DI+04],0001 }
+  );
+
+
+procedure test1; assembler; {$IFDEF FPC_MM_HUGE}nostackframe;{$ENDIF}
 asm
   test [di+foo2], cval                   { test word ptr [di], 1   }
   test byte ptr [di+foo], cval           { test byte ptr [di], 1   }
@@ -45,6 +80,30 @@ asm
   test word ptr [di+foo.w+foo.b2], cval  { test word ptr [di+4], 1 }
 end;
 
+procedure Error;
 begin
-  x;
+  Writeln('Error!');
+  Halt(1);
+end;
+
+{ This version works in all i8086 memory models }
+function CompareCode(cp: CodePointer; dp: Pointer; sz: Integer): Boolean;
+var
+  I: Integer;
+begin
+  for I := 0 to sz - 1 do
+    if Mem[Seg(cp^):Ofs(cp^) + I] <> Mem[Seg(dp^):Ofs(dp^) + I] then
+    begin
+      Writeln(I, ' ', Mem[Seg(cp^):Ofs(cp^) + I], ' ', Mem[Seg(dp^):Ofs(dp^) + I]);
+      CompareCode := False;
+      exit;
+    end;
+  CompareCode := True;
+end;
+
+begin
+  if not CompareCode(CodePointer(@test1), @expect1, SizeOf(expect1)) then
+    Error;
+
+  Writeln('Ok!');
 end.