From d49c4d84a4e86c64c73f60ae0d882529734743b9 Mon Sep 17 00:00:00 2001 From: red031000 Date: Fri, 29 May 2020 22:11:36 +0100 Subject: OSi_ReadCardRom32 --- arm9/lib/src/OS_reset.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'arm9/lib/src/OS_reset.c') diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index 6389fe45..dd3cc073 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -121,4 +121,68 @@ _01FF8284: blt _01FF8284 bx lr } + +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); + + 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 + }; + + 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 -- cgit v1.2.3 From ea3be36a6d7d01dbf8f312ab3d2c9b517130bf23 Mon Sep 17 00:00:00 2001 From: red031000 Date: Sat, 30 May 2020 17:33:53 +0100 Subject: move enum out of function --- arm9/lib/src/OS_reset.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'arm9/lib/src/OS_reset.c') diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index dd3cc073..e1e946be 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -122,24 +122,24 @@ _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); - 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 - }; - 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)); -- cgit v1.2.3 From 629584d278bcbbf92b37775c94ca6a52699b1681 Mon Sep 17 00:00:00 2001 From: red031000 Date: Sat, 30 May 2020 17:38:36 +0100 Subject: cleanup wait loop --- arm9/lib/src/OS_reset.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'arm9/lib/src/OS_reset.c') diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c index e1e946be..a5ef6987 100644 --- a/arm9/lib/src/OS_reset.c +++ b/arm9/lib/src/OS_reset.c @@ -146,8 +146,7 @@ void OSi_ReadCardRom32(u32 src, void *dst, s32 len) //should be static, can't ma s32 pos = -(s32)(src & 511); - while ((reg_CARD_CNT & CARD_CTRL_START)) - {} + 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) -- cgit v1.2.3