Contributor: LEE BARKER


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.