diff options
author | red031000 <rubenru09@aol.com> | 2020-05-30 17:49:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-30 17:49:01 +0100 |
commit | 3d0c74fe6936c9525a18928cf8c7892644df8644 (patch) | |
tree | 8051ce887fbe9a79f855c49de9cd18b915896596 /arm9/lib/src | |
parent | 0982a1271d82c1fb419865e9deca701f027373f7 (diff) | |
parent | 707c5aa59f6277f56d00ddf3790ac7224cd7ba76 (diff) |
Merge branch 'master' into master
Diffstat (limited to 'arm9/lib/src')
-rw-r--r-- | arm9/lib/src/OS_reset.c | 63 |
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) + { + (®_CARD_CMD)[0] = (u8)(CARD_CMD_READ_PAGE); + (®_CARD_CMD)[1] = (u8)(src >> 24); + (®_CARD_CMD)[2] = (u8)(src >> 16); + (®_CARD_CMD)[3] = (u8)(src >> 8); + (®_CARD_CMD)[4] = (u8)(src >> 0); + (®_CARD_CMD)[5] = 0; + (®_CARD_CMD)[6] = 0; + (®_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 |