Почему процедура Delay() на разных машинах генерирует разные временные задержки?

Модуль CRT криво написан. Если достаточна точность в 1 тик (1/18 доля секунды), то можно использовать такую процедуру:

procedure Delay(x:longint);
{пауза на Х тиков}
var
  l:longint;
 
begin
  l := MemL[Seg0040:$6c];
  while MemL[Seg0040:$6c] < l+x do; {задержка на X тиков}
end;

Если нужно точнее, то надо читать регистры таймера.
Например, так:

procedure RTCDelay(Wait:LongInt); assembler;
{Ожидание на Wait микросекунд }
asm
     mov ah,86h
     mov dx,word ptr Wait
     mov cx,word ptr Wait+2
     int 15h
end;

Wait - в *микро*секундах, но разрешение все равно с точностью примерно до 976 микросекунд (примерно 1 миллисекунда), т.е. меньше 1024 ставить просто бессмысленно.