diff options
author | red031000 <rubenru09@aol.com> | 2020-10-20 21:53:42 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-10-20 21:54:39 +0100 |
commit | 887b952f44f37e4eaa7e0779a7cfec1ef9f69565 (patch) | |
tree | d86c3d3469f0a2718d7c96c17bd0b9578b8a93e8 | |
parent | 4fd265a65d78f9b9eb1ca0f0f5f99a6ff9f5c244 (diff) |
arm9 card_spi (fully decomp arm9 card)
-rw-r--r-- | arm9/asm/CARD_spi.s | 225 | ||||
-rw-r--r-- | arm9/lib/include/CARD_common.h | 11 | ||||
-rw-r--r-- | arm9/lib/include/CARD_spi.h | 8 | ||||
-rw-r--r-- | arm9/lib/src/CARD_backup.c | 3 | ||||
-rw-r--r-- | arm9/lib/src/CARD_spi.c | 122 |
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; + } + } +} |