File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 9191 lw r5 , 0xf000
9292floop:
9393 rd r5 + r3
94- lj rand
94+ lj urand
9595 awt r3 , 2
9696 cw r3 , 0x1000
9797 jl floop
@@ -190,7 +190,7 @@ loop:
190190
191191; next address
192192 awt r3 , 1
193- lj rand
193+ lj urand
194194 awt r3 , 1
195195 cw r3 , 0x1000
196196 jls loop
Original file line number Diff line number Diff line change @@ -195,7 +195,7 @@ gen_randoms:
195195 lw r6 , write_positions
196196. loop :
197197
198- lj rand
198+ lj urand
199199 rw r1 , r6 + 1
200200
201201 awt r6 , 2
Original file line number Diff line number Diff line change @@ -30,7 +30,7 @@ mask_ch:.word IMASK_ALL_CH
3030reconfigure_mem:
3131 .res 1
3232
33- lj rand ; [r1, r2] = random
33+ lj urand ; [r1, r2] = random
3434
3535.page14:
3636 lw r3 , 14 \MEM_PAGE | 0 \MEM_SEGMENT ; logical address specification
@@ -57,7 +57,7 @@ reconfigure_mem:
5757randomize:
5858 .res 1
5959
60- lj rand
60+ lj urand
6161
6262 nr r1 , 0x0fff ; r1 = random offset
6363 rw r1 , offset
@@ -83,7 +83,7 @@ randomize:
8383rnd_fill:
8484 .res 1
8585
86- lj rand ; r1 = initial random
86+ lj urand ; r1 = initial random
8787
8888 lw r5 , 0xe000 - 1
8989 aw r5 , [ offset ]
Original file line number Diff line number Diff line change @@ -180,7 +180,7 @@ fill: ; fill write buffer with random data
180180 lw r4 , wrbuf
181181 lw r3 , SSIZE/ 2
182182fill_loop:
183- lj rand
183+ lj urand
184184 rd r4
185185 awt r4 , 2
186186 drb r3 , fill_loop
Original file line number Diff line number Diff line change @@ -28,7 +28,6 @@ im_tm: .word IMASK_GROUP_H
2828im_0: .word 0
2929otimv: .res 1
3030ostck: .res 1
31- cseed: .dword 1
3231prngseed:
3332 .res 1
3433 lwt r1 , 0
@@ -53,7 +52,7 @@ rngloop:
5352 jes prngseed_fin
5453 ujs rngloop
5554prngseed_fin:
56- rd cseed
55+ rd urand.seed
5756 im im_0
5857 lw r4 , [ otimv ]
5958 rw r4 , INTV_TIMER
@@ -62,57 +61,62 @@ prngseed_fin:
6261 uj [ prngseed ]
6362
6463; ------------------------------------------------------------------------
65- ; Park-Miller-Carta Pseudo-Random Number Generator implementation for MERA-400
66- ; out: [r1, r2] - random 32-bit number
67- ; temp: r3
68- .const constapmc 16807
69- lo: .res 2
70- hi: .res 2
71- tmp_r3: .res 1
64+ ; Park-Miller-Carta pseudo-random number generator implementation for MERA-400
65+ ;
66+ ; RETURN: [r1, r2] - random 31-bit number
67+ urand: .res 1
68+ lw r1 , [ .seed + 1 ]
69+ sxu r1 ; set X if low seed is negative
70+
71+ ; lo = cpmc * (seed & 0xFFFF)
72+ lw r2 , .cpmc
73+ mw .seed + 1
74+ ; correct for signed multiply if low seed was negative
75+ brc ?X
76+ ad .ufix
77+ rd .lo
78+
79+ ; hi = cpmc * (seed >> 16)
80+ lw r2 , .cpmc
81+ mw .seed
82+ rd .hi
7283
73- rand: .res 1
74- rw r3 , tmp_r3
75- ; lo = self.constapmc * (self.seed & 0xFFFF)
76- lw r2 , constapmc
77- mw cseed + 1
78- rd lo
79- ; hi = self.constapmc * (self.seed >> 16)
80- lw r2 , constapmc
81- mw cseed
82- rd hi
8384 ; lo += (hi & 0x7FFF) << 16
84- lw r1 , [ hi + 1 ]
85- er r1 , 1 \ 0
85+ lw r1 , [ . hi+ 1 ]
86+ nr r1 , 0x7fff
8687 lwt r2 , 0
87- ad lo
88- rd lo
88+ ad .lo
89+ rd .lo
90+
8991 ; lo += hi >> 15
90- lwt r1 , 0
91- lw r2 , [ hi ]
92- lw r3 , [ hi + 1 ]
93- slz r3
92+ lw r2 , [ .hi ]
93+ lw r1 , [ .hi + 1 ] ; r1 just for temporary use here
94+ slz r1 ; just to set Y to .hi+1's MSB
9495 sly r2
95- sly r1
96- ad lo
97- ; lo = (lo & 0x7FFFFFFF) + (lo >> 31);
98- sxu r1
99- er r1 , 1 \ 0
100- rd lo
10196 lwt r1 , 0
102- lwt r2 , 0
103- slx r2
104- ad lo
105- ; self.seed = lo
106- rd cseed
107- ; return lo
108- lw r3 , [ tmp_r3 ]
109- uj [ rand ]
97+ sly r1
98+ ad .lo
99+
100+ ; if (lo > 0x7FFFFFFF) lo -= 0x7FFFFFFF
101+ blc ?M
102+ sd .fix
103+ .done:
104+ ; seed = lo
105+ rd .seed
106+ uj [ urand ]
107+
108+ .const .cpmc 16807
109+ .seed: .dword 1
110+ .fix: .dword 0x7fffffff
111+ .ufix: .dword 0x10000 * .cpmc
112+ .lo: .res 2
113+ .hi: .res 2
110114
111115; ------------------------------------------------------------------------
112116; Seed the PRNG
113117; in: [r1, r2] - seed
114118seed: .res 1
115- rd cseed
119+ rd urand.seed
116120 uj [ seed ]
117121
118122prng_stack:
You can’t perform that action at this time.
0 commit comments