;================================================== ; PROGRAM TITLE: Random Number Generator ; ; WRITTEN BY: Raymond E. Penley ; DATE WRITTEN: 27 June 1980 ; ; WRITTEN FOR: Pascal/Z Users Group ; ; SUMMARY: ; Implements a Fibonacci series Random number generator. ; RANDOM will return numbers from 0 to x ; ; Call as Returns ; ------- ------------ ; real := RANDOM(10); 0.0 to 10.0 ; real := RANDOM(112); 0.0 to 112.0 ; I := TRUNC(RANDOM(10)); 0 to 10 ; ; ** ; Add these lines to your PASCAL source program: ; ; Procedure SEEDRAND; EXTERNAL; ; Functin RANDOM(X: Integer): REAL; external; ; ; Also within the body of the main program ; but BEFORE calling RANDOM(X); ; ; SEEDRAND; ; ;*** What would happen if you did not call SEEDRAND ? *** ; ;=============================================== ; ; PROCEDURE SEEDRAND; ; (* INITIAL VALUES FOR SEED1 AND SEED2 ARE HERE *) ; NAME RANDOM ENTRY SEEDRAND,RANDOM ; SEEDRAND: ENTR D,2,0 ; SEED1 := 10946; MVI 0(IY),42 MVI -1(IY),194 ; SEED2 := 17711 ; END; MVI -2(IY),69 MVI -3(IY),47 EXIT D,0 ; ; ; ; Function Random(x: integer): real; ; (* ; GLOBAL ; SEED1, SEED2 : INTEGER *) ; CONST ; factor = Maxint; ; HALFINT = 16383; (* 1/2 OF MAXINT *) ; VAR ; x1 : real; ; temp1, temp2, HALF_ADDER : INTEGER; RANDOM: ENTR D,2,10 ; (* Take 1/2 of the seeds for the comparison test *) ; temp1 := SEED1 DIV 2; MOV L,-1(IY) MOV H,0(IY) LXI D,2 DIVD D,0 MOV -6(IX),H MOV -7(IX),L ; temp2 := SEED2 DIV 2; MOV L,-3(IY) MOV H,-2(IY) LXI D,2 DIVD D,0 MOV -8(IX),H MOV -9(IX),L ; IF (temp1+temp2) >= HALFINT then{the number is too big -} MOV L,-7(IX) MOV H,-6(IX) MOV E,-9(IX) MOV D,-8(IX) DADD D,0 LXI D,16383 GE D,0 ; { scale it down } ; HALF_ADDER := temp1 + temp2 - HALFINT JNC L177 MOV L,-7(IX) MOV H,-6(IX) MOV E,-9(IX) MOV D,-8(IX) DADD D,0 ; ELSE LXI D,-16383 DADD D,0 MOV -4(IX),H MOV -5(IX),L ; HALF_ADDER := temp1 + temp2; JMP L197 L177 MOV L,-7(IX) MOV H,-6(IX) MOV E,-9(IX) MOV D,-8(IX) DADD D,0 MOV -4(IX),H MOV -5(IX),L L197 ; SEED1 := SEED2; MOV L,-3(IY) MOV H,-2(IY) MOV 0(IY),H MOV -1(IY),L ; (* Restore from previous DIVision *) ; SEED2 := HALF_ADDER * 2; MOV L,-5(IX) MOV H,-4(IX) DADD C MOV -2(IY),H MOV -3(IY),L ; (*---Convert X to real and divide by factor---*) ; x1 := ((X*1.0)/factor); MOV L,8(IX) MOV H,9(IX) PUSH H LXI H,320 MOV D,A MOV E,A PUSH H PUSH D CVTF C MULT D,-4 CVTF A,32767 FDVD D,-4 LXI H,3 DADD S XCHG PUSH IX POP H XCHG LXI B,4 LDDR POP H POP H ; (*---Return random number scaled by factor---*) ; RANDOM := ( SEED2 * x1 ); MOV L,-3(IY) MOV H,-2(IY) PUSH H LXI H,-4 DADD S SPHL XCHG PUSH IX POP H DCX H DCX H DCX H LXI B,4 LDIR CVTF C MULT D,-4 LXI H,3 DADD S XCHG PUSH IX POP H LXI B,13 DADD B XCHG LXI B,4 LDDR POP H POP H ; End{ of RANDOM(X) }; EXIT D,2