home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / source / dcassem.lha / No.7 < prev    next >
Text File  |  1988-05-14  |  3KB  |  122 lines

  1.         CODE
  2.  
  3.         NOLIST
  4.         INCLUDE    "exec/types.i"
  5.         INCLUDE "globals.i"
  6.         LIST
  7.  
  8.         XDEF    RandomSeed,GetRandomSeed,Random
  9.  
  10. ;=============================================================================
  11. ; NAME
  12. ;    RandomSeed - seed random number generator
  13. ;
  14. ; SYSNOPSIS
  15. ;    RandomSeed( SeedValue1, SeedValue2 )
  16. ;             D0          D1
  17. ;
  18. ; FUNCTION
  19. ;    Seeds the random number generator
  20. ;
  21. ; INPUTS
  22. ;    SeedValue1 - a longword containing any value you like
  23. ;    SeedValue2 - a longword containing any value you like
  24. ;
  25. ; RESULT
  26. ;    Random number generator is initialised
  27. ;
  28. ; BUGS
  29. ;    would be tough to get bugs in this routine !!
  30. ;
  31. ; SEE ALSO
  32. ;
  33. ;============================================================================
  34. RandomSeed    movem.l    d0/d1,RND(a5)
  35.         rts
  36.  
  37. ;=============================================================================
  38. ; NAME
  39. ;    GetRandomSeed - fetch current value in random number generator
  40. ;
  41. ; SYSNOPSIS
  42. ;    RandomSeed = GetRandomSeed()
  43. ;    D0/D1
  44. ;
  45. ; FUNCTION
  46. ;    returns current value for later re-seeding to obtain the same sequence
  47. ;
  48. ; INPUTS
  49. ;    none
  50. ;
  51. ; RESULT
  52. ;    RandomSeed - a DOUBLE random seed value
  53. ;
  54. ; BUGS
  55. ;    you gotta be kidding!
  56. ;
  57. ; SEE ALSO
  58. ;
  59. ;============================================================================
  60. GetRandomSeed    movem.l    RND(a5),d0/d1
  61.         rts
  62.  
  63. ;=============================================================================
  64. ; NAME
  65. ;    Random - returns a random integer in the specified range
  66. ;
  67. ; SYSNOPSIS
  68. ;    RndNum = Random( UpperLimit )
  69. ;      D0          D0
  70. ;
  71. ; FUNCTION
  72. ;    returns a random integer in the range 0 to UpperLimit-1
  73. ;
  74. ; INPUTS
  75. ;     UpperLimit - a long(or short will do) in the range 0-65535
  76. ;
  77. ; RESULT
  78. ;    a random integer is returned to you, real quick!
  79. ;
  80. ; BUGS/LIMITATIONS
  81. ;    range was limited to 0-65535 to avoid problems with the DIVU instruction
  82. ;    which can return real wierd values if the result is larger than 16 bits.
  83. ;
  84. ; SEE ALSO
  85. ;
  86. ;============================================================================
  87. Random        move.w    d0,-(sp)    save range
  88.         beq.s    10$        range of 0 returns 0 always
  89.         bsr.s    LongRnd        get a longword random number
  90.         clr.w    d0        use upper word (it's most random)
  91.         swap    d0
  92.         divu.w    (sp),d0        divide by range...
  93.         clr.w    d0
  94.         swap    d0        ...and use remainder for the result
  95. 10$        addq.l    #2,sp        scrap range on stack
  96.         rts
  97.  
  98. ; this is the main random number generation routine. Not user callable
  99.  
  100. LongRnd        movem.l    d2-d3,-(sp)    
  101.         movem.l    RND(a5),d0/d1    D0=LSB's, D1=MSB's of random number
  102.         andi.b    #$0e,d0        ensure upper 59 bits are an...
  103.         ori.b    #$20,d0        ...odd binary number
  104.         move.l    d0,d2
  105.         move.l    d1,d3
  106.         add.l    d2,d2        accounts for 1 of 17 left shifts
  107.         addx.l    d3,d3        [D2/D3] = RND*2
  108.         add.l    d2,d0
  109.         addx.l    d3,d1        [D0/D1] = RND*3
  110.         swap    d3        shift [D2/D3] additional 16 times
  111.         swap    d2
  112.         move.w    d2,d3
  113.         clr.w    d2
  114.         add.l    d2,d0        add to [D0/D1]
  115.         addx.l    d3,d1
  116.         movem.l    d0/d1,RND(a5)    save for next time through
  117.         move.l    d1,d0        most random part to D0
  118.         movem.l    (sp)+,d2-d3
  119.         rts
  120.  
  121.         END
  122.