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

    {
    SEAN PALMER

    I'm using TP. Here are the fixed division routines I'm currently using
    (they are, as you can see, quite specialized)

    I had to abandon the original fixed division routines because I didn't
    know how to translate the 386-specific instructions using DB. (MOVSX,
    SHLD, etc)
    }

    type
      fixed = record
        f : word;
        i : integer;
      end;

      shortFixed = record
        f : byte;
        i : shortint;
      end;

    { this one divides a fixed by a fixed, result is fixed needs 386 }

    function fixedDiv(d1, d2 : longint) : longint; assembler;
    asm
      db $66; xor dx, dx
      mov cx, word ptr D1 + 2
      or cx, cx
      jns @S
      db $66; dec dx
     @S:
      mov dx, cx
      mov ax, word ptr D1
      db $66; shl ax, 16
      db $66; idiv word ptr d2
      db $66; mov dx, ax
      db $66; shr dx, 16
    end;

    { this one divides a longint by a longint, result is fixed needs 386 }

    function div2Fixed(d1, d2 : longint) : longint; assembler;
    asm
      db $66; xor dx, dx
      db $66; mov ax, word ptr d1
      db $66; shl ax, 16
      jns @S;
      db $66; dec dx
     @S:
      db $66; idiv word ptr d2
      db $66; mov dx, ax
      db $66; shr dx, 16
    end;

    { this one divides an integer by and integer, result is shortFixed }

    function divfix(d1, d2 : integer) : integer; assembler;
    asm
      mov al, byte
      ptr d1 + 1
      cbw
      mov dx, ax
      xor al, al
      mov ah, byte ptr d1
      idiv d2
    end;

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