* * $Id: rndm2.s,v 1.1.1.1 1996/02/15 17:54:49 mclareni Exp $ * * $Log: rndm2.s,v $ * Revision 1.1.1.1 1996/02/15 17:54:49 mclareni * Kernlib * * MODULE M_RNDM2 % % CERN PROGLIB# V107 RNDM2 .VERSION KERNNOR 2.05 880419 % ORIG. 24-oct-87, P.S.Iversen, Dep. of Physics, Univ. Bergen % % Random routine with same sequence as on VAX % EXPORT RNDM2,IRNDM2,RD2OUT,RD2IN % MCGN: W DATA 30071B % 12345 decimal. SRGN: W DATA 2061B % 1073 decimal. % ROUTINE RNDM2 LIB RNDM2 VBAS: STACK FIXED INPT: W BLOCK 1 ENDSTACK RNDM2: ENTF VBAS % REAL=RNDM2(DUMMY) W2 := SRGN % REGB <- SRGN W1 := W2 % REGC <- REGB W SHL W1,-15D % Right shift REGC 15 bits. W2 XOR W1 % REGB <- XOR(REGB,REGC) W1 := W2 % REGC <- REGB W SHL W1,17D % Left shift REGC 17 bits. W2 XOR W1 % REGB <- XOR(REGB,REGC) W2 =: SRGN % SRGN <- REGB W1 := MCGN % REGD <- MCGN W1 * 206715B % REGD <- REGD*69069 W1 =: MCGN % MCGN <- REGD W1 XOR W2 % REGD <- XOR(REGD,REGB) W SHL W1,-1D % Left shift REGD 1 bit. W FCONV W1,F1 % Convert to float in A1. F MUL2 F1,07040000000B % Normalize result. RET % Return, finished. ENDROUTINE % ROUTINE IRNDM2 LIB IRNDM2 VBAS: STACK FIXED INPT: W BLOCK 1 ENDSTACK IRNDM2:ENTF VBAS % INTEGER=IRNDM2(DUMMY) W2 := SRGN % REGB <- SRGN W1 := W2 % REGC <- REGB W SHL W1,-15D % Right shift REGC 15 bits. W2 XOR W1 % REGB <- XOR(REGB,REGC) W1 := W2 % REGC <- REGB W SHL W1,17D % Left shift REGC 17 bits. W2 XOR W1 % REGB <- XOR(REGB,REGC) W2 =: SRGN % SRGN <- REGB W1 := MCGN % REGD <- MCGN W1 * 206715B % REGD <- REGD*69069 W1 =: MCGN % MCGN <- REGD W1 XOR W2 % REGD <- XOR(REGD,REGB) W SHL W1,-1D % Left shift REGD 1 bit, return value. RET % Return, finished. ENDROUTINE % ROUTINE RD2IN % CALL RD2IN(IX,IY) LIB RD2IN VBAS: STACK FIXED IX: W BLOCK 1 IY: W BLOCK 1 ENDSTACK RD2IN: ENTF VBAS W MOVE IND(B.IX),MCGN % Set MCGN value. W MOVE IND(B.IY),SRGN % Set SRGN value. RET % Return, finished. ENDROUTINE % ROUTINE RD2OUT % CALL RD2OUT(IX,IY) LIB RD2OUT VBAS: STACK FIXED IX: W BLOCK 1 IY: W BLOCK 1 ENDSTACK RD2OUT:ENTF VBAS W MOVE MCGN,IND(B.IX) % Get MCGN value. W MOVE SRGN,IND(B.IY) % Get SRGN value. RET % Return, finished. ENDROUTINE ENDMODULE