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

    unit TP7Rand;
     interface
    { Changed name from random to randomnbr so can do a compare }
     function RandomNbr(Max: Integer): Integer;

     implementation
     const
      ConstM31 = Longint(-31);  { Scaling constant}
      Factor: Word = $8405;     { Multiplication factor}

    function NextRand: Longint; assembler;
     { Compute the 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]
      SHL  CX,1
      SHL  CX,1
      SHL  CX,1
      ADD  CH,CL
      ADD  DX,CX
      ADD  DX,BX
      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 RandomNbr(Max: Integer): Integer; assembler;
    ASM
      CALL  NextRand        { TP6 was }
      MOV   CX,DX           {   xor  ax,ax }
      MUL   Max.Word[0]     {   mov  bx,Max.Word[0] }
      MOV   AX,CX           {   or   bx,bx }
      MOV   CX,DX           {   je   @1    }
      MUL   Max.Word[0]     {   xchg ax,dx }
      ADD   AX,CX           {   div  bx    }
      ADC   DX,0            {   xchg ax,dx }
      MOV   AX,DX           { @1:          }
    end;

    end.

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