This short program rolls 2 dice. It demonstrates the use of the Z80's refresh register R as a simple pseudo random number generator for game purposes. Later programs will show you other means of generating pseudo random numbers, but for 2 dice the R register is quite suitable.
Like most programs on the MPF-1 this program is started from address 01800H.
You can download the package belonging to this experiment by clicking on the link on the left.
The included MP3 file can be uploaded as filename 0003.
The program simply shows two digits 3 6 , representing the rolls of the 2 separate dice. Each time you press just about any key the program generates 2 fairly random new rolls.
This concludes the complete user interface of the program, but how does it work under the bonnet?
The Z80 is equipped with a refresh register R.
This register's official purpose is to assist in refreshing dynamic RAM memory.
We don't have any of that on our MPF-1, but we can still abuse register R to generate pseudo random numbers.
If you read this register whenever a key is pressed you'll get a fairly unpredictable value.
For our purpose it suffices to say that register R is incremented at just about every instruction the Z80 executes. Unfortunately the Z80 only increments 7 of the 8 bits of register R. The most significant bit is not automatically incremented. We don't let that bother is now though, after copying register R to A we simply shift all bits 1 bit to the left. We regard this fairly random byte as a fraction (placed in L). If we multiply this fraction by 6 and ignore the new fraction we end up with an integer (placed in H) ranging from 0 to 5. After one final increment we end up with a random number ranging from 1 to 6.
Each die roll can be represented by a 3 bit number.
We want 2 dice, which requires a total of 6 bits.
We started off with 7 random bits from register R, so we have enough resolution to handle both dice.
This automatically demonstrates the limitations of the R register as a random number generator. It's no use reading the R register twice in a row to increase its resolution because it is very likely that there is a fixed relation between the two which probably rubs off on the outcome of the rolls.
Like any program there is always room for improvement. Maybe you'll feel like doing that yourself. Here are some ideas you might implement:
Here you can download the file dice2.zip, which contains the source listing, the actual plain hex file, a list file and an mp3 file of the program.