diff options
author | sceptillion <33798691+sceptillion@users.noreply.github.com> | 2017-12-11 00:50:59 -0800 |
---|---|---|
committer | sceptillion <33798691+sceptillion@users.noreply.github.com> | 2017-12-11 00:50:59 -0800 |
commit | fdf832bec16cbdcb07afc4a62bb74314202fadf6 (patch) | |
tree | 4663ee320551b971e3eb40d6b1641262ed9d6198 | |
parent | 7c4bc430c2997e80683612229cfa6b10d08cf512 (diff) |
decompile random
-rw-r--r-- | asm/code_800B540.s | 2 | ||||
-rw-r--r-- | asm/code_8272724.s | 56 | ||||
-rw-r--r-- | asm/libc.s | 8 | ||||
-rw-r--r-- | asm/random.s | 130 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/random.c | 49 | ||||
-rw-r--r-- | sym_ewram2.txt | 2 |
7 files changed, 84 insertions, 165 deletions
diff --git a/asm/code_800B540.s b/asm/code_800B540.s index 017ac05..977da38 100644 --- a/asm/code_800B540.s +++ b/asm/code_800B540.s @@ -13961,7 +13961,7 @@ _08011E0A: lsls r1, 3 adds r0, r5, r1 ldr r0, [r0] - bl ReseedRng + bl SetRngState b _08011E60 .align 2, 0 _08011E38: .4byte 0x00000414 diff --git a/asm/code_8272724.s b/asm/code_8272724.s index ff08ec2..fdf02b5 100644 --- a/asm/code_8272724.s +++ b/asm/code_8272724.s @@ -9,20 +9,20 @@ .text - thumb_func_start _08272760 -_08272760: + thumb_func_start sub_8272760 +sub_8272760: push {lr} adds r1, r0, 0 ldr r0, _08272770 - bl _08272774 + bl sub_8272774 pop {r0} bx r0 .align 2, 0 _08272770: .4byte 0x02027370 - thumb_func_end _08272760 + thumb_func_end sub_8272760 - thumb_func_start _08272774 -_08272774: + thumb_func_start sub_8272774 +sub_8272774: push {r4-r7,lr} mov r7, r10 mov r6, r9 @@ -156,22 +156,22 @@ _08272860: pop {r4-r7} pop {r0} bx r0 - thumb_func_end _08272774 + thumb_func_end sub_8272774 - thumb_func_start _08272870 -_08272870: + thumb_func_start sub_8272870 +sub_8272870: push {lr} adds r1, r0, 0 ldr r0, _08272880 - bl _08272884 + bl sub_8272884 pop {r0} bx r0 .align 2, 0 _08272880: .4byte 0x02027370 - thumb_func_end _08272870 + thumb_func_end sub_8272870 - thumb_func_start _08272884 -_08272884: + thumb_func_start sub_8272884 +sub_8272884: push {r4-r7,lr} mov r7, r10 mov r6, r9 @@ -325,22 +325,22 @@ _08272994: pop {r4-r7} pop {r0} bx r0 - thumb_func_end _08272884 + thumb_func_end sub_8272884 - thumb_func_start _082729A4 -_082729A4: + thumb_func_start sub_82729A4 +sub_82729A4: push {lr} adds r1, r0, 0 ldr r0, _082729B4 - bl _082729B8 + bl sub_82729B8 pop {r0} bx r0 .align 2, 0 _082729B4: .4byte 0x02027370 - thumb_func_end _082729A4 + thumb_func_end sub_82729A4 - thumb_func_start _082729B8 -_082729B8: + thumb_func_start sub_82729B8 +sub_82729B8: push {r4-r7,lr} mov r7, r8 push {r7} @@ -440,22 +440,22 @@ _08272A5A: pop {r4-r7} pop {r0} bx r0 - thumb_func_end _082729B8 + thumb_func_end sub_82729B8 - thumb_func_start _08272A78 -_08272A78: + thumb_func_start sub_8272A78 +sub_8272A78: push {lr} adds r1, r0, 0 ldr r0, _08272A88 - bl _08272A8C + bl sub_8272A8C pop {r0} bx r0 .align 2, 0 _08272A88: .4byte 0x02027370 - thumb_func_end _08272A78 + thumb_func_end sub_8272A78 - thumb_func_start _08272A8C -_08272A8C: + thumb_func_start sub_8272A8C +sub_8272A8C: push {r4-r7,lr} lsls r2, r1, 3 adds r2, r1 @@ -546,6 +546,6 @@ _08272B20: pop {r4-r7} pop {r0} bx r0 - thumb_func_end _08272A8C + thumb_func_end sub_8272A8C .align 2, 0 @ Don't pad with nop. @@ -2585,7 +2585,7 @@ _080B39E8: adds r2, r5, 0 adds r1, r4, 0 adds r3, r7, 0 - bl sub_80B3D3C + bl _dtoa_r adds r7, r0, 0 mov r1, r9 cmp r1, 0x67 @@ -3034,8 +3034,8 @@ _080B3D30: pop {r4-r7,pc} thumb_func_end sub_80B3BE0 - thumb_func_start sub_80B3D3C -sub_80B3D3C: + thumb_func_start _dtoa_r +_dtoa_r: push {r4-r7,lr} mov r7, r10 mov r6, r9 @@ -4669,7 +4669,7 @@ _080B4A26: mov r9, r4 mov r10, r5 pop {r4-r7,pc} - thumb_func_end sub_80B3D3C + thumb_func_end _dtoa_r thumb_func_start sub_80B4A34 sub_80B4A34: diff --git a/asm/random.s b/asm/random.s deleted file mode 100644 index d09ba0a..0000000 --- a/asm/random.s +++ /dev/null @@ -1,130 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start SeedRng -SeedRng: - push {r4,lr} - ldr r4, _08006170 - ldrb r2, [r0] - ldrb r1, [r0, 0x1] - muls r2, r1 - ldrb r3, [r0, 0x2] - ldrb r1, [r0, 0x3] - muls r1, r3 - ldr r3, _08006174 - adds r1, r3 - adds r2, r1 - ldrb r1, [r0, 0x4] - ldrb r0, [r0, 0x5] - muls r0, r1 - adds r2, r0 - str r2, [r4] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08006170: .4byte gUnknown_203B07C -_08006174: .4byte 0x0000d305 - thumb_func_end SeedRng - - thumb_func_start Random16 -Random16: - ldr r2, _08006188 - ldr r1, [r2] - ldr r0, _0800618C - muls r0, r1 - adds r0, 0x1 - str r0, [r2] - asrs r0, 16 - bx lr - .align 2, 0 -_08006188: .4byte gUnknown_203B07C -_0800618C: .4byte 0x5d588b65 - thumb_func_end Random16 - - thumb_func_start Random -Random: - push {r4,lr} - bl Random16 - adds r4, r0, 0 - lsls r4, 16 - asrs r4, 16 - bl Random16 - lsls r0, 16 - asrs r0, 16 - lsls r4, 16 - orrs r4, r0 - adds r0, r4, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end Random - - thumb_func_start RandomCapped -RandomCapped: - push {r4,lr} - adds r4, r0, 0 - bl Random - ldr r1, _080061C8 - ands r0, r1 - muls r0, r4 - asrs r0, 16 - ands r0, r1 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080061C8: .4byte 0x0000ffff - thumb_func_end RandomCapped - - thumb_func_start RandomRange -RandomRange: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - cmp r5, r4 - beq _080061EC - cmp r5, r4 - blt _080061E4 - subs r0, r5, r4 - bl RandomCapped - adds r0, r4 - b _080061EC -_080061E4: - subs r0, r4, r5 - bl RandomCapped - adds r0, r5 -_080061EC: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end RandomRange - - thumb_func_start GetRngState -GetRngState: - ldr r0, _080061FC - ldr r0, [r0] - bx lr - .align 2, 0 -_080061FC: .4byte gUnknown_203B07C - thumb_func_end GetRngState - - thumb_func_start ReseedRng -ReseedRng: - push {r4,lr} - ldr r4, _08006214 - str r0, [r4] - bl Random - str r0, [r4] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08006214: .4byte gUnknown_203B07C - thumb_func_end ReseedRng - - .align 2, 0 @ Don't pad with nop. diff --git a/ld_script.txt b/ld_script.txt index 3dc21ff..2f8b921 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -35,7 +35,7 @@ SECTIONS { { asm/crt0.o(.text); asm/code.o(.text); - asm/random.o(.text); + src/random.o(.text); asm/code_8006218.o(.text); src/main.o(.text); asm/code_800B540.o(.text); diff --git a/src/random.c b/src/random.c new file mode 100644 index 0000000..5db7394 --- /dev/null +++ b/src/random.c @@ -0,0 +1,49 @@ +#include "global.h" + +extern s32 gRngState; + +void SeedRng(u8 *seed) +{ + gRngState = 54021 + (seed[0] * seed[1]) + (seed[2] * seed[3]) + (seed[4] * seed[5]); +} + +static s16 Random16(void) +{ + gRngState = 1566083941 * gRngState + 1; + return gRngState >> 16; +} + +s32 Random(void) +{ + s32 r1 = Random16(); + s32 r2 = Random16(); + return (r1 << 16) | r2; +} + +// Returns a random number in the range [0, cap). +s32 RandomCapped(s32 cap) +{ + return (((Random() & 0xFFFF) * cap) >> 16) & 0xFFFF; +} + +s32 RandomRange(s32 a, s32 b) +{ + if (a == b) + return a; + + if (a < b) + return RandomCapped(b - a) + a; + + return RandomCapped(a - b) + b; +} + +s32 GetRngState(void) +{ + return gRngState; +} + +void SetRngState(s32 state) +{ + gRngState = state; + gRngState = Random(); +} diff --git a/sym_ewram2.txt b/sym_ewram2.txt index 41be4ef..2785f4e 100644 --- a/sym_ewram2.txt +++ b/sym_ewram2.txt @@ -82,7 +82,7 @@ gUnknown_203B074: @ 203B074 gUnknown_203B078: @ 203B078 .space 0x4 -gUnknown_203B07C: @ 203B07C +gRngState: @ 203B07C .space 0x4 gUnknown_203B080: @ 203B080 |