home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / awk / awk320sr.zip / AWKRAND.ASM < prev    next >
Assembly Source File  |  1991-04-25  |  4KB  |  142 lines

  1. ; long integer random number generator
  2. ;
  3. ;  Copyright (C) 1988, 1989, 1990, 1991 by Rob Duff
  4. ;  All rights reserved
  5. ;
  6.         TITLE   rand
  7.  
  8. _TEXT   SEGMENT  BYTE PUBLIC 'CODE'
  9. _TEXT   ENDS
  10. _DATA   SEGMENT  WORD PUBLIC 'DATA'
  11. _DATA   ENDS
  12. DGROUP  GROUP   _DATA
  13.         ASSUME  CS: _TEXT, DS: DGROUP
  14.  
  15.         PUBLIC  _rexp
  16. _DATA   SEGMENT
  17.         DB      'RAND'
  18. _init   DW      0, 0, 0, 1, 0, 0, 0, 0          ;c
  19. _mult   DW      09F8Dh, 0B276h, 04E35h, 0945Ah  ; a
  20. _seed   DW      1, 0, 0, 0                      ; Xn
  21. _rexp   DW      -31
  22. _real   DW      8 dup (0)                       ; Xn+1
  23. _DATA   ENDS
  24. _TEXT   SEGMENT
  25.  
  26.         PUBLIC  _srandl
  27. _srandl PROC NEAR
  28.         push    bp
  29.         mov     bp, sp
  30.         mov     ax, [bp+4]
  31.         mov     _seed+0, ax
  32.         mov     ax, [bp+6]
  33.         mov     _seed+2, ax
  34.         pop     bp
  35.         ret     
  36.  
  37. _srandl ENDP
  38.  
  39. ; linear congruential method
  40. ;
  41. ; Xn = (aXn-1 + c) mod m
  42. ;
  43. ; m = 0x10000000000000000       m == 2^64
  44. ; a = 0x0945A4E35B2769F8D       a mod 8 == 5
  45. ; c = 0x00000000000000001       c mod 2 == 1
  46. ;
  47.         PUBLIC  _randl
  48. _randl  PROC NEAR
  49.         push    bp
  50.         mov     bp,sp
  51.         push    si
  52.         push    di
  53.         cld
  54.         mov     ax, ds          ; set extra segment
  55.         mov     es, ax
  56.  
  57.         mov     si, OFFSET _init
  58.         mov     di, OFFSET _real
  59.         xor     ax, ax
  60.         mov     cx, 8           ; move "c" to accumulator
  61.     rep movsw
  62.  
  63.         mov     bx, OFFSET _real+6
  64.         mov     si, OFFSET _seed
  65.         mov     di, OFFSET _mult
  66.  
  67.         lodsw                   ; x[0]
  68.         mul     WORD PTR [di]   ; a[0]
  69.         add     [bx+0], ax      ; b[0]
  70.         adc     [bx+2], dx      ;
  71.         adc     [bx+4], cx      ;
  72.         adc     [bx+6], cx      ;
  73.         lodsw                   ; x[1]
  74.         mul     WORD PTR [di]   ; a[0]
  75.         add     [bx+2], ax      ; b[1]
  76.         adc     [bx+4], dx      ;
  77.         adc     [bx+6], cx      ;
  78.         lodsw                   ; x[2]
  79.         mul     WORD PTR [di]   ; a[0]
  80.         add     [bx+4], ax      ; b[2]
  81.         adc     [bx+6], dx      ;
  82.         lodsw                   ; x[3]
  83.         mul     WORD PTR [di]   ; a[0]
  84.         add     [bx+6], ax      ; b[3]
  85.  
  86.         sub     si, 8
  87.         inc     di
  88.         inc     di
  89.  
  90.         lodsw                   ; x[0]
  91.         mul     WORD PTR [di]   ; a[1]
  92.         add     [bx+2], ax      ; b[1]
  93.         adc     [bx+4], dx      ; b[2]
  94.         adc     [bx+6], cx      ; b[3]
  95.         lodsw                   ; x[1]
  96.         mul     WORD PTR [di]   ; a[1]
  97.         add     [bx+4], ax      ; b[2]
  98.         adc     [bx+6], dx      ; b[3]
  99.         lodsw                   ; x[2]
  100.         mul     WORD PTR [di]   ; a[1]
  101.         add     [bx+6], ax      ; b[3]
  102.  
  103.         sub     si, 6
  104.         inc     di
  105.         inc     di
  106.  
  107.         lodsw                   ; x[0]
  108.         mul     WORD PTR [di]   ; a[2]
  109.         add     [bx+4], ax      ; b[2]
  110.         adc     [bx+6], dx      ; b[3]
  111.         lodsw                   ; x[1]
  112.         mul     WORD PTR [di]   ; a[2]
  113.         add     [bx+6], ax      ; b[3]
  114.  
  115.         sub     si, 4
  116.         inc     di
  117.         inc     di
  118.  
  119.         lodsw                   ; x[0]
  120.         mul     WORD PTR [di]   ; a[3]
  121.         add     [bx+6], ax      ; b[3]
  122.  
  123.         mov     si, OFFSET _real+6
  124.         mov     di, OFFSET _seed+0
  125.         mov     cx, 4
  126.     rep movsw
  127.  
  128.         mov     ax, WORD PTR _real+10
  129.         mov     dx, WORD PTR _real+12
  130.         and     dh, 7Fh
  131.  
  132.         pop     di
  133.         pop     si
  134.         pop     bp
  135.         ret     
  136.  
  137. _randl  ENDP
  138.  
  139. _TEXT   ENDS
  140.         END
  141.  
  142.