Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-01 - decus/20-0013/drand.mac
There are 2 other files named drand.mac in the archive. Click here to see a list.
	TITLE	DRAND DOUBLE PRECISON RANDOM NUMBER
	SUBTTL	V.001  R.S.TOMLINSON.  19 AUG 68
	ENTRY	DRAND
	INTERN	DRAND
	EXTERN	RAND,DFA.2,DFM.0,DFA.0

;; CALL:	JSA 16,DRAND
;;	ARG 06,<LOWER LIMIT>
;;	ARG 06,<UPPER LIMIT>
;;	RESULT RETURNED IN AC 0,1
;;	USES PUSH DOWN POINTER IN AC 17

; Modified to PUSHJ/POPJ calling convention 11 Oct 1980
; by Paul T. Robinson, Wesleyan Univ. for DECUS conversion to DEC-20
; call:	movei	16,[<lower limit>
;		    <upper limit>]
;	pushj	17,drand
;arg returned as above

DRAND:	pushj	17,rand	; GET 36 RANDOM BITS
	PUSH 17,0	; SAVE THEM
	pushj	17,rand	; GET 36 MORE RANDOM BITS
	JFFO 0,DRAND1	; COUNT LEADING ZEROES AND JUMP IF NOT ALL ZERO
	POP 17,1	; CHECK LOW ORDER WORD
	JFFO 1,DRAND4	; COUNT LEADING ZEROES AND JUMP IF NON-ZERO
DRAND3:	PUSH 17,16	; SAVE AC 16
	MOVEI 3,@0(16)	; LOAD AC 3 WITH ADR OF LOWER LIMIT
	MOVE 2,0(3)	; PUT LOWER LIMIT INTO AC 2,3
	MOVE 3,1(3)
	DFN 2,3		; COMPLEMENT LOWER LIMIT
	MOVEI 16,@1(16)	; LOAD AC 16 WITH ADR OF UPPER LIMIT
	PUSHJ 17,DFA.2	; FORM <UPPER LIMIT> - <LOWER LIMIT>
	MOVEI 16,2
	PUSHJ 17,DFM.0	; TIMES RANDOM NUMBER FROM 0.0 TO 1.0
	MOVE 16,(17)	; RESTORE AC 16
	HRRZ 16,0(16)	; LOAD AC 16 WITH ADR OF LOWER LIMIT
	PUSHJ 17,DFA.0
	POP 17,16	; RESTORE AC 16
	popj	17,	; RETURN

DRAND1:	MOVE 2,1	; SAVE LEADING ZERO COUNT IN AC 2
	POP 17,1	; GET LOW ORDER WORD
	JRST DRAND2

DRAND4:	ADDI 2,^D36
DRAND2:	LSHC 0,-9(2)	; PUT HIGH ORDER ONE IN BIT 9
	LSH 1,-9	; CLEAR SIGN AND EXPONENT BITS
	MOVN 2,2
	FSC 0,200(2)
	FSC 1,200-^D27(2)
	JRST DRAND3

	END