summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/CARD_backup.s358
-rw-r--r--arm9/lib/include/CARD_backup.h27
-rw-r--r--arm9/lib/include/CARD_common.h37
-rw-r--r--arm9/lib/src/CARD_backup.c160
-rw-r--r--arm9/lib/src/CARD_common.c1
5 files changed, 205 insertions, 378 deletions
diff --git a/arm9/asm/CARD_backup.s b/arm9/asm/CARD_backup.s
deleted file mode 100644
index 32e6bc2a..00000000
--- a/arm9/asm/CARD_backup.s
+++ /dev/null
@@ -1,358 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .extern cardi_common
- .extern OSi_ThreadInfo
-
- .text
-
- arm_func_start CARD_CancelBackupAsync
-CARD_CancelBackupAsync: ; 0x020D6D7C
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl OS_DisableInterrupts
- ldr r1, _020D6DA8 ; =cardi_common
- ldr r2, [r1, #0x114]
- orr r2, r2, #0x40
- str r2, [r1, #0x114]
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D6DA8: .word cardi_common
-
- arm_func_start CARD_TryWaitBackupAsync
-CARD_TryWaitBackupAsync: ; 0x020D6DAC
- ldr ip, _020D6DB4 ; =CARDi_TryWaitAsync
- bx r12
- .balign 4
-_020D6DB4: .word CARDi_TryWaitAsync
-
- arm_func_start CARD_WaitBackupAsync
-CARD_WaitBackupAsync: ; 0x020D6DB8
- ldr ip, _020D6DC0 ; =CARDi_WaitAsync
- bx r12
- .balign 4
-_020D6DC0: .word CARDi_WaitAsync
-
- .extern _SDK_NintendoBackup
-
- arm_func_start CARD_IdentifyBackup
-CARD_IdentifyBackup: ; 0x020D6DC4
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r5, r0
- ldr r0, _020D6F00 ; =_SDK_NintendoBackup
- ldr r7, _020D6F04 ; =cardi_common
- bl OSi_ReferSymbol
-_020D6DDC: ; 0x020D6DDC
- cmp r5, #0x0
- bne _020D6DE8
- bl OS_Terminate
-_020D6DE8:
- bl CARD_CheckEnabled
- bl OS_DisableInterrupts
- ldr r1, [r7, #0x114]
- mov r4, r0
- ands r0, r1, #0x4
- beq _020D6E18
- add r6, r7, #0x10c
-_020D6E04:
- mov r0, r6
- bl OS_SleepThread
- ldr r0, [r7, #0x114]
- ands r0, r0, #0x4
- bne _020D6E04
-_020D6E18:
- ldr r0, [r7, #0x114]
- mov r1, #0x0
- orr r0, r0, #0x4
- str r0, [r7, #0x114]
- str r1, [r7, #0x38]
- mov r0, r4
- str r1, [r7, #0x3c]
- bl OS_RestoreInterrupts
- mov r0, r5
- bl CARDi_IdentifyBackupCore
- ldr r0, _020D6F08 ; =OSi_ThreadInfo
- ldr r1, _020D6F04 ; =cardi_common
- ldr r2, [r0, #0x4]
- mov r0, r7
- str r2, [r1, #0x104]
- mov r1, #0x2
- mov r2, #0x1
- bl CARDi_Request
-_020D6E60: ; 0x020D6E60
- ldr r0, [r7, #0x0]
- mov r1, #0x0
- str r1, [r0, #0xc]
- ldr r0, [r7, #0x0]
- add r1, r7, #0x120
- str r1, [r0, #0x10]
- ldr r1, [r7, #0x0]
- mov r2, #0x1
- mov r0, r7
- str r2, [r1, #0x14]
- mov r1, #0x6
- bl CARDi_Request
- ldr r6, [r7, #0x38]
- ldr r5, [r7, #0x3c]
- bl OS_DisableInterrupts
- mov r4, r0
- ldr r1, [r7, #0x114]
- add r0, r7, #0x10c
- bic r1, r1, #0x4c
- str r1, [r7, #0x114]
- bl OS_WakeupThread
- ldr r0, [r7, #0x114]
- ands r0, r0, #0x10
- beq _020D6EC8
- add r0, r7, #0x44
- bl OS_WakeupThreadDirect
-_020D6EC8:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D6ED0: ; 0x020D6ED0
- cmp r6, #0x0
- beq _020D6EE0
- mov r0, r5
- blx r6
-_020D6EE0:
- ldr r0, [r7, #0x0]
- ldr r0, [r0, #0x0]
- cmp r0, #0x0
- moveq r0, #0x1
- movne r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020D6F00: .word _SDK_NintendoBackup
-_020D6F04: .word cardi_common
-_020D6F08: .word OSi_ThreadInfo
-
- arm_func_start CARD_GetBackupSectorSize
-CARD_GetBackupSectorSize: ; 0x020D6F0C
- ldr r0, _020D6F1C ; =cardi_common
- ldr r0, [r0, #0x0]
- ldr r0, [r0, #0x1c]
- bx lr
- .balign 4
-_020D6F1C: .word cardi_common
-
- arm_func_start CARDi_RequestStreamCommand
-CARDi_RequestStreamCommand: ; 0x020D6F20
- stmdb sp!, {r4-r10,lr}
- mov r10, r0
- ldr r6, _020D7004 ; =cardi_common
- ldr r0, _020D7008 ; =_SDK_NintendoBackup
- mov r9, r1
- mov r8, r2
- mov r7, r3
- bl OSi_ReferSymbol
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x114]
- mov r5, r0
- ands r0, r1, #0x4
- beq _020D6F6C
- add r4, r6, #0x10c
-_020D6F58:
- mov r0, r4
- bl OS_SleepThread
- ldr r0, [r6, #0x114]
- ands r0, r0, #0x4
- bne _020D6F58
-_020D6F6C:
- ldr r0, [r6, #0x114]
- ldr r1, [sp, #0x20]
- orr r0, r0, #0x4
- str r0, [r6, #0x114]
- str r7, [r6, #0x38]
- mov r0, r5
- str r1, [r6, #0x3c]
- bl OS_RestoreInterrupts
- str r10, [r6, #0x1c]
- str r9, [r6, #0x20]
- ldr r0, [sp, #0x24]
- ldr r1, [sp, #0x28]
- str r8, [r6, #0x24]
- ldr r2, [sp, #0x2c]
- str r1, [r6, #0x2c]
- ldr r1, [sp, #0x30]
- str r2, [r6, #0x30]
- str r1, [r6, #0x34]
- cmp r0, #0x0
- beq _020D6FD0
- ldr r0, _020D700C ; =CARDi_RequestStreamCommandCore
- bl CARDi_SetTask
- mov r0, #0x1
- ldmia sp!, {r4-r10,lr}
- bx lr
-_020D6FD0:
- ldr r0, _020D7010 ; =OSi_ThreadInfo
- ldr r1, _020D7004 ; =cardi_common
- ldr r2, [r0, #0x4]
- mov r0, r6
- str r2, [r1, #0x104]
- bl CARDi_RequestStreamCommandCore
-_020D6FE8: ; 0x020D6FE8
- ldr r0, [r6, #0x0]
- ldr r0, [r0, #0x0]
- cmp r0, #0x0
- moveq r0, #0x1
- movne r0, #0x0
- ldmia sp!, {r4-r10,lr}
- bx lr
- .balign 4
-_020D7004: .word cardi_common
-_020D7008: .word _SDK_NintendoBackup
-_020D700C: .word CARDi_RequestStreamCommandCore
-_020D7010: .word OSi_ThreadInfo
-
- arm_func_start CARDi_RequestStreamCommandCore
-CARDi_RequestStreamCommandCore:
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- mov r9, r0
- ldr r8, [r9, #0x2c]
- ldr r0, _020D720C ; =_SDK_NintendoBackup
- ldr r7, [r9, #0x34]
- ldr r10, [r9, #0x30]
- mov r6, #0x100
- bl OSi_ReferSymbol
- cmp r8, #0xb
- bne _020D7048
- bl CARD_GetBackupSectorSize
- mov r6, r0
-_020D7048:
- mov r0, #0x1
- add r4, r9, #0x120
- mov r11, #0x9
- str r0, [sp, #0x0]
-_020D7058:
- ldr r5, [r9, #0x24]
- ldr r0, [r9, #0x0]
- cmp r6, r5
- movcc r5, r6
- str r5, [r0, #0x14]
- ldr r0, [r9, #0x114]
- ands r0, r0, #0x40
- beq _020D7094
- ldr r0, [r9, #0x114]
- mov r1, #0x7
- bic r0, r0, #0x40
- str r0, [r9, #0x114]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0x0]
- b _020D71A8
-_020D7094:
- cmp r7, #0x3
- addls pc, pc, r7, lsl #0x2
- b _020D7124
- ; jump table
- b _020D70B0 ; case 0
- b _020D70D4 ; case 1
- b _020D70D4 ; case 2
- b _020D710C ; case 3
-_020D70B0:
- mov r1, r5
- add r0, r9, #0x120
- bl DC_InvalidateRange
- ldr r1, [r9, #0x1c]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0xc]
- ldr r0, [r9, #0x0]
- str r4, [r0, #0x10]
- b _020D7124
-_020D70D4:
- ldr r0, [r9, #0x1c]
- mov r1, r4
- mov r2, r5
- bl MI_CpuCopy8
- mov r1, r5
- add r0, r9, #0x120
- bl DC_FlushRange
- bl DC_WaitWriteBufferEmpty
-_020D70F4: ; 0x020D70F4
- ldr r0, [r9, #0x0]
- str r4, [r0, #0xc]
- ldr r1, [r9, #0x20]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0x10]
- b _020D7124
-_020D710C:
- ldr r1, [r9, #0x1c]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0xc]
- ldr r1, [r9, #0x20]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0x10]
-_020D7124:
- mov r0, r9
- mov r1, r8
- mov r2, r10
- bl CARDi_Request
-_020D7134: ; 0x020D7134
- cmp r0, #0x0
- beq _020D71A8
- cmp r7, #0x2
- bne _020D7160
- ldr r2, [sp, #0x0]
- mov r0, r9
- mov r1, r11
- bl CARDi_Request
-_020D7154: ; 0x020D7154
- cmp r0, #0x0
- bne _020D7178
- b _020D71A8
-_020D7160:
- cmp r7, #0x0
- bne _020D7178
- ldr r1, [r9, #0x20]
- mov r2, r5
- add r0, r9, #0x120
- bl MI_CpuCopy8
-_020D7178:
- ldr r0, [r9, #0x1c]
- add r0, r0, r5
- str r0, [r9, #0x1c]
- ldr r0, [r9, #0x20]
- add r0, r0, r5
- str r0, [r9, #0x20]
- ldr r0, [r9, #0x24]
- sub r0, r0, r5
- str r0, [r9, #0x24]
- ldr r0, [r9, #0x24]
- cmp r0, #0x0
- bne _020D7058
-_020D71A8:
- ldr r6, [r9, #0x38]
- ldr r5, [r9, #0x3c]
- bl OS_DisableInterrupts
- ldr r1, [r9, #0x114]
- mov r4, r0
- bic r0, r1, #0x4c
- str r0, [r9, #0x114]
- add r0, r9, #0x10c
- bl OS_WakeupThread
- ldr r0, [r9, #0x114]
- ands r0, r0, #0x10
- beq _020D71E0
- add r0, r9, #0x44
- bl OS_WakeupThreadDirect
-_020D71E0:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D71E8: ; 0x020D71E8
- cmp r6, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r11,lr}
- bxeq lr
- mov r0, r5
- blx r6
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D720C: .word _SDK_NintendoBackup
diff --git a/arm9/lib/include/CARD_backup.h b/arm9/lib/include/CARD_backup.h
index 7cb5f820..465d6d2e 100644
--- a/arm9/lib/include/CARD_backup.h
+++ b/arm9/lib/include/CARD_backup.h
@@ -1,28 +1,17 @@
-#ifndef NITRO_CARD_BACKUP_H_
-#define NITRO_CARD_BACKUP_H_
+#ifndef POKEDIAMOND_CARD_BACKUP_H
+#define POKEDIAMOND_CARD_BACKUP_H
#include "nitro/types.h"
#include "MI_dma.h"
#include "CARD_common.h"
-BOOL CARD_TryWaitBackupAsync(void);
+BOOL CARDi_RequestStreamCommand(u32 src, u32 dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async,
+ CARDRequest req_type, int req_retry, CARDRequestMode req_mode);
+u32 CARD_GetBackupSectorSize(void);;
+BOOL CARD_IdentifyBackup(CARDBackupType type);
BOOL CARD_WaitBackupAsync(void);
+BOOL CARD_TryWaitBackupAsync(void);
void CARD_CancelBackupAsync(void);
-void CARD_UnlockBackup(u16 lock_id);
-void CARD_LockBackup(u16 lock_id);
-BOOL CARD_IdentifyBackup(u16 lock_id);
-
-BOOL CARDi_RequestStreamCommand(
- u32 src,
- u32 dst,
- u32 len,
- MIDmaCallback callback,
- void * arg,
- BOOL is_async,
- CARDRequest req_type,
- int req_retry,
- CARDRequestMode req_mode
-);
static inline BOOL CARDi_ReadBackup(u32 src, void * dst, u32 len, MIDmaCallback callback, void * arg, BOOL is_async)
{
@@ -39,4 +28,4 @@ static inline BOOL CARDi_WriteAndVerifyBackup(u32 dst, void * src, u32 len, MIDm
return CARDi_RequestStreamCommand((u32)src, (u32)dst, len, callback, arg, is_async, CARD_REQ_WRITE_BACKUP, CARD_RETRY_COUNT_MAX, CARD_REQUEST_MODE_SEND_VERIFY);
}
-#endif //NITRO_CARD_BACKUP_H_
+#endif //POKEDIAMOND_CARD_BACKUP_H
diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h
index 051923ce..292b9066 100644
--- a/arm9/lib/include/CARD_common.h
+++ b/arm9/lib/include/CARD_common.h
@@ -3,6 +3,7 @@
#include "nitro/types.h"
#include "OS_thread.h"
+#include "OS_system.h"
#include "MI_dma.h"
#define CARD_THREAD_PRIORITY_DEFAULT 4
@@ -152,6 +153,42 @@ typedef struct CARDiCommon
u8 backup_cache_page_buf[256] ALIGN(32);
} CARDiCommon;
+static inline void CARDi_EndTask(CARDiCommon *p, BOOL is_own_task)
+{
+ const MIDmaCallback func = p->callback;
+ void *const arg = p->callback_arg;
+
+ {
+ OSIntrMode bak_psr = OS_DisableInterrupts();
+
+ p->flag &= ~(CARD_STAT_BUSY | CARD_STAT_TASK | CARD_STAT_CANCEL);
+ OS_WakeupThread(p->busy_q);
+ if ((p->flag & CARD_STAT_RECV) != 0)
+ {
+ OS_WakeupThreadDirect(p->thread);
+ }
+ (void)OS_RestoreInterrupts(bak_psr);
+ }
+
+ if (is_own_task && func)
+ {
+ (*func)(arg);
+ }
+}
+
+static inline void CARDi_WaitTask(CARDiCommon *p, MIDmaCallback callback, void *callback_arg)
+{
+ OSIntrMode bak_psr = OS_DisableInterrupts();
+ while ((p->flag & CARD_STAT_BUSY) != 0)
+ {
+ OS_SleepThread(p->busy_q);
+ }
+ p->flag |= CARD_STAT_BUSY;
+ p->callback = callback;
+ p->callback_arg = callback_arg;
+ (void)OS_RestoreInterrupts(bak_psr);
+}
+
void CARDi_SetTask(void (*task) (CARDiCommon *));
void CARDi_InitCommon(void);
BOOL CARD_IsEnabled(void);
diff --git a/arm9/lib/src/CARD_backup.c b/arm9/lib/src/CARD_backup.c
new file mode 100644
index 00000000..fa39fa0f
--- /dev/null
+++ b/arm9/lib/src/CARD_backup.c
@@ -0,0 +1,160 @@
+#include "CARD_backup.h"
+#include "function_target.h"
+#include "CARD_common.h"
+#include "OS_cache.h"
+#include "MI_memory.h"
+#include "OS_terminate_proc.h"
+#include "OS_system.h"
+
+extern void OSi_ReferSymbol(void *symbol);
+extern char _SDK_NintendoBackup[];
+
+extern BOOL CARDi_Request(CARDiCommon * p, int req_type, int retry_count);
+extern void CARDi_IdentifyBackupCore(CARDBackupType type);
+
+extern CARDiCommon cardi_common;
+
+static void CARDi_RequestStreamCommandCore(CARDiCommon *p);
+
+ARM_FUNC static void CARDi_RequestStreamCommandCore(CARDiCommon *p)
+{
+ const int req_type = p->req_type;
+ const int req_mode = p->req_mode;
+ const int retry_count = p->req_retry;
+ u32 size = sizeof(p->backup_cache_page_buf);
+
+ OSi_ReferSymbol((void *)_SDK_NintendoBackup);
+
+ if (req_type == CARD_REQ_ERASE_SECTOR_BACKUP)
+ {
+ size = CARD_GetBackupSectorSize();
+ }
+ do
+ {
+ const u32 len = (size < p->len) ? size : p->len;
+ p->cmd->len = len;
+
+ if ((p->flag & CARD_STAT_CANCEL) != 0)
+ {
+ p->flag &= ~CARD_STAT_CANCEL;
+ p->cmd->result = CARD_RESULT_CANCELED;
+ break;
+ }
+ switch (req_mode)
+ {
+ case CARD_REQUEST_MODE_RECV:
+ DC_InvalidateRange(p->backup_cache_page_buf, len);
+ p->cmd->src = (u32)p->src;
+ p->cmd->dest = (u32)p->backup_cache_page_buf;
+ break;
+ case CARD_REQUEST_MODE_SEND:
+ case CARD_REQUEST_MODE_SEND_VERIFY:
+ MI_CpuCopy8((const void *)p->src, p->backup_cache_page_buf, len);
+ DC_FlushRange(p->backup_cache_page_buf, len);
+ DC_WaitWriteBufferEmpty();
+ p->cmd->src = (u32)p->backup_cache_page_buf;
+ p->cmd->dest = (u32)p->dst;
+ break;
+ case CARD_REQUEST_MODE_SPECIAL:
+ p->cmd->src = (u32)p->src;
+ p->cmd->dest = (u32)p->dst;
+ break;
+ }
+
+ if (!CARDi_Request(p, req_type, retry_count))
+ {
+ break;
+ }
+
+ if (req_mode == CARD_REQUEST_MODE_SEND_VERIFY)
+ {
+ if (!CARDi_Request(p, CARD_REQ_VERIFY_BACKUP, 1))
+ {
+ break;
+ }
+ }
+ else if (req_mode == CARD_REQUEST_MODE_RECV)
+ {
+ MI_CpuCopy8(p->backup_cache_page_buf, (void *)p->dst, len);
+ }
+ p->src += len;
+ p->dst += len;
+ p->len -= len;
+ }
+ while (p->len > 0);
+ CARDi_EndTask(p, TRUE);
+}
+
+ARM_FUNC BOOL CARDi_RequestStreamCommand(u32 src, u32 dst, u32 len, MIDmaCallback callback, void *arg, BOOL is_async,
+ CARDRequest req_type, int req_retry, CARDRequestMode req_mode)
+{
+ CARDiCommon *const p = &cardi_common;
+
+ OSi_ReferSymbol((void *)_SDK_NintendoBackup);
+
+ CARDi_WaitTask(p, callback, arg);
+ p->src = src;
+ p->dst = dst;
+ p->len = len;
+ p->req_type = req_type;
+ p->req_retry = req_retry;
+ p->req_mode = req_mode;
+ if (is_async)
+ {
+ CARDi_SetTask(CARDi_RequestStreamCommandCore);
+ return TRUE;
+ }
+ else
+ {
+ cardi_common.cur_th = OS_GetCurrentThread();
+ CARDi_RequestStreamCommandCore(p);
+ return (p->cmd->result == CARD_RESULT_SUCCESS);
+ }
+}
+
+ARM_FUNC u32 CARD_GetBackupSectorSize(void)
+{
+ return cardi_common.cmd->spec.sect_size;
+}
+
+ARM_FUNC BOOL CARD_IdentifyBackup(CARDBackupType type)
+{
+ CARDiCommon *const p = &cardi_common;
+
+ OSi_ReferSymbol((void *)_SDK_NintendoBackup);
+ if (type == CARD_BACKUP_TYPE_NOT_USE)
+ {
+ OS_Terminate();
+ }
+
+ CARD_CheckEnabled();
+
+ CARDi_WaitTask(p, NULL, NULL);
+ CARDi_IdentifyBackupCore(type);
+ cardi_common.cur_th = OS_GetCurrentThread();
+ (void)CARDi_Request(p, CARD_REQ_IDENTIFY, 1);
+
+ p->cmd->src = 0;
+ p->cmd->dest = (u32)p->backup_cache_page_buf;
+ p->cmd->len = 1;
+ (void)CARDi_Request(p, CARD_REQ_READ_BACKUP, 1);
+ CARDi_EndTask(p, TRUE);
+ return (p->cmd->result == CARD_RESULT_SUCCESS);
+}
+
+ARM_FUNC BOOL CARD_WaitBackupAsync(void)
+{
+ return CARDi_WaitAsync();
+}
+
+ARM_FUNC BOOL CARD_TryWaitBackupAsync(void)
+{
+ return CARDi_TryWaitAsync();
+}
+
+ARM_FUNC void CARD_CancelBackupAsync(void)
+{
+ OSIntrMode bak_cpsr = OS_DisableInterrupts();
+ cardi_common.flag |= CARD_STAT_CANCEL;
+ (void)OS_RestoreInterrupts(bak_cpsr);
+}
diff --git a/arm9/lib/src/CARD_common.c b/arm9/lib/src/CARD_common.c
index f02d10e2..c6bae9a1 100644
--- a/arm9/lib/src/CARD_common.c
+++ b/arm9/lib/src/CARD_common.c
@@ -2,7 +2,6 @@
#include "consts.h"
#include "function_target.h"
#include "MI_memory.h"
-#include "OS_system.h"
#include "OS_terminate_proc.h"
#include "OS_spinLock.h"
#include "OS_cache.h"