Files
erkyrath.infocom-zcode-terps/ibm/random.ezp
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

73 lines
1.9 KiB
Plaintext

SUBTTL RANDOM
PAGE
; ------
; OPRAND
; ------
;
; {MODE 1}
; IF ARG1 IS POSITIVE AND WE ARE NOT CURRENTLY IN NON RAMDOM MODE,
; RETURN A VALUE BETWEEN 1 AND ARG1 INCLUSIVE.
;
; {MODE 2}
; IF ARG1 IS NEGATIVE (2'S COMPLEMENT), THEN [ARG1] IS SAVED AND
; RANDOM GENERATES NUMBERS IN SEQUENCE FROM 1 TO [ARG1], RETURNING
; A "0" THE FIRST TIME.
;
; IF ARG1=0, THEN THE RANDOM NUMBER GENERATOR IS PUT INTO {MODE 1},
; AND A "0" IS RETURNED.
PUBLIC OPRAND,OPRND1,OPRND2,OPRND3,OPRND4
OPRAND PROC
CMP AX,0 ; (A0) CHECK ARGUMENT
JNE OPRND1 ; (LD1)
MOV SRHOLD,AX ; (LD1) RESET THE INDICATOR FOR RANDOM RANDOM
JMP PUTVAL ; (LD1) AND RETURN 0
OPRND1: CMP SRHOLD,0 ; (LD1) IF IN MIDDLE OF
JNE OPRND3 ; (LD1) NON RANDOM - CONTINUE
CMP AX,0 ; (LD1) NO - IF # IS POSITIVE
JG OPRND2 ; (LD1) CREATE NORMAL RANDOM #
; INIT NON RANDOM NUMBER (MODE 2)
SUB DX,DX ; (LD1) GET ABSOLUTE VALUE
SUB DX,AX
MOV SRHOLD,DX ; (LD1) HOLD TOP OF RANGE
MOV RNUM,0 ; (LD1) SET # TO ZERO 1ST TIME
MOV AX,0 ; (LD1) AND RETURN 0 1ST TIME
JMP PUTVAL
OPRND2: ; MODE 1 NORMAL RANDOM NUMBER GENERATION
MOV RTEMP,AX ;(A0) SAVE ARGUMENT FOR LATER
MOV AX,RSEED1
MOV BX,RSEED2
MOV RSEED2,AX
CLC
RCR AX,1
RCR BX,1
XOR RSEED1,BX ;(A0) PUT XOR'D NUBMER INTO RSEED1
MOV AX,RSEED1 ;(A0) THIS IS RANDOM VALUE
AND AX,07FFFH ;(LD1)(A0) CHOP HIGH BIT FOR DIVIDE
SUB DX,DX ;(A0) CLEAR MOST SIGN. PORTION OF 32 BIT WORD
DIV RTEMP ;(A0) DIVIDE WORD BY WORD
MOV AX,DX ;(A0) MOVE REMAINDER INTO AX
INC AX ;(A0) MAKE SURE NO ZERO
JMP PUTVAL
; UPDATE "RANDOM" NUMBER, THEN RETURN IT
OPRND3: CMP AX,0 ; (LD1)
JL OPRND4 ; (LD1) NEGATIVE INPUT
MOV SRHOLD,AX ; (LD1) ELSE UPDATE TOP OF RANGE
OPRND4: INC RNUM ; (LD1) NEXT VALUE
MOV AX,RNUM ; (LD1)
CMP AX,SRHOLD ; (LD1) WITHIN RANGE
JBE OPRND5 ; (LD1) YES
MOV AX,1 ; (LD1)
MOV RNUM,AX ; (LD1) ELSE RESTART SEQUENCE
OPRND5: JMP PUTVAL ; (LD1) BOTH AX & RNUM ALL SET
OPRAND ENDP