summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-05-03 19:22:26 +0100
committerred031000 <rubenru09@aol.com>2020-05-03 19:23:58 +0100
commit4f6c75ac8381a7a3c2902c97870066ee90f1d320 (patch)
treedddb158e8ec903382b383796bac8708ce8f8492f
parent2ee7030776461ee835dbbd44149f90ae79e7d4c5 (diff)
match OS_GetLowEntropyData
-rw-r--r--arm9/asm/OS_entropy.s68
-rw-r--r--arm9/lib/include/OS_entropy.h17
-rw-r--r--arm9/lib/include/consts.h13
-rw-r--r--arm9/lib/include/mmap.h2
-rw-r--r--arm9/lib/include/types.h10
-rw-r--r--arm9/lib/src/OS_entropy.c30
6 files changed, 54 insertions, 86 deletions
diff --git a/arm9/asm/OS_entropy.s b/arm9/asm/OS_entropy.s
deleted file mode 100644
index 839d54f9..00000000
--- a/arm9/asm/OS_entropy.s
+++ /dev/null
@@ -1,68 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start OS_GetLowEntropyData
-OS_GetLowEntropyData: ; 0x020CD754
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- ldr r1, _020CD82C ; =0x04000006
- ldr r2, _020CD830 ; =0x027FFC00
- ldrh r7, [r1, #0x0]
- add r4, r2, #0x80
- mov r6, r0
- add r5, r4, #0x74
- bl OS_GetTickLo
- orr r0, r0, r7, lsl #0x10
- str r0, [r6, #0x0]
- ldr r1, _020CD834 ; =OSi_TickCounter
- ldr r0, _020CD830 ; =0x027FFC00
- ldr r3, [r1, #0x0]
- ldrh r5, [r5, #0x4]
- ldr r2, [r1, #0x4]
- ldr r2, _020CD838 ; =0x04000600
- eor r3, r3, r5, lsl #0x10
- str r3, [r6, #0x4]
- ldr r3, [r1, #0x0]
- ldr r3, [r1, #0x4]
- ldr r1, [r4, #0x74]
- ldr r4, [r0, #0x3c]
- eor r1, r3, r1
- eor r1, r4, r1
- str r1, [r6, #0x8]
- ldr r3, [r6, #0x8]
- ldr r2, [r2, #0x0]
- add r1, r0, #0x300
- eor r2, r3, r2
- str r2, [r6, #0x8]
- ldr r2, [r0, #0x1e8]
- ldr r3, _020CD83C ; =0x04000130
- str r2, [r6, #0xc]
- ldr r4, [r0, #0x1ec]
- ldr r2, _020CD840 ; =0x027FFFA8
- str r4, [r6, #0x10]
- ldrh r4, [r1, #0x94]
- ldr r0, [r0, #0x390]
- eor r0, r0, r4, lsl #0x10
- str r0, [r6, #0x14]
- ldrh r4, [r1, #0xaa]
- ldrh r0, [r1, #0xac]
- orr r0, r0, r4, lsl #0x10
- str r0, [r6, #0x18]
- ldrh r3, [r3, #0x0]
- ldrh r0, [r2, #0x0]
- ldrh r1, [r1, #0x98]
- orr r0, r3, r0
- orr r0, r0, r1, lsl #0x10
- str r0, [r6, #0x1c]
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020CD82C: .word 0x04000006
-_020CD830: .word 0x027FFC00
-_020CD834: .word OSi_TickCounter
-_020CD838: .word 0x04000600
-_020CD83C: .word 0x04000130
-_020CD840: .word 0x027FFFA8
diff --git a/arm9/lib/include/OS_entropy.h b/arm9/lib/include/OS_entropy.h
index f4eef4b5..b4695a72 100644
--- a/arm9/lib/include/OS_entropy.h
+++ b/arm9/lib/include/OS_entropy.h
@@ -5,6 +5,23 @@
#ifndef POKEDIAMOND_OS_ENTROPY_H
#define POKEDIAMOND_OS_ENTROPY_H
+#include "consts.h"
+
void OS_GetLowEntropyData(u32 * arr);
+typedef struct NVRAMConfig{
+ u8 ncd[110]; // todo: typeof NVRAMConfigData
+ u16 saveCount;
+ u16 rc16;
+} NVRAMConfig;
+
+extern vu64 OSi_TickCounter;
+
+extern u16 OS_GetTickLo();
+
+static inline s32 GX_GetVCount()
+{
+ return reg_GX_VCOUNT;
+}
+
#endif //POKEDIAMOND_OS_ENTROPY_H
diff --git a/arm9/lib/include/consts.h b/arm9/lib/include/consts.h
index 930f9af5..e07fe323 100644
--- a/arm9/lib/include/consts.h
+++ b/arm9/lib/include/consts.h
@@ -13,6 +13,19 @@
#define HW_PSR_DISABLE_IRQ 0x80 // Disable IRQ
#define HW_PSR_DISABLE_IRQ_FIQ 0xc0 // Disable FIQ and IRQ
+#define HW_REG_BASE 0x04000000
+#define REG_VCOUNT_OFFSET 0x006
+#define REG_VCOUNT_ADDR (HW_REG_BASE + REG_VCOUNT_OFFSET)
+#define reg_GX_VCOUNT (*(REGType16v *)REG_VCOUNT_ADDR)
+
+#define REG_KEYINPUT_OFFSET 0x130
+#define REG_KEYINPUT_ADDR (HW_REG_BASE + REG_KEYINPUT_OFFSET)
+#define reg_PAD_KEYINPUT (*(REGType16v *)REG_KEYINPUT_ADDR)
+
+#define REG_GXSTAT_OFFSET 0x600
+#define REG_GXSTAT_ADDR (HW_REG_BASE + REG_GXSTAT_OFFSET)
+#define reg_G3X_GXSTAT (*(REGType32v *)REG_GXSTAT_ADDR)
+
#define HW_C6_PR_4KB 0x16
#define HW_C6_PR_8KB 0x18
#define HW_C6_PR_16KB 0x1a
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index ddbd8883..d94df843 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -35,6 +35,8 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_DTCM_SVC_STACK (HW_DTCM_SVC_STACK_END - HW_SVC_STACK_SIZE)
#define HW_DTCM_IRQ_STACK_END (HW_DTCM_SVC_STACK)
+#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007fffa8)
+
#define OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM_MAIN_END)
#define OSi_MAINEX_ARENA_HI_DEFAULT (HW_MAIN_MEM + HW_MAIN_MEM_DEBUGGER_OFFSET)
#define HW_ITCM_ARENA_HI_DEFAULT (HW_ITCM + HW_ITCM_SIZE)
diff --git a/arm9/lib/include/types.h b/arm9/lib/include/types.h
index 5ad2c75e..40f8207d 100644
--- a/arm9/lib/include/types.h
+++ b/arm9/lib/include/types.h
@@ -25,6 +25,16 @@ typedef volatile s64 vs64;
typedef float f32;
typedef volatile f32 vf32;
+typedef u8 REGType8;
+typedef u16 REGType16;
+typedef u32 REGType32;
+typedef u64 REGType64;
+
+typedef vu8 REGType8v;
+typedef vu16 REGType16v;
+typedef vu32 REGType32v;
+typedef vu64 REGType64v;
+
typedef int BOOL;
#define TRUE 1
#define FALSE 0
diff --git a/arm9/lib/src/OS_entropy.c b/arm9/lib/src/OS_entropy.c
index bfc95882..b33781cc 100644
--- a/arm9/lib/src/OS_entropy.c
+++ b/arm9/lib/src/OS_entropy.c
@@ -6,23 +6,17 @@
#include "consts.h"
#include "OS_entropy.h"
-u32 * const HW_REG_006 = (u32 *) 0x04000006;
-u32 * const HW_REG_130 = (u32 *) 0x04000130;
-u32 * const HW_REG_600 = (u32 *) 0x04000600;
-
-u32 * const OSi_TickCounter = (u32 *) 0x021D37B4;
-
ARM_FUNC void OS_GetLowEntropyData(u32 * arr)
{
- OSSystemWork* work = OS_GetSystemWork();
- u16 x = *((u16 *)HW_REG_006);
- u8 * nvramUserInfo = work->nvramUserInfo;
- u8 r5 = nvramUserInfo[0x74];
- arr[0] = (OS_GetTickLo()<<0x10) | x ;
- arr[1] = (OSi_TickCounter[0]<<0x10) ^ r5[2];
- u32 what = OSi_TickCounter[0];
- what = OSi_TickCounter[1];
- arr[2] = *((u32 *)r4) ^ what ^ *(u32 *)((u8 *)work+0x3c);
- arr[2] ^= *HW_REG_600;
- // ...
-} \ No newline at end of file
+ const OSSystemWork* work = OS_GetSystemWork();
+ const u8 * macAddress = (u8 *)((u32)(work->nvramUserInfo) + ((sizeof(NVRAMConfig) + 3) & ~3));
+ arr[0] = (u32)((GX_GetVCount() << 16) | OS_GetTickLo());
+ arr[1] = (u32)(*(u16 *)(macAddress + 4) << 16) ^ (u32)(OSi_TickCounter);
+ arr[2] = (u32)(OSi_TickCounter >> 32) ^ *(u32 *)macAddress ^ work->vblankCount;
+ arr[2] ^= reg_G3X_GXSTAT;
+ arr[3] = *(u32 *)(&work->real_time_clock[0]);
+ arr[4] = *(u32 *)(&work->real_time_clock[4]);
+ arr[5] = (((u32)work->mic_sampling_data) << 16) ^ work->mic_last_address;
+ arr[6] = (u32) ((*(u16 *)(&work->touch_panel[0]) << 16) | *(u16 *)(&work->touch_panel[2]));
+ arr[7] = (u32)((work->wm_rssi_pool << 16) | (reg_PAD_KEYINPUT | *(vu16 *)HW_BUTTON_XY_BUF));
+}