[Back to HARDWARE SWAG index]  [Back to Main SWAG index]  [Original]

{
From: terjem@hda.hydro.com (Terje Mathisen)

>I need the source code to (in TP and/or Assembly) setup a processor
>independant delay.  The one I have is way faster on a 486 than on a 386.
>I need something that tests the machines speed when a unit is initialized
>and saves a number to a variable and then a delay procedure that uses
>that number.

Well, the Delay() procedure in the Crt unit is designed to do exactly this,
but if you cannot use Crt, try this replacement which I wrote almost
10 years ago, and later converted to a Unit.
}

{$R-,S-}
Unit Delays;

INTERFACE

CONST loop_count : WORD = 250;

PROCEDURE Delay(ms : WORD);

IMPLEMENTATION

PROCEDURE Delay(ms : Word);
BEGIN
Inline(
  $8B/$76/<MS            {    mov si,[bp<ms]}
  /$09/$F6               {    or si,si}
  /$74/$09               {    jz d2}
  /$8B/$0E/>LOOP_COUNT   {d0: mov cx,[>loop_count]}
  /$E2/$FE               {d1: loop d1}
  /$4E                   {    dec si}
  /$75/$F7               {    jnz d0}
);                       {d2:}
END;

BEGIN
InLine(
  $B8/$40/$00            {    mov ax,$40}
  /$8E/$C0               {    mov es,ax}
  /$BB/$6C/$00           {    mov bx,$6C}
  /$26/$8B/$37           {d3: es: mov si,[bx]}
  /$31/$FF               {    xor di,di}
  /$26/$3B/$37           {d4: es: cmp si,[bx]}
  /$74/$FB               {    je d4}
  /$26/$8B/$37           {    es: mov si,[bx]}
  /$8B/$0E/>LOOP_COUNT   {d5: mov cx,[>loop_count]}
  /$E2/$FE               {d6: loop d6}
  /$47                   {    inc di}
  /$26/$3B/$37           {    es: cmp si,[bx]}
  /$74/$F4               {    je d5}
  /$A1/>LOOP_COUNT       {    mov ax,[>loop_count]}
  /$F7/$E7               {    mul di}
  /$B9/$37/$00           {    mov cx,55}
  /$F7/$F1               {    div cx}
  /$A3/>LOOP_COUNT       {    mov [>loop_count],ax}
  /$81/$FF/$1E/$00       {    cmp di,30}
  /$72/$D4               {    jb d3}
);
END.


[Back to HARDWARE SWAG index]  [Back to Main SWAG index]  [Original]