diff --git a/config/disasm_overrides.yml b/config/disasm_overrides.yml index ac15580f..2f8ce230 100644 --- a/config/disasm_overrides.yml +++ b/config/disasm_overrides.yml @@ -7,6 +7,7 @@ symbol_aligns: 0x800190e0: 32 0x80019380: 32 0x8001a0c0: 32 + 0x80031d80: 32 0x80207458: 8 # align RunQueue to 0x001251d8 0x800b9140: 32 # align gam_win_moji1_tex to 32 bytes 0x801f71c0: 32 # align texture_buffer_data to 32 bytes diff --git a/config/dol_slices.yml b/config/dol_slices.yml index 2f0dc6e0..aec7a6ef 100644 --- a/config/dol_slices.yml +++ b/config/dol_slices.yml @@ -89,6 +89,10 @@ jaudio_NES/internal/playercall.c: .bss: [0x801864d0,0x80186590] jaudio_NES/internal/os.c: .text: [0x80026120, 0x80026300] +jaudio_NES/internal/random.c: + .text: [0x80031ce0, 0x80031d80] + .sdata: [0x80217c38, 0x80217c40] + .sdata2: [0x80218f60, 0x80218f70] Famicom/famicom.cpp: .text: [0x80041614, 0x80046888] # TODO: get ~J2DOrthoGraph's dtor in here somehow? 0x800468fc, also add in JUTGamePad::getPortStatus when JUTGamePad is linked? .rodata: [0x800aa9a8, 0x800aaa30] diff --git a/include/jaudio_NES/random.h b/include/jaudio_NES/random.h new file mode 100644 index 00000000..3fcbc880 --- /dev/null +++ b/include/jaudio_NES/random.h @@ -0,0 +1,19 @@ +#ifndef JAUDIO_RANDOM_H +#define JAUDIO_RANDOM_H + +#include "types.h" +#include "jaudio_NES/audiostruct.h" +#include "jaudio_NES/audiowork.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern s32 GetRandom_s32(void); +extern f32 GetRandom_sf32(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/static/jaudio_NES/internal/random.c b/src/static/jaudio_NES/internal/random.c new file mode 100644 index 00000000..3b217aad --- /dev/null +++ b/src/static/jaudio_NES/internal/random.c @@ -0,0 +1,28 @@ +#include "jaudio_NES/random.h" + +static s32 v0 = 0x0001000; +static s32 v1 = 0x0005555; + +#define V0_MULT (s32)0x13579BDE +#define V1_MULT (s32)0x98765432 + +extern s32 GetRandom_s32(void) { + s32 tmp; + + tmp = (v1 * V1_MULT) + ((v0 * V0_MULT) >> 4); + tmp += 1; + v0 = v1; + v1 = tmp; + return tmp; +} + +extern f32 GetRandom_sf32(void) { + s32 rnd = GetRandom_s32(); + f32 rnd_float = (f32)(rnd & 0x00FFFFFF) / (f32)(0x00FFFFFF); /* map to float [0, 1] */ + + if (rnd < 0) { + rnd_float = -rnd_float; + } + + return rnd_float; +}