Press enter to see results or esc to cancel.

System Function Random

This procedure processes system function Random.

Procedure Func_Random; Far;
begin
  If CheckAndGetNextToken (Token_LeftParenthesis) then
    begin
      Expression^.ExpectIntegerExpression;
      ExpectTokenAndGetNext (Token_RightParenthesis);
      Expression^.CheckOrdinalRange (Ptr (SystemUnitSegment, Word_TypeOffset));
      Expression^.PushExpression;
      Expression^.Calculate;
      GenerateInstruction_CALL_FAR (SysProc_RandInt);
      With Expression^ do
        begin
          Expression^.EndIntermediateCodeSubroutine;
          Location := elRegister;
          DataType := [itUnsigned, it16Bit];
          UsedRegisters := [urSP, urDX, urAX];
          LocationData.Register := rDX_AX;
          TypeDefPtr := Ptr (SystemUnitSegment, LongInt_TypeOffset);
        end;
      Exit;
    end;
  Case Instructions80x87 in StatementCompilerSwitches of
    True: begin
            GenerateInstruction_CALL_FAR (SysProc_RandFloat);
            With Expression^ do
              begin
                Expression^.EndIntermediateCodeSubroutine;
                Location := elStackFrame;
                DataType := [itUnsigned];
                UsedRegisters := [urSP, urDX, urAX];
                TypeDefPtr := Ptr (SystemUnitSegment, Extended_TypeOffset);
              end;
          end;
    False: begin
             GenerateInstruction_CALL_FAR (SysProc_RandReal);
             With Expression^ do
               begin
                 Expression^.EndIntermediateCodeSubroutine;
                 Location := elRegister;
                 DataType := [it16Bit];
                 UsedRegisters := [urSP, urDX, urAX];
                 TypeDefPtr := Ptr (SystemUnitSegment, Real_TypeOffset);
               end;
            end;
  end;
end;