home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / PROGRAM / DIVERSEN / DOS32V3B / LIB / RANDOM.ASM < prev    next >
Assembly Source File  |  1995-02-15  |  2KB  |  76 lines

  1. ;                  library file for DOS32 32bit DOS extender
  2. ;        Writen by Adam Seychell
  3.  
  4.  
  5. .386
  6. .Model flat, pascal
  7.  
  8.     .CODE
  9.  
  10. comment $
  11. ╔═══════════════════════════════════════════════════════════════════════╗
  12. ║ Returns EAX with a random number with CL bits in size.                ║
  13. ║                                                                       ║
  14. ║   The algorithem was from an article in Doctor Dobbs Journal          ║
  15. ║   issue date  MAY 1991                                                ║
  16. ║                                                                       ║
  17. ║  NOTE: the initial random number is taken from the CMOS clock         ║
  18. ╚═══════════════════════════════════════════════════════════════════════╝$
  19. Random PROC USES EBX EDX
  20. Public Random
  21.         xor eax,eax
  22.         cmp eax,random_init
  23.         je Initalize_Random_number
  24. J75:
  25.         mov bl,byte ptr random_init
  26.         and bl,1
  27.  
  28. Gen_bit:    ; make n bit numbers
  29.         shl eax,1
  30.  
  31.     mov edx,Random_init
  32.  
  33.         shr edx,9
  34.         xor bl,dl
  35.  
  36.         shr edx,5
  37.         xor bl,dl
  38.  
  39.         bt ebx,1
  40.     rcr Random_init,1
  41.         setc bl
  42.     or  al,bl
  43.  
  44.     dec cl
  45.         jnz Gen_bit
  46.     ret
  47. align 4
  48.  
  49. Initalize_Random_number:            ; Get inital random number from CMOS time
  50.  
  51.         mov     al,0                    ; Get seconds
  52.         out     70h,al
  53.         in      al,71h
  54.         shl     eax,8
  55.         mov     al,2                    ; Get minute
  56.         out     70h,al
  57.         in      al,71h
  58.         shl     eax,8
  59.         push    es
  60.         xor     ax,ax                       ; GET DOS32 selector values
  61.         int     31h
  62.         shr     ebx,16
  63.         mov     es,bx
  64.         xor     eax,es:[046Ch]             ; through in number of ticks
  65.         pop     es
  66.         not     eax
  67.         mov     Random_init,eax
  68.         jmp J75
  69.  
  70.  
  71. Random_init     dd 0
  72. ;────────────────────────────────────────────────────────────────────────────
  73. Random  Endp
  74.  
  75.         End
  76.