home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol045 / rrnd.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  1.1 KB  |  63 lines

  1.     .TITLE    RND -    RANDOM NUMBER GENERATOR
  2.     .SBTTL    STOLEN FROM FORTRAN-IV-PLUS RUNTIME SYSTEM
  3.     .ENABL    AMA
  4. ;
  5.     .GLOBL    INIRND,RND
  6. ;
  7. ;THIS PACKAGE CONSISTS OF TWO SUBROUTINES:
  8. ;
  9. ;INIRND-    INIT RANDOM NUMBER GENERATOR
  10. ;RND-        GENERATE RANDOM INTEGER
  11. ;
  12. ;CALLING SEQUENCES-
  13. ;
  14. ;    CALL INIRND(SEED1,SEED2)
  15. ;
  16. ;    N=RND(MAX)
  17. ;
  18. INIRND:    MOV    @2(R5),LONUM    ;PICK UP SEEDS.
  19.     MOV    @4(R5),HINUM
  20.     RTS    PC
  21. ;
  22. LONUM:    .WORD    0
  23. HINUM:    .WORD    0
  24. ;
  25. RND:    MOV    LONUM,R3    ;GET LOW SEED.
  26.     BNE    10$        ;IF NE, OK.
  27.     MOV    HINUM,R2    ;GET HIGH SEED.
  28.     BNE    20$        ;IF NE, OK.
  29.     MOV    #3,R3        ;BOTH ZERO, RESEED WITH 2**16+3.
  30.     MOV    #1,R2
  31.     BR    20$
  32. ;
  33. 10$:    MOV    HINUM,R2    ;SEED NOW IN R2:R3.
  34. 20$:    MOV    R3,R0        ;MULTIPLY BY 2**16 (LEFT SHIFT 16).
  35.     CLR    R1
  36.     ADD    R3,R1        ;+3 (ADD IN 3 TIMES).
  37.     ADC    R0
  38.     ADD    R2,R0
  39.     ADD    R3,R1
  40.     ADC    R0
  41.     ADD    R2,R0
  42.     ADD    R3,R1
  43.     ADC    R0
  44.     ADD    R2,R0
  45.     MOV    R1,LONUM    ;SAVE RESULTS.
  46.     MOV    R0,HINUM
  47. ;
  48.     MOV    R0,R1
  49.     CLR    R0
  50.     MOV    #16.,R2        ;PREPARE FOR DIVIDE.
  51.     ASL    R1
  52. 30$:    ROL    R0        ;ROTATE DIVIDEND.
  53.     CMP    @2(R5),R0    ;SUBTRACT WORK?
  54.     BHI    40$        ;IF HI, NO.
  55.     SUB    @2(R5),R0
  56.     SEC
  57. 40$:    ROL    R1        ;ONWARD.
  58.     DEC    R2
  59.     BNE    30$
  60.     RTS    PC
  61. ;
  62.     .END
  63.