Movies

Random number generator

The game's random number generator is the standard C library function rand. The generator is seeded from the current time, before the title screen, in the common srand(time(NULL)) pattern.
In the version of MARIO.EXE that has MD5 8ccc1e67bb7c362fb64db43db3f3589f, the RNG code starts at byte offset 0x37f6 (0x09f6 after the EXE header):
srand:
0x09f6  55            push  bp
0x09f7  8bec          mov   bp, sp
0x09f9  8b4606        mov   ax, word [bp+0x6]  ; ax = seed
0x09fc  c706363c0000  mov   word [0x3c36], 0
0x0a02  a3343c        mov   word [0x3c34], ax  ; x = 0x0000:ax
0x0a05  5d            pop   bp
0x0a06  cb            retf

rand:
0x0a07  8b0e363c      mov   cx, word [0x3c36]
0x0a0b  8b1e343c      mov   bx, word [0x3c34]  ; cx:bx = x
0x0a0f  ba5a01        mov   dx, 0x15a
0x0a12  b8354e        mov   ax, 0x4e35         ; dx:ax = 0x015a4e35
0x0a15  e8a6ff        call  mul32              ; dx:ax = cx:bx * dx:ax
0x0a18  050100        add   ax, 1
0x0a1b  83d200        adc   dx, 0              ; dx:ax = dx:ax + 1
0x0a1e  8916363c      mov   word [0x3c36], dx
0x0a22  a3343c        mov   word [0x3c34], ax  ; x = dx:ax
0x0a25  a1363c        mov   ax, word [0x3c36]
0x0a28  99            cdq                      ; dx:ax = dx:ax >> 16
0x0a29  25ff7f        and   ax, 0x7fff         ; ax = ax & 0x7fff
0x0a2c  cb            retf
The compiled code corresponds to C code like the below. It is a 32-bit linear congruential generator, but only 15 bits of the state variable are returned in each call to rand.
static int x = 1;

void srand(unsigned int seed)
{
	x = seed;
}

int rand(void)
{
	x = x * 22695477 + 1;
	return (x >> 16) & 0x7fff;
}
The executable is compiled with Borland C++, likely version 2.0. The string Borland C++ - Copyright 1991 Borland Intl. appears in the file.

GameResources/DOS/MarioTeachesTyping last edited by Sand on 2/13/2023 2:18 AM
Page History Latest diff List referrers View Source