nesdev.com http://forums.nesdev.com/ 

Best way to have a number between #$00 and #$XX? http://forums.nesdev.com/viewtopic.php?f=2&t=16171 
Page 1 of 1 
Author:  MartsINY [ Mon Jul 03, 2017 4:14 pm ] 
Post subject:  Best way to have a number between #$00 and #$XX? 
What is the best routine in assembly to have a number from #$00 to a given number? I have solution but they are complex, I think there is surely an easy with with the instructions? 
Author:  Sogona [ Mon Jul 03, 2017 4:27 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
Do you mean like generating a random number between 0 and n? 
Author:  MartsINY [ Mon Jul 03, 2017 4:47 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
yes exactly what I mean!! doing LDA $EF (random generator) AND #$0F Some number won't be obtained... 
Author:  tepples [ Mon Jul 03, 2017 4:58 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
How are you currently populating the value at address $00EF? What range did you want, and what do you plan to use the numbers for? Does the range vary from call to call? Sometimes this can inform which technique is best. The generalpurpose RNG I recommend nowadays is the LCG from cc65's C library. Sometimes, depending on the exact range I need and how quickly a value should repeat before being reused, I'll postprocess the random stream with a leastrecentlyused generator, calculated over a circular buffer in a manner similar to RC4's mixer. 
Author:  Sogona [ Mon Jul 03, 2017 5:02 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
Working with any number that isn't a power of 2 is always tricky. The way I've been doing it is having a table if values in ROM that's a power of two (The most i've needed is 8 so far, so that's what I've been using), and using a random number as the index for which to choose. Simple and quick. Code: lda random And #%00000111 Tax Rts Otherwise you have to use division, which is costly. IDK, I'm sure someone here has a better solution. 
Author:  MartsINY [ Mon Jul 03, 2017 5:15 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
Sogona: thanks I will use this way!! what is clever and what I was looking for!! 
Author:  MartsINY [ Mon Jul 03, 2017 5:26 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
tepples wrote: How are you currently populating the value at address $00EF? What range did you want, and what do you plan to use the numbers for? Does the range vary from call to call? Sometimes this can inform which technique is best. The generalpurpose RNG I recommend nowadays is the LCG from cc65's C library. Sometimes, depending on the exact range I need and how quickly a value should repeat before being reused, I'll postprocess the random stream with a leastrecentlyused generator, calculated over a circular buffer in a manner similar to RC4's mixer. thanks! will look at it!! 
Author:  NovaSquirrel [ Mon Jul 03, 2017 5:56 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
I usually just keep trying until I get a number out of the randomizer that works. Like this is the code I would use if I wanted 0, 1, 2, 3 or 4 with equal chances: Code: loop:
jsr random ; get a new random number, put it in the accumulator and #7 ; cut down the range cmp #5 ; throw out 5, 6 or 7 bcs loop 
Author:  tepples [ Mon Jul 03, 2017 7:02 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
Another way to get nearly uniformly distributed numbers from 0 to 4 without the timeuncertainty of looping calls to your RNG is to multiply the RNG's output by 5. Code: jsr random ; Multiply A by 5/4 and keep bits 86 sta tmp0 lsr a lsr a clc adc tmp0 ; C:A = 0 to 319 and #$C0 ; C:A = 0, 64, 128, 192, or 256 rol a rol a rol a For 5 choices in particular, you can treat values 0203 one way and 204255 another, such as returning 4 for all values 204+ and using bits 10 of values 0203. Code: jsr random
cmp #204 bcc not4 lda #4 bcs haveA not4: and #$03 haveA: 
Author:  Bregalad [ Mon Jul 03, 2017 10:55 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
NovaSquirrel wrote: I usually just keep trying until I get a number out of the randomizer that works. Like this is the code I would use if I wanted 0, 1, 2, 3 or 4 with equal chances: Code: loop: jsr random ; get a new random number, put it in the accumulator and #7 ; cut down the range cmp #5 ; throw out 5, 6 or 7 bcs loop Just want to point out that's also exactly what I'd do. 
Author:  MartsINY [ Tue Jul 04, 2017 4:18 pm ] 
Post subject:  Re: Best way to have a number between #$00 and #$XX? 
Bregalad wrote: NovaSquirrel wrote: I usually just keep trying until I get a number out of the randomizer that works. Like this is the code I would use if I wanted 0, 1, 2, 3 or 4 with equal chances: Code: loop: jsr random ; get a new random number, put it in the accumulator and #7 ; cut down the range cmp #5 ; throw out 5, 6 or 7 bcs loop Just want to point out that's also exactly what I'd do. thx!! it's actually the easiest solution!! 
Page 1 of 1  All times are UTC  7 hours 
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ 