summaryrefslogtreecommitdiff
path: root/arm9/lib/src
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-05-30 17:49:01 +0100
committerGitHub <noreply@github.com>2020-05-30 17:49:01 +0100
commit3d0c74fe6936c9525a18928cf8c7892644df8644 (patch)
tree8051ce887fbe9a79f855c49de9cd18b915896596 /arm9/lib/src
parent0982a1271d82c1fb419865e9deca701f027373f7 (diff)
parent707c5aa59f6277f56d00ddf3790ac7224cd7ba76 (diff)
Merge branch 'master' into master
Diffstat (limited to 'arm9/lib/src')
-rw-r--r--arm9/lib/src/OS_reset.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c
index 6389fe45..a5ef6987 100644
--- a/arm9/lib/src/OS_reset.c
+++ b/arm9/lib/src/OS_reset.c
@@ -121,4 +121,67 @@ _01FF8284:
blt _01FF8284
bx lr
}
+
+enum
+{
+ CARD_MASTER_SELECT_ROM = 0x0,
+ CARD_MASTER_ENABLE = 0x80,
+ CARD_CMD_READ_PAGE = 0xb7,
+ CARD_CTRL_CMD_MASK = 0x07000000,
+ CARD_CTRL_CMD_PAGE = 0x01000000,
+ CARD_CTRL_READ = 0x00000000,
+ CARD_CTRL_RESET_HI = 0x20000000,
+ CARD_CTRL_START = 0x80000000,
+ CARD_CTRL_READY = 0x00800000,
+ CARD_ENUM_END
+};
+
+void OSi_ReadCardRom32(u32 src, void *dst, s32 len) //should be static, can't mark as such
+{
+ vu32 *const hdr_GAME_BUF = (vu32 *)(HW_ROM_HEADER_BUF + 0x60);
+
+ const u32 ctrl_start = (u32)((*hdr_GAME_BUF &~CARD_CTRL_CMD_MASK)
+ | (CARD_CTRL_CMD_PAGE | CARD_CTRL_READ
+ | CARD_CTRL_START | CARD_CTRL_RESET_HI));
+
+ s32 pos = -(s32)(src & 511);
+
+ while (reg_CARD_CNT & CARD_CTRL_START) {}
+ reg_CARD_MASTERCNT = (u32)(CARD_MASTER_SELECT_ROM | CARD_MASTER_ENABLE);
+
+ for (src = (u32)(src + pos); pos < len; src += 512)
+ {
+ (&reg_CARD_CMD)[0] = (u8)(CARD_CMD_READ_PAGE);
+ (&reg_CARD_CMD)[1] = (u8)(src >> 24);
+ (&reg_CARD_CMD)[2] = (u8)(src >> 16);
+ (&reg_CARD_CMD)[3] = (u8)(src >> 8);
+ (&reg_CARD_CMD)[4] = (u8)(src >> 0);
+ (&reg_CARD_CMD)[5] = 0;
+ (&reg_CARD_CMD)[6] = 0;
+ (&reg_CARD_CMD)[7] = 0;
+
+ reg_CARD_CNT = ctrl_start;
+ for (;;)
+ {
+ u32 ctrl = reg_CARD_CNT;
+
+ if ((ctrl & CARD_CTRL_READY))
+ {
+ const u32 data = reg_CARD_DATA;
+
+ if ((pos >= 0) && (pos < len))
+ {
+ *(u32 *)((u32)dst + pos) = data;
+ }
+
+ pos += sizeof(u32);
+ }
+
+ if (!(ctrl & CARD_CTRL_START))
+ {
+ break;
+ }
+ }
+ }
+}
#pragma section ITCM end