home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / RAND.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  5KB  |  134 lines

  1. ;//////////////////////////////////////////////////////
  2. ;/                                                    /
  3. ;/ Run-time Library für Borland Pascal 7.0 unter OS/2 /
  4. ;/ Zufallszahlen-Generator.                           /
  5. ;/                                                    /
  6. ;/ 1993 Matthias Withopf / c't                        /
  7. ;/ Originalversion (c) 1988,92 Borland International  /
  8. ;/                                                    /
  9. ;//////////////////////////////////////////////////////
  10.  
  11.                 .286p                                         
  12.  
  13.                 _NOMACROS_ = 1                  ; keine Macros definieren
  14.                 INCLUDE SE.ASM
  15.                 INCLUDE OS2.ASM
  16.  
  17. DATA            SEGMENT WORD PUBLIC
  18.                 EXTRN   RandSeed:DWORD
  19. DATA            ENDS
  20.  
  21. CODE            SEGMENT BYTE PUBLIC
  22.                 ASSUME  CS:CODE,DS:DATA
  23.  
  24. Factor          DW      8405H                   ; Multiplication factor
  25. ConstDelta      DD      2147483648.0            ; Scaling constants
  26. ConstScale      DW      -32
  27.  
  28.                 ; 
  29.                 ; Berechne nächste Zufallszahl und gebe sie in DX:AX zurück.
  30.                 ;
  31.  
  32. NextRand        PROC    NEAR
  33.                 MOV     AX,RandSeed.w0
  34.                 MOV     BX,RandSeed.w2
  35.                 MOV     CX,AX
  36.                 MUL     CS:Factor               ; New = Old.w0 * 8405H
  37.                 SHL     CX,1                    ; New.w2 += Old.w0 * 808H
  38.                 SHL     CX,1
  39.                 SHL     CX,1
  40.                 ADD     CH,CL
  41.                 ADD     DX,CX
  42.                 ADD     DX,BX                   ; New.w2 += Old.w2 * 8405H
  43.                 SHL     BX,1
  44.                 SHL     BX,1
  45.                 ADD     DX,BX
  46.                 ADD     DH,BL
  47.                 MOV     CL,5
  48.                 SHL     BX,CL
  49.                 ADD     DH,BL
  50.                 ADD     AX,1                    ; New += 1
  51.                 ADC     DX,0
  52.                 MOV     RandSeed.w0,AX
  53.                 MOV     RandSeed.w2,DX
  54.                 RET
  55. NextRand        ENDP
  56.  
  57.                 ;
  58.                 ; Function Random(Range : Word) : Word;
  59.                 ;
  60.  
  61.                 PUBLIC  RandInt
  62. RandInt         PROC    PASCAL FAR
  63.                 ARG     A_Range : WORD
  64.                 CALL    NextRand                ; lese nächste Zufallszahl
  65.                 MOV     CX,DX
  66.                 MUL     A_Range
  67.                 MOV     AX,CX
  68.                 MOV     CX,DX
  69.                 MUL     A_Range
  70.                 ADD     AX,CX
  71.                 ADC     DX,0
  72.                 MOV     AX,DX
  73.                 RET
  74. RandInt         ENDP
  75.  
  76.                 ;
  77.                 ; Function Random : Real;
  78.                 ;
  79.  
  80.                 PUBLIC  RandReal
  81. RandReal        PROC    FAR
  82.                 CALL    NextRand                ; lese nächste Zufallszahl
  83.                 XCHG    AX,BX
  84.                 MOV     AX,80H
  85.                 MOV     CX,32
  86. @@Loop:         TEST    DH,80H
  87.                 JNE     @@Ok
  88.                 SHL     BX,1
  89.                 RCL     DX,1
  90.                 DEC     AL
  91.                 LOOP    @@Loop
  92.                 XOR     AL,AL
  93. @@Ok:           AND     DH,7FH
  94.                 RET
  95. RandReal        ENDP
  96.  
  97.                 ;
  98.                 ; Function Random : Extended;
  99.                 ;
  100.  
  101.                 PUBLIC  RandFloat
  102. RandFloat       PROC    FAR
  103.                 CALL    NextRand                ; lese nächste Zufallszahl
  104.                 FILD    CS:ConstScale           ; lese Konstante -32
  105.                 FILD    RandSeed                ; Load 32-bit random integer
  106.                 FADD    CS:ConstDelta           ; für Zahl muß gelten:
  107.                 FSCALE                          ;   0 <= x < 1
  108.                 FSTP    ST(1)                   ; entferne Skalierungsfaktor
  109.                 FWAIT                           ; warte bis fertig
  110.                 RET
  111. RandFloat       ENDP
  112.  
  113.                 ;
  114.                 ; Procedure Randomize;
  115.                 ;
  116.  
  117.                 PUBLIC  InitRand
  118. InitRand        PROC    PASCAL FAR
  119.                 LOCAL   L_DateTime : DATETIME
  120.                 LEA     BX,L_DateTime
  121.                 PUSH    SS
  122.                 PUSH    BX        
  123.                 CALL    DosGetDateTime
  124.                 MOV     AX,L_DateTime.w0
  125.                 MOV     RandSeed.w0,AX
  126.                 MOV     AX,L_DateTime.w2
  127.                 MOV     RandSeed.w2,AX
  128.                 RET
  129. InitRand        ENDP
  130.  
  131. CODE            ENDS
  132.  
  133.                 END
  134.