mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-02-08 01:01:24 +00:00
73 lines
1.9 KiB
Plaintext
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
|