Add README.md
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rka / paroff / randu.ra
1 / SUBROUTINE RANDU
2 / THE RANDOM GENERATOR IS THAT FROM DECUS 5-25
3 / MUST BE USED IN PDP8 CODE AS IT DOES SOME ILLEGAL ARITHMETIC
4 /
5 / USAGE
6 / CALL RANDU (IX,F)
7 / IX IS ANY NUMBER:
8 / IF SET TO A FIXED NUMBER ON FIRST ENTRY A REPEATABLE SEQUENCE
9 / IS GENERATED
10 / BUT NOTE THAT ALL PARTS OF THE NUMBER MUST BE DEFINED
11 / IE USE IX>1 AND 5-6 DIGITS
12 / IF SET TO 0 A RANDOM NUMBER SEQUENCE IS INITIATED
13 / NOTE THAT THIS SEQUENCE IS DEPENDENT OF THE BACKGOUND
14 / JOB.
15 / CALLING WITH THE SAME TIMING PARAMETERS MIGHT RESULT
16 / IN REPETITION OF SAME SEQUENCE.
17 / ALSO FIRST CALL TO RANDU SETS UP BACKGROUND JOB
18 / AND A 0 CALL AT THAT TIME IS NOT RANDOM
19 /
20 / COORECT SEQUENCE TO GET A RANDOM START
21 /
22 / I=0
23 / CALL RANDU(IX,X) NOTE RANDU CHANGES I
24 / WRITE (0,..... TTY OUTPUT (OR INPUT) GIVES A 'RANDOM START'
25 / I=0
26 / CALL RANDU (IX,X) X IS RANDOM
27 / CALL RANDU (IX,X) KEEP SAME I
28 / ON SUBSEQUENT CALLS IT SHOULD BE LEFT UNTOUCHED
29 /*** NOTE IX IS A NOT NORMAL FPP NUMBER IT SHOULD NOT BE USED IN FPP
30 / ARITHMETIC ***
31 / F IS ON RETURN A RANDOM NUMBER BETWEEN 0 AND 1
32 \f SECT RANDU
33 JA #ST
34 #XR, ORG .+10
35 TEXT 'RANDU'
36 #RET, SETX #XR
37 SETB #BASE
38 JA .+3
39 #BASE, ORG .+6
40 I, ORG .+3
41 F, ORG .+3
42 ORG #BASE+30
43 FNOP
44 JA #RET
45 FNOP
46 #GOBAK, 0;0
47 #LBL=.
48 ORG #LBL
49 #RTN, BASE #BASE
50 JA #GOBAK
51 #ST, STARTD
52 0210
53 FSTA #GOBAK,0
54 0200
55 SETX #XR
56 SETB #BASE
57 LDX 0,1
58 FSTA #BASE
59 FLDA% #BASE,1+
60 FSTA I
61 FLDA% #BASE,1+
62 FSTA F
63 STARTF
64 FLDA TWIDD / IS THIS FIRST CALL
65 JNE NOTFIR
66 TRAP4 #FIRST / YES, INITIATE BACKGROUND LOOP
67 NOTFIR, FLDA% I
68 JNE #G0001
69 FLDA TWIDD / FETCH TWIDDLER CONSTANTS
70 FSTA% I / AND USE AS START OF RANDOM
71 #G0001, FSTA L / PLACE TO SECT 8
72 TRAP4 #RANDU / GO GENERATE NEW NUMBER
73 FLDA L / FOR NEXT ITERATION
74 FSTA% I
75 FLDA T / NEW RANDOM NUMBER IE L WITH HIGH ORDER=0
76 JGT POS
77 FNEG / SHOULD BE 0-1
78 POS, FSTA% F
79 JA #RTN
80 \f/ THE RANDOM GENERATOR
81 / ON CALLING L=OLD RANDOM NR
82 / ON EXIT L=NEW NUMBER
83 / THE 2 LOW ORDER PARTS OF THIS ARE MOVED TO T
84 SECT8 #RAND8
85 #RANDU, 0
86 TAD L3
87 SNA / ALL PARTS MUST BE NON ZERO
88 TAD . / NICE CONSTANT
89 RAL
90 AND R7400
91 DCA T3
92 TAD L2
93 SNA
94 TAD . / NICE CONSTANT ?
95 AND R177
96 TAD T3
97 RTL
98 RTL
99 RAL
100 DCA T1
101 TAD L3
102 AND R177
103 RTL
104 RTL
105 RAL
106 TAD L2
107 DCA T2
108 SZL
109 ISZ T1
110 NOP
111 TAD L3
112 CLL RAL
113 SZL
114 ISZ T2
115 SKP
116 ISZ T1
117 NOP
118 CLL
119 TAD L3
120 DCA L3
121 TAD L2
122 RAL
123 SZL
124 ISZ T1
125 NOP
126 CLL
127 TAD T2
128 DCA L2
129 TAD L1
130 SNA
131 TAD .
132 RAL
133 TAD L1
134 TAD T1
135 DCA L1
136 / END OF GENERATOR
137 TAD L1 / WE ONLY WANT WORD 2 AND 3
138 DCA T2
139 DCA T1
140 TAD L2
141 DCA T3
142 CDF CIF 0
143 JMP% #RANDU
144 T, / OLD RANDOM NUMBER, START OF NEXT
145 T1, 0
146 T2, 0
147 T3, 0
148 L, / NEW RANDOM NUMBER
149 L1, 0
150 L2, 0
151 L3, 0
152 R177, 177
153 R7400, 7400
154 EXTERN ONQB
155 #FIRST, 0 / INITIATE BACKGROUND
156 JMS% XONQB+1
157 ADDR LOOP
158 ISZ TW1
159 ISZ TW2
160 ISZ TW2 / NOT ALL =0
161 CDF CIF 0
162 JMP% #FIRST
163 TWIDD,
164 TW1, 0
165 TW2, 0
166 TW3, 0
167 LOOP, 0
168 ISZ TW1
169 ISZ TW2
170 ISZ TW3
171 NOP
172 CDF CIF 10
173 JMP% LOOP
174 XONQB, ADDR ONQB
175 END
176 \1a