home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol021 / random.src < prev    next >
Encoding:
Text File  |  1984-04-29  |  3.0 KB  |  181 lines

  1. ;==================================================
  2. ;  PROGRAM TITLE:    Random Number Generator
  3. ;  WRITTEN BY:        Raymond E. Penley
  4. ;  DATE WRITTEN:    27 June 1980
  5. ;
  6. ;  WRITTEN FOR:        Pascal/Z Users Group
  7. ;
  8. ;  SUMMARY:
  9. ;    Implements a Fibonacci series Random number generator.
  10. ;     RANDOM will return numbers from 0 to x
  11. ;
  12. ;         Call as              Returns
  13. ;         -------            ------------
  14. ;         real := RANDOM(10);        0.0 to 10.0
  15. ;         real := RANDOM(112);    0.0 to 112.0
  16. ;          I := TRUNC(RANDOM(10));      0 to 10
  17. ;
  18. ; **
  19. ;   Add these lines to your PASCAL source program:
  20. ;
  21. ;     Procedure SEEDRAND; EXTERNAL;
  22. ;     Functin RANDOM(X: Integer): REAL; external;
  23. ;
  24. ;   Also within the body of the main program
  25. ;   but BEFORE calling RANDOM(X);
  26. ;       SEEDRAND;
  27. ;
  28. ;*** What would happen if you did not call SEEDRAND ? ***
  29. ;===============================================
  30. ;
  31. ; PROCEDURE SEEDRAND;
  32. ; (* INITIAL VALUES FOR SEED1 AND SEED2 ARE HERE  *)
  33. ;
  34.      NAME RANDOM
  35.      ENTRY SEEDRAND,RANDOM
  36. ;
  37. SEEDRAND:
  38.     ENTR    D,2,0
  39. ;    SEED1 := 10946;
  40.     MVI    0(IY),42
  41.     MVI    -1(IY),194
  42. ;    SEED2 := 17711
  43. ; END;
  44.     MVI    -2(IY),69
  45.     MVI    -3(IY),47
  46.     EXIT    D,0
  47. ;
  48. ;
  49. ;
  50. ; Function Random(x: integer): real;
  51. ; (*
  52. ; GLOBAL
  53. ;   SEED1, SEED2 : INTEGER        *)
  54. ; CONST
  55. ;   factor = Maxint;
  56. ;   HALFINT = 16383; (* 1/2 OF MAXINT *)
  57. ; VAR
  58. ;   x1 : real;
  59. ;   temp1, temp2, HALF_ADDER : INTEGER;
  60.  
  61. RANDOM:
  62.     ENTR    D,2,10
  63. ; (* Take 1/2 of the seeds for the comparison test *)
  64. ;   temp1 := SEED1 DIV 2;
  65.     MOV    L,-1(IY)
  66.     MOV    H,0(IY)
  67.     LXI    D,2
  68.     DIVD    D,0
  69.     MOV    -6(IX),H
  70.     MOV    -7(IX),L
  71. ;   temp2 := SEED2 DIV 2;
  72.     MOV    L,-3(IY)
  73.     MOV    H,-2(IY)
  74.     LXI    D,2
  75.     DIVD    D,0
  76.     MOV    -8(IX),H
  77.     MOV    -9(IX),L
  78. ;   IF (temp1+temp2) >= HALFINT then{the number is too big -}
  79.     MOV    L,-7(IX)
  80.     MOV    H,-6(IX)
  81.     MOV    E,-9(IX)
  82.     MOV    D,-8(IX)
  83.     DADD    D,0
  84.     LXI    D,16383
  85.     GE    D,0
  86. ;     { scale it down }
  87. ;     HALF_ADDER := temp1 + temp2 - HALFINT
  88.     JNC    L177
  89.     MOV    L,-7(IX)
  90.     MOV    H,-6(IX)
  91.     MOV    E,-9(IX)
  92.     MOV    D,-8(IX)
  93.     DADD    D,0
  94. ;   ELSE
  95.     LXI    D,-16383
  96.     DADD    D,0
  97.     MOV    -4(IX),H
  98.     MOV    -5(IX),L
  99. ;     HALF_ADDER := temp1 + temp2;
  100.     JMP    L197
  101. L177
  102.     MOV    L,-7(IX)
  103.     MOV    H,-6(IX)
  104.     MOV    E,-9(IX)
  105.     MOV    D,-8(IX)
  106.     DADD    D,0
  107.     MOV    -4(IX),H
  108.     MOV    -5(IX),L
  109. L197
  110. ;   SEED1 := SEED2;
  111.     MOV    L,-3(IY)
  112.     MOV    H,-2(IY)
  113.     MOV    0(IY),H
  114.     MOV    -1(IY),L
  115. ;   (* Restore from previous DIVision *)
  116. ;   SEED2 := HALF_ADDER * 2;
  117.     MOV    L,-5(IX)
  118.     MOV    H,-4(IX)
  119.     DADD    C
  120.     MOV    -2(IY),H
  121.     MOV    -3(IY),L
  122. ;   (*---Convert X to real and divide by factor---*)
  123. ;   x1 := ((X*1.0)/factor);
  124.     MOV    L,8(IX)
  125.     MOV    H,9(IX)
  126.     PUSH    H
  127.     LXI    H,320
  128.     MOV    D,A
  129.     MOV    E,A
  130.     PUSH    H
  131.     PUSH    D
  132.     CVTF    C
  133.     MULT    D,-4
  134.     CVTF    A,32767
  135.     FDVD    D,-4
  136.     LXI    H,3
  137.     DADD    S
  138.     XCHG
  139.     PUSH    IX
  140.     POP    H
  141.     XCHG
  142.     LXI    B,4
  143.     LDDR
  144.     POP    H
  145.     POP    H
  146. ;   (*---Return random number scaled by factor---*)
  147. ;   RANDOM := ( SEED2 * x1 );
  148.     MOV    L,-3(IY)
  149.     MOV    H,-2(IY)
  150.     PUSH    H
  151.     LXI    H,-4
  152.     DADD    S
  153.     SPHL
  154.     XCHG
  155.     PUSH    IX
  156.     POP    H
  157.     DCX    H
  158.     DCX    H
  159.     DCX    H
  160.     LXI    B,4
  161.     LDIR
  162.     CVTF    C
  163.     MULT    D,-4
  164.     LXI    H,3
  165.     DADD    S
  166.     XCHG
  167.     PUSH    IX
  168.     POP    H
  169.     LXI    B,13
  170.     DADD    B
  171.     XCHG
  172.     LXI    B,4
  173.     LDDR
  174.     POP    H
  175.     POP    H
  176. ; End{ of RANDOM(X) };
  177.     EXIT    D,2
  178.