I love you rand(0,1)
Let’s get down to it. Turbo Rascal SE initializes a random method if you have used the “Rand” function anywhere in your code.
The Rand function requires three parameters: Lower and upper bounds, plus the variable to write to. Note a couple of things:
- The Random value uses output from the SID, so it will interefere with any music / sound effects being played
- The function is kinda of slow, especially when having a narrow range of upper/lower bounds.
It is therefore recommended that you initialize a random table in the beginning of the code and use this instead of calling the (slow) random routine directly.
In this tutorial, be are basically doing the following:
- Initializing the random table
- Clearing the screen
- Setting borders
- Filling the screen with random values
- Filling lines on the screen with random color values
- While the MoveTo method positions a screen pointer is useful, it is also costly. It is recommended to keep the use to a minimum, and instead use the IncScreenX method to position the cursor between calls.
- Dividing by powers of two are always recommended, as these methods are optimised to use bit shifting
program randomstuff;
var
random_char, cnt, random_color: byte;
random_values : array[255] of byte;
x, y : byte;
index : byte;
// Initialize random table, much faster then using the sid's random value
// generator
procedure InitializeRandom();
begin
for x:=0 to 255 do begin
rand(0, 255, y);
random_values[x]:=y;
end;
end;
begin
InitializeRandom();
// Fill screen with blank
ClearScreen($20, SCREEN_CHAR_LOC );
// Fill color screen with background F and foreground 8
ClearScreen($F8, SCREEN_COL_LOC );
// Set screen foreground and background to black. The second parameter is an offset.
Poke(SCREEN_BG_COL, 0, BLACK);
Poke(SCREEN_FG_COL, 0, BLACK);
// point to start of random table
index:=0;
// infinite loop
cnt := 0;
while 1=1 do begin
// loop y
for y:=5 to 20 do begin
// moves current screen position
moveto(0, y, $04); // $04 is screen memory upper byte
// Select some random color
for x:=5 to 35 do begin
// Sets both screen and color values
screenmemory[x] := random_values[index];
// increases screen X counter
// Increase by some random non-repeatable prime
index:=index+17;
end;
moveto(0, y, $D8); // $04 is screen memory upper byte
// Select some random color
random_color := random_values[index]/16;
// restrict to 0-16
for x:=5 to 35 do begin
// Sets both screen and color values
screenmemory[x] := random_color;
// increases screen X counter
end;
end
end;
end.