How to generate random numbers using assembly code in the range 1--4 ?
1 + (rand() % 4), in general (where rand() is a decent random integer generator).
call [_rand]
mod eax, 4 ; or 'and eax, 3' - same thing
inc eax
You could go read up on say Mersenne Twister, for how to implement rand(), but it's pretty complex.
Don't know what system you are trying to do this on, so here is a general answer, that should apply, no matter which:
query the system time, using whatever syscall / library call / api you have available
and out the top bits, leaving only the lowest 2
tadaa. randum numbers.
if you want them more random use perhaps do this instead:
query the system time
and out the top bits leaving only the lowest 4 store in "register1"
Loop:
do something unimportant
do something else unimportant
etc.
count down register1
jump to EndLoop if register1==0
jump Loop
EndLoop:
query the system time
and out the top bits, leaving just the lower two
Cheers!
/B2S
EDIT: Sorry, been on holiday out of internet's reach. (yes, genuinely amazing that such places still exist) I'm not particularly familiar with either EyeBot nor 68k asm. So I don't know the syscall to read in the clock or time (either will do). So look that one up, the rest of the code should be something like
//Assuming you have called the syscall to get the system time/clock, and stored it in D0
AND #%01111, D0
loop:
// It really doesn't matter,
// What Instructions you put here,
// just put 4 or 5 instructions that don't
// mess with D0, eg. AND, MOVE, ADD, AND, OR
SUB #1, D0
TST D0 // TST instruction is probably not needed
BEQ EndLoop
JMP loop
EndLoop:
// Get the system time/clock again (Next instruction assumes clock is in D0)
AND #%011, D0
D0 should now contain your random number
You can do own quasi random number generator. If you have access to the RTC (real clock counter) or CPU time stamp than you can do rutine relatively simple.
Very simple example:
Int LastIteration;
Int IterationCounter;
...
++IterationCounter;
LastIteration = CpuTimeStamp + IterationCounter;
RndNum = LastIteration & 3 + 1;
This quasi rnd generator is enough unpredictable if you don't need a lot of generated numbers per second.
This is a simple technique to get somewhat a "random" number (it's not really random though), if the API doesn't provide one
- variable time = get the system time
- variable remainder = time % 4
- variable randomNumber = time + 1
You can use this with every language (provided that you can access the time).
For an advanced random number generator in 68K, you can see this link.