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

    {
    Borland changed the Random() algorithm between TP6 and TP/BP7.  The Unit
    below provides the TP6 Random Function in its Integer flavour.  (The
    Randomize Procedure wasn't changed.)

    { *  Turbo Pascal Runtime Library Version 6.0     * ;
      *  Random Number Generator                      * ;
      *                                               * ;
      *  Copyright (C) 1988,92 Borland International  * }

    Unit TP6Rand;

    Interface

    Function Random(Max: Integer): Integer;

    Implementation

    Const
      { Scaling Constant}
      ConstM31 = LongInt(-31);
      { Multiplication factor}
      Factor: Word = $8405;

    Function NextRand: LongInt; Assembler;
    {
      Compute next random number
      New := 8088405H * Old + 1
      Out  DX:AX = Next random number
    }
    Asm
      MOV  AX,RandSeed.Word[0]
      MOV  BX,RandSeed.Word[2]
      MOV  CX,AX
      MUL  Factor.Word[0]     { New = Old.w0 * 8405H }
      SHL  CX,1               { New.w2 += Old.w0 * 808H }
      SHL  CX,1
      SHL  CX,1
      ADD  CH,CL
      ADD  DX,CX
      ADD  DX,BX              { New.w2 += Old.w2 * 8405H }
      SHL  BX,1
      SHL  BX,1
      ADD  DX,BX
      ADD  DH,BL
      MOV  CL,5
      SHL  BX,CL
      ADD  DH,BL
      ADD  AX,1      { New += 1 }
      ADC  DX,0
      MOV  RandSeed.Word[0],AX
      MOV  RandSeed.Word[2],DX
    end;

    Function Random(Max: Integer): Integer; Assembler;
    Asm
     CALL  NextRand
     xor   AX,AX
     MOV   BX,Max.Word[0]
     or    BX,BX
     JE    @@1
     XCHG  AX,DX
     div   BX
     XCHG  AX,DX
    @@1:
    end;

    end.

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