seeds={} add(modules,seeds) function seeds:init() self.l4=seed_pool:new(seed_constants.l4_start,seed_constants.l4_end,_naive_16b,true) self.l5=seed_pool:new(seed_constants.l5_start,seed_constants.l5_end,_delta_4b,true) self.ff=seed_pool:new(seed_constants.ff_start,seed_constants.ff_end,_delta_4b) self.l7=seed_pool:new(seed_constants.l7_start,seed_constants.l7_end,_delta_4b) end function seeds:choose(pool) if (pool) return self[pool]:choose() return rnd(5000>>16) end seed_pool=klass() function seed_pool:init(addr_start,addr_end,routine,negencode) if (negencode) self.neg_max=(%addr_start)>>16 addr_start+=2 local seeds={} routine(seeds,addr_start,addr_end) self.seeds=seeds self.is_seed={} for s in all(seeds) do self.is_seed[s] = true end end function seed_pool:choose() if self.neg_max then while true do local r = rnd(self.neg_max) if (not self.is_seed[r]) return r end end return rnd(self.seeds) end function _delta_4b(seeds,s,e) local acc=0 while s < e do local byte=@s local nb0=byte>>20 local nb1=(byte&0xf)>>16 if nb0==0 then acc+=0x0.000f else acc+=nb0 add(seeds,acc) end if nb1==0 then acc+=0x0.000f else acc+=nb1 add(seeds,acc) end s+=1 end end function _naive_16b(seeds,s,e) while s < e do add(seeds,%s) s+=2 end end