summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-10-20 21:53:42 +0100
committerred031000 <rubenru09@aol.com>2020-10-20 21:54:39 +0100
commit887b952f44f37e4eaa7e0779a7cfec1ef9f69565 (patch)
treed86c3d3469f0a2718d7c96c17bd0b9578b8a93e8
parent4fd265a65d78f9b9eb1ca0f0f5f99a6ff9f5c244 (diff)
arm9 card_spi (fully decomp arm9 card)
-rw-r--r--arm9/asm/CARD_spi.s225
-rw-r--r--arm9/lib/include/CARD_common.h11
-rw-r--r--arm9/lib/include/CARD_spi.h8
-rw-r--r--arm9/lib/src/CARD_backup.c3
-rw-r--r--arm9/lib/src/CARD_spi.c122
5 files changed, 142 insertions, 227 deletions
diff --git a/arm9/asm/CARD_spi.s b/arm9/asm/CARD_spi.s
deleted file mode 100644
index 88ac84d8..00000000
--- a/arm9/asm/CARD_spi.s
+++ /dev/null
@@ -1,225 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .extern cardi_common
-
- .text
-
- arm_func_start CARDi_IdentifyBackupCore
-CARDi_IdentifyBackupCore: ; 0x020D6A60
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- ldr r1, _020D6D60 ; =cardi_common
- mov r5, r0
- ldr r4, [r1, #0x0]
- mov r1, #0x0
- add r0, r4, #0x18
- mov r2, #0x48
- bl MI_CpuFill8
-_020D6A84: ; 0x020D6A84
- cmp r5, #0x0
- str r5, [r4, #0x4]
- mov r0, #0x3f
- addeq sp, sp, #0x4
- str r0, [r4, #0x4c]
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- mov r0, r5, asr #0x8
- and r0, r0, #0xff
- mov r2, #0x1
- mov r3, r2, lsl r0
- and r1, r5, #0xff
- str r3, [r4, #0x18]
- mov r0, #0xff
- strb r0, [r4, #0x48]
- cmp r1, #0x1
- bne _020D6B80
- cmp r3, #0x200
- beq _020D6AE4
- cmp r3, #0x2000
- beq _020D6B04
- cmp r3, #0x10000
- beq _020D6B28
- b _020D6D38
-_020D6AE4:
- mov r0, #0x10
- str r0, [r4, #0x20]
- str r2, [r4, #0x24]
- mov r0, #0x5
- str r0, [r4, #0x28]
- mov r0, #0xf0
- strb r0, [r4, #0x48]
- b _020D6B48
-_020D6B04:
- mov r0, #0x20
- str r0, [r4, #0x20]
- mov r0, #0x2
- str r0, [r4, #0x24]
- mov r0, #0x5
- str r0, [r4, #0x28]
- mov r0, #0x0
- strb r0, [r4, #0x48]
- b _020D6B48
-_020D6B28:
- mov r0, #0x80
- str r0, [r4, #0x20]
- mov r0, #0x2
- str r0, [r4, #0x24]
- mov r0, #0xa
- str r0, [r4, #0x28]
- mov r0, #0x0
- strb r0, [r4, #0x48]
-_020D6B48:
- ldr r0, [r4, #0x20]
- add sp, sp, #0x4
- str r0, [r4, #0x1c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x40
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x100
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x200
- str r0, [r4, #0x4c]
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D6B80:
- cmp r1, #0x2
- bne _020D6CD8
- cmp r3, #0x100000
- bhi _020D6BB8
- cmp r3, #0x100000
- bhs _020D6BD8
- cmp r3, #0x40000
- bhi _020D6BAC
- cmp r3, #0x40000
- beq _020D6BD8
- b _020D6D38
-_020D6BAC:
- cmp r3, #0x80000
- beq _020D6BD8
- b _020D6D38
-_020D6BB8:
- cmp r3, #0x200000
- bhi _020D6BCC
- cmp r3, #0x200000
- beq _020D6C10
- b _020D6D38
-_020D6BCC:
- cmp r3, #0x800000
- beq _020D6C48
- b _020D6D38
-_020D6BD8:
- mov r0, #0x19
- str r0, [r4, #0x2c]
- mov r1, #0x12c
- str r1, [r4, #0x30]
- ldr r0, _020D6D64 ; =0x00001388
- str r1, [r4, #0x44]
- str r0, [r4, #0x3c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x80
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x400
- str r0, [r4, #0x4c]
- b _020D6C7C
-_020D6C10:
- mov r1, #0x3e8
- ldr r0, _020D6D68 ; =0x00000BB8
- str r1, [r4, #0x3c]
- ldr r1, _020D6D6C ; =0x00004268
- str r0, [r4, #0x40]
- ldr r0, _020D6D70 ; =0x00009C40
- str r1, [r4, #0x34]
- str r0, [r4, #0x38]
- mov r0, #0x0
- strb r0, [r4, #0x48]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x1000
- str r0, [r4, #0x4c]
- b _020D6C7C
-_020D6C48:
- mov r1, #0x3e8
- ldr r0, _020D6D68 ; =0x00000BB8
- str r1, [r4, #0x3c]
- ldr r1, _020D6D74 ; =0x000109A0
- str r0, [r4, #0x40]
- ldr r0, _020D6D78 ; =0x00027100
- str r1, [r4, #0x34]
- str r0, [r4, #0x38]
- mov r0, #0x0
- strb r0, [r4, #0x48]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x1000
- str r0, [r4, #0x4c]
-_020D6C7C:
- mov r0, #0x10000
- str r0, [r4, #0x1c]
- mov r0, #0x100
- str r0, [r4, #0x20]
- mov r0, #0x3
- str r0, [r4, #0x24]
- mov r0, #0x5
- str r0, [r4, #0x28]
- ldr r0, [r4, #0x4c]
- add sp, sp, #0x4
- orr r0, r0, #0x40
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x100
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x200
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x800
- str r0, [r4, #0x4c]
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D6CD8:
- cmp r1, #0x3
- bne _020D6D38
- cmp r3, #0x2000
- beq _020D6CF0
- cmp r3, #0x8000
- bne _020D6D38
-_020D6CF0:
- str r3, [r4, #0x20]
- str r3, [r4, #0x1c]
- mov r0, #0x2
- str r0, [r4, #0x24]
- mov r0, #0x0
- strb r0, [r4, #0x48]
- ldr r0, [r4, #0x4c]
- add sp, sp, #0x4
- orr r0, r0, #0x40
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x100
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x200
- str r0, [r4, #0x4c]
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D6D38:
- mov r1, #0x0
- str r1, [r4, #0x4]
- str r1, [r4, #0x18]
- ldr r0, _020D6D60 ; =cardi_common
- mov r1, #0x3
- ldr r0, [r0, #0x0]
- str r1, [r0, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D6D60: .word cardi_common
-_020D6D64: .word 0x00001388
-_020D6D68: .word 0x00000BB8
-_020D6D6C: .word 0x00004268
-_020D6D70: .word 0x00009C40
-_020D6D74: .word 0x000109A0
-_020D6D78: .word 0x00027100
diff --git a/arm9/lib/include/CARD_common.h b/arm9/lib/include/CARD_common.h
index a784ccde..c8a247ee 100644
--- a/arm9/lib/include/CARD_common.h
+++ b/arm9/lib/include/CARD_common.h
@@ -14,10 +14,12 @@
#define CARD_THREAD_PRIORITY_DEFAULT 4
#define CARD_BACKUP_TYPE_DEVICE_SHIFT 0
+#define CARD_BACKUP_TYPE_DEVICE_MASK 0xFF
#define CARD_BACKUP_TYPE_DEVICE_EEPROM 1
#define CARD_BACKUP_TYPE_DEVICE_FLASH 2
#define CARD_BACKUP_TYPE_DEVICE_FRAM 3
#define CARD_BACKUP_TYPE_SIZEBIT_SHIFT 8
+#define CARD_BACKUP_TYPE_SIZEBIT_MASK 0xFF
#define CARD_BACKUP_TYPE_VENDER_SHIFT 16
#define CARD_BACKUP_TYPE_DEFINE(type, size, vender) \
(((CARD_BACKUP_TYPE_DEVICE_ ## type) << CARD_BACKUP_TYPE_DEVICE_SHIFT) | \
@@ -28,6 +30,15 @@
#define CARD_ALIGN_HI_BIT(n) (((u32)(n)) & ~ALIGN_MASK(CARD_ROM_PAGE_SIZE))
#define CARD_ALIGN_LO_BIT(n) (((u32)(n)) & ALIGN_MASK(CARD_ROM_PAGE_SIZE))
+#define CARD_BACKUP_CAPS_AVAILABLE (u32)(CARD_BACKUP_CAPS_READ - 1)
+#define CARD_BACKUP_CAPS_READ (u32)(1 << CARD_REQ_READ_BACKUP)
+#define CARD_BACKUP_CAPS_WRITE (u32)(1 << CARD_REQ_WRITE_BACKUP)
+#define CARD_BACKUP_CAPS_PROGRAM (u32)(1 << CARD_REQ_PROGRAM_BACKUP)
+#define CARD_BACKUP_CAPS_VERIFY (u32)(1 << CARD_REQ_VERIFY_BACKUP)
+#define CARD_BACKUP_CAPS_ERASE_PAGE (u32)(1 << CARD_REQ_ERASE_PAGE_BACKUP)
+#define CARD_BACKUP_CAPS_ERASE_SECTOR (u32)(1 << CARD_REQ_ERASE_SECTOR_BACKUP)
+#define CARD_BACKUP_CAPS_ERASE_CHIP (u32)(1 << CARD_REQ_ERASE_CHIP_BACKUP)
+
typedef enum
{
CARD_BACKUP_TYPE_EEPROM_4KBITS = CARD_BACKUP_TYPE_DEFINE(EEPROM, 9, 0),
diff --git a/arm9/lib/include/CARD_spi.h b/arm9/lib/include/CARD_spi.h
new file mode 100644
index 00000000..0181e39f
--- /dev/null
+++ b/arm9/lib/include/CARD_spi.h
@@ -0,0 +1,8 @@
+#ifndef POKEDIAMOND_CARD_SPI_H
+#define POKEDIAMOND_CARD_SPI_H
+
+#include "CARD_common.h"
+
+void CARDi_IdentifyBackupCore(CARDBackupType type);
+
+#endif //POKEDIAMOND_CARD_SPI_H
diff --git a/arm9/lib/src/CARD_backup.c b/arm9/lib/src/CARD_backup.c
index 851f10f5..714ac479 100644
--- a/arm9/lib/src/CARD_backup.c
+++ b/arm9/lib/src/CARD_backup.c
@@ -2,6 +2,7 @@
#include "function_target.h"
#include "CARD_common.h"
#include "CARD_request.h"
+#include "CARD_spi.h"
#include "OS_cache.h"
#include "MI_memory.h"
#include "OS_terminate_proc.h"
@@ -10,8 +11,6 @@
extern void OSi_ReferSymbol(void *symbol);
extern char _SDK_NintendoBackup[];
-extern void CARDi_IdentifyBackupCore(CARDBackupType type);
-
extern CARDiCommon cardi_common;
static void CARDi_RequestStreamCommandCore(CARDiCommon *p);
diff --git a/arm9/lib/src/CARD_spi.c b/arm9/lib/src/CARD_spi.c
new file mode 100644
index 00000000..3a911333
--- /dev/null
+++ b/arm9/lib/src/CARD_spi.c
@@ -0,0 +1,122 @@
+#include "function_target.h"
+#include "nitro/types.h"
+#include "CARD_common.h"
+#include "MI_memory.h"
+
+extern CARDiCommon cardi_common;
+
+ARM_FUNC void CARDi_IdentifyBackupCore(CARDBackupType type)
+{
+ CARDiCommandArg *const p = cardi_common.cmd;
+
+ MI_CpuFill8(&p->spec, 0, sizeof(p->spec));
+ p->type = type;
+ p->spec.caps = CARD_BACKUP_CAPS_AVAILABLE;
+ if (type != CARD_BACKUP_TYPE_NOT_USE)
+ {
+ const u32 size = (u32)(1 << ((type >> CARD_BACKUP_TYPE_SIZEBIT_SHIFT) & CARD_BACKUP_TYPE_SIZEBIT_MASK));
+
+ const s32 device = ((type >> CARD_BACKUP_TYPE_DEVICE_SHIFT) & CARD_BACKUP_TYPE_DEVICE_MASK);
+
+ p->spec.total_size = size;
+ p->spec.initial_status = 0xFF;
+ if (device == CARD_BACKUP_TYPE_DEVICE_EEPROM)
+ {
+ switch (size)
+ {
+ default:
+ goto invalid_type;
+ case 0x000200: //CARD_BACKUP_TYPE_EEPROM_4KBITS
+ p->spec.page_size = 0x10;
+ p->spec.addr_width = 1;
+ p->spec.program_page = 5;
+ p->spec.initial_status = 0xF0;
+ break;
+ case 0x002000: //CARD_BACKUP_TYPE_EEPROM_64KIBTS
+ p->spec.page_size = 0x0020;
+ p->spec.addr_width = 2;
+ p->spec.program_page = 5;
+ p->spec.initial_status = 0x00;
+ break;
+ case 0x010000: //CARD_BACKUP_TYPE_EEPROM_512KBITS
+ p->spec.page_size = 0x0080;
+ p->spec.addr_width = 2;
+ p->spec.program_page = 10;
+ p->spec.initial_status = 0x00;
+ break;
+ }
+ p->spec.sect_size = p->spec.page_size;
+ p->spec.caps |= CARD_BACKUP_CAPS_READ;
+ p->spec.caps |= CARD_BACKUP_CAPS_PROGRAM;
+ p->spec.caps |= CARD_BACKUP_CAPS_VERIFY;
+ }
+ else if (device == CARD_BACKUP_TYPE_DEVICE_FLASH)
+ {
+ switch (size)
+ {
+ default:
+ goto invalid_type;
+ case 0x040000: //CARD_BACKUP_TYPE_FLASH_2MBITS
+ case 0x080000: //CARD_BACKUP_TYPE_FLASH_4MBITS
+ case 0x100000: //CARD_BACKUP_TYPE_FLASH_8MBITS
+ p->spec.write_page = 25;
+ p->spec.write_page_total = 300;
+ p->spec.erase_page = 300;
+ p->spec.erase_sector = 5000;
+ p->spec.caps |= CARD_BACKUP_CAPS_WRITE;
+ p->spec.caps |= CARD_BACKUP_CAPS_ERASE_PAGE;
+ break;
+ case 0x200000: //CARD_BACKUP_TYPE_FLASH_16MBITS
+ p->spec.erase_sector = 1000;
+ p->spec.erase_sector_total = 3000;
+ p->spec.erase_chip = 17000;
+ p->spec.erase_chip_total = 40000;
+ p->spec.initial_status = 0x00;
+ p->spec.caps |= CARD_BACKUP_CAPS_ERASE_CHIP;
+ break;
+ case 0x800000: //CARD_BACKUP_TYPE_FLASH_64MBITS
+ p->spec.erase_sector = 1000;
+ p->spec.erase_sector_total = 3000;
+ p->spec.erase_chip = 68000;
+ p->spec.erase_chip_total = 160000;
+ p->spec.initial_status = 0x00;
+ p->spec.caps |= CARD_BACKUP_CAPS_ERASE_CHIP;
+ break;
+ }
+ p->spec.sect_size = 0x010000;
+ p->spec.page_size = 0x0100;
+ p->spec.addr_width = 3;
+ p->spec.program_page = 5;
+ p->spec.caps |= CARD_BACKUP_CAPS_READ;
+ p->spec.caps |= CARD_BACKUP_CAPS_PROGRAM;
+ p->spec.caps |= CARD_BACKUP_CAPS_VERIFY;
+ p->spec.caps |= CARD_BACKUP_CAPS_ERASE_SECTOR;
+ }
+ else if (device == CARD_BACKUP_TYPE_DEVICE_FRAM)
+ {
+ switch (size)
+ {
+ default:
+ goto invalid_type;
+ case 0x002000: //CARD_BACKUP_TYPE_FRAM_64KBITS
+ case 0x008000: //CARD_BACKUP_TYPE_FRAM_64KBITS
+ break;
+ }
+ p->spec.page_size = size;
+ p->spec.sect_size = size;
+ p->spec.addr_width = 2;
+ p->spec.initial_status = 0x00;
+ p->spec.caps |= CARD_BACKUP_CAPS_READ;
+ p->spec.caps |= CARD_BACKUP_CAPS_PROGRAM;
+ p->spec.caps |= CARD_BACKUP_CAPS_VERIFY;
+ }
+ else
+ {
+ invalid_type:
+ p->type = CARD_BACKUP_TYPE_NOT_USE;
+ p->spec.total_size = 0;
+ cardi_common.cmd->result = CARD_RESULT_UNSUPPORTED;
+ return;
+ }
+ }
+}